diff options
author | Jamie Madill <jmadill@chromium.org> | 2014-09-17 10:31:15 -0400 |
---|---|---|
committer | Jamie Madill <jmadill@chromium.org> | 2014-09-17 20:30:07 +0000 |
commit | e6256f87c3f3b754f2bbe19cc817b1140cecc4fc (patch) | |
tree | 7c3c2322ec1908c93142415a59ff7e969f18c802 | |
parent | 87a93308da237626325d13339565d7136125ed0d (diff) | |
download | angle-e6256f87c3f3b754f2bbe19cc817b1140cecc4fc.tar.gz |
Fix the varying sort comparator in ShaderD3D.
The comparator was actually a <= operator, while sort requires a
strict < operator. This was causing a potential assertion failure.
Bug report from Kerim Borchaev.
BUG=angle:742
Change-Id: I37c2925ab0b85e70ee1b2be3c72c6ddc062e8d28
Reviewed-on: https://chromium-review.googlesource.com/218506
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
-rw-r--r-- | src/libGLESv2/renderer/d3d/ShaderD3D.cpp | 2 | ||||
-rw-r--r-- | tests/angle_tests/GLSLTest.cpp | 37 |
2 files changed, 38 insertions, 1 deletions
diff --git a/src/libGLESv2/renderer/d3d/ShaderD3D.cpp b/src/libGLESv2/renderer/d3d/ShaderD3D.cpp index 57edb290..c472113e 100644 --- a/src/libGLESv2/renderer/d3d/ShaderD3D.cpp +++ b/src/libGLESv2/renderer/d3d/ShaderD3D.cpp @@ -348,7 +348,7 @@ bool ShaderD3D::compareVarying(const gl::PackedVarying &x, const gl::PackedVaryi return true; } - return gl::VariableSortOrder(x.type) <= gl::VariableSortOrder(y.type); + return gl::VariableSortOrder(x.type) < gl::VariableSortOrder(y.type); } unsigned int ShaderD3D::getUniformRegister(const std::string &uniformName) const diff --git a/tests/angle_tests/GLSLTest.cpp b/tests/angle_tests/GLSLTest.cpp index 233edb38..b47b3f76 100644 --- a/tests/angle_tests/GLSLTest.cpp +++ b/tests/angle_tests/GLSLTest.cpp @@ -226,6 +226,43 @@ TEST_F(GLSLTest, InvariantVaryingOut) EXPECT_NE(0u, program); } +TEST_F(GLSLTest, FrontFacingAndVarying) +{ + const std::string vertexShaderSource = SHADER_SOURCE + ( + attribute vec4 a_position; + varying float v_varying; + void main() + { + v_varying = a_position.x; + gl_Position = a_position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + varying float v_varying; + void main() + { + vec4 c; + + if (gl_FrontFacing) + { + c = vec4(v_varying, 0, 0, 1.0); + } + else + { + c = vec4(0, v_varying, 0, 1.0); + } + gl_FragColor = c; + } + ); + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + TEST_F(GLSLTest, InvariantVaryingIn) { const std::string fragmentShaderSource = SHADER_SOURCE |