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;
|
||||
}
|
||||
|
||||
// Enable multi-draw for draw batching
|
||||
enabledFeatures.extMultiDraw.multiDraw =
|
||||
m_deviceFeatures.extMultiDraw.multiDraw;
|
||||
|
||||
// Enable memory priority and pageable memory if supported
|
||||
// to improve driver-side memory management
|
||||
enabledFeatures.extMemoryPriority.memoryPriority =
|
||||
@ -600,6 +604,10 @@ namespace dxvk {
|
||||
enabledFeatures.extMemoryPriority = *reinterpret_cast<const VkPhysicalDeviceMemoryPriorityFeaturesEXT*>(f);
|
||||
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:
|
||||
enabledFeatures.extNonSeamlessCubeMap = *reinterpret_cast<const VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT*>(f);
|
||||
break;
|
||||
@ -791,6 +799,11 @@ namespace dxvk {
|
||||
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)) {
|
||||
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);
|
||||
@ -891,6 +904,11 @@ namespace dxvk {
|
||||
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)) {
|
||||
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);
|
||||
@ -1017,6 +1035,7 @@ namespace dxvk {
|
||||
&devExtensions.extLineRasterization,
|
||||
&devExtensions.extMemoryBudget,
|
||||
&devExtensions.extMemoryPriority,
|
||||
&devExtensions.extMultiDraw,
|
||||
&devExtensions.extNonSeamlessCubeMap,
|
||||
&devExtensions.extPageableDeviceLocalMemory,
|
||||
&devExtensions.extRobustness2,
|
||||
@ -1116,6 +1135,11 @@ namespace dxvk {
|
||||
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) {
|
||||
enabledFeatures.extNonSeamlessCubeMap.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT;
|
||||
enabledFeatures.extNonSeamlessCubeMap.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extNonSeamlessCubeMap);
|
||||
@ -1308,6 +1332,8 @@ namespace dxvk {
|
||||
"\n extension supported : ", features.extMemoryBudget ? "1" : "0",
|
||||
"\n", VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME,
|
||||
"\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 nonSeamlessCubeMap : ", features.extNonSeamlessCubeMap.nonSeamlessCubeMap ? "1" : "0",
|
||||
"\n", VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME,
|
||||
|
@ -722,6 +722,18 @@ namespace dxvk {
|
||||
vertexCount, instanceCount,
|
||||
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(
|
||||
@ -745,8 +757,8 @@ namespace dxvk {
|
||||
uint32_t stride) {
|
||||
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
|
||||
|
||||
m_vkd->vkCmdDrawIndirectCount(getCmdBuffer(),
|
||||
buffer, offset, countBuffer, countOffset, maxDrawCount, stride);
|
||||
m_vkd->vkCmdDrawIndirectCount(getCmdBuffer(), buffer,
|
||||
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(
|
||||
VkBuffer buffer,
|
||||
VkDeviceSize offset,
|
||||
|
@ -25,6 +25,7 @@ namespace dxvk {
|
||||
VkPhysicalDeviceExtendedDynamicState3PropertiesEXT extExtendedDynamicState3;
|
||||
VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT extGraphicsPipelineLibrary;
|
||||
VkPhysicalDeviceLineRasterizationPropertiesEXT extLineRasterization;
|
||||
VkPhysicalDeviceMultiDrawPropertiesEXT extMultiDraw;
|
||||
VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2;
|
||||
VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback;
|
||||
VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor;
|
||||
@ -58,6 +59,7 @@ namespace dxvk {
|
||||
VkPhysicalDeviceLineRasterizationFeaturesEXT extLineRasterization;
|
||||
VkBool32 extMemoryBudget;
|
||||
VkPhysicalDeviceMemoryPriorityFeaturesEXT extMemoryPriority;
|
||||
VkPhysicalDeviceMultiDrawFeaturesEXT extMultiDraw;
|
||||
VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT extNonSeamlessCubeMap;
|
||||
VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT extPageableDeviceLocalMemory;
|
||||
VkPhysicalDeviceRobustness2FeaturesEXT extRobustness2;
|
||||
@ -80,4 +82,4 @@ namespace dxvk {
|
||||
VkBool32 khrWin32KeyedMutex;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -308,6 +308,7 @@ namespace dxvk {
|
||||
DxvkExt extLineRasterization = { VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, DxvkExtMode::Optional };
|
||||
DxvkExt extMemoryBudget = { VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, DxvkExtMode::Passive };
|
||||
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 extPageableDeviceLocalMemory = { VK_EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME, DxvkExtMode::Optional };
|
||||
DxvkExt extRobustness2 = { VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, DxvkExtMode::Required };
|
||||
|
@ -405,6 +405,11 @@ namespace dxvk::vk {
|
||||
VULKAN_FN(vkSetDeviceMemoryPriorityEXT);
|
||||
#endif
|
||||
|
||||
#ifdef VK_EXT_multi_draw
|
||||
VULKAN_FN(vkCmdDrawMultiEXT);
|
||||
VULKAN_FN(vkCmdDrawMultiIndexedEXT);
|
||||
#endif
|
||||
|
||||
#ifdef VK_EXT_shader_module_identifier
|
||||
VULKAN_FN(vkGetShaderModuleCreateInfoIdentifierEXT);
|
||||
VULKAN_FN(vkGetShaderModuleIdentifierEXT);
|
||||
|
Loading…
x
Reference in New Issue
Block a user