radv: implement VK_EXT_multi_draw

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11532>
This commit is contained in:
Mike Blumenkrantz 2021-06-30 10:01:58 -04:00 committed by Marge Bot
parent ba30adce07
commit a4713ddb56
3 changed files with 58 additions and 0 deletions

View File

@ -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

View File

@ -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)

View File

@ -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;
}