blob: 4f7b4f912d4ff4f8a6fcbae0ec86fa238c39a3fa [file] [log] [blame]
Jamie Madill7a29e4a2014-05-02 10:41:48 -04001#include "ANGLETest.h"
Brandon Jones993d08d2014-10-10 14:32:57 -07002#include <memory>
3#include <stdint.h>
Jamie Madill7a29e4a2014-05-02 10:41:48 -04004
Austin Kinross18b931d2014-09-29 12:58:31 -07005// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
6typedef ::testing::Types<TFT<Gles::Two, Rend::D3D11>, TFT<Gles::Two, Rend::D3D9>> TestFixtureTypes;
7TYPED_TEST_CASE(ProgramBinaryTest, TestFixtureTypes);
8
9template<typename T>
Jamie Madill7a29e4a2014-05-02 10:41:48 -040010class ProgramBinaryTest : public ANGLETest
11{
12protected:
Austin Kinross18b931d2014-09-29 12:58:31 -070013 ProgramBinaryTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
Jamie Madill7a29e4a2014-05-02 10:41:48 -040014 {
15 setWindowWidth(128);
16 setWindowHeight(128);
17 setConfigRedBits(8);
18 setConfigGreenBits(8);
19 setConfigBlueBits(8);
20 setConfigAlphaBits(8);
21 }
22
23 virtual void SetUp()
24 {
25 ANGLETest::SetUp();
26
27 const std::string vertexShaderSource = SHADER_SOURCE
28 (
29 attribute vec4 inputAttribute;
30 void main()
31 {
32 gl_Position = inputAttribute;
33 }
34 );
35
36 const std::string fragmentShaderSource = SHADER_SOURCE
37 (
38 void main()
39 {
40 gl_FragColor = vec4(1,0,0,1);
41 }
42 );
43
Jamie Madill5599c8f2014-08-26 13:16:39 -040044 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill7a29e4a2014-05-02 10:41:48 -040045 if (mProgram == 0)
46 {
47 FAIL() << "shader compilation failed.";
48 }
49
50 glGenBuffers(1, &mBuffer);
51 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
52 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_STATIC_DRAW);
53 glBindBuffer(GL_ARRAY_BUFFER, 0);
54
55 ASSERT_GL_NO_ERROR();
56 }
57
58 virtual void TearDown()
59 {
60 glDeleteProgram(mProgram);
61 glDeleteBuffers(1, &mBuffer);
62
63 ANGLETest::TearDown();
64 }
65
66 GLuint mProgram;
67 GLuint mBuffer;
68};
69
70// This tests the assumption that float attribs of different size
71// should not internally cause a vertex shader recompile (for conversion).
Austin Kinross18b931d2014-09-29 12:58:31 -070072TYPED_TEST(ProgramBinaryTest, FloatDynamicShaderSize)
Jamie Madill7a29e4a2014-05-02 10:41:48 -040073{
74 glUseProgram(mProgram);
75 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
76
77 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8, NULL);
78 glEnableVertexAttribArray(0);
79 glDrawArrays(GL_POINTS, 0, 1);
80
81 GLint programLength;
82 glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength);
83
84 EXPECT_GL_NO_ERROR();
85
86 for (GLsizei size = 1; size <= 3; size++)
87 {
88 glVertexAttribPointer(0, size, GL_FLOAT, GL_FALSE, 8, NULL);
89 glEnableVertexAttribArray(0);
90 glDrawArrays(GL_POINTS, 0, 1);
91
92 GLint newProgramLength;
93 glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &newProgramLength);
94 EXPECT_GL_NO_ERROR();
95 EXPECT_EQ(programLength, newProgramLength);
96 }
97}
Brandon Jones993d08d2014-10-10 14:32:57 -070098
99// This tests the ability to successfully save and load a program binary.
100TYPED_TEST(ProgramBinaryTest, SaveAndLoadBinary)
101{
102 GLint programLength = 0;
103 GLint writtenLength = 0;
104 GLenum binaryFormat = 0;
105
106 glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength);
107 EXPECT_GL_NO_ERROR();
108
109 std::vector<uint8_t> binary(programLength);
110 glGetProgramBinaryOES(mProgram, programLength, &writtenLength, &binaryFormat, binary.data());
111 EXPECT_GL_NO_ERROR();
112
113 // The lengths reported by glGetProgramiv and glGetProgramBinaryOES should match
114 EXPECT_EQ(programLength, writtenLength);
115
116 if (writtenLength)
117 {
118 GLuint program2 = glCreateProgram();
119 glProgramBinaryOES(program2, binaryFormat, binary.data(), writtenLength);
120
121 EXPECT_GL_NO_ERROR();
122
123 GLint linkStatus;
124 glGetProgramiv(program2, GL_LINK_STATUS, &linkStatus);
125 if (linkStatus == 0)
126 {
127 GLint infoLogLength;
128 glGetProgramiv(program2, GL_INFO_LOG_LENGTH, &infoLogLength);
129
130 std::vector<GLchar> infoLog(infoLogLength);
131 glGetProgramInfoLog(program2, infoLog.size(), NULL, &infoLog[0]);
132
133 FAIL() << "program link failed: " << &infoLog[0];
134 }
135 else
136 {
137 glUseProgram(program2);
138 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
139
140 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8, NULL);
141 glEnableVertexAttribArray(0);
142 glDrawArrays(GL_POINTS, 0, 1);
143
144 EXPECT_GL_NO_ERROR();
145 }
146
147 glDeleteProgram(program2);
148 }
149}