Skip to content

Commit bd49dbb

Browse files
committed
[gles] Implement support for external textures
This enables the use of GL_OES_EGL_image_external_essl3 on gles when the `EXTERNAL_TEXTURE` feature is requested and creates the required bindings.
1 parent c1583ab commit bd49dbb

4 files changed

Lines changed: 87 additions & 2 deletions

File tree

wgpu-hal/src/gles/adapter.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,11 @@ impl super::Adapter {
488488
wgt::Features::SHADER_EARLY_DEPTH_TEST,
489489
supported((3, 1), (4, 2)) || extensions.contains("GL_ARB_shader_image_load_store"),
490490
);
491+
features.set(
492+
wgt::Features::EXTERNAL_TEXTURE,
493+
es_ver.is_some_and(|v| v >= (3, 0))
494+
&& extensions.contains("GL_OES_EGL_image_external_essl3"),
495+
);
491496
if extensions.contains("GL_ARB_timer_query") {
492497
features.set(wgt::Features::TIMESTAMP_QUERY, true);
493498
features.set(wgt::Features::TIMESTAMP_QUERY_INSIDE_ENCODERS, true);

wgpu-hal/src/gles/command.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,41 @@ impl crate::CommandEncoder for super::CommandEncoder {
805805
binding: binding.clone(),
806806
});
807807
}
808+
super::RawBinding::ExternalTexture {
809+
raw,
810+
target,
811+
params_raw,
812+
params_offset,
813+
params_size,
814+
} => {
815+
// Bind the texture to its texture unit slot
816+
dirty_textures |= 1 << slot;
817+
self.state.texture_slots[slot as usize].tex_target = target;
818+
self.cmd_buffer.commands.push(C::BindTexture {
819+
slot,
820+
texture: raw,
821+
target,
822+
aspects: crate::FormatAspects::COLOR,
823+
mip_levels: 0..1,
824+
});
825+
// Bind the params SSBO to its shader storage buffer binding point
826+
let params_slot = layout
827+
.naga_options
828+
.external_texture_binding_map
829+
.get(&naga::ResourceBinding {
830+
group: index,
831+
binding: binding_layout.binding,
832+
})
833+
.map(|t| t.params as u32)
834+
.unwrap();
835+
self.cmd_buffer.commands.push(C::BindBuffer {
836+
target: glow::SHADER_STORAGE_BUFFER,
837+
slot: params_slot,
838+
buffer: params_raw,
839+
offset: params_offset,
840+
size: params_size,
841+
});
842+
}
808843
}
809844
}
810845

wgpu-hal/src/gles/device.rs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

wgpu-hal/src/gles/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,13 @@ enum RawBinding {
595595
},
596596
Image(ImageBinding),
597597
Sampler(glow::Sampler),
598+
ExternalTexture {
599+
raw: glow::Texture,
600+
target: BindTarget,
601+
params_raw: glow::Buffer,
602+
params_offset: i32,
603+
params_size: i32,
604+
},
598605
}
599606

600607
#[derive(Debug)]

0 commit comments

Comments
 (0)