On Wed, Nov 21, 2018 at 1:45 PM Jose Maria Casanova Crespo <jmcasan...@igalia.com> wrote: > > Recent change on OpenGL CTS ("Use non-arrayed varying name for TCS blocks") > on KHR-GL*.tessellation_shader.single.xfb_captures_data_from_correct_stage > tests changed how to name per-vertex Tessellation Control Shader output > varyings in transform feedback using interface block as "BLOCK_INOUT.value" > rather than "BLOCK_INOUT[0].value" > > So Tessellation control shader per-vertex output variables and blocks that > are required to be declared as arrays, with each element representing output > values for a single vertex of a multi-vertex primitive are expected to be > named as they were not declared as arrays. > > This patch adds a new is_xfb_per_vertex_output flag at ir_variable level so > we mark when an ir_variable is an per-vertex TCS output varying. So we > treat it in terms on XFB its naming as a non array variable. > > As we don't support NV_gpu_shader5, so PATCHES mode is not accepted as > primitiveMode parameter of BeginTransformFeedback the test expects a > failure as we can use the XFB results. > > This patch uncovers that we were passing the GLES version of the tests > because candidates naming didn't match, not because on GLES the Tessellation > Control stage varyings shouldn't be XFB candidates in any case. This > is addressed in the following patch. > > Fixes: > KHR-GL4*.tessellation_shader.single.xfb_captures_data_from_correct_stage > > Cc: mesa-sta...@lists.freedesktop.org > --- > src/compiler/glsl/ir.cpp | 1 + > src/compiler/glsl/ir.h | 6 ++++++ > src/compiler/glsl/link_uniforms.cpp | 6 ++++-- > src/compiler/glsl/link_varyings.cpp | 8 +++++++- > 4 files changed, 18 insertions(+), 3 deletions(-) > > diff --git a/src/compiler/glsl/ir.cpp b/src/compiler/glsl/ir.cpp > index 1d1a56ae9a5..582111d71f5 100644 > --- a/src/compiler/glsl/ir.cpp > +++ b/src/compiler/glsl/ir.cpp > @@ -1750,6 +1750,7 @@ ir_variable::ir_variable(const struct glsl_type *type, > const char *name, > this->data.fb_fetch_output = false; > this->data.bindless = false; > this->data.bound = false; > + this->data.is_xfb_per_vertex_output = false; > > if (type != NULL) { > if (type->is_interface()) > diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h > index f478b29a6b5..e09f053b77c 100644 > --- a/src/compiler/glsl/ir.h > +++ b/src/compiler/glsl/ir.h > @@ -766,6 +766,12 @@ public: > */ > unsigned is_xfb_only:1; > > + /** > + * Is this varying a TSC per-vertex output candidate for transform
TCS? > + * feedback? > + */ > + unsigned is_xfb_per_vertex_output:1; > + > /** > * Was a transfor feedback buffer set in the shader? ugh, not your problem, but "transform" :( > */ > diff --git a/src/compiler/glsl/link_uniforms.cpp > b/src/compiler/glsl/link_uniforms.cpp > index 63e688b19a7..547da68e216 100644 > --- a/src/compiler/glsl/link_uniforms.cpp > +++ b/src/compiler/glsl/link_uniforms.cpp > @@ -72,8 +72,10 @@ program_resource_visitor::process(ir_variable *var, bool > use_std430_as_default) > get_internal_ifc_packing(use_std430_as_default) : > var->type->get_internal_ifc_packing(use_std430_as_default); > > - const glsl_type *t = > - var->data.from_named_ifc_block ? var->get_interface_type() : var->type; > + const glsl_type *t = var->data.from_named_ifc_block ? > + (var->data.is_xfb_per_vertex_output ? > + var->get_interface_type()->without_array() : > + var->get_interface_type()) : var->type; > const glsl_type *t_without_array = t->without_array(); > > /* false is always passed for the row_major parameter to the other > diff --git a/src/compiler/glsl/link_varyings.cpp > b/src/compiler/glsl/link_varyings.cpp > index 52e493cb599..1964dcc0a22 100644 > --- a/src/compiler/glsl/link_varyings.cpp > +++ b/src/compiler/glsl/link_varyings.cpp > @@ -2150,7 +2150,10 @@ private: > tfeedback_candidate *candidate > = rzalloc(this->mem_ctx, tfeedback_candidate); > candidate->toplevel_var = this->toplevel_var; > - candidate->type = type; > + if (this->toplevel_var->data.is_xfb_per_vertex_output) > + candidate->type = type->without_array(); > + else > + candidate->type = type; > candidate->offset = this->varying_floats; > _mesa_hash_table_insert(this->tfeedback_candidates, > ralloc_strdup(this->mem_ctx, name), > @@ -2499,6 +2502,9 @@ assign_varying_locations(struct gl_context *ctx, > > if (num_tfeedback_decls > 0) { > tfeedback_candidate_generator g(mem_ctx, tfeedback_candidates); > + if (producer->Stage == MESA_SHADER_TESS_CTRL && > + !output_var->data.patch) > + output_var->data.is_xfb_per_vertex_output = true; > g.process(output_var); > } > > -- > 2.19.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev