fix: blending in webgl impl
diff --git a/sparse_strips/vello_dev_macros/src/test.rs b/sparse_strips/vello_dev_macros/src/test.rs index 4f32374..7f28e7b 100644 --- a/sparse_strips/vello_dev_macros/src/test.rs +++ b/sparse_strips/vello_dev_macros/src/test.rs
@@ -191,13 +191,6 @@ || input_fn_name_str.contains("clip_clear") }; - // These tests currently don't work with `vello_hybrid` running with the webgl backend in the - // browser. - // TODO: Enable blend in webgl. - let skip_hybrid_webgl = skip_hybrid - || input_fn_name_str.contains("compose") - || input_fn_name_str.contains("clip_composite_opacity_nested_circles"); - let empty_snippet = quote! {}; let ignore_snippet = if let Some(reason) = ignore_reason { quote! {#[ignore = #reason]} @@ -210,7 +203,7 @@ } else { empty_snippet.clone() }; - let ignore_hybrid_webgl = if skip_hybrid_webgl { + let ignore_hybrid_webgl = if skip_hybrid { ignore_snippet.clone() } else { empty_snippet.clone()
diff --git a/sparse_strips/vello_hybrid/src/render/webgl.rs b/sparse_strips/vello_hybrid/src/render/webgl.rs index a91afc4..2a89fd8 100644 --- a/sparse_strips/vello_hybrid/src/render/webgl.rs +++ b/sparse_strips/vello_hybrid/src/render/webgl.rs
@@ -739,7 +739,7 @@ let config = Config { width: new_render_size.width, height: new_render_size.height, - strip_height: Tile::HEIGHT.into(), + strip_height: u32::from(Tile::HEIGHT), alphas_tex_width_bits: max_texture_dimension_2d.trailing_zeros(), }; @@ -755,13 +755,13 @@ ); } + let total_slots = max_texture_dimension_2d / u32::from(Tile::HEIGHT); // Update slot config buffer. { let slot_config = Config { width: u32::from(WideTile::WIDTH), - height: u32::from(Tile::HEIGHT) - * (max_texture_dimension_2d / u32::from(Tile::HEIGHT)), - strip_height: Tile::HEIGHT.into(), + height: u32::from(Tile::HEIGHT) * total_slots, + strip_height: u32::from(Tile::HEIGHT), alphas_tex_width_bits: max_texture_dimension_2d.trailing_zeros(), }; @@ -782,9 +782,8 @@ { let clear_config = ClearSlotsConfig { slot_width: u32::from(WideTile::WIDTH), - slot_height: u32::from(Tile::HEIGHT) - * (max_texture_dimension_2d / u32::from(Tile::HEIGHT)), - texture_height: Tile::HEIGHT.into(), + slot_height: u32::from(Tile::HEIGHT), + texture_height: u32::from(Tile::HEIGHT) * total_slots, _padding: 0, }; @@ -1583,6 +1582,10 @@ return; } + // No blending needed for clearing: we want to completely overwrite existing slot data + // (matches wgpu implementation) + self.gl.disable(WebGl2RenderingContext::BLEND); + // Upload slot indices. self.gl.bind_buffer( WebGl2RenderingContext::ARRAY_BUFFER, @@ -1629,6 +1632,8 @@ slot_indices.len() as i32, ); + self.gl.enable(WebGl2RenderingContext::BLEND); + // Clean up. self.gl.bind_vertex_array(None); }