From 77eb58baad5dac8e6516eff6e5da9b0d435ad2a6 Mon Sep 17 00:00:00 2001 From: Aleksi Sapon Date: Wed, 5 Feb 2025 14:13:30 -0500 Subject: [PATCH] draw: fix gl_PrimitiveID in tessellation Acked-by: Konstantin Seurer Reviewed-by: Dave Airlie Part-of: --- src/gallium/auxiliary/draw/draw_pt.h | 1 + .../auxiliary/draw/draw_pt_fetch_shade_emit.c | 1 + .../draw/draw_pt_fetch_shade_pipeline.c | 9 ++++---- .../draw/draw_pt_fetch_shade_pipeline_llvm.c | 9 ++++---- src/gallium/auxiliary/draw/draw_pt_vsplit.c | 4 ++-- .../auxiliary/draw/draw_pt_vsplit_tmp.h | 6 ++--- src/gallium/auxiliary/draw/draw_tess.c | 23 ++++++++++--------- 7 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_pt.h b/src/gallium/auxiliary/draw/draw_pt.h index 57fb8ad4396..d986a17ae01 100644 --- a/src/gallium/auxiliary/draw/draw_pt.h +++ b/src/gallium/auxiliary/draw/draw_pt.h @@ -101,6 +101,7 @@ struct draw_pt_middle_end { void (*bind_parameters)(struct draw_pt_middle_end *); void (*run)(struct draw_pt_middle_end *, + unsigned start, const unsigned *fetch_elts, unsigned fetch_count, const uint16_t *draw_elts, diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c index 0dd62425101..1320adc1736 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c @@ -242,6 +242,7 @@ fail: static void fse_run(struct draw_pt_middle_end *middle, + unsigned start, const unsigned *fetch_elts, unsigned fetch_count, const uint16_t *draw_elts, diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c index 535a27518fb..a928164b880 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c @@ -377,6 +377,7 @@ prim_type(unsigned prim, unsigned flags) static void fetch_pipeline_run(struct draw_pt_middle_end *middle, + unsigned start, const unsigned *fetch_elts, unsigned fetch_count, const uint16_t *draw_elts, @@ -388,12 +389,12 @@ fetch_pipeline_run(struct draw_pt_middle_end *middle, struct draw_prim_info prim_info; fetch_info.linear = false; - fetch_info.start = 0; + fetch_info.start = start; fetch_info.elts = fetch_elts; fetch_info.count = fetch_count; prim_info.linear = false; - prim_info.start = 0; + prim_info.start = start - fpme->draw->start_index; prim_info.count = draw_count; prim_info.elts = draw_elts; prim_info.prim = prim_type(fpme->input_prim, prim_flags); @@ -421,7 +422,7 @@ fetch_pipeline_linear_run(struct draw_pt_middle_end *middle, fetch_info.elts = NULL; prim_info.linear = true; - prim_info.start = 0; + prim_info.start = start - fpme->draw->start_index; prim_info.count = count; prim_info.elts = NULL; prim_info.prim = prim_type(fpme->input_prim, prim_flags); @@ -451,7 +452,7 @@ fetch_pipeline_linear_run_elts(struct draw_pt_middle_end *middle, fetch_info.elts = NULL; prim_info.linear = false; - prim_info.start = 0; + prim_info.start = start - fpme->draw->start_index; prim_info.count = draw_count; prim_info.elts = draw_elts; prim_info.prim = prim_type(fpme->input_prim, prim_flags); diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c index e4c681f7817..ec77c757dfc 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c @@ -753,6 +753,7 @@ prim_type(enum mesa_prim prim, unsigned flags) static void llvm_middle_end_run(struct draw_pt_middle_end *middle, + unsigned start, const unsigned *fetch_elts, unsigned fetch_count, const uint16_t *draw_elts, @@ -764,12 +765,12 @@ llvm_middle_end_run(struct draw_pt_middle_end *middle, struct draw_prim_info prim_info; fetch_info.linear = false; - fetch_info.start = 0; + fetch_info.start = start; fetch_info.elts = fetch_elts; fetch_info.count = fetch_count; prim_info.linear = false; - prim_info.start = 0; + prim_info.start = start - fpme->draw->start_index; prim_info.count = draw_count; prim_info.elts = draw_elts; prim_info.prim = prim_type(fpme->input_prim, prim_flags); @@ -797,7 +798,7 @@ llvm_middle_end_linear_run(struct draw_pt_middle_end *middle, fetch_info.elts = NULL; prim_info.linear = true; - prim_info.start = start; + prim_info.start = start - fpme->draw->start_index; prim_info.count = count; prim_info.elts = NULL; prim_info.prim = prim_type(fpme->input_prim, prim_flags); @@ -827,7 +828,7 @@ llvm_middle_end_linear_run_elts(struct draw_pt_middle_end *middle, fetch_info.elts = NULL; prim_info.linear = false; - prim_info.start = 0; + prim_info.start = start - fpme->draw->start_index; prim_info.count = draw_count; prim_info.elts = draw_elts; prim_info.prim = prim_type(fpme->input_prim, prim_flags); diff --git a/src/gallium/auxiliary/draw/draw_pt_vsplit.c b/src/gallium/auxiliary/draw/draw_pt_vsplit.c index 45a9f1573f5..3d17e53bb3b 100644 --- a/src/gallium/auxiliary/draw/draw_pt_vsplit.c +++ b/src/gallium/auxiliary/draw/draw_pt_vsplit.c @@ -75,9 +75,9 @@ vsplit_clear_cache(struct vsplit_frontend *vsplit) static void -vsplit_flush_cache(struct vsplit_frontend *vsplit, unsigned flags) +vsplit_flush_cache(struct vsplit_frontend *vsplit, unsigned start, unsigned flags) { - vsplit->middle->run(vsplit->middle, + vsplit->middle->run(vsplit->middle, start, vsplit->fetch_elts, vsplit->cache.num_fetch_elts, vsplit->draw_elts, vsplit->cache.num_draw_elts, flags); } diff --git a/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h b/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h index 5440a2e1c4f..09a7d6cc730 100644 --- a/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h +++ b/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h @@ -160,7 +160,7 @@ CONCAT2(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit, ADD_CACHE(vsplit, ib, 0, iclose, ibias); } - vsplit_flush_cache(vsplit, flags); + vsplit_flush_cache(vsplit, istart, flags); } @@ -241,7 +241,7 @@ vsplit_segment_loop_linear(struct vsplit_frontend *vsplit, unsigned flags, vsplit->fetch_elts[nr] = istart + nr; vsplit->fetch_elts[nr++] = i0; - vsplit->middle->run(vsplit->middle, vsplit->fetch_elts, nr, + vsplit->middle->run(vsplit->middle, istart, vsplit->fetch_elts, nr, vsplit->identity_draw_elts, nr, flags); } else { vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); @@ -264,7 +264,7 @@ vsplit_segment_fan_linear(struct vsplit_frontend *vsplit, unsigned flags, for (unsigned i = 1 ; i < icount; i++) vsplit->fetch_elts[nr++] = istart + i; - vsplit->middle->run(vsplit->middle, vsplit->fetch_elts, nr, + vsplit->middle->run(vsplit->middle, istart, vsplit->fetch_elts, nr, vsplit->identity_draw_elts, nr, flags); } else { vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); diff --git a/src/gallium/auxiliary/draw/draw_tess.c b/src/gallium/auxiliary/draw/draw_tess.c index fe9f32c0e0b..8a03059ee0e 100644 --- a/src/gallium/auxiliary/draw/draw_tess.c +++ b/src/gallium/auxiliary/draw/draw_tess.c @@ -156,16 +156,16 @@ llvm_tcs_run(struct draw_tess_ctrl_shader *shader, uint32_t prim_id) */ int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader, const struct draw_vertex_info *input_verts, - const struct draw_prim_info *input_prim, + const struct draw_prim_info *input_prims, const struct tgsi_shader_info *input_info, struct draw_vertex_info *output_verts, - struct draw_prim_info *output_prims ) + struct draw_prim_info *output_prims) { const float (*input)[4] = (const float (*)[4])input_verts->verts->data; unsigned num_outputs = draw_total_tcs_outputs(shader->draw); unsigned input_stride = input_verts->vertex_size; unsigned vertex_size = sizeof(struct vertex_header) + num_outputs * 4 * sizeof(float); - unsigned num_patches = input_prim->count / shader->draw->pt.vertices_per_patch; + unsigned num_patches = input_prims->count / shader->draw->pt.vertices_per_patch; output_verts->vertex_size = vertex_size; output_verts->stride = output_verts->vertex_size; @@ -176,7 +176,7 @@ int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader, shader->input_info = input_info; output_prims->linear = true; - output_prims->start = 0; + output_prims->start = input_prims->start; output_prims->elts = NULL; output_prims->count = 0; output_prims->prim = MESA_PRIM_PATCHES; @@ -188,13 +188,13 @@ int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader, shader->draw->statistics.hs_invocations += num_patches; } #if DRAW_LLVM_AVAILABLE - unsigned first_patch = input_prim->start / shader->draw->pt.vertices_per_patch; + unsigned first_patch = input_prims->start / shader->draw->pt.vertices_per_patch; for (unsigned i = 0; i < num_patches; i++) { uint32_t vert_start = output_verts->count; output_verts->count += shader->vertices_out; - llvm_fetch_tcs_input(shader, input_prim, i, shader->draw->pt.vertices_per_patch); + llvm_fetch_tcs_input(shader, input_prims, i, shader->draw->pt.vertices_per_patch); llvm_tcs_run(shader, first_patch + i); @@ -321,7 +321,7 @@ llvm_tes_run(struct draw_tess_eval_shader *shader, int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader, unsigned num_input_vertices_per_patch, const struct draw_vertex_info *input_verts, - const struct draw_prim_info *input_prim, + const struct draw_prim_info *input_prims, const struct tgsi_shader_info *input_info, struct draw_vertex_info *output_verts, struct draw_prim_info *output_prims, @@ -348,7 +348,7 @@ int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader, output_prims->primitive_count = 0; if (patch_lengths) { - *patch_lengths = MALLOC(input_prim->primitive_count * sizeof(uint32_t)); + *patch_lengths = MALLOC(input_prims->primitive_count * sizeof(uint32_t)); } shader->input = input; @@ -362,7 +362,8 @@ int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader, shader->spacing, !shader->vertex_order_cw, shader->point_mode); - for (unsigned i = 0; i < input_prim->primitive_count; i++) { + unsigned first_patch = input_prims->start / shader->draw->pt.vertices_per_patch; + for (unsigned i = 0; i < input_prims->primitive_count; i++) { uint32_t vert_start = output_verts->count; uint32_t prim_start = output_prims->primitive_count; uint32_t elt_start = output_prims->count; @@ -390,11 +391,11 @@ int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader, for (uint32_t i = 0; i < data.num_indices; i++) elts[elt_start + i] = vert_start + data.indices[i]; - llvm_fetch_tes_input(shader, input_prim, i, num_input_vertices_per_patch); + llvm_fetch_tes_input(shader, input_prims, i, num_input_vertices_per_patch); /* run once per primitive? */ char *output = (char *)output_verts->verts; output += vert_start * vertex_size; - llvm_tes_run(shader, i, num_input_vertices_per_patch, &data, &factors, (struct vertex_header *)output); + llvm_tes_run(shader, first_patch + i, num_input_vertices_per_patch, &data, &factors, (struct vertex_header *)output); if (shader->draw->collect_statistics) { shader->draw->statistics.ds_invocations += data.num_domain_points;