Commit 0980e29d by Olli Etuaho

Don't accept default precision for uint

Default precision can only be specified for float, int and sampler types. Default precision for int also applies to uint and uvec declarations. BUG=angleproject:1221 TEST=angle_unittests Change-Id: I31fdcde80da16e2ea8771838f7c1a6ab4e478194 Reviewed-on: https://chromium-review.googlesource.com/313314 Tryjob-Request: Olli Etuaho <oetuaho@nvidia.com> Tested-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent ccb001b4
...@@ -435,6 +435,8 @@ class TSymbolTable : angle::NonCopyable ...@@ -435,6 +435,8 @@ class TSymbolTable : angle::NonCopyable
{ {
if (!SupportsPrecision(type.type)) if (!SupportsPrecision(type.type))
return false; return false;
if (type.type == EbtUInt)
return false; // ESSL 3.00.4 section 4.5.4
if (type.isAggregate()) if (type.isAggregate())
return false; // Not allowed to set for aggregate types return false; // Not allowed to set for aggregate types
int indexOfLastElement = static_cast<int>(precisionStack.size()) - 1; int indexOfLastElement = static_cast<int>(precisionStack.size()) - 1;
......
...@@ -1315,3 +1315,22 @@ TEST_F(MalformedShaderTest, TextureLodOffsetOutOfRange) ...@@ -1315,3 +1315,22 @@ TEST_F(MalformedShaderTest, TextureLodOffsetOutOfRange)
FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;
} }
} }
// Test that default precision qualifier for uint is not accepted.
// ESSL 3.00.4 section 4.5.4: Only allowed for float, int and sampler types.
TEST_F(MalformedShaderTest, DefaultPrecisionUint)
{
const std::string &shaderString =
"#version 300 es\n"
"precision mediump float;\n"
"precision mediump uint;\n"
"out vec4 my_FragColor;\n"
"void main()\n"
"{\n"
" my_FragColor = vec4(0.0);\n"
"}\n";
if (compile(shaderString))
{
FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;
}
}
...@@ -297,7 +297,7 @@ TEST_F(TypeTrackingTest, PackResultTypeAndPrecision) ...@@ -297,7 +297,7 @@ TEST_F(TypeTrackingTest, PackResultTypeAndPrecision)
const std::string &shaderString = const std::string &shaderString =
"#version 300 es\n" "#version 300 es\n"
"precision mediump float;\n" "precision mediump float;\n"
"precision mediump uint;\n" "precision mediump int;\n"
"uniform vec2 uv;\n" "uniform vec2 uv;\n"
"out vec4 my_FragColor;\n" "out vec4 my_FragColor;\n"
"void main() {\n" "void main() {\n"
...@@ -323,7 +323,7 @@ TEST_F(TypeTrackingTest, UnpackNormResultTypeAndPrecision) ...@@ -323,7 +323,7 @@ TEST_F(TypeTrackingTest, UnpackNormResultTypeAndPrecision)
const std::string &shaderString = const std::string &shaderString =
"#version 300 es\n" "#version 300 es\n"
"precision mediump float;\n" "precision mediump float;\n"
"precision mediump uint;\n" "precision mediump int;\n"
"uniform uint uu;\n" "uniform uint uu;\n"
"out vec4 my_FragColor;\n" "out vec4 my_FragColor;\n"
"void main() {\n" "void main() {\n"
...@@ -347,7 +347,7 @@ TEST_F(TypeTrackingTest, UnpackHalfResultTypeAndPrecision) ...@@ -347,7 +347,7 @@ TEST_F(TypeTrackingTest, UnpackHalfResultTypeAndPrecision)
const std::string &shaderString = const std::string &shaderString =
"#version 300 es\n" "#version 300 es\n"
"precision highp float;\n" "precision highp float;\n"
"precision highp uint;\n" "precision highp int;\n"
"uniform uint uu;\n" "uniform uint uu;\n"
"out vec4 my_FragColor;\n" "out vec4 my_FragColor;\n"
"void main() {\n" "void main() {\n"
......
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