[Mesa-stable] [PATCH] i965/bdw: Fix 3DSTATE_VF_INSTANCING when the edge flag is used

Chris Forbes chrisf at ijw.co.nz
Fri Jul 10 16:15:45 PDT 2015


Surely the *right* thing would be to have the correct order expressed
in brw->vb.*, instead so you don't have this workaround in multiple
places.

As a minimal fix for stable though, this seems OK, so -

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



On Sat, Jul 11, 2015 at 5:04 AM, Neil Roberts <neil at linux.intel.com> wrote:
> When the edge flag element is enabled then the elements are slightly
> reordered so that the edge flag is always the last one. This was
> confusing the code to upload the 3DSTATE_VF_INSTANCING state because
> that is uploaded with a separate loop which has an instruction for
> each element. The indices used in these instructions weren't taking
> into account the reordering so the state would be incorrect.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91292
> Cc: "10.6 10.5" <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/drivers/dri/i965/gen8_draw_upload.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/gen8_draw_upload.c b/src/mesa/drivers/dri/i965/gen8_draw_upload.c
> index 1af90ec..65b7625 100644
> --- a/src/mesa/drivers/dri/i965/gen8_draw_upload.c
> +++ b/src/mesa/drivers/dri/i965/gen8_draw_upload.c
> @@ -218,13 +218,24 @@ gen8_emit_vertices(struct brw_context *brw)
>     }
>     ADVANCE_BATCH();
>
> -   for (unsigned i = 0; i < brw->vb.nr_enabled; i++) {
> +   for (unsigned i = 0, j = 0; i < brw->vb.nr_enabled; i++) {
>        const struct brw_vertex_element *input = brw->vb.enabled[i];
>        const struct brw_vertex_buffer *buffer = &brw->vb.buffers[input->buffer];
> +      unsigned element_index;
> +
> +      /* The edge flag element is reordered to be the last one in the code
> +       * above so we need to compensate for that in the element indices used
> +       * below.
> +       */
> +      if (input == gen6_edgeflag_input)
> +         element_index = brw->vb.nr_enabled - 1;
> +      else
> +         element_index = j++;
>
>        BEGIN_BATCH(3);
>        OUT_BATCH(_3DSTATE_VF_INSTANCING << 16 | (3 - 2));
> -      OUT_BATCH(i | (buffer->step_rate ? GEN8_VF_INSTANCING_ENABLE : 0));
> +      OUT_BATCH(element_index |
> +                (buffer->step_rate ? GEN8_VF_INSTANCING_ENABLE : 0));
>        OUT_BATCH(buffer->step_rate);
>        ADVANCE_BATCH();
>     }
> --
> 1.9.3
>
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-stable


More information about the mesa-stable mailing list