summaryrefslogtreecommitdiff
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <alyssa@collabora.com>2021-04-22 19:35:56 -0400
committerMarge Bot <eric+marge@anholt.net>2021-05-12 07:03:51 +0000
commit69d81edaf8e502785a615e587ec2581cc540efa0 (patch)
tree704d9e5d5f1a19c9a348ba5c12a735c85952ccfe /src/gallium/drivers
parent0e74598e3658237ab817db204fc7b008d16b92be (diff)
pan/bi: Add first_vertex to vertex ID
Apparently r61 is zero based. Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Tested-by: Boris Brezillon <boris.brezillon@collabora.com> Acked-by: Alyssa Rosenzweig <alyssa@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10417>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt3
-rw-r--r--src/gallium/drivers/panfrost/pan_cmdstream.c28
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c5
-rw-r--r--src/gallium/drivers/panfrost/pan_context.h1
4 files changed, 31 insertions, 6 deletions
diff --git a/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt b/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt
index c1eef27fcfa..b07f00796bd 100644
--- a/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt
+++ b/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt
@@ -1,6 +1,3 @@
-dEQP-GLES31.functional.draw_base_vertex.draw_elements_base_vertex.builtin_variable.vertex_id,Fail
-dEQP-GLES31.functional.draw_base_vertex.draw_elements_instanced_base_vertex.builtin_variable.vertex_id,Fail
-dEQP-GLES31.functional.draw_base_vertex.draw_range_elements_base_vertex.builtin_variable.vertex_id,Fail
dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.10,Fail
dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.11,Fail
dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.13,Fail
diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c
index 973536aad4e..1d5a4a6e4ca 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -1080,6 +1080,12 @@ panfrost_upload_sysvals(struct panfrost_batch *batch,
panfrost_upload_rt_conversion_sysval(batch,
PAN_SYSVAL_ID(sysval), &uniforms[i]);
break;
+ case PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS:
+ batch->ctx->first_vertex_sysval_ptr =
+ ptr->gpu + (i * sizeof(*uniforms));
+
+ uniforms[i].u[0] = batch->ctx->offset_start;
+ break;
default:
assert(0);
}
@@ -1184,11 +1190,27 @@ panfrost_emit_const_buf(struct panfrost_batch *batch,
if (src.ubo == sysval_ubo) {
unsigned sysval_idx = src.offset / 16;
+ unsigned sysval_comp = (src.offset % 16) / 4;
unsigned sysval_type = PAN_SYSVAL_TYPE(ss->info.sysvals.sysvals[sysval_idx]);
- if (sysval_type == PAN_SYSVAL_NUM_WORK_GROUPS) {
- unsigned word = (src.offset % 16) / 4;
+ mali_ptr ptr = push_transfer.gpu + (4 * i);
+
+ switch (sysval_type) {
+ case PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS:
+ switch (sysval_comp) {
+ case 0:
+ batch->ctx->first_vertex_sysval_ptr = ptr;
+ break;
+ default:
+ unreachable("Invalid vertex/instance offset component\n");
+ }
+ break;
+
+ case PAN_SYSVAL_NUM_WORK_GROUPS:
+ batch->num_wg_sysval[sysval_comp] = ptr;
+ break;
- batch->num_wg_sysval[word] = push_transfer.gpu + (4 * i);
+ default:
+ break;
}
}
/* Map the UBO, this should be cheap. However this is reading
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index e7683c7e728..98cf726aa09 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -609,6 +609,10 @@ panfrost_indirect_draw(struct panfrost_context *ctx,
ctx->instance_count = ctx->vertex_count = ctx->padded_count = 0;
ctx->offset_start = 0;
+ /* Set the {first,base}_vertex sysvals to NULL. Will be updated if the
+ * vertex shader uses gl_VertexID or gl_BaseVertex.
+ */
+ ctx->first_vertex_sysval_ptr = 0;
bool point_coord_replace = (info->mode == PIPE_PRIM_POINTS);
panfrost_emit_varying_descriptor(batch, 0,
@@ -655,6 +659,7 @@ panfrost_indirect_draw(struct panfrost_context *ctx,
.last_indirect_draw = batch->indirect_draw_job_id,
.draw_buf = draw_buf->image.data.bo->ptr.gpu + indirect->offset,
.index_buf = index_buf ? index_buf->ptr.gpu : 0,
+ .first_vertex_sysval = ctx->first_vertex_sysval_ptr,
.vertex_job = vertex.gpu,
.tiler_job = tiler.gpu,
.attrib_bufs = attrib_bufs,
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index 005950ebca2..de2ac6cc7b6 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -137,6 +137,7 @@ struct panfrost_context {
unsigned vertex_count;
unsigned instance_count;
unsigned offset_start;
+ mali_ptr first_vertex_sysval_ptr;
enum pipe_prim_type active_prim;
/* If instancing is enabled, vertex count padded for instance; if