summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/radeonsi/si_commands.c22
-rw-r--r--src/gallium/drivers/radeonsi/si_state.h5
-rw-r--r--src/gallium/drivers/radeonsi/si_state_draw.c22
3 files changed, 35 insertions, 14 deletions
diff --git a/src/gallium/drivers/radeonsi/si_commands.c b/src/gallium/drivers/radeonsi/si_commands.c
index 5215a342f41..8dcf5d3341b 100644
--- a/src/gallium/drivers/radeonsi/si_commands.c
+++ b/src/gallium/drivers/radeonsi/si_commands.c
@@ -36,6 +36,28 @@ void si_cmd_context_control(struct si_pm4_state *pm4)
si_pm4_cmd_end(pm4, false);
}
+void si_cmd_draw_index_2(struct si_pm4_state *pm4, uint32_t max_size,
+ uint64_t index_base, uint32_t index_count,
+ uint32_t initiator, bool predicate)
+{
+ si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_2);
+ si_pm4_cmd_add(pm4, max_size);
+ si_pm4_cmd_add(pm4, index_base);
+ si_pm4_cmd_add(pm4, (index_base >> 32UL) & 0xFF);
+ si_pm4_cmd_add(pm4, index_count);
+ si_pm4_cmd_add(pm4, initiator);
+ si_pm4_cmd_end(pm4, predicate);
+}
+
+void si_cmd_draw_index_auto(struct si_pm4_state *pm4, uint32_t count,
+ uint32_t initiator, bool predicate)
+{
+ si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_AUTO);
+ si_pm4_cmd_add(pm4, count);
+ si_pm4_cmd_add(pm4, initiator);
+ si_pm4_cmd_end(pm4, predicate);
+}
+
void si_cmd_surface_sync(struct si_pm4_state *pm4, uint32_t cp_coher_cntl)
{
si_pm4_cmd_begin(pm4, PKT3_SURFACE_SYNC);
diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h
index 5e945ec25e0..4231c841b93 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -160,6 +160,11 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo);
/* si_commands.c */
void si_cmd_context_control(struct si_pm4_state *pm4);
+void si_cmd_draw_index_2(struct si_pm4_state *pm4, uint32_t max_size,
+ uint64_t index_base, uint32_t index_count,
+ uint32_t initiator, bool predicate);
+void si_cmd_draw_index_auto(struct si_pm4_state *pm4, uint32_t count,
+ uint32_t initiator, bool predicate);
void si_cmd_surface_sync(struct si_pm4_state *pm4, uint32_t cp_coher_cntl);
#endif
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
index 2608ad0b360..db8f17fd36c 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -500,26 +500,20 @@ static void si_state_draw(struct r600_context *rctx,
si_pm4_cmd_end(pm4, rctx->predicate_drawing);
if (info->indexed) {
+ uint32_t max_size = (ib->buffer->width0 - ib->offset) /
+ rctx->index_buffer.index_size;
uint64_t va;
va = r600_resource_va(&rctx->screen->screen, ib->buffer);
va += ib->offset;
si_pm4_add_bo(pm4, (struct si_resource *)ib->buffer, RADEON_USAGE_READ);
- si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_2);
- si_pm4_cmd_add(pm4, (ib->buffer->width0 - ib->offset) /
- rctx->index_buffer.index_size);
- si_pm4_cmd_add(pm4, va);
- si_pm4_cmd_add(pm4, (va >> 32UL) & 0xFF);
- si_pm4_cmd_add(pm4, info->count);
- si_pm4_cmd_add(pm4, V_0287F0_DI_SRC_SEL_DMA);
- si_pm4_cmd_end(pm4, rctx->predicate_drawing);
+ si_cmd_draw_index_2(pm4, max_size, va, info->count,
+ V_0287F0_DI_SRC_SEL_DMA,
+ rctx->predicate_drawing);
} else {
- si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_AUTO);
- si_pm4_cmd_add(pm4, info->count);
- si_pm4_cmd_add(pm4, V_0287F0_DI_SRC_SEL_AUTO_INDEX |
- (info->count_from_stream_output ?
- S_0287F0_USE_OPAQUE(1) : 0));
- si_pm4_cmd_end(pm4, rctx->predicate_drawing);
+ uint32_t initiator = V_0287F0_DI_SRC_SEL_AUTO_INDEX;
+ initiator |= S_0287F0_USE_OPAQUE(!!info->count_from_stream_output);
+ si_cmd_draw_index_auto(pm4, info->count, initiator, rctx->predicate_drawing);
}
si_pm4_set_state(rctx, draw, pm4);
}