blob: 7f2e44d9d2e7c5c65c0d10433a8425e0d5347080 [file] [log] [blame]
Geoff Lang8a079e52013-10-18 16:13:33 -04001#include "ANGLETest.h"
Jamie Madill8add0eb2014-08-26 13:16:35 -04002#include "OSWindow.h"
3
4OSWindow *ANGLETest::mOSWindow = NULL;
Geoff Lang8a079e52013-10-18 16:13:33 -04005
6ANGLETest::ANGLETest()
Jamie Madill34b66f32014-07-23 15:09:50 -04007 : mTestPlatform(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE),
Geoff Langf0955f12014-06-20 16:07:07 -04008 mClientVersion(2),
Geoff Langefc551f2013-10-31 10:20:28 -04009 mWidth(1280),
10 mHeight(720),
11 mRedBits(-1),
12 mGreenBits(-1),
13 mBlueBits(-1),
14 mAlphaBits(-1),
15 mDepthBits(-1),
16 mStencilBits(-1),
Jamie Madilldb74f182014-08-21 10:04:06 -040017 mMultisample(false),
18 mConfig(0),
19 mSurface(EGL_NO_SURFACE),
20 mContext(EGL_NO_CONTEXT),
21 mDisplay(EGL_NO_DISPLAY)
Geoff Lang8a079e52013-10-18 16:13:33 -040022{
23}
24
Geoff Lang8a079e52013-10-18 16:13:33 -040025void ANGLETest::SetUp()
26{
Jamie Madill39e7bc02014-08-21 10:04:07 -040027 ResizeWindow(mWidth, mHeight);
Geoff Lang8a079e52013-10-18 16:13:33 -040028 if (!createEGLContext())
29 {
30 FAIL() << "egl context creation failed.";
31 }
32}
33
34void ANGLETest::TearDown()
35{
36 swapBuffers();
37 if (!destroyEGLContext())
38 {
39 FAIL() << "egl context destruction failed.";
40 }
Jamie Madill8add0eb2014-08-26 13:16:35 -040041
42 // Check for quit message
43 Event myEvent;
44 while (mOSWindow->popEvent(&myEvent))
45 {
46 if (myEvent.Type == Event::EVENT_CLOSED)
47 {
48 exit(0);
49 }
50 }
Geoff Lang8a079e52013-10-18 16:13:33 -040051}
52
53void ANGLETest::swapBuffers()
54{
55 eglSwapBuffers(mDisplay, mSurface);
56}
57
58void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth)
59{
60 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
61
62 glUseProgram(program);
63
64 const GLfloat vertices[] =
65 {
66 -1.0f, 1.0f, quadDepth,
67 -1.0f, -1.0f, quadDepth,
68 1.0f, -1.0f, quadDepth,
69
70 -1.0f, 1.0f, quadDepth,
71 1.0f, -1.0f, quadDepth,
72 1.0f, 1.0f, quadDepth,
73 };
74
75 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
76 glEnableVertexAttribArray(positionLocation);
77
78 glDrawArrays(GL_TRIANGLES, 0, 6);
79
80 glDisableVertexAttribArray(positionLocation);
81 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
82
83 glUseProgram(0);
84}
85
Geoff Langefc551f2013-10-31 10:20:28 -040086GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
87{
88 GLuint shader = glCreateShader(type);
89
90 const char *sourceArray[1] = { source.c_str() };
91 glShaderSource(shader, 1, sourceArray, NULL);
92 glCompileShader(shader);
93
94 GLint compileResult;
95 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
96
97 if (compileResult == 0)
98 {
99 GLint infoLogLength;
100 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
101
102 std::vector<GLchar> infoLog(infoLogLength);
103 glGetShaderInfoLog(shader, infoLog.size(), NULL, infoLog.data());
104
105 std::cerr << "shader compilation failed: " << infoLog.data();
106
107 glDeleteShader(shader);
108 shader = 0;
109 }
110
111 return shader;
112}
113
Geoff Lang8a079e52013-10-18 16:13:33 -0400114GLuint ANGLETest::compileProgram(const std::string &vsSource, const std::string &fsSource)
115{
116 GLuint program = glCreateProgram();
117
Geoff Langefc551f2013-10-31 10:20:28 -0400118 GLuint vs = compileShader(GL_VERTEX_SHADER, vsSource);
119 GLuint fs = compileShader(GL_FRAGMENT_SHADER, fsSource);
120
121 if (vs == 0 || fs == 0)
122 {
123 glDeleteShader(fs);
124 glDeleteShader(vs);
125 glDeleteProgram(program);
126 return 0;
127 }
128
Geoff Lang8a079e52013-10-18 16:13:33 -0400129 glAttachShader(program, vs);
130 glDeleteShader(vs);
131
Geoff Lang8a079e52013-10-18 16:13:33 -0400132 glAttachShader(program, fs);
133 glDeleteShader(fs);
134
135 glLinkProgram(program);
136
137 GLint linkStatus;
138 glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
139
Geoff Langefc551f2013-10-31 10:20:28 -0400140 if (linkStatus == 0)
Geoff Lang8a079e52013-10-18 16:13:33 -0400141 {
Geoff Langefc551f2013-10-31 10:20:28 -0400142 GLint infoLogLength;
143 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
144
145 std::vector<GLchar> infoLog(infoLogLength);
146 glGetProgramInfoLog(program, infoLog.size(), NULL, infoLog.data());
147
148 std::cerr << "program link failed: " << infoLog.data();
149
Geoff Lang8a079e52013-10-18 16:13:33 -0400150 glDeleteProgram(program);
Geoff Langefc551f2013-10-31 10:20:28 -0400151 return 0;
Geoff Lang8a079e52013-10-18 16:13:33 -0400152 }
153
154 return program;
155}
156
157bool ANGLETest::extensionEnabled(const std::string &extName)
158{
159 const char* extString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
160 return strstr(extString, extName.c_str()) != NULL;
161}
162
163void ANGLETest::setClientVersion(int clientVersion)
164{
165 mClientVersion = clientVersion;
166}
167
168void ANGLETest::setWindowWidth(int width)
169{
170 mWidth = width;
171}
172
173void ANGLETest::setWindowHeight(int height)
174{
175 mHeight = height;
176}
177
Geoff Langefc551f2013-10-31 10:20:28 -0400178void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400179{
180 mRedBits = bits;
181}
182
Geoff Langefc551f2013-10-31 10:20:28 -0400183void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400184{
185 mGreenBits = bits;
186}
187
Geoff Langefc551f2013-10-31 10:20:28 -0400188void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400189{
190 mBlueBits = bits;
191}
192
Geoff Langefc551f2013-10-31 10:20:28 -0400193void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400194{
195 mAlphaBits = bits;
196}
197
Geoff Langefc551f2013-10-31 10:20:28 -0400198void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400199{
200 mDepthBits = bits;
201}
202
Geoff Langefc551f2013-10-31 10:20:28 -0400203void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400204{
205 mStencilBits = bits;
206}
207
208void ANGLETest::setMultisampleEnabled(bool enabled)
209{
210 mMultisample = enabled;
211}
212
213int ANGLETest::getClientVersion() const
214{
215 return mClientVersion;
216}
217
218int ANGLETest::getWindowWidth() const
219{
220 return mWidth;
221}
222
223int ANGLETest::getWindowHeight() const
224{
225 return mHeight;
226}
227
Geoff Langefc551f2013-10-31 10:20:28 -0400228int ANGLETest::getConfigRedBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400229{
230 return mRedBits;
231}
232
Geoff Langefc551f2013-10-31 10:20:28 -0400233int ANGLETest::getConfigGreenBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400234{
235 return mGreenBits;
236}
237
Geoff Langefc551f2013-10-31 10:20:28 -0400238int ANGLETest::getConfigBlueBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400239{
240 return mBlueBits;
241}
242
Geoff Langefc551f2013-10-31 10:20:28 -0400243int ANGLETest::getConfigAlphaBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400244{
245 return mAlphaBits;
246}
247
Geoff Langefc551f2013-10-31 10:20:28 -0400248int ANGLETest::getConfigDepthBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400249{
250 return mDepthBits;
251}
252
Geoff Langefc551f2013-10-31 10:20:28 -0400253int ANGLETest::getConfigStencilBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400254{
255 return mStencilBits;
256}
257
Geoff Langefc551f2013-10-31 10:20:28 -0400258bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400259{
260 return mMultisample;
261}
262
263bool ANGLETest::createEGLContext()
264{
Geoff Langf0955f12014-06-20 16:07:07 -0400265 PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(eglGetProcAddress("eglGetPlatformDisplayEXT"));
266 if (!eglGetPlatformDisplayEXT)
267 {
268 return false;
269 }
270
271 const EGLint displayAttributes[] =
272 {
273 EGL_PLATFORM_ANGLE_TYPE_ANGLE, mTestPlatform,
274 EGL_NONE,
275 };
276
Jamie Madill8add0eb2014-08-26 13:16:35 -0400277 mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, mOSWindow->getNativeDisplay(), displayAttributes);
Geoff Langf0955f12014-06-20 16:07:07 -0400278 if (mDisplay == EGL_NO_DISPLAY)
279 {
280 destroyEGLContext();
281 return false;
282 }
283
284 EGLint majorVersion, minorVersion;
285 if (!eglInitialize(mDisplay, &majorVersion, &minorVersion))
286 {
287 destroyEGLContext();
288 return false;
289 }
290
291 eglBindAPI(EGL_OPENGL_ES_API);
292 if (eglGetError() != EGL_SUCCESS)
293 {
294 destroyEGLContext();
295 return false;
296 }
297
Geoff Lang8a079e52013-10-18 16:13:33 -0400298 const EGLint configAttributes[] =
299 {
300 EGL_RED_SIZE, (mRedBits >= 0) ? mRedBits : EGL_DONT_CARE,
301 EGL_GREEN_SIZE, (mGreenBits >= 0) ? mGreenBits : EGL_DONT_CARE,
302 EGL_BLUE_SIZE, (mBlueBits >= 0) ? mBlueBits : EGL_DONT_CARE,
303 EGL_ALPHA_SIZE, (mAlphaBits >= 0) ? mAlphaBits : EGL_DONT_CARE,
304 EGL_DEPTH_SIZE, (mDepthBits >= 0) ? mDepthBits : EGL_DONT_CARE,
305 EGL_STENCIL_SIZE, (mStencilBits >= 0) ? mStencilBits : EGL_DONT_CARE,
306 EGL_SAMPLE_BUFFERS, mMultisample ? 1 : 0,
307 EGL_NONE
308 };
309
310 EGLint configCount;
311 if (!eglChooseConfig(mDisplay, configAttributes, &mConfig, 1, &configCount) || (configCount != 1))
312 {
313 destroyEGLContext();
314 return false;
315 }
316
317 eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &mRedBits);
318 eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &mGreenBits);
319 eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &mBlueBits);
320 eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &mBlueBits);
321 eglGetConfigAttrib(mDisplay, mConfig, EGL_DEPTH_SIZE, &mDepthBits);
322 eglGetConfigAttrib(mDisplay, mConfig, EGL_STENCIL_SIZE, &mStencilBits);
323
324 EGLint samples;
325 eglGetConfigAttrib(mDisplay, mConfig, EGL_SAMPLE_BUFFERS, &samples);
326 mMultisample = (samples != 0);
327
Jamie Madill8add0eb2014-08-26 13:16:35 -0400328 mSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), NULL);
Geoff Lang8a079e52013-10-18 16:13:33 -0400329 if(mSurface == EGL_NO_SURFACE)
330 {
331 eglGetError(); // Clear error
332 mSurface = eglCreateWindowSurface(mDisplay, mConfig, NULL, NULL);
333 }
334
335 if (eglGetError() != EGL_SUCCESS)
336 {
337 destroyEGLContext();
338 return false;
339 }
340
341 EGLint contextAttibutes[] =
342 {
343 EGL_CONTEXT_CLIENT_VERSION, mClientVersion,
344 EGL_NONE
345 };
346 mContext = eglCreateContext(mDisplay, mConfig, NULL, contextAttibutes);
347 if (eglGetError() != EGL_SUCCESS)
348 {
349 destroyEGLContext();
350 return false;
351 }
352
353 eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
354 if (eglGetError() != EGL_SUCCESS)
355 {
356 destroyEGLContext();
357 return false;
358 }
359
360 return true;
361}
362
363bool ANGLETest::destroyEGLContext()
364{
Jamie Madill34b66f32014-07-23 15:09:50 -0400365 if (mDisplay != EGL_NO_DISPLAY)
366 {
367 eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
368
369 if (mSurface != EGL_NO_SURFACE)
370 {
371 eglDestroySurface(mDisplay, mSurface);
372 mSurface = EGL_NO_SURFACE;
373 }
374
375 if (mContext != EGL_NO_CONTEXT)
376 {
377 eglDestroyContext(mDisplay, mContext);
378 mContext = EGL_NO_CONTEXT;
379 }
380
381 eglTerminate(mDisplay);
382 mDisplay = EGL_NO_DISPLAY;
383 }
Geoff Lang8a079e52013-10-18 16:13:33 -0400384
385 return true;
386}
Geoff Langbb134672013-10-23 13:06:46 -0400387
Jamie Madill8add0eb2014-08-26 13:16:35 -0400388bool ANGLETest::InitTestWindow()
389{
390 mOSWindow = CreateOSWindow();
391 if (!mOSWindow->initialize("ANGLE_TEST", 128, 128))
392 {
393 return false;
394 }
395
396 mOSWindow->setVisible(true);
397
398 return true;
399}
400
401bool ANGLETest::DestroyTestWindow()
402{
403 if (mOSWindow)
404 {
405 mOSWindow->destroy();
406 delete mOSWindow;
407 mOSWindow = NULL;
408 }
409
410 return true;
411}
412
413bool ANGLETest::ResizeWindow(int width, int height)
414{
415 return mOSWindow->resize(width, height);
416}
417
Geoff Langbb134672013-10-23 13:06:46 -0400418void ANGLETestEnvironment::SetUp()
419{
420 if (!ANGLETest::InitTestWindow())
421 {
422 FAIL() << "Failed to create ANGLE test window.";
423 }
424}
425
426void ANGLETestEnvironment::TearDown()
427{
428 ANGLETest::DestroyTestWindow();
429}