Stop generating duplicate vertex binaries.

We would generate multiple vertex binaries that result in the same
HLSL code, eg for vec2 and vec3 vertex attributes. Eliminate
duplicates by using the converted attribute type for testing
for matching binaries.

BUG=angle:599

Change-Id: I061588164577ff9fa69ebb7d8a3f2bf6bb6fe013
Reviewed-on: https://chromium-review.googlesource.com/197830
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/tests/angle_tests/ProgramBinaryTest.cpp b/tests/angle_tests/ProgramBinaryTest.cpp
new file mode 100644
index 0000000..28158ca
--- /dev/null
+++ b/tests/angle_tests/ProgramBinaryTest.cpp
@@ -0,0 +1,90 @@
+#include "ANGLETest.h"
+
+class ProgramBinaryTest : public ANGLETest
+{
+protected:
+    ProgramBinaryTest()
+    {
+        setWindowWidth(128);
+        setWindowHeight(128);
+        setConfigRedBits(8);
+        setConfigGreenBits(8);
+        setConfigBlueBits(8);
+        setConfigAlphaBits(8);
+    }
+
+    virtual void SetUp()
+    {
+        ANGLETest::SetUp();
+
+        const std::string vertexShaderSource = SHADER_SOURCE
+        (
+            attribute vec4 inputAttribute;
+            void main()
+            {
+                gl_Position = inputAttribute;
+            }
+        );
+
+        const std::string fragmentShaderSource = SHADER_SOURCE
+        (
+            void main()
+            {
+                gl_FragColor = vec4(1,0,0,1);
+            }
+        );
+
+        mProgram = compileProgram(vertexShaderSource, fragmentShaderSource);
+        if (mProgram == 0)
+        {
+            FAIL() << "shader compilation failed.";
+        }
+
+        glGenBuffers(1, &mBuffer);
+        glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
+        glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_STATIC_DRAW);
+        glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+        ASSERT_GL_NO_ERROR();
+    }
+
+    virtual void TearDown()
+    {
+        glDeleteProgram(mProgram);
+        glDeleteBuffers(1, &mBuffer);
+
+        ANGLETest::TearDown();
+    }
+
+    GLuint mProgram;
+    GLuint mBuffer;
+};
+
+// This tests the assumption that float attribs of different size
+// should not internally cause a vertex shader recompile (for conversion).
+TEST_F(ProgramBinaryTest, float_dynamic_shader_size)
+{
+    glUseProgram(mProgram);
+    glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
+
+    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8, NULL);
+    glEnableVertexAttribArray(0);
+    glDrawArrays(GL_POINTS, 0, 1);
+
+    GLint programLength;
+    glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength);
+
+    EXPECT_GL_NO_ERROR();
+
+    for (GLsizei size = 1; size <= 3; size++)
+    {
+        glVertexAttribPointer(0, size, GL_FLOAT, GL_FALSE, 8, NULL);
+        glEnableVertexAttribArray(0);
+        glDrawArrays(GL_POINTS, 0, 1);
+
+        GLint newProgramLength;
+        glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &newProgramLength);
+        EXPECT_GL_NO_ERROR();
+        EXPECT_EQ(programLength, newProgramLength);
+    }
+}