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

Author: Boris Brezillon <boris.brezil...@collabora.com>
Date:   Tue May 11 12:21:52 2021 +0200

pan/bi: Add support for gl_DrawID

We simply pass the drawid as a sysval.

Signed-off-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>

---

 src/gallium/drivers/panfrost/pan_cmdstream.c | 3 +++
 src/gallium/drivers/panfrost/pan_context.c   | 2 ++
 src/gallium/drivers/panfrost/pan_context.h   | 1 +
 src/panfrost/bifrost/bifrost_compile.c       | 4 ++++
 src/panfrost/util/pan_ir.h                   | 1 +
 src/panfrost/util/pan_sysval.c               | 2 ++
 6 files changed, 13 insertions(+)

diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c 
b/src/gallium/drivers/panfrost/pan_cmdstream.c
index 930d37e7bfe..b7ed0442248 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -1092,6 +1092,9 @@ panfrost_upload_sysvals(struct panfrost_batch *batch,
                         uniforms[i].u[1] = batch->ctx->base_vertex;
                         uniforms[i].u[2] = batch->ctx->base_instance;
                         break;
+                case PAN_SYSVAL_DRAWID:
+                        uniforms[i].u[0] = batch->ctx->drawid;
+                        break;
                 default:
                         assert(0);
                 }
diff --git a/src/gallium/drivers/panfrost/pan_context.c 
b/src/gallium/drivers/panfrost/pan_context.c
index fe06b5adab4..04e9452ed4b 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -453,6 +453,7 @@ panfrost_direct_draw(struct panfrost_context *ctx,
         ctx->base_vertex = info->index_size ? draw->index_bias : 0;
         ctx->base_instance = info->start_instance;
         ctx->active_prim = info->mode;
+        ctx->drawid = drawid_offset;
 
         struct panfrost_ptr tiler =
                 pan_is_bifrost(device) ?
@@ -565,6 +566,7 @@ panfrost_indirect_draw(struct panfrost_context *ctx,
 
         assert(ctx->draw_modes & (1 << info->mode));
         ctx->active_prim = info->mode;
+        ctx->drawid = drawid_offset;
         ctx->indirect_draw = true;
 
         struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
diff --git a/src/gallium/drivers/panfrost/pan_context.h 
b/src/gallium/drivers/panfrost/pan_context.h
index b825b13c677..b7eb0b0d8ad 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -134,6 +134,7 @@ struct panfrost_context {
         struct panfrost_query *occlusion_query;
 
         bool indirect_draw;
+        unsigned drawid;
         unsigned vertex_count;
         unsigned instance_count;
         unsigned offset_start;
diff --git a/src/panfrost/bifrost/bifrost_compile.c 
b/src/panfrost/bifrost/bifrost_compile.c
index 98fd1d34f3e..d73987d9168 100644
--- a/src/panfrost/bifrost/bifrost_compile.c
+++ b/src/panfrost/bifrost/bifrost_compile.c
@@ -1166,6 +1166,10 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr 
*instr)
                 bi_load_sysval_nir(b, instr, 1, 8);
                 break;
 
+        case nir_intrinsic_load_draw_id:
+                bi_load_sysval_nir(b, instr, 1, 0);
+                break;
+
         case nir_intrinsic_get_ssbo_size:
                 bi_load_sysval_nir(b, instr, 1, 8);
                 break;
diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h
index 1d7df3cca68..dc8bb95ea90 100644
--- a/src/panfrost/util/pan_ir.h
+++ b/src/panfrost/util/pan_ir.h
@@ -57,6 +57,7 @@ enum {
         PAN_SYSVAL_MULTISAMPLED = 12,
         PAN_SYSVAL_RT_CONVERSION = 13,
         PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS = 14,
+        PAN_SYSVAL_DRAWID = 15,
 };
 
 #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 128183a1b0a..fd261a89d41 100644
--- a/src/panfrost/util/pan_sysval.c
+++ b/src/panfrost/util/pan_sysval.c
@@ -82,6 +82,8 @@ panfrost_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr)
         case nir_intrinsic_load_base_vertex:
         case nir_intrinsic_load_base_instance:
                 return PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS;
+        case nir_intrinsic_load_draw_id:
+                return PAN_SYSVAL_DRAWID;
         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