GL_EXT_debug_printf implementation
This commit is contained in:
parent
c6a4c6d3d8
commit
04d73731de
28 changed files with 4030 additions and 3794 deletions
|
|
@ -621,6 +621,8 @@ enum TOperator {
|
|||
|
||||
EOpIsHelperInvocation,
|
||||
|
||||
EOpDebugPrintf,
|
||||
|
||||
//
|
||||
// Branch
|
||||
//
|
||||
|
|
|
|||
|
|
@ -4086,6 +4086,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
|
|||
commonBuiltins.append("void controlBarrier(int, int, int, int);\n"
|
||||
"void memoryBarrier(int, int, int);\n");
|
||||
|
||||
commonBuiltins.append("void debugPrintfEXT();\n");
|
||||
|
||||
if (profile != EEsProfile && version >= 450) {
|
||||
// coopMatStoreNV perhaps ought to have "out" on the buf parameter, but
|
||||
// adding it introduces undesirable tempArgs on the stack. What we want
|
||||
|
|
@ -7903,6 +7905,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
|
|||
}
|
||||
|
||||
symbolTable.setFunctionExtensions("controlBarrier", 1, &E_GL_KHR_memory_scope_semantics);
|
||||
symbolTable.setFunctionExtensions("debugPrintfEXT", 1, &E_GL_EXT_debug_printf);
|
||||
|
||||
// GL_ARB_shader_ballot
|
||||
if (profile != EEsProfile) {
|
||||
|
|
@ -8451,6 +8454,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
|
|||
symbolTable.relateToOperator("average", EOpAverage);
|
||||
symbolTable.relateToOperator("averageRounded", EOpAverageRounded);
|
||||
symbolTable.relateToOperator("multiply32x16", EOpMul32x16);
|
||||
symbolTable.relateToOperator("debugPrintfEXT", EOpDebugPrintf);
|
||||
|
||||
|
||||
if (PureOperatorBuiltins) {
|
||||
symbolTable.relateToOperator("imageSize", EOpImageQuerySize);
|
||||
|
|
|
|||
|
|
@ -1353,6 +1353,9 @@ void TParseContext::computeBuiltinPrecisions(TIntermTyped& node, const TFunction
|
|||
case EOpInterpolateAtSample:
|
||||
numArgs = 1;
|
||||
break;
|
||||
case EOpDebugPrintf:
|
||||
numArgs = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -6082,6 +6085,15 @@ const TFunction* TParseContext::findFunction(const TSourceLoc& loc, const TFunct
|
|||
#endif
|
||||
|
||||
const TFunction* function = nullptr;
|
||||
|
||||
// debugPrintfEXT has var args and is in the symbol table as "debugPrintfEXT()",
|
||||
// mangled to "debugPrintfEXT("
|
||||
if (call.getName() == "debugPrintfEXT") {
|
||||
TSymbol* symbol = symbolTable.find("debugPrintfEXT(", &builtIn);
|
||||
if (symbol)
|
||||
return symbol->getAsFunction();
|
||||
}
|
||||
|
||||
bool explicitTypesEnabled = extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types) ||
|
||||
extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int8) ||
|
||||
extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_int16) ||
|
||||
|
|
|
|||
|
|
@ -842,6 +842,7 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token)
|
|||
parseContext.error(loc, "not supported", "::", "");
|
||||
break;
|
||||
|
||||
case PpAtomConstString: parserToken->sType.lex.string = NewPoolTString(tokenText); return STRING_LITERAL;
|
||||
case PpAtomConstInt: parserToken->sType.lex.i = ppToken.ival; return INTCONSTANT;
|
||||
case PpAtomConstUint: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT;
|
||||
case PpAtomConstFloat: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT;
|
||||
|
|
|
|||
|
|
@ -221,6 +221,7 @@ void TParseVersions::initializeExtensionBehavior()
|
|||
extensionBehavior[E_GL_EXT_buffer_reference2] = EBhDisable;
|
||||
extensionBehavior[E_GL_EXT_buffer_reference_uvec2] = EBhDisable;
|
||||
extensionBehavior[E_GL_EXT_demote_to_helper_invocation] = EBhDisable;
|
||||
extensionBehavior[E_GL_EXT_debug_printf] = EBhDisable;
|
||||
|
||||
extensionBehavior[E_GL_EXT_shader_16bit_storage] = EBhDisable;
|
||||
extensionBehavior[E_GL_EXT_shader_8bit_storage] = EBhDisable;
|
||||
|
|
@ -418,6 +419,7 @@ void TParseVersions::getPreamble(std::string& preamble)
|
|||
"#define GL_EXT_buffer_reference2 1\n"
|
||||
"#define GL_EXT_buffer_reference_uvec2 1\n"
|
||||
"#define GL_EXT_demote_to_helper_invocation 1\n"
|
||||
"#define GL_EXT_debug_printf 1\n"
|
||||
|
||||
// GL_KHR_shader_subgroup
|
||||
"#define GL_KHR_shader_subgroup_basic 1\n"
|
||||
|
|
|
|||
|
|
@ -185,6 +185,7 @@ const char* const E_GL_EXT_buffer_reference2 = "GL_EXT_buffer_ref
|
|||
const char* const E_GL_EXT_buffer_reference_uvec2 = "GL_EXT_buffer_reference_uvec2";
|
||||
const char* const E_GL_EXT_demote_to_helper_invocation = "GL_EXT_demote_to_helper_invocation";
|
||||
const char* const E_GL_EXT_shader_realtime_clock = "GL_EXT_shader_realtime_clock";
|
||||
const char* const E_GL_EXT_debug_printf = "GL_EXT_debug_printf";
|
||||
|
||||
// Arrays of extensions for the above viewportEXTs duplications
|
||||
|
||||
|
|
|
|||
|
|
@ -263,6 +263,7 @@ GLSLANG_WEB_EXCLUDE_OFF
|
|||
%token <lex> AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN
|
||||
%token <lex> MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN
|
||||
%token <lex> SUB_ASSIGN
|
||||
%token <lex> STRING_LITERAL
|
||||
|
||||
%token <lex> LEFT_PAREN RIGHT_PAREN LEFT_BRACKET RIGHT_BRACKET LEFT_BRACE RIGHT_BRACE DOT
|
||||
%token <lex> COMMA COLON EQUAL SEMICOLON BANG DASH TILDE PLUS STAR SLASH PERCENT
|
||||
|
|
@ -377,6 +378,9 @@ primary_expression
|
|||
$$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true);
|
||||
}
|
||||
GLSLANG_WEB_EXCLUDE_ON
|
||||
| STRING_LITERAL {
|
||||
$$ = parseContext.intermediate.addConstantUnion($1.string, $1.loc, true);
|
||||
}
|
||||
| INT32CONSTANT {
|
||||
parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
|
||||
$$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
|
||||
|
|
|
|||
|
|
@ -263,6 +263,7 @@ extern int yylex(YYSTYPE*, TParseContext&);
|
|||
%token <lex> AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN
|
||||
%token <lex> MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN
|
||||
%token <lex> SUB_ASSIGN
|
||||
%token <lex> STRING_LITERAL
|
||||
|
||||
%token <lex> LEFT_PAREN RIGHT_PAREN LEFT_BRACKET RIGHT_BRACKET LEFT_BRACE RIGHT_BRACE DOT
|
||||
%token <lex> COMMA COLON EQUAL SEMICOLON BANG DASH TILDE PLUS STAR SLASH PERCENT
|
||||
|
|
@ -377,6 +378,9 @@ primary_expression
|
|||
$$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true);
|
||||
}
|
||||
|
||||
| STRING_LITERAL {
|
||||
$$ = parseContext.intermediate.addConstantUnion($1.string, $1.loc, true);
|
||||
}
|
||||
| INT32CONSTANT {
|
||||
parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
|
||||
$$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -356,103 +356,104 @@ extern int yydebug;
|
|||
XOR_ASSIGN = 566,
|
||||
OR_ASSIGN = 567,
|
||||
SUB_ASSIGN = 568,
|
||||
LEFT_PAREN = 569,
|
||||
RIGHT_PAREN = 570,
|
||||
LEFT_BRACKET = 571,
|
||||
RIGHT_BRACKET = 572,
|
||||
LEFT_BRACE = 573,
|
||||
RIGHT_BRACE = 574,
|
||||
DOT = 575,
|
||||
COMMA = 576,
|
||||
COLON = 577,
|
||||
EQUAL = 578,
|
||||
SEMICOLON = 579,
|
||||
BANG = 580,
|
||||
DASH = 581,
|
||||
TILDE = 582,
|
||||
PLUS = 583,
|
||||
STAR = 584,
|
||||
SLASH = 585,
|
||||
PERCENT = 586,
|
||||
LEFT_ANGLE = 587,
|
||||
RIGHT_ANGLE = 588,
|
||||
VERTICAL_BAR = 589,
|
||||
CARET = 590,
|
||||
AMPERSAND = 591,
|
||||
QUESTION = 592,
|
||||
INVARIANT = 593,
|
||||
HIGH_PRECISION = 594,
|
||||
MEDIUM_PRECISION = 595,
|
||||
LOW_PRECISION = 596,
|
||||
PRECISION = 597,
|
||||
PACKED = 598,
|
||||
RESOURCE = 599,
|
||||
SUPERP = 600,
|
||||
FLOATCONSTANT = 601,
|
||||
INTCONSTANT = 602,
|
||||
UINTCONSTANT = 603,
|
||||
BOOLCONSTANT = 604,
|
||||
IDENTIFIER = 605,
|
||||
TYPE_NAME = 606,
|
||||
CENTROID = 607,
|
||||
IN = 608,
|
||||
OUT = 609,
|
||||
INOUT = 610,
|
||||
STRUCT = 611,
|
||||
VOID = 612,
|
||||
WHILE = 613,
|
||||
BREAK = 614,
|
||||
CONTINUE = 615,
|
||||
DO = 616,
|
||||
ELSE = 617,
|
||||
FOR = 618,
|
||||
IF = 619,
|
||||
DISCARD = 620,
|
||||
RETURN = 621,
|
||||
SWITCH = 622,
|
||||
CASE = 623,
|
||||
DEFAULT = 624,
|
||||
UNIFORM = 625,
|
||||
SHARED = 626,
|
||||
BUFFER = 627,
|
||||
FLAT = 628,
|
||||
SMOOTH = 629,
|
||||
LAYOUT = 630,
|
||||
DOUBLECONSTANT = 631,
|
||||
INT16CONSTANT = 632,
|
||||
UINT16CONSTANT = 633,
|
||||
FLOAT16CONSTANT = 634,
|
||||
INT32CONSTANT = 635,
|
||||
UINT32CONSTANT = 636,
|
||||
INT64CONSTANT = 637,
|
||||
UINT64CONSTANT = 638,
|
||||
SUBROUTINE = 639,
|
||||
DEMOTE = 640,
|
||||
PAYLOADNV = 641,
|
||||
PAYLOADINNV = 642,
|
||||
HITATTRNV = 643,
|
||||
CALLDATANV = 644,
|
||||
CALLDATAINNV = 645,
|
||||
PATCH = 646,
|
||||
SAMPLE = 647,
|
||||
NONUNIFORM = 648,
|
||||
COHERENT = 649,
|
||||
VOLATILE = 650,
|
||||
RESTRICT = 651,
|
||||
READONLY = 652,
|
||||
WRITEONLY = 653,
|
||||
DEVICECOHERENT = 654,
|
||||
QUEUEFAMILYCOHERENT = 655,
|
||||
WORKGROUPCOHERENT = 656,
|
||||
SUBGROUPCOHERENT = 657,
|
||||
NONPRIVATE = 658,
|
||||
NOPERSPECTIVE = 659,
|
||||
EXPLICITINTERPAMD = 660,
|
||||
PERVERTEXNV = 661,
|
||||
PERPRIMITIVENV = 662,
|
||||
PERVIEWNV = 663,
|
||||
PERTASKNV = 664,
|
||||
PRECISE = 665
|
||||
STRING_LITERAL = 569,
|
||||
LEFT_PAREN = 570,
|
||||
RIGHT_PAREN = 571,
|
||||
LEFT_BRACKET = 572,
|
||||
RIGHT_BRACKET = 573,
|
||||
LEFT_BRACE = 574,
|
||||
RIGHT_BRACE = 575,
|
||||
DOT = 576,
|
||||
COMMA = 577,
|
||||
COLON = 578,
|
||||
EQUAL = 579,
|
||||
SEMICOLON = 580,
|
||||
BANG = 581,
|
||||
DASH = 582,
|
||||
TILDE = 583,
|
||||
PLUS = 584,
|
||||
STAR = 585,
|
||||
SLASH = 586,
|
||||
PERCENT = 587,
|
||||
LEFT_ANGLE = 588,
|
||||
RIGHT_ANGLE = 589,
|
||||
VERTICAL_BAR = 590,
|
||||
CARET = 591,
|
||||
AMPERSAND = 592,
|
||||
QUESTION = 593,
|
||||
INVARIANT = 594,
|
||||
HIGH_PRECISION = 595,
|
||||
MEDIUM_PRECISION = 596,
|
||||
LOW_PRECISION = 597,
|
||||
PRECISION = 598,
|
||||
PACKED = 599,
|
||||
RESOURCE = 600,
|
||||
SUPERP = 601,
|
||||
FLOATCONSTANT = 602,
|
||||
INTCONSTANT = 603,
|
||||
UINTCONSTANT = 604,
|
||||
BOOLCONSTANT = 605,
|
||||
IDENTIFIER = 606,
|
||||
TYPE_NAME = 607,
|
||||
CENTROID = 608,
|
||||
IN = 609,
|
||||
OUT = 610,
|
||||
INOUT = 611,
|
||||
STRUCT = 612,
|
||||
VOID = 613,
|
||||
WHILE = 614,
|
||||
BREAK = 615,
|
||||
CONTINUE = 616,
|
||||
DO = 617,
|
||||
ELSE = 618,
|
||||
FOR = 619,
|
||||
IF = 620,
|
||||
DISCARD = 621,
|
||||
RETURN = 622,
|
||||
SWITCH = 623,
|
||||
CASE = 624,
|
||||
DEFAULT = 625,
|
||||
UNIFORM = 626,
|
||||
SHARED = 627,
|
||||
BUFFER = 628,
|
||||
FLAT = 629,
|
||||
SMOOTH = 630,
|
||||
LAYOUT = 631,
|
||||
DOUBLECONSTANT = 632,
|
||||
INT16CONSTANT = 633,
|
||||
UINT16CONSTANT = 634,
|
||||
FLOAT16CONSTANT = 635,
|
||||
INT32CONSTANT = 636,
|
||||
UINT32CONSTANT = 637,
|
||||
INT64CONSTANT = 638,
|
||||
UINT64CONSTANT = 639,
|
||||
SUBROUTINE = 640,
|
||||
DEMOTE = 641,
|
||||
PAYLOADNV = 642,
|
||||
PAYLOADINNV = 643,
|
||||
HITATTRNV = 644,
|
||||
CALLDATANV = 645,
|
||||
CALLDATAINNV = 646,
|
||||
PATCH = 647,
|
||||
SAMPLE = 648,
|
||||
NONUNIFORM = 649,
|
||||
COHERENT = 650,
|
||||
VOLATILE = 651,
|
||||
RESTRICT = 652,
|
||||
READONLY = 653,
|
||||
WRITEONLY = 654,
|
||||
DEVICECOHERENT = 655,
|
||||
QUEUEFAMILYCOHERENT = 656,
|
||||
WORKGROUPCOHERENT = 657,
|
||||
SUBGROUPCOHERENT = 658,
|
||||
NONPRIVATE = 659,
|
||||
NOPERSPECTIVE = 660,
|
||||
EXPLICITINTERPAMD = 661,
|
||||
PERVERTEXNV = 662,
|
||||
PERPRIMITIVENV = 663,
|
||||
PERVIEWNV = 664,
|
||||
PERTASKNV = 665,
|
||||
PRECISE = 666
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -497,7 +498,7 @@ union YYSTYPE
|
|||
glslang::TArraySizes* typeParameters;
|
||||
} interm;
|
||||
|
||||
#line 501 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909 */
|
||||
#line 502 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909 */
|
||||
};
|
||||
|
||||
typedef union YYSTYPE YYSTYPE;
|
||||
|
|
|
|||
|
|
@ -1090,6 +1090,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
|
|||
case EOpCooperativeMatrixMulAdd: out.debug << "MulAdd cooperative matrices"; break;
|
||||
|
||||
case EOpIsHelperInvocation: out.debug << "IsHelperInvocation"; break;
|
||||
case EOpDebugPrintf: out.debug << "Debug printf"; break;
|
||||
|
||||
default: out.debug.message(EPrefixError, "Bad aggregation op");
|
||||
}
|
||||
|
|
|
|||
19
glslang/MachineIndependent/preprocessor/Pp.cpp
Executable file → Normal file
19
glslang/MachineIndependent/preprocessor/Pp.cpp
Executable file → Normal file
|
|
@ -621,14 +621,25 @@ int TPpContext::CPPinclude(TPpToken* ppToken)
|
|||
{
|
||||
const TSourceLoc directiveLoc = ppToken->loc;
|
||||
bool startWithLocalSearch = true; // to additionally include the extra "" paths
|
||||
int token = scanToken(ppToken);
|
||||
int token;
|
||||
|
||||
// handle <header-name>-style #include
|
||||
if (token == '<') {
|
||||
// Find the first non-whitespace char after #include
|
||||
int ch = getChar();
|
||||
while (ch == ' ' || ch == '\t') {
|
||||
ch = getChar();
|
||||
}
|
||||
if (ch == '<') {
|
||||
// <header-name> style
|
||||
startWithLocalSearch = false;
|
||||
token = scanHeaderName(ppToken, '>');
|
||||
} else if (ch == '"') {
|
||||
// "header-name" style
|
||||
token = scanHeaderName(ppToken, '"');
|
||||
} else {
|
||||
// unexpected, get the full token to generate the error
|
||||
ungetChar();
|
||||
token = scanToken(ppToken);
|
||||
}
|
||||
// otherwise ppToken already has the header name and it was "header-name" style
|
||||
|
||||
if (token != PpAtomConstString) {
|
||||
parseContext.ppError(directiveLoc, "must be followed by a header name", "#include", "");
|
||||
|
|
|
|||
76
glslang/MachineIndependent/preprocessor/PpScanner.cpp
Executable file → Normal file
76
glslang/MachineIndependent/preprocessor/PpScanner.cpp
Executable file → Normal file
|
|
@ -1026,12 +1026,74 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
|
|||
case '\'':
|
||||
return pp->characterLiteral(ppToken);
|
||||
case '"':
|
||||
// TODO: If this gets enhanced to handle escape sequences, or
|
||||
// anything that is different than what #include needs, then
|
||||
// #include needs to use scanHeaderName() for this.
|
||||
// #include uses scanHeaderName() to ignore these escape sequences.
|
||||
ch = getch();
|
||||
while (ch != '"' && ch != '\n' && ch != EndOfInput) {
|
||||
if (len < MaxTokenLength) {
|
||||
if (ch == '\\') {
|
||||
int nextCh = getch();
|
||||
switch (nextCh) {
|
||||
case '\'': ch = 0x27; break;
|
||||
case '"': ch = 0x22; break;
|
||||
case '?': ch = 0x3f; break;
|
||||
case '\\': ch = 0x5c; break;
|
||||
case 'a': ch = 0x07; break;
|
||||
case 'b': ch = 0x08; break;
|
||||
case 'f': ch = 0x0c; break;
|
||||
case 'n': ch = 0x0a; break;
|
||||
case 'r': ch = 0x0d; break;
|
||||
case 't': ch = 0x09; break;
|
||||
case 'v': ch = 0x0b; break;
|
||||
case 'x':
|
||||
// two character hex value
|
||||
nextCh = getch();
|
||||
if (nextCh >= '0' && nextCh <= '9')
|
||||
nextCh -= '0';
|
||||
else if (nextCh >= 'A' && nextCh <= 'F')
|
||||
nextCh -= 'A' - 10;
|
||||
else if (nextCh >= 'a' && nextCh <= 'f')
|
||||
nextCh -= 'a' - 10;
|
||||
else
|
||||
pp->parseContext.ppError(ppToken->loc, "Expected hex value in escape sequence", "string", "");
|
||||
ch = nextCh * 0x10;
|
||||
nextCh = getch();
|
||||
if (nextCh >= '0' && nextCh <= '9')
|
||||
nextCh -= '0';
|
||||
else if (nextCh >= 'A' && nextCh <= 'F')
|
||||
nextCh -= 'A' - 10;
|
||||
else if (nextCh >= 'a' && nextCh <= 'f')
|
||||
nextCh -= 'a' - 10;
|
||||
else
|
||||
pp->parseContext.ppError(ppToken->loc, "Expected hex value in escape sequence", "string", "");
|
||||
ch += nextCh;
|
||||
break;
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
// three character octal value
|
||||
nextCh = getch() - '0';
|
||||
if (nextCh > 3)
|
||||
pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", "");
|
||||
ch = nextCh * 8 * 8;
|
||||
nextCh = getch() - '0';
|
||||
if (nextCh > 7)
|
||||
pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", "");
|
||||
ch += nextCh * 8;
|
||||
nextCh = getch() - '0';
|
||||
if (nextCh > 7)
|
||||
pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", "");
|
||||
ch += nextCh;
|
||||
break;
|
||||
default:
|
||||
pp->parseContext.ppError(ppToken->loc, "Invalid escape sequence", "string", "");
|
||||
break;
|
||||
}
|
||||
}
|
||||
ppToken->name[len] = (char)ch;
|
||||
len++;
|
||||
ch = getch();
|
||||
|
|
@ -1120,10 +1182,12 @@ int TPpContext::tokenize(TPpToken& ppToken)
|
|||
continue;
|
||||
break;
|
||||
case PpAtomConstString:
|
||||
// HLSL allows string literals.
|
||||
// GLSL allows string literals with GL_EXT_debug_printf.
|
||||
if (ifdepth == 0 && parseContext.intermediate.getSource() != EShSourceHlsl) {
|
||||
// HLSL allows string literals.
|
||||
parseContext.ppError(ppToken.loc, "string literals not supported", "\"\"", "");
|
||||
continue;
|
||||
parseContext.requireExtensions(ppToken.loc, 1, &E_GL_EXT_debug_printf, "string literal");
|
||||
if (!parseContext.extensionTurnedOn(E_GL_EXT_debug_printf))
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case '\'':
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue