radv: implement VK_EXT_multi_draw
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11532>
This commit is contained in:
parent
ba30adce07
commit
a4713ddb56
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue