Skip to content

Commit

Permalink
Address comments
Browse files Browse the repository at this point in the history
  • Loading branch information
daxpedda committed Apr 3, 2023
1 parent ae324d3 commit b283875
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 143 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ By @cwfitzgerald in [#3610](https://github.com/gfx-rs/wgpu/pull/3610).
- Reset all queue state between command buffers in a submit. By @jleibs [#3589](https://github.com/gfx-rs/wgpu/pull/3589)
- Reset the state of `SAMPLE_ALPHA_TO_COVERAGE` on queue reset. By @jleibs [#3589](https://github.com/gfx-rs/wgpu/pull/3589)
- Fix `Vertex buffer is not big enough for the draw call.` for ANGLE/Web when rendering with instance attributes on a single instance. By @wumpf in [#3597](https://github.com/gfx-rs/wgpu/pull/3597)
- Fix `copy_external_image_to_texture` and `copy_texture_to_texture` not taking 2D texture arrays and cube maps into account. By @daxpedda [#3641](https://github.com/gfx-rs/wgpu/pull/3641)
- Fix `copy_external_image_to_texture`, `copy_texture_to_texture` and `copy_buffer_to_texture` not taking the specified index into account if the target texture is a cube map, 2D texture array or cube map array. By @daxpedda [#3641](https://github.com/gfx-rs/wgpu/pull/3641)

#### General

Expand Down
227 changes: 89 additions & 138 deletions wgpu-hal/src/gles/queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -393,11 +393,12 @@ impl super::Queue {
unsafe { gl.bind_texture(dst_target, Some(dst)) };
let format_desc = self.shared.describe_texture_format(dst_format);
if is_layered_target(dst_target) {
let z_offset = if let glow::TEXTURE_2D_ARRAY = dst_target {
copy.dst_base.array_layer as i32
} else {
copy.dst_base.origin.z as i32
};
let z_offset =
if let glow::TEXTURE_2D_ARRAY | glow::TEXTURE_CUBE_MAP_ARRAY = dst_target {
copy.dst_base.array_layer as i32
} else {
copy.dst_base.origin.z as i32
};

match src.source {
wgt::ExternalImageSource::ImageBitmap(ref b) => unsafe {
Expand Down Expand Up @@ -561,7 +562,9 @@ impl super::Queue {
copy.dst_base.mip_level as i32,
copy.dst_base.origin.x as i32,
copy.dst_base.origin.y as i32,
if let glow::TEXTURE_2D_ARRAY = dst_target {
if let glow::TEXTURE_2D_ARRAY | glow::TEXTURE_CUBE_MAP_ARRAY =
dst_target
{
copy.dst_base.array_layer as i32
} else {
copy.dst_base.origin.z as i32
Expand Down Expand Up @@ -626,90 +629,46 @@ impl super::Queue {
glow::PixelUnpackData::Slice(src_data)
}
};
match dst_target {
glow::TEXTURE_3D => {
unsafe {
gl.tex_sub_image_3d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.texture_base.origin.z as i32,
copy.size.width as i32,
copy.size.height as i32,
copy.size.depth as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
}
glow::TEXTURE_2D_ARRAY => {
unsafe {
gl.tex_sub_image_3d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.texture_base.array_layer as i32,
copy.size.width as i32,
copy.size.height as i32,
copy.size.depth as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
}
glow::TEXTURE_2D => {
unsafe {
gl.tex_sub_image_2d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.size.width as i32,
copy.size.height as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
}
glow::TEXTURE_CUBE_MAP => {
unsafe {
gl.tex_sub_image_2d(
CUBEMAP_FACES[copy.texture_base.array_layer as usize],
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.size.width as i32,
copy.size.height as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
}
glow::TEXTURE_CUBE_MAP_ARRAY => {
//Note: not sure if this is correct!
unsafe {
gl.tex_sub_image_3d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.texture_base.origin.z as i32,
copy.size.width as i32,
copy.size.height as i32,
copy.size.depth as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
}
_ => unreachable!(),
if is_layered_target(dst_target) {
unsafe {
gl.tex_sub_image_3d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
if let glow::TEXTURE_2D_ARRAY | glow::TEXTURE_CUBE_MAP_ARRAY =
dst_target
{
copy.texture_base.array_layer as i32
} else {
copy.dst_base.origin.z as i32
},
copy.size.width as i32,
copy.size.height as i32,
copy.size.depth as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
} else {
unsafe {
gl.tex_sub_image_2d(
if let glow::TEXTURE_CUBE_MAP = dst_target {
CUBEMAP_FACES[copy.texture_base.array_layer as usize]
} else {
dst_target
},
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.size.width as i32,
copy.size.height as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
}
} else {
let bytes_per_row = copy
Expand Down Expand Up @@ -746,54 +705,46 @@ impl super::Queue {
}
};

match dst_target {
glow::TEXTURE_3D
| glow::TEXTURE_CUBE_MAP_ARRAY
| glow::TEXTURE_2D_ARRAY => {
unsafe {
gl.compressed_tex_sub_image_3d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.texture_base.origin.z as i32,
copy.size.width as i32,
copy.size.height as i32,
copy.size.depth as i32,
format_desc.internal,
unpack_data,
)
};
}
glow::TEXTURE_2D => {
unsafe {
gl.compressed_tex_sub_image_2d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.size.width as i32,
copy.size.height as i32,
format_desc.internal,
unpack_data,
)
};
}
glow::TEXTURE_CUBE_MAP => {
unsafe {
gl.compressed_tex_sub_image_2d(
CUBEMAP_FACES[copy.texture_base.array_layer as usize],
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.size.width as i32,
copy.size.height as i32,
format_desc.internal,
unpack_data,
)
};
}
_ => unreachable!(),
if is_layered_target(dst_target) {
unsafe {
gl.tex_sub_image_3d(
dst_target,
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
if let glow::TEXTURE_2D_ARRAY | glow::TEXTURE_CUBE_MAP_ARRAY =
dst_target
{
copy.texture_base.array_layer as i32
} else {
copy.dst_base.origin.z as i32
},
copy.size.width as i32,
copy.size.height as i32,
copy.size.depth as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
} else {
unsafe {
gl.tex_sub_image_2d(
if let glow::TEXTURE_CUBE_MAP = dst_target {
CUBEMAP_FACES[copy.texture_base.array_layer as usize]
} else {
dst_target
},
copy.texture_base.mip_level as i32,
copy.texture_base.origin.x as i32,
copy.texture_base.origin.y as i32,
copy.size.width as i32,
copy.size.height as i32,
format_desc.external,
format_desc.data_type,
unpack_data,
)
};
}
}
if unbind_unpack_buffer {
Expand Down
5 changes: 1 addition & 4 deletions wgpu/tests/external_texture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,6 @@ async fn image_bitmap_import() {

// If the test is suppoed to be valid call to copyExternal.
let mut valid = true;
// If the result is incorrect
let mut correct = true;
match case {
TestCase::Normal => {}
TestCase::FlipY => {
Expand Down Expand Up @@ -244,7 +242,6 @@ async fn image_bitmap_import() {
dest_layers = 2;
}
TestCase::SecondSliceCopy => {
correct = true;
dest_origin.z = 1;
dest_data_layer = 1;
dest_layers = 2;
Expand Down Expand Up @@ -336,7 +333,7 @@ async fn image_bitmap_import() {
let gpu_image_cropped =
image::imageops::crop_imm(&gpu_image, 0, 0, 3, 3).to_image();

if valid && correct {
if valid {
assert_eq!(
raw_image, gpu_image_cropped,
"Failed on test case {case:?} {source:?}"
Expand Down

0 comments on commit b283875

Please sign in to comment.