blob: 0f41b74358c9c90ccf133355d9bfd729b2ef91f6 [file] [log] [blame]
Geoff Lang8a079e52013-10-18 16:13:33 -04001#include "ANGLETest.h"
Jamie Madill62af5462014-08-26 13:16:37 -04002#include "EGLWindow.h"
Jamie Madill8add0eb2014-08-26 13:16:35 -04003#include "OSWindow.h"
4
5OSWindow *ANGLETest::mOSWindow = NULL;
Geoff Lang8a079e52013-10-18 16:13:33 -04006
7ANGLETest::ANGLETest()
Jamie Madill62af5462014-08-26 13:16:37 -04008 : mEGLWindow(NULL)
Geoff Lang8a079e52013-10-18 16:13:33 -04009{
Jamie Madill62af5462014-08-26 13:16:37 -040010 mEGLWindow = new EGLWindow(1280, 720, 2, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE);
Geoff Lang8a079e52013-10-18 16:13:33 -040011}
12
Geoff Lang8a079e52013-10-18 16:13:33 -040013void ANGLETest::SetUp()
14{
Jamie Madill62af5462014-08-26 13:16:37 -040015 ResizeWindow(mEGLWindow->getWidth(), mEGLWindow->getHeight());
Geoff Lang8a079e52013-10-18 16:13:33 -040016 if (!createEGLContext())
17 {
18 FAIL() << "egl context creation failed.";
19 }
20}
21
22void ANGLETest::TearDown()
23{
24 swapBuffers();
25 if (!destroyEGLContext())
26 {
27 FAIL() << "egl context destruction failed.";
28 }
Jamie Madill8add0eb2014-08-26 13:16:35 -040029
30 // Check for quit message
31 Event myEvent;
32 while (mOSWindow->popEvent(&myEvent))
33 {
34 if (myEvent.Type == Event::EVENT_CLOSED)
35 {
36 exit(0);
37 }
38 }
Geoff Lang8a079e52013-10-18 16:13:33 -040039}
40
41void ANGLETest::swapBuffers()
42{
Jamie Madill62af5462014-08-26 13:16:37 -040043 mEGLWindow->swap();
Geoff Lang8a079e52013-10-18 16:13:33 -040044}
45
46void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth)
47{
48 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
49
50 glUseProgram(program);
51
52 const GLfloat vertices[] =
53 {
54 -1.0f, 1.0f, quadDepth,
55 -1.0f, -1.0f, quadDepth,
56 1.0f, -1.0f, quadDepth,
57
58 -1.0f, 1.0f, quadDepth,
59 1.0f, -1.0f, quadDepth,
60 1.0f, 1.0f, quadDepth,
61 };
62
63 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
64 glEnableVertexAttribArray(positionLocation);
65
66 glDrawArrays(GL_TRIANGLES, 0, 6);
67
68 glDisableVertexAttribArray(positionLocation);
69 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
70
71 glUseProgram(0);
72}
73
Geoff Langefc551f2013-10-31 10:20:28 -040074GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
75{
76 GLuint shader = glCreateShader(type);
77
78 const char *sourceArray[1] = { source.c_str() };
79 glShaderSource(shader, 1, sourceArray, NULL);
80 glCompileShader(shader);
81
82 GLint compileResult;
83 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
84
85 if (compileResult == 0)
86 {
87 GLint infoLogLength;
88 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
89
90 std::vector<GLchar> infoLog(infoLogLength);
91 glGetShaderInfoLog(shader, infoLog.size(), NULL, infoLog.data());
92
93 std::cerr << "shader compilation failed: " << infoLog.data();
94
95 glDeleteShader(shader);
96 shader = 0;
97 }
98
99 return shader;
100}
101
Geoff Lang8a079e52013-10-18 16:13:33 -0400102GLuint ANGLETest::compileProgram(const std::string &vsSource, const std::string &fsSource)
103{
104 GLuint program = glCreateProgram();
105
Geoff Langefc551f2013-10-31 10:20:28 -0400106 GLuint vs = compileShader(GL_VERTEX_SHADER, vsSource);
107 GLuint fs = compileShader(GL_FRAGMENT_SHADER, fsSource);
108
109 if (vs == 0 || fs == 0)
110 {
111 glDeleteShader(fs);
112 glDeleteShader(vs);
113 glDeleteProgram(program);
114 return 0;
115 }
116
Geoff Lang8a079e52013-10-18 16:13:33 -0400117 glAttachShader(program, vs);
118 glDeleteShader(vs);
119
Geoff Lang8a079e52013-10-18 16:13:33 -0400120 glAttachShader(program, fs);
121 glDeleteShader(fs);
122
123 glLinkProgram(program);
124
125 GLint linkStatus;
126 glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
127
Geoff Langefc551f2013-10-31 10:20:28 -0400128 if (linkStatus == 0)
Geoff Lang8a079e52013-10-18 16:13:33 -0400129 {
Geoff Langefc551f2013-10-31 10:20:28 -0400130 GLint infoLogLength;
131 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
132
133 std::vector<GLchar> infoLog(infoLogLength);
134 glGetProgramInfoLog(program, infoLog.size(), NULL, infoLog.data());
135
136 std::cerr << "program link failed: " << infoLog.data();
137
Geoff Lang8a079e52013-10-18 16:13:33 -0400138 glDeleteProgram(program);
Geoff Langefc551f2013-10-31 10:20:28 -0400139 return 0;
Geoff Lang8a079e52013-10-18 16:13:33 -0400140 }
141
142 return program;
143}
144
145bool ANGLETest::extensionEnabled(const std::string &extName)
146{
147 const char* extString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
148 return strstr(extString, extName.c_str()) != NULL;
149}
150
151void ANGLETest::setClientVersion(int clientVersion)
152{
Jamie Madill62af5462014-08-26 13:16:37 -0400153 mEGLWindow->setClientVersion(clientVersion);
Geoff Lang8a079e52013-10-18 16:13:33 -0400154}
155
156void ANGLETest::setWindowWidth(int width)
157{
Jamie Madill62af5462014-08-26 13:16:37 -0400158 mEGLWindow->setWidth(width);
Geoff Lang8a079e52013-10-18 16:13:33 -0400159}
160
161void ANGLETest::setWindowHeight(int height)
162{
Jamie Madill62af5462014-08-26 13:16:37 -0400163 mEGLWindow->setHeight(height);
Geoff Lang8a079e52013-10-18 16:13:33 -0400164}
165
Geoff Langefc551f2013-10-31 10:20:28 -0400166void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400167{
Jamie Madill62af5462014-08-26 13:16:37 -0400168 mEGLWindow->setConfigRedBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400169}
170
Geoff Langefc551f2013-10-31 10:20:28 -0400171void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400172{
Jamie Madill62af5462014-08-26 13:16:37 -0400173 mEGLWindow->setConfigGreenBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400174}
175
Geoff Langefc551f2013-10-31 10:20:28 -0400176void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400177{
Jamie Madill62af5462014-08-26 13:16:37 -0400178 mEGLWindow->setConfigBlueBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400179}
180
Geoff Langefc551f2013-10-31 10:20:28 -0400181void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400182{
Jamie Madill62af5462014-08-26 13:16:37 -0400183 mEGLWindow->setConfigAlphaBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400184}
185
Geoff Langefc551f2013-10-31 10:20:28 -0400186void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400187{
Jamie Madill62af5462014-08-26 13:16:37 -0400188 mEGLWindow->setConfigDepthBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400189}
190
Geoff Langefc551f2013-10-31 10:20:28 -0400191void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400192{
Jamie Madill62af5462014-08-26 13:16:37 -0400193 mEGLWindow->setConfigStencilBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400194}
195
196void ANGLETest::setMultisampleEnabled(bool enabled)
197{
Jamie Madill62af5462014-08-26 13:16:37 -0400198 mEGLWindow->setMultisample(enabled);
Geoff Lang8a079e52013-10-18 16:13:33 -0400199}
200
201int ANGLETest::getClientVersion() const
202{
Jamie Madill62af5462014-08-26 13:16:37 -0400203 return mEGLWindow->getClientVersion();
Geoff Lang8a079e52013-10-18 16:13:33 -0400204}
205
206int ANGLETest::getWindowWidth() const
207{
Jamie Madill62af5462014-08-26 13:16:37 -0400208 return mEGLWindow->getWidth();
Geoff Lang8a079e52013-10-18 16:13:33 -0400209}
210
211int ANGLETest::getWindowHeight() const
212{
Jamie Madill62af5462014-08-26 13:16:37 -0400213 return mEGLWindow->getHeight();
Geoff Lang8a079e52013-10-18 16:13:33 -0400214}
215
Geoff Langefc551f2013-10-31 10:20:28 -0400216bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400217{
Jamie Madill62af5462014-08-26 13:16:37 -0400218 return mEGLWindow->isMultisample();
Geoff Lang8a079e52013-10-18 16:13:33 -0400219}
220
221bool ANGLETest::createEGLContext()
222{
Jamie Madill62af5462014-08-26 13:16:37 -0400223 return mEGLWindow->initializeGL(mOSWindow);
Geoff Lang8a079e52013-10-18 16:13:33 -0400224}
225
226bool ANGLETest::destroyEGLContext()
227{
Jamie Madill62af5462014-08-26 13:16:37 -0400228 mEGLWindow->destroyGL();
Geoff Lang8a079e52013-10-18 16:13:33 -0400229 return true;
230}
Geoff Langbb134672013-10-23 13:06:46 -0400231
Jamie Madill8add0eb2014-08-26 13:16:35 -0400232bool ANGLETest::InitTestWindow()
233{
234 mOSWindow = CreateOSWindow();
235 if (!mOSWindow->initialize("ANGLE_TEST", 128, 128))
236 {
237 return false;
238 }
239
240 mOSWindow->setVisible(true);
241
242 return true;
243}
244
245bool ANGLETest::DestroyTestWindow()
246{
247 if (mOSWindow)
248 {
249 mOSWindow->destroy();
250 delete mOSWindow;
251 mOSWindow = NULL;
252 }
253
254 return true;
255}
256
257bool ANGLETest::ResizeWindow(int width, int height)
258{
259 return mOSWindow->resize(width, height);
260}
261
Geoff Langbb134672013-10-23 13:06:46 -0400262void ANGLETestEnvironment::SetUp()
263{
264 if (!ANGLETest::InitTestWindow())
265 {
266 FAIL() << "Failed to create ANGLE test window.";
267 }
268}
269
270void ANGLETestEnvironment::TearDown()
271{
272 ANGLETest::DestroyTestWindow();
273}