Commit f2e0f9bb by Jamie Madill

Moved the code to combine interpolation and stoarge qualifiers to the parse helper.

TRAC #23745 Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods
parent 9b4f3849
......@@ -2457,6 +2457,51 @@ TLayoutQualifier TParseContext::joinLayoutQualifiers(TLayoutQualifier leftQualif
return joinedQualifier;
}
TPublicType TParseContext::joinInterpolationQualifiers(const TSourceLoc &interpolationLoc, TQualifier interpolationQualifier,
const TSourceLoc &storageLoc, TQualifier storageQualifier)
{
TQualifier mergedQualifier = EvqSmoothIn;
if (storageQualifier == EvqSmoothIn) {
if (interpolationQualifier == EvqSmooth)
mergedQualifier = EvqSmoothIn;
else if (interpolationQualifier == EvqFlat)
mergedQualifier = EvqFlatIn;
else UNREACHABLE();
}
else if (storageQualifier == EvqCentroidIn) {
if (interpolationQualifier == EvqSmooth)
mergedQualifier = EvqCentroidIn;
else if (interpolationQualifier == EvqFlat)
mergedQualifier = EvqFlatIn;
else UNREACHABLE();
}
else if (storageQualifier == EvqSmoothOut) {
if (interpolationQualifier == EvqSmooth)
mergedQualifier = EvqSmoothOut;
else if (interpolationQualifier == EvqFlat)
mergedQualifier = EvqFlatOut;
else UNREACHABLE();
}
else if (storageQualifier == EvqCentroidOut) {
if (interpolationQualifier == EvqSmooth)
mergedQualifier = EvqCentroidOut;
else if (interpolationQualifier == EvqFlat)
mergedQualifier = EvqFlatOut;
else UNREACHABLE();
}
else {
error(interpolationLoc, "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getInterpolationString(interpolationQualifier));
recover();
mergedQualifier = storageQualifier;
}
TPublicType type;
type.setBasic(EbtVoid, mergedQualifier, storageLoc);
return type;
}
TFieldList *TParseContext::addStructDeclaratorList(const TPublicType& typeSpecifier, TFieldList *fieldList)
{
if (voidErrorCheck(typeSpecifier.line, (*fieldList)[0]->name(), typeSpecifier)) {
......
......@@ -151,6 +151,8 @@ struct TParseContext {
TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine);
TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine, const TString &intValueString, int intValue, const TSourceLoc& intValueLine);
TLayoutQualifier joinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier);
TPublicType joinInterpolationQualifiers(const TSourceLoc &interpolationLoc, TQualifier interpolationQualifier,
const TSourceLoc &storageLoc, TQualifier storageQualifier);
// Performs an error check for embedded struct declarations.
// Returns true if an error was raised due to the declaration of
......
......@@ -1165,40 +1165,7 @@ type_qualifier
$$.setBasic(EbtVoid, $1.qualifier, @1);
}
| interpolation_qualifier storage_qualifier {
if ($2.qualifier == EvqSmoothIn) {
if ($1.qualifier == EvqSmooth)
$$.setBasic(EbtVoid, EvqSmoothIn, @2);
else if ($1.qualifier == EvqFlat)
$$.setBasic(EbtVoid, EvqFlatIn, @2);
else UNREACHABLE();
}
else if ($2.qualifier == EvqCentroidIn) {
if ($1.qualifier == EvqSmooth)
$$.setBasic(EbtVoid, EvqCentroidIn, @2);
else if ($1.qualifier == EvqFlat)
$$.setBasic(EbtVoid, EvqFlatIn, @2);
else UNREACHABLE();
}
else if ($2.qualifier == EvqSmoothOut) {
if ($1.qualifier == EvqSmooth)
$$.setBasic(EbtVoid, EvqSmoothOut, @2);
else if ($1.qualifier == EvqFlat)
$$.setBasic(EbtVoid, EvqFlatOut, @2);
else UNREACHABLE();
}
else if ($2.qualifier == EvqCentroidOut) {
if ($1.qualifier == EvqSmooth)
$$.setBasic(EbtVoid, EvqCentroidOut, @2);
else if ($1.qualifier == EvqFlat)
$$.setBasic(EbtVoid, EvqFlatOut, @2);
else UNREACHABLE();
}
else {
context->error(@1, "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getInterpolationString($1.qualifier));
context->recover();
$$.setBasic(EbtVoid, $2.qualifier, @2);
}
$$ = context->joinInterpolationQualifiers(@1, $1.qualifier, @2, $2.qualifier);
}
| interpolation_qualifier {
context->error(@1, "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getInterpolationString($1.qualifier));
......
......@@ -76,7 +76,6 @@ typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
......@@ -107,6 +106,8 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
#endif /* ! C99 */
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
......@@ -180,7 +181,15 @@ typedef void* yyscan_t;
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
* Ditto for the __ia64__ case accordingly.
*/
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ */
#endif
/* The state buf must be large enough to hold one state per character in the main buffer.
......@@ -1139,7 +1148,12 @@ static int input (yyscan_t yyscanner );
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#endif
/* Copy whatever the last rule matched to the standard output. */
......@@ -1147,7 +1161,7 @@ static int input (yyscan_t yyscanner );
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
#define ECHO fwrite( yytext, yyleng, 1, yyout )
#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
#endif
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
......@@ -1158,7 +1172,7 @@ static int input (yyscan_t yyscanner );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
yy_size_t n; \
size_t n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
......@@ -2760,8 +2774,8 @@ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
* scan from a @e copy of @a bytes.
* @param bytes the byte buffer to scan
* @param len the number of bytes in the buffer pointed to by @a bytes.
* @param yybytes the byte buffer to scan
* @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
* @param yyscanner The scanner object.
* @return the newly allocated buffer state object.
*/
......
/* A Bison parser, made by GNU Bison 2.7. */
/* A Bison parser, made by GNU Bison 2.7.12-4996. */
/* Bison implementation for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......@@ -44,7 +44,7 @@
#define YYBISON 1
/* Bison version. */
#define YYBISON_VERSION "2.7"
#define YYBISON_VERSION "2.7.12-4996"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
......@@ -450,6 +450,14 @@ typedef short int yytype_int16;
# endif
#endif
#ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later. */
# if (! defined __GNUC__ || __GNUC__ < 2 \
|| (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
# define __attribute__(Spec) /* empty */
# endif
#endif
/* Suppress unused-variable warnings by "using" E. */
#if ! defined lint || defined __GNUC__
# define YYUSE(E) ((void) (E))
......@@ -457,6 +465,7 @@ typedef short int yytype_int16;
# define YYUSE(E) /* empty */
#endif
/* Identity function, used to suppress warnings about constant conditions. */
#ifndef lint
# define YYID(N) (N)
......@@ -796,21 +805,21 @@ static const yytype_uint16 yyrline[] =
831, 838, 893, 896, 903, 911, 932, 953, 963, 991,
996, 1006, 1011, 1021, 1024, 1027, 1030, 1036, 1043, 1046,
1050, 1054, 1058, 1065, 1069, 1073, 1080, 1084, 1088, 1109,
1118, 1124, 1127, 1133, 1139, 1146, 1155, 1164, 1167, 1203,
1210, 1214, 1221, 1224, 1228, 1232, 1241, 1250, 1258, 1268,
1275, 1278, 1281, 1287, 1294, 1297, 1303, 1306, 1309, 1315,
1318, 1333, 1337, 1341, 1345, 1349, 1353, 1358, 1363, 1368,
1373, 1378, 1383, 1388, 1393, 1398, 1403, 1408, 1413, 1418,
1423, 1428, 1433, 1438, 1443, 1448, 1453, 1458, 1462, 1466,
1470, 1474, 1478, 1482, 1486, 1490, 1494, 1498, 1502, 1506,
1510, 1514, 1518, 1526, 1534, 1538, 1551, 1551, 1554, 1554,
1560, 1563, 1579, 1582, 1591, 1595, 1601, 1608, 1623, 1627,
1631, 1632, 1638, 1639, 1640, 1641, 1642, 1646, 1647, 1647,
1647, 1657, 1658, 1662, 1662, 1663, 1663, 1668, 1671, 1681,
1684, 1690, 1691, 1695, 1703, 1707, 1717, 1722, 1739, 1739,
1744, 1744, 1751, 1751, 1759, 1762, 1768, 1771, 1777, 1781,
1788, 1795, 1802, 1809, 1820, 1829, 1833, 1840, 1843, 1849,
1849
1118, 1124, 1127, 1133, 1139, 1146, 1155, 1164, 1167, 1170,
1177, 1181, 1188, 1191, 1195, 1199, 1208, 1217, 1225, 1235,
1242, 1245, 1248, 1254, 1261, 1264, 1270, 1273, 1276, 1282,
1285, 1300, 1304, 1308, 1312, 1316, 1320, 1325, 1330, 1335,
1340, 1345, 1350, 1355, 1360, 1365, 1370, 1375, 1380, 1385,
1390, 1395, 1400, 1405, 1410, 1415, 1420, 1425, 1429, 1433,
1437, 1441, 1445, 1449, 1453, 1457, 1461, 1465, 1469, 1473,
1477, 1481, 1485, 1493, 1501, 1505, 1518, 1518, 1521, 1521,
1527, 1530, 1546, 1549, 1558, 1562, 1568, 1575, 1590, 1594,
1598, 1599, 1605, 1606, 1607, 1608, 1609, 1613, 1614, 1614,
1614, 1624, 1625, 1629, 1629, 1630, 1630, 1635, 1638, 1648,
1651, 1657, 1658, 1662, 1670, 1674, 1684, 1689, 1706, 1706,
1711, 1711, 1718, 1718, 1726, 1729, 1735, 1738, 1744, 1748,
1755, 1762, 1769, 1776, 1787, 1796, 1800, 1807, 1810, 1816,
1816
};
#endif
......@@ -1810,11 +1819,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, context)
# else
YYUSE (yyoutput);
# endif
switch (yytype)
{
default:
break;
}
YYUSE (yytype);
}
......@@ -2214,12 +2219,7 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp, context)
yymsg = "Deleting";
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
switch (yytype)
{
default:
break;
}
YYUSE (yytype);
}
......@@ -3810,40 +3810,7 @@ yyreduce:
case 118:
{
if ((yyvsp[(2) - (2)].interm.type).qualifier == EvqSmoothIn) {
if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqSmooth)
(yyval.interm.type).setBasic(EbtVoid, EvqSmoothIn, (yylsp[(2) - (2)]));
else if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqFlat)
(yyval.interm.type).setBasic(EbtVoid, EvqFlatIn, (yylsp[(2) - (2)]));
else UNREACHABLE();
}
else if ((yyvsp[(2) - (2)].interm.type).qualifier == EvqCentroidIn) {
if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqSmooth)
(yyval.interm.type).setBasic(EbtVoid, EvqCentroidIn, (yylsp[(2) - (2)]));
else if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqFlat)
(yyval.interm.type).setBasic(EbtVoid, EvqFlatIn, (yylsp[(2) - (2)]));
else UNREACHABLE();
}
else if ((yyvsp[(2) - (2)].interm.type).qualifier == EvqSmoothOut) {
if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqSmooth)
(yyval.interm.type).setBasic(EbtVoid, EvqSmoothOut, (yylsp[(2) - (2)]));
else if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqFlat)
(yyval.interm.type).setBasic(EbtVoid, EvqFlatOut, (yylsp[(2) - (2)]));
else UNREACHABLE();
}
else if ((yyvsp[(2) - (2)].interm.type).qualifier == EvqCentroidOut) {
if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqSmooth)
(yyval.interm.type).setBasic(EbtVoid, EvqCentroidOut, (yylsp[(2) - (2)]));
else if ((yyvsp[(1) - (2)].interm.type).qualifier == EvqFlat)
(yyval.interm.type).setBasic(EbtVoid, EvqFlatOut, (yylsp[(2) - (2)]));
else UNREACHABLE();
}
else {
context->error((yylsp[(1) - (2)]), "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getInterpolationString((yyvsp[(1) - (2)].interm.type).qualifier));
context->recover();
(yyval.interm.type).setBasic(EbtVoid, (yyvsp[(2) - (2)].interm.type).qualifier, (yylsp[(2) - (2)]));
}
(yyval.interm.type) = context->joinInterpolationQualifiers((yylsp[(1) - (2)]), (yyvsp[(1) - (2)].interm.type).qualifier, (yylsp[(2) - (2)]), (yyvsp[(2) - (2)].interm.type).qualifier);
}
break;
......
/* A Bison parser, made by GNU Bison 2.7. */
/* A Bison parser, made by GNU Bison 2.7.12-4996. */
/* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment