From a4713ddb56ad6d6cb34a87731f9244c757b9dc8b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 30 Jun 2021 10:01:58 -0400 Subject: [PATCH] radv: implement VK_EXT_multi_draw Part-of: --- docs/relnotes/new_features.txt | 1 + src/amd/vulkan/radv_cmd_buffer.c | 46 ++++++++++++++++++++++++++++++++ src/amd/vulkan/radv_device.c | 11 ++++++++ 3 files changed, 58 insertions(+) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index dd880ff90ce..2752307dda1 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -10,3 +10,4 @@ GL ES 3.1 on GT21x hardware. VK_EXT_acquire_drm_display on RADV. VK_EXT_vertex_input_dynamic_state on lavapipe VK_EXT_line_rasterization and wideLines on lavapipe +VK_EXT_multi_draw on ANV, lavapipe, and RADV diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 466391a3a69..5f28c6f85f5 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -5803,6 +5803,29 @@ radv_CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t insta radv_after_draw(cmd_buffer); } +void +radv_CmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT *pVertexInfo, + uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + struct radv_draw_info info; + + if (!drawCount) + return; + + info.count = pVertexInfo->vertexCount; + info.instance_count = instanceCount; + info.first_instance = firstInstance; + info.strmout_buffer = NULL; + info.indirect = NULL; + info.indexed = false; + + if (!radv_before_draw(cmd_buffer, &info, drawCount)) + return; + radv_emit_direct_draw_packets(cmd_buffer, &info, drawCount, pVertexInfo, 0, stride); + radv_after_draw(cmd_buffer); +} + void radv_CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) @@ -5824,6 +5847,29 @@ radv_CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t radv_after_draw(cmd_buffer); } +void radv_CmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawIndexedInfoEXT *pIndexInfo, + uint32_t instanceCount, uint32_t firstInstance, uint32_t stride, const int32_t *pVertexOffset) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + struct radv_draw_info info; + + if (!drawCount) + return; + + const VkMultiDrawIndexedInfoEXT *minfo = pIndexInfo; + info.indexed = true; + info.count = minfo->indexCount; + info.instance_count = instanceCount; + info.first_instance = firstInstance; + info.strmout_buffer = NULL; + info.indirect = NULL; + + if (!radv_before_draw(cmd_buffer, &info, drawCount)) + return; + radv_emit_draw_packets_indexed(cmd_buffer, &info, drawCount, pIndexInfo, stride, pVertexOffset); + radv_after_draw(cmd_buffer); +} + void radv_CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer _buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 6a74cc01f20..1ae5a2e7283 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -477,6 +477,7 @@ radv_physical_device_get_supported_extensions(const struct radv_physical_device .EXT_line_rasterization = true, .EXT_memory_budget = true, .EXT_memory_priority = true, + .EXT_multi_draw = true, .EXT_pci_bus_info = true, #ifndef _WIN32 .EXT_physical_device_drm = true, @@ -1654,6 +1655,11 @@ radv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, features->shaderSubgroupUniformControlFlow = true; break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: { + VkPhysicalDeviceMultiDrawFeaturesEXT *features = (VkPhysicalDeviceMultiDrawFeaturesEXT *)ext; + features->multiDraw = true; + break; + } case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: { VkPhysicalDeviceColorWriteEnableFeaturesEXT *features = (VkPhysicalDeviceColorWriteEnableFeaturesEXT *)ext; @@ -2369,6 +2375,11 @@ radv_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, break; } #endif + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: { + VkPhysicalDeviceMultiDrawPropertiesEXT *props = (VkPhysicalDeviceMultiDrawPropertiesEXT *)ext; + props->maxMultiDrawCount = 2048; + break; + } default: break; }