blob: eedf599cfe9ec25057eededb4ac80adf834d9d77 [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.
Geoff Lang0d3683c2014-10-23 11:08:16 -04006ANGLE_TYPED_TEST_CASE(ProgramBinaryTest, ES2_D3D9, ES2_D3D11);
Austin Kinross18b931d2014-09-29 12:58:31 -07007
8template<typename T>
Jamie Madill7a29e4a2014-05-02 10:41:48 -04009class ProgramBinaryTest : public ANGLETest
10{
Geoff Lang0d3683c2014-10-23 11:08:16 -040011 protected:
12 ProgramBinaryTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetPlatform())
Jamie Madill7a29e4a2014-05-02 10:41:48 -040013 {
14 setWindowWidth(128);
15 setWindowHeight(128);
16 setConfigRedBits(8);
17 setConfigGreenBits(8);
18 setConfigBlueBits(8);
19 setConfigAlphaBits(8);
20 }
21
22 virtual void SetUp()
23 {
24 ANGLETest::SetUp();
25
26 const std::string vertexShaderSource = SHADER_SOURCE
27 (
28 attribute vec4 inputAttribute;
29 void main()
30 {
31 gl_Position = inputAttribute;
32 }
33 );
34
35 const std::string fragmentShaderSource = SHADER_SOURCE
36 (
37 void main()
38 {
39 gl_FragColor = vec4(1,0,0,1);
40 }
41 );
42
Jamie Madill5599c8f2014-08-26 13:16:39 -040043 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill7a29e4a2014-05-02 10:41:48 -040044 if (mProgram == 0)
45 {
46 FAIL() << "shader compilation failed.";
47 }
48
49 glGenBuffers(1, &mBuffer);
50 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
51 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_STATIC_DRAW);
52 glBindBuffer(GL_ARRAY_BUFFER, 0);
53
54 ASSERT_GL_NO_ERROR();
55 }
56
57 virtual void TearDown()
58 {
59 glDeleteProgram(mProgram);
60 glDeleteBuffers(1, &mBuffer);
61
62 ANGLETest::TearDown();
63 }
64
65 GLuint mProgram;
66 GLuint mBuffer;
67};
68
69// This tests the assumption that float attribs of different size
70// should not internally cause a vertex shader recompile (for conversion).
Austin Kinross18b931d2014-09-29 12:58:31 -070071TYPED_TEST(ProgramBinaryTest, FloatDynamicShaderSize)
Jamie Madill7a29e4a2014-05-02 10:41:48 -040072{
73 glUseProgram(mProgram);
74 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
75
76 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8, NULL);
77 glEnableVertexAttribArray(0);
78 glDrawArrays(GL_POINTS, 0, 1);
79
80 GLint programLength;
81 glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength);
82
83 EXPECT_GL_NO_ERROR();
84
85 for (GLsizei size = 1; size <= 3; size++)
86 {
87 glVertexAttribPointer(0, size, GL_FLOAT, GL_FALSE, 8, NULL);
88 glEnableVertexAttribArray(0);
89 glDrawArrays(GL_POINTS, 0, 1);
90
91 GLint newProgramLength;
92 glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &newProgramLength);
93 EXPECT_GL_NO_ERROR();
94 EXPECT_EQ(programLength, newProgramLength);
95 }
96}
Brandon Jones993d08d2014-10-10 14:32:57 -070097
98// This tests the ability to successfully save and load a program binary.
99TYPED_TEST(ProgramBinaryTest, SaveAndLoadBinary)
100{
101 GLint programLength = 0;
102 GLint writtenLength = 0;
103 GLenum binaryFormat = 0;
104
105 glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength);
106 EXPECT_GL_NO_ERROR();
107
108 std::vector<uint8_t> binary(programLength);
109 glGetProgramBinaryOES(mProgram, programLength, &writtenLength, &binaryFormat, binary.data());
110 EXPECT_GL_NO_ERROR();
111
112 // The lengths reported by glGetProgramiv and glGetProgramBinaryOES should match
113 EXPECT_EQ(programLength, writtenLength);
114
115 if (writtenLength)
116 {
117 GLuint program2 = glCreateProgram();
118 glProgramBinaryOES(program2, binaryFormat, binary.data(), writtenLength);
119
120 EXPECT_GL_NO_ERROR();
121
122 GLint linkStatus;
123 glGetProgramiv(program2, GL_LINK_STATUS, &linkStatus);
124 if (linkStatus == 0)
125 {
126 GLint infoLogLength;
127 glGetProgramiv(program2, GL_INFO_LOG_LENGTH, &infoLogLength);
128
Geoff Lang981afd72014-11-05 16:30:36 -0500129 if (infoLogLength > 0)
130 {
131 std::vector<GLchar> infoLog(infoLogLength);
132 glGetProgramInfoLog(program2, infoLog.size(), NULL, &infoLog[0]);
133 FAIL() << "program link failed: " << &infoLog[0];
134 }
135 else
136 {
137 FAIL() << "program link failed.";
138 }
Brandon Jones993d08d2014-10-10 14:32:57 -0700139 }
140 else
141 {
142 glUseProgram(program2);
143 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
144
145 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8, NULL);
146 glEnableVertexAttribArray(0);
147 glDrawArrays(GL_POINTS, 0, 1);
148
149 EXPECT_GL_NO_ERROR();
150 }
151
152 glDeleteProgram(program2);
153 }
154}