blob: 2e6fdbd08598a4f46e5002d74d4e4a67be34f7fd [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()
Corentin Wallezf3357ee2015-07-22 14:10:19 -04006 : mEGLWindow(nullptr),
7 mWidth(0),
8 mHeight(0)
Geoff Lang8a079e52013-10-18 16:13:33 -04009{
Corentin Wallezf3357ee2015-07-22 14:10:19 -040010 mEGLWindow = new EGLWindow(GetParam().majorVersion, GetParam().eglParameters);
Geoff Lang0d3683c2014-10-23 11:08:16 -040011}
12
13ANGLETest::~ANGLETest()
14{
Jamie Madill77a72f62015-04-14 11:18:32 -040015 SafeDelete(mEGLWindow);
Geoff Lang8a079e52013-10-18 16:13:33 -040016}
17
Geoff Lang8a079e52013-10-18 16:13:33 -040018void ANGLETest::SetUp()
19{
Corentin Wallezf3357ee2015-07-22 14:10:19 -040020 if (!ResizeWindow(mWidth, mHeight))
Jamie Madill4119ed32014-10-01 10:41:40 -040021 {
22 FAIL() << "Failed to resize ANGLE test window.";
23 }
24
Geoff Lang8a079e52013-10-18 16:13:33 -040025 if (!createEGLContext())
26 {
27 FAIL() << "egl context creation failed.";
28 }
Corentin Wallezb828b322015-07-16 17:51:30 -040029
30 // Swap the buffers so that the default framebuffer picks up the resize
31 // which will allow follow-up test code to assume the framebuffer covers
32 // the whole window.
33 swapBuffers();
Corentin Wallez096725b2015-07-20 16:58:57 -040034
35 // This Viewport command is not strictly necessary but we add it so that programs
36 // taking OpenGL traces can guess the size of the default framebuffer and show it
37 // in their UIs
Corentin Wallezf3357ee2015-07-22 14:10:19 -040038 glViewport(0, 0, mWidth, mHeight);
Geoff Lang8a079e52013-10-18 16:13:33 -040039}
40
41void ANGLETest::TearDown()
42{
43 swapBuffers();
Jamie Madill9e16d402014-09-08 17:36:33 -040044 mOSWindow->messageLoop();
45
Geoff Lang8a079e52013-10-18 16:13:33 -040046 if (!destroyEGLContext())
47 {
48 FAIL() << "egl context destruction failed.";
49 }
Jamie Madill8add0eb2014-08-26 13:16:35 -040050
51 // Check for quit message
52 Event myEvent;
53 while (mOSWindow->popEvent(&myEvent))
54 {
55 if (myEvent.Type == Event::EVENT_CLOSED)
56 {
57 exit(0);
58 }
59 }
Geoff Lang8a079e52013-10-18 16:13:33 -040060}
61
62void ANGLETest::swapBuffers()
63{
Jamie Madill77a72f62015-04-14 11:18:32 -040064 if (mEGLWindow->isGLInitialized())
65 {
66 mEGLWindow->swap();
67 }
Geoff Lang8a079e52013-10-18 16:13:33 -040068}
69
Austin Kinross4fd18b12014-12-22 12:32:05 -080070void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth, GLfloat quadScale)
Geoff Lang8a079e52013-10-18 16:13:33 -040071{
72 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
73
74 glUseProgram(program);
75
76 const GLfloat vertices[] =
77 {
Austin Kinross4fd18b12014-12-22 12:32:05 -080078 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
79 -1.0f * quadScale, -1.0f * quadScale, quadDepth,
80 1.0f * quadScale, -1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040081
Austin Kinross4fd18b12014-12-22 12:32:05 -080082 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
83 1.0f * quadScale, -1.0f * quadScale, quadDepth,
84 1.0f * quadScale, 1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040085 };
86
87 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
88 glEnableVertexAttribArray(positionLocation);
89
90 glDrawArrays(GL_TRIANGLES, 0, 6);
91
92 glDisableVertexAttribArray(positionLocation);
93 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
94
95 glUseProgram(0);
96}
97
Geoff Langefc551f2013-10-31 10:20:28 -040098GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
99{
100 GLuint shader = glCreateShader(type);
101
102 const char *sourceArray[1] = { source.c_str() };
103 glShaderSource(shader, 1, sourceArray, NULL);
104 glCompileShader(shader);
105
106 GLint compileResult;
107 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
108
109 if (compileResult == 0)
110 {
111 GLint infoLogLength;
112 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
113
114 std::vector<GLchar> infoLog(infoLogLength);
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400115 glGetShaderInfoLog(shader, infoLog.size(), NULL, &infoLog[0]);
Geoff Langefc551f2013-10-31 10:20:28 -0400116
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400117 std::cerr << "shader compilation failed: " << &infoLog[0];
Geoff Langefc551f2013-10-31 10:20:28 -0400118
119 glDeleteShader(shader);
120 shader = 0;
121 }
122
123 return shader;
124}
125
Geoff Lang63046e22015-07-21 12:43:50 -0400126static bool checkExtensionExists(const char *allExtensions, const std::string &extName)
127{
128 return strstr(allExtensions, extName.c_str()) != nullptr;
129}
130
Geoff Lang8a079e52013-10-18 16:13:33 -0400131bool ANGLETest::extensionEnabled(const std::string &extName)
132{
Geoff Lang63046e22015-07-21 12:43:50 -0400133 return checkExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)),
134 extName);
135}
136
137bool ANGLETest::eglDisplayExtensionEnabled(EGLDisplay display, const std::string &extName)
138{
139 return checkExtensionExists(eglQueryString(display, EGL_EXTENSIONS), extName);
140}
141
142bool ANGLETest::eglClientExtensionEnabled(const std::string &extName)
143{
144 return checkExtensionExists(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS), extName);
Geoff Lang8a079e52013-10-18 16:13:33 -0400145}
146
Geoff Lang8a079e52013-10-18 16:13:33 -0400147void ANGLETest::setWindowWidth(int width)
148{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400149 mWidth = width;
Geoff Lang8a079e52013-10-18 16:13:33 -0400150}
151
152void ANGLETest::setWindowHeight(int height)
153{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400154 mHeight = height;
Geoff Lang8a079e52013-10-18 16:13:33 -0400155}
156
Geoff Langefc551f2013-10-31 10:20:28 -0400157void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400158{
Jamie Madill62af5462014-08-26 13:16:37 -0400159 mEGLWindow->setConfigRedBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400160}
161
Geoff Langefc551f2013-10-31 10:20:28 -0400162void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400163{
Jamie Madill62af5462014-08-26 13:16:37 -0400164 mEGLWindow->setConfigGreenBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400165}
166
Geoff Langefc551f2013-10-31 10:20:28 -0400167void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400168{
Jamie Madill62af5462014-08-26 13:16:37 -0400169 mEGLWindow->setConfigBlueBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400170}
171
Geoff Langefc551f2013-10-31 10:20:28 -0400172void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400173{
Jamie Madill62af5462014-08-26 13:16:37 -0400174 mEGLWindow->setConfigAlphaBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400175}
176
Geoff Langefc551f2013-10-31 10:20:28 -0400177void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400178{
Jamie Madill62af5462014-08-26 13:16:37 -0400179 mEGLWindow->setConfigDepthBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400180}
181
Geoff Langefc551f2013-10-31 10:20:28 -0400182void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400183{
Jamie Madill62af5462014-08-26 13:16:37 -0400184 mEGLWindow->setConfigStencilBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400185}
186
187void ANGLETest::setMultisampleEnabled(bool enabled)
188{
Jamie Madill62af5462014-08-26 13:16:37 -0400189 mEGLWindow->setMultisample(enabled);
Geoff Lang8a079e52013-10-18 16:13:33 -0400190}
191
192int ANGLETest::getClientVersion() const
193{
Jamie Madill62af5462014-08-26 13:16:37 -0400194 return mEGLWindow->getClientVersion();
Geoff Lang8a079e52013-10-18 16:13:33 -0400195}
196
Geoff Langb9266272015-01-29 13:25:14 +0000197EGLWindow *ANGLETest::getEGLWindow() const
198{
199 return mEGLWindow;
200}
201
Geoff Lang8a079e52013-10-18 16:13:33 -0400202int ANGLETest::getWindowWidth() const
203{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400204 return mWidth;
Geoff Lang8a079e52013-10-18 16:13:33 -0400205}
206
207int ANGLETest::getWindowHeight() const
208{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400209 return mHeight;
Geoff Lang8a079e52013-10-18 16:13:33 -0400210}
211
Geoff Langefc551f2013-10-31 10:20:28 -0400212bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400213{
Jamie Madill62af5462014-08-26 13:16:37 -0400214 return mEGLWindow->isMultisample();
Geoff Lang8a079e52013-10-18 16:13:33 -0400215}
216
217bool ANGLETest::createEGLContext()
218{
Jamie Madill62af5462014-08-26 13:16:37 -0400219 return mEGLWindow->initializeGL(mOSWindow);
Geoff Lang8a079e52013-10-18 16:13:33 -0400220}
221
222bool ANGLETest::destroyEGLContext()
223{
Jamie Madill62af5462014-08-26 13:16:37 -0400224 mEGLWindow->destroyGL();
Geoff Lang8a079e52013-10-18 16:13:33 -0400225 return true;
226}
Geoff Langbb134672013-10-23 13:06:46 -0400227
Geoff Lang0d3683c2014-10-23 11:08:16 -0400228bool ANGLETest::InitTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400229{
230 mOSWindow = CreateOSWindow();
231 if (!mOSWindow->initialize("ANGLE_TEST", 128, 128))
232 {
233 return false;
234 }
235
Geoff Lang0d3683c2014-10-23 11:08:16 -0400236 mOSWindow->setVisible(true);
Jamie Madill8add0eb2014-08-26 13:16:35 -0400237
238 return true;
239}
240
Geoff Lang0d3683c2014-10-23 11:08:16 -0400241bool ANGLETest::DestroyTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400242{
243 if (mOSWindow)
244 {
245 mOSWindow->destroy();
246 delete mOSWindow;
247 mOSWindow = NULL;
248 }
249
250 return true;
251}
252
Geoff Lang0d3683c2014-10-23 11:08:16 -0400253bool ANGLETest::ResizeWindow(int width, int height)
Jamie Madill8add0eb2014-08-26 13:16:35 -0400254{
255 return mOSWindow->resize(width, height);
256}
257
Geoff Lang0d3683c2014-10-23 11:08:16 -0400258void ANGLETest::SetWindowVisible(bool isVisible)
Geoff Langbb134672013-10-23 13:06:46 -0400259{
Jamie Madill4119ed32014-10-01 10:41:40 -0400260 mOSWindow->setVisible(isVisible);
Geoff Langbb134672013-10-23 13:06:46 -0400261}
Geoff Lang0d3683c2014-10-23 11:08:16 -0400262
Jamie Madillc3b9b262015-01-30 14:00:51 -0500263bool ANGLETest::isIntel() const
264{
265 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
266 return (rendererString.find("Intel") != std::string::npos);
267}
268
269bool ANGLETest::isAMD() const
270{
271 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
272 return (rendererString.find("AMD") != std::string::npos) ||
273 (rendererString.find("ATI") != std::string::npos);
274}
275
276bool ANGLETest::isNVidia() const
277{
278 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
279 return (rendererString.find("NVIDIA") != std::string::npos);
280}
281
282EGLint ANGLETest::getPlatformRenderer() const
283{
Jamie Madillf6859912015-01-30 17:05:35 -0500284 assert(mEGLWindow);
285 return mEGLWindow->getPlatform().renderer;
Jamie Madillc3b9b262015-01-30 14:00:51 -0500286}
287
Geoff Lang0d3683c2014-10-23 11:08:16 -0400288OSWindow *ANGLETest::mOSWindow = NULL;
289
290void ANGLETestEnvironment::SetUp()
291{
292 if (!ANGLETest::InitTestWindow())
293 {
294 FAIL() << "Failed to create ANGLE test window.";
295 }
296}
297
298void ANGLETestEnvironment::TearDown()
299{
300 ANGLETest::DestroyTestWindow();
301}