summaryrefslogtreecommitdiff
path: root/tools/gfx/vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx/vulkan')
-rw-r--r--tools/gfx/vulkan/vk-api.h6
-rw-r--r--tools/gfx/vulkan/vk-command-encoder.cpp8
-rw-r--r--tools/gfx/vulkan/vk-command-encoder.h3
-rw-r--r--tools/gfx/vulkan/vk-device.cpp34
-rw-r--r--tools/gfx/vulkan/vk-pipeline-state.cpp5
-rw-r--r--tools/gfx/vulkan/vk-util.cpp4
6 files changed, 59 insertions, 1 deletions
diff --git a/tools/gfx/vulkan/vk-api.h b/tools/gfx/vulkan/vk-api.h
index 127988946..3df6436d9 100644
--- a/tools/gfx/vulkan/vk-api.h
+++ b/tools/gfx/vulkan/vk-api.h
@@ -204,6 +204,7 @@ namespace gfx {
x(vkCmdDebugMarkerBeginEXT) \
x(vkCmdDebugMarkerEndEXT) \
x(vkDebugMarkerSetObjectNameEXT) \
+ x(vkCmdDrawMeshTasksEXT) \
/* */
#define VK_API_ALL_GLOBAL_PROCS(x) \
@@ -262,6 +263,11 @@ struct VulkanExtendedFeatureProperties
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR
};
+ // Mesh shader features
+ VkPhysicalDeviceMeshShaderFeaturesEXT meshShaderFeatures = {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT
+ };
+
// Vulkan 1.2 features.
VkPhysicalDeviceVulkan12Features vulkan12Features = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES};
diff --git a/tools/gfx/vulkan/vk-command-encoder.cpp b/tools/gfx/vulkan/vk-command-encoder.cpp
index dcd33fd19..ddb48833f 100644
--- a/tools/gfx/vulkan/vk-command-encoder.cpp
+++ b/tools/gfx/vulkan/vk-command-encoder.cpp
@@ -1214,6 +1214,14 @@ Result RenderCommandEncoder::drawIndexedInstanced(
return SLANG_OK;
}
+Result RenderCommandEncoder::drawMeshTasks(int x, int y, int z)
+{
+ SLANG_RETURN_ON_FAIL(prepareDraw());
+ auto& api = *m_api;
+ api.vkCmdDrawMeshTasksEXT(m_vkCommandBuffer, x, y, z);
+ return SLANG_OK;
+}
+
void ComputeCommandEncoder::endEncoding() { endEncodingImpl(); }
Result ComputeCommandEncoder::bindPipeline(
diff --git a/tools/gfx/vulkan/vk-command-encoder.h b/tools/gfx/vulkan/vk-command-encoder.h
index 11f557433..ddb980d6a 100644
--- a/tools/gfx/vulkan/vk-command-encoder.h
+++ b/tools/gfx/vulkan/vk-command-encoder.h
@@ -252,6 +252,9 @@ public:
GfxIndex startIndexLocation,
GfxIndex baseVertexLocation,
GfxIndex startInstanceLocation) override;
+
+ virtual SLANG_NO_THROW Result SLANG_MCALL
+ drawMeshTasks(int x, int y, int z) override;
};
class ComputeCommandEncoder
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);
diff --git a/tools/gfx/vulkan/vk-pipeline-state.cpp b/tools/gfx/vulkan/vk-pipeline-state.cpp
index 4be9877af..712811f9a 100644
--- a/tools/gfx/vulkan/vk-pipeline-state.cpp
+++ b/tools/gfx/vulkan/vk-pipeline-state.cpp
@@ -220,7 +220,10 @@ Result PipelineStateImpl::createVKGraphicsPipelineState()
dynamicStates.add(VK_DYNAMIC_STATE_SCISSOR);
dynamicStates.add(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
dynamicStates.add(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
- if (m_device->m_api.m_extendedFeatures.extendedDynamicStateFeatures.extendedDynamicState)
+ // It's not valid to specify VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT when
+ // the pipeline contains a mesh shader.
+ if (!m_program->isMeshShaderProgram() && m_device->m_api.m_extendedFeatures.extendedDynamicStateFeatures.extendedDynamicState)
+
{
dynamicStates.add(VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT);
}
diff --git a/tools/gfx/vulkan/vk-util.cpp b/tools/gfx/vulkan/vk-util.cpp
index 3771b5cc3..e8007805a 100644
--- a/tools/gfx/vulkan/vk-util.cpp
+++ b/tools/gfx/vulkan/vk-util.cpp
@@ -192,6 +192,10 @@ VkShaderStageFlags VulkanUtil::getShaderStage(SlangStage stage)
return VK_SHADER_STAGE_RAYGEN_BIT_KHR;
case SLANG_STAGE_VERTEX:
return VK_SHADER_STAGE_VERTEX_BIT;
+ case SLANG_STAGE_MESH:
+ return VK_SHADER_STAGE_MESH_BIT_EXT;
+ case SLANG_STAGE_AMPLIFICATION:
+ return VK_SHADER_STAGE_TASK_BIT_EXT;
default:
assert(!"unsupported stage.");
return VkShaderStageFlags(-1);