|
1137 | 1137 | <a href="#1136" id="1136">1136</a> |
1138 | 1138 | <a href="#1137" id="1137">1137</a> |
1139 | 1139 | <a href="#1138" id="1138">1138</a> |
1140 | | -<a href="#1139" id="1139">1139</a></pre></div><pre class="rust"><code><span class="kw">use </span>alloc::{borrow::ToOwned <span class="kw">as _</span>, boxed::Box, ffi::CString, string::String, sync::Arc, vec::Vec}; |
| 1140 | +<a href="#1139" id="1139">1139</a> |
| 1141 | +<a href="#1140" id="1140">1140</a> |
| 1142 | +<a href="#1141" id="1141">1141</a> |
| 1143 | +<a href="#1142" id="1142">1142</a> |
| 1144 | +<a href="#1143" id="1143">1143</a> |
| 1145 | +<a href="#1144" id="1144">1144</a> |
| 1146 | +<a href="#1145" id="1145">1145</a> |
| 1147 | +<a href="#1146" id="1146">1146</a> |
| 1148 | +<a href="#1147" id="1147">1147</a> |
| 1149 | +<a href="#1148" id="1148">1148</a> |
| 1150 | +<a href="#1149" id="1149">1149</a> |
| 1151 | +<a href="#1150" id="1150">1150</a> |
| 1152 | +<a href="#1151" id="1151">1151</a> |
| 1153 | +<a href="#1152" id="1152">1152</a> |
| 1154 | +<a href="#1153" id="1153">1153</a> |
| 1155 | +<a href="#1154" id="1154">1154</a> |
| 1156 | +<a href="#1155" id="1155">1155</a> |
| 1157 | +<a href="#1156" id="1156">1156</a> |
| 1158 | +<a href="#1157" id="1157">1157</a> |
| 1159 | +<a href="#1158" id="1158">1158</a> |
| 1160 | +<a href="#1159" id="1159">1159</a> |
| 1161 | +<a href="#1160" id="1160">1160</a> |
| 1162 | +<a href="#1161" id="1161">1161</a> |
| 1163 | +<a href="#1162" id="1162">1162</a> |
| 1164 | +<a href="#1163" id="1163">1163</a> |
| 1165 | +<a href="#1164" id="1164">1164</a> |
| 1166 | +<a href="#1165" id="1165">1165</a></pre></div><pre class="rust"><code><span class="kw">use </span>alloc::{borrow::ToOwned <span class="kw">as _</span>, boxed::Box, ffi::CString, string::String, sync::Arc, vec::Vec}; |
1141 | 1167 | <span class="kw">use </span>core::{ |
1142 | 1168 | ffi::{c_void, CStr}, |
| 1169 | + marker::PhantomData, |
1143 | 1170 | slice, |
1144 | 1171 | str::FromStr, |
1145 | 1172 | }; |
|
1724 | 1751 | swapchain: RwLock::new(<span class="prelude-val">None</span>), |
1725 | 1752 | } |
1726 | 1753 | } |
1727 | | -} |
1728 | | - |
1729 | | -<span class="kw">impl </span>Drop <span class="kw">for </span><span class="kw">super</span>::InstanceShared { |
1730 | | - <span class="kw">fn </span>drop(<span class="kw-2">&mut </span><span class="self">self</span>) { |
1731 | | - <span class="kw">unsafe </span>{ |
1732 | | - <span class="comment">// Keep du alive since destroy_instance may also log |
1733 | | - </span><span class="kw">let </span>_du = <span class="self">self</span>.debug_utils.take().inspect(|du| { |
1734 | | - du.extension |
1735 | | - .destroy_debug_utils_messenger(du.messenger, <span class="prelude-val">None</span>); |
1736 | | - }); |
1737 | | - <span class="kw">if </span><span class="self">self</span>.drop_guard.is_none() { |
1738 | | - <span class="self">self</span>.raw.destroy_instance(<span class="prelude-val">None</span>); |
1739 | | - } |
1740 | | - } |
1741 | | - } |
1742 | | -} |
1743 | | - |
1744 | | -<span class="kw">impl </span><span class="kw">crate</span>::Instance <span class="kw">for </span><span class="kw">super</span>::Instance { |
1745 | | - <span class="kw">type </span>A = <span class="kw">super</span>::Api; |
1746 | 1754 |
|
1747 | | - <span class="kw">unsafe fn </span>init(desc: <span class="kw-2">&</span><span class="kw">crate</span>::InstanceDescriptor) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, <span class="kw">crate</span>::InstanceError> { |
| 1755 | + <span class="doccomment">/// `Instance::init` but with a callback. |
| 1756 | + /// If you want to add extensions, add the to the `Vec<'static CStr>` not the create info, otherwise |
| 1757 | + /// it will be overwritten |
| 1758 | + /// |
| 1759 | + /// # Safety: |
| 1760 | + /// Same as `init` but additionally |
| 1761 | + /// - Callback must not remove features. |
| 1762 | + /// - Callback must not change anything to what the instance does not support. |
| 1763 | + </span><span class="kw">pub unsafe fn </span>init_with_callback( |
| 1764 | + desc: <span class="kw-2">&</span><span class="kw">crate</span>::InstanceDescriptor, |
| 1765 | + callback: <span class="prelude-ty">Option</span><Box<<span class="kw">super</span>::CreateInstanceCallback>>, |
| 1766 | + ) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, <span class="kw">crate</span>::InstanceError> { |
1748 | 1767 | <span class="macro">profiling::scope!</span>(<span class="string">"Init Vulkan Backend"</span>); |
1749 | 1768 |
|
1750 | 1769 | <span class="kw">let </span>entry = <span class="kw">unsafe </span>{ |
|
1793 | 1812 | }, |
1794 | 1813 | ); |
1795 | 1814 |
|
1796 | | - <span class="kw">let </span>extensions = <span class="self">Self</span>::desired_extensions(<span class="kw-2">&</span>entry, instance_api_version, desc.flags)<span class="question-mark">?</span>; |
| 1815 | + <span class="kw">let </span><span class="kw-2">mut </span>extensions = <span class="self">Self</span>::desired_extensions(<span class="kw-2">&</span>entry, instance_api_version, desc.flags)<span class="question-mark">?</span>; |
| 1816 | + <span class="kw">let </span><span class="kw-2">mut </span>create_info = vk::InstanceCreateInfo::default(); |
| 1817 | + |
| 1818 | + <span class="kw">if let </span><span class="prelude-val">Some</span>(callback) = callback { |
| 1819 | + callback(<span class="kw">super</span>::CreateInstanceCallbackArgs { |
| 1820 | + extensions: <span class="kw-2">&mut </span>extensions, |
| 1821 | + create_info: <span class="kw-2">&mut </span>create_info, |
| 1822 | + entry: <span class="kw-2">&</span>entry, |
| 1823 | + _phantom: PhantomData, |
| 1824 | + }); |
| 1825 | + } |
1797 | 1826 |
|
1798 | 1827 | <span class="kw">let </span>instance_layers = { |
1799 | 1828 | <span class="macro">profiling::scope!</span>(<span class="string">"vkEnumerateInstanceLayerProperties"</span>); |
|
1953 | 1982 | }) |
1954 | 1983 | .collect::<Vec<<span class="kw">_</span>>>(); |
1955 | 1984 |
|
1956 | | - <span class="kw">let </span><span class="kw-2">mut </span>create_info = vk::InstanceCreateInfo::default() |
| 1985 | + create_info = create_info |
1957 | 1986 | .flags(flags) |
1958 | 1987 | .application_info(<span class="kw-2">&</span>app_info) |
1959 | 1988 | .enabled_layer_names(<span class="kw-2">&</span>str_pointers[..layers.len()]) |
|
2015 | 2044 | ) |
2016 | 2045 | } |
2017 | 2046 | } |
| 2047 | +} |
| 2048 | + |
| 2049 | +<span class="kw">impl </span>Drop <span class="kw">for </span><span class="kw">super</span>::InstanceShared { |
| 2050 | + <span class="kw">fn </span>drop(<span class="kw-2">&mut </span><span class="self">self</span>) { |
| 2051 | + <span class="kw">unsafe </span>{ |
| 2052 | + <span class="comment">// Keep du alive since destroy_instance may also log |
| 2053 | + </span><span class="kw">let </span>_du = <span class="self">self</span>.debug_utils.take().inspect(|du| { |
| 2054 | + du.extension |
| 2055 | + .destroy_debug_utils_messenger(du.messenger, <span class="prelude-val">None</span>); |
| 2056 | + }); |
| 2057 | + <span class="kw">if </span><span class="self">self</span>.drop_guard.is_none() { |
| 2058 | + <span class="self">self</span>.raw.destroy_instance(<span class="prelude-val">None</span>); |
| 2059 | + } |
| 2060 | + } |
| 2061 | + } |
| 2062 | +} |
| 2063 | + |
| 2064 | +<span class="kw">impl </span><span class="kw">crate</span>::Instance <span class="kw">for </span><span class="kw">super</span>::Instance { |
| 2065 | + <span class="kw">type </span>A = <span class="kw">super</span>::Api; |
| 2066 | + |
| 2067 | + <span class="kw">unsafe fn </span>init(desc: <span class="kw-2">&</span><span class="kw">crate</span>::InstanceDescriptor) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, <span class="kw">crate</span>::InstanceError> { |
| 2068 | + <span class="kw">unsafe </span>{ <span class="self">Self</span>::init_with_callback(desc, <span class="prelude-val">None</span>) } |
| 2069 | + } |
2018 | 2070 |
|
2019 | 2071 | <span class="kw">unsafe fn </span>create_surface( |
2020 | 2072 | <span class="kw-2">&</span><span class="self">self</span>, |
|
0 commit comments