mirror of
https://github.com/KhronosGroup/glslang
synced 2024-09-19 12:19:53 +00:00
Fix crash with --resource-set-binding [n] (common set form, not per-register form)
--resource-set-binding has a mode which allows per-register assignments of bindings and descriptor sets on the command line, and another accepting a single descriptor set value to assign to all variables. The former worked, but the latter would crash when assigning the values. This fixes it, and makes the former case a bit more robust against premature termination of the pre-register values, which must come in (regname,set,binding) triples. This also allows the form "--resource-set-binding stage setnum", which was mentioned in the usage message, but did not parse. The operation of the per-register form of this option is unchanged.
This commit is contained in:
parent
91e69c03bd
commit
52017192e5
@ -289,31 +289,29 @@ void ProcessResourceSetBindingBase(int& argc, char**& argv, std::array<std::vect
|
|||||||
usage();
|
usage();
|
||||||
|
|
||||||
if (!isdigit(argv[1][0])) {
|
if (!isdigit(argv[1][0])) {
|
||||||
if (argc < 5) // this form needs one more argument
|
if (argc < 3) // this form needs one more argument
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
// Parse form: --argname stage base
|
// Parse form: --argname stage [regname set base...], or:
|
||||||
|
// --argname stage set
|
||||||
const EShLanguage lang = FindLanguage(argv[1], false);
|
const EShLanguage lang = FindLanguage(argv[1], false);
|
||||||
|
|
||||||
base[lang].push_back(argv[2]);
|
argc--;
|
||||||
base[lang].push_back(argv[3]);
|
argv++;
|
||||||
base[lang].push_back(argv[4]);
|
|
||||||
argc -= 4;
|
while (argc > 1 && argv[1] != nullptr && argv[1][0] != '-') {
|
||||||
argv += 4;
|
base[lang].push_back(argv[1]);
|
||||||
while(argv[1] != NULL) {
|
|
||||||
if(argv[1][0] != '-') {
|
argc--;
|
||||||
base[lang].push_back(argv[1]);
|
argv++;
|
||||||
base[lang].push_back(argv[2]);
|
|
||||||
base[lang].push_back(argv[3]);
|
|
||||||
argc -= 3;
|
|
||||||
argv += 3;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Must have one arg, or a multiple of three (for [regname set binding] triples)
|
||||||
|
if (base[lang].size() != 1 && (base[lang].size() % 3) != 0)
|
||||||
|
usage();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Parse form: --argname base
|
// Parse form: --argname set
|
||||||
for (int lang=0; lang<EShLangCount; ++lang)
|
for (int lang=0; lang<EShLangCount; ++lang)
|
||||||
base[lang].push_back(argv[1]);
|
base[lang].push_back(argv[1]);
|
||||||
|
|
||||||
@ -1187,7 +1185,10 @@ void usage()
|
|||||||
" --ku synonym for --keep-uncalled\n"
|
" --ku synonym for --keep-uncalled\n"
|
||||||
" --no-storage-format use Unknown image format\n"
|
" --no-storage-format use Unknown image format\n"
|
||||||
" --nsf synonym for --no-storage-format\n"
|
" --nsf synonym for --no-storage-format\n"
|
||||||
" --resource-set-binding [stage] num descriptor set and binding for resources\n"
|
" --resource-set-binding [stage] name set binding\n"
|
||||||
|
" Set descriptor set and binding for individual resources\n"
|
||||||
|
" --resource-set-binding [stage] set\n"
|
||||||
|
" Set descriptor set for all resources\n"
|
||||||
" --rsb [stage] type set binding synonym for --resource-set-binding\n"
|
" --rsb [stage] type set binding synonym for --resource-set-binding\n"
|
||||||
" --shift-image-binding [stage] num base binding number for images (uav)\n"
|
" --shift-image-binding [stage] num base binding number for images (uav)\n"
|
||||||
" --sib [stage] num synonym for --shift-image-binding\n"
|
" --sib [stage] num synonym for --shift-image-binding\n"
|
||||||
|
66
Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out
Normal file
66
Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
hlsl.explicitDescriptorSet.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 31
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability Sampled1D
|
||||||
|
Capability SampledBuffer
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 19
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 500
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "@main("
|
||||||
|
Name 13 "g_sSamp2_amb"
|
||||||
|
Name 19 "@entryPointOutput"
|
||||||
|
Name 21 "g_sSamp"
|
||||||
|
Name 24 "g_tTex1df4"
|
||||||
|
Name 25 "$Global"
|
||||||
|
MemberName 25($Global) 0 "floatval_amb"
|
||||||
|
Name 27 ""
|
||||||
|
Name 30 "floatbuff"
|
||||||
|
Decorate 13(g_sSamp2_amb) DescriptorSet 3
|
||||||
|
Decorate 13(g_sSamp2_amb) Binding 10
|
||||||
|
Decorate 19(@entryPointOutput) Location 0
|
||||||
|
Decorate 21(g_sSamp) DescriptorSet 3
|
||||||
|
Decorate 21(g_sSamp) Binding 11
|
||||||
|
Decorate 24(g_tTex1df4) DescriptorSet 3
|
||||||
|
Decorate 24(g_tTex1df4) Binding 20
|
||||||
|
MemberDecorate 25($Global) 0 Offset 0
|
||||||
|
Decorate 25($Global) Block
|
||||||
|
Decorate 27 DescriptorSet 3
|
||||||
|
Decorate 30(floatbuff) DescriptorSet 3
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypeFunction 7(fvec4)
|
||||||
|
11: TypeSampler
|
||||||
|
12: TypePointer UniformConstant 11
|
||||||
|
13(g_sSamp2_amb): 12(ptr) Variable UniformConstant
|
||||||
|
14: 6(float) Constant 0
|
||||||
|
15: 7(fvec4) ConstantComposite 14 14 14 14
|
||||||
|
18: TypePointer Output 7(fvec4)
|
||||||
|
19(@entryPointOutput): 18(ptr) Variable Output
|
||||||
|
21(g_sSamp): 12(ptr) Variable UniformConstant
|
||||||
|
22: TypeImage 6(float) 1D sampled format:Unknown
|
||||||
|
23: TypePointer UniformConstant 22
|
||||||
|
24(g_tTex1df4): 23(ptr) Variable UniformConstant
|
||||||
|
25($Global): TypeStruct 6(float)
|
||||||
|
26: TypePointer Uniform 25($Global)
|
||||||
|
27: 26(ptr) Variable Uniform
|
||||||
|
28: TypeImage 6(float) Buffer sampled format:R32f
|
||||||
|
29: TypePointer UniformConstant 28
|
||||||
|
30(floatbuff): 29(ptr) Variable UniformConstant
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
20: 7(fvec4) FunctionCall 9(@main()
|
||||||
|
Store 19(@entryPointOutput) 20
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
9(@main(): 7(fvec4) Function None 8
|
||||||
|
10: Label
|
||||||
|
ReturnValue 15
|
||||||
|
FunctionEnd
|
66
Test/baseResults/hlsl.explicitDescriptorSet.frag.out
Normal file
66
Test/baseResults/hlsl.explicitDescriptorSet.frag.out
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
hlsl.explicitDescriptorSet.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 31
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability Sampled1D
|
||||||
|
Capability SampledBuffer
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 19
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 500
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "@main("
|
||||||
|
Name 13 "g_sSamp2_amb"
|
||||||
|
Name 19 "@entryPointOutput"
|
||||||
|
Name 21 "g_sSamp"
|
||||||
|
Name 24 "g_tTex1df4"
|
||||||
|
Name 25 "$Global"
|
||||||
|
MemberName 25($Global) 0 "floatval_amb"
|
||||||
|
Name 27 ""
|
||||||
|
Name 30 "floatbuff"
|
||||||
|
Decorate 13(g_sSamp2_amb) DescriptorSet 4
|
||||||
|
Decorate 13(g_sSamp2_amb) Binding 10
|
||||||
|
Decorate 19(@entryPointOutput) Location 0
|
||||||
|
Decorate 21(g_sSamp) DescriptorSet 4
|
||||||
|
Decorate 21(g_sSamp) Binding 11
|
||||||
|
Decorate 24(g_tTex1df4) DescriptorSet 4
|
||||||
|
Decorate 24(g_tTex1df4) Binding 20
|
||||||
|
MemberDecorate 25($Global) 0 Offset 0
|
||||||
|
Decorate 25($Global) Block
|
||||||
|
Decorate 27 DescriptorSet 4
|
||||||
|
Decorate 30(floatbuff) DescriptorSet 4
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypeFunction 7(fvec4)
|
||||||
|
11: TypeSampler
|
||||||
|
12: TypePointer UniformConstant 11
|
||||||
|
13(g_sSamp2_amb): 12(ptr) Variable UniformConstant
|
||||||
|
14: 6(float) Constant 0
|
||||||
|
15: 7(fvec4) ConstantComposite 14 14 14 14
|
||||||
|
18: TypePointer Output 7(fvec4)
|
||||||
|
19(@entryPointOutput): 18(ptr) Variable Output
|
||||||
|
21(g_sSamp): 12(ptr) Variable UniformConstant
|
||||||
|
22: TypeImage 6(float) 1D sampled format:Unknown
|
||||||
|
23: TypePointer UniformConstant 22
|
||||||
|
24(g_tTex1df4): 23(ptr) Variable UniformConstant
|
||||||
|
25($Global): TypeStruct 6(float)
|
||||||
|
26: TypePointer Uniform 25($Global)
|
||||||
|
27: 26(ptr) Variable Uniform
|
||||||
|
28: TypeImage 6(float) Buffer sampled format:R32f
|
||||||
|
29: TypePointer UniformConstant 28
|
||||||
|
30(floatbuff): 29(ptr) Variable UniformConstant
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
20: 7(fvec4) FunctionCall 9(@main()
|
||||||
|
Store 19(@entryPointOutput) 20
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
9(@main(): 7(fvec4) Function None 8
|
||||||
|
10: Label
|
||||||
|
ReturnValue 15
|
||||||
|
FunctionEnd
|
15
Test/hlsl.explicitDescriptorSet.frag
Normal file
15
Test/hlsl.explicitDescriptorSet.frag
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
SamplerState g_sSamp : register(s1);
|
||||||
|
|
||||||
|
Texture1D <float4> g_tTex1df4 : register(t0);
|
||||||
|
|
||||||
|
SamplerState g_sSamp2_amb;
|
||||||
|
uniform float floatval_amb;
|
||||||
|
|
||||||
|
Buffer<float> floatbuff;
|
||||||
|
|
||||||
|
float4 main() : SV_Target0
|
||||||
|
{
|
||||||
|
g_sSamp2_amb;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -97,6 +97,12 @@ echo Configuring HLSL descriptor set and binding number manually
|
|||||||
$EXE -V -D -e main -H hlsl.multiDescriptorSet.frag --rsb frag t0 0 0 t1 1 0 s0 0 1 s1 1 1 b0 2 0 b1 2 1 b2 2 2 > $TARGETDIR/hlsl.multiDescriptorSet.frag.out
|
$EXE -V -D -e main -H hlsl.multiDescriptorSet.frag --rsb frag t0 0 0 t1 1 0 s0 0 1 s1 1 1 b0 2 0 b1 2 1 b2 2 2 > $TARGETDIR/hlsl.multiDescriptorSet.frag.out
|
||||||
diff -b $BASEDIR/hlsl.multiDescriptorSet.frag.out $TARGETDIR/hlsl.multiDescriptorSet.frag.out || HASERROR=1
|
diff -b $BASEDIR/hlsl.multiDescriptorSet.frag.out $TARGETDIR/hlsl.multiDescriptorSet.frag.out || HASERROR=1
|
||||||
|
|
||||||
|
$EXE -V -D -e main -H hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb 4 > $TARGETDIR/hlsl.explicitDescriptorSet.frag.out
|
||||||
|
diff -b $BASEDIR/hlsl.explicitDescriptorSet.frag.out $TARGETDIR/hlsl.explicitDescriptorSet.frag.out || HASERROR=1
|
||||||
|
|
||||||
|
$EXE -V -D -e main -H hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb frag 3 > $TARGETDIR/hlsl.explicitDescriptorSet-2.frag.out
|
||||||
|
diff -b $BASEDIR/hlsl.explicitDescriptorSet-2.frag.out $TARGETDIR/hlsl.explicitDescriptorSet-2.frag.out || HASERROR=1
|
||||||
|
|
||||||
#
|
#
|
||||||
# Testing location error
|
# Testing location error
|
||||||
#
|
#
|
||||||
|
@ -404,6 +404,11 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver
|
|||||||
{
|
{
|
||||||
if (type.getQualifier().hasSet())
|
if (type.getQualifier().hasSet())
|
||||||
return type.getQualifier().layoutSet;
|
return type.getQualifier().layoutSet;
|
||||||
|
|
||||||
|
// If a command line or API option requested a single descriptor set, use that (if not overrided by spaceN)
|
||||||
|
if (baseResourceSetBinding.size() == 1)
|
||||||
|
return atoi(baseResourceSetBinding[0].c_str());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5370,7 +5370,7 @@ void HlslParseContext::handleRegister(const TSourceLoc& loc, TQualifier& qualifi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: learn what all these really mean and how they interact with regNumber and subComponent
|
// TODO: learn what all these really mean and how they interact with regNumber and subComponent
|
||||||
std::vector<std::string> resourceInfo = intermediate.getResourceSetBinding();
|
const std::vector<std::string>& resourceInfo = intermediate.getResourceSetBinding();
|
||||||
switch (std::tolower(desc[0])) {
|
switch (std::tolower(desc[0])) {
|
||||||
case 'b':
|
case 'b':
|
||||||
case 't':
|
case 't':
|
||||||
@ -5378,11 +5378,17 @@ void HlslParseContext::handleRegister(const TSourceLoc& loc, TQualifier& qualifi
|
|||||||
case 's':
|
case 's':
|
||||||
case 'u':
|
case 'u':
|
||||||
qualifier.layoutBinding = regNumber + subComponent;
|
qualifier.layoutBinding = regNumber + subComponent;
|
||||||
for (auto it = resourceInfo.cbegin(); it != resourceInfo.cend(); it = it + 3) {
|
|
||||||
if (strcmp(desc.c_str(), it[0].c_str()) == 0) {
|
// This handles per-register layout sets numbers. For the global mode which sets
|
||||||
qualifier.layoutSet = atoi(it[1].c_str());
|
// every symbol to the same value, see setLinkageLayoutSets().
|
||||||
qualifier.layoutBinding = atoi(it[2].c_str()) + subComponent;
|
if ((resourceInfo.size() % 3) == 0) {
|
||||||
break;
|
// Apply per-symbol resource set and binding.
|
||||||
|
for (auto it = resourceInfo.cbegin(); it != resourceInfo.cend(); it = it + 3) {
|
||||||
|
if (strcmp(desc.c_str(), it[0].c_str()) == 0) {
|
||||||
|
qualifier.layoutSet = atoi(it[1].c_str());
|
||||||
|
qualifier.layoutBinding = atoi(it[2].c_str()) + subComponent;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user