}
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)
{
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);
-
- 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);
+ nvk_mme_build_draw_loop(b, instance_count,
+ first_vertex, vertex_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);
}
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)
{
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);
-
- 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);
+ nvk_mme_build_draw_indexed_loop(b, instance_count,
+ first_index, 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);
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)
{
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);