summaryrefslogtreecommitdiff
path: root/tools/gfx/vulkan/vk-device.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx/vulkan/vk-device.cpp')
-rw-r--r--tools/gfx/vulkan/vk-device.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp
index 015be5f15..e71337ef6 100644
--- a/tools/gfx/vulkan/vk-device.cpp
+++ b/tools/gfx/vulkan/vk-device.cpp
@@ -430,6 +430,10 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
extendedFeatures.atomicFloatFeatures.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.atomicFloatFeatures;
+ // mesh shader features
+ extendedFeatures.meshShaderFeatures.pNext = deviceFeatures2.pNext;
+ deviceFeatures2.pNext = &extendedFeatures.meshShaderFeatures;
+
if (VK_MAKE_VERSION(majorVersion, minorVersion, 0) >= VK_API_VERSION_1_2)
{
extendedFeatures.vulkan12Features.pNext = deviceFeatures2.pNext;
@@ -566,6 +570,16 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
m_features.add("realtime-clock");
}
+ if (extendedFeatures.meshShaderFeatures.meshShader)
+ {
+ deviceExtensions.add(VK_EXT_MESH_SHADER_EXTENSION_NAME);
+
+ extendedFeatures.meshShaderFeatures.pNext = (void*)deviceCreateInfo.pNext;
+ deviceCreateInfo.pNext = &extendedFeatures.meshShaderFeatures;
+
+ m_features.add("mesh-shader");
+ }
+
if (_hasAnySetBits(
extendedFeatures.vulkan12Features,
offsetof(VkPhysicalDeviceVulkan12Features, pNext) + sizeof(void*)))
@@ -578,10 +592,30 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 };
VkPhysicalDeviceRayTracingPipelinePropertiesKHR rtProps = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR };
+ VkPhysicalDeviceSubgroupProperties subgroupProps = {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES };
+ rtProps.pNext = extendedProps.pNext;
extendedProps.pNext = &rtProps;
+ subgroupProps.pNext = extendedProps.pNext;
+ extendedProps.pNext = &subgroupProps;
m_api.vkGetPhysicalDeviceProperties2(m_api.m_physicalDevice, &extendedProps);
m_api.m_rtProperties = rtProps;
+ // Approximate DX12's WaveOps boolean
+ if(subgroupProps.supportedOperations &
+ ( VK_SUBGROUP_FEATURE_BASIC_BIT
+ | VK_SUBGROUP_FEATURE_VOTE_BIT
+ | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT
+ | VK_SUBGROUP_FEATURE_BALLOT_BIT
+ | VK_SUBGROUP_FEATURE_SHUFFLE_BIT
+ | VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT
+ | VK_SUBGROUP_FEATURE_CLUSTERED_BIT
+ | VK_SUBGROUP_FEATURE_QUAD_BIT
+ | VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV))
+ {
+ m_features.add("wave-ops");
+ }
+
uint32_t extensionCount = 0;
m_api.vkEnumerateDeviceExtensionProperties(
m_api.m_physicalDevice, NULL, &extensionCount, NULL);