1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 04:54:15 +01:00

[dxvk] Enable VK_EXT_multi_draw if supported

This commit is contained in:
Philip Rebohle 2025-02-21 12:48:22 +01:00 committed by Philip Rebohle
parent 7815b6942d
commit 7e503fa053
5 changed files with 61 additions and 3 deletions

View File

@ -400,6 +400,10 @@ namespace dxvk {
m_deviceFeatures.extLineRasterization.smoothLines; m_deviceFeatures.extLineRasterization.smoothLines;
} }
// Enable multi-draw for draw batching
enabledFeatures.extMultiDraw.multiDraw =
m_deviceFeatures.extMultiDraw.multiDraw;
// Enable memory priority and pageable memory if supported // Enable memory priority and pageable memory if supported
// to improve driver-side memory management // to improve driver-side memory management
enabledFeatures.extMemoryPriority.memoryPriority = enabledFeatures.extMemoryPriority.memoryPriority =
@ -600,6 +604,10 @@ namespace dxvk {
enabledFeatures.extMemoryPriority = *reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(f); enabledFeatures.extMemoryPriority = *reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(f);
break; break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT:
enabledFeatures.extMultiDraw = *reinterpret_cast<const VkPhysicalDeviceMultiDrawFeaturesEXT*>(f);
break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT: case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT:
enabledFeatures.extNonSeamlessCubeMap = *reinterpret_cast<const VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT*>(f); enabledFeatures.extNonSeamlessCubeMap = *reinterpret_cast<const VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT*>(f);
break; break;
@ -791,6 +799,11 @@ namespace dxvk {
m_deviceInfo.extLineRasterization.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extLineRasterization); m_deviceInfo.extLineRasterization.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extLineRasterization);
} }
if (m_deviceExtensions.supports(VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
m_deviceInfo.extMultiDraw.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT;
m_deviceInfo.extMultiDraw.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extMultiDraw);
}
if (m_deviceExtensions.supports(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) { if (m_deviceExtensions.supports(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
m_deviceInfo.extRobustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT; m_deviceInfo.extRobustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT;
m_deviceInfo.extRobustness2.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extRobustness2); m_deviceInfo.extRobustness2.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extRobustness2);
@ -891,6 +904,11 @@ namespace dxvk {
m_deviceFeatures.extMemoryPriority.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extMemoryPriority); m_deviceFeatures.extMemoryPriority.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extMemoryPriority);
} }
if (m_deviceExtensions.supports(VK_EXT_MULTI_DRAW_EXTENSION_NAME)) {
m_deviceFeatures.extMultiDraw.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT;
m_deviceFeatures.extMultiDraw.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extMultiDraw);
}
if (m_deviceExtensions.supports(VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME)) { if (m_deviceExtensions.supports(VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME)) {
m_deviceFeatures.extNonSeamlessCubeMap.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT; m_deviceFeatures.extNonSeamlessCubeMap.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT;
m_deviceFeatures.extNonSeamlessCubeMap.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extNonSeamlessCubeMap); m_deviceFeatures.extNonSeamlessCubeMap.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extNonSeamlessCubeMap);
@ -1017,6 +1035,7 @@ namespace dxvk {
&devExtensions.extLineRasterization, &devExtensions.extLineRasterization,
&devExtensions.extMemoryBudget, &devExtensions.extMemoryBudget,
&devExtensions.extMemoryPriority, &devExtensions.extMemoryPriority,
&devExtensions.extMultiDraw,
&devExtensions.extNonSeamlessCubeMap, &devExtensions.extNonSeamlessCubeMap,
&devExtensions.extPageableDeviceLocalMemory, &devExtensions.extPageableDeviceLocalMemory,
&devExtensions.extRobustness2, &devExtensions.extRobustness2,
@ -1116,6 +1135,11 @@ namespace dxvk {
enabledFeatures.extMemoryPriority.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extMemoryPriority); enabledFeatures.extMemoryPriority.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extMemoryPriority);
} }
if (devExtensions.extMultiDraw) {
enabledFeatures.extMultiDraw.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT;
enabledFeatures.extMultiDraw.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extMultiDraw);
}
if (devExtensions.extNonSeamlessCubeMap) { if (devExtensions.extNonSeamlessCubeMap) {
enabledFeatures.extNonSeamlessCubeMap.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT; enabledFeatures.extNonSeamlessCubeMap.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT;
enabledFeatures.extNonSeamlessCubeMap.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extNonSeamlessCubeMap); enabledFeatures.extNonSeamlessCubeMap.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extNonSeamlessCubeMap);
@ -1308,6 +1332,8 @@ namespace dxvk {
"\n extension supported : ", features.extMemoryBudget ? "1" : "0", "\n extension supported : ", features.extMemoryBudget ? "1" : "0",
"\n", VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, "\n", VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME,
"\n memoryPriority : ", features.extMemoryPriority.memoryPriority ? "1" : "0", "\n memoryPriority : ", features.extMemoryPriority.memoryPriority ? "1" : "0",
"\n", VK_EXT_MULTI_DRAW_EXTENSION_NAME,
"\n multiDraw : ", features.extMultiDraw.multiDraw ? "1" : "0",
"\n", VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, "\n", VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME,
"\n nonSeamlessCubeMap : ", features.extNonSeamlessCubeMap.nonSeamlessCubeMap ? "1" : "0", "\n nonSeamlessCubeMap : ", features.extNonSeamlessCubeMap.nonSeamlessCubeMap ? "1" : "0",
"\n", VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, "\n", VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME,

View File

@ -722,6 +722,18 @@ namespace dxvk {
vertexCount, instanceCount, vertexCount, instanceCount,
firstVertex, firstInstance); firstVertex, firstInstance);
} }
void cmdDrawMulti(
uint32_t drawCount,
const VkMultiDrawInfoEXT* drawInfos,
uint32_t instanceCount,
uint32_t firstInstance) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDrawMultiEXT(getCmdBuffer(),
drawCount, drawInfos, instanceCount, firstInstance, sizeof(*drawInfos));
}
void cmdDrawIndirect( void cmdDrawIndirect(
@ -745,8 +757,8 @@ namespace dxvk {
uint32_t stride) { uint32_t stride) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDrawIndirectCount(getCmdBuffer(), m_vkd->vkCmdDrawIndirectCount(getCmdBuffer(), buffer,
buffer, offset, countBuffer, countOffset, maxDrawCount, stride); offset, countBuffer, countOffset, maxDrawCount, stride);
} }
@ -765,6 +777,18 @@ namespace dxvk {
} }
void cmdDrawMultiIndexed(
uint32_t drawCount,
const VkMultiDrawIndexedInfoEXT* drawInfos,
uint32_t instanceCount,
uint32_t firstInstance) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDrawMultiIndexedEXT(getCmdBuffer(), drawCount,
drawInfos, instanceCount, firstInstance, sizeof(*drawInfos), nullptr);
}
void cmdDrawIndexedIndirect( void cmdDrawIndexedIndirect(
VkBuffer buffer, VkBuffer buffer,
VkDeviceSize offset, VkDeviceSize offset,

View File

@ -25,6 +25,7 @@ namespace dxvk {
VkPhysicalDeviceExtendedDynamicState3PropertiesEXT extExtendedDynamicState3; VkPhysicalDeviceExtendedDynamicState3PropertiesEXT extExtendedDynamicState3;
VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT extGraphicsPipelineLibrary; VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT extGraphicsPipelineLibrary;
VkPhysicalDeviceLineRasterizationPropertiesEXT extLineRasterization; VkPhysicalDeviceLineRasterizationPropertiesEXT extLineRasterization;
VkPhysicalDeviceMultiDrawPropertiesEXT extMultiDraw;
VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2; VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2;
VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback; VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback;
VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor; VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor;
@ -58,6 +59,7 @@ namespace dxvk {
VkPhysicalDeviceLineRasterizationFeaturesEXT extLineRasterization; VkPhysicalDeviceLineRasterizationFeaturesEXT extLineRasterization;
VkBool32 extMemoryBudget; VkBool32 extMemoryBudget;
VkPhysicalDeviceMemoryPriorityFeaturesEXT extMemoryPriority; VkPhysicalDeviceMemoryPriorityFeaturesEXT extMemoryPriority;
VkPhysicalDeviceMultiDrawFeaturesEXT extMultiDraw;
VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT extNonSeamlessCubeMap; VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT extNonSeamlessCubeMap;
VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT extPageableDeviceLocalMemory; VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT extPageableDeviceLocalMemory;
VkPhysicalDeviceRobustness2FeaturesEXT extRobustness2; VkPhysicalDeviceRobustness2FeaturesEXT extRobustness2;
@ -80,4 +82,4 @@ namespace dxvk {
VkBool32 khrWin32KeyedMutex; VkBool32 khrWin32KeyedMutex;
}; };
} }

View File

@ -308,6 +308,7 @@ namespace dxvk {
DxvkExt extLineRasterization = { VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extLineRasterization = { VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extMemoryBudget = { VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, DxvkExtMode::Passive }; DxvkExt extMemoryBudget = { VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, DxvkExtMode::Passive };
DxvkExt extMemoryPriority = { VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extMemoryPriority = { VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extMultiDraw = { VK_EXT_MULTI_DRAW_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extNonSeamlessCubeMap = { VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extNonSeamlessCubeMap = { VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extPageableDeviceLocalMemory = { VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, DxvkExtMode::Optional }; DxvkExt extPageableDeviceLocalMemory = { VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extRobustness2 = { VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, DxvkExtMode::Required }; DxvkExt extRobustness2 = { VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, DxvkExtMode::Required };

View File

@ -405,6 +405,11 @@ namespace dxvk::vk {
VULKAN_FN(vkSetDeviceMemoryPriorityEXT); VULKAN_FN(vkSetDeviceMemoryPriorityEXT);
#endif #endif
#ifdef VK_EXT_multi_draw
VULKAN_FN(vkCmdDrawMultiEXT);
VULKAN_FN(vkCmdDrawMultiIndexedEXT);
#endif
#ifdef VK_EXT_shader_module_identifier #ifdef VK_EXT_shader_module_identifier
VULKAN_FN(vkGetShaderModuleCreateInfoIdentifierEXT); VULKAN_FN(vkGetShaderModuleCreateInfoIdentifierEXT);
VULKAN_FN(vkGetShaderModuleIdentifierEXT); VULKAN_FN(vkGetShaderModuleIdentifierEXT);