radv: Create an empty CS per ring type.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sat, 17 Dec 2016 20:53:38 +0000 (21:53 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 18 Dec 2016 19:52:47 +0000 (20:52 +0100)
Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_private.h

index 3aac247f8ba36be4c34168a736da8f0525890ac7..cfedff434b091978eec6760886c8849311840c36 100644 (file)
@@ -710,11 +710,23 @@ VkResult radv_CreateDevice(
                radv_finishme("DCC fast clears have not been tested\n");
 
        radv_device_init_msaa(device);
-       device->empty_cs = device->ws->cs_create(device->ws, RING_GFX);
-       radeon_emit(device->empty_cs, PKT3(PKT3_CONTEXT_CONTROL, 1, 0));
-       radeon_emit(device->empty_cs, CONTEXT_CONTROL_LOAD_ENABLE(1));
-       radeon_emit(device->empty_cs, CONTEXT_CONTROL_SHADOW_ENABLE(1));
-       device->ws->cs_finalize(device->empty_cs);
+
+       for (int family = 0; family < RADV_MAX_QUEUE_FAMILIES; ++family) {
+               device->empty_cs[family] = device->ws->cs_create(device->ws, family);
+               switch (family) {
+               case RADV_QUEUE_GENERAL:
+                       radeon_emit(device->empty_cs[family], PKT3(PKT3_CONTEXT_CONTROL, 1, 0));
+                       radeon_emit(device->empty_cs[family], CONTEXT_CONTROL_LOAD_ENABLE(1));
+                       radeon_emit(device->empty_cs[family], CONTEXT_CONTROL_SHADOW_ENABLE(1));
+                       break;
+               case RADV_QUEUE_COMPUTE:
+                       radeon_emit(device->empty_cs[family], PKT3(PKT3_NOP, 0, 0));
+                       radeon_emit(device->empty_cs[family], 0);
+                       break;
+               }
+               device->ws->cs_finalize(device->empty_cs[family]);
+       }
+
        *pDevice = radv_device_to_handle(device);
        return VK_SUCCESS;
 
@@ -869,7 +881,8 @@ VkResult radv_QueueSubmit(
 
        if (fence) {
                if (!submitCount)
-                       ret = queue->device->ws->cs_submit(ctx, queue->queue_idx, &queue->device->empty_cs,
+                       ret = queue->device->ws->cs_submit(ctx, queue->queue_idx,
+                                                          &queue->device->empty_cs[queue->queue_family_index],
                                                           1, NULL, 0, NULL, 0, false, base_fence);
 
                fence->submitted = true;
index 03d295986f31738c643df0e017721d8bd1eadea5..e15556ea57b1301f128049862a6d89097908c1da 100644 (file)
@@ -473,7 +473,7 @@ struct radv_device {
 
        struct radv_queue *queues[RADV_MAX_QUEUE_FAMILIES];
        int queue_count[RADV_MAX_QUEUE_FAMILIES];
-       struct radeon_winsys_cs *empty_cs;
+       struct radeon_winsys_cs *empty_cs[RADV_MAX_QUEUE_FAMILIES];
 
        bool allow_fast_clears;
        bool allow_dcc;