@@ -1219,6 +1219,7 @@ impl crate::Device for super::Device {
12191219 // https://github.com/gfx-rs/wgpu/pull/3440/files#r1095726950
12201220 writer_flags. set ( glsl:: WriterFlags :: FORCE_POINT_SIZE , true ) ;
12211221 let mut binding_map = glsl:: BindingMap :: default ( ) ;
1222+ let mut external_texture_binding_map = glsl:: ExternalTextureBindingMap :: default ( ) ;
12221223
12231224 for ( group_index, bg_layout) in desc. bind_group_layouts . iter ( ) . enumerate ( ) {
12241225 let Some ( bg_layout) = bg_layout else {
@@ -1252,7 +1253,28 @@ impl crate::Device for super::Device {
12521253 ..
12531254 } => & mut num_storage_buffers,
12541255 wgt:: BindingType :: AccelerationStructure { .. } => unimplemented ! ( ) ,
1255- wgt:: BindingType :: ExternalTexture => unimplemented ! ( ) ,
1256+ wgt:: BindingType :: ExternalTexture => {
1257+ let texture_slot = num_textures;
1258+ let params_slot = num_storage_buffers;
1259+ let count = entry. count . map_or ( 1 , |c| c. get ( ) as u8 ) ;
1260+
1261+ binding_to_slot[ entry. binding as usize ] = texture_slot;
1262+ let br = naga:: ResourceBinding {
1263+ group : group_index as u32 ,
1264+ binding : entry. binding ,
1265+ } ;
1266+ binding_map. insert ( br, texture_slot) ;
1267+ external_texture_binding_map. insert (
1268+ br,
1269+ glsl:: ExternalTextureBindTarget {
1270+ texture : texture_slot,
1271+ params : params_slot,
1272+ } ,
1273+ ) ;
1274+ num_textures += count;
1275+ num_storage_buffers += count;
1276+ continue ;
1277+ }
12561278 } ;
12571279
12581280 binding_to_slot[ entry. binding as usize ] = * counter;
@@ -1278,6 +1300,7 @@ impl crate::Device for super::Device {
12781300 version : self . shared . shading_language_version ,
12791301 writer_flags,
12801302 binding_map,
1303+ external_texture_binding_map,
12811304 zero_initialize_workgroup_memory : true ,
12821305 } ,
12831306 } )
@@ -1363,7 +1386,22 @@ impl crate::Device for super::Device {
13631386 } )
13641387 }
13651388 wgt:: BindingType :: AccelerationStructure { .. } => unimplemented ! ( ) ,
1366- wgt:: BindingType :: ExternalTexture => unimplemented ! ( ) ,
1389+ wgt:: BindingType :: ExternalTexture => {
1390+ let ext_tex = & desc. external_textures [ entry. resource_index as usize ] ;
1391+ let view = ext_tex. planes [ 0 ] . view ;
1392+ let ( raw, target) = view. inner . as_native ( ) ;
1393+ let params = & ext_tex. params ;
1394+ super :: RawBinding :: ExternalTexture {
1395+ raw,
1396+ target,
1397+ params_raw : params. buffer . raw . unwrap ( ) ,
1398+ params_offset : params. offset as i32 ,
1399+ params_size : match params. size {
1400+ Some ( s) => s. get ( ) as i32 ,
1401+ None => ( params. buffer . size - params. offset ) as i32 ,
1402+ } ,
1403+ }
1404+ }
13671405 } ;
13681406 contents. push ( binding) ;
13691407 }
0 commit comments