[Mesa-dev] [PATCH 3/3] intel/compiler: properly size attribute wa_flags array for Vulkan

Iago Toral itoral at igalia.com
Thu Aug 10 06:03:23 UTC 2017


On Wed, 2017-08-09 at 16:18 +0100, Lionel Landwerlin wrote:
> Acked-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> 
> I can see that it fixes the tests and it makes sense, but I'm failing
> to 
> see how gl_attrib_wa_flags ends up being set from anv :/

Sorry, I should've explained that. It is not really anv but the shared
compiler infrastructure that does this. From anv, the call chain is
this:

anv_pipeline_compile_vs -> brw_nir_lower_vs_inputs ->
brw_nir_apply_attribute_workarounds

brw_nir_lower_vs_inputs is the one that reads gl_attrib_wa_flags from
the brw_vs_prog_key state, which is eventually used used by
brw_nir_apply_attribute_workarounds (where the out-of-bounds accessed
happen without this patch).

Iago

> Thanks a lot!
> 
> On 21/07/17 09:26, Iago Toral Quiroga wrote:
> > Mesa will map user defined vertex input attributes to slots
> > starting at VERT_ATTRIB_GENERIC0 which gives us room for only 16
> > slots (up to GL_VERT_ATTRIB_MAX). This sufficient for GL, where
> > we expose exactly 16 vertex attributes for user defined inputs, but
> > in Vulkan we can expose up to 28 (which are also mapped from
> > VERT_ATTRIB_GENERIC0 onwards) so we need to account for this when
> > we scope the size of the array of attribute workaround flags
> > that is used during the brw_vertex_workarounds NIR pass. This
> > prevents out-of-bounds accesses in that array for NIR shaders
> > that use more than 16 vertex input attributes.
> > 
> > Fixes:
> > dEQP-VK.pipeline.vertex_input.max_attributes.*
> > ---
> > 
> > I considered other options for this too:
> > 
> > *  Increase the value of GL_VERT_ATTRIB_MAX, but that would affect
> > other drivers, including GL drivers that do not need to increase
> > this value. If we do this we should at least check that increasing
> > the value doesn't have unexpected consequences for drivers that
> > rely in GL_VERT_ATTRIB_MAX not being larger than what it currently
> > is.
> > 
> > * We could remap vulkan vertex attrib slots to start at 0 at some
> > point in the process... but I think that could be a source of
> > confusion, since from that point forward we shouldn't be using
> > shader enums to identify particular slots and there would also be
> > a mismatch between input bits in vs_prog_data->inputs_read
> > and actual slot positions which looks like an undesirable
> > situation.
> > 
> > * Since the brw_vertex_workarounds pass seems rather GL-specific at
> > the moment, we could let our compiler infrastructure know if we
> > are compiling a shader for Vulkan or GL APIs and use that info
> > to not run the pass for Vulkan shaders, however, there is a chance
> > that we need this pass in Vulkan in the future too (maybe with
> > Vulkan specific lowerings). There is actually a comment in
> > anv_pipipeline.c, function populate_vs_prog_key() suggesting this
> > possibility, so this solution would be invalid if that ever
> > happened.
> > 
> > Since all solutions have some kind of con I decided to go with the
> > less intrusive one for now.
> > 
> >   src/intel/compiler/brw_compiler.h | 18 +++++++++++++++++-
> >   1 file changed, 17 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/intel/compiler/brw_compiler.h
> > b/src/intel/compiler/brw_compiler.h
> > index bebd244736..41c0707003 100644
> > --- a/src/intel/compiler/brw_compiler.h
> > +++ b/src/intel/compiler/brw_compiler.h
> > @@ -188,6 +188,15 @@ struct brw_sampler_prog_key_data {
> >   #define BRW_ATTRIB_WA_SIGN          32  /* interpret as signed in
> > shader */
> >   #define BRW_ATTRIB_WA_SCALE         64  /* interpret as scaled in
> > shader */
> >   
> > +/**
> > + * OpenGL attribute slots fall in [0, VERT_ATTRIB_MAX - 1] with
> > the range
> > + * [VERT_ATTRIB_GENERIC0, VERT_ATTRIB_MAX - 1] reserved for up to
> > 16 user
> > + * input vertex attributes. In Vulkan, we expose up to 28 user
> > vertex input
> > + * attributes that are mapped to slots also starting at
> > VERT_ATTRIB_GENERIC0.
> > + */
> > +#define MAX_GL_VERT_ATTRIB     VERT_ATTRIB_MAX
> > +#define MAX_VK_VERT_ATTRIB     (VERT_ATTRIB_GENERIC0 + 28)
> > +
> >   /** The program key for Vertex Shaders. */
> >   struct brw_vs_prog_key {
> >      unsigned program_string_id;
> > @@ -196,8 +205,15 @@ struct brw_vs_prog_key {
> >       * Per-attribute workaround flags
> >       *
> >       * For each attribute, a combination of BRW_ATTRIB_WA_*.
> > +    *
> > +    * For OpenGL, where we expose a maximum of 16 user input
> > atttributes
> > +    * we only need up to VERT_ATTRIB_MAX slots, however, in Vulkan
> > +    * slots preceding VERT_ATTRIB_GENERIC0 are unused and we can
> > +    * expose up to 28 user input vertex attributes that are mapped
> > to slots
> > +    * starting at VERT_ATTRIB_GENERIC0, so this array need to be
> > large
> > +    * enough to hold this many slots.
> >       */
> > -   uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX];
> > +   uint8_t gl_attrib_wa_flags[MAX2(MAX_GL_VERT_ATTRIB,
> > MAX_VK_VERT_ATTRIB)];
> >   
> >      bool copy_edgeflag:1;
> >   
> 
> 
> 


More information about the mesa-dev mailing list