swr: fix handling draw info
authorMarek Olšák <marek.olsak@amd.com>
Sun, 22 Nov 2020 07:01:18 +0000 (02:01 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 5 Jan 2021 00:22:33 +0000 (19:22 -0500)
index_bias is undefined if index_size == 0.
index bounds are undefined if index_bounds_valid == false.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7679>

src/gallium/drivers/swr/swr_draw.cpp
src/gallium/drivers/swr/swr_state.cpp

index 63ef2f5..02638d2 100644 (file)
@@ -147,7 +147,7 @@ swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
    else
       velems->fsState.cutIndex = 0;
    velems->fsState.bEnableCutIndex = info->primitive_restart;
-   velems->fsState.bPartialVertexBuffer = (info->min_index > 0);
+   velems->fsState.bPartialVertexBuffer = (info->index_bounds_valid && info->min_index > 0);
 
    swr_jit_fetch_key key;
    swr_generate_fetch_key(key, velems);
index 2d08c65..2829e31 100644 (file)
@@ -1116,8 +1116,8 @@ swr_user_vbuf_range(const struct pipe_draw_info *info,
       *size = elems * elem_pitch;
    } else if (vb->stride) {
       elems = info->max_index - info->min_index + 1;
-      *totelems = (info->max_index + info->index_bias) + 1;
-      *base = (info->min_index + info->index_bias) * vb->stride;
+      *totelems = (info->max_index + (info->index_size ? info->index_bias : 0)) + 1;
+      *base = (info->min_index + (info->index_size ? info->index_bias : 0)) * vb->stride;
       *size = elems * elem_pitch;
    } else {
       *totelems = 1;
@@ -1423,7 +1423,7 @@ swr_update_derived(struct pipe_context *pipe,
             uint32_t base;
             swr_user_vbuf_range(&info, ctx->velems, vb, i, &elems, &base, &size);
             partial_inbounds = 0;
-            min_vertex_index = info.min_index + info.index_bias;
+            min_vertex_index = info.min_index + (info.index_size ? info.index_bias : 0);
 
             size = AlignUp(size, 4);
             /* If size of client memory copy is too large, don't copy. The