summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-glsl.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 /source/slang/slang-emit-glsl.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 'source/slang/slang-emit-glsl.cpp')
-rw-r--r--source/slang/slang-emit-glsl.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp
index c097de5b9..f82a76d4a 100644
--- a/source/slang/slang-emit-glsl.cpp
+++ b/source/slang/slang-emit-glsl.cpp
@@ -47,6 +47,7 @@ SlangResult GLSLSourceEmitter::init()
case Stage::Amplification:
{
_requireGLSLExtension(UnownedStringSlice::fromLiteral("GL_EXT_mesh_shader"));
+ _requireSPIRVVersion(SemanticVersion(1, 4));
break;
}
default: break;
@@ -845,7 +846,7 @@ void GLSLSourceEmitter::_maybeEmitGLSLBuiltin(IRGlobalParam* var, UnownedStringS
// SLANG_ASSERT(layout && "Mesh shader builtin output has no layout");
// SLANG_ASSERT(layout->usesResourceKind(LayoutResourceKind::VaryingOutput));
// emitVarModifiers(layout, var, arrayType);
- emitMeshOutputModifiers(var);
+ emitMeshShaderModifiers(var);
m_writer->emit("out");
m_writer->emit(" ");
m_writer->emit(elementTypeName);
@@ -1186,6 +1187,11 @@ void GLSLSourceEmitter::emitEntryPointAttributesImpl(IRFunc* irFunc, IREntryPoin
}
}
break;
+ case Stage::Amplification:
+ {
+ emitLocalSizeLayout();
+ }
+ break;
// TODO: There are other stages that will need this kind of handling.
default:
break;
@@ -1211,7 +1217,7 @@ void GLSLSourceEmitter::_emitGLSLPerVertexVaryingFragmentInput(IRGlobalParam* pa
emitVarModifiers(layout, param, type);
- emitRateQualifiers(param);
+ emitRateQualifiersAndAddressSpace(param);
auto name = getName(param);
StringSliceLoc nameAndLoc(name.getUnownedSlice());
@@ -2440,9 +2446,13 @@ void GLSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unhandled type");
}
-void GLSLSourceEmitter::emitRateQualifiersImpl(IRRate* rate)
+void GLSLSourceEmitter::emitRateQualifiersAndAddressSpaceImpl(IRRate* rate, IRIntegerValue addressSpace)
{
- if (as<IRConstExprRate>(rate))
+ if(addressSpace == SpvStorageClassTaskPayloadWorkgroupEXT)
+ {
+ m_writer->emit("taskPayloadSharedEXT ");
+ }
+ else if (as<IRConstExprRate>(rate))
{
m_writer->emit("const ");
@@ -2565,7 +2575,7 @@ void GLSLSourceEmitter::emitPackOffsetModifier(IRInst* varInst, IRType* valueTyp
m_writer->emit(")\n");
}
-void GLSLSourceEmitter::emitMeshOutputModifiersImpl(IRInst* varInst)
+void GLSLSourceEmitter::emitMeshShaderModifiersImpl(IRInst* varInst)
{
if(varInst->findDecoration<IRGLSLPrimitivesRateDecoration>())
{