pan/bi: Add support for gl_DrawID

We simply pass the drawid as a sysval.

Signed-off-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>
This commit is contained in:
Boris Brezillon 2021-05-11 12:21:52 +02:00 committed by Marge Bot
parent 7cc4c8c5e5
commit a5ba2e2045
6 changed files with 13 additions and 0 deletions

View file

@ -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);
}

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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) \

View file

@ -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);