libagx: fix ia_primitives with tessellation
fixes new CTS dEQP-VK.query_pool.statistics_query*input_assembly_primitives.*_patch_list_* Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33682>
This commit is contained in:
committed by
Marge Bot
parent
2eb5040ca8
commit
5046dd48b6
@@ -330,16 +330,30 @@ increment_counters(global uint32_t *a, global uint32_t *b, global uint32_t *c,
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned
|
||||
decomposed_prims_for_vertices_with_tess(enum mesa_prim prim, int vertices,
|
||||
unsigned verts_per_patch)
|
||||
{
|
||||
if (prim >= MESA_PRIM_PATCHES) {
|
||||
return vertices / verts_per_patch;
|
||||
} else {
|
||||
return u_decomposed_prims_for_vertices(prim, vertices);
|
||||
}
|
||||
}
|
||||
|
||||
KERNEL(1)
|
||||
libagx_increment_ia(global uint32_t *ia_vertices,
|
||||
global uint32_t *ia_primitives,
|
||||
global uint32_t *vs_invocations, global uint32_t *c_prims,
|
||||
global uint32_t *c_invs, constant uint32_t *draw,
|
||||
enum mesa_prim prim)
|
||||
enum mesa_prim prim, unsigned verts_per_patch)
|
||||
{
|
||||
increment_counters(ia_vertices, vs_invocations, NULL, draw[0] * draw[1]);
|
||||
|
||||
uint prims = u_decomposed_prims_for_vertices(prim, draw[0]) * draw[1];
|
||||
uint prims =
|
||||
decomposed_prims_for_vertices_with_tess(prim, draw[0], verts_per_patch) *
|
||||
draw[1];
|
||||
|
||||
increment_counters(ia_primitives, c_prims, c_invs, prims);
|
||||
}
|
||||
|
||||
@@ -351,7 +365,7 @@ libagx_increment_ia_restart(global uint32_t *ia_vertices,
|
||||
constant uint32_t *draw, uint64_t index_buffer,
|
||||
uint32_t index_buffer_range_el,
|
||||
uint32_t restart_index, uint32_t index_size_B,
|
||||
enum mesa_prim prim)
|
||||
enum mesa_prim prim, unsigned verts_per_patch)
|
||||
{
|
||||
uint tid = cl_global_id.x;
|
||||
unsigned count = draw[0];
|
||||
@@ -389,15 +403,15 @@ libagx_increment_ia_restart(global uint32_t *ia_vertices,
|
||||
index_size_B);
|
||||
|
||||
if (index == restart_index) {
|
||||
accum +=
|
||||
u_decomposed_prims_for_vertices(prim, i - last_restart - 1);
|
||||
accum += decomposed_prims_for_vertices_with_tess(
|
||||
prim, i - last_restart - 1, verts_per_patch);
|
||||
last_restart = i;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
accum +=
|
||||
u_decomposed_prims_for_vertices(prim, count - last_restart - 1);
|
||||
accum += decomposed_prims_for_vertices_with_tess(
|
||||
prim, count - last_restart - 1, verts_per_patch);
|
||||
}
|
||||
|
||||
increment_counters(ia_primitives, c_prims, c_invs, accum * draw[1]);
|
||||
|
||||
@@ -3343,6 +3343,8 @@ hk_ia_update(struct hk_cmd_buffer *cmd, struct agx_draw draw,
|
||||
c_inv = 0;
|
||||
}
|
||||
|
||||
uint32_t patch_size = dyn->ts.patch_control_points;
|
||||
|
||||
if (draw.restart) {
|
||||
uint32_t index_size_B = agx_index_size_to_B(draw.index_size);
|
||||
|
||||
@@ -3350,11 +3352,11 @@ hk_ia_update(struct hk_cmd_buffer *cmd, struct agx_draw draw,
|
||||
cmd, agx_1d(1024), AGX_BARRIER_ALL | AGX_PREGFX, ia_vertices, ia_prims,
|
||||
vs_invocations, c_prims, c_inv, draw_ptr, draw.index_buffer,
|
||||
agx_draw_index_range_el(draw), cmd->state.gfx.index.restart,
|
||||
index_size_B, prim);
|
||||
index_size_B, prim, patch_size);
|
||||
} else {
|
||||
libagx_increment_ia(cmd, agx_1d(1), AGX_BARRIER_ALL | AGX_PREGFX,
|
||||
ia_vertices, ia_prims, vs_invocations, c_prims, c_inv,
|
||||
draw_ptr, prim);
|
||||
draw_ptr, prim, patch_size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3936,16 +3936,17 @@ agx_ia_update(struct agx_batch *batch, const struct pipe_draw_info *info,
|
||||
if (info->primitive_restart) {
|
||||
perf_debug(dev, "Input assembly counters with primitive restart");
|
||||
|
||||
libagx_increment_ia_restart(
|
||||
batch, agx_1d(1024), AGX_BARRIER_ALL, ia_vertices, ia_primitives,
|
||||
vs_invocations, c_prims, c_invs, draw, ib, ib_range_el,
|
||||
info->restart_index, info->index_size, info->mode);
|
||||
libagx_increment_ia_restart(batch, agx_1d(1024), AGX_BARRIER_ALL,
|
||||
ia_vertices, ia_primitives, vs_invocations,
|
||||
c_prims, c_invs, draw, ib, ib_range_el,
|
||||
info->restart_index, info->index_size,
|
||||
info->mode, ctx->patch_vertices);
|
||||
} else {
|
||||
perf_debug(dev, "Input assembly counters");
|
||||
|
||||
libagx_increment_ia(batch, agx_1d(1), AGX_BARRIER_ALL, ia_vertices,
|
||||
ia_primitives, vs_invocations, c_prims, c_invs, draw,
|
||||
info->mode);
|
||||
info->mode, ctx->patch_vertices);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user