[Mesa-dev] [PATCH] i965/gen8: Fix vertex attrib upload for dvec3/4 shader inputs

Antía Puentes apuentes at igalia.com
Tue Nov 1 08:27:53 UTC 2016


On lun, 2016-10-31 at 14:51 -0700, Kenneth Graunke wrote:
> On Monday, October 31, 2016 6:22:43 PM PDT Antia Puentes wrote:
> > 
> > The emission of vertex attributes corresponding to dvec3 and dvec4
> > vertex shader input variables was not correct when the <size>
> > passed
> > to the VertexAttribL* commands was <= 2.
> > 
> > This was because we were using the vertex array size when emitting
> > vertices
> > to decide if we uploaded a 64-bit floating point attribute as 1
> > slot (128-bits)
> > for sizes 1 and 2, or 2 slots (256-bits) for sizes 3 and 4. This
> > caused problems
> > when mapping the input variables to registers because, for deciding
> > which
> > registers contain the values uploaded for a certain variable, we
> > use the size
> > and type given to the variable in the shader, so we will be
> > assigning 256-bits
> > to dvec3/4 variables, even if we only uploaded 128-bits for them,
> > which happened
> > when the vertex array size was <= 2.
> > 
> > The patch uses the shader information to only emit as 128-bits
> > those 64-bit floating
> > point variables that were declared as double or dvec2 in the vertex
> > shader. Dvec3 and
> > dvec4 variables will be always uploaded as 256-bits, independently
> > of the <size> given
> > to the VertexAttribL* command.
> > 
> > From the ARB_vertex_attrib_64bit specification:
> > 
> >    "For the 64-bit double precision types listed in Table X.1, no
> > default
> >     attribute values are provided if the values of the vertex
> > attribute variable
> >     are specified with fewer components than required for the
> > attribute
> >     variable. For example, the fourth component of a variable of
> > type dvec4
> >     will be undefined if specified using VertexAttribL3dv or using
> > a vertex
> >     array specified with VertexAttribLPointer and a size of three."
> > 
> > We are filling these unspecified components with zeros, which
> > coincidentally is
> > also what the GL44-CTS.vertex_attrib_binding.basic-inputL-case1
> > expects.
> > 
> > Fixes: GL44-CTS.vertex_attrib_binding.basic-inputL-case1 test
> > 
> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97287
> > ---
> >  src/mesa/drivers/dri/i965/brw_compiler.h     |  1 +
> >  src/mesa/drivers/dri/i965/brw_context.h      |  2 +-
> >  src/mesa/drivers/dri/i965/brw_draw_upload.c  |  4 +++-
> >  src/mesa/drivers/dri/i965/brw_vs.c           |  1 +
> >  src/mesa/drivers/dri/i965/gen8_draw_upload.c | 35 ++++++++++++--
> > --------------
> >  5 files changed, 21 insertions(+), 22 deletions(-)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h
> > b/src/mesa/drivers/dri/i965/brw_compiler.h
> > index 819c7d6..c2400f9 100644
> > --- a/src/mesa/drivers/dri/i965/brw_compiler.h
> > +++ b/src/mesa/drivers/dri/i965/brw_compiler.h
> > @@ -641,6 +641,7 @@ struct brw_vs_prog_data {
> >     struct brw_vue_prog_data base;
> >  
> >     GLbitfield64 inputs_read;
> > +   GLbitfield64 double_inputs_read;
> >  
> >     unsigned nr_attributes;
> >     unsigned nr_attribute_slots;
> > diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> > b/src/mesa/drivers/dri/i965/brw_context.h
> > index 308ba99..310372a 100644
> > --- a/src/mesa/drivers/dri/i965/brw_context.h
> > +++ b/src/mesa/drivers/dri/i965/brw_context.h
> > @@ -535,7 +535,7 @@ struct brw_vertex_element {
> >     const struct gl_vertex_array *glarray;
> >  
> >     int buffer;
> > -
> > +   bool is_dual_slot;
> >     /** Offset of the first element within the buffer object */
> >     unsigned int offset;
> >  };
> > diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c
> > b/src/mesa/drivers/dri/i965/brw_draw_upload.c
> > index da13e7a..19c8065 100644
> > --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c
> > +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c
> > @@ -472,7 +472,9 @@ brw_prepare_vertices(struct brw_context *brw)
> >     while (vs_inputs) {
> >        GLuint index = ffsll(vs_inputs) - 1;
> >        struct brw_vertex_element *input = &brw->vb.inputs[index];
> > -
> > +      input->is_dual_slot =
> > +         (brw->gen >= 8 && _mesa_bitcount_64(vs_prog_data-
> > >double_inputs_read &
> > +                                             BITFIELD64_BIT(index)
> > ));
> Bitcount of a single bit?  Couldn't you do:
> 
>       input->is_dual_slot = brw->gen >= 8 &&
>          (vs_prog_data->double_inputs_read & BITFIELD64_BIT(index))
> != 0;

Will do. Thanks for the review!

> With that fixed, this is:
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> 
> Thanks for tracking this down and fixing it!


More information about the mesa-dev mailing list