blob: d1fc947c7ad56c4a0538455e1d69288038041fab [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.
Geoff Lang0d3683c2014-10-23 11:08:16 -04006ANGLE_TYPED_TEST_CASE(BufferDataTest, ES2_D3D9, ES2_D3D11);
Austin Kinross18b931d2014-09-29 12:58:31 -07007
8template<typename T>
Jamie Madill80b95282014-05-06 13:57:43 -04009class BufferDataTest : public ANGLETest
10{
Jamie Madill5c1e58d2014-08-04 10:47:58 -040011 protected:
Geoff Lang0d3683c2014-10-23 11:08:16 -040012 BufferDataTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetPlatform())
Jamie Madill80b95282014-05-06 13:57:43 -040013 {
14 setWindowWidth(16);
15 setWindowHeight(16);
16 setConfigRedBits(8);
17 setConfigGreenBits(8);
18 setConfigBlueBits(8);
19 setConfigAlphaBits(8);
20 setConfigDepthBits(24);
Austin Kinross18b931d2014-09-29 12:58:31 -070021
22 mBuffer = 0;
23 mProgram = 0;
24 mAttribLocation = -1;
Jamie Madill80b95282014-05-06 13:57:43 -040025 }
26
27 virtual void SetUp()
28 {
29 ANGLETest::SetUp();
30
31 const char * vsSource = SHADER_SOURCE
32 (
33 attribute vec4 position;
34 attribute float in_attrib;
35 varying float v_attrib;
36 void main()
37 {
38 v_attrib = in_attrib;
39 gl_Position = position;
40 }
41 );
42
43 const char * fsSource = SHADER_SOURCE
44 (
45 precision mediump float;
46 varying float v_attrib;
47 void main()
48 {
49 gl_FragColor = vec4(v_attrib, 0, 0, 1);
50 }
51 );
52
53 glGenBuffers(1, &mBuffer);
54 ASSERT_NE(mBuffer, 0U);
55
Jamie Madill5599c8f2014-08-26 13:16:39 -040056 mProgram = CompileProgram(vsSource, fsSource);
Jamie Madill80b95282014-05-06 13:57:43 -040057 ASSERT_NE(mProgram, 0U);
58
59 mAttribLocation = glGetAttribLocation(mProgram, "in_attrib");
60 ASSERT_NE(mAttribLocation, -1);
61
62 glClearColor(0, 0, 0, 0);
63 glClearDepthf(0.0);
64 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
65
66 glDisable(GL_DEPTH_TEST);
67
68 ASSERT_GL_NO_ERROR();
69 }
70
71 virtual void TearDown()
72 {
73 glDeleteBuffers(1, &mBuffer);
74 glDeleteProgram(mProgram);
75
76 ANGLETest::TearDown();
77 }
78
79 GLuint mBuffer;
80 GLuint mProgram;
81 GLint mAttribLocation;
82};
83
Austin Kinross18b931d2014-09-29 12:58:31 -070084TYPED_TEST(BufferDataTest, NULLData)
Jamie Madill80b95282014-05-06 13:57:43 -040085{
86 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
87 EXPECT_GL_NO_ERROR();
88
89 const int numIterations = 128;
90 for (int i = 0; i < numIterations; ++i)
91 {
92 GLsizei bufferSize = sizeof(GLfloat) * (i + 1);
93 glBufferData(GL_ARRAY_BUFFER, bufferSize, NULL, GL_STATIC_DRAW);
94 EXPECT_GL_NO_ERROR();
95
96 for (int j = 0; j < bufferSize; j++)
97 {
98 for (int k = 0; k < bufferSize - j; k++)
99 {
100 glBufferSubData(GL_ARRAY_BUFFER, k, j, NULL);
101 EXPECT_GL_NO_ERROR();
102 }
103 }
104 }
105}
106
Austin Kinross18b931d2014-09-29 12:58:31 -0700107TYPED_TEST(BufferDataTest, ZeroNonNULLData)
Jamie Madille09f1c82014-06-12 11:10:12 -0400108{
109 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
110 EXPECT_GL_NO_ERROR();
111
112 char *zeroData = new char[0];
113 glBufferData(GL_ARRAY_BUFFER, 0, zeroData, GL_STATIC_DRAW);
114 EXPECT_GL_NO_ERROR();
115
116 glBufferSubData(GL_ARRAY_BUFFER, 0, 0, zeroData);
117 EXPECT_GL_NO_ERROR();
118
119 delete [] zeroData;
120}
121
Austin Kinross18b931d2014-09-29 12:58:31 -0700122TYPED_TEST(BufferDataTest, NULLResolvedData)
Jamie Madillee009b82014-09-19 13:17:51 -0400123{
124 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
125 glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
126
127 glUseProgram(mProgram);
128 glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 4, NULL);
129 glEnableVertexAttribArray(mAttribLocation);
130 glBindBuffer(GL_ARRAY_BUFFER, 0);
131
132 drawQuad(mProgram, "position", 0.5f);
133}
134
Austin Kinross18b931d2014-09-29 12:58:31 -0700135TYPED_TEST(BufferDataTest, HugeSetDataShouldNotCrash)
Jamie Madill80b95282014-05-06 13:57:43 -0400136{
137 glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
138 EXPECT_GL_NO_ERROR();
139
Jamie Madill18afd772014-08-04 13:22:22 -0400140 GLsizei allocSize = std::numeric_limits<GLsizei>::max() >> 2;
Jamie Madill80b95282014-05-06 13:57:43 -0400141
Jamie Madill18afd772014-08-04 13:22:22 -0400142 uint8_t *data = NULL;
143 while (data == NULL && allocSize >= 4)
Jamie Madill80b95282014-05-06 13:57:43 -0400144 {
Jamie Madill18afd772014-08-04 13:22:22 -0400145 data = new (std::nothrow) uint8_t[allocSize];
146
147 if (data == NULL)
148 {
Jamie Madill4f2bf3a2014-08-20 16:03:52 -0400149 allocSize >>= 1;
Jamie Madill18afd772014-08-04 13:22:22 -0400150 }
Jamie Madill80b95282014-05-06 13:57:43 -0400151 }
152
Jamie Madill18afd772014-08-04 13:22:22 -0400153 ASSERT_NE(static_cast<uint8_t*>(NULL), data);
154 memset(data, 0, allocSize);
Jamie Madill80b95282014-05-06 13:57:43 -0400155
156 float * fValue = reinterpret_cast<float*>(data);
157 for (unsigned int f = 0; f < 6; f++)
158 {
159 fValue[f] = 1.0f;
160 }
161
Jamie Madill18afd772014-08-04 13:22:22 -0400162 glBufferData(GL_ARRAY_BUFFER, allocSize, data, GL_STATIC_DRAW);
Jamie Madill80b95282014-05-06 13:57:43 -0400163
164 GLenum error = glGetError();
165 if (error == GL_NO_ERROR)
166 {
167 // If we didn't fail because of an out of memory error, try drawing a quad
168 // using the large buffer
169
170 // DISABLED because it takes a long time, but left for posterity
171
172 //glUseProgram(mProgram);
173 //glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 4, NULL);
174 //glEnableVertexAttribArray(mAttribLocation);
175 //glBindBuffer(GL_ARRAY_BUFFER, 0);
176 //drawQuad(mProgram, "position", 0.5f);
177 //swapBuffers();
178
179 //// Draw operations can also generate out-of-memory, which is in-spec
180 //error = glGetError();
181 //if (error == GL_NO_ERROR)
182 //{
183 // GLint viewportSize[4];
184 // glGetIntegerv(GL_VIEWPORT, viewportSize);
185
186 // GLint midPixelX = (viewportSize[0] + viewportSize[2]) / 2;
187 // GLint midPixelY = (viewportSize[1] + viewportSize[3]) / 2;
188
189 // EXPECT_PIXEL_EQ(midPixelX, midPixelY, 255, 0, 0, 255);
190 //}
191 //else
192 //{
193 // EXPECT_EQ(GL_OUT_OF_MEMORY, error);
194 //}
195 }
196 else
197 {
198 EXPECT_EQ(GL_OUT_OF_MEMORY, error);
199 }
200
201 delete[] data;
202}
203
Austin Kinross18b931d2014-09-29 12:58:31 -0700204// 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 -0400205ANGLE_TYPED_TEST_CASE(IndexedBufferCopyTest, ES3_D3D11);
Austin Kinross18b931d2014-09-29 12:58:31 -0700206
207template<typename T>
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400208class IndexedBufferCopyTest : public ANGLETest
209{
210 protected:
Geoff Lang0d3683c2014-10-23 11:08:16 -0400211 IndexedBufferCopyTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetPlatform())
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400212 {
213 setWindowWidth(16);
214 setWindowHeight(16);
215 setConfigRedBits(8);
216 setConfigGreenBits(8);
217 setConfigBlueBits(8);
218 setConfigAlphaBits(8);
219 setConfigDepthBits(24);
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400220 }
221
222 virtual void SetUp()
223 {
224 ANGLETest::SetUp();
225
226 const char * vsSource = SHADER_SOURCE
227 (
228 attribute vec3 in_attrib;
229 varying vec3 v_attrib;
230 void main()
231 {
232 v_attrib = in_attrib;
233 gl_Position = vec4(0.0, 0.0, 0.5, 1.0);
234 gl_PointSize = 100.0;
235 }
236 );
237
238 const char * fsSource = SHADER_SOURCE
239 (
240 precision mediump float;
241 varying vec3 v_attrib;
242 void main()
243 {
244 gl_FragColor = vec4(v_attrib, 1);
245 }
246 );
247
248 glGenBuffers(2, mBuffers);
249 ASSERT_NE(mBuffers[0], 0U);
250 ASSERT_NE(mBuffers[1], 0U);
251
252 glGenBuffers(1, &mElementBuffer);
253 ASSERT_NE(mElementBuffer, 0U);
254
Jamie Madill5599c8f2014-08-26 13:16:39 -0400255 mProgram = CompileProgram(vsSource, fsSource);
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400256 ASSERT_NE(mProgram, 0U);
257
258 mAttribLocation = glGetAttribLocation(mProgram, "in_attrib");
259 ASSERT_NE(mAttribLocation, -1);
260
261 glClearColor(0, 0, 0, 0);
262 glDisable(GL_DEPTH_TEST);
263 glClear(GL_COLOR_BUFFER_BIT);
264
265 ASSERT_GL_NO_ERROR();
266 }
267
268 virtual void TearDown()
269 {
270 glDeleteBuffers(2, mBuffers);
271 glDeleteBuffers(1, &mElementBuffer);
272 glDeleteProgram(mProgram);
273
274 ANGLETest::TearDown();
275 }
276
277 GLuint mBuffers[2];
278 GLuint mElementBuffer;
279 GLuint mProgram;
280 GLint mAttribLocation;
281};
282
283// The following test covers an ANGLE bug where our index ranges
284// weren't updated from CopyBufferSubData calls
285// https://code.google.com/p/angleproject/issues/detail?id=709
Austin Kinross18b931d2014-09-29 12:58:31 -0700286TYPED_TEST(IndexedBufferCopyTest, IndexRangeBug)
Jamie Madill5c1e58d2014-08-04 10:47:58 -0400287{
288 unsigned char vertexData[] = { 255, 0, 0, 0, 0, 0 };
289 unsigned int indexData[] = { 0, 1 };
290
291 glBindBuffer(GL_ARRAY_BUFFER, mBuffers[0]);
292 glBufferData(GL_ARRAY_BUFFER, sizeof(char) * 6, vertexData, GL_STATIC_DRAW);
293
294 glUseProgram(mProgram);
295 glVertexAttribPointer(mAttribLocation, 3, GL_UNSIGNED_BYTE, GL_TRUE, 3, NULL);
296 glEnableVertexAttribArray(mAttribLocation);
297
298 ASSERT_GL_NO_ERROR();
299
300 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mElementBuffer);
301 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * 1, indexData, GL_STATIC_DRAW);
302
303 glUseProgram(mProgram);
304
305 ASSERT_GL_NO_ERROR();
306
307 glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, NULL);
308
309 EXPECT_GL_NO_ERROR();
310 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
311
312 glBindBuffer(GL_COPY_READ_BUFFER, mBuffers[1]);
313 glBufferData(GL_COPY_READ_BUFFER, 4, &indexData[1], GL_STATIC_DRAW);
314
315 glBindBuffer(GL_COPY_WRITE_BUFFER, mElementBuffer);
316
317 glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(int));
318
319 ASSERT_GL_NO_ERROR();
320
321 glClear(GL_COLOR_BUFFER_BIT);
322 EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 0);
323
324 unsigned char newData[] = { 0, 255, 0 };
325 glBufferSubData(GL_ARRAY_BUFFER, 3, 3, newData);
326
327 glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, NULL);
328
329 EXPECT_GL_NO_ERROR();
330 EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
331}