radv: emit the initial config only once in the preambles
It shouldn't be needed to emit the initial graphics or compute state when beginning a new command buffer. Emitting them in the preamble should be enough and this will reduce IB sizes. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -2298,20 +2298,6 @@ VkResult radv_ResetCommandBuffer(
|
||||
return radv_reset_cmd_buffer(cmd_buffer);
|
||||
}
|
||||
|
||||
static void emit_gfx_buffer_state(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
struct radv_device *device = cmd_buffer->device;
|
||||
if (device->gfx_init) {
|
||||
uint64_t va = radv_buffer_get_va(device->gfx_init);
|
||||
radv_cs_add_buffer(device->ws, cmd_buffer->cs, device->gfx_init);
|
||||
radeon_emit(cmd_buffer->cs, PKT3(PKT3_INDIRECT_BUFFER_CIK, 2, 0));
|
||||
radeon_emit(cmd_buffer->cs, va);
|
||||
radeon_emit(cmd_buffer->cs, va >> 32);
|
||||
radeon_emit(cmd_buffer->cs, device->gfx_init_size_dw & 0xffff);
|
||||
} else
|
||||
si_init_config(cmd_buffer);
|
||||
}
|
||||
|
||||
VkResult radv_BeginCommandBuffer(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkCommandBufferBeginInfo *pBeginInfo)
|
||||
@@ -2337,21 +2323,6 @@ VkResult radv_BeginCommandBuffer(
|
||||
cmd_buffer->state.predication_type = -1;
|
||||
cmd_buffer->usage_flags = pBeginInfo->flags;
|
||||
|
||||
/* setup initial configuration into command buffer */
|
||||
if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
|
||||
switch (cmd_buffer->queue_family_index) {
|
||||
case RADV_QUEUE_GENERAL:
|
||||
emit_gfx_buffer_state(cmd_buffer);
|
||||
break;
|
||||
case RADV_QUEUE_COMPUTE:
|
||||
si_init_compute(cmd_buffer);
|
||||
break;
|
||||
case RADV_QUEUE_TRANSFER:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY &&
|
||||
(pBeginInfo->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
|
||||
assert(pBeginInfo->pInheritanceInfo);
|
||||
|
@@ -2090,6 +2090,33 @@ radv_emit_global_shader_pointers(struct radv_queue *queue,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
radv_init_graphics_state(struct radeon_cmdbuf *cs, struct radv_queue *queue)
|
||||
{
|
||||
struct radv_device *device = queue->device;
|
||||
|
||||
if (device->gfx_init) {
|
||||
uint64_t va = radv_buffer_get_va(device->gfx_init);
|
||||
|
||||
radeon_emit(cs, PKT3(PKT3_INDIRECT_BUFFER_CIK, 2, 0));
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, va >> 32);
|
||||
radeon_emit(cs, device->gfx_init_size_dw & 0xffff);
|
||||
|
||||
radv_cs_add_buffer(device->ws, cs, device->gfx_init);
|
||||
} else {
|
||||
struct radv_physical_device *physical_device = device->physical_device;
|
||||
si_emit_graphics(physical_device, cs);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
radv_init_compute_state(struct radeon_cmdbuf *cs, struct radv_queue *queue)
|
||||
{
|
||||
struct radv_physical_device *physical_device = queue->device->physical_device;
|
||||
si_emit_compute(physical_device, cs);
|
||||
}
|
||||
|
||||
static VkResult
|
||||
radv_get_preamble_cs(struct radv_queue *queue,
|
||||
uint32_t scratch_size,
|
||||
@@ -2244,6 +2271,18 @@ radv_get_preamble_cs(struct radv_queue *queue,
|
||||
if (scratch_bo)
|
||||
radv_cs_add_buffer(queue->device->ws, cs, scratch_bo);
|
||||
|
||||
/* Emit initial configuration. */
|
||||
switch (queue->queue_family_index) {
|
||||
case RADV_QUEUE_GENERAL:
|
||||
radv_init_graphics_state(cs, queue);
|
||||
break;
|
||||
case RADV_QUEUE_COMPUTE:
|
||||
radv_init_compute_state(cs, queue);
|
||||
break;
|
||||
case RADV_QUEUE_TRANSFER:
|
||||
break;
|
||||
}
|
||||
|
||||
if (descriptor_bo != queue->descriptor_bo) {
|
||||
uint32_t *map = (uint32_t*)queue->device->ws->buffer_map(descriptor_bo);
|
||||
|
||||
|
@@ -1065,8 +1065,10 @@ struct radv_image;
|
||||
|
||||
bool radv_cmd_buffer_uses_mec(struct radv_cmd_buffer *cmd_buffer);
|
||||
|
||||
void si_init_compute(struct radv_cmd_buffer *cmd_buffer);
|
||||
void si_init_config(struct radv_cmd_buffer *cmd_buffer);
|
||||
void si_emit_graphics(struct radv_physical_device *physical_device,
|
||||
struct radeon_cmdbuf *cs);
|
||||
void si_emit_compute(struct radv_physical_device *physical_device,
|
||||
struct radeon_cmdbuf *cs);
|
||||
|
||||
void cik_create_gfx_config(struct radv_device *device);
|
||||
|
||||
|
@@ -79,7 +79,7 @@ si_write_harvested_raster_configs(struct radv_physical_device *physical_device,
|
||||
radeon_set_context_reg(cs, R_028354_PA_SC_RASTER_CONFIG_1, raster_config_1);
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
si_emit_compute(struct radv_physical_device *physical_device,
|
||||
struct radeon_cmdbuf *cs)
|
||||
{
|
||||
@@ -117,13 +117,6 @@ si_emit_compute(struct radv_physical_device *physical_device,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
si_init_compute(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
struct radv_physical_device *physical_device = cmd_buffer->device->physical_device;
|
||||
si_emit_compute(physical_device, cmd_buffer->cs);
|
||||
}
|
||||
|
||||
/* 12.4 fixed-point */
|
||||
static unsigned radv_pack_float_12p4(float x)
|
||||
{
|
||||
@@ -159,8 +152,8 @@ si_set_raster_config(struct radv_physical_device *physical_device,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
si_emit_config(struct radv_physical_device *physical_device,
|
||||
void
|
||||
si_emit_graphics(struct radv_physical_device *physical_device,
|
||||
struct radeon_cmdbuf *cs)
|
||||
{
|
||||
int i;
|
||||
@@ -388,13 +381,6 @@ si_emit_config(struct radv_physical_device *physical_device,
|
||||
si_emit_compute(physical_device, cs);
|
||||
}
|
||||
|
||||
void si_init_config(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
struct radv_physical_device *physical_device = cmd_buffer->device->physical_device;
|
||||
|
||||
si_emit_config(physical_device, cmd_buffer->cs);
|
||||
}
|
||||
|
||||
void
|
||||
cik_create_gfx_config(struct radv_device *device)
|
||||
{
|
||||
@@ -402,7 +388,7 @@ cik_create_gfx_config(struct radv_device *device)
|
||||
if (!cs)
|
||||
return;
|
||||
|
||||
si_emit_config(device->physical_device, cs);
|
||||
si_emit_graphics(device->physical_device, cs);
|
||||
|
||||
while (cs->cdw & 7) {
|
||||
if (device->physical_device->rad_info.gfx_ib_pad_with_type2)
|
||||
|
Reference in New Issue
Block a user