Mesa (master): vbo: Fix handling of POS/GENERIC0 attributes.

Mathias Fröhlich frohlich at kemper.freedesktop.org
Wed Jul 27 04:45:25 UTC 2016


Module: Mesa
Branch: master
Commit: 2060f19b4f7331299e597beee42be4c987b58762
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2060f19b4f7331299e597beee42be4c987b58762

Author: Mathias Fröhlich <mathias.froehlich at web.de>
Date:   Fri Jul 22 10:58:58 2016 +0200

vbo: Fix handling of POS/GENERIC0 attributes.

In case of split primitives we need to restore
the original setting of the vtx.attrsz array to make
immediate mode attribute array tracking work.

v2: Use bool instead of boolean.

Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
Reviewed-by: Brian Paul <brianp at vmware.com>
Tested-by: Brian Paul <brianp at vmware.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96950

---

 src/mesa/vbo/vbo_exec_draw.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
index 0ef3081..6061ca0 100644
--- a/src/mesa/vbo/vbo_exec_draw.c
+++ b/src/mesa/vbo/vbo_exec_draw.c
@@ -25,6 +25,7 @@
  *    Keith Whitwell <keithw at vmware.com>
  */
 
+#include <stdbool.h>
 #include <stdio.h>
 #include "main/glheader.h"
 #include "main/bufferobj.h"
@@ -177,6 +178,7 @@ vbo_exec_bind_arrays( struct gl_context *ctx )
    const GLuint *map;
    GLuint attr;
    GLbitfield64 varying_inputs = 0x0;
+   bool swap_pos = false;
 
    /* Install the default (ie Current) attributes first, then overlay
     * all active ones.
@@ -207,15 +209,16 @@ vbo_exec_bind_arrays( struct gl_context *ctx )
       /* check if VERT_ATTRIB_POS is not read but VERT_BIT_GENERIC0 is read.
        * In that case we effectively need to route the data from
        * glVertexAttrib(0, val) calls to feed into the GENERIC0 input.
+       * The original state gets essentially restored below.
        */
       if ((ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_POS) == 0 &&
           (ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_GENERIC0)) {
+         swap_pos = true;
          exec->vtx.inputs[VERT_ATTRIB_GENERIC0] = exec->vtx.inputs[0];
          exec->vtx.attrsz[VERT_ATTRIB_GENERIC0] = exec->vtx.attrsz[0];
+         exec->vtx.attrtype[VERT_ATTRIB_GENERIC0] = exec->vtx.attrtype[0];
          exec->vtx.attrptr[VERT_ATTRIB_GENERIC0] = exec->vtx.attrptr[0];
-         vbo_reset_attr(exec, VERT_ATTRIB_POS);
-         exec->vtx.enabled &= (~BITFIELD64_BIT(VBO_ATTRIB_POS));
-         exec->vtx.enabled |= BITFIELD64_BIT(VBO_ATTRIB_GENERIC0);
+         exec->vtx.attrsz[0] = 0;
       }
       break;
    default:
@@ -262,6 +265,16 @@ vbo_exec_bind_arrays( struct gl_context *ctx )
       }
    }
 
+   /* In case we swapped the position and generic0 attribute.
+    * Restore the original setting of the vtx.* variables.
+    * They are still needed with the original order and settings in case
+    * of a split primitive.
+    */
+   if (swap_pos) {
+      exec->vtx.attrsz[0] = exec->vtx.attrsz[VERT_ATTRIB_GENERIC0];
+      exec->vtx.attrsz[VERT_ATTRIB_GENERIC0] = 0;
+   }
+
    _mesa_set_varying_vp_inputs( ctx, varying_inputs );
    ctx->NewDriverState |= ctx->DriverFlags.NewArray;
 }




More information about the mesa-commit mailing list