dawn-cmake/test/shader_io/fragment_input_mixed.wgsl.expected.glsl
Stephen White a924ffe70c GLSL: fix sample_index, sample_mask and bitcasts
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>
2022-02-04 16:41:33 +00:00

36 lines
982 B
GLSL

#version 310 es
#extension GL_OES_sample_variables : require
precision mediump float;
layout(location = 0) flat in int loc0_1;
layout(location = 1) flat in uint loc1_1;
layout(location = 3) in vec4 loc3_1;
layout(location = 2) in float loc2_1;
struct FragmentInputs0 {
vec4 position;
int loc0;
};
struct FragmentInputs1 {
vec4 loc3;
uint sample_mask;
};
void tint_symbol(FragmentInputs0 inputs0, bool front_facing, uint loc1, uint sample_index, FragmentInputs1 inputs1, float loc2) {
if (front_facing) {
vec4 foo = inputs0.position;
uint bar = (sample_index + inputs1.sample_mask);
int i = inputs0.loc0;
uint u = loc1;
float f = loc2;
vec4 v = inputs1.loc3;
}
}
void main() {
FragmentInputs0 tint_symbol_1 = FragmentInputs0(gl_FragCoord, loc0_1);
FragmentInputs1 tint_symbol_2 = FragmentInputs1(loc3_1, uint(gl_SampleMaskIn[0]));
tint_symbol(tint_symbol_1, gl_FrontFacing, loc1_1, uint(gl_SampleID), tint_symbol_2, loc2_1);
return;
}