Commit be283550 by steve-lunarg

WIP: HLSL: hlsl register class iomapping

Adds --hlsl-iomap option to perform IO mapping in HLSL register space. --shift-cbuffer-binding is now a synonym for --shift-ubo-binding. The idea way to do this seems to be passing in a dedicated IO resolver, but that would require more intrusive restructuring, so maybe best for its own PR. The TDefaultHlslIoResolver class and the former TDefaultIoResolver class share quite a bit of mechanism in a common base class. TODO: tbuffers are landing in the wrong register class, which needs some investigation. They're either wrong upstream, or the detection in the resolver is wrong.
parent ba5cc2fa
...@@ -87,6 +87,7 @@ enum TOptions { ...@@ -87,6 +87,7 @@ enum TOptions {
EOptionNoStorageFormat = (1 << 21), EOptionNoStorageFormat = (1 << 21),
EOptionKeepUncalled = (1 << 22), EOptionKeepUncalled = (1 << 22),
EOptionHlslOffsets = (1 << 23), EOptionHlslOffsets = (1 << 23),
EOptionHlslIoMapping = (1 << 24),
}; };
// //
...@@ -166,6 +167,7 @@ std::array<unsigned int, EShLangCount> baseTextureBinding; ...@@ -166,6 +167,7 @@ std::array<unsigned int, EShLangCount> baseTextureBinding;
std::array<unsigned int, EShLangCount> baseImageBinding; std::array<unsigned int, EShLangCount> baseImageBinding;
std::array<unsigned int, EShLangCount> baseUboBinding; std::array<unsigned int, EShLangCount> baseUboBinding;
std::array<unsigned int, EShLangCount> baseSsboBinding; std::array<unsigned int, EShLangCount> baseSsboBinding;
std::array<unsigned int, EShLangCount> baseUavBinding;
// //
// Create the default name for saving a binary if -o is not provided. // Create the default name for saving a binary if -o is not provided.
...@@ -256,6 +258,7 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem ...@@ -256,6 +258,7 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
baseImageBinding.fill(0); baseImageBinding.fill(0);
baseUboBinding.fill(0); baseUboBinding.fill(0);
baseSsboBinding.fill(0); baseSsboBinding.fill(0);
baseUavBinding.fill(0);
ExecutableName = argv[0]; ExecutableName = argv[0];
workItems.reserve(argc); workItems.reserve(argc);
...@@ -285,12 +288,19 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem ...@@ -285,12 +288,19 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
ProcessBindingBase(argc, argv, baseImageBinding); ProcessBindingBase(argc, argv, baseImageBinding);
} else if (lowerword == "shift-ubo-bindings" || // synonyms } else if (lowerword == "shift-ubo-bindings" || // synonyms
lowerword == "shift-ubo-binding" || lowerword == "shift-ubo-binding" ||
lowerword == "sub") { lowerword == "shift-cbuffer-bindings" ||
lowerword == "shift-cbuffer-binding" ||
lowerword == "sub" ||
lowerword == "scb") {
ProcessBindingBase(argc, argv, baseUboBinding); ProcessBindingBase(argc, argv, baseUboBinding);
} else if (lowerword == "shift-ssbo-bindings" || // synonyms } else if (lowerword == "shift-ssbo-bindings" || // synonyms
lowerword == "shift-ssbo-binding" || lowerword == "shift-ssbo-binding" ||
lowerword == "sbb") { lowerword == "sbb") {
ProcessBindingBase(argc, argv, baseSsboBinding); ProcessBindingBase(argc, argv, baseSsboBinding);
} else if (lowerword == "shift-uav-bindings" || // synonyms
lowerword == "shift-uav-binding" ||
lowerword == "suavb") {
ProcessBindingBase(argc, argv, baseUavBinding);
} else if (lowerword == "auto-map-bindings" || // synonyms } else if (lowerword == "auto-map-bindings" || // synonyms
lowerword == "auto-map-binding" || lowerword == "auto-map-binding" ||
lowerword == "amb") { lowerword == "amb") {
...@@ -326,6 +336,10 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem ...@@ -326,6 +336,10 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
Options |= EOptionKeepUncalled; Options |= EOptionKeepUncalled;
} else if (lowerword == "hlsl-offsets") { } else if (lowerword == "hlsl-offsets") {
Options |= EOptionHlslOffsets; Options |= EOptionHlslOffsets;
} else if (lowerword == "hlsl-iomap" ||
lowerword == "hlsl-iomapper" ||
lowerword == "hlsl-iomapping") {
Options |= EOptionHlslIoMapping;
} else { } else {
usage(); usage();
} }
...@@ -577,9 +591,13 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits) ...@@ -577,9 +591,13 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
shader->setShiftImageBinding(baseImageBinding[compUnit.stage]); shader->setShiftImageBinding(baseImageBinding[compUnit.stage]);
shader->setShiftUboBinding(baseUboBinding[compUnit.stage]); shader->setShiftUboBinding(baseUboBinding[compUnit.stage]);
shader->setShiftSsboBinding(baseSsboBinding[compUnit.stage]); shader->setShiftSsboBinding(baseSsboBinding[compUnit.stage]);
shader->setShiftUavBinding(baseUavBinding[compUnit.stage]);
shader->setFlattenUniformArrays((Options & EOptionFlattenUniformArrays) != 0); shader->setFlattenUniformArrays((Options & EOptionFlattenUniformArrays) != 0);
shader->setNoStorageFormat((Options & EOptionNoStorageFormat) != 0); shader->setNoStorageFormat((Options & EOptionNoStorageFormat) != 0);
if (Options & EOptionHlslIoMapping)
shader->setHlslIoMapping(true);
if (Options & EOptionAutoMapBindings) if (Options & EOptionAutoMapBindings)
shader->setAutoMapBindings(true); shader->setAutoMapBindings(true);
...@@ -982,11 +1000,15 @@ void usage() ...@@ -982,11 +1000,15 @@ void usage()
" --sib [stage] num synonym for --shift-image-binding\n" " --sib [stage] num synonym for --shift-image-binding\n"
"\n" "\n"
" --shift-UBO-binding [stage] num set base binding number for UBOs\n" " --shift-UBO-binding [stage] num set base binding number for UBOs\n"
" --shift-cbuffer-binding [stage] num synonym for --shift-UBO-binding\n"
" --sub [stage] num synonym for --shift-UBO-binding\n" " --sub [stage] num synonym for --shift-UBO-binding\n"
"\n" "\n"
" --shift-ssbo-binding [stage] num set base binding number for SSBOs\n" " --shift-ssbo-binding [stage] num set base binding number for SSBOs\n"
" --sbb [stage] num synonym for --shift-ssbo-binding\n" " --sbb [stage] num synonym for --shift-ssbo-binding\n"
"\n" "\n"
" --shift-uav-binding [stage] num set base binding number for UAVs\n"
" --suavb [stage] num synonym for --shift-uav-binding\n"
"\n"
" --auto-map-bindings automatically bind uniform variables without\n" " --auto-map-bindings automatically bind uniform variables without\n"
" explicit bindings.\n" " explicit bindings.\n"
" --amb synonym for --auto-map-bindings\n" " --amb synonym for --auto-map-bindings\n"
...@@ -1009,6 +1031,8 @@ void usage() ...@@ -1009,6 +1031,8 @@ void usage()
"\n" "\n"
" --hlsl-offsets Allow block offsets to follow HLSL rules instead of GLSL rules.\n" " --hlsl-offsets Allow block offsets to follow HLSL rules instead of GLSL rules.\n"
" Works independently of source language.\n" " Works independently of source language.\n"
"\n"
" --hlsl-iomap Perform IO mapping in HLSL register space.\n"
); );
exit(EFailUsage); exit(EFailUsage);
......
hlsl.automap.frag
Uniform reflection:
t1: offset -1, type 8b5d, size 1, index -1, binding 11
t2: offset -1, type 8b5e, size 1, index -1, binding 12
t3: offset -1, type 8b5f, size 1, index -1, binding 13
t4.@data: offset 0, type 8b52, size 1, index 0, binding -1
t5.@data: offset 0, type 1405, size 0, index 1, binding -1
t6: offset -1, type 8dc2, size 1, index -1, binding 16
s1: offset -1, type 0, size 1, index -1, binding 31
s2: offset -1, type 0, size 1, index -1, binding 32
u1: offset -1, type 904c, size 1, index -1, binding 41
u2: offset -1, type 904d, size 1, index -1, binding 42
u3: offset -1, type 904e, size 1, index -1, binding 43
u4: offset -1, type 9051, size 1, index -1, binding 44
u5.@data: offset 0, type 1405, size 0, index 2, binding -1
u6.@data: offset 0, type 1406, size 1, index 3, binding -1
cb1: offset 0, type 1404, size 1, index 4, binding -1
Uniform block reflection:
t4: offset -1, type ffffffff, size 0, index -1, binding 14
t5: offset -1, type ffffffff, size 0, index -1, binding 15
u5: offset -1, type ffffffff, size 0, index -1, binding 45
u6: offset -1, type ffffffff, size 0, index -1, binding 46
cb: offset -1, type ffffffff, size 4, index -1, binding 51
Vertex attribute reflection:
// Test register class offsets for different resource types
SamplerState s1 : register(s1);
SamplerComparisonState s2 : register(s2);
Texture1D <float4> t1 : register(t1);
Texture2D <float4> t2 : register(t2);
Texture3D <float4> t3 : register(t3);
StructuredBuffer<float4> t4 : register(t4);
ByteAddressBuffer t5 : register(t5);
Buffer<float4> t6 : register(t6);
RWTexture1D <float4> u1 : register(u1);
RWTexture2D <float4> u2 : register(u2);
RWTexture3D <float4> u3 : register(u3);
RWBuffer <float> u4 : register(u4);
RWByteAddressBuffer u5 : register(u5);
RWStructuredBuffer<float> u6 : register(u6);
AppendStructuredBuffer<float> u7 : register(u7);
ConsumeStructuredBuffer<float> u8 : register(u8);
cbuffer cb : register(b1) {
int cb1;
};
// tbuffer tb : register(t7) {
// int tb1;
// };
float4 main() : SV_Target0
{
t1;
t2;
t3;
t4[0];
t5.Load(0);
t6;
s1;
s2;
u1;
u2;
u3;
u4[0];
u5.Load(0);
u6[0];
u7[0];
u8[0];
cb1;
// tb1; TODO: wrong type?
return 0;
}
...@@ -35,7 +35,8 @@ $EXE -D -e flizv -l -q -C -V hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.v ...@@ -35,7 +35,8 @@ $EXE -D -e flizv -l -q -C -V hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.v
diff -b $BASEDIR/hlsl.reflection.vert.out $TARGETDIR/hlsl.reflection.vert.out || HASERROR=1 diff -b $BASEDIR/hlsl.reflection.vert.out $TARGETDIR/hlsl.reflection.vert.out || HASERROR=1
$EXE -D -e main -l -q -C -V hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out $EXE -D -e main -l -q -C -V hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out
diff -b $BASEDIR/hlsl.reflection.binding.frag.out $TARGETDIR/hlsl.reflection.binding.frag.out || HASERROR=1 diff -b $BASEDIR/hlsl.reflection.binding.frag.out $TARGETDIR/hlsl.reflection.binding.frag.out || HASERROR=1
$EXE -D -e main -l -q --hlsl-iomap --auto-map-bindings --stb 10 --sbb 20 --ssb 30 --suavb 40 --scb 50 -D -V -e main hlsl.automap.frag > $TARGETDIR/hlsl.automap.frag.out
diff -b $BASEDIR/hlsl.automap.frag.out $TARGETDIR/hlsl.automap.frag.out || HASERROR=1
# #
# multi-threaded test # multi-threaded test
......
...@@ -1559,8 +1559,11 @@ void TShader::setShiftSamplerBinding(unsigned int base) { intermediate->setShift ...@@ -1559,8 +1559,11 @@ void TShader::setShiftSamplerBinding(unsigned int base) { intermediate->setShift
void TShader::setShiftTextureBinding(unsigned int base) { intermediate->setShiftTextureBinding(base); } void TShader::setShiftTextureBinding(unsigned int base) { intermediate->setShiftTextureBinding(base); }
void TShader::setShiftImageBinding(unsigned int base) { intermediate->setShiftImageBinding(base); } void TShader::setShiftImageBinding(unsigned int base) { intermediate->setShiftImageBinding(base); }
void TShader::setShiftUboBinding(unsigned int base) { intermediate->setShiftUboBinding(base); } void TShader::setShiftUboBinding(unsigned int base) { intermediate->setShiftUboBinding(base); }
void TShader::setShiftCbufferBinding(unsigned int base) { intermediate->setShiftUboBinding(base); }
void TShader::setShiftUavBinding(unsigned int base) { intermediate->setShiftUavBinding(base); }
void TShader::setShiftSsboBinding(unsigned int base) { intermediate->setShiftSsboBinding(base); } void TShader::setShiftSsboBinding(unsigned int base) { intermediate->setShiftSsboBinding(base); }
void TShader::setAutoMapBindings(bool map) { intermediate->setAutoMapBindings(map); } void TShader::setAutoMapBindings(bool map) { intermediate->setAutoMapBindings(map); }
void TShader::setHlslIoMapping(bool hlslIoMap) { intermediate->setHlslIoMapping(hlslIoMap); }
void TShader::setFlattenUniformArrays(bool flatten) { intermediate->setFlattenUniformArrays(flatten); } void TShader::setFlattenUniformArrays(bool flatten) { intermediate->setFlattenUniformArrays(flatten); }
void TShader::setNoStorageFormat(bool useUnknownFormat) { intermediate->setNoStorageFormat(useUnknownFormat); } void TShader::setNoStorageFormat(bool useUnknownFormat) { intermediate->setNoStorageFormat(useUnknownFormat); }
......
...@@ -175,11 +175,13 @@ public: ...@@ -175,11 +175,13 @@ public:
shiftImageBinding(0), shiftImageBinding(0),
shiftUboBinding(0), shiftUboBinding(0),
shiftSsboBinding(0), shiftSsboBinding(0),
shiftUavBinding(0),
autoMapBindings(false), autoMapBindings(false),
flattenUniformArrays(false), flattenUniformArrays(false),
useUnknownFormat(false), useUnknownFormat(false),
hlslOffsets(false), hlslOffsets(false),
useStorageBuffer(false) useStorageBuffer(false),
hlslIoMapping(false)
{ {
localSize[0] = 1; localSize[0] = 1;
localSize[1] = 1; localSize[1] = 1;
...@@ -212,6 +214,8 @@ public: ...@@ -212,6 +214,8 @@ public:
unsigned int getShiftUboBinding() const { return shiftUboBinding; } unsigned int getShiftUboBinding() const { return shiftUboBinding; }
void setShiftSsboBinding(unsigned int shift) { shiftSsboBinding = shift; } void setShiftSsboBinding(unsigned int shift) { shiftSsboBinding = shift; }
unsigned int getShiftSsboBinding() const { return shiftSsboBinding; } unsigned int getShiftSsboBinding() const { return shiftSsboBinding; }
void setShiftUavBinding(unsigned int shift) { shiftUavBinding = shift; }
unsigned int getShiftUavBinding() const { return shiftUavBinding; }
void setAutoMapBindings(bool map) { autoMapBindings = map; } void setAutoMapBindings(bool map) { autoMapBindings = map; }
bool getAutoMapBindings() const { return autoMapBindings; } bool getAutoMapBindings() const { return autoMapBindings; }
void setFlattenUniformArrays(bool flatten) { flattenUniformArrays = flatten; } void setFlattenUniformArrays(bool flatten) { flattenUniformArrays = flatten; }
...@@ -222,6 +226,8 @@ public: ...@@ -222,6 +226,8 @@ public:
bool usingHlslOFfsets() const { return hlslOffsets; } bool usingHlslOFfsets() const { return hlslOffsets; }
void setUseStorageBuffer() { useStorageBuffer = true; } void setUseStorageBuffer() { useStorageBuffer = true; }
bool usingStorageBuffer() const { return useStorageBuffer; } bool usingStorageBuffer() const { return useStorageBuffer; }
void setHlslIoMapping(bool b) { hlslIoMapping = b; }
bool usingHlslIoMapping() { return hlslIoMapping; }
void setVersion(int v) { version = v; } void setVersion(int v) { version = v; }
int getVersion() const { return version; } int getVersion() const { return version; }
...@@ -505,11 +511,13 @@ protected: ...@@ -505,11 +511,13 @@ protected:
unsigned int shiftImageBinding; unsigned int shiftImageBinding;
unsigned int shiftUboBinding; unsigned int shiftUboBinding;
unsigned int shiftSsboBinding; unsigned int shiftSsboBinding;
unsigned int shiftUavBinding;
bool autoMapBindings; bool autoMapBindings;
bool flattenUniformArrays; bool flattenUniformArrays;
bool useUnknownFormat; bool useUnknownFormat;
bool hlslOffsets; bool hlslOffsets;
bool useStorageBuffer; bool useStorageBuffer;
bool hlslIoMapping;
typedef std::list<TCall> TGraph; typedef std::list<TCall> TGraph;
TGraph callGraph; TGraph callGraph;
......
...@@ -303,8 +303,11 @@ public: ...@@ -303,8 +303,11 @@ public:
void setShiftTextureBinding(unsigned int base); void setShiftTextureBinding(unsigned int base);
void setShiftImageBinding(unsigned int base); void setShiftImageBinding(unsigned int base);
void setShiftUboBinding(unsigned int base); void setShiftUboBinding(unsigned int base);
void setShiftUavBinding(unsigned int base);
void setShiftCbufferBinding(unsigned int base); // synonym for setShiftUboBinding
void setShiftSsboBinding(unsigned int base); void setShiftSsboBinding(unsigned int base);
void setAutoMapBindings(bool map); void setAutoMapBindings(bool map);
void setHlslIoMapping(bool hlslIoMap);
void setFlattenUniformArrays(bool flatten); void setFlattenUniformArrays(bool flatten);
void setNoStorageFormat(bool useUnknownFormat); void setNoStorageFormat(bool useUnknownFormat);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment