From 96c99bc2d9503b5c64f2a1dbc5333141848097c9 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 22 Jun 2023 20:56:30 +0200 Subject: [PATCH] etnaviv: linker: add fallback lookup to VARYING_SLOT_BFC[n] There are valid NIR shaders pairs where the vertex shader has a VARYING_SLOT_BFC0 shader_out and the corresponding framgent shader has a VARYING_SLOT_COL0 shader_in. So at link time if there is no matching VARYING_SLOT_BFC[n], we must map VARYING_SLOT_BFC0[n] to VARYING_SLOT_COL[n]. Example shader pair from 'spec@!opengl 2.0@vertex-program-two-side back': shader: MESA_SHADER_VERTEX source_sha1: {0xf916f77d, 0xffa6ab5e, 0x160976a7, 0xb59fe59c, 0x92e8f3f6} name: GLSL3 internal: false stage: 0 next_stage: 4 inputs_read: 0 outputs_written: 0,13 subgroup_size: 1 bit_sizes_float: 0x20 bit_sizes_int: 0x20 first_ubo_is_default_ubo: true flrp_lowered: true inputs: 1 outputs: 2 uniforms: 0 decl_var shader_in INTERP_MODE_NONE vec4 gl_Vertex (VERT_ATTRIB_POS.xyzw, 0, 0) decl_var shader_out INTERP_MODE_NONE vec4 gl_Position (VARYING_SLOT_POS.xyzw, 0, 0) decl_var shader_out INTERP_MODE_NONE vec4 gl_BackColor (VARYING_SLOT_BFC0.xyzw, 1, 0) decl_function main (0 params) impl main { block block_0: /* preds: */ vec1 32 ssa_0 = deref_var &gl_Vertex (shader_in vec4) vec4 32 ssa_1 = intrinsic load_deref (ssa_0) (access=0) vec4 32 ssa_2 = load_const (0x00000000, 0x00000000, 0x3f000000, 0x00000000) = (0.000000, 0.000000, 0.500000, 0.000000) vec1 32 ssa_5 = deref_var &gl_BackColor (shader_out vec4) vec4 32 ssa_11 = mov ssa_2 vec4 32 ssa_13 = fsat ssa_11 intrinsic store_deref (ssa_5, ssa_13) (wrmask=xyzw, access=0) vec1 32 ssa_7 = deref_var &gl_Position (shader_out vec4) vec4 32 ssa_12 = mov ssa_1 intrinsic store_deref (ssa_7, ssa_12) (wrmask=xyzw, access=0) /* succs: block_1 */ block block_1: } shader: MESA_SHADER_FRAGMENT source_sha1: {0x5059da66, 0x00c609e5, 0x5329c39a, 0x13e2fc88, 0x8e68cb71} name: GLSL3 internal: false stage: 4 next_stage: 4 inputs_read: 1 outputs_written: 2 subgroup_size: 1 first_ubo_is_default_ubo: true flrp_lowered: true inputs: 1 outputs: 1 uniforms: 0 decl_var shader_in INTERP_MODE_NONE vec4 gl_Color (VARYING_SLOT_COL0.xyzw, 0, 0) decl_var shader_out INTERP_MODE_NONE vec4 gl_FragColor (FRAG_RESULT_COLOR.xyzw, 0, 0) decl_function main (0 params) impl main { block block_0: /* preds: */ vec1 32 ssa_0 = deref_var &gl_Color (shader_in vec4) vec4 32 ssa_1 = intrinsic load_deref (ssa_0) (access=0) vec1 32 ssa_2 = deref_var &gl_FragColor (shader_out vec4) intrinsic store_deref (ssa_2, ssa_1) (wrmask=xyzw, access=0) /* succs: block_1 */ block block_1: } Signed-off-by: Christian Gmeiner Reviewed-by: Philipp Zabel Part-of: --- src/etnaviv/ci/etnaviv-gc2000-fails.txt | 40 ++++++++-------------- src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c | 20 +++++++++++ 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/etnaviv/ci/etnaviv-gc2000-fails.txt b/src/etnaviv/ci/etnaviv-gc2000-fails.txt index b1ad59c..23653b7 100644 --- a/src/etnaviv/ci/etnaviv-gc2000-fails.txt +++ b/src/etnaviv/ci/etnaviv-gc2000-fails.txt @@ -454,18 +454,14 @@ spec@glsl-1.10@execution@clipping@clip-plane-transformation pos_clipvert,Fail spec@glsl-1.10@execution@glsl-fs-convolution-2,Fail spec@glsl-1.10@execution@glsl-fs-uniform-array-7,Fail spec@glsl-1.10@execution@glsl-vs-large-uniform-array,Fail -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-flat-fixed,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-flat-none,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-flat-vertex,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-smooth-fixed,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-smooth-none,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-smooth-vertex,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-flat-fixed,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-flat-none,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-flat-vertex,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-smooth-fixed,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-smooth-none,Crash -spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-smooth-vertex,Crash +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-flat-fixed,Fail +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-flat-none,Fail +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-flat-vertex,Fail +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backsecondarycolor-smooth-vertex,Fail +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-flat-fixed,Fail +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-flat-none,Fail +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-flat-vertex,Fail +spec@glsl-1.10@execution@interpolation@interpolation-none-gl_backcolor-smooth-vertex,Fail spec@glsl-1.10@execution@interpolation@interpolation-none-gl_frontcolor-flat-fixed,Fail spec@glsl-1.10@execution@interpolation@interpolation-none-gl_frontcolor-flat-none,Fail spec@glsl-1.10@execution@interpolation@interpolation-none-gl_frontcolor-flat-vertex,Fail @@ -2029,20 +2025,12 @@ spec@!opengl 2.0@gl-2.0-edgeflag,Fail spec@!opengl 2.0@gl-2.0-edgeflag-immediate,Fail spec@!opengl 2.0@gl-2.0-two-sided-stencil,Fail spec@!opengl 2.0@occlusion-query-discard,Fail -spec@!opengl 2.0@vertex-program-two-side back2,Crash -spec@!opengl 2.0@vertex-program-two-side back back2,Crash -spec@!opengl 2.0@vertex-program-two-side back,Crash -spec@!opengl 2.0@vertex-program-two-side back front2 back2,Crash -spec@!opengl 2.0@vertex-program-two-side back front2,Crash -spec@!opengl 2.0@vertex-program-two-side enabled back2,Crash -spec@!opengl 2.0@vertex-program-two-side enabled back back2,Crash -spec@!opengl 2.0@vertex-program-two-side enabled back,Crash -spec@!opengl 2.0@vertex-program-two-side enabled back front2 back2,Crash -spec@!opengl 2.0@vertex-program-two-side enabled back front2,Crash +spec@!opengl 2.0@vertex-program-two-side enabled back front2 back2,Fail +spec@!opengl 2.0@vertex-program-two-side enabled back front2 back2@vs and fs,Fail +spec@!opengl 2.0@vertex-program-two-side enabled front back back2,Fail +spec@!opengl 2.0@vertex-program-two-side enabled front back back2@vs and fs,Fail spec@!opengl 2.0@vertex-program-two-side enabled front2 back2,Fail spec@!opengl 2.0@vertex-program-two-side enabled front2 back2@vs and fs,Fail -spec@!opengl 2.0@vertex-program-two-side enabled front back2,Crash -spec@!opengl 2.0@vertex-program-two-side enabled front back back2,Crash spec@!opengl 2.0@vertex-program-two-side enabled front back,Fail spec@!opengl 2.0@vertex-program-two-side enabled front back front2 back2,Fail spec@!opengl 2.0@vertex-program-two-side enabled front back front2 back2@vs and fs,Fail @@ -2051,8 +2039,8 @@ spec@!opengl 2.0@vertex-program-two-side enabled front back front2@vs and fs,Fai spec@!opengl 2.0@vertex-program-two-side enabled front back@vs and fs,Fail spec@!opengl 2.0@vertex-program-two-side enabled front front2 back2,Fail spec@!opengl 2.0@vertex-program-two-side enabled front front2 back2@vs and fs,Fail -spec@!opengl 2.0@vertex-program-two-side front back2,Crash -spec@!opengl 2.0@vertex-program-two-side front back back2,Crash +spec@!opengl 2.0@vertex-program-two-side front back2,Fail +spec@!opengl 2.0@vertex-program-two-side front back2@vs and fs,Fail spec@!opengl 2.0@vs-point_size-zero,Fail spec@!opengl 2.1@pbo,Fail spec@!opengl 2.1@pbo@test_polygon_stip,Fail diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c index d06477d..b8294f1 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c @@ -1247,6 +1247,26 @@ etna_shader_vs_lookup(const struct etna_shader_variant *sobj, if (sobj->outfile.reg[i].slot == in->slot) return &sobj->outfile.reg[i]; + /* + * There are valid NIR shaders pairs where the vertex shader has + * a VARYING_SLOT_BFC0 shader_out and the corresponding framgent + * shader has a VARYING_SLOT_COL0 shader_in. + * So at link time if there is no matching VARYING_SLOT_BFC[n], + * we must map VARYING_SLOT_BFC0[n] to VARYING_SLOT_COL[n]. + */ + gl_varying_slot slot; + + if (in->slot == VARYING_SLOT_COL0) + slot = VARYING_SLOT_BFC0; + else if (in->slot == VARYING_SLOT_COL1) + slot = VARYING_SLOT_BFC1; + else + return NULL; + + for (int i = 0; i < sobj->outfile.num_reg; i++) + if (sobj->outfile.reg[i].slot == slot) + return &sobj->outfile.reg[i]; + return NULL; } -- 2.7.4