mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 20:10:06 +00:00
SPV/OpenGL: Require locations on non-opaque uniform variables.
This commit is contained in:
parent
ab0086754e
commit
67eb497002
@ -1,9 +1,10 @@
|
|||||||
glspv.frag
|
glspv.frag
|
||||||
ERROR: 0:4: '#error' : GL_SPIRV is set ( correct , not an error )
|
ERROR: 0:4: '#error' : GL_SPIRV is set ( correct , not an error )
|
||||||
ERROR: 0:6: '#error' : GL_SPIR is 100
|
ERROR: 0:6: '#error' : GL_SPIR is 100
|
||||||
ERROR: 0:14: 'input_attachment_index' : only allowed when using GLSL for Vulkan
|
ERROR: 0:14: 'f' : non-opaque uniform variables need a layout(location=L)
|
||||||
ERROR: 0:14: '' : syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
|
ERROR: 0:19: 'input_attachment_index' : only allowed when using GLSL for Vulkan
|
||||||
ERROR: 4 compilation errors. No code generated.
|
ERROR: 0:19: '' : syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
|
||||||
|
ERROR: 5 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
SPIR-V is not generated for failed compile or link
|
SPIR-V is not generated for failed compile or link
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#version 330
|
#version 450
|
||||||
|
|
||||||
#ifdef GL_SPIRV
|
#ifdef GL_SPIRV
|
||||||
#error GL_SPIRV is set ( correct, not an error )
|
#error GL_SPIRV is set ( correct, not an error )
|
||||||
@ -11,4 +11,9 @@ void main()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uniform float f; // ERROR, no location
|
||||||
|
layout(location = 2) uniform float g;
|
||||||
|
uniform sampler2D s1;
|
||||||
|
layout(location = 3) uniform sampler2D s2;
|
||||||
|
|
||||||
layout(input_attachment_index = 1) uniform subpassInput sub; // ERROR, no inputs
|
layout(input_attachment_index = 1) uniform subpassInput sub; // ERROR, no inputs
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#version 450
|
#version 450
|
||||||
|
|
||||||
layout(constant_id = 3) const int a = 2;
|
layout(constant_id = 3) const int a = 2;
|
||||||
|
layout(location = 2) uniform float f;
|
||||||
uniform float f;
|
layout(location = 4) uniform sampler2D s1;
|
||||||
|
uniform sampler2D s2;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
@ -2472,16 +2472,22 @@ void TParseContext::atomicUintCheck(const TSourceLoc& loc, const TType& type, co
|
|||||||
error(loc, "atomic_uints can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str());
|
error(loc, "atomic_uints can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void TParseContext::transparentCheck(const TSourceLoc& loc, const TType& type, const TString& /*identifier*/)
|
void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)
|
||||||
{
|
{
|
||||||
if (parsingBuiltins)
|
if (parsingBuiltins)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Vulkan doesn't allow transparent uniforms outside of blocks
|
if (type.getQualifier().storage != EvqUniform)
|
||||||
if (spvVersion.vulkan == 0 || type.getQualifier().storage != EvqUniform)
|
|
||||||
return;
|
return;
|
||||||
if (type.containsNonOpaque())
|
|
||||||
vulkanRemoved(loc, "non-opaque uniforms outside a block");
|
if (type.containsNonOpaque()) {
|
||||||
|
// Vulkan doesn't allow transparent uniforms outside of blocks
|
||||||
|
if (spvVersion.vulkan > 0)
|
||||||
|
vulkanRemoved(loc, "non-opaque uniforms outside a block");
|
||||||
|
// OpenGL wants locations on these
|
||||||
|
if (spvVersion.openGl > 0 && !type.getQualifier().hasLocation())
|
||||||
|
error(loc, "non-opaque uniform variables need a layout(location=L)", identifier.c_str(), "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -5107,7 +5113,7 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden
|
|||||||
|
|
||||||
samplerCheck(loc, type, identifier, initializer);
|
samplerCheck(loc, type, identifier, initializer);
|
||||||
atomicUintCheck(loc, type, identifier);
|
atomicUintCheck(loc, type, identifier);
|
||||||
transparentCheck(loc, type, identifier);
|
transparentOpaqueCheck(loc, type, identifier);
|
||||||
|
|
||||||
if (identifier != "gl_FragCoord" && (publicType.shaderQualifiers.originUpperLeft || publicType.shaderQualifiers.pixelCenterInteger))
|
if (identifier != "gl_FragCoord" && (publicType.shaderQualifiers.originUpperLeft || publicType.shaderQualifiers.pixelCenterInteger))
|
||||||
error(loc, "can only apply origin_upper_left and pixel_center_origin to gl_FragCoord", "layout qualifier", "");
|
error(loc, "can only apply origin_upper_left and pixel_center_origin to gl_FragCoord", "layout qualifier", "");
|
||||||
|
@ -327,7 +327,7 @@ public:
|
|||||||
void boolCheck(const TSourceLoc&, const TPublicType&);
|
void boolCheck(const TSourceLoc&, const TPublicType&);
|
||||||
void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);
|
void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);
|
||||||
void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
||||||
void transparentCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
||||||
void globalQualifierFixCheck(const TSourceLoc&, TQualifier&);
|
void globalQualifierFixCheck(const TSourceLoc&, TQualifier&);
|
||||||
void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&);
|
void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&);
|
||||||
bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
|
bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
|
||||||
|
Loading…
Reference in New Issue
Block a user