mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-29 05:50:11 +01:00
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:
parent
cb31b5a958
commit
77eb58baad
7 changed files with 29 additions and 24 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue