Skip to content

Commit 16d601b

Browse files
authored
Emit layout blocks for stage interfaces in Vulkan (#2274)
The VkShaderGenerator was earlier flattening the VertexData into separate layout entries. While this is valid syntax, it is preferred to use the same struct as glsl to be consistent.
1 parent ff9865d commit 16d601b

3 files changed

Lines changed: 22 additions & 19 deletions

File tree

.github/workflows/main.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ jobs:
198198
python Scripts/mxdoc.py --docType md ../libraries/pbrlib/pbrlib_defs.mtlx
199199
python Scripts/mxdoc.py --docType html ../libraries/bxdf/standard_surface.mtlx
200200
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target glsl
201+
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target vulkan
201202
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target osl
202203
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target mdl
203204
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target msl
@@ -209,7 +210,8 @@ jobs:
209210
C:/vcpkg/vcpkg install glslang[tools] --triplet=x64-windows-release
210211
C:/vcpkg/installed/x64-windows-release/tools/glslang/glslangValidator.exe -v
211212
python python/Scripts/generateshader.py resources/Materials/Examples --target glsl --validator C:/vcpkg/installed/x64-windows-release/tools/glslang/glslangValidator.exe
212-
python python/Scripts/generateshader.py resources/Materials/Examples --target essl --validator C:/vcpkg/installed/x64-windows-release/tools/glslang/glslangValidator.exe
213+
python python/Scripts/generateshader.py resources/Materials/Examples/StandardSurface --target essl --validator C:/vcpkg/installed/x64-windows-release/tools/glslang/glslangValidator.exe
214+
python python/Scripts/generateshader.py resources/Materials/Examples/StandardSurface --target vulkan --validator C:/vcpkg/installed/x64-windows-release/tools/glslang/glslangValidator.exe
213215
214216
- name: Shader Validation Tests (MacOS)
215217
if: matrix.test_shaders == 'ON' && runner.os == 'macOS'

source/MaterialXGenGlsl/VkShaderGenerator.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,14 @@ void VkShaderGenerator::emitInputs(GenContext& context, ShaderStage& stage) cons
5454
const VariableBlock& vertexData = stage.getInputBlock(HW::VERTEX_DATA);
5555
if (!vertexData.empty())
5656
{
57-
emitComment("Inputs: " + vertexData.getName(), stage);
58-
for (size_t i = 0; i < vertexData.size(); ++i)
59-
{
60-
61-
emitLineBegin(stage);
62-
emitString("layout (location = " + std::to_string(i) + ") ", stage);
63-
emitVariableDeclaration(vertexData[i], _syntax->getInputQualifier(), context, stage, false);
64-
emitString(Syntax::SEMICOLON, stage);
65-
emitLineEnd(stage, false);
66-
}
57+
emitString("layout (location = " + std::to_string(vertexDataLocation) + ") " +
58+
_syntax->getInputQualifier() + " " + vertexData.getName(), stage);
59+
emitLineBreak(stage);
60+
emitScopeBegin(stage);
61+
emitVariableDeclarations(vertexData, EMPTY_STRING, Syntax::SEMICOLON, context, stage, false);
62+
emitScopeEnd(stage, false, false);
63+
emitString(" " + vertexData.getInstance() + Syntax::SEMICOLON, stage);
64+
emitLineBreak(stage);
6765
emitLineBreak(stage);
6866
}
6967
}
@@ -81,14 +79,14 @@ void VkShaderGenerator::emitOutputs(GenContext& context, ShaderStage& stage) con
8179
const VariableBlock& vertexData = stage.getOutputBlock(HW::VERTEX_DATA);
8280
if (!vertexData.empty())
8381
{
84-
for (size_t i = 0; i < vertexData.size(); ++i)
85-
{
86-
emitLineBegin(stage);
87-
emitString("layout (location = " + std::to_string(i) + ") ", stage);
88-
emitVariableDeclaration(vertexData[i], _syntax->getOutputQualifier(), context, stage, false);
89-
emitString(Syntax::SEMICOLON, stage);
90-
emitLineEnd(stage, false);
91-
}
82+
emitString("layout (location = " + std::to_string(vertexDataLocation) + ") " +
83+
_syntax->getOutputQualifier() + " " + vertexData.getName(), stage);
84+
emitLineBreak(stage);
85+
emitScopeBegin(stage);
86+
emitVariableDeclarations(vertexData, EMPTY_STRING, Syntax::SEMICOLON, context, stage, false);
87+
emitScopeEnd(stage, false, false);
88+
emitString(" " + vertexData.getInstance() + Syntax::SEMICOLON, stage);
89+
emitLineBreak(stage);
9290
emitLineBreak(stage);
9391
}
9492
}

source/MaterialXGenGlsl/VkShaderGenerator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ class MX_GENGLSL_API VkShaderGenerator : public GlslShaderGenerator
5757
HwResourceBindingContextPtr getResourceBindingContext(GenContext&) const override;
5858

5959
VkResourceBindingContextPtr _resourceBindingCtx = nullptr;
60+
61+
// Vertex data interface location to bind between stages
62+
int vertexDataLocation = 0;
6063
};
6164

6265
MATERIALX_NAMESPACE_END

0 commit comments

Comments
 (0)