blob: 79c4da014aff56ee91d2a20ccba1951e2a1872f5 [file] [log] [blame]
Geoff Lang8a079e52013-10-18 16:13:33 -04001#include "ANGLETest.h"
2
3ANGLETest::ANGLETest()
Jamie Madill34b66f32014-07-23 15:09:50 -04004 : mTestPlatform(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE),
Geoff Langf0955f12014-06-20 16:07:07 -04005 mClientVersion(2),
Geoff Langefc551f2013-10-31 10:20:28 -04006 mWidth(1280),
7 mHeight(720),
8 mRedBits(-1),
9 mGreenBits(-1),
10 mBlueBits(-1),
11 mAlphaBits(-1),
12 mDepthBits(-1),
13 mStencilBits(-1),
Jamie Madilldb74f182014-08-21 10:04:06 -040014 mMultisample(false),
15 mConfig(0),
16 mSurface(EGL_NO_SURFACE),
17 mContext(EGL_NO_CONTEXT),
18 mDisplay(EGL_NO_DISPLAY)
Geoff Lang8a079e52013-10-18 16:13:33 -040019{
20}
21
Geoff Lang8a079e52013-10-18 16:13:33 -040022EGLNativeWindowType ANGLETest::mNativeWindow = 0;
23EGLNativeDisplayType ANGLETest::mNativeDisplay = 0;
24
25void 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 }
41}
42
43void ANGLETest::swapBuffers()
44{
45 eglSwapBuffers(mDisplay, mSurface);
46}
47
48void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth)
49{
50 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
51
52 glUseProgram(program);
53
54 const GLfloat vertices[] =
55 {
56 -1.0f, 1.0f, quadDepth,
57 -1.0f, -1.0f, quadDepth,
58 1.0f, -1.0f, quadDepth,
59
60 -1.0f, 1.0f, quadDepth,
61 1.0f, -1.0f, quadDepth,
62 1.0f, 1.0f, quadDepth,
63 };
64
65 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
66 glEnableVertexAttribArray(positionLocation);
67
68 glDrawArrays(GL_TRIANGLES, 0, 6);
69
70 glDisableVertexAttribArray(positionLocation);
71 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
72
73 glUseProgram(0);
74}
75
Geoff Langefc551f2013-10-31 10:20:28 -040076GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
77{
78 GLuint shader = glCreateShader(type);
79
80 const char *sourceArray[1] = { source.c_str() };
81 glShaderSource(shader, 1, sourceArray, NULL);
82 glCompileShader(shader);
83
84 GLint compileResult;
85 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
86
87 if (compileResult == 0)
88 {
89 GLint infoLogLength;
90 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
91
92 std::vector<GLchar> infoLog(infoLogLength);
93 glGetShaderInfoLog(shader, infoLog.size(), NULL, infoLog.data());
94
95 std::cerr << "shader compilation failed: " << infoLog.data();
96
97 glDeleteShader(shader);
98 shader = 0;
99 }
100
101 return shader;
102}
103
Geoff Lang8a079e52013-10-18 16:13:33 -0400104GLuint ANGLETest::compileProgram(const std::string &vsSource, const std::string &fsSource)
105{
106 GLuint program = glCreateProgram();
107
Geoff Langefc551f2013-10-31 10:20:28 -0400108 GLuint vs = compileShader(GL_VERTEX_SHADER, vsSource);
109 GLuint fs = compileShader(GL_FRAGMENT_SHADER, fsSource);
110
111 if (vs == 0 || fs == 0)
112 {
113 glDeleteShader(fs);
114 glDeleteShader(vs);
115 glDeleteProgram(program);
116 return 0;
117 }
118
Geoff Lang8a079e52013-10-18 16:13:33 -0400119 glAttachShader(program, vs);
120 glDeleteShader(vs);
121
Geoff Lang8a079e52013-10-18 16:13:33 -0400122 glAttachShader(program, fs);
123 glDeleteShader(fs);
124
125 glLinkProgram(program);
126
127 GLint linkStatus;
128 glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
129
Geoff Langefc551f2013-10-31 10:20:28 -0400130 if (linkStatus == 0)
Geoff Lang8a079e52013-10-18 16:13:33 -0400131 {
Geoff Langefc551f2013-10-31 10:20:28 -0400132 GLint infoLogLength;
133 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
134
135 std::vector<GLchar> infoLog(infoLogLength);
136 glGetProgramInfoLog(program, infoLog.size(), NULL, infoLog.data());
137
138 std::cerr << "program link failed: " << infoLog.data();
139
Geoff Lang8a079e52013-10-18 16:13:33 -0400140 glDeleteProgram(program);
Geoff Langefc551f2013-10-31 10:20:28 -0400141 return 0;
Geoff Lang8a079e52013-10-18 16:13:33 -0400142 }
143
144 return program;
145}
146
147bool ANGLETest::extensionEnabled(const std::string &extName)
148{
149 const char* extString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
150 return strstr(extString, extName.c_str()) != NULL;
151}
152
153void ANGLETest::setClientVersion(int clientVersion)
154{
155 mClientVersion = clientVersion;
156}
157
158void ANGLETest::setWindowWidth(int width)
159{
160 mWidth = width;
161}
162
163void ANGLETest::setWindowHeight(int height)
164{
165 mHeight = height;
166}
167
Geoff Langefc551f2013-10-31 10:20:28 -0400168void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400169{
170 mRedBits = bits;
171}
172
Geoff Langefc551f2013-10-31 10:20:28 -0400173void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400174{
175 mGreenBits = bits;
176}
177
Geoff Langefc551f2013-10-31 10:20:28 -0400178void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400179{
180 mBlueBits = bits;
181}
182
Geoff Langefc551f2013-10-31 10:20:28 -0400183void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400184{
185 mAlphaBits = bits;
186}
187
Geoff Langefc551f2013-10-31 10:20:28 -0400188void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400189{
190 mDepthBits = bits;
191}
192
Geoff Langefc551f2013-10-31 10:20:28 -0400193void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400194{
195 mStencilBits = bits;
196}
197
198void ANGLETest::setMultisampleEnabled(bool enabled)
199{
200 mMultisample = enabled;
201}
202
203int ANGLETest::getClientVersion() const
204{
205 return mClientVersion;
206}
207
208int ANGLETest::getWindowWidth() const
209{
210 return mWidth;
211}
212
213int ANGLETest::getWindowHeight() const
214{
215 return mHeight;
216}
217
Geoff Langefc551f2013-10-31 10:20:28 -0400218int ANGLETest::getConfigRedBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400219{
220 return mRedBits;
221}
222
Geoff Langefc551f2013-10-31 10:20:28 -0400223int ANGLETest::getConfigGreenBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400224{
225 return mGreenBits;
226}
227
Geoff Langefc551f2013-10-31 10:20:28 -0400228int ANGLETest::getConfigBlueBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400229{
230 return mBlueBits;
231}
232
Geoff Langefc551f2013-10-31 10:20:28 -0400233int ANGLETest::getConfigAlphaBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400234{
235 return mAlphaBits;
236}
237
Geoff Langefc551f2013-10-31 10:20:28 -0400238int ANGLETest::getConfigDepthBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400239{
240 return mDepthBits;
241}
242
Geoff Langefc551f2013-10-31 10:20:28 -0400243int ANGLETest::getConfigStencilBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400244{
245 return mStencilBits;
246}
247
Geoff Langefc551f2013-10-31 10:20:28 -0400248bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400249{
250 return mMultisample;
251}
252
253bool ANGLETest::createEGLContext()
254{
Geoff Langf0955f12014-06-20 16:07:07 -0400255 PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(eglGetProcAddress("eglGetPlatformDisplayEXT"));
256 if (!eglGetPlatformDisplayEXT)
257 {
258 return false;
259 }
260
261 const EGLint displayAttributes[] =
262 {
263 EGL_PLATFORM_ANGLE_TYPE_ANGLE, mTestPlatform,
264 EGL_NONE,
265 };
266
267 mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, mNativeDisplay, displayAttributes);
268 if (mDisplay == EGL_NO_DISPLAY)
269 {
270 destroyEGLContext();
271 return false;
272 }
273
274 EGLint majorVersion, minorVersion;
275 if (!eglInitialize(mDisplay, &majorVersion, &minorVersion))
276 {
277 destroyEGLContext();
278 return false;
279 }
280
281 eglBindAPI(EGL_OPENGL_ES_API);
282 if (eglGetError() != EGL_SUCCESS)
283 {
284 destroyEGLContext();
285 return false;
286 }
287
Geoff Lang8a079e52013-10-18 16:13:33 -0400288 const EGLint configAttributes[] =
289 {
290 EGL_RED_SIZE, (mRedBits >= 0) ? mRedBits : EGL_DONT_CARE,
291 EGL_GREEN_SIZE, (mGreenBits >= 0) ? mGreenBits : EGL_DONT_CARE,
292 EGL_BLUE_SIZE, (mBlueBits >= 0) ? mBlueBits : EGL_DONT_CARE,
293 EGL_ALPHA_SIZE, (mAlphaBits >= 0) ? mAlphaBits : EGL_DONT_CARE,
294 EGL_DEPTH_SIZE, (mDepthBits >= 0) ? mDepthBits : EGL_DONT_CARE,
295 EGL_STENCIL_SIZE, (mStencilBits >= 0) ? mStencilBits : EGL_DONT_CARE,
296 EGL_SAMPLE_BUFFERS, mMultisample ? 1 : 0,
297 EGL_NONE
298 };
299
300 EGLint configCount;
301 if (!eglChooseConfig(mDisplay, configAttributes, &mConfig, 1, &configCount) || (configCount != 1))
302 {
303 destroyEGLContext();
304 return false;
305 }
306
307 eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &mRedBits);
308 eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &mGreenBits);
309 eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &mBlueBits);
310 eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &mBlueBits);
311 eglGetConfigAttrib(mDisplay, mConfig, EGL_DEPTH_SIZE, &mDepthBits);
312 eglGetConfigAttrib(mDisplay, mConfig, EGL_STENCIL_SIZE, &mStencilBits);
313
314 EGLint samples;
315 eglGetConfigAttrib(mDisplay, mConfig, EGL_SAMPLE_BUFFERS, &samples);
316 mMultisample = (samples != 0);
317
318 mSurface = eglCreateWindowSurface(mDisplay, mConfig, mNativeWindow, NULL);
319 if(mSurface == EGL_NO_SURFACE)
320 {
321 eglGetError(); // Clear error
322 mSurface = eglCreateWindowSurface(mDisplay, mConfig, NULL, NULL);
323 }
324
325 if (eglGetError() != EGL_SUCCESS)
326 {
327 destroyEGLContext();
328 return false;
329 }
330
331 EGLint contextAttibutes[] =
332 {
333 EGL_CONTEXT_CLIENT_VERSION, mClientVersion,
334 EGL_NONE
335 };
336 mContext = eglCreateContext(mDisplay, mConfig, NULL, contextAttibutes);
337 if (eglGetError() != EGL_SUCCESS)
338 {
339 destroyEGLContext();
340 return false;
341 }
342
343 eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
344 if (eglGetError() != EGL_SUCCESS)
345 {
346 destroyEGLContext();
347 return false;
348 }
349
350 return true;
351}
352
353bool ANGLETest::destroyEGLContext()
354{
Jamie Madill34b66f32014-07-23 15:09:50 -0400355 if (mDisplay != EGL_NO_DISPLAY)
356 {
357 eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
358
359 if (mSurface != EGL_NO_SURFACE)
360 {
361 eglDestroySurface(mDisplay, mSurface);
362 mSurface = EGL_NO_SURFACE;
363 }
364
365 if (mContext != EGL_NO_CONTEXT)
366 {
367 eglDestroyContext(mDisplay, mContext);
368 mContext = EGL_NO_CONTEXT;
369 }
370
371 eglTerminate(mDisplay);
372 mDisplay = EGL_NO_DISPLAY;
373 }
Geoff Lang8a079e52013-10-18 16:13:33 -0400374
375 return true;
376}
Geoff Langbb134672013-10-23 13:06:46 -0400377
378void ANGLETestEnvironment::SetUp()
379{
380 if (!ANGLETest::InitTestWindow())
381 {
382 FAIL() << "Failed to create ANGLE test window.";
383 }
384}
385
386void ANGLETestEnvironment::TearDown()
387{
388 ANGLETest::DestroyTestWindow();
389}