Merge pull request #1118 from xorgy/only-swizzle-numbers-and-bools
Only try swizzles on vectors, numbers, and booleans.
diff --git a/Test/baseResults/invalidSwizzle.vert.out b/Test/baseResults/invalidSwizzle.vert.out
index f53974b..5104fdc 100644
--- a/Test/baseResults/invalidSwizzle.vert.out
+++ b/Test/baseResults/invalidSwizzle.vert.out
@@ -1,17 +1,20 @@
invalidSwizzle.vert
-ERROR: 0:6: 'xx' : does not apply to this type: global void
-ERROR: 0:7: 'xy' : does not apply to this type: global void
-ERROR: 2 compilation errors. No code generated.
+ERROR: 0:7: 'rr' : does not apply to this type: uniform sampler2D
+ERROR: 0:7: '=' : cannot convert from ' uniform sampler2D' to ' temp 2-component vector of float'
+ERROR: 0:8: 'xx' : does not apply to this type: global void
+ERROR: 0:9: 'xy' : does not apply to this type: global void
+ERROR: 4 compilation errors. No code generated.
Shader version: 420
ERROR: node is still EOpNull!
-0:5 Function Definition: main( ( global void)
-0:5 Function Parameters:
-0:6 Sequence
-0:6 Function Call: f( ( global void)
-0:7 Function Call: f( ( global void)
+0:6 Function Definition: main( ( global void)
+0:6 Function Parameters:
+0:? Sequence
+0:8 Function Call: f( ( global void)
+0:9 Function Call: f( ( global void)
0:? Linker Objects
+0:? 's' ( uniform sampler2D)
0:? 'gl_VertexID' ( gl_VertexId int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)
@@ -23,12 +26,13 @@
Shader version: 420
ERROR: node is still EOpNull!
-0:5 Function Definition: main( ( global void)
-0:5 Function Parameters:
-0:6 Sequence
-0:6 Function Call: f( ( global void)
-0:7 Function Call: f( ( global void)
+0:6 Function Definition: main( ( global void)
+0:6 Function Parameters:
+0:? Sequence
+0:8 Function Call: f( ( global void)
+0:9 Function Call: f( ( global void)
0:? Linker Objects
+0:? 's' ( uniform sampler2D)
0:? 'gl_VertexID' ( gl_VertexId int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)
diff --git a/Test/invalidSwizzle.vert b/Test/invalidSwizzle.vert
index 00b5625..799ff87 100644
--- a/Test/invalidSwizzle.vert
+++ b/Test/invalidSwizzle.vert
@@ -1,8 +1,10 @@
#version 420
void f();
+uniform sampler2D s;
void main() {
+ vec2 v = s.rr; // Swizzles do not apply to samplers
f().xx; // Scalar swizzle does not apply to void
f().xy; // Vector swizzle does not apply either
}
\ No newline at end of file
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 7f78a59..963419a 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -875,6 +875,8 @@
virtual bool isVector() const { return type.isVector(); }
virtual bool isScalar() const { return type.isScalar(); }
virtual bool isStruct() const { return type.isStruct(); }
+ virtual bool isFloatingDomain() const { return type.isFloatingDomain(); }
+ virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }
TString getCompleteString() const { return type.getCompleteString(); }
protected:
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 65a72cb..10c94d0 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -665,7 +665,8 @@
// leaving swizzles and struct/block dereferences.
TIntermTyped* result = base;
- if (base->getBasicType() != EbtVoid && (base->isVector() || base->isScalar())) {
+ if ((base->isVector() || base->isScalar()) &&
+ (base->isFloatingDomain() || base->isIntegerDomain() || base->getBasicType() == EbtBool)) {
if (base->isScalar()) {
const char* dotFeature = "scalar swizzle";
requireProfile(loc, ~EEsProfile, dotFeature);
@@ -4460,8 +4461,8 @@
switch (qualifier.storage) {
case EvqVaryingIn:
case EvqVaryingOut:
- if (type.getBasicType() != EbtBlock ||
- (!(*type.getStruct())[0].type->getQualifier().hasLocation() &&
+ if (type.getBasicType() != EbtBlock ||
+ (!(*type.getStruct())[0].type->getQualifier().hasLocation() &&
(*type.getStruct())[0].type->getQualifier().builtIn == EbvNone))
error(loc, "SPIR-V requires location for user input/output", "location", "");
break;