nvk: Break the inner MME draw loop into a helper

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
Faith Ekstrand 2023-03-17 10:29:54 -05:00 committed by Marge Bot
parent 18c1977b65
commit df2f07a57c

View file

@ -1592,6 +1592,31 @@ nvk_mme_build_set_draw_params(struct mme_builder *b,
mme_emit(b, p->first_instance);
}
static void
nvk_mme_build_draw_loop(struct mme_builder *b,
struct mme_value instance_count,
struct mme_value first_vertex,
struct mme_value vertex_count)
{
struct mme_value begin = nvk_mme_load_scratch(b, DRAW_BEGIN);
mme_loop(b, instance_count) {
mme_mthd(b, NV9097_BEGIN);
mme_emit(b, begin);
mme_mthd(b, NV9097_SET_VERTEX_ARRAY_START);
mme_emit(b, first_vertex);
mme_emit(b, vertex_count);
mme_mthd(b, NV9097_END);
mme_emit(b, mme_zero());
mme_set_field_enum(b, begin, NV9097_BEGIN_INSTANCE_ID, SUBSEQUENT);
}
mme_free_reg(b, begin);
}
static void
nvk_mme_build_draw(struct mme_builder *b,
struct mme_value draw_idx)
@ -1614,28 +1639,10 @@ nvk_mme_build_draw(struct mme_builder *b,
if (b->devinfo->cls_eng3d < TURING_A)
nvk_mme_spill(b, DRAW_IDX, draw_idx);
struct mme_value begin = nvk_mme_load_scratch(b, DRAW_BEGIN);
nvk_mme_build_draw_loop(b, instance_count,
first_vertex, vertex_count);
mme_loop(b, instance_count) {
/* The loop count in consumed at the beginning of the loop so we can
* free it now and save ourselves a register.
*/
mme_free_reg(b, instance_count);
mme_mthd(b, NV9097_BEGIN);
mme_emit(b, begin);
mme_mthd(b, NV9097_SET_VERTEX_ARRAY_START);
mme_emit(b, first_vertex);
mme_emit(b, vertex_count);
mme_mthd(b, NV9097_END);
mme_emit(b, mme_zero());
mme_set_field_enum(b, begin, NV9097_BEGIN_INSTANCE_ID, SUBSEQUENT);
}
mme_free_reg(b, begin);
mme_free_reg(b, instance_count);
mme_free_reg(b, first_vertex);
mme_free_reg(b, vertex_count);
@ -1681,6 +1688,31 @@ nvk_CmdDraw(VkCommandBuffer commandBuffer,
P_INLINE_DATA(p, firstInstance);
}
static void
nvk_mme_build_draw_indexed_loop(struct mme_builder *b,
struct mme_value instance_count,
struct mme_value first_index,
struct mme_value index_count)
{
struct mme_value begin = nvk_mme_load_scratch(b, DRAW_BEGIN);
mme_loop(b, instance_count) {
mme_mthd(b, NV9097_BEGIN);
mme_emit(b, begin);
mme_mthd(b, NV9097_SET_INDEX_BUFFER_F);
mme_emit(b, first_index);
mme_emit(b, index_count);
mme_mthd(b, NV9097_END);
mme_emit(b, mme_zero());
mme_set_field_enum(b, begin, NV9097_BEGIN_INSTANCE_ID, SUBSEQUENT);
}
mme_free_reg(b, begin);
}
static void
nvk_mme_build_draw_indexed(struct mme_builder *b,
struct mme_value draw_idx)
@ -1706,28 +1738,10 @@ nvk_mme_build_draw_indexed(struct mme_builder *b,
if (b->devinfo->cls_eng3d < TURING_A)
nvk_mme_spill(b, DRAW_IDX, draw_idx);
struct mme_value begin = nvk_mme_load_scratch(b, DRAW_BEGIN);
nvk_mme_build_draw_indexed_loop(b, instance_count,
first_index, index_count);
mme_loop(b, instance_count) {
/* The loop count in consumed at the beginning of the loop so we can
* free it now and save ourselves a register.
*/
mme_free_reg(b, instance_count);
mme_mthd(b, NV9097_BEGIN);
mme_emit(b, begin);
mme_mthd(b, NV9097_SET_INDEX_BUFFER_F);
mme_emit(b, first_index);
mme_emit(b, index_count);
mme_mthd(b, NV9097_END);
mme_emit(b, mme_zero());
mme_set_field_enum(b, begin, NV9097_BEGIN_INSTANCE_ID, SUBSEQUENT);
}
mme_free_reg(b, begin);
mme_free_reg(b, instance_count);
mme_free_reg(b, first_index);
mme_free_reg(b, index_count);
@ -2163,6 +2177,29 @@ nvk_CmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer,
P_INLINE_DATA(p, stride);
}
static void
nvk_mme_xfb_draw_indirect_loop(struct mme_builder *b,
struct mme_value instance_count,
struct mme_value counter)
{
struct mme_value begin = nvk_mme_load_scratch(b, DRAW_BEGIN);
mme_loop(b, instance_count) {
mme_mthd(b, NV9097_BEGIN);
mme_emit(b, begin);
mme_mthd(b, NV9097_DRAW_AUTO);
mme_emit(b, counter);
mme_mthd(b, NV9097_END);
mme_emit(b, mme_zero());
mme_set_field_enum(b, begin, NV9097_BEGIN_INSTANCE_ID, SUBSEQUENT);
}
mme_free_reg(b, begin);
}
void
nvk_mme_xfb_draw_indirect(struct mme_builder *b)
{
@ -2186,20 +2223,7 @@ nvk_mme_xfb_draw_indirect(struct mme_builder *b)
mme_free_reg(b, first_instance);
struct mme_value begin = nvk_mme_load_scratch(b, DRAW_BEGIN);
mme_loop(b, instance_count) {
mme_mthd(b, NV9097_BEGIN);
mme_emit(b, begin);
mme_mthd(b, NV9097_DRAW_AUTO);
mme_emit(b, counter);
mme_mthd(b, NV9097_END);
mme_emit(b, mme_zero());
mme_set_field_enum(b, begin, NV9097_BEGIN_INSTANCE_ID, SUBSEQUENT);
}
nvk_mme_xfb_draw_indirect_loop(b, instance_count, counter);
mme_free_reg(b, instance_count);
mme_free_reg(b, counter);