blob: 737b310b5113c4013c492ce0e62bf34e91bbf7c4 [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{
Jamie Madillfa05f602015-05-07 13:47:11 -04008 mEGLWindow = new EGLWindow(1280, 720, GetParam().mClientVersion, GetParam().mEGLPlatformParameters);
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 }
27}
28
29void ANGLETest::TearDown()
30{
31 swapBuffers();
Jamie Madill9e16d402014-09-08 17:36:33 -040032 mOSWindow->messageLoop();
33
Geoff Lang8a079e52013-10-18 16:13:33 -040034 if (!destroyEGLContext())
35 {
36 FAIL() << "egl context destruction failed.";
37 }
Jamie Madill8add0eb2014-08-26 13:16:35 -040038
39 // Check for quit message
40 Event myEvent;
41 while (mOSWindow->popEvent(&myEvent))
42 {
43 if (myEvent.Type == Event::EVENT_CLOSED)
44 {
45 exit(0);
46 }
47 }
Geoff Lang8a079e52013-10-18 16:13:33 -040048}
49
50void ANGLETest::swapBuffers()
51{
Jamie Madill77a72f62015-04-14 11:18:32 -040052 if (mEGLWindow->isGLInitialized())
53 {
54 mEGLWindow->swap();
55 }
Geoff Lang8a079e52013-10-18 16:13:33 -040056}
57
Austin Kinross4fd18b12014-12-22 12:32:05 -080058void ANGLETest::drawQuad(GLuint program, const std::string& positionAttribName, GLfloat quadDepth, GLfloat quadScale)
Geoff Lang8a079e52013-10-18 16:13:33 -040059{
60 GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str());
61
62 glUseProgram(program);
63
64 const GLfloat vertices[] =
65 {
Austin Kinross4fd18b12014-12-22 12:32:05 -080066 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
67 -1.0f * quadScale, -1.0f * quadScale, quadDepth,
68 1.0f * quadScale, -1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040069
Austin Kinross4fd18b12014-12-22 12:32:05 -080070 -1.0f * quadScale, 1.0f * quadScale, quadDepth,
71 1.0f * quadScale, -1.0f * quadScale, quadDepth,
72 1.0f * quadScale, 1.0f * quadScale, quadDepth,
Geoff Lang8a079e52013-10-18 16:13:33 -040073 };
74
75 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
76 glEnableVertexAttribArray(positionLocation);
77
78 glDrawArrays(GL_TRIANGLES, 0, 6);
79
80 glDisableVertexAttribArray(positionLocation);
81 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
82
83 glUseProgram(0);
84}
85
Geoff Langefc551f2013-10-31 10:20:28 -040086GLuint ANGLETest::compileShader(GLenum type, const std::string &source)
87{
88 GLuint shader = glCreateShader(type);
89
90 const char *sourceArray[1] = { source.c_str() };
91 glShaderSource(shader, 1, sourceArray, NULL);
92 glCompileShader(shader);
93
94 GLint compileResult;
95 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
96
97 if (compileResult == 0)
98 {
99 GLint infoLogLength;
100 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
101
102 std::vector<GLchar> infoLog(infoLogLength);
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400103 glGetShaderInfoLog(shader, infoLog.size(), NULL, &infoLog[0]);
Geoff Langefc551f2013-10-31 10:20:28 -0400104
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400105 std::cerr << "shader compilation failed: " << &infoLog[0];
Geoff Langefc551f2013-10-31 10:20:28 -0400106
107 glDeleteShader(shader);
108 shader = 0;
109 }
110
111 return shader;
112}
113
Geoff Lang8a079e52013-10-18 16:13:33 -0400114bool ANGLETest::extensionEnabled(const std::string &extName)
115{
116 const char* extString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
117 return strstr(extString, extName.c_str()) != NULL;
118}
119
Geoff Lang8a079e52013-10-18 16:13:33 -0400120void ANGLETest::setWindowWidth(int width)
121{
Jamie Madill62af5462014-08-26 13:16:37 -0400122 mEGLWindow->setWidth(width);
Geoff Lang8a079e52013-10-18 16:13:33 -0400123}
124
125void ANGLETest::setWindowHeight(int height)
126{
Jamie Madill62af5462014-08-26 13:16:37 -0400127 mEGLWindow->setHeight(height);
Geoff Lang8a079e52013-10-18 16:13:33 -0400128}
129
Geoff Langefc551f2013-10-31 10:20:28 -0400130void ANGLETest::setConfigRedBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400131{
Jamie Madill62af5462014-08-26 13:16:37 -0400132 mEGLWindow->setConfigRedBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400133}
134
Geoff Langefc551f2013-10-31 10:20:28 -0400135void ANGLETest::setConfigGreenBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400136{
Jamie Madill62af5462014-08-26 13:16:37 -0400137 mEGLWindow->setConfigGreenBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400138}
139
Geoff Langefc551f2013-10-31 10:20:28 -0400140void ANGLETest::setConfigBlueBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400141{
Jamie Madill62af5462014-08-26 13:16:37 -0400142 mEGLWindow->setConfigBlueBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400143}
144
Geoff Langefc551f2013-10-31 10:20:28 -0400145void ANGLETest::setConfigAlphaBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400146{
Jamie Madill62af5462014-08-26 13:16:37 -0400147 mEGLWindow->setConfigAlphaBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400148}
149
Geoff Langefc551f2013-10-31 10:20:28 -0400150void ANGLETest::setConfigDepthBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400151{
Jamie Madill62af5462014-08-26 13:16:37 -0400152 mEGLWindow->setConfigDepthBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400153}
154
Geoff Langefc551f2013-10-31 10:20:28 -0400155void ANGLETest::setConfigStencilBits(int bits)
Geoff Lang8a079e52013-10-18 16:13:33 -0400156{
Jamie Madill62af5462014-08-26 13:16:37 -0400157 mEGLWindow->setConfigStencilBits(bits);
Geoff Lang8a079e52013-10-18 16:13:33 -0400158}
159
160void ANGLETest::setMultisampleEnabled(bool enabled)
161{
Jamie Madill62af5462014-08-26 13:16:37 -0400162 mEGLWindow->setMultisample(enabled);
Geoff Lang8a079e52013-10-18 16:13:33 -0400163}
164
165int ANGLETest::getClientVersion() const
166{
Jamie Madill62af5462014-08-26 13:16:37 -0400167 return mEGLWindow->getClientVersion();
Geoff Lang8a079e52013-10-18 16:13:33 -0400168}
169
Geoff Langb9266272015-01-29 13:25:14 +0000170EGLWindow *ANGLETest::getEGLWindow() const
171{
172 return mEGLWindow;
173}
174
Geoff Lang8a079e52013-10-18 16:13:33 -0400175int ANGLETest::getWindowWidth() const
176{
Jamie Madill62af5462014-08-26 13:16:37 -0400177 return mEGLWindow->getWidth();
Geoff Lang8a079e52013-10-18 16:13:33 -0400178}
179
180int ANGLETest::getWindowHeight() const
181{
Jamie Madill62af5462014-08-26 13:16:37 -0400182 return mEGLWindow->getHeight();
Geoff Lang8a079e52013-10-18 16:13:33 -0400183}
184
Geoff Langefc551f2013-10-31 10:20:28 -0400185bool ANGLETest::isMultisampleEnabled() const
Geoff Lang8a079e52013-10-18 16:13:33 -0400186{
Jamie Madill62af5462014-08-26 13:16:37 -0400187 return mEGLWindow->isMultisample();
Geoff Lang8a079e52013-10-18 16:13:33 -0400188}
189
190bool ANGLETest::createEGLContext()
191{
Jamie Madill62af5462014-08-26 13:16:37 -0400192 return mEGLWindow->initializeGL(mOSWindow);
Geoff Lang8a079e52013-10-18 16:13:33 -0400193}
194
195bool ANGLETest::destroyEGLContext()
196{
Jamie Madill62af5462014-08-26 13:16:37 -0400197 mEGLWindow->destroyGL();
Geoff Lang8a079e52013-10-18 16:13:33 -0400198 return true;
199}
Geoff Langbb134672013-10-23 13:06:46 -0400200
Geoff Lang0d3683c2014-10-23 11:08:16 -0400201bool ANGLETest::InitTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400202{
203 mOSWindow = CreateOSWindow();
204 if (!mOSWindow->initialize("ANGLE_TEST", 128, 128))
205 {
206 return false;
207 }
208
Geoff Lang0d3683c2014-10-23 11:08:16 -0400209 mOSWindow->setVisible(true);
Jamie Madill8add0eb2014-08-26 13:16:35 -0400210
211 return true;
212}
213
Geoff Lang0d3683c2014-10-23 11:08:16 -0400214bool ANGLETest::DestroyTestWindow()
Jamie Madill8add0eb2014-08-26 13:16:35 -0400215{
216 if (mOSWindow)
217 {
218 mOSWindow->destroy();
219 delete mOSWindow;
220 mOSWindow = NULL;
221 }
222
223 return true;
224}
225
Geoff Lang0d3683c2014-10-23 11:08:16 -0400226bool ANGLETest::ResizeWindow(int width, int height)
Jamie Madill8add0eb2014-08-26 13:16:35 -0400227{
228 return mOSWindow->resize(width, height);
229}
230
Geoff Lang0d3683c2014-10-23 11:08:16 -0400231void ANGLETest::SetWindowVisible(bool isVisible)
Geoff Langbb134672013-10-23 13:06:46 -0400232{
Jamie Madill4119ed32014-10-01 10:41:40 -0400233 mOSWindow->setVisible(isVisible);
Geoff Langbb134672013-10-23 13:06:46 -0400234}
Geoff Lang0d3683c2014-10-23 11:08:16 -0400235
Jamie Madillc3b9b262015-01-30 14:00:51 -0500236bool ANGLETest::isIntel() const
237{
238 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
239 return (rendererString.find("Intel") != std::string::npos);
240}
241
242bool ANGLETest::isAMD() const
243{
244 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
245 return (rendererString.find("AMD") != std::string::npos) ||
246 (rendererString.find("ATI") != std::string::npos);
247}
248
249bool ANGLETest::isNVidia() const
250{
251 std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
252 return (rendererString.find("NVIDIA") != std::string::npos);
253}
254
255EGLint ANGLETest::getPlatformRenderer() const
256{
Jamie Madillf6859912015-01-30 17:05:35 -0500257 assert(mEGLWindow);
258 return mEGLWindow->getPlatform().renderer;
Jamie Madillc3b9b262015-01-30 14:00:51 -0500259}
260
Geoff Lang0d3683c2014-10-23 11:08:16 -0400261OSWindow *ANGLETest::mOSWindow = NULL;
262
263void ANGLETestEnvironment::SetUp()
264{
265 if (!ANGLETest::InitTestWindow())
266 {
267 FAIL() << "Failed to create ANGLE test window.";
268 }
269}
270
271void ANGLETestEnvironment::TearDown()
272{
273 ANGLETest::DestroyTestWindow();
274}