From ff10197d09b2dc5a06b017da22e70666834aea00 Mon Sep 17 00:00:00 2001 From: Tony Barbour Date: Tue, 22 Aug 2023 13:29:21 -0600 Subject: [PATCH] gpu: Add check for queue that supports graphics --- layers/gpu_validation/gpu_validation.cpp | 24 +++++++++++++++++++++--- layers/gpu_validation/gpu_validation.h | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/layers/gpu_validation/gpu_validation.cpp b/layers/gpu_validation/gpu_validation.cpp index edcb333844d..1c39db97d68 100644 --- a/layers/gpu_validation/gpu_validation.cpp +++ b/layers/gpu_validation/gpu_validation.cpp @@ -194,7 +194,7 @@ void GpuAssisted::CreateDevice(const VkDeviceCreateInfo *pCreateInfo) { } } - CreateAccelerationStructureBuildValidationState(); + CreateAccelerationStructureBuildValidationState(pCreateInfo); } void GpuAssistedPreDrawValidationState::Destroy(VkDevice device) { @@ -249,7 +249,7 @@ void GpuAssisted::PreCallRecordDestroyDevice(VkDevice device, const VkAllocation GpuAssistedBase::PreCallRecordDestroyDevice(device, pAllocator); } -void GpuAssisted::CreateAccelerationStructureBuildValidationState() { +void GpuAssisted::CreateAccelerationStructureBuildValidationState(const VkDeviceCreateInfo *pCreateInfo) { if (aborted) { return; } @@ -263,6 +263,24 @@ void GpuAssisted::CreateAccelerationStructureBuildValidationState() { return; } + // Cannot use this validation without a queue that supports graphics + auto pd_state = Get(physical_device); + bool graphics_queue_exists = false; + uint32_t graphics_queue_family = 0; + for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) { + auto qfi = pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex; + if (pd_state->queue_family_properties[qfi].queueFlags & VK_QUEUE_GRAPHICS_BIT) { + graphics_queue_family = qfi; + graphics_queue_exists = true; + break; + } + } + if (!graphics_queue_exists) { + LogWarning(device, "UNASSIGNED-GPU-Assisted Validation Warning", "No queue that supports graphics, GPU-AV aborted."); + aborted = true; + return; + } + // Outline: // - Create valid bottom level acceleration structure which acts as replacement // - Create and load vertex buffer @@ -479,7 +497,7 @@ void GpuAssisted::CreateAccelerationStructureBuildValidationState() { VkQueue queue = VK_NULL_HANDLE; if (result == VK_SUCCESS) { - DispatchGetDeviceQueue(device, 0, 0, &queue); + DispatchGetDeviceQueue(device, graphics_queue_family, 0, &queue); // Hook up queue dispatch vkSetDeviceLoaderData(device, queue); diff --git a/layers/gpu_validation/gpu_validation.h b/layers/gpu_validation/gpu_validation.h index 00d60cb349a..9a175adbac8 100644 --- a/layers/gpu_validation/gpu_validation.h +++ b/layers/gpu_validation/gpu_validation.h @@ -209,7 +209,7 @@ class GpuAssisted : public GpuAssistedBase { VkResult result) override; void PreCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer, void* cb_state_data) override; - void CreateAccelerationStructureBuildValidationState(); + void CreateAccelerationStructureBuildValidationState(const VkDeviceCreateInfo* pCreateInfo); void PreCallRecordCmdBuildAccelerationStructureNV(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src,