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;

With that fixed, this is:
Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>

Thanks for tracking this down and fixing it!

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to