From 00c4499419300d75a41401b5396a29498b5c2a53 Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Tue, 13 Jun 2023 19:19:32 +0200 Subject: [PATCH] Fix WebGL crash due to rectangle shader returning arrays (#2413) ### What Works around https://github.com/gfx-rs/naga/issues/2380 ### Checklist * [x] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md) PR Build Summary: https://build.rerun.io/pr/2413 Docs preview: https://rerun.io/preview/26e3636/docs Examples preview: https://rerun.io/preview/26e3636/examples --- crates/re_renderer/shader/rectangle_fs.wgsl | 37 +++++++-------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/crates/re_renderer/shader/rectangle_fs.wgsl b/crates/re_renderer/shader/rectangle_fs.wgsl index 706b66977f23..58d84196e819 100644 --- a/crates/re_renderer/shader/rectangle_fs.wgsl +++ b/crates/re_renderer/shader/rectangle_fs.wgsl @@ -46,16 +46,6 @@ fn clamp_to_edge_nearest_neighbor(coord: Vec2, texture_dimension: Vec2) -> IVec2 return IVec2(clamp(floor(coord), Vec2(0.0), texture_dimension - Vec2(1.0))); } -/// Takes a floating point texel coordinate and outputs the four integer texel coordinates that are used for bilinear filtering. -/// All four samples are clamped to the texture edge. -fn clamp_to_edge_bilinear_samples(coord: Vec2, texture_dimension: Vec2) -> array { - let v00 = clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, -0.5), texture_dimension); - let v01 = clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, 0.5), texture_dimension); - let v10 = clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, -0.5), texture_dimension); - let v11 = clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, 0.5), texture_dimension); - return array(IVec2(v00), IVec2(v01), IVec2(v10), IVec2(v11)); -} - fn filter_bilinear(coord: Vec2, v00: Vec4, v01: Vec4, v10: Vec4, v11: Vec4) -> Vec4 { let top = mix(v00, v10, fract(coord.x - 0.5)); let bottom = mix(v01, v11, fract(coord.x - 0.5)); @@ -75,11 +65,10 @@ fn fs_main(in: VertexOut) -> @location(0) Vec4 { clamp_to_edge_nearest_neighbor(coord, texture_dimensions), 0)); } else { // bilinear - let sample_positions = clamp_to_edge_bilinear_samples(coord, texture_dimensions); - let v00 = decode_color(textureLoad(texture_float, sample_positions[0], 0)); - let v01 = decode_color(textureLoad(texture_float, sample_positions[1], 0)); - let v10 = decode_color(textureLoad(texture_float, sample_positions[2], 0)); - let v11 = decode_color(textureLoad(texture_float, sample_positions[3], 0)); + let v00 = decode_color(textureLoad(texture_float, clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, -0.5), texture_dimensions), 0)); + let v01 = decode_color(textureLoad(texture_float, clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, 0.5), texture_dimensions), 0)); + let v10 = decode_color(textureLoad(texture_float, clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, -0.5), texture_dimensions), 0)); + let v11 = decode_color(textureLoad(texture_float, clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, 0.5), texture_dimensions), 0)); normalized_value = filter_bilinear(coord, v00, v01, v10, v11); } } else if rect_info.sample_type == SAMPLE_TYPE_SINT { @@ -91,11 +80,10 @@ fn fs_main(in: VertexOut) -> @location(0) Vec4 { clamp_to_edge_nearest_neighbor(coord, texture_dimensions), 0))); } else { // bilinear - let sample_positions = clamp_to_edge_bilinear_samples(coord, texture_dimensions); - let v00 = decode_color(Vec4(textureLoad(texture_sint, sample_positions[0], 0))); - let v01 = decode_color(Vec4(textureLoad(texture_sint, sample_positions[1], 0))); - let v10 = decode_color(Vec4(textureLoad(texture_sint, sample_positions[2], 0))); - let v11 = decode_color(Vec4(textureLoad(texture_sint, sample_positions[3], 0))); + let v00 = decode_color(Vec4(textureLoad(texture_sint, clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, -0.5), texture_dimensions), 0))); + let v01 = decode_color(Vec4(textureLoad(texture_sint, clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, 0.5), texture_dimensions), 0))); + let v10 = decode_color(Vec4(textureLoad(texture_sint, clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, -0.5), texture_dimensions), 0))); + let v11 = decode_color(Vec4(textureLoad(texture_sint, clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, 0.5), texture_dimensions), 0))); normalized_value = filter_bilinear(coord, v00, v01, v10, v11); } } else if rect_info.sample_type == SAMPLE_TYPE_UINT { @@ -107,11 +95,10 @@ fn fs_main(in: VertexOut) -> @location(0) Vec4 { clamp_to_edge_nearest_neighbor(coord, texture_dimensions), 0))); } else { // bilinear - let sample_positions = clamp_to_edge_bilinear_samples(coord, texture_dimensions); - let v00 = decode_color(Vec4(textureLoad(texture_uint, sample_positions[0], 0))); - let v01 = decode_color(Vec4(textureLoad(texture_uint, sample_positions[1], 0))); - let v10 = decode_color(Vec4(textureLoad(texture_uint, sample_positions[2], 0))); - let v11 = decode_color(Vec4(textureLoad(texture_uint, sample_positions[3], 0))); + let v00 = decode_color(Vec4(textureLoad(texture_uint, clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, -0.5), texture_dimensions), 0))); + let v01 = decode_color(Vec4(textureLoad(texture_uint, clamp_to_edge_nearest_neighbor(coord + vec2(-0.5, 0.5), texture_dimensions), 0))); + let v10 = decode_color(Vec4(textureLoad(texture_uint, clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, -0.5), texture_dimensions), 0))); + let v11 = decode_color(Vec4(textureLoad(texture_uint, clamp_to_edge_nearest_neighbor(coord + vec2( 0.5, 0.5), texture_dimensions), 0))); normalized_value = filter_bilinear(coord, v00, v01, v10, v11); } } else {