Updated glslang.

This commit is contained in:
Branimir Karadžić
2018-11-10 09:13:54 -08:00
parent 1b28f827a1
commit 1eda9c3c9d
20 changed files with 236 additions and 32 deletions

View File

@@ -45,7 +45,7 @@ if(USE_CCACHE)
endif()
# Precompiled header macro. Parameters are source file list and filename for pch cpp file.
macro(PCH SRCS PCHCPP)
macro(glslang_pch SRCS PCHCPP)
if(MSVC)
if (CMAKE_GENERATOR MATCHES "^Visual Studio")
set(PCH_NAME "$(IntDir)\\pch.pch")
@@ -58,7 +58,7 @@ macro(PCH SRCS PCHCPP)
set_source_files_properties(${PCHCPP} PROPERTIES COMPILE_FLAGS "/Ycpch.h /Fp${PCH_NAME} /Zm300" OBJECT_OUTPUTS "${PCH_NAME}")
list(APPEND ${SRCS} "${PCHCPP}")
endif()
endmacro(PCH)
endmacro(glslang_pch)
project(glslang)
# make testing optional

View File

@@ -152,6 +152,7 @@ void SpirvToolsLegalize(const glslang::TIntermediate&, std::vector<unsigned int>
out << std::endl;
});
optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());
optimizer.RegisterPass(spvtools::CreateMergeReturnPass());
optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass());
optimizer.RegisterPass(spvtools::CreateEliminateDeadFunctionsPass());

View File

@@ -10,6 +10,7 @@ ERROR: 5 compilation errors. No code generated.
Shader version: 100
ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'n' ( global highp int)
Linked vertex stage:
@@ -19,4 +20,5 @@ ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry
Shader version: 100
ERROR: node is still EOpNull!
0:? Linker Objects
0:? 'n' ( global highp int)

View File

@@ -35,9 +35,9 @@ ERROR: 0:155: '#else' : unexpected tokens following directive
ERROR: 0:158: '#else' : #else after #else
ERROR: 0:160: '#endif' : unexpected tokens following directive
ERROR: 0:164: '#define' : duplicate macro parameter
ERROR: 0:173: '#define' : Macro redefined; different number of arguments: m4
ERROR: 0:178: '#define' : Macro redefined; different number of arguments: m5
ERROR: 0:182: '#define' : Macro redefined; different number of arguments: m6
ERROR: 0:173: '#define' : Macro redefined; function-like versus object-like: m4
ERROR: 0:177: '#define' : Macro redefined; function-like versus object-like: m5
ERROR: 0:181: '#define' : Macro redefined; different number of arguments: m6
ERROR: 0:185: '#define' : Macro redefined; different substitutions: m7
ERROR: 0:192: '#define' : Macro redefined; different substitutions: m8
ERROR: 0:196: '#define' : Macro redefined; different argument names: m9
@@ -77,7 +77,7 @@ ERROR: 12:9000: 'preprocessor evaluation' : expected ')'
ERROR: 12:9002: '#if' : unexpected tokens following directive
ERROR: 12:9014: 'FOOOM' : undeclared identifier
ERROR: 12:9014: '=' : cannot convert from ' temp float' to ' global int'
ERROR: 12:9016: 'preprocessor evaluation' : can't evaluate expression
ERROR: 12:9015: 'preprocessor evaluation' : can't evaluate expression
ERROR: 12:9016: 'preprocessor evaluation' : bad expression
ERROR: 12:9500: 'preprocessor evaluation' : bad expression
ERROR: 12:9500: '#if' : unexpected tokens following directive

View File

@@ -28,3 +28,39 @@ int main(){
1.2 2E10 5u - 5l f
}
struct S {
int member1;
float member2;
vec4 member3;
};
void foo()
{
S s;
s . member2 + s . member1;
s . member3 . zyx;
s . member2 . xxyz;
s . member2 . yyz;
s . member2 . xxyz();
s . member2 . yzy;
vec3 a = vec3(0);vec3 b = a . zxyz;vec3 b = a . xxyz;vec3 b = a . yyz;vec3 b = a . xxyz();vec3 b = a . yzy;vec3 b = a . z;
yyz;
yzy
}

View File

@@ -0,0 +1,93 @@
spv.xfbOffsetOnStructMembersAssignment.vert
// Module Version 10000
// Generated by (magic number): 80007
// Id's are bound by 40
Capability Shader
Capability TransformFeedback
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 9 21 34 38 39
ExecutionMode 4 Xfb
Source GLSL 450
Name 4 "main"
Name 7 "S"
MemberName 7(S) 0 "x1_out"
MemberName 7(S) 1 "x2_out"
Name 9 "s1"
Name 19 "S2"
MemberName 19(S2) 0 "y1_out"
MemberName 19(S2) 1 "y2_out"
Name 21 "s2"
Name 32 "gl_PerVertex"
MemberName 32(gl_PerVertex) 0 "gl_Position"
MemberName 32(gl_PerVertex) 1 "gl_PointSize"
MemberName 32(gl_PerVertex) 2 "gl_ClipDistance"
MemberName 32(gl_PerVertex) 3 "gl_CullDistance"
Name 34 ""
Name 38 "gl_VertexID"
Name 39 "gl_InstanceID"
MemberDecorate 7(S) 0 Offset 16
MemberDecorate 7(S) 1 Offset 20
Decorate 9(s1) Location 0
Decorate 9(s1) XfbBuffer 2
Decorate 9(s1) XfbStride 24
MemberDecorate 19(S2) 0 Offset 8
MemberDecorate 19(S2) 1 Offset 12
Decorate 21(s2) Location 5
Decorate 21(s2) XfbBuffer 1
Decorate 21(s2) XfbStride 28
MemberDecorate 32(gl_PerVertex) 0 BuiltIn Position
MemberDecorate 32(gl_PerVertex) 1 BuiltIn PointSize
MemberDecorate 32(gl_PerVertex) 2 BuiltIn ClipDistance
MemberDecorate 32(gl_PerVertex) 3 BuiltIn CullDistance
Decorate 32(gl_PerVertex) Block
Decorate 34 XfbBuffer 0
Decorate 34 XfbStride 0
Decorate 38(gl_VertexID) BuiltIn VertexId
Decorate 39(gl_InstanceID) BuiltIn InstanceId
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7(S): TypeStruct 6(float) 6(float)
8: TypePointer Output 7(S)
9(s1): 8(ptr) Variable Output
10: TypeInt 32 1
11: 10(int) Constant 0
12: 6(float) Constant 1084227584
13: TypePointer Output 6(float)
15: 10(int) Constant 1
16: 6(float) Constant 1086324736
18: TypeVector 6(float) 4
19(S2): TypeStruct 6(float) 18(fvec4)
20: TypePointer Output 19(S2)
21(s2): 20(ptr) Variable Output
22: 6(float) Constant 1088421888
24: 6(float) Constant 1065353216
25: 6(float) Constant 0
26: 18(fvec4) ConstantComposite 24 25 25 24
27: TypePointer Output 18(fvec4)
29: TypeInt 32 0
30: 29(int) Constant 1
31: TypeArray 6(float) 30
32(gl_PerVertex): TypeStruct 18(fvec4) 6(float) 31 31
33: TypePointer Output 32(gl_PerVertex)
34: 33(ptr) Variable Output
35: 18(fvec4) ConstantComposite 25 25 25 25
37: TypePointer Input 10(int)
38(gl_VertexID): 37(ptr) Variable Input
39(gl_InstanceID): 37(ptr) Variable Input
4(main): 2 Function None 3
5: Label
14: 13(ptr) AccessChain 9(s1) 11
Store 14 12
17: 13(ptr) AccessChain 9(s1) 15
Store 17 16
23: 13(ptr) AccessChain 21(s2) 11
Store 23 22
28: 27(ptr) AccessChain 21(s2) 15
Store 28 26
36: 27(ptr) AccessChain 34 11
Store 36 35
Return
FunctionEnd

4
3rdparty/glslang/Test/cppSimple.vert vendored Normal file → Executable file
View File

@@ -170,7 +170,7 @@ int a = length("aoenatuh"); // ERROR
// ERROR
#define m4(b)
#define m4 (b)
#define m4
// ERROR
#define m5 (b)
@@ -178,7 +178,7 @@ int a = length("aoenatuh"); // ERROR
// ERROR
#define m6(a)
#define m6
#define m6(a,b)
// ERROR (whitespace)
#define m7 (a)

36
3rdparty/glslang/Test/preprocessor.simple.vert vendored Normal file → Executable file
View File

@@ -27,3 +27,39 @@ int main() {
+= -= *= /= %= <<= >>= &= |= ^=
1.2 2E10 5u -5lf
}
struct S {
int member1;
float member2;
vec4 member3;
};
#define xyz xxyz
#define yzy() yyz
#define FUN_MAC() \
vec3 a = vec3(0); \
vec3 b = a.zxyz; \
vec3 b = a.xyz; \
vec3 b = a.yzy(); \
vec3 b = a.xyz(); \
vec3 b = a.yzy; \
vec3 b = a.z;
void foo()
{
S s;
s.member2 + s.member1;
s.member3.zyx;
s.member2.xyz;
s.member2.yzy();
s.member2.xyz();
s.member2.yzy;
FUN_MAC()
yzy
();
yzy
}

View File

@@ -0,0 +1,23 @@
#version 450
layout(xfb_buffer=2) out;
struct S {
float x1_out;
float x2_out;
};
layout(location=0, xfb_offset = 16) out S s1;
layout(location=5, xfb_buffer=1, xfb_offset=8) out struct S2 {
float y1_out;
vec4 y2_out;
}s2;
void main() {
s1.x1_out = 5.0;
s1.x2_out = 6.0;
s2.y1_out = 7.0;
s2.y2_out = vec4(1.0, 0.0, 0.0, 1.0);
gl_Position = vec4(0.0);
}

View File

@@ -80,7 +80,7 @@ set(HEADERS
# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# set(BISON_GLSLParser_OUTPUT_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/MachineIndependent/glslang_tab.cpp)
PCH(SOURCES MachineIndependent/pch.cpp)
glslang_pch(SOURCES MachineIndependent/pch.cpp)
add_library(glslang ${LIB_TYPE} ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS})
set_property(TARGET glslang PROPERTY FOLDER glslang)

View File

@@ -4041,7 +4041,7 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
if (currentBlockQualifier.storage == EvqVaryingOut && globalOutputDefaults.hasXfbBuffer()) {
if (!currentBlockQualifier.hasXfbBuffer())
currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer;
fixBlockXfbOffsets(currentBlockQualifier, newTypeList);
fixXfbOffsets(currentBlockQualifier, newTypeList);
}
// Edit and error check the container against the redeclaration
@@ -6116,6 +6116,11 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden
// fix up
fixOffset(loc, *symbol);
if (symbol->getType().getBasicType() == EbtStruct) {
fixXfbOffsets(symbol->getWritableType().getQualifier(),
*(symbol->getWritableType().getWritableStruct()));
}
return initNode;
}
@@ -6840,7 +6845,7 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
// Process the members
fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation);
fixBlockXfbOffsets(currentBlockQualifier, typeList);
fixXfbOffsets(currentBlockQualifier, typeList);
fixBlockUniformOffsets(currentBlockQualifier, typeList);
for (unsigned int member = 0; member < typeList.size(); ++member)
layoutTypeCheck(typeList[member].loc, *typeList[member].type);
@@ -7091,7 +7096,7 @@ void TParseContext::fixBlockLocations(const TSourceLoc& loc, TQualifier& qualifi
}
}
void TParseContext::fixBlockXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
void TParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
{
// "If a block is qualified with xfb_offset, all its
// members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any

View File

@@ -403,7 +403,7 @@ public:
void blockStageIoCheck(const TSourceLoc&, const TQualifier&);
void blockQualifierCheck(const TSourceLoc&, const TQualifier&, bool instanceName);
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
void fixBlockXfbOffsets(TQualifier&, TTypeList&);
void fixXfbOffsets(TQualifier&, TTypeList&);
void fixBlockUniformOffsets(TQualifier&, TTypeList&);
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);

25
3rdparty/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp vendored Normal file → Executable file
View File

@@ -109,11 +109,12 @@ int TPpContext::CPPdefine(TPpToken* ppToken)
// save the macro name
const int defAtom = atomStrings.getAddAtom(ppToken->name);
TSourceLoc defineLoc = ppToken->loc; // because ppToken might go to the next line before we report errors
// gather parameters to the macro, between (...)
token = scanToken(ppToken);
if (token == '(' && ! ppToken->space) {
mac.emptyArgs = 1;
if (token == '(' && !ppToken->space) {
mac.functionLike = 1;
do {
token = scanToken(ppToken);
if (mac.args.size() == 0 && token == ')')
@@ -123,7 +124,6 @@ int TPpContext::CPPdefine(TPpToken* ppToken)
return token;
}
mac.emptyArgs = 0;
const int argAtom = atomStrings.getAddAtom(ppToken->name);
// check for duplication of parameter name
@@ -149,7 +149,6 @@ int TPpContext::CPPdefine(TPpToken* ppToken)
}
// record the definition of the macro
TSourceLoc defineLoc = ppToken->loc; // because ppToken is going to go to the next line before we report errors
while (token != '\n' && token != EndOfInput) {
mac.body.putToken(token, ppToken);
token = scanToken(ppToken);
@@ -164,7 +163,9 @@ int TPpContext::CPPdefine(TPpToken* ppToken)
// Already defined -- need to make sure they are identical:
// "Two replacement lists are identical if and only if the preprocessing tokens in both have the same number,
// ordering, spelling, and white-space separation, where all white-space separations are considered identical."
if (existing->args.size() != mac.args.size() || existing->emptyArgs != mac.emptyArgs)
if (existing->functionLike != mac.functionLike)
parseContext.ppError(defineLoc, "Macro redefined; function-like versus object-like:", "#define", atomStrings.getString(defAtom));
else if (existing->args.size() != mac.args.size())
parseContext.ppError(defineLoc, "Macro redefined; different number of arguments:", "#define", atomStrings.getString(defAtom));
else {
if (existing->args != mac.args)
@@ -1190,14 +1191,20 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b
TSourceLoc loc = ppToken->loc; // in case we go to the next line before discovering the error
in->mac = macro;
if (macro->args.size() > 0 || macro->emptyArgs) {
int token = scanToken(ppToken);
if (macro->functionLike) {
// We don't know yet if this will be a successful call of a
// function-like macro; need to look for a '(', but without trashing
// the passed in ppToken, until we know we are no longer speculative.
TPpToken parenToken;
int token = scanToken(&parenToken);
if (newLineOkay) {
while (token == '\n')
token = scanToken(ppToken);
token = scanToken(&parenToken);
}
if (token != '(') {
UngetToken(token, ppToken);
// Function-like macro called with object-like syntax: okay, don't expand.
// (We ate exactly one token that might not be white space; put it back.
UngetToken(token, &parenToken);
delete in;
return MacroExpandNotStarted;
}

View File

@@ -267,12 +267,12 @@ public:
//
struct MacroSymbol {
MacroSymbol() : emptyArgs(0), busy(0), undef(0) { }
MacroSymbol() : functionLike(0), busy(0), undef(0) { }
TVector<int> args;
TokenStream body;
unsigned emptyArgs : 1;
unsigned busy : 1;
unsigned undef : 1;
unsigned functionLike : 1; // 0 means object-like, 1 means function-like
unsigned busy : 1;
unsigned undef : 1;
};
typedef TMap<int, MacroSymbol> TSymbolMap;

View File

@@ -25,7 +25,7 @@ if(BUILD_TESTING)
# -- Remapper tests
${CMAKE_CURRENT_SOURCE_DIR}/Remap.FromFile.cpp)
PCH(TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/pch.cpp)
glslang_pch(TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/pch.cpp)
add_executable(glslangtests ${TEST_SOURCES})
set_property(TARGET glslangtests PROPERTY FOLDER tests)

View File

@@ -440,6 +440,7 @@ INSTANTIATE_TEST_CASE_P(
"spv.rankShift.comp",
"spv.specConst.vert",
"spv.OVR_multiview.vert",
"spv.xfbOffsetOnStructMembersAssignment.vert",
})),
FileNameAsCustomTestSuffix
);

View File

@@ -17,7 +17,7 @@ set(HEADERS
hlslGrammar.h
hlslParseables.h)
PCH(SOURCES pch.cpp)
glslang_pch(SOURCES pch.cpp)
add_library(HLSL ${LIB_TYPE} ${SOURCES} ${HEADERS})
set_property(TARGET HLSL PROPERTY FOLDER hlsl)

View File

@@ -8555,7 +8555,7 @@ void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TS
// Process the members
fixBlockLocations(loc, type.getQualifier(), typeList, memberWithLocation, memberWithoutLocation);
fixBlockXfbOffsets(type.getQualifier(), typeList);
fixXfbOffsets(type.getQualifier(), typeList);
fixBlockUniformOffsets(type.getQualifier(), typeList);
// reverse merge, so that currentBlockQualifier now has all layout information
@@ -8638,7 +8638,7 @@ void HlslParseContext::fixBlockLocations(const TSourceLoc& loc, TQualifier& qual
}
}
void HlslParseContext::fixBlockXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
void HlslParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
{
// "If a block is qualified with xfb_offset, all its
// members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any

View File

@@ -155,7 +155,7 @@ public:
void declareBlock(const TSourceLoc&, TType&, const TString* instanceName = 0);
void declareStructBufferCounter(const TSourceLoc& loc, const TType& bufferType, const TString& name);
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
void fixBlockXfbOffsets(TQualifier&, TTypeList&);
void fixXfbOffsets(TQualifier&, TTypeList&);
void fixBlockUniformOffsets(const TQualifier&, TTypeList&);
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);

View File

@@ -5,7 +5,7 @@
"site" : "github",
"subrepo" : "KhronosGroup/SPIRV-Tools",
"subdir" : "External/spirv-tools",
"commit" : "fb996dce752507132c40c255898154cce6c072c5"
"commit" : "9d699f6d4038f432c55310d5d0b4a6d507c1b686"
},
{
"name" : "spirv-tools/external/spirv-headers",