From 13359d68d76f802caa7fde574c0197f9be52a983 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 24 Apr 2019 21:31:31 +0200 Subject: [PATCH] [dxvk] Enable VK_KHR_draw_indirect_count if available Useful to implement a corresponding D3D11 extension. --- src/dxvk/dxvk_adapter.cpp | 3 ++- src/dxvk/dxvk_cmdlist.h | 24 ++++++++++++++++++++++++ src/dxvk/dxvk_extensions.h | 1 + src/vulkan/vulkan_loader.h | 5 +++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index 5ca07ae9..b3a71dd0 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -240,7 +240,7 @@ namespace dxvk { Rc DxvkAdapter::createDevice(std::string clientApi, DxvkDeviceFeatures enabledFeatures) { DxvkDeviceExtensions devExtensions; - std::array devExtensionList = {{ + std::array devExtensionList = {{ &devExtensions.amdMemoryOverallocationBehaviour, &devExtensions.amdShaderFragmentMask, &devExtensions.extConditionalRendering, @@ -252,6 +252,7 @@ namespace dxvk { &devExtensions.extVertexAttributeDivisor, &devExtensions.khrDedicatedAllocation, &devExtensions.khrDescriptorUpdateTemplate, + &devExtensions.khrDrawIndirectCount, &devExtensions.khrDriverProperties, &devExtensions.khrGetMemoryRequirements2, &devExtensions.khrImageFormatList, diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index fa8387c3..318ac1af 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -463,6 +463,18 @@ namespace dxvk { } + void cmdDrawIndirectCount( + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countOffset, + uint32_t maxDrawCount, + uint32_t stride) { + m_vkd->vkCmdDrawIndirectCountKHR(m_execBuffer, + buffer, offset, countBuffer, countOffset, maxDrawCount, stride); + } + + void cmdDrawIndexed( uint32_t indexCount, uint32_t instanceCount, @@ -486,6 +498,18 @@ namespace dxvk { } + void cmdDrawIndexedIndirectCount( + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countOffset, + uint32_t maxDrawCount, + uint32_t stride) { + m_vkd->vkCmdDrawIndexedIndirectCountKHR(m_execBuffer, + buffer, offset, countBuffer, countOffset, maxDrawCount, stride); + } + + void cmdDrawIndirectVertexCount( uint32_t instanceCount, uint32_t firstInstance, diff --git a/src/dxvk/dxvk_extensions.h b/src/dxvk/dxvk_extensions.h index 4f51c988..a3825424 100644 --- a/src/dxvk/dxvk_extensions.h +++ b/src/dxvk/dxvk_extensions.h @@ -268,6 +268,7 @@ namespace dxvk { DxvkExt extVertexAttributeDivisor = { VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrDedicatedAllocation = { VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, DxvkExtMode::Required }; DxvkExt khrDescriptorUpdateTemplate = { VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, DxvkExtMode::Required }; + DxvkExt khrDrawIndirectCount = { VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrDriverProperties = { VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt khrGetMemoryRequirements2 = { VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, DxvkExtMode::Required }; DxvkExt khrImageFormatList = { VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, DxvkExtMode::Required }; diff --git a/src/vulkan/vulkan_loader.h b/src/vulkan/vulkan_loader.h index b50cffe1..67c19597 100644 --- a/src/vulkan/vulkan_loader.h +++ b/src/vulkan/vulkan_loader.h @@ -273,6 +273,11 @@ namespace dxvk::vk { VULKAN_FN(vkUpdateDescriptorSetWithTemplateKHR); VULKAN_FN(vkCmdPushDescriptorSetWithTemplateKHR); #endif + + #ifdef VK_KHR_draw_indirect_count + VULKAN_FN(vkCmdDrawIndirectCountKHR); + VULKAN_FN(vkCmdDrawIndexedIndirectCountKHR); + #endif #ifdef VK_KHR_swapchain VULKAN_FN(vkCreateSwapchainKHR);