mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-01 04:01:26 +00:00
In GLSL, gl_SampleID and gl_SampleMask[In] require the GL_OES_sample_variables extension, so output: "#extension GL_OES_sample_variables : require" in the header if those builtins is used. Note that extensions must be inserted before the default precision declaration, but helpers must be inserted after it, so we set a flag and emit extensions, then the precision declaration, then helpers. Further fixes: - use gl_SampleMaskIn for input builtins, gl_SampleMask for output, necessitating the addition of a storage class to GLSLBuiltinToString() - fix the handling of gl_SampleMaskIn: it's array<i32> in GLSL, not array<u32> as in SPIR-V - centralize conversions for GLSL builtins used as input variables in FromGLSLBuiltin() - implement bitcasts on assignment to GLSL builtin output variables, centralized in ToGLSLBuiltin() - update the extension handling in the GLSL writer to check for both sample_index and sample_mask. - call UnwrapRef() in GLSL's EmitBitcast(). In the test case, we were not recognizing the argument as a uint, yielding float() instead of uintBitsToFloat(). Bug: tint:1408, tint:1412, tint:1414 Change-Id: Ie01541eb6e7cdf4e21347341f988bff916346797 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/78920 Reviewed-by: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Stephen White <senorblanco@chromium.org>
33 lines
811 B
GLSL
33 lines
811 B
GLSL
#version 310 es
|
|
#extension GL_OES_sample_variables : require
|
|
precision mediump float;
|
|
|
|
layout(location = 0) out int loc0_1;
|
|
layout(location = 1) out uint loc1_1;
|
|
layout(location = 2) out float loc2_1;
|
|
layout(location = 3) out vec4 loc3_1;
|
|
struct FragmentOutputs {
|
|
int loc0;
|
|
float frag_depth;
|
|
uint loc1;
|
|
float loc2;
|
|
uint sample_mask;
|
|
vec4 loc3;
|
|
};
|
|
|
|
FragmentOutputs tint_symbol() {
|
|
FragmentOutputs tint_symbol_1 = FragmentOutputs(1, 2.0f, 1u, 1.0f, 2u, vec4(1.0f, 2.0f, 3.0f, 4.0f));
|
|
return tint_symbol_1;
|
|
}
|
|
|
|
void main() {
|
|
FragmentOutputs inner_result = tint_symbol();
|
|
loc0_1 = inner_result.loc0;
|
|
gl_FragDepth = inner_result.frag_depth;
|
|
loc1_1 = inner_result.loc1;
|
|
loc2_1 = inner_result.loc2;
|
|
gl_SampleMask[0] = int(inner_result.sample_mask);
|
|
loc3_1 = inner_result.loc3;
|
|
return;
|
|
}
|