radv: emit the initial config only once in the preambles
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 13 Sep 2018 10:30:21 +0000 (12:30 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 14 Sep 2018 08:59:52 +0000 (10:59 +0200)
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>
src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_private.h
src/amd/vulkan/si_cmd_buffer.c

index b8afbb20a4ca36f94b488647d002f62c770d89e0..d492456d6b88060660f3c1db6cc069dcd99b647c 100644 (file)
@@ -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);
index 7917ed7ffe5c9c7a69592fd1559e2ebbf592181d..8989ec3553fbf78bcf98765612b786bbde53a045 100644 (file)
@@ -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);
 
index 01a5a698a0dfba2587daedc015ddaf4670375c03..08425473fef0929a2c57582c9ce4ec9331f066f6 100644 (file)
@@ -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);
 
index 1464c913cd632215b2b12acd776040dcdf98dc10..7ff1717022de74e6827a2f42dc8bcc225e4dd40f 100644 (file)
@@ -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,9 +152,9 @@ si_set_raster_config(struct radv_physical_device *physical_device,
        }
 }
 
-static void
-si_emit_config(struct radv_physical_device *physical_device,
-              struct radeon_cmdbuf *cs)
+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)