Merge pull request #335 from jekstrand/sampler-params

SPV: Fix pointer address spaces for sampler function parameters
This commit is contained in:
John Kessenich 2016-06-09 20:42:23 -06:00 committed by GitHub
commit 41ebc42926
3 changed files with 51 additions and 46 deletions

View File

@ -227,13 +227,15 @@ spv::StorageClass TranslateStorageClass(const glslang::TType& type)
return spv::StorageClassInput; return spv::StorageClassInput;
else if (type.getQualifier().isPipeOutput()) else if (type.getQualifier().isPipeOutput())
return spv::StorageClassOutput; return spv::StorageClassOutput;
else if (type.getBasicType() == glslang::EbtSampler)
return spv::StorageClassUniformConstant;
else if (type.getBasicType() == glslang::EbtAtomicUint)
return spv::StorageClassAtomicCounter;
else if (type.getQualifier().isUniformOrBuffer()) { else if (type.getQualifier().isUniformOrBuffer()) {
if (type.getQualifier().layoutPushConstant) if (type.getQualifier().layoutPushConstant)
return spv::StorageClassPushConstant; return spv::StorageClassPushConstant;
if (type.getBasicType() == glslang::EbtBlock) if (type.getBasicType() == glslang::EbtBlock)
return spv::StorageClassUniform; return spv::StorageClassUniform;
else if (type.getBasicType() == glslang::EbtAtomicUint)
return spv::StorageClassAtomicCounter;
else else
return spv::StorageClassUniformConstant; return spv::StorageClassUniformConstant;
// TODO: how are we distuingishing between default and non-default non-writable uniforms? Do default uniforms even exist? // TODO: how are we distuingishing between default and non-default non-writable uniforms? Do default uniforms even exist?
@ -2270,7 +2272,9 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF
for (int p = 0; p < (int)parameters.size(); ++p) { for (int p = 0; p < (int)parameters.size(); ++p) {
const glslang::TType& paramType = parameters[p]->getAsTyped()->getType(); const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();
spv::Id typeId = convertGlslangToSpvType(paramType); spv::Id typeId = convertGlslangToSpvType(paramType);
if (paramType.getQualifier().storage != glslang::EvqConstReadOnly) if (paramType.isOpaque())
typeId = builder.makePointer(TranslateStorageClass(paramType), typeId);
else if (paramType.getQualifier().storage != glslang::EvqConstReadOnly)
typeId = builder.makePointer(spv::StorageClassFunction, typeId); typeId = builder.makePointer(spv::StorageClassFunction, typeId);
else else
constReadOnlyParameters.insert(parameters[p]->getAsSymbolNode()->getId()); constReadOnlyParameters.insert(parameters[p]->getAsSymbolNode()->getId());
@ -2686,8 +2690,8 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg
builder.clearAccessChain(); builder.clearAccessChain();
glslangArgs[a]->traverse(this); glslangArgs[a]->traverse(this);
argTypes.push_back(&paramType); argTypes.push_back(&paramType);
// keep outputs as and samplers l-values, evaluate input-only as r-values // keep outputs as and opaque objects l-values, evaluate input-only as r-values
if (qualifiers[a] != glslang::EvqConstReadOnly || paramType.getBasicType() == glslang::EbtSampler) { if (qualifiers[a] != glslang::EvqConstReadOnly || paramType.isOpaque()) {
// save l-value // save l-value
lValues.push_back(builder.getAccessChain()); lValues.push_back(builder.getAccessChain());
} else { } else {
@ -2706,7 +2710,7 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg
for (int a = 0; a < (int)glslangArgs.size(); ++a) { for (int a = 0; a < (int)glslangArgs.size(); ++a) {
const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType(); const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
spv::Id arg; spv::Id arg;
if (paramType.getBasicType() == glslang::EbtSampler) { if (paramType.isOpaque()) {
builder.setAccessChain(lValues[lValueCount]); builder.setAccessChain(lValues[lValueCount]);
arg = builder.accessChainGetLValue(); arg = builder.accessChainGetLValue();
++lValueCount; ++lValueCount;

View File

@ -7,13 +7,13 @@ Linked fragment stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 68 // Id's are bound by 67
Capability Shader Capability Shader
Capability InputAttachment Capability InputAttachment
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 15 27 54 EntryPoint Fragment 4 "main" 15 27 53
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
Source GLSL 400 Source GLSL 400
Name 4 "main" Name 4 "main"
@ -24,27 +24,27 @@ Linked fragment stage:
Name 30 "sub" Name 30 "sub"
Name 35 "subMS" Name 35 "subMS"
Name 42 "isub" Name 42 "isub"
Name 46 "isubMS" Name 45 "isubMS"
Name 54 "ucolor" Name 53 "ucolor"
Name 57 "usub" Name 56 "usub"
Name 62 "usubMS" Name 61 "usubMS"
Decorate 30(sub) DescriptorSet 0 Decorate 30(sub) DescriptorSet 0
Decorate 30(sub) InputAttachmentIndex 1 Decorate 30(sub) InputAttachmentIndex 1
Decorate 35(subMS) DescriptorSet 0 Decorate 35(subMS) DescriptorSet 0
Decorate 35(subMS) InputAttachmentIndex 2 Decorate 35(subMS) InputAttachmentIndex 2
Decorate 42(isub) DescriptorSet 0 Decorate 42(isub) DescriptorSet 0
Decorate 42(isub) InputAttachmentIndex 3 Decorate 42(isub) InputAttachmentIndex 3
Decorate 46(isubMS) DescriptorSet 0 Decorate 45(isubMS) DescriptorSet 0
Decorate 46(isubMS) InputAttachmentIndex 4 Decorate 45(isubMS) InputAttachmentIndex 4
Decorate 57(usub) DescriptorSet 0 Decorate 56(usub) DescriptorSet 0
Decorate 57(usub) InputAttachmentIndex 5 Decorate 56(usub) InputAttachmentIndex 5
Decorate 62(usubMS) DescriptorSet 0 Decorate 61(usubMS) DescriptorSet 0
Decorate 62(usubMS) InputAttachmentIndex 6 Decorate 61(usubMS) InputAttachmentIndex 6
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 1 6: TypeInt 32 1
7: TypeImage 6(int) SubpassData multi-sampled nonsampled format:Unknown 7: TypeImage 6(int) SubpassData multi-sampled nonsampled format:Unknown
8: TypePointer Function 7 8: TypePointer UniformConstant 7
9: TypeFunction 2 8(ptr) 9: TypeFunction 2 8(ptr)
13: TypeVector 6(int) 4 13: TypeVector 6(int) 4
14: TypePointer Output 13(ivec4) 14: TypePointer Output 13(ivec4)
@ -66,18 +66,17 @@ Linked fragment stage:
40: TypeImage 6(int) SubpassData nonsampled format:Unknown 40: TypeImage 6(int) SubpassData nonsampled format:Unknown
41: TypePointer UniformConstant 40 41: TypePointer UniformConstant 40
42(isub): 41(ptr) Variable UniformConstant 42(isub): 41(ptr) Variable UniformConstant
45: TypePointer UniformConstant 7 45(isubMS): 8(ptr) Variable UniformConstant
46(isubMS): 45(ptr) Variable UniformConstant 50: TypeInt 32 0
51: TypeInt 32 0 51: TypeVector 50(int) 4
52: TypeVector 51(int) 4 52: TypePointer Output 51(ivec4)
53: TypePointer Output 52(ivec4) 53(ucolor): 52(ptr) Variable Output
54(ucolor): 53(ptr) Variable Output 54: TypeImage 50(int) SubpassData nonsampled format:Unknown
55: TypeImage 51(int) SubpassData nonsampled format:Unknown 55: TypePointer UniformConstant 54
56: TypePointer UniformConstant 55 56(usub): 55(ptr) Variable UniformConstant
57(usub): 56(ptr) Variable UniformConstant 59: TypeImage 50(int) SubpassData multi-sampled nonsampled format:Unknown
60: TypeImage 51(int) SubpassData multi-sampled nonsampled format:Unknown 60: TypePointer UniformConstant 59
61: TypePointer UniformConstant 60 61(usubMS): 60(ptr) Variable UniformConstant
62(usubMS): 61(ptr) Variable UniformConstant
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
31: 28 Load 30(sub) 31: 28 Load 30(sub)
@ -91,20 +90,20 @@ Linked fragment stage:
43: 40 Load 42(isub) 43: 40 Load 42(isub)
44: 13(ivec4) ImageRead 43 20 44: 13(ivec4) ImageRead 43 20
Store 15(icolor) 44 Store 15(icolor) 44
47: 7 Load 46(isubMS) 46: 7 Load 45(isubMS)
48: 13(ivec4) ImageRead 47 20 Sample 17 47: 13(ivec4) ImageRead 46 20 Sample 17
49: 13(ivec4) Load 15(icolor) 48: 13(ivec4) Load 15(icolor)
50: 13(ivec4) IAdd 49 48 49: 13(ivec4) IAdd 48 47
Store 15(icolor) 50 Store 15(icolor) 49
58: 55 Load 57(usub) 57: 54 Load 56(usub)
59: 52(ivec4) ImageRead 58 20 58: 51(ivec4) ImageRead 57 20
Store 54(ucolor) 59 Store 53(ucolor) 58
63: 60 Load 62(usubMS) 62: 59 Load 61(usubMS)
64: 52(ivec4) ImageRead 63 20 Sample 17 63: 51(ivec4) ImageRead 62 20 Sample 17
65: 52(ivec4) Load 54(ucolor) 64: 51(ivec4) Load 53(ucolor)
66: 52(ivec4) IAdd 65 64 65: 51(ivec4) IAdd 64 63
Store 54(ucolor) 66 Store 53(ucolor) 65
67: 2 FunctionCall 11(foo(iIPM1;) 46(isubMS) 66: 2 FunctionCall 11(foo(iIPM1;) 45(isubMS)
Return Return
FunctionEnd FunctionEnd
11(foo(iIPM1;): 2 Function None 9 11(foo(iIPM1;): 2 Function None 9

View File

@ -1255,6 +1255,8 @@ public:
virtual bool isStruct() const { return structure != nullptr; } virtual bool isStruct() const { return structure != nullptr; }
virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble; } virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble; }
virtual bool isOpaque() const { return basicType == EbtSampler || basicType == EbtAtomicUint; }
// "Image" is a superset of "Subpass" // "Image" is a superset of "Subpass"
virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); }
virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); } virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); }
@ -1315,7 +1317,7 @@ public:
virtual bool containsOpaque() const virtual bool containsOpaque() const
{ {
if (basicType == EbtSampler || basicType == EbtAtomicUint) if (isOpaque())
return true; return true;
if (! structure) if (! structure)
return false; return false;