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