From a29bc043ae8cf145bdf24b65c9e47c2aa614152f Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Sat, 26 May 2018 23:09:25 +0200 Subject: [PATCH] radv: Implement VK_KHR_draw_indirect_count. Literally the same as the AMD ext. Passes *indirect_draw_count* CTS tests. Reviewed-by: Dave Airlie Reviewed-by: Samuel Pitoiset --- src/amd/vulkan/radv_cmd_buffer.c | 49 +++++++++++++++++++++++++++++++++++++++ src/amd/vulkan/radv_extensions.py | 1 + 2 files changed, 50 insertions(+) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index b6afa94..3e3dbf6 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -3398,6 +3398,55 @@ void radv_CmdDrawIndexedIndirectCountAMD( radv_draw(cmd_buffer, &info); } +void radv_CmdDrawIndirectCountKHR( + VkCommandBuffer commandBuffer, + VkBuffer _buffer, + VkDeviceSize offset, + VkBuffer _countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + RADV_FROM_HANDLE(radv_buffer, buffer, _buffer); + RADV_FROM_HANDLE(radv_buffer, count_buffer, _countBuffer); + struct radv_draw_info info = {}; + + info.count = maxDrawCount; + info.indirect = buffer; + info.indirect_offset = offset; + info.count_buffer = count_buffer; + info.count_buffer_offset = countBufferOffset; + info.stride = stride; + + radv_draw(cmd_buffer, &info); +} + +void radv_CmdDrawIndexedIndirectCountKHR( + VkCommandBuffer commandBuffer, + VkBuffer _buffer, + VkDeviceSize offset, + VkBuffer _countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + RADV_FROM_HANDLE(radv_buffer, buffer, _buffer); + RADV_FROM_HANDLE(radv_buffer, count_buffer, _countBuffer); + struct radv_draw_info info = {}; + + info.indexed = true; + info.count = maxDrawCount; + info.indirect = buffer; + info.indirect_offset = offset; + info.count_buffer = count_buffer; + info.count_buffer_offset = countBufferOffset; + info.stride = stride; + + radv_draw(cmd_buffer, &info); +} + struct radv_dispatch_info { /** * Determine the layout of the grid (in block units) to be used. diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_extensions.py index ec34551..a5b5a8d 100644 --- a/src/amd/vulkan/radv_extensions.py +++ b/src/amd/vulkan/radv_extensions.py @@ -56,6 +56,7 @@ EXTENSIONS = [ Extension('VK_KHR_descriptor_update_template', 1, True), Extension('VK_KHR_device_group', 1, True), Extension('VK_KHR_device_group_creation', 1, True), + Extension('VK_KHR_draw_indirect_count', 1, True), Extension('VK_KHR_external_fence', 1, 'device->rad_info.has_syncobj_wait_for_submit'), Extension('VK_KHR_external_fence_capabilities', 1, True), Extension('VK_KHR_external_fence_fd', 1, 'device->rad_info.has_syncobj_wait_for_submit'), -- 2.7.4