summaryrefslogtreecommitdiffstats
path: root/tools/gfx/vulkan/vk-device.cpp
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2023-09-12 11:13:11 +0800
committerGitHub <noreply@github.com>2023-09-11 20:13:11 -0700
commit09854a4596019ddb3bb315b8836b5c88e718cdc7 (patch)
tree1556ae3e00da0fac91343f159b52cee1231a7fab /tools/gfx/vulkan/vk-device.cpp
parent87bb0b503544f1b8c6ec818e25c695b31cda24b7 (diff)
Add Mesh and Task shader support to GFX (#3190)
* Bump vulkan headers Also just use vulkan-headers as a submodule * Add drawMeshTasks to gfx graphics pipelines * Add DispatchMesh overload with no payload, with GLSL intrinsic * Require spirv 1.4 for mesh shaders * Add vulkan mesh shader feature discovery * Add mesh shader stage bits to vk-util * Add mesh and task shader support to render-test * Add mesh and task tests * Preserve "payload" specifier in task shaders * Add mesh shader pipeline support to gfx * Add TODO * Add numThreads attribute for amplification stage * Add payload to task shader test * Drop dependency on d3dx12 * Allow passing payloads from task to mesh shaders * regenerate vs projects * check DispatchMesh name correctly * Add mesh shader tests to failing tests * Detect wave-ops feature on vulkan * Add fuse-product to expected failures This fails because the global varaible `count` is not initialized * Add required extension to WaveMaskMatch SPIR-V impl * Remove meshShader member from pipeline desc * Identify mesh shader support on d3d12
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);