draw: fix gl_PrimitiveID in tessellation

Acked-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33415>
This commit is contained in:
Aleksi Sapon 2025-02-05 14:13:30 -05:00 committed by Marge Bot
parent cb31b5a958
commit 77eb58baad
7 changed files with 29 additions and 24 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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