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:
parent
7815b6942d
commit
7e503fa053
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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 };
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user