Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
glslang
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
glslang
Commits
3ea188e1
Commit
3ea188e1
authored
Apr 02, 2018
by
John Kessenich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Nonuniform: Finish semantic checking.
parent
ee572e38
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
148 additions
and
103 deletions
+148
-103
GlslangToSpv.cpp
SPIRV/GlslangToSpv.cpp
+6
-3
420.vert.out
Test/baseResults/420.vert.out
+1
-1
nonuniform.frag.out
Test/baseResults/nonuniform.frag.out
+58
-54
runtimeArray.vert.out
Test/baseResults/runtimeArray.vert.out
+0
-0
spv.nonuniform.frag.out
Test/baseResults/spv.nonuniform.frag.out
+22
-21
nonuniform.frag
Test/nonuniform.frag
+4
-0
runtimeArray.vert
Test/runtimeArray.vert
+27
-0
spv.nonuniform.frag
Test/spv.nonuniform.frag
+2
-2
ParseHelper.cpp
glslang/MachineIndependent/ParseHelper.cpp
+21
-20
ParseHelper.h
glslang/MachineIndependent/ParseHelper.h
+1
-1
Scan.cpp
glslang/MachineIndependent/Scan.cpp
+6
-1
No files found.
SPIRV/GlslangToSpv.cpp
View file @
3ea188e1
...
...
@@ -1508,12 +1508,15 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
if
(
node
->
getOp
()
==
glslang
::
EOpArrayLength
)
{
// Quite special; won't want to evaluate the operand.
// Currently, the front-end does not allow .length() on an array until it is sized,
// except for the last block membeor of an SSBO.
// TODO: If this changes, link-time sized arrays might show up here, and need their
// size extracted.
// Normal .length() would have been constant folded by the front-end.
// So, this has to be block.lastMember.length().
??
// So, this has to be block.lastMember.length().
// SPV wants "block" and member number as the operands, go get them.
//?? depends if size was determined while linking, and on what the rules allow applying .length() to
glslang
::
TIntermTyped
*
block
=
node
->
getOperand
()
->
getAsBinaryNode
()
->
getLeft
();
block
->
traverse
(
this
);
unsigned
int
member
=
node
->
getOperand
()
->
getAsBinaryNode
()
->
getRight
()
->
getAsConstantUnion
()
->
getConstArray
()[
0
].
getUConst
();
...
...
Test/baseResults/420.vert.out
View file @
3ea188e1
...
...
@@ -51,7 +51,7 @@ ERROR: 0:157: 'textureQueryLevels' : no matching overloaded function found
ERROR: 0:157: 'assign' : cannot convert from ' const float' to ' temp int'
ERROR: 0:158: 'textureQueryLevels' : no matching overloaded function found
ERROR: 0:158: 'assign' : cannot convert from ' const float' to ' temp int'
WARNING: 0:161: '[]' : assuming
array size
of one for compile-time checking of binding numbers for unsized array
WARNING: 0:161: '[]' : assuming
binding count
of one for compile-time checking of binding numbers for unsized array
ERROR: 51 compilation errors. No code generated.
...
...
Test/baseResults/nonuniform.frag.out
View file @
3ea188e1
nonuniform.frag
ERROR: 0:
6
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:
7
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:
8
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:
18
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:2
4
: 'constructor' : too many arguments
ERROR: 0:2
4
: 'assign' : cannot convert from ' const float' to ' nonuniform temp int'
ERROR: 0:2
5
: 'constructor' : not enough data provided for construction
ERROR: 0:2
5
: 'assign' : cannot convert from ' const float' to ' nonuniform temp int'
ERROR: 0:
28
: 'nonuniformEXT' : not allowed on block or structure members
ERROR: 0:
29
: 'nonuniformEXT' : not allowed on block or structure members
ERROR: 0:
10
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:
11
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:
12
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:
22
: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier
ERROR: 0:2
8
: 'constructor' : too many arguments
ERROR: 0:2
8
: 'assign' : cannot convert from ' const float' to ' nonuniform temp int'
ERROR: 0:2
9
: 'constructor' : not enough data provided for construction
ERROR: 0:2
9
: 'assign' : cannot convert from ' const float' to ' nonuniform temp int'
ERROR: 0:
32
: 'nonuniformEXT' : not allowed on block or structure members
ERROR: 0:
33
: 'nonuniformEXT' : not allowed on block or structure members
ERROR: 10 compilation errors. No code generated.
Shader version: 450
Requested GL_EXT_nonuniform_qualifier
ERROR: node is still EOpNull!
0:1
0
Function Definition: foo(i1;i1; ( nonuniform temp int)
0:1
0
Function Parameters:
0:1
0
'nupi' ( nonuniform in int)
0:1
0
'f' ( nonuniform out int)
0:1
2
Sequence
0:1
2
Branch: Return with expression
0:1
2
'nupi' ( nonuniform in int)
0:1
5
Function Definition: main( ( global void)
0:1
5
Function Parameters:
0:1
4
Function Definition: foo(i1;i1; ( nonuniform temp int)
0:1
4
Function Parameters:
0:1
4
'nupi' ( nonuniform in int)
0:1
4
'f' ( nonuniform out int)
0:1
6
Sequence
0:1
6
Branch: Return with expression
0:1
6
'nupi' ( nonuniform in int)
0:1
9
Function Definition: main( ( global void)
0:1
9
Function Parameters:
0:? Sequence
0:2
0
Function Call: foo(i1;i1; ( nonuniform temp int)
0:2
0
'nu_li' ( nonuniform temp int)
0:2
0
'nu_li' ( nonuniform temp int)
0:2
3
move second child to first child ( temp int)
0:2
3
'nu_li' ( nonuniform temp int)
0:2
3
add ( nonuniform temp int)
0:2
3
'a' ( nonuniform temp int)
0:2
3
component-wise multiply ( nonuniform temp int)
0:2
3
'a' ( temp int)
0:2
3
Constant:
0:2
3
2 (const int)
0:2
4
'nu_li' ( nonuniform temp int)
0:2
5
'nu_li' ( nonuniform temp int)
0:2
4
Function Call: foo(i1;i1; ( nonuniform temp int)
0:2
4
'nu_li' ( nonuniform temp int)
0:2
4
'nu_li' ( nonuniform temp int)
0:2
7
move second child to first child ( temp int)
0:2
7
'nu_li' ( nonuniform temp int)
0:2
7
add ( nonuniform temp int)
0:2
7
'a' ( nonuniform temp int)
0:2
7
component-wise multiply ( nonuniform temp int)
0:2
7
'a' ( temp int)
0:2
7
Constant:
0:2
7
2 (const int)
0:2
8
'nu_li' ( nonuniform temp int)
0:2
9
'nu_li' ( nonuniform temp int)
0:? Linker Objects
0:? 'nonuniformEXT' ( global int)
0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float)
0:? 'nu_gf' ( nonuniform temp float)
0:? 'nu_outv4' ( nonuniform out 4-component vector of float)
...
...
@@ -52,31 +54,33 @@ Linked fragment stage:
Shader version: 450
Requested GL_EXT_nonuniform_qualifier
ERROR: node is still EOpNull!
0:1
0
Function Definition: foo(i1;i1; ( nonuniform temp int)
0:1
0
Function Parameters:
0:1
0
'nupi' ( nonuniform in int)
0:1
0
'f' ( nonuniform out int)
0:1
2
Sequence
0:1
2
Branch: Return with expression
0:1
2
'nupi' ( nonuniform in int)
0:1
5
Function Definition: main( ( global void)
0:1
5
Function Parameters:
0:1
4
Function Definition: foo(i1;i1; ( nonuniform temp int)
0:1
4
Function Parameters:
0:1
4
'nupi' ( nonuniform in int)
0:1
4
'f' ( nonuniform out int)
0:1
6
Sequence
0:1
6
Branch: Return with expression
0:1
6
'nupi' ( nonuniform in int)
0:1
9
Function Definition: main( ( global void)
0:1
9
Function Parameters:
0:? Sequence
0:2
0
Function Call: foo(i1;i1; ( nonuniform temp int)
0:2
0
'nu_li' ( nonuniform temp int)
0:2
0
'nu_li' ( nonuniform temp int)
0:2
3
move second child to first child ( temp int)
0:2
3
'nu_li' ( nonuniform temp int)
0:2
3
add ( nonuniform temp int)
0:2
3
'a' ( nonuniform temp int)
0:2
3
component-wise multiply ( nonuniform temp int)
0:2
3
'a' ( temp int)
0:2
3
Constant:
0:2
3
2 (const int)
0:2
4
'nu_li' ( nonuniform temp int)
0:2
5
'nu_li' ( nonuniform temp int)
0:2
4
Function Call: foo(i1;i1; ( nonuniform temp int)
0:2
4
'nu_li' ( nonuniform temp int)
0:2
4
'nu_li' ( nonuniform temp int)
0:2
7
move second child to first child ( temp int)
0:2
7
'nu_li' ( nonuniform temp int)
0:2
7
add ( nonuniform temp int)
0:2
7
'a' ( nonuniform temp int)
0:2
7
component-wise multiply ( nonuniform temp int)
0:2
7
'a' ( temp int)
0:2
7
Constant:
0:2
7
2 (const int)
0:2
8
'nu_li' ( nonuniform temp int)
0:2
9
'nu_li' ( nonuniform temp int)
0:? Linker Objects
0:? 'nonuniformEXT' ( global int)
0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float)
0:? 'nu_gf' ( nonuniform temp float)
0:? 'nu_outv4' ( nonuniform out 4-component vector of float)
...
...
Test/baseResults/runtimeArray.vert.out
View file @
3ea188e1
This diff is collapsed.
Click to expand it.
Test/baseResults/spv.nonuniform.frag.out
View file @
3ea188e1
...
...
@@ -48,7 +48,7 @@ spv.nonuniform.frag
Name 97 "bname"
MemberName 97(bname) 0 "b"
Name 100 "storageBuffer"
Name 11
1
"sampledImage"
Name 11
0
"sampledImage"
Name 125 "storageImage"
Name 137 "inputAttachment"
Name 147 "uniformTexelBuffer"
...
...
@@ -93,10 +93,10 @@ spv.nonuniform.frag
Decorate 100(storageBuffer) Binding 4
Decorate 101 DecorationNonUniformEXT
Decorate 103 DecorationNonUniformEXT
Decorate 11
1
(sampledImage) DescriptorSet 0
Decorate 11
1
(sampledImage) Binding 5
Decorate 11
2
DecorationNonUniformEXT
Decorate 11
5
DecorationNonUniformEXT
Decorate 11
0
(sampledImage) DescriptorSet 0
Decorate 11
0
(sampledImage) Binding 5
Decorate 11
1
DecorationNonUniformEXT
Decorate 11
4
DecorationNonUniformEXT
Decorate 125(storageImage) DescriptorSet 0
Decorate 125(storageImage) Binding 6
Decorate 126 DecorationNonUniformEXT
...
...
@@ -172,15 +172,15 @@ spv.nonuniform.frag
98: TypeRuntimeArray 97(bname)
99: TypePointer Uniform 98
100(storageBuffer): 99(ptr) Variable Uniform
10
7
: TypeImage 28(float) 2D sampled format:Unknown
10
8: TypeSampledImage 107
10
9: TypeRuntimeArray 108
1
10: TypePointer UniformConstant 109
11
1(sampledImage): 110
(ptr) Variable UniformConstant
11
3: TypePointer UniformConstant 108
11
6
: TypeVector 28(float) 2
11
7
: 28(float) Constant 1056964608
11
8: 116(fvec2) ConstantComposite 117 117
10
6
: TypeImage 28(float) 2D sampled format:Unknown
10
7: TypeSampledImage 106
10
8: TypeRuntimeArray 107
1
09: TypePointer UniformConstant 108
11
0(sampledImage): 109
(ptr) Variable UniformConstant
11
2: TypePointer UniformConstant 107
11
5
: TypeVector 28(float) 2
11
6
: 28(float) Constant 1056964608
11
7: 115(fvec2) ConstantComposite 116 116
122: TypeImage 28(float) 2D nonsampled format:R32f
123: TypeRuntimeArray 122
124: TypePointer UniformConstant 123
...
...
@@ -270,13 +270,14 @@ spv.nonuniform.frag
104: 28(float) Load 30(b)
105: 28(float) FAdd 104 103
Store 30(b) 105
106: 28(float) Load 30(b)
112: 6(int) Load 90(nu_ii)
114: 113(ptr) AccessChain 111(sampledImage) 112
115: 108 Load 114
119: 31(fvec4) ImageSampleImplicitLod 115 118
120: 28(float) CompositeExtract 119 0
121: 28(float) FAdd 106 120
111: 6(int) Load 90(nu_ii)
113: 112(ptr) AccessChain 110(sampledImage) 111
114: 107 Load 113
118: 31(fvec4) ImageSampleImplicitLod 114 117
119: 28(float) CompositeExtract 118 0
120: 28(float) Load 30(b)
121: 28(float) FAdd 120 119
Store 30(b) 121
126: 6(int) Load 90(nu_ii)
128: 127(ptr) AccessChain 125(storageImage) 126
129: 122 Load 128
...
...
Test/nonuniform.frag
View file @
3ea188e1
#version 450
int
nonuniformEXT
;
#extension GL_EXT_nonuniform_qualifier : enable
nonuniformEXT
in
vec4
nu_inv4
;
nonuniformEXT
float
nu_gf
;
...
...
Test/runtimeArray.vert
View file @
3ea188e1
...
...
@@ -30,6 +30,15 @@ uniform aun {
float
aub
[];
};
layout
(
binding
=
1
)
uniform
samplerBuffer
uniformTexelBufferDyn
[];
layout
(
binding
=
2
,
r32f
)
uniform
imageBuffer
storageTexelBufferDyn
[];
layout
(
binding
=
3
)
uniform
uname
{
float
a
;
}
uniformBuffer
[];
layout
(
binding
=
4
)
buffer
bname
{
float
b
;
}
storageBuffer
[];
layout
(
binding
=
5
)
uniform
sampler2D
sampledImage
[];
layout
(
binding
=
6
,
r32f
)
uniform
image2D
storageImage
[];
layout
(
binding
=
8
)
uniform
samplerBuffer
uniformTexelBuffer
[];
layout
(
binding
=
9
,
r32f
)
uniform
imageBuffer
storageTexelBuffer
[];
int
i
;
void
main
()
...
...
@@ -78,4 +87,22 @@ void main()
aub
.
length
();
// ERROR
aba
.
length
();
// ERROR
abb
.
length
();
uniformTexelBufferDyn
[
1
];
storageTexelBufferDyn
[
1
];
uniformBuffer
[
1
];
storageBuffer
[
1
];
sampledImage
[
1
];
storageImage
[
1
];
uniformTexelBuffer
[
1
];
storageTexelBuffer
[
1
];
uniformTexelBufferDyn
[
i
];
// ERROR, need extension
storageTexelBufferDyn
[
i
];
// ERROR, need extension
uniformBuffer
[
i
];
// ERROR, need extension
storageBuffer
[
i
];
// ERROR, need extension
sampledImage
[
i
];
// ERROR, need extension
storageImage
[
i
];
// ERROR, need extension
uniformTexelBuffer
[
i
];
// ERROR, need extension
storageTexelBuffer
[
i
];
// ERROR, need extension
}
Test/spv.nonuniform.frag
View file @
3ea188e1
...
...
@@ -10,7 +10,7 @@ layout(binding=0, input_attachment_index = 0) uniform subpassInput inputA
layout
(
binding
=
1
)
uniform
samplerBuffer
uniformTexelBufferDyn
[];
layout
(
binding
=
2
,
r32f
)
uniform
imageBuffer
storageTexelBufferDyn
[];
layout
(
binding
=
3
)
uniform
uname
{
float
a
;
}
uniformBuffer
[];
layout
(
binding
=
4
)
buffer
bname
{
float
b
;
}
storageBuffer
[];
layout
(
binding
=
4
)
buffer
bname
{
float
b
;
}
storageBuffer
[];
layout
(
binding
=
5
)
uniform
sampler2D
sampledImage
[];
layout
(
binding
=
6
,
r32f
)
uniform
image2D
storageImage
[];
layout
(
binding
=
7
,
input_attachment_index
=
1
)
uniform
subpassInput
inputAttachment
[];
...
...
@@ -37,7 +37,7 @@ void main()
b
+=
imageLoad
(
storageTexelBufferDyn
[
dyn_i
],
1
).
x
;
b
+=
uniformBuffer
[
nu_ii
].
a
;
b
+=
storageBuffer
[
nu_ii
].
b
;
b
+
texture
(
sampledImage
[
nu_ii
],
vec2
(
0
.
5
)).
x
;
b
+
=
texture
(
sampledImage
[
nu_ii
],
vec2
(
0
.
5
)).
x
;
b
+=
imageLoad
(
storageImage
[
nu_ii
],
ivec2
(
1
)).
x
;
b
+=
subpassLoad
(
inputAttachment
[
nu_ii
]).
x
;
b
+=
texelFetch
(
uniformTexelBuffer
[
nu_ii
],
1
).
x
;
...
...
glslang/MachineIndependent/ParseHelper.cpp
View file @
3ea188e1
...
...
@@ -392,15 +392,8 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn
error
(
loc
,
""
,
"["
,
"array must be sized by a redeclaration or layout qualifier before being indexed with a variable"
);
else
{
// it is okay for a run-time sized array
bool
runtimeSized
=
isRuntimeSizable
(
*
base
);
if
(
!
runtimeSized
&&
/*?? base->getType().isOpaque() && */
base
->
getQualifier
().
isUniformOrBuffer
())
{
requireExtensions
(
loc
,
1
,
&
E_GL_EXT_nonuniform_qualifier
,
"variable index"
);
runtimeSized
=
true
;
}
if
(
!
runtimeSized
)
error
(
loc
,
""
,
"["
,
"array must be redeclared with a size before being indexed with a variable"
);
checkRuntimeSizable
(
loc
,
*
base
);
}
// ?? add correct run-time array semantics
base
->
getWritableType
().
setArrayVariablyIndexed
();
}
if
(
base
->
getBasicType
()
==
EbtBlock
)
{
...
...
@@ -1252,7 +1245,6 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction
if
(
intermNode
->
getAsSymbolNode
()
&&
isIoResizeArray
(
type
))
error
(
loc
,
""
,
function
->
getName
().
c_str
(),
"array must first be sized by a redeclaration or layout qualifier"
);
else
if
(
isRuntimeLength
(
*
intermNode
->
getAsTyped
()))
{
//?? possible run-time arary
// Create a unary op and let the back end handle it
return
intermediate
.
addBuiltInFunctionCall
(
loc
,
EOpArrayLength
,
true
,
intermNode
,
TType
(
EbtInt
));
}
else
...
...
@@ -3300,11 +3292,25 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie
checkIoArraysConsistency
(
loc
);
}
// Policy decision for whether a node could potentially be sized at runtime.
bool
TParseContext
::
isRuntimeSizable
(
const
TIntermTyped
&
base
)
const
// Policy and error check for needing a runtime sized array.
void
TParseContext
::
checkRuntimeSizable
(
const
TSourceLoc
&
loc
,
const
TIntermTyped
&
base
)
{
// runtime length implies runtime sizeable, so no problem
if
(
isRuntimeLength
(
base
))
return
;
// check for additional things allowed by GL_EXT_nonuniform_qualifier
if
(
base
.
getBasicType
()
==
EbtSampler
||
(
base
.
getBasicType
()
==
EbtBlock
&&
base
.
getType
().
getQualifier
().
isUniformOrBuffer
()))
requireExtensions
(
loc
,
1
,
&
E_GL_EXT_nonuniform_qualifier
,
"variable index"
);
else
error
(
loc
,
""
,
"["
,
"array must be redeclared with a size before being indexed with a variable"
);
}
// Policy decision for whether a run-time .length() is allowed.
bool
TParseContext
::
isRuntimeLength
(
const
TIntermTyped
&
base
)
const
{
const
TType
&
type
=
base
.
getType
();
if
(
type
.
getQualifier
().
storage
==
EvqBuffer
)
{
if
(
base
.
getType
().
getQualifier
().
storage
==
EvqBuffer
)
{
// in a buffer block
const
TIntermBinary
*
binary
=
base
.
getAsBinaryNode
();
if
(
binary
!=
nullptr
&&
binary
->
getOp
()
==
EOpIndexDirectStruct
)
{
...
...
@@ -3319,12 +3325,6 @@ bool TParseContext::isRuntimeSizable(const TIntermTyped& base) const
return
false
;
}
// Policy decision for whether a run-time .length() is allowed.
bool
TParseContext
::
isRuntimeLength
(
const
TIntermTyped
&
base
)
const
{
return
isRuntimeSizable
(
base
);
}
// Returns true if the first argument to the #line directive is the line number for the next line.
//
// Desktop, pre-version 3.30: "After processing this directive
...
...
@@ -4721,7 +4721,8 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
lastBinding
+=
type
.
getCumulativeArraySize
();
else
{
lastBinding
+=
1
;
warn
(
loc
,
"assuming array size of one for compile-time checking of binding numbers for unsized array"
,
"[]"
,
""
);
if
(
spvVersion
.
vulkan
==
0
)
warn
(
loc
,
"assuming binding count of one for compile-time checking of binding numbers for unsized array"
,
"[]"
,
""
);
}
}
}
...
...
glslang/MachineIndependent/ParseHelper.h
View file @
3ea188e1
...
...
@@ -427,7 +427,7 @@ protected:
TVariable
*
makeInternalVariable
(
const
char
*
name
,
const
TType
&
)
const
;
TVariable
*
declareNonArray
(
const
TSourceLoc
&
,
const
TString
&
identifier
,
const
TType
&
);
void
declareArray
(
const
TSourceLoc
&
,
const
TString
&
identifier
,
const
TType
&
,
TSymbol
*&
);
bool
isRuntimeSizable
(
const
TIntermTyped
&
)
const
;
void
checkRuntimeSizable
(
const
TSourceLoc
&
,
const
TIntermTyped
&
)
;
bool
isRuntimeLength
(
const
TIntermTyped
&
)
const
;
TIntermNode
*
executeInitializer
(
const
TSourceLoc
&
,
TIntermTyped
*
initializer
,
TVariable
*
variable
);
TIntermTyped
*
convertInitializerList
(
const
TSourceLoc
&
,
const
TType
&
,
TIntermTyped
*
initializer
);
...
...
glslang/MachineIndependent/Scan.cpp
View file @
3ea188e1
...
...
@@ -858,7 +858,6 @@ int TScanContext::tokenizeIdentifier()
switch
(
keyword
)
{
case
CONST
:
case
UNIFORM
:
case
NONUNIFORM
:
//?? check for extension
case
IN
:
case
OUT
:
case
INOUT
:
...
...
@@ -875,6 +874,12 @@ int TScanContext::tokenizeIdentifier()
case
CASE
:
return
keyword
;
case
NONUNIFORM
:
if
(
parseContext
.
extensionTurnedOn
(
E_GL_EXT_nonuniform_qualifier
))
return
keyword
;
else
return
identifierOrType
();
case
SWITCH
:
case
DEFAULT
:
if
((
parseContext
.
profile
==
EEsProfile
&&
parseContext
.
version
<
300
)
||
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment