blob: 3a1c77f45c13c86a764515334ebe54898e102e63 [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{
Geoff Lang8a079e52013-10-18 16:13:33 -040020 if (!createEGLContext())
21 {
22 FAIL() << "egl context creation failed.";
23 }
Corentin Wallezb828b322015-07-16 17:51:30 -040024
Corentin Wallez15ca8292015-07-22 17:54:20 -040025 if (mOSWindow->getWidth() != mWidth || mOSWindow->getHeight() != mHeight)
26 {
27 if (!mOSWindow->resize(mWidth, mHeight))
28 {
29 FAIL() << "Failed to resize ANGLE test window.";
30 }
Corentin Wallez096725b2015-07-20 16:58:57 -040031
Corentin Wallez15ca8292015-07-22 17:54:20 -040032 // Swap the buffers so that the default framebuffer picks up the resize
33 // which will allow follow-up test code to assume the framebuffer covers
34 // the whole window.
35 swapBuffers();
36
37 // This Viewport command is not strictly necessary but we add it so that programs
38 // taking OpenGL traces can guess the size of the default framebuffer and show it
39 // in their UIs
40 glViewport(0, 0, mWidth, mHeight);
41 }
Geoff Lang8a079e52013-10-18 16:13:33 -040042}
43
44void ANGLETest::TearDown()
45{
46 swapBuffers();
Jamie Madill9e16d402014-09-08 17:36:33 -040047 mOSWindow->messageLoop();
48
Geoff Lang8a079e52013-10-18 16:13:33 -040049 if (!destroyEGLContext())
50 {
51 FAIL() << "egl context destruction failed.";
52 }
Jamie Madill8add0eb2014-08-26 13:16:35 -040053
54 // Check for quit message
55 Event myEvent;
56 while (mOSWindow->popEvent(&myEvent))
57 {
58 if (myEvent.Type == Event::EVENT_CLOSED)
59 {
60 exit(0);
61 }
62 }
Geoff Lang8a079e52013-10-18 16:13:33 -040063}
64
65void ANGLETest::swapBuffers()
66{
Jamie Madill77a72f62015-04-14 11:18:32 -040067 if (mEGLWindow->isGLInitialized())
68 {
69 mEGLWindow->swap();
70 }
Geoff Lang8a079e52013-10-18 16:13:33 -040071}
72
Austin Kinross4fd18b12014-12-22 12:32:05 -080073void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth, GLfloat quadScale)
Geoff Lang8a079e52013-10-18 16:13:33 -040074{
75 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
76
77 glUseProgram(program);
78
79 const GLfloat vertices[] =
80 {
Austin Kinross4fd18b12014-12-22 12:32:05 -080081 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
82 -1.0f * quadScale, -1.0f * quadScale, quadDepth,
83 1.0f * quadScale, -1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040084
Austin Kinross4fd18b12014-12-22 12:32:05 -080085 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
86 1.0f * quadScale, -1.0f * quadScale, quadDepth,
87 1.0f * quadScale, 1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040088 };
89
90 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
91 glEnableVertexAttribArray(positionLocation);
92
93 glDrawArrays(GL_TRIANGLES, 0, 6);
94
95 glDisableVertexAttribArray(positionLocation);
96 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
97
98 glUseProgram(0);
99}
100
Geoff Langefc551f2013-10-31 10:20:28 -0400101GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
102{
103 GLuint shader = glCreateShader(type);
104
105 const char *sourceArray[1] = { source.c_str() };
106 glShaderSource(shader, 1, sourceArray, NULL);
107 glCompileShader(shader);
108
109 GLint compileResult;
110 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
111
112 if (compileResult == 0)
113 {
114 GLint infoLogLength;
115 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
116
117 std::vector<GLchar> infoLog(infoLogLength);
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400118 glGetShaderInfoLog(shader, infoLog.size(), NULL, &infoLog[0]);
Geoff Langefc551f2013-10-31 10:20:28 -0400119
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400120 std::cerr << "shader compilation failed: " << &infoLog[0];
Geoff Langefc551f2013-10-31 10:20:28 -0400121
122 glDeleteShader(shader);
123 shader = 0;
124 }
125
126 return shader;
127}
128
Geoff Lang63046e22015-07-21 12:43:50 -0400129static bool checkExtensionExists(const char *allExtensions, const std::string &extName)
130{
131 return strstr(allExtensions, extName.c_str()) != nullptr;
132}
133
Geoff Lang8a079e52013-10-18 16:13:33 -0400134bool ANGLETest::extensionEnabled(const std::string &extName)
135{
Geoff Lang63046e22015-07-21 12:43:50 -0400136 return checkExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)),
137 extName);
138}
139
140bool ANGLETest::eglDisplayExtensionEnabled(EGLDisplay display, const std::string &extName)
141{
142 return checkExtensionExists(eglQueryString(display, EGL_EXTENSIONS), extName);
143}
144
145bool ANGLETest::eglClientExtensionEnabled(const std::string &extName)
146{
147 return checkExtensionExists(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS), extName);
Geoff Lang8a079e52013-10-18 16:13:33 -0400148}
149
Geoff Lang8a079e52013-10-18 16:13:33 -0400150void ANGLETest::setWindowWidth(int width)
151{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400152 mWidth = width;
Geoff Lang8a079e52013-10-18 16:13:33 -0400153}
154
155void ANGLETest::setWindowHeight(int height)
156{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400157 mHeight = height;
Geoff Lang8a079e52013-10-18 16:13:33 -0400158}
159
Geoff Langefc551f2013-10-31 10:20:28 -0400160void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400161{
Jamie Madill62af5462014-08-26 13:16:37 -0400162 mEGLWindow->setConfigRedBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400163}
164
Geoff Langefc551f2013-10-31 10:20:28 -0400165void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400166{
Jamie Madill62af5462014-08-26 13:16:37 -0400167 mEGLWindow->setConfigGreenBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400168}
169
Geoff Langefc551f2013-10-31 10:20:28 -0400170void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400171{
Jamie Madill62af5462014-08-26 13:16:37 -0400172 mEGLWindow->setConfigBlueBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400173}
174
Geoff Langefc551f2013-10-31 10:20:28 -0400175void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400176{
Jamie Madill62af5462014-08-26 13:16:37 -0400177 mEGLWindow->setConfigAlphaBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400178}
179
Geoff Langefc551f2013-10-31 10:20:28 -0400180void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400181{
Jamie Madill62af5462014-08-26 13:16:37 -0400182 mEGLWindow->setConfigDepthBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400183}
184
Geoff Langefc551f2013-10-31 10:20:28 -0400185void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400186{
Jamie Madill62af5462014-08-26 13:16:37 -0400187 mEGLWindow->setConfigStencilBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400188}
189
190void ANGLETest::setMultisampleEnabled(bool enabled)
191{
Jamie Madill62af5462014-08-26 13:16:37 -0400192 mEGLWindow->setMultisample(enabled);
Geoff Lang8a079e52013-10-18 16:13:33 -0400193}
194
195int ANGLETest::getClientVersion() const
196{
Jamie Madill62af5462014-08-26 13:16:37 -0400197 return mEGLWindow->getClientVersion();
Geoff Lang8a079e52013-10-18 16:13:33 -0400198}
199
Geoff Langb9266272015-01-29 13:25:14 +0000200EGLWindow *ANGLETest::getEGLWindow() const
201{
202 return mEGLWindow;
203}
204
Geoff Lang8a079e52013-10-18 16:13:33 -0400205int ANGLETest::getWindowWidth() const
206{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400207 return mWidth;
Geoff Lang8a079e52013-10-18 16:13:33 -0400208}
209
210int ANGLETest::getWindowHeight() const
211{
Corentin Wallezf3357ee2015-07-22 14:10:19 -0400212 return mHeight;
Geoff Lang8a079e52013-10-18 16:13:33 -0400213}
214
Geoff Langefc551f2013-10-31 10:20:28 -0400215bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400216{
Jamie Madill62af5462014-08-26 13:16:37 -0400217 return mEGLWindow->isMultisample();
Geoff Lang8a079e52013-10-18 16:13:33 -0400218}
219
220bool ANGLETest::createEGLContext()
221{
Jamie Madill62af5462014-08-26 13:16:37 -0400222 return mEGLWindow->initializeGL(mOSWindow);
Geoff Lang8a079e52013-10-18 16:13:33 -0400223}
224
225bool ANGLETest::destroyEGLContext()
226{
Jamie Madill62af5462014-08-26 13:16:37 -0400227 mEGLWindow->destroyGL();
Geoff Lang8a079e52013-10-18 16:13:33 -0400228 return true;
229}
Geoff Langbb134672013-10-23 13:06:46 -0400230
Geoff Lang0d3683c2014-10-23 11:08:16 -0400231bool ANGLETest::InitTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400232{
233 mOSWindow = CreateOSWindow();
234 if (!mOSWindow->initialize("ANGLE_TEST", 128, 128))
235 {
236 return false;
237 }
238
Geoff Lang0d3683c2014-10-23 11:08:16 -0400239 mOSWindow->setVisible(true);
Jamie Madill8add0eb2014-08-26 13:16:35 -0400240
241 return true;
242}
243
Geoff Lang0d3683c2014-10-23 11:08:16 -0400244bool ANGLETest::DestroyTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400245{
246 if (mOSWindow)
247 {
248 mOSWindow->destroy();
249 delete mOSWindow;
250 mOSWindow = NULL;
251 }
252
253 return true;
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}