blob: b246b0cca56a41bd60292b7b26e4155c8f12d20d [file] [log] [blame]
Geoff Lang8a079e52013-10-18 16:13:33 -04001#include "ANGLETest.h"
2
3ANGLETest::ANGLETest()
Geoff Langefc551f2013-10-31 10:20:28 -04004 : mClientVersion(2),
5 mWidth(1280),
6 mHeight(720),
7 mRedBits(-1),
8 mGreenBits(-1),
9 mBlueBits(-1),
10 mAlphaBits(-1),
11 mDepthBits(-1),
12 mStencilBits(-1),
13 mMultisample(false)
Geoff Lang8a079e52013-10-18 16:13:33 -040014{
15}
16
17EGLDisplay ANGLETest::mDisplay = 0;
18EGLNativeWindowType ANGLETest::mNativeWindow = 0;
19EGLNativeDisplayType ANGLETest::mNativeDisplay = 0;
20
21void ANGLETest::SetUp()
22{
23 ReizeWindow(mWidth, mHeight);
24 if (!createEGLContext())
25 {
26 FAIL() << "egl context creation failed.";
27 }
28}
29
30void ANGLETest::TearDown()
31{
32 swapBuffers();
33 if (!destroyEGLContext())
34 {
35 FAIL() << "egl context destruction failed.";
36 }
37}
38
39void ANGLETest::swapBuffers()
40{
41 eglSwapBuffers(mDisplay, mSurface);
42}
43
44void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth)
45{
46 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
47
48 glUseProgram(program);
49
50 const GLfloat vertices[] =
51 {
52 -1.0f, 1.0f, quadDepth,
53 -1.0f, -1.0f, quadDepth,
54 1.0f, -1.0f, quadDepth,
55
56 -1.0f, 1.0f, quadDepth,
57 1.0f, -1.0f, quadDepth,
58 1.0f, 1.0f, quadDepth,
59 };
60
61 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
62 glEnableVertexAttribArray(positionLocation);
63
64 glDrawArrays(GL_TRIANGLES, 0, 6);
65
66 glDisableVertexAttribArray(positionLocation);
67 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
68
69 glUseProgram(0);
70}
71
Geoff Langefc551f2013-10-31 10:20:28 -040072GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
73{
74 GLuint shader = glCreateShader(type);
75
76 const char *sourceArray[1] = { source.c_str() };
77 glShaderSource(shader, 1, sourceArray, NULL);
78 glCompileShader(shader);
79
80 GLint compileResult;
81 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
82
83 if (compileResult == 0)
84 {
85 GLint infoLogLength;
86 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
87
88 std::vector<GLchar> infoLog(infoLogLength);
89 glGetShaderInfoLog(shader, infoLog.size(), NULL, infoLog.data());
90
91 std::cerr << "shader compilation failed: " << infoLog.data();
92
93 glDeleteShader(shader);
94 shader = 0;
95 }
96
97 return shader;
98}
99
Geoff Lang8a079e52013-10-18 16:13:33 -0400100GLuint ANGLETest::compileProgram(const std::string &vsSource, const std::string &fsSource)
101{
102 GLuint program = glCreateProgram();
103
Geoff Langefc551f2013-10-31 10:20:28 -0400104 GLuint vs = compileShader(GL_VERTEX_SHADER, vsSource);
105 GLuint fs = compileShader(GL_FRAGMENT_SHADER, fsSource);
106
107 if (vs == 0 || fs == 0)
108 {
109 glDeleteShader(fs);
110 glDeleteShader(vs);
111 glDeleteProgram(program);
112 return 0;
113 }
114
Geoff Lang8a079e52013-10-18 16:13:33 -0400115 glAttachShader(program, vs);
116 glDeleteShader(vs);
117
Geoff Lang8a079e52013-10-18 16:13:33 -0400118 glAttachShader(program, fs);
119 glDeleteShader(fs);
120
121 glLinkProgram(program);
122
123 GLint linkStatus;
124 glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
125
Geoff Langefc551f2013-10-31 10:20:28 -0400126 if (linkStatus == 0)
Geoff Lang8a079e52013-10-18 16:13:33 -0400127 {
Geoff Langefc551f2013-10-31 10:20:28 -0400128 GLint infoLogLength;
129 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
130
131 std::vector<GLchar> infoLog(infoLogLength);
132 glGetProgramInfoLog(program, infoLog.size(), NULL, infoLog.data());
133
134 std::cerr << "program link failed: " << infoLog.data();
135
Geoff Lang8a079e52013-10-18 16:13:33 -0400136 glDeleteProgram(program);
Geoff Langefc551f2013-10-31 10:20:28 -0400137 return 0;
Geoff Lang8a079e52013-10-18 16:13:33 -0400138 }
139
140 return program;
141}
142
143bool ANGLETest::extensionEnabled(const std::string &extName)
144{
145 const char* extString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
146 return strstr(extString, extName.c_str()) != NULL;
147}
148
149void ANGLETest::setClientVersion(int clientVersion)
150{
151 mClientVersion = clientVersion;
152}
153
154void ANGLETest::setWindowWidth(int width)
155{
156 mWidth = width;
157}
158
159void ANGLETest::setWindowHeight(int height)
160{
161 mHeight = height;
162}
163
Geoff Langefc551f2013-10-31 10:20:28 -0400164void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400165{
166 mRedBits = bits;
167}
168
Geoff Langefc551f2013-10-31 10:20:28 -0400169void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400170{
171 mGreenBits = bits;
172}
173
Geoff Langefc551f2013-10-31 10:20:28 -0400174void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400175{
176 mBlueBits = bits;
177}
178
Geoff Langefc551f2013-10-31 10:20:28 -0400179void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400180{
181 mAlphaBits = bits;
182}
183
Geoff Langefc551f2013-10-31 10:20:28 -0400184void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400185{
186 mDepthBits = bits;
187}
188
Geoff Langefc551f2013-10-31 10:20:28 -0400189void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400190{
191 mStencilBits = bits;
192}
193
194void ANGLETest::setMultisampleEnabled(bool enabled)
195{
196 mMultisample = enabled;
197}
198
199int ANGLETest::getClientVersion() const
200{
201 return mClientVersion;
202}
203
204int ANGLETest::getWindowWidth() const
205{
206 return mWidth;
207}
208
209int ANGLETest::getWindowHeight() const
210{
211 return mHeight;
212}
213
Geoff Langefc551f2013-10-31 10:20:28 -0400214int ANGLETest::getConfigRedBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400215{
216 return mRedBits;
217}
218
Geoff Langefc551f2013-10-31 10:20:28 -0400219int ANGLETest::getConfigGreenBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400220{
221 return mGreenBits;
222}
223
Geoff Langefc551f2013-10-31 10:20:28 -0400224int ANGLETest::getConfigBlueBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400225{
226 return mBlueBits;
227}
228
Geoff Langefc551f2013-10-31 10:20:28 -0400229int ANGLETest::getConfigAlphaBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400230{
231 return mAlphaBits;
232}
233
Geoff Langefc551f2013-10-31 10:20:28 -0400234int ANGLETest::getConfigDepthBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400235{
236 return mDepthBits;
237}
238
Geoff Langefc551f2013-10-31 10:20:28 -0400239int ANGLETest::getConfigStencilBits() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400240{
241 return mStencilBits;
242}
243
Geoff Langefc551f2013-10-31 10:20:28 -0400244bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400245{
246 return mMultisample;
247}
248
249bool ANGLETest::createEGLContext()
250{
251 const EGLint configAttributes[] =
252 {
253 EGL_RED_SIZE, (mRedBits >= 0) ? mRedBits : EGL_DONT_CARE,
254 EGL_GREEN_SIZE, (mGreenBits >= 0) ? mGreenBits : EGL_DONT_CARE,
255 EGL_BLUE_SIZE, (mBlueBits >= 0) ? mBlueBits : EGL_DONT_CARE,
256 EGL_ALPHA_SIZE, (mAlphaBits >= 0) ? mAlphaBits : EGL_DONT_CARE,
257 EGL_DEPTH_SIZE, (mDepthBits >= 0) ? mDepthBits : EGL_DONT_CARE,
258 EGL_STENCIL_SIZE, (mStencilBits >= 0) ? mStencilBits : EGL_DONT_CARE,
259 EGL_SAMPLE_BUFFERS, mMultisample ? 1 : 0,
260 EGL_NONE
261 };
262
263 EGLint configCount;
264 if (!eglChooseConfig(mDisplay, configAttributes, &mConfig, 1, &configCount) || (configCount != 1))
265 {
266 destroyEGLContext();
267 return false;
268 }
269
270 eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &mRedBits);
271 eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &mGreenBits);
272 eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &mBlueBits);
273 eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &mBlueBits);
274 eglGetConfigAttrib(mDisplay, mConfig, EGL_DEPTH_SIZE, &mDepthBits);
275 eglGetConfigAttrib(mDisplay, mConfig, EGL_STENCIL_SIZE, &mStencilBits);
276
277 EGLint samples;
278 eglGetConfigAttrib(mDisplay, mConfig, EGL_SAMPLE_BUFFERS, &samples);
279 mMultisample = (samples != 0);
280
281 mSurface = eglCreateWindowSurface(mDisplay, mConfig, mNativeWindow, NULL);
282 if(mSurface == EGL_NO_SURFACE)
283 {
284 eglGetError(); // Clear error
285 mSurface = eglCreateWindowSurface(mDisplay, mConfig, NULL, NULL);
286 }
287
288 if (eglGetError() != EGL_SUCCESS)
289 {
290 destroyEGLContext();
291 return false;
292 }
293
294 EGLint contextAttibutes[] =
295 {
296 EGL_CONTEXT_CLIENT_VERSION, mClientVersion,
297 EGL_NONE
298 };
299 mContext = eglCreateContext(mDisplay, mConfig, NULL, contextAttibutes);
300 if (eglGetError() != EGL_SUCCESS)
301 {
302 destroyEGLContext();
303 return false;
304 }
305
306 eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
307 if (eglGetError() != EGL_SUCCESS)
308 {
309 destroyEGLContext();
310 return false;
311 }
312
313 return true;
314}
315
316bool ANGLETest::destroyEGLContext()
317{
318 eglDestroySurface(mDisplay, mSurface);
319 eglDestroyContext(mDisplay, mContext);
320
321 return true;
322}