blob: 5221a6ab035f2b053b52970072b9241cfd57101f [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
Jamie Madillfa05f602015-05-07 13:47:11 -04005ANGLETest::ANGLETest()
Jamie Madill77a72f62015-04-14 11:18:32 -04006 : mEGLWindow(nullptr)
Geoff Lang8a079e52013-10-18 16:13:33 -04007{
Geoff Langdd323e92015-06-09 15:16:31 -04008 mEGLWindow = new EGLWindow(1280, 720, GetParam().majorVersion, GetParam().eglParameters);
Geoff Lang0d3683c2014-10-23 11:08:16 -04009}
10
11ANGLETest::~ANGLETest()
12{
Jamie Madill77a72f62015-04-14 11:18:32 -040013 SafeDelete(mEGLWindow);
Geoff Lang8a079e52013-10-18 16:13:33 -040014}
15
Geoff Lang8a079e52013-10-18 16:13:33 -040016void ANGLETest::SetUp()
17{
Geoff Lang0d3683c2014-10-23 11:08:16 -040018 if (!ResizeWindow(mEGLWindow->getWidth(), mEGLWindow->getHeight()))
Jamie Madill4119ed32014-10-01 10:41:40 -040019 {
20 FAIL() << "Failed to resize ANGLE test window.";
21 }
22
Geoff Lang8a079e52013-10-18 16:13:33 -040023 if (!createEGLContext())
24 {
25 FAIL() << "egl context creation failed.";
26 }
Corentin Wallezb828b322015-07-16 17:51:30 -040027
28 // Swap the buffers so that the default framebuffer picks up the resize
29 // which will allow follow-up test code to assume the framebuffer covers
30 // the whole window.
31 swapBuffers();
Corentin Wallez096725b2015-07-20 16:58:57 -040032
33 // This Viewport command is not strictly necessary but we add it so that programs
34 // taking OpenGL traces can guess the size of the default framebuffer and show it
35 // in their UIs
36 glViewport(0, 0, mEGLWindow->getWidth(), mEGLWindow->getHeight());
Geoff Lang8a079e52013-10-18 16:13:33 -040037}
38
39void ANGLETest::TearDown()
40{
41 swapBuffers();
Jamie Madill9e16d402014-09-08 17:36:33 -040042 mOSWindow->messageLoop();
43
Geoff Lang8a079e52013-10-18 16:13:33 -040044 if (!destroyEGLContext())
45 {
46 FAIL() << "egl context destruction failed.";
47 }
Jamie Madill8add0eb2014-08-26 13:16:35 -040048
49 // Check for quit message
50 Event myEvent;
51 while (mOSWindow->popEvent(&myEvent))
52 {
53 if (myEvent.Type == Event::EVENT_CLOSED)
54 {
55 exit(0);
56 }
57 }
Geoff Lang8a079e52013-10-18 16:13:33 -040058}
59
60void ANGLETest::swapBuffers()
61{
Jamie Madill77a72f62015-04-14 11:18:32 -040062 if (mEGLWindow->isGLInitialized())
63 {
64 mEGLWindow->swap();
65 }
Geoff Lang8a079e52013-10-18 16:13:33 -040066}
67
Austin Kinross4fd18b12014-12-22 12:32:05 -080068void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth, GLfloat quadScale)
Geoff Lang8a079e52013-10-18 16:13:33 -040069{
70 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
71
72 glUseProgram(program);
73
74 const GLfloat vertices[] =
75 {
Austin Kinross4fd18b12014-12-22 12:32:05 -080076 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
77 -1.0f * quadScale, -1.0f * quadScale, quadDepth,
78 1.0f * quadScale, -1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040079
Austin Kinross4fd18b12014-12-22 12:32:05 -080080 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
81 1.0f * quadScale, -1.0f * quadScale, quadDepth,
82 1.0f * quadScale, 1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040083 };
84
85 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
86 glEnableVertexAttribArray(positionLocation);
87
88 glDrawArrays(GL_TRIANGLES, 0, 6);
89
90 glDisableVertexAttribArray(positionLocation);
91 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
92
93 glUseProgram(0);
94}
95
Geoff Langefc551f2013-10-31 10:20:28 -040096GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
97{
98 GLuint shader = glCreateShader(type);
99
100 const char *sourceArray[1] = { source.c_str() };
101 glShaderSource(shader, 1, sourceArray, NULL);
102 glCompileShader(shader);
103
104 GLint compileResult;
105 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
106
107 if (compileResult == 0)
108 {
109 GLint infoLogLength;
110 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
111
112 std::vector<GLchar> infoLog(infoLogLength);
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400113 glGetShaderInfoLog(shader, infoLog.size(), NULL, &infoLog[0]);
Geoff Langefc551f2013-10-31 10:20:28 -0400114
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400115 std::cerr << "shader compilation failed: " << &infoLog[0];
Geoff Langefc551f2013-10-31 10:20:28 -0400116
117 glDeleteShader(shader);
118 shader = 0;
119 }
120
121 return shader;
122}
123
Geoff Lang63046e22015-07-21 12:43:50 -0400124static bool checkExtensionExists(const char *allExtensions, const std::string &extName)
125{
126 return strstr(allExtensions, extName.c_str()) != nullptr;
127}
128
Geoff Lang8a079e52013-10-18 16:13:33 -0400129bool ANGLETest::extensionEnabled(const std::string &extName)
130{
Geoff Lang63046e22015-07-21 12:43:50 -0400131 return checkExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)),
132 extName);
133}
134
135bool ANGLETest::eglDisplayExtensionEnabled(EGLDisplay display, const std::string &extName)
136{
137 return checkExtensionExists(eglQueryString(display, EGL_EXTENSIONS), extName);
138}
139
140bool ANGLETest::eglClientExtensionEnabled(const std::string &extName)
141{
142 return checkExtensionExists(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS), extName);
Geoff Lang8a079e52013-10-18 16:13:33 -0400143}
144
Geoff Lang8a079e52013-10-18 16:13:33 -0400145void ANGLETest::setWindowWidth(int width)
146{
Jamie Madill62af5462014-08-26 13:16:37 -0400147 mEGLWindow->setWidth(width);
Geoff Lang8a079e52013-10-18 16:13:33 -0400148}
149
150void ANGLETest::setWindowHeight(int height)
151{
Jamie Madill62af5462014-08-26 13:16:37 -0400152 mEGLWindow->setHeight(height);
Geoff Lang8a079e52013-10-18 16:13:33 -0400153}
154
Geoff Langefc551f2013-10-31 10:20:28 -0400155void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400156{
Jamie Madill62af5462014-08-26 13:16:37 -0400157 mEGLWindow->setConfigRedBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400158}
159
Geoff Langefc551f2013-10-31 10:20:28 -0400160void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400161{
Jamie Madill62af5462014-08-26 13:16:37 -0400162 mEGLWindow->setConfigGreenBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400163}
164
Geoff Langefc551f2013-10-31 10:20:28 -0400165void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400166{
Jamie Madill62af5462014-08-26 13:16:37 -0400167 mEGLWindow->setConfigBlueBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400168}
169
Geoff Langefc551f2013-10-31 10:20:28 -0400170void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400171{
Jamie Madill62af5462014-08-26 13:16:37 -0400172 mEGLWindow->setConfigAlphaBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400173}
174
Geoff Langefc551f2013-10-31 10:20:28 -0400175void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400176{
Jamie Madill62af5462014-08-26 13:16:37 -0400177 mEGLWindow->setConfigDepthBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400178}
179
Geoff Langefc551f2013-10-31 10:20:28 -0400180void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400181{
Jamie Madill62af5462014-08-26 13:16:37 -0400182 mEGLWindow->setConfigStencilBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400183}
184
185void ANGLETest::setMultisampleEnabled(bool enabled)
186{
Jamie Madill62af5462014-08-26 13:16:37 -0400187 mEGLWindow->setMultisample(enabled);
Geoff Lang8a079e52013-10-18 16:13:33 -0400188}
189
190int ANGLETest::getClientVersion() const
191{
Jamie Madill62af5462014-08-26 13:16:37 -0400192 return mEGLWindow->getClientVersion();
Geoff Lang8a079e52013-10-18 16:13:33 -0400193}
194
Geoff Langb9266272015-01-29 13:25:14 +0000195EGLWindow *ANGLETest::getEGLWindow() const
196{
197 return mEGLWindow;
198}
199
Geoff Lang8a079e52013-10-18 16:13:33 -0400200int ANGLETest::getWindowWidth() const
201{
Jamie Madill62af5462014-08-26 13:16:37 -0400202 return mEGLWindow->getWidth();
Geoff Lang8a079e52013-10-18 16:13:33 -0400203}
204
205int ANGLETest::getWindowHeight() const
206{
Jamie Madill62af5462014-08-26 13:16:37 -0400207 return mEGLWindow->getHeight();
Geoff Lang8a079e52013-10-18 16:13:33 -0400208}
209
Geoff Langefc551f2013-10-31 10:20:28 -0400210bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400211{
Jamie Madill62af5462014-08-26 13:16:37 -0400212 return mEGLWindow->isMultisample();
Geoff Lang8a079e52013-10-18 16:13:33 -0400213}
214
215bool ANGLETest::createEGLContext()
216{
Jamie Madill62af5462014-08-26 13:16:37 -0400217 return mEGLWindow->initializeGL(mOSWindow);
Geoff Lang8a079e52013-10-18 16:13:33 -0400218}
219
220bool ANGLETest::destroyEGLContext()
221{
Jamie Madill62af5462014-08-26 13:16:37 -0400222 mEGLWindow->destroyGL();
Geoff Lang8a079e52013-10-18 16:13:33 -0400223 return true;
224}
Geoff Langbb134672013-10-23 13:06:46 -0400225
Geoff Lang0d3683c2014-10-23 11:08:16 -0400226bool ANGLETest::InitTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400227{
228 mOSWindow = CreateOSWindow();
229 if (!mOSWindow->initialize("ANGLE_TEST", 128, 128))
230 {
231 return false;
232 }
233
Geoff Lang0d3683c2014-10-23 11:08:16 -0400234 mOSWindow->setVisible(true);
Jamie Madill8add0eb2014-08-26 13:16:35 -0400235
236 return true;
237}
238
Geoff Lang0d3683c2014-10-23 11:08:16 -0400239bool ANGLETest::DestroyTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400240{
241 if (mOSWindow)
242 {
243 mOSWindow->destroy();
244 delete mOSWindow;
245 mOSWindow = NULL;
246 }
247
248 return true;
249}
250
Geoff Lang0d3683c2014-10-23 11:08:16 -0400251bool ANGLETest::ResizeWindow(int width, int height)
Jamie Madill8add0eb2014-08-26 13:16:35 -0400252{
253 return mOSWindow->resize(width, height);
254}
255
Geoff Lang0d3683c2014-10-23 11:08:16 -0400256void ANGLETest::SetWindowVisible(bool isVisible)
Geoff Langbb134672013-10-23 13:06:46 -0400257{
Jamie Madill4119ed32014-10-01 10:41:40 -0400258 mOSWindow->setVisible(isVisible);
Geoff Langbb134672013-10-23 13:06:46 -0400259}
Geoff Lang0d3683c2014-10-23 11:08:16 -0400260
Jamie Madillc3b9b262015-01-30 14:00:51 -0500261bool ANGLETest::isIntel() const
262{
263 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
264 return (rendererString.find("Intel") != std::string::npos);
265}
266
267bool ANGLETest::isAMD() const
268{
269 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
270 return (rendererString.find("AMD") != std::string::npos) ||
271 (rendererString.find("ATI") != std::string::npos);
272}
273
274bool ANGLETest::isNVidia() const
275{
276 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
277 return (rendererString.find("NVIDIA") != std::string::npos);
278}
279
280EGLint ANGLETest::getPlatformRenderer() const
281{
Jamie Madillf6859912015-01-30 17:05:35 -0500282 assert(mEGLWindow);
283 return mEGLWindow->getPlatform().renderer;
Jamie Madillc3b9b262015-01-30 14:00:51 -0500284}
285
Geoff Lang0d3683c2014-10-23 11:08:16 -0400286OSWindow *ANGLETest::mOSWindow = NULL;
287
288void ANGLETestEnvironment::SetUp()
289{
290 if (!ANGLETest::InitTestWindow())
291 {
292 FAIL() << "Failed to create ANGLE test window.";
293 }
294}
295
296void ANGLETestEnvironment::TearDown()
297{
298 ANGLETest::DestroyTestWindow();
299}