vbo: fix transitions from glVertexN to glVertexM where M < N
authorMarek Olšák <marek.olsak@amd.com>
Thu, 27 Feb 2020 21:04:00 +0000 (16:04 -0500)
committerMarge Bot <eric+marge@anholt.net>
Wed, 11 Mar 2020 18:45:28 +0000 (18:45 +0000)
Fixes: 1f6e53e2 "vbo: don't store glVertex values temporarily into exec"
Reviewed-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3591>

src/mesa/vbo/vbo_exec_api.c

index d97c4988b296a544b1d624a424da76b06f93bdc3..71c8f340702346c7aff7f5a2b1b41497c413ddf4 100644 (file)
@@ -493,8 +493,10 @@ do {                                                                    \
       ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;                    \
    } else {                                                             \
       /* This is a glVertex call */                                     \
+      int size = exec->vtx.attr[0].size;                                \
+                                                                        \
       /* Check if attribute size or type is changing. */                \
-      if (unlikely(exec->vtx.attr[0].size < N * sz ||                   \
+      if (unlikely(size < N * sz ||                                     \
                    exec->vtx.attr[0].type != T)) {                      \
          vbo_exec_wrap_upgrade_vertex(exec, 0, N * sz, T);              \
       }                                                                 \
@@ -514,6 +516,12 @@ do {                                                                    \
          if (N > 1) *dst++ = V1;                                        \
          if (N > 2) *dst++ = V2;                                        \
          if (N > 3) *dst++ = V3;                                        \
+                                                                        \
+         if (unlikely(N < size)) {                                      \
+            if (N < 2 && size >= 2) *dst++ = V1;                        \
+            if (N < 3 && size >= 3) *dst++ = V2;                        \
+            if (N < 4 && size >= 4) *dst++ = V3;                        \
+         }                                                              \
       } else {                                                          \
          /* 64 bits: dst can be unaligned, so copy each 4-byte word */  \
          /* separately */                                               \
@@ -521,6 +529,12 @@ do {                                                                    \
          if (N > 1) SET_64BIT(dst, V1);                                 \
          if (N > 2) SET_64BIT(dst, V2);                                 \
          if (N > 3) SET_64BIT(dst, V3);                                 \
+                                                                        \
+         if (unlikely(N * 2 < size)) {                                  \
+            if (N < 2 && size >= 4) SET_64BIT(dst, V1);                 \
+            if (N < 3 && size >= 6) SET_64BIT(dst, V2);                 \
+            if (N < 4 && size >= 8) SET_64BIT(dst, V3);                 \
+         }                                                              \
       }                                                                 \
                                                                         \
       /* dst now points at the beginning of the next vertex */          \