aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2020-02-27 16:04:00 -0500
committerMarge Bot <[email protected]>2020-03-11 18:45:28 +0000
commit218dfd8c1a50515105199704d7060ae1b0d3b101 (patch)
treeacdb589ec2f4ddb7a87aa04158d75760c8660646 /src
parentec7d48afc40343bf314d28a7276500efb1e52361 (diff)
vbo: fix transitions from glVertexN to glVertexM where M < N
Fixes: 1f6e53e2 "vbo: don't store glVertex values temporarily into exec" Reviewed-by: Mathias Fröhlich <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3591>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/vbo/vbo_exec_api.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
index d97c4988b29..71c8f340702 100644
--- a/src/mesa/vbo/vbo_exec_api.c
+++ b/src/mesa/vbo/vbo_exec_api.c
@@ -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 */ \