Fix UI in WebGPU: call textureSample from outside the if (#13546)
# Objective - since #13523, UI is broken in WebGPU ``` Compilation log for [Invalid ShaderModule (unlabeled)]: 1 error(s) generated while compiling the shader: :108:27 error: 'textureSample' must only be called from uniform control flow let texture_color_1 = textureSample(sprite_texture, sprite_sampler, in_2.uv); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :151:19 note: called by 'draw_background' from 'fragment' let _e5 = draw_background(in); ^^^^^^^^^^^^^^^^^^^ :147:5 note: control flow depends on possibly non-uniform value if _e3 { ^^ :146:23 note: parameter 'in' of 'fragment' may be non-uniform let _e3 = enabled(in.flags, BORDER); ``` ## Solution - call `textureSample` from outside the if. both branches are using the same parameters
This commit is contained in:
parent
9d74e16821
commit
4065098586
@ -126,9 +126,7 @@ fn antialias(distance: f32) -> f32 {
|
|||||||
return clamp(0.0, 1.0, 0.5 - distance);
|
return clamp(0.0, 1.0, 0.5 - distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw(in: VertexOutput) -> vec4<f32> {
|
fn draw(in: VertexOutput, texture_color: vec4<f32>) -> vec4<f32> {
|
||||||
let texture_color = textureSample(sprite_texture, sprite_sampler, in.uv);
|
|
||||||
|
|
||||||
// Only use the color sampled from the texture if the `TEXTURED` flag is enabled.
|
// Only use the color sampled from the texture if the `TEXTURED` flag is enabled.
|
||||||
// This allows us to draw both textured and untextured shapes together in the same batch.
|
// This allows us to draw both textured and untextured shapes together in the same batch.
|
||||||
let color = select(in.color, in.color * texture_color, enabled(in.flags, TEXTURED));
|
let color = select(in.color, in.color * texture_color, enabled(in.flags, TEXTURED));
|
||||||
@ -161,8 +159,7 @@ fn draw(in: VertexOutput) -> vec4<f32> {
|
|||||||
return vec4(color.rgb, saturate(color.a * t));
|
return vec4(color.rgb, saturate(color.a * t));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_background(in: VertexOutput) -> vec4<f32> {
|
fn draw_background(in: VertexOutput, texture_color: vec4<f32>) -> vec4<f32> {
|
||||||
let texture_color = textureSample(sprite_texture, sprite_sampler, in.uv);
|
|
||||||
let color = select(in.color, in.color * texture_color, enabled(in.flags, TEXTURED));
|
let color = select(in.color, in.color * texture_color, enabled(in.flags, TEXTURED));
|
||||||
|
|
||||||
// When drawing the background only draw the internal area and not the border.
|
// When drawing the background only draw the internal area and not the border.
|
||||||
@ -173,9 +170,11 @@ fn draw_background(in: VertexOutput) -> vec4<f32> {
|
|||||||
|
|
||||||
@fragment
|
@fragment
|
||||||
fn fragment(in: VertexOutput) -> @location(0) vec4<f32> {
|
fn fragment(in: VertexOutput) -> @location(0) vec4<f32> {
|
||||||
|
let texture_color = textureSample(sprite_texture, sprite_sampler, in.uv);
|
||||||
|
|
||||||
if enabled(in.flags, BORDER) {
|
if enabled(in.flags, BORDER) {
|
||||||
return draw(in);
|
return draw(in, texture_color);
|
||||||
} else {
|
} else {
|
||||||
return draw_background(in);
|
return draw_background(in, texture_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user