radv: Don't create continue preamble when it's not needed.
authorTimur Kristóf <timur.kristof@gmail.com>
Thu, 5 May 2022 18:09:27 +0000 (20:09 +0200)
committerTimur Kristóf <timur.kristof@gmail.com>
Tue, 10 May 2022 08:19:34 +0000 (10:19 +0200)
Previously we would always create it, but would return NULL when
it wasn't needed. Now, don't create it when not needed.

Additionally, don't create the continue preamble when we can use
IB BOs, because then we never use a continue preamble.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-By: Tatsuyuki Ishi <ishitatsuyuki@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16358>

src/amd/vulkan/radv_device.c

index dc9f008..4796d08 100644 (file)
@@ -4013,10 +4013,6 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
       *initial_full_flush_preamble_cs = queue->initial_full_flush_preamble_cs;
       *initial_preamble_cs = queue->initial_preamble_cs;
       *continue_preamble_cs = queue->continue_preamble_cs;
-      if (!scratch_size_per_wave && !compute_scratch_size_per_wave && !esgs_ring_size &&
-          !gsvs_ring_size && !needs_tess_rings && !needs_gds && !needs_gds_oa &&
-          !needs_sample_positions)
-         *continue_preamble_cs = NULL;
       return VK_SUCCESS;
    }
 
@@ -4130,6 +4126,19 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    }
 
    for (int i = 0; i < 3; ++i) {
+      /* Don't create continue preamble when it's not necessary. */
+      if (i == 2) {
+         /* We only need the continue preamble when we can't use indirect buffers. */
+         if (!(queue->device->instance->debug_flags & RADV_DEBUG_NO_IBS) &&
+             queue->device->physical_device->rad_info.chip_class >= GFX7)
+            continue;
+         /* Continue preamble is unnecessary when no shader rings are used. */
+         if (!scratch_size_per_wave && !compute_scratch_size_per_wave && !esgs_ring_size &&
+             !gsvs_ring_size && !needs_tess_rings && !needs_gds && !needs_gds_oa &&
+             !needs_sample_positions)
+            continue;
+      }
+
       enum rgp_flush_bits sqtt_flush_bits = 0;
       struct radeon_cmdbuf *cs = NULL;
       cs = queue->device->ws->cs_create(queue->device->ws,
@@ -4271,8 +4280,6 @@ radv_get_preamble_cs(struct radv_queue *queue, uint32_t scratch_size_per_wave,
    *initial_full_flush_preamble_cs = queue->initial_full_flush_preamble_cs;
    *initial_preamble_cs = queue->initial_preamble_cs;
    *continue_preamble_cs = queue->continue_preamble_cs;
-   if (!scratch_size && !compute_scratch_size && !esgs_ring_size && !gsvs_ring_size)
-      *continue_preamble_cs = NULL;
    return VK_SUCCESS;
 fail:
    for (int i = 0; i < ARRAY_SIZE(dest_cs); ++i)