Add full integer support to the shader language.
TRAC #23080
Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Jamie Madill
git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2400 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/ParseHelper.cpp b/src/compiler/ParseHelper.cpp
index 07a85aa..ac0b2b0 100644
--- a/src/compiler/ParseHelper.cpp
+++ b/src/compiler/ParseHelper.cpp
@@ -1116,17 +1116,34 @@
returnType.setArray(false);
}
- if (qualifier == EvqAttribute && (typeSpecifier.type == EbtBool || typeSpecifier.type == EbtInt))
+ if (shaderVersion < 300)
{
- error(typeSpecifier.line, "cannot be bool or int", getQualifierString(qualifier));
- recover();
- }
+ if (qualifier == EvqAttribute && (typeSpecifier.type == EbtBool || typeSpecifier.type == EbtInt))
+ {
+ error(typeSpecifier.line, "cannot be bool or int", getQualifierString(qualifier));
+ recover();
+ }
- if ((qualifier == EvqVaryingIn || qualifier == EvqVaryingOut) &&
- (typeSpecifier.type == EbtBool || typeSpecifier.type == EbtInt))
+ if ((qualifier == EvqVaryingIn || qualifier == EvqVaryingOut) &&
+ (typeSpecifier.type == EbtBool || typeSpecifier.type == EbtInt))
+ {
+ error(typeSpecifier.line, "cannot be bool or int", getQualifierString(qualifier));
+ recover();
+ }
+ }
+ else
{
- error(typeSpecifier.line, "cannot be bool or int", getQualifierString(qualifier));
- recover();
+ if (qualifier == EvqAttribute && typeSpecifier.type == EbtBool)
+ {
+ error(typeSpecifier.line, "cannot be bool", getQualifierString(qualifier));
+ recover();
+ }
+
+ if ((qualifier == EvqVaryingIn || qualifier == EvqVaryingOut) && typeSpecifier.type == EbtBool)
+ {
+ error(typeSpecifier.line, "cannot be bool", getQualifierString(qualifier));
+ recover();
+ }
}
return returnType;
diff --git a/src/compiler/glslang.y b/src/compiler/glslang.y
index a20ae46..2eda2ae 100644
--- a/src/compiler/glslang.y
+++ b/src/compiler/glslang.y
@@ -223,14 +223,6 @@
$$ = $1;
}
| INTCONSTANT {
- //
- // INT_TYPE is only 16-bit plus sign bit for vertex/fragment shaders,
- // check for overflow for constants
- //
- if (abs($1.i) >= (1 << 16)) {
- context->error($1.line, " integer constant overflow", "");
- context->recover();
- }
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setIConst($1.i);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtInt, EbpUndefined, EvqConst), $1.line);
diff --git a/src/compiler/glslang_tab.cpp b/src/compiler/glslang_tab.cpp
index b7bf619..0ec85a3 100644
--- a/src/compiler/glslang_tab.cpp
+++ b/src/compiler/glslang_tab.cpp
@@ -726,29 +726,29 @@
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 187, 187, 222, 225, 238, 243, 248, 254, 257,
- 260, 263, 266, 276, 289, 297, 397, 400, 408, 412,
- 419, 423, 430, 436, 445, 453, 508, 515, 525, 528,
- 538, 548, 569, 570, 571, 576, 577, 586, 598, 599,
- 607, 618, 622, 623, 633, 643, 653, 666, 667, 677,
- 690, 694, 698, 702, 703, 716, 717, 730, 731, 744,
- 745, 762, 763, 776, 777, 778, 779, 780, 784, 787,
- 798, 806, 814, 841, 846, 857, 861, 865, 872, 910,
- 913, 920, 928, 949, 970, 981, 1010, 1015, 1025, 1030,
- 1040, 1043, 1046, 1049, 1055, 1062, 1065, 1087, 1105, 1129,
- 1152, 1156, 1174, 1182, 1214, 1234, 1323, 1332, 1338, 1342,
- 1349, 1355, 1362, 1371, 1380, 1383, 1419, 1429, 1433, 1438,
- 1443, 1448, 1453, 1462, 1472, 1479, 1482, 1485, 1491, 1494,
- 1509, 1513, 1517, 1521, 1530, 1535, 1540, 1545, 1550, 1555,
- 1560, 1565, 1570, 1575, 1581, 1587, 1593, 1598, 1603, 1608,
- 1613, 1618, 1623, 1628, 1633, 1642, 1651, 1656, 1669, 1669,
- 1672, 1672, 1678, 1681, 1696, 1699, 1707, 1711, 1717, 1725,
- 1741, 1745, 1749, 1750, 1756, 1757, 1758, 1759, 1760, 1764,
- 1765, 1765, 1765, 1775, 1776, 1780, 1780, 1781, 1781, 1786,
- 1789, 1799, 1802, 1808, 1809, 1813, 1821, 1825, 1835, 1840,
- 1857, 1857, 1862, 1862, 1869, 1869, 1877, 1880, 1886, 1889,
- 1895, 1899, 1906, 1913, 1920, 1927, 1938, 1947, 1951, 1958,
- 1961, 1967, 1967
+ 0, 187, 187, 222, 225, 230, 235, 240, 246, 249,
+ 252, 255, 258, 268, 281, 289, 389, 392, 400, 404,
+ 411, 415, 422, 428, 437, 445, 500, 507, 517, 520,
+ 530, 540, 561, 562, 563, 568, 569, 578, 590, 591,
+ 599, 610, 614, 615, 625, 635, 645, 658, 659, 669,
+ 682, 686, 690, 694, 695, 708, 709, 722, 723, 736,
+ 737, 754, 755, 768, 769, 770, 771, 772, 776, 779,
+ 790, 798, 806, 833, 838, 849, 853, 857, 864, 902,
+ 905, 912, 920, 941, 962, 973, 1002, 1007, 1017, 1022,
+ 1032, 1035, 1038, 1041, 1047, 1054, 1057, 1079, 1097, 1121,
+ 1144, 1148, 1166, 1174, 1206, 1226, 1315, 1324, 1330, 1334,
+ 1341, 1347, 1354, 1363, 1372, 1375, 1411, 1421, 1425, 1430,
+ 1435, 1440, 1445, 1454, 1464, 1471, 1474, 1477, 1483, 1486,
+ 1501, 1505, 1509, 1513, 1522, 1527, 1532, 1537, 1542, 1547,
+ 1552, 1557, 1562, 1567, 1573, 1579, 1585, 1590, 1595, 1600,
+ 1605, 1610, 1615, 1620, 1625, 1634, 1643, 1648, 1661, 1661,
+ 1664, 1664, 1670, 1673, 1688, 1691, 1699, 1703, 1709, 1717,
+ 1733, 1737, 1741, 1742, 1748, 1749, 1750, 1751, 1752, 1756,
+ 1757, 1757, 1757, 1767, 1768, 1772, 1772, 1773, 1773, 1778,
+ 1781, 1791, 1794, 1800, 1801, 1805, 1813, 1817, 1827, 1832,
+ 1849, 1849, 1854, 1854, 1861, 1861, 1869, 1872, 1878, 1881,
+ 1887, 1891, 1898, 1905, 1912, 1919, 1930, 1939, 1943, 1950,
+ 1953, 1959, 1959
};
#endif
@@ -2298,14 +2298,6 @@
case 4:
{
- //
- // INT_TYPE is only 16-bit plus sign bit for vertex/fragment shaders,
- // check for overflow for constants
- //
- if (abs((yyvsp[(1) - (1)].lex).i) >= (1 << 16)) {
- context->error((yyvsp[(1) - (1)].lex).line, " integer constant overflow", "");
- context->recover();
- }
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setIConst((yyvsp[(1) - (1)].lex).i);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtInt, EbpUndefined, EvqConst), (yyvsp[(1) - (1)].lex).line);
diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp
index 9c3c3a9..2a2b114 100644
--- a/src/libGLESv2/ProgramBinary.cpp
+++ b/src/libGLESv2/ProgramBinary.cpp
@@ -46,6 +46,10 @@
case GL_FLOAT_VEC2: return "float2";
case GL_FLOAT_VEC3: return "float3";
case GL_FLOAT_VEC4: return "float4";
+ case GL_INT: return "int";
+ case GL_INT_VEC2: return "int2";
+ case GL_INT_VEC3: return "int3";
+ case GL_INT_VEC4: return "int4";
case GL_FLOAT_MAT2: return "float2x2";
case GL_FLOAT_MAT3: return "float3x3";
case GL_FLOAT_MAT4: return "float4x4";
@@ -1497,8 +1501,9 @@
}
std::string n = str(varying->reg + i * rows + j);
+ std::string typeString = gl_d3d::TypeString(UniformComponentType(transposedType)) + str(VariableColumnCount(transposedType));
- varyingHLSL += "float" + str(VariableColumnCount(transposedType)) + " v" + n + " : " + varyingSemantic + n + ";\n";
+ varyingHLSL += typeString + " v" + n + " : " + varyingSemantic + n + ";\n";
}
}
}
diff --git a/src/libGLESv2/Shader.cpp b/src/libGLESv2/Shader.cpp
index 9e479e8..53731b9 100644
--- a/src/libGLESv2/Shader.cpp
+++ b/src/libGLESv2/Shader.cpp
@@ -517,6 +517,22 @@
{
return GL_FLOAT_MAT4x3;
}
+ else if (type == "int")
+ {
+ return GL_INT;
+ }
+ else if (type == "int2")
+ {
+ return GL_INT_VEC2;
+ }
+ else if (type == "int3")
+ {
+ return GL_INT_VEC3;
+ }
+ else if (type == "int4")
+ {
+ return GL_INT_VEC4;
+ }
else UNREACHABLE();
return GL_NONE;
@@ -534,12 +550,16 @@
varyingPriorities[GL_FLOAT_MAT4x2] = 40;
varyingPriorities[GL_FLOAT_MAT2] = 50;
varyingPriorities[GL_FLOAT_VEC4] = 60;
+ varyingPriorities[GL_INT_VEC4] = 61;
varyingPriorities[GL_FLOAT_MAT3] = 70;
varyingPriorities[GL_FLOAT_MAT2x3] = 80;
varyingPriorities[GL_FLOAT_MAT3x2] = 90;
varyingPriorities[GL_FLOAT_VEC3] = 100;
+ varyingPriorities[GL_INT_VEC3] = 101;
varyingPriorities[GL_FLOAT_VEC2] = 110;
+ varyingPriorities[GL_INT_VEC2] = 111;
varyingPriorities[GL_FLOAT] = 120;
+ varyingPriorities[GL_INT] = 125;
}
// true if varying x has a higher priority in packing than y