Module: Mesa
Branch: main
Commit: 69d81edaf8e502785a615e587ec2581cc540efa0
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=69d81edaf8e502785a615e587ec2581cc540efa0

Author: Alyssa Rosenzweig <aly...@collabora.com>
Date:   Thu Apr 22 19:35:56 2021 -0400

pan/bi: Add first_vertex to vertex ID

Apparently r61 is zero based.

Signed-off-by: Alyssa Rosenzweig <aly...@collabora.com>
Signed-off-by: Boris Brezillon <boris.brezil...@collabora.com>
Tested-by: Boris Brezillon <boris.brezil...@collabora.com>
Acked-by: Alyssa Rosenzweig <aly...@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10417>

---

 .../panfrost/ci/deqp-panfrost-g52-fails.txt        |  3 ---
 src/gallium/drivers/panfrost/pan_cmdstream.c       | 28 +++++++++++++++++++---
 src/gallium/drivers/panfrost/pan_context.c         |  5 ++++
 src/gallium/drivers/panfrost/pan_context.h         |  1 +
 src/panfrost/bifrost/bifrost_compile.c             |  6 ++++-
 src/panfrost/bifrost/bifrost_compile.h             |  1 +
 src/panfrost/lib/pan_indirect_draw.c               | 10 ++++++++
 src/panfrost/lib/pan_indirect_draw.h               |  1 +
 src/panfrost/util/pan_ir.h                         |  1 +
 src/panfrost/util/pan_sysval.c                     |  2 ++
 10 files changed, 51 insertions(+), 7 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
diff --git a/src/panfrost/bifrost/bifrost_compile.c 
b/src/panfrost/bifrost/bifrost_compile.c
index 6291549ea18..0045a8fdf6d 100644
--- a/src/panfrost/bifrost/bifrost_compile.c
+++ b/src/panfrost/bifrost/bifrost_compile.c
@@ -1154,6 +1154,10 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr 
*instr)
                 bi_load_sysval_nir(b, instr, 1, 0);
                 break;
 
+        case nir_intrinsic_load_first_vertex:
+                bi_load_sysval_nir(b, instr, 1, 0);
+                break;
+
         case nir_intrinsic_get_ssbo_size:
                 bi_load_sysval_nir(b, instr, 1, 8);
                 break;
@@ -1204,7 +1208,7 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr 
*instr)
                                 BI_VARYING_NAME_POINT, BI_VECSIZE_V2);
                 break;
 
-        case nir_intrinsic_load_vertex_id:
+        case nir_intrinsic_load_vertex_id_zero_base:
                 bi_mov_i32_to(b, dst, bi_register(61));
                 break;
 
diff --git a/src/panfrost/bifrost/bifrost_compile.h 
b/src/panfrost/bifrost/bifrost_compile.h
index d466b42d288..53cb19d7323 100644
--- a/src/panfrost/bifrost/bifrost_compile.h
+++ b/src/panfrost/bifrost/bifrost_compile.h
@@ -90,6 +90,7 @@ static const nir_shader_compiler_options bifrost_nir_options 
= {
         .lower_uniforms_to_ubo = true,
 
         .has_cs_global_id = true,
+        .vertex_id_zero_based = true,
         .lower_cs_local_index_from_id = true,
         .max_unroll_iterations = 32,
 };
diff --git a/src/panfrost/lib/pan_indirect_draw.c 
b/src/panfrost/lib/pan_indirect_draw.c
index d1a5b30c5a6..78a592098c4 100644
--- a/src/panfrost/lib/pan_indirect_draw.c
+++ b/src/panfrost/lib/pan_indirect_draw.c
@@ -72,6 +72,7 @@ struct jobs_data {
         nir_ssa_def *vertex_job;
         nir_ssa_def *tiler_job;
         nir_ssa_def *base_vertex_offset;
+        nir_ssa_def *first_vertex_sysval;
         nir_ssa_def *offset_start;
         nir_ssa_def *invocation;
 };
@@ -157,6 +158,8 @@ struct indirect_draw_inputs {
         /* index buffer */
         mali_ptr index_buf;
 
+        /* {base,first}_{vertex,instance} sysvals */
+        mali_ptr first_vertex_sysval;
         /* Pointers to various cmdstream structs that need to be patched */
         mali_ptr vertex_job;
         mali_ptr tiler_job;
@@ -314,6 +317,7 @@ extract_inputs(struct indirect_draw_shader_builder *builder)
         if (builder->index_min_max_search)
                 return;
 
+        builder->jobs.first_vertex_sysval = get_input_field(b, 
first_vertex_sysval);
         builder->jobs.vertex_job = get_input_field(b, vertex_job);
         builder->jobs.tiler_job = get_input_field(b, tiler_job);
         builder->attribs.attrib_bufs = get_input_field(b, attrib_bufs);
@@ -905,6 +909,11 @@ patch(struct indirect_draw_shader_builder *builder)
         update_varyings(builder);
         update_jobs(builder);
         update_vertex_attribs(builder);
+
+        IF (nir_ine(b, builder->jobs.first_vertex_sysval, nir_imm_int64(b, 
0))) {
+                store_global(b, builder->jobs.first_vertex_sysval,
+                             builder->jobs.offset_start, 1);
+        } ENDIF
 }
 
 /* Search the min/max index in the range covered by the indirect draw call */
@@ -1245,6 +1254,7 @@ panfrost_emit_indirect_draw(struct pan_pool *pool,
                 .draw_ctx = draw_ctx_ptr.gpu,
                 .draw_buf = draw_info->draw_buf,
                 .index_buf = draw_info->index_buf,
+                .first_vertex_sysval = draw_info->first_vertex_sysval,
                 .vertex_job = draw_info->vertex_job,
                 .tiler_job = draw_info->tiler_job,
                 .attrib_bufs = draw_info->attrib_bufs,
diff --git a/src/panfrost/lib/pan_indirect_draw.h 
b/src/panfrost/lib/pan_indirect_draw.h
index 28bcd535d0d..f20d10a03b5 100644
--- a/src/panfrost/lib/pan_indirect_draw.h
+++ b/src/panfrost/lib/pan_indirect_draw.h
@@ -31,6 +31,7 @@ struct pan_pool;
 struct pan_indirect_draw_info {
         mali_ptr draw_buf;
         mali_ptr index_buf;
+        mali_ptr first_vertex_sysval;
         mali_ptr vertex_job;
         mali_ptr tiler_job;
         mali_ptr attrib_bufs;
diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h
index 6460ca1c0c4..1d7df3cca68 100644
--- a/src/panfrost/util/pan_ir.h
+++ b/src/panfrost/util/pan_ir.h
@@ -56,6 +56,7 @@ enum {
         PAN_SYSVAL_SAMPLE_POSITIONS = 11,
         PAN_SYSVAL_MULTISAMPLED = 12,
         PAN_SYSVAL_RT_CONVERSION = 13,
+        PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS = 14,
 };
 
 #define PAN_TXS_SYSVAL_ID(texidx, dim, is_array)          \
diff --git a/src/panfrost/util/pan_sysval.c b/src/panfrost/util/pan_sysval.c
index f1e3daaff72..7d17cf0cb9d 100644
--- a/src/panfrost/util/pan_sysval.c
+++ b/src/panfrost/util/pan_sysval.c
@@ -78,6 +78,8 @@ panfrost_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr)
                 return PAN_SYSVAL_WORK_DIM;
         case nir_intrinsic_load_sample_positions_pan:
                 return PAN_SYSVAL_SAMPLE_POSITIONS;
+        case nir_intrinsic_load_first_vertex:
+                return PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS;
         case nir_intrinsic_load_ssbo_address: 
         case nir_intrinsic_get_ssbo_size: 
                 return panfrost_sysval_for_ssbo(instr);

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to