Skip to content

Commit

Permalink
Fix WebGL crash due to rectangle shader returning arrays (#2413)
Browse files Browse the repository at this point in the history
<!--
Open the PR up as a draft until you feel it is ready for a proper
review.

Do not make PR:s from your own `main` branch, as that makes it difficult
for reviewers to add their own fixes.

Add any improvements to the branch as new commits to make it easier for
reviewers to follow the progress. All commits will be squashed to a
single commit once the PR is merged into `main`.

Make sure you mention any issues that this PR closes in the description,
as well as any other related issues.

To get an auto-generated PR description you can put "copilot:summary" or
"copilot:walkthrough" anywhere.
-->

### What

Works around  gfx-rs/naga#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)


<!-- This line will get updated when the PR build summary job finishes.
-->
PR Build Summary: https://build.rerun.io/pr/2413

<!-- pr-link-docs:start -->
Docs preview: https://rerun.io/preview/26e3636/docs
Examples preview: https://rerun.io/preview/26e3636/examples
<!-- pr-link-docs:end -->
  • Loading branch information
Wumpf authored Jun 13, 2023
1 parent 6f0a01e commit 6dd8c70
Showing 1 changed file with 12 additions and 25 deletions.
37 changes: 12 additions & 25 deletions crates/re_renderer/shader/rectangle_fs.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -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<IVec2, 4> {
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, 4>(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));
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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 {
Expand Down

1 comment on commit 6dd8c70

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Rust Benchmark'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.25.

Benchmark suite Current: 6dd8c70 Previous: d8d6445 Ratio
datastore/num_rows=1000/num_instances=1000/packed=false/insert/default 3980248 ns/iter (± 9701) 2833736 ns/iter (± 2962) 1.40
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/default 411 ns/iter (± 2) 310 ns/iter (± 0) 1.33
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/default 300 ns/iter (± 0) 224 ns/iter (± 0) 1.34
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/default 455 ns/iter (± 1) 342 ns/iter (± 0) 1.33
datastore/num_rows=1000/num_instances=1000/packed=false/range/default 4058414 ns/iter (± 31044) 2857148 ns/iter (± 5897) 1.42
datastore/num_rows=1000/num_instances=1000/gc/default 2693990 ns/iter (± 18654) 1726134 ns/iter (± 10353) 1.56
mono_points_arrow_batched/generate_message_bundles 27864307 ns/iter (± 2728342) 18413589 ns/iter (± 89999) 1.51
mono_points_arrow_batched/generate_messages 6213138 ns/iter (± 1062632) 3578737 ns/iter (± 16409) 1.74
mono_points_arrow_batched/encode_total 37599950 ns/iter (± 3486579) 23431211 ns/iter (± 83466) 1.60
mono_points_arrow_batched/decode_log_msg 532655 ns/iter (± 4657) 305400 ns/iter (± 730) 1.74
mono_points_arrow_batched/decode_message_bundles 10311919 ns/iter (± 1007815) 7334982 ns/iter (± 20293) 1.41
mono_points_arrow_batched/decode_total 10956800 ns/iter (± 824054) 7705667 ns/iter (± 12486) 1.42
batch_points_arrow/decode_log_msg 73183 ns/iter (± 425) 47469 ns/iter (± 157) 1.54
batch_points_arrow/decode_total 80249 ns/iter (± 1349) 52612 ns/iter (± 134) 1.53
arrow_mono_points/insert 2757745548 ns/iter (± 20781537) 1789759507 ns/iter (± 4256728) 1.54
arrow_mono_points/query 1427141 ns/iter (± 34670) 973844 ns/iter (± 1439) 1.47
arrow_batch_points/insert 1523168 ns/iter (± 4934) 1177806 ns/iter (± 5301) 1.29
arrow_batch_vecs/insert 30330 ns/iter (± 99) 23962 ns/iter (± 57) 1.27

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.