[Mesa-dev] [PATCH] i965/vs: Fix matNxM vertex attributes where M != 4.

Chris Forbes chrisf at ijw.co.nz
Tue Jul 7 16:44:44 PDT 2015


Reviewed-by: Chris Forbes <chrisf at ijw.co.nz>

On Thu, Jul 2, 2015 at 8:08 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Matrix vertex attributes have their columns padded out to vec4s, which
> I was failing to account for.  Scalar NIR expects them to be packed,
> however.
>
> Cc: mesa-stable at lists.freedesktop.org
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)
>
> I still need to write proper Piglit tests for this.  We have basically a single
> test for matrix vertex attributes, and that's a mat4 (which worked).
>
> But I figure we probably shouldn't hold up the bugfix on that.
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index caf1300..37b1ed7 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -91,12 +91,19 @@ fs_visitor::nir_setup_inputs(nir_shader *shader)
>            * So, we need to copy from fs_reg(ATTR, var->location) to
>            * offset(nir_inputs, var->data.driver_location).
>            */
> -         unsigned components = var->type->without_array()->components();
> +         const glsl_type *const t = var->type->without_array();
> +         const unsigned components = t->components();
> +         const unsigned cols = t->matrix_columns;
> +         const unsigned elts = t->vector_elements;
>           unsigned array_length = var->type->is_array() ? var->type->length : 1;
>           for (unsigned i = 0; i < array_length; i++) {
> -            for (unsigned j = 0; j < components; j++) {
> -               bld.MOV(retype(offset(input, bld, components * i + j), type),
> -                       offset(fs_reg(ATTR, var->data.location + i, type), bld, j));
> +            for (unsigned j = 0; j < cols; j++) {
> +               for (unsigned k = 0; k < elts; k++) {
> +                  bld.MOV(offset(retype(input, type), bld,
> +                                 components * i + elts * j + k),
> +                          offset(fs_reg(ATTR, var->data.location + i, type),
> +                                 bld, 4 * j + k));
> +               }
>              }
>           }
>           break;
> --
> 2.4.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list