blob: b9266e1a8d8c73f2fae8733787a4cc224db01cbe [file] [log] [blame]
Jamie Madill80b95282014-05-06 13:57:43 -04001#include "ANGLETest.h"
2
Jamie Madill18afd772014-08-04 13:22:22 -04003#include <cstdint>
4
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(BufferDataTest, TestFixtureTypes);
8
9template<typename T>
Jamie Madill80b95282014-05-06 13:57:43 -040010class BufferDataTest : public ANGLETest
11{
Jamie Madill5c1e58d2014-08-04 10:47:58 -040012 protected:
Austin Kinross18b931d2014-09-29 12:58:31 -070013 BufferDataTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
Jamie Madill80b95282014-05-06 13:57:43 -040014 {
15 setWindowWidth(16);
16 setWindowHeight(16);
17 setConfigRedBits(8);
18 setConfigGreenBits(8);
19 setConfigBlueBits(8);
20 setConfigAlphaBits(8);
21 setConfigDepthBits(24);
Austin Kinross18b931d2014-09-29 12:58:31 -070022
23 mBuffer = 0;
24 mProgram = 0;
25 mAttribLocation = -1;
Jamie Madill80b95282014-05-06 13:57:43 -040026 }
27
28 virtual void SetUp()
29 {
30 ANGLETest::SetUp();
31
32 const char * vsSource = SHADER_SOURCE
33 (
34 attribute vec4 position;
35 attribute float in_attrib;
36 varying float v_attrib;
37 void main()
38 {
39 v_attrib = in_attrib;
40 gl_Position = position;
41 }
42 );
43
44 const char * fsSource = SHADER_SOURCE
45 (
46 precision mediump float;
47 varying float v_attrib;
48 void main()
49 {
50 gl_FragColor = vec4(v_attrib, 0, 0, 1);
51 }
52 );
53
54 glGenBuffers(1, &mBuffer);
55 ASSERT_NE(mBuffer, 0U);
56
Jamie Madill5599c8f2014-08-26 13:16:39 -040057 mProgram = CompileProgram(vsSource, fsSource);
Jamie Madill80b95282014-05-06 13:57:43 -040058 ASSERT_NE(mProgram, 0U);
59
60 mAttribLocation = glGetAttribLocation(mProgram, "in_attrib");
61 ASSERT_NE(mAttribLocation, -1);
62
63 glClearColor(0, 0, 0, 0);
64 glClearDepthf(0.0);
65 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
66
67 glDisable(GL_DEPTH_TEST);
68
69 ASSERT_GL_NO_ERROR();
70 }
71
72 virtual void TearDown()
73 {
74 glDeleteBuffers(1, &mBuffer);
75 glDeleteProgram(mProgram);
76
77 ANGLETest::TearDown();
78 }
79
80 GLuint mBuffer;
81 GLuint mProgram;
82 GLint mAttribLocation;
83};
84
Austin Kinross18b931d2014-09-29 12:58:31 -070085TYPED_TEST(BufferDataTest, NULLData)
Jamie Madill80b95282014-05-06 13:57:43 -040086{
87 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
88 EXPECT_GL_NO_ERROR();
89
90 const int numIterations = 128;
91 for (int i = 0; i < numIterations; ++i)
92 {
93 GLsizei bufferSize = sizeof(GLfloat) * (i + 1);
94 glBufferData(GL_ARRAY_BUFFER, bufferSize, NULL, GL_STATIC_DRAW);
95 EXPECT_GL_NO_ERROR();
96
97 for (int j = 0; j < bufferSize; j++)
98 {
99 for (int k = 0; k < bufferSize - j; k++)
100 {
101 glBufferSubData(GL_ARRAY_BUFFER, k, j, NULL);
102 EXPECT_GL_NO_ERROR();
103 }
104 }
105 }
106}
107
Austin Kinross18b931d2014-09-29 12:58:31 -0700108TYPED_TEST(BufferDataTest, ZeroNonNULLData)
Jamie Madille09f1c82014-06-12 11:10:12 -0400109{
110 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
111 EXPECT_GL_NO_ERROR();
112
113 char *zeroData = new char[0];
114 glBufferData(GL_ARRAY_BUFFER, 0, zeroData, GL_STATIC_DRAW);
115 EXPECT_GL_NO_ERROR();
116
117 glBufferSubData(GL_ARRAY_BUFFER, 0, 0, zeroData);
118 EXPECT_GL_NO_ERROR();
119
120 delete [] zeroData;
121}
122
Austin Kinross18b931d2014-09-29 12:58:31 -0700123TYPED_TEST(BufferDataTest, NULLResolvedData)
Jamie Madillee009b82014-09-19 13:17:51 -0400124{
125 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
126 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
127
128 glUseProgram(mProgram);
129 glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 4, NULL);
130 glEnableVertexAttribArray(mAttribLocation);
131 glBindBuffer(GL_ARRAY_BUFFER, 0);
132
133 drawQuad(mProgram, "position", 0.5f);
134}
135
Austin Kinross18b931d2014-09-29 12:58:31 -0700136TYPED_TEST(BufferDataTest, HugeSetDataShouldNotCrash)
Jamie Madill80b95282014-05-06 13:57:43 -0400137{
138 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
139 EXPECT_GL_NO_ERROR();
140
Jamie Madill18afd772014-08-04 13:22:22 -0400141 GLsizei allocSize = std::numeric_limits<GLsizei>::max() >> 2;
Jamie Madill80b95282014-05-06 13:57:43 -0400142
Jamie Madill18afd772014-08-04 13:22:22 -0400143 uint8_t *data = NULL;
144 while (data == NULL && allocSize >= 4)
Jamie Madill80b95282014-05-06 13:57:43 -0400145 {
Jamie Madill18afd772014-08-04 13:22:22 -0400146 data = new (std::nothrow) uint8_t[allocSize];
147
148 if (data == NULL)
149 {
Jamie Madill4f2bf3a2014-08-20 16:03:52 -0400150 allocSize >>= 1;
Jamie Madill18afd772014-08-04 13:22:22 -0400151 }
Jamie Madill80b95282014-05-06 13:57:43 -0400152 }
153
Jamie Madill18afd772014-08-04 13:22:22 -0400154 ASSERT_NE(static_cast<uint8_t*>(NULL), data);
155 memset(data, 0, allocSize);
Jamie Madill80b95282014-05-06 13:57:43 -0400156
157 float * fValue = reinterpret_cast<float*>(data);
158 for (unsigned int f = 0; f < 6; f++)
159 {
160 fValue[f] = 1.0f;
161 }
162
Jamie Madill18afd772014-08-04 13:22:22 -0400163 glBufferData(GL_ARRAY_BUFFER, allocSize, data, GL_STATIC_DRAW);
Jamie Madill80b95282014-05-06 13:57:43 -0400164
165 GLenum error = glGetError();
166 if (error == GL_NO_ERROR)
167 {
168 // If we didn't fail because of an out of memory error, try drawing a quad
169 // using the large buffer
170
171 // DISABLED because it takes a long time, but left for posterity
172
173 //glUseProgram(mProgram);
174 //glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 4, NULL);
175 //glEnableVertexAttribArray(mAttribLocation);
176 //glBindBuffer(GL_ARRAY_BUFFER, 0);
177 //drawQuad(mProgram, "position", 0.5f);
178 //swapBuffers();
179
180 //// Draw operations can also generate out-of-memory, which is in-spec
181 //error = glGetError();
182 //if (error == GL_NO_ERROR)
183 //{
184 // GLint viewportSize[4];
185 // glGetIntegerv(GL_VIEWPORT, viewportSize);
186
187 // GLint midPixelX = (viewportSize[0] + viewportSize[2]) / 2;
188 // GLint midPixelY = (viewportSize[1] + viewportSize[3]) / 2;
189
190 // EXPECT_PIXEL_EQ(midPixelX, midPixelY, 255, 0, 0, 255);
191 //}
192 //else
193 //{
194 // EXPECT_EQ(GL_OUT_OF_MEMORY, error);
195 //}
196 }
197 else
198 {
199 EXPECT_EQ(GL_OUT_OF_MEMORY, error);
200 }
201
202 delete[] data;
203}
204
Austin Kinross18b931d2014-09-29 12:58:31 -0700205// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
206typedef ::testing::Types<TFT<Gles::Three, Rend::D3D11>> TestFixtureTypesIndexedBufferCopyTest;
207TYPED_TEST_CASE(IndexedBufferCopyTest, TestFixtureTypesIndexedBufferCopyTest);
208
209template<typename T>
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400210class IndexedBufferCopyTest : public ANGLETest
211{
212 protected:
Austin Kinross18b931d2014-09-29 12:58:31 -0700213 IndexedBufferCopyTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400214 {
215 setWindowWidth(16);
216 setWindowHeight(16);
217 setConfigRedBits(8);
218 setConfigGreenBits(8);
219 setConfigBlueBits(8);
220 setConfigAlphaBits(8);
221 setConfigDepthBits(24);
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400222 }
223
224 virtual void SetUp()
225 {
226 ANGLETest::SetUp();
227
228 const char * vsSource = SHADER_SOURCE
229 (
230 attribute vec3 in_attrib;
231 varying vec3 v_attrib;
232 void main()
233 {
234 v_attrib = in_attrib;
235 gl_Position = vec4(0.0, 0.0, 0.5, 1.0);
236 gl_PointSize = 100.0;
237 }
238 );
239
240 const char * fsSource = SHADER_SOURCE
241 (
242 precision mediump float;
243 varying vec3 v_attrib;
244 void main()
245 {
246 gl_FragColor = vec4(v_attrib, 1);
247 }
248 );
249
250 glGenBuffers(2, mBuffers);
251 ASSERT_NE(mBuffers[0], 0U);
252 ASSERT_NE(mBuffers[1], 0U);
253
254 glGenBuffers(1, &mElementBuffer);
255 ASSERT_NE(mElementBuffer, 0U);
256
Jamie Madill5599c8f2014-08-26 13:16:39 -0400257 mProgram = CompileProgram(vsSource, fsSource);
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400258 ASSERT_NE(mProgram, 0U);
259
260 mAttribLocation = glGetAttribLocation(mProgram, "in_attrib");
261 ASSERT_NE(mAttribLocation, -1);
262
263 glClearColor(0, 0, 0, 0);
264 glDisable(GL_DEPTH_TEST);
265 glClear(GL_COLOR_BUFFER_BIT);
266
267 ASSERT_GL_NO_ERROR();
268 }
269
270 virtual void TearDown()
271 {
272 glDeleteBuffers(2, mBuffers);
273 glDeleteBuffers(1, &mElementBuffer);
274 glDeleteProgram(mProgram);
275
276 ANGLETest::TearDown();
277 }
278
279 GLuint mBuffers[2];
280 GLuint mElementBuffer;
281 GLuint mProgram;
282 GLint mAttribLocation;
283};
284
285// The following test covers an ANGLE bug where our index ranges
286// weren't updated from CopyBufferSubData calls
287// https://code.google.com/p/angleproject/issues/detail?id=709
Austin Kinross18b931d2014-09-29 12:58:31 -0700288TYPED_TEST(IndexedBufferCopyTest, IndexRangeBug)
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400289{
290 unsigned char vertexData[] = { 255, 0, 0, 0, 0, 0 };
291 unsigned int indexData[] = { 0, 1 };
292
293 glBindBuffer(GL_ARRAY_BUFFER, mBuffers[0]);
294 glBufferData(GL_ARRAY_BUFFER, sizeof(char) * 6, vertexData, GL_STATIC_DRAW);
295
296 glUseProgram(mProgram);
297 glVertexAttribPointer(mAttribLocation, 3, GL_UNSIGNED_BYTE, GL_TRUE, 3, NULL);
298 glEnableVertexAttribArray(mAttribLocation);
299
300 ASSERT_GL_NO_ERROR();
301
302 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mElementBuffer);
303 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * 1, indexData, GL_STATIC_DRAW);
304
305 glUseProgram(mProgram);
306
307 ASSERT_GL_NO_ERROR();
308
309 glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, NULL);
310
311 EXPECT_GL_NO_ERROR();
312 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
313
314 glBindBuffer(GL_COPY_READ_BUFFER, mBuffers[1]);
315 glBufferData(GL_COPY_READ_BUFFER, 4, &indexData[1], GL_STATIC_DRAW);
316
317 glBindBuffer(GL_COPY_WRITE_BUFFER, mElementBuffer);
318
319 glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(int));
320
321 ASSERT_GL_NO_ERROR();
322
323 glClear(GL_COLOR_BUFFER_BIT);
324 EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 0);
325
326 unsigned char newData[] = { 0, 255, 0 };
327 glBufferSubData(GL_ARRAY_BUFFER, 3, 3, newData);
328
329 glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, NULL);
330
331 EXPECT_GL_NO_ERROR();
332 EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
333}