|
1168 | 1168 | <span id="1168">1168</span>
|
1169 | 1169 | <span id="1169">1169</span>
|
1170 | 1170 | <span id="1170">1170</span>
|
| 1171 | +<span id="1171">1171</span> |
| 1172 | +<span id="1172">1172</span> |
| 1173 | +<span id="1173">1173</span> |
| 1174 | +<span id="1174">1174</span> |
| 1175 | +<span id="1175">1175</span> |
| 1176 | +<span id="1176">1176</span> |
| 1177 | +<span id="1177">1177</span> |
| 1178 | +<span id="1178">1178</span> |
| 1179 | +<span id="1179">1179</span> |
| 1180 | +<span id="1180">1180</span> |
| 1181 | +<span id="1181">1181</span> |
| 1182 | +<span id="1182">1182</span> |
| 1183 | +<span id="1183">1183</span> |
| 1184 | +<span id="1184">1184</span> |
| 1185 | +<span id="1185">1185</span> |
| 1186 | +<span id="1186">1186</span> |
| 1187 | +<span id="1187">1187</span> |
| 1188 | +<span id="1188">1188</span> |
| 1189 | +<span id="1189">1189</span> |
| 1190 | +<span id="1190">1190</span> |
| 1191 | +<span id="1191">1191</span> |
| 1192 | +<span id="1192">1192</span> |
| 1193 | +<span id="1193">1193</span> |
| 1194 | +<span id="1194">1194</span> |
| 1195 | +<span id="1195">1195</span> |
| 1196 | +<span id="1196">1196</span> |
| 1197 | +<span id="1197">1197</span> |
| 1198 | +<span id="1198">1198</span> |
| 1199 | +<span id="1199">1199</span> |
| 1200 | +<span id="1200">1200</span> |
| 1201 | +<span id="1201">1201</span> |
| 1202 | +<span id="1202">1202</span> |
| 1203 | +<span id="1203">1203</span> |
| 1204 | +<span id="1204">1204</span> |
| 1205 | +<span id="1205">1205</span> |
| 1206 | +<span id="1206">1206</span> |
| 1207 | +<span id="1207">1207</span> |
| 1208 | +<span id="1208">1208</span> |
| 1209 | +<span id="1209">1209</span> |
| 1210 | +<span id="1210">1210</span> |
| 1211 | +<span id="1211">1211</span> |
| 1212 | +<span id="1212">1212</span> |
| 1213 | +<span id="1213">1213</span> |
| 1214 | +<span id="1214">1214</span> |
| 1215 | +<span id="1215">1215</span> |
| 1216 | +<span id="1216">1216</span> |
| 1217 | +<span id="1217">1217</span> |
| 1218 | +<span id="1218">1218</span> |
| 1219 | +<span id="1219">1219</span> |
| 1220 | +<span id="1220">1220</span> |
| 1221 | +<span id="1221">1221</span> |
| 1222 | +<span id="1222">1222</span> |
| 1223 | +<span id="1223">1223</span> |
| 1224 | +<span id="1224">1224</span> |
1171 | 1225 | </pre><pre class="rust"><code><span class="kw">use </span><span class="kw">super</span>::conv;
|
1172 | 1226 | <span class="kw">use </span><span class="kw">crate</span>::auxil::map_naga_stage;
|
1173 | 1227 | <span class="kw">use </span>glow::HasContext;
|
|
1254 | 1308 | }
|
1255 | 1309 |
|
1256 | 1310 | <span class="kw">impl </span><span class="kw">super</span>::Device {
|
| 1311 | + <span class="doccomment">/// # Safety |
| 1312 | + /// |
| 1313 | + /// - `name` must be created respecting `desc` |
| 1314 | + /// - `name` must be a texture |
| 1315 | + /// - If `drop_guard` is [`None`], wgpu-hal will take ownership of the texture. If `drop_guard` is |
| 1316 | + /// [`Some`], the texture must be valid until the drop implementation |
| 1317 | + /// of the drop guard is called. |
| 1318 | + </span><span class="attribute">#[cfg(any(not(target_arch = <span class="string">"wasm32"</span>), feature = <span class="string">"emscripten"</span>))] |
| 1319 | + </span><span class="kw">pub unsafe fn </span>texture_from_raw( |
| 1320 | + <span class="kw-2">&</span><span class="self">self</span>, |
| 1321 | + name: std::num::NonZeroU32, |
| 1322 | + desc: <span class="kw-2">&</span><span class="kw">crate</span>::TextureDescriptor, |
| 1323 | + drop_guard: <span class="prelude-ty">Option</span><<span class="kw">crate</span>::DropGuard>, |
| 1324 | + ) -> <span class="kw">super</span>::Texture { |
| 1325 | + <span class="kw">let </span><span class="kw-2">mut </span>copy_size = <span class="kw">crate</span>::CopyExtent::map_extent_to_copy_size(<span class="kw-2">&</span>desc.size, desc.dimension); |
| 1326 | + |
| 1327 | + <span class="kw">let </span>(target, <span class="kw">_</span>, is_cubemap) = <span class="kw">super</span>::Texture::get_info_from_desc(<span class="kw-2">&mut </span>copy_size, desc); |
| 1328 | + |
| 1329 | + <span class="kw">super</span>::Texture { |
| 1330 | + inner: <span class="kw">super</span>::TextureInner::Texture { |
| 1331 | + raw: glow::NativeTexture(name), |
| 1332 | + target, |
| 1333 | + }, |
| 1334 | + drop_guard, |
| 1335 | + mip_level_count: desc.mip_level_count, |
| 1336 | + array_layer_count: <span class="kw">if </span>desc.dimension == wgt::TextureDimension::D2 { |
| 1337 | + desc.size.depth_or_array_layers |
| 1338 | + } <span class="kw">else </span>{ |
| 1339 | + <span class="number">1 |
| 1340 | + </span>}, |
| 1341 | + format: desc.format, |
| 1342 | + format_desc: <span class="self">self</span>.shared.describe_texture_format(desc.format), |
| 1343 | + copy_size, |
| 1344 | + is_cubemap, |
| 1345 | + } |
| 1346 | + } |
| 1347 | + |
| 1348 | + <span class="doccomment">/// # Safety |
| 1349 | + /// |
| 1350 | + /// - `name` must be created respecting `desc` |
| 1351 | + /// - `name` must be a renderbuffer |
| 1352 | + /// - If `drop_guard` is [`None`], wgpu-hal will take ownership of the renderbuffer. If `drop_guard` is |
| 1353 | + /// [`Some`], the renderbuffer must be valid until the drop implementation |
| 1354 | + /// of the drop guard is called. |
| 1355 | + </span><span class="attribute">#[cfg(any(not(target_arch = <span class="string">"wasm32"</span>), feature = <span class="string">"emscripten"</span>))] |
| 1356 | + </span><span class="kw">pub unsafe fn </span>texture_from_raw_renderbuffer( |
| 1357 | + <span class="kw-2">&</span><span class="self">self</span>, |
| 1358 | + name: std::num::NonZeroU32, |
| 1359 | + desc: <span class="kw-2">&</span><span class="kw">crate</span>::TextureDescriptor, |
| 1360 | + drop_guard: <span class="prelude-ty">Option</span><<span class="kw">crate</span>::DropGuard>, |
| 1361 | + ) -> <span class="kw">super</span>::Texture { |
| 1362 | + <span class="kw">let </span>copy_size = <span class="kw">crate</span>::CopyExtent::map_extent_to_copy_size(<span class="kw-2">&</span>desc.size, desc.dimension); |
| 1363 | + |
| 1364 | + <span class="kw">super</span>::Texture { |
| 1365 | + inner: <span class="kw">super</span>::TextureInner::Renderbuffer { |
| 1366 | + raw: glow::NativeRenderbuffer(name), |
| 1367 | + }, |
| 1368 | + drop_guard, |
| 1369 | + mip_level_count: desc.mip_level_count, |
| 1370 | + array_layer_count: <span class="kw">if </span>desc.dimension == wgt::TextureDimension::D2 { |
| 1371 | + desc.size.depth_or_array_layers |
| 1372 | + } <span class="kw">else </span>{ |
| 1373 | + <span class="number">1 |
| 1374 | + </span>}, |
| 1375 | + format: desc.format, |
| 1376 | + format_desc: <span class="self">self</span>.shared.describe_texture_format(desc.format), |
| 1377 | + copy_size, |
| 1378 | + is_cubemap: <span class="bool-val">false</span>, |
| 1379 | + } |
| 1380 | + } |
| 1381 | + |
1257 | 1382 | <span class="kw">unsafe fn </span>compile_shader(
|
1258 | 1383 | gl: <span class="kw-2">&</span>glow::Context,
|
1259 | 1384 | shader: <span class="kw-2">&</span>str,
|
|
1751 | 1876 | (<span class="kw">super</span>::TextureInner::Renderbuffer { raw }, <span class="bool-val">false</span>)
|
1752 | 1877 | } <span class="kw">else </span>{
|
1753 | 1878 | <span class="kw">let </span>raw = gl.create_texture().unwrap();
|
1754 |
| - <span class="kw">let </span>(target, is_3d, is_cubemap) = <span class="kw">match </span>desc.dimension { |
1755 |
| - wgt::TextureDimension::D1 | wgt::TextureDimension::D2 => { |
1756 |
| - <span class="kw">if </span>desc.size.depth_or_array_layers > <span class="number">1 </span>{ |
1757 |
| - <span class="comment">//HACK: detect a cube map |
1758 |
| - </span><span class="kw">let </span>cube_count = <span class="kw">if </span>desc.size.width == desc.size.height |
1759 |
| - && desc.size.depth_or_array_layers % <span class="number">6 </span>== <span class="number">0 |
1760 |
| - </span>&& desc.sample_count == <span class="number">1 |
1761 |
| - </span>{ |
1762 |
| - <span class="prelude-val">Some</span>(desc.size.depth_or_array_layers / <span class="number">6</span>) |
1763 |
| - } <span class="kw">else </span>{ |
1764 |
| - <span class="prelude-val">None |
1765 |
| - </span>}; |
1766 |
| - <span class="kw">match </span>cube_count { |
1767 |
| - <span class="prelude-val">None </span>=> (glow::TEXTURE_2D_ARRAY, <span class="bool-val">true</span>, <span class="bool-val">false</span>), |
1768 |
| - <span class="prelude-val">Some</span>(<span class="number">1</span>) => (glow::TEXTURE_CUBE_MAP, <span class="bool-val">false</span>, <span class="bool-val">true</span>), |
1769 |
| - <span class="prelude-val">Some</span>(<span class="kw">_</span>) => (glow::TEXTURE_CUBE_MAP_ARRAY, <span class="bool-val">true</span>, <span class="bool-val">true</span>), |
1770 |
| - } |
1771 |
| - } <span class="kw">else </span>{ |
1772 |
| - (glow::TEXTURE_2D, <span class="bool-val">false</span>, <span class="bool-val">false</span>) |
1773 |
| - } |
1774 |
| - } |
1775 |
| - wgt::TextureDimension::D3 => { |
1776 |
| - copy_size.depth = desc.size.depth_or_array_layers; |
1777 |
| - (glow::TEXTURE_3D, <span class="bool-val">true</span>, <span class="bool-val">false</span>) |
1778 |
| - } |
1779 |
| - }; |
| 1879 | + <span class="kw">let </span>(target, is_3d, is_cubemap) = |
| 1880 | + <span class="kw">super</span>::Texture::get_info_from_desc(<span class="kw-2">&mut </span>copy_size, desc); |
1780 | 1881 |
|
1781 | 1882 | gl.bind_texture(target, <span class="prelude-val">Some</span>(raw));
|
1782 | 1883 | <span class="comment">//Note: this has to be done before defining the storage!
|
|
1833 | 1934 |
|
1834 | 1935 | <span class="prelude-val">Ok</span>(<span class="kw">super</span>::Texture {
|
1835 | 1936 | inner,
|
| 1937 | + drop_guard: <span class="prelude-val">None</span>, |
1836 | 1938 | mip_level_count: desc.mip_level_count,
|
1837 | 1939 | array_layer_count: <span class="kw">if </span>desc.dimension == wgt::TextureDimension::D2 {
|
1838 | 1940 | desc.size.depth_or_array_layers
|
|
1846 | 1948 | })
|
1847 | 1949 | }
|
1848 | 1950 | <span class="kw">unsafe fn </span>destroy_texture(<span class="kw-2">&</span><span class="self">self</span>, texture: <span class="kw">super</span>::Texture) {
|
1849 |
| - <span class="kw">let </span>gl = <span class="kw-2">&</span><span class="self">self</span>.shared.context.lock(); |
1850 |
| - <span class="kw">match </span>texture.inner { |
1851 |
| - <span class="kw">super</span>::TextureInner::Renderbuffer { raw, .. } => { |
1852 |
| - gl.delete_renderbuffer(raw); |
1853 |
| - } |
1854 |
| - <span class="kw">super</span>::TextureInner::DefaultRenderbuffer => {} |
1855 |
| - <span class="kw">super</span>::TextureInner::Texture { raw, .. } => { |
1856 |
| - gl.delete_texture(raw); |
| 1951 | + <span class="kw">if </span>texture.drop_guard.is_none() { |
| 1952 | + <span class="kw">let </span>gl = <span class="kw-2">&</span><span class="self">self</span>.shared.context.lock(); |
| 1953 | + <span class="kw">match </span>texture.inner { |
| 1954 | + <span class="kw">super</span>::TextureInner::Renderbuffer { raw, .. } => { |
| 1955 | + gl.delete_renderbuffer(raw); |
| 1956 | + } |
| 1957 | + <span class="kw">super</span>::TextureInner::DefaultRenderbuffer => {} |
| 1958 | + <span class="kw">super</span>::TextureInner::Texture { raw, .. } => { |
| 1959 | + gl.delete_texture(raw); |
| 1960 | + } |
1857 | 1961 | }
|
1858 | 1962 | }
|
| 1963 | + |
| 1964 | + <span class="comment">// For clarity, we explicitly drop the drop guard. Although this has no real semantic effect as the |
| 1965 | + // end of the scope will drop the drop guard since this function takes ownership of the texture. |
| 1966 | + </span>drop(texture.drop_guard); |
1859 | 1967 | }
|
1860 | 1968 |
|
1861 | 1969 | <span class="kw">unsafe fn </span>create_texture_view(
|
|
0 commit comments