blob: db8ed006e659b621eb2c26a4bcc111f8d767ced1 [file] [log] [blame]
Geoff Langf9a6f082015-01-22 13:32:49 -05001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// RendererGL.cpp: Implements the class methods for RendererGL.
8
9#include "libANGLE/renderer/gl/RendererGL.h"
10
Jamie Madill39fcf262015-06-08 14:39:07 -040011#include <EGL/eglext.h>
12
Geoff Langf9a6f082015-01-22 13:32:49 -050013#include "common/debug.h"
Jamie Madill39fcf262015-06-08 14:39:07 -040014#include "libANGLE/AttributeMap.h"
Geoff Langc4152832015-02-20 09:57:29 -050015#include "libANGLE/Data.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040016#include "libANGLE/Surface.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050017#include "libANGLE/renderer/gl/BufferGL.h"
18#include "libANGLE/renderer/gl/CompilerGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050019#include "libANGLE/renderer/gl/FenceNVGL.h"
20#include "libANGLE/renderer/gl/FenceSyncGL.h"
21#include "libANGLE/renderer/gl/FramebufferGL.h"
Geoff Lang56cf9af2015-02-17 10:16:49 -050022#include "libANGLE/renderer/gl/FunctionsGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050023#include "libANGLE/renderer/gl/ProgramGL.h"
24#include "libANGLE/renderer/gl/QueryGL.h"
25#include "libANGLE/renderer/gl/RenderbufferGL.h"
26#include "libANGLE/renderer/gl/ShaderGL.h"
Geoff Lang94463d52015-02-18 13:09:37 -050027#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040028#include "libANGLE/renderer/gl/SurfaceGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050029#include "libANGLE/renderer/gl/TextureGL.h"
30#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
31#include "libANGLE/renderer/gl/VertexArrayGL.h"
Geoff Langddc74462015-02-25 11:48:09 -050032#include "libANGLE/renderer/gl/renderergl_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050033
Geoff Langb80360f2015-05-04 15:01:31 -040034#ifndef NDEBUG
35static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
36 const GLchar *message, const void *userParam)
37{
38 std::string sourceText;
39 switch (source)
40 {
41 case GL_DEBUG_SOURCE_API: sourceText = "OpenGL"; break;
42 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: sourceText = "Windows"; break;
43 case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceText = "Shader Compiler"; break;
44 case GL_DEBUG_SOURCE_THIRD_PARTY: sourceText = "Third Party"; break;
45 case GL_DEBUG_SOURCE_APPLICATION: sourceText = "Application"; break;
46 case GL_DEBUG_SOURCE_OTHER: sourceText = "Other"; break;
47 default: sourceText = "UNKNOWN"; break;
48 }
49
50 std::string typeText;
51 switch (type)
52 {
53 case GL_DEBUG_TYPE_ERROR: typeText = "Error"; break;
54 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeText = "Deprecated behavior"; break;
55 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeText = "Undefined behavior"; break;
56 case GL_DEBUG_TYPE_PORTABILITY: typeText = "Portability"; break;
57 case GL_DEBUG_TYPE_PERFORMANCE: typeText = "Performance"; break;
58 case GL_DEBUG_TYPE_OTHER: typeText = "Other"; break;
59 case GL_DEBUG_TYPE_MARKER: typeText = "Marker"; break;
60 default: typeText = "UNKNOWN"; break;
61 }
62
63 std::string severityText;
64 switch (severity)
65 {
66 case GL_DEBUG_SEVERITY_HIGH: severityText = "High"; break;
67 case GL_DEBUG_SEVERITY_MEDIUM: severityText = "Medium"; break;
68 case GL_DEBUG_SEVERITY_LOW: severityText = "Low"; break;
69 case GL_DEBUG_SEVERITY_NOTIFICATION: severityText = "Notification"; break;
70 default: severityText = "UNKNOWN"; break;
71 }
72
73 ERR("\n\tSource: %s\n\tType: %s\n\tID: %d\n\tSeverity: %s\n\tMessage: %s", sourceText.c_str(), typeText.c_str(), id,
74 severityText.c_str(), message);
75}
76#endif
77
Geoff Langf9a6f082015-01-22 13:32:49 -050078namespace rx
79{
80
Jamie Madill39fcf262015-06-08 14:39:07 -040081RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &attribMap)
Geoff Lang56cf9af2015-02-17 10:16:49 -050082 : Renderer(),
Geoff Lang862c0ba2015-05-25 15:31:16 -040083 mMaxSupportedESVersion(0, 0),
Geoff Lang94463d52015-02-18 13:09:37 -050084 mFunctions(functions),
Jamie Madill39fcf262015-06-08 14:39:07 -040085 mStateManager(nullptr),
86 mSkipDrawCalls(false)
Geoff Lang56cf9af2015-02-17 10:16:49 -050087{
88 ASSERT(mFunctions);
Geoff Langc05f7062015-03-10 09:50:57 -070089 mStateManager = new StateManagerGL(mFunctions, getRendererCaps());
Geoff Langcab7e1d2015-07-27 11:20:41 -040090 nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
Geoff Langb80360f2015-05-04 15:01:31 -040091
92#ifndef NDEBUG
93 if (mFunctions->debugMessageControl && mFunctions->debugMessageCallback)
94 {
95 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
96 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
97 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
98 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
99 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
100 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
101 }
102#endif
Jamie Madill39fcf262015-06-08 14:39:07 -0400103
104 EGLint deviceType = attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE);
105 if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
106 {
107 mSkipDrawCalls = true;
108 }
Geoff Lang56cf9af2015-02-17 10:16:49 -0500109}
Geoff Langf9a6f082015-01-22 13:32:49 -0500110
111RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500112{
113 SafeDelete(mStateManager);
114}
Geoff Langf9a6f082015-01-22 13:32:49 -0500115
116gl::Error RendererGL::flush()
117{
Geoff Lang2c919142015-04-01 14:44:13 -0400118 mFunctions->flush();
119 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500120}
121
122gl::Error RendererGL::finish()
123{
Geoff Lang2c919142015-04-01 14:44:13 -0400124 mFunctions->finish();
125 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500126}
127
128gl::Error RendererGL::drawArrays(const gl::Data &data, GLenum mode,
129 GLint first, GLsizei count, GLsizei instances)
130{
Geoff Lang7c82bc42015-03-09 16:18:08 -0400131 gl::Error error = mStateManager->setDrawArraysState(data, first, count);
132 if (error.isError())
133 {
134 return error;
135 }
136
Jamie Madill39fcf262015-06-08 14:39:07 -0400137 if (!mSkipDrawCalls)
138 {
139 mFunctions->drawArrays(mode, first, count);
140 }
Geoff Langd6e50872015-02-24 12:42:26 -0500141
142 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500143}
144
145gl::Error RendererGL::drawElements(const gl::Data &data, GLenum mode, GLsizei count, GLenum type,
146 const GLvoid *indices, GLsizei instances,
Geoff Lang831b1952015-05-05 11:02:27 -0400147 const gl::RangeUI &indexRange)
Geoff Langf9a6f082015-01-22 13:32:49 -0500148{
Geoff Langd6e50872015-02-24 12:42:26 -0500149 if (instances > 0)
150 {
151 UNIMPLEMENTED();
152 }
153
Geoff Lang7c82bc42015-03-09 16:18:08 -0400154 const GLvoid *drawIndexPointer = nullptr;
155 gl::Error error = mStateManager->setDrawElementsState(data, count, type, indices, &drawIndexPointer);
156 if (error.isError())
157 {
158 return error;
159 }
160
Jamie Madill39fcf262015-06-08 14:39:07 -0400161 if (!mSkipDrawCalls)
162 {
163 mFunctions->drawElements(mode, count, type, drawIndexPointer);
164 }
Geoff Langd6e50872015-02-24 12:42:26 -0500165
166 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500167}
168
169CompilerImpl *RendererGL::createCompiler(const gl::Data &data)
170{
Geoff Lang8273e002015-06-15 13:40:19 -0700171 return new CompilerGL(data, mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500172}
173
174ShaderImpl *RendererGL::createShader(GLenum type)
175{
Geoff Lang295ed4c2015-02-20 09:58:25 -0500176 return new ShaderGL(type, mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500177}
178
179ProgramImpl *RendererGL::createProgram()
180{
Geoff Langb1f435e2015-02-20 10:01:01 -0500181 return new ProgramGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500182}
183
Geoff Lang4ad17092015-03-10 16:47:44 -0400184FramebufferImpl *RendererGL::createDefaultFramebuffer(const gl::Framebuffer::Data &data)
185{
186 return new FramebufferGL(data, mFunctions, mStateManager, true);
Geoff Langf9a6f082015-01-22 13:32:49 -0500187}
188
Jamie Madilld1405e52015-03-05 15:41:39 -0500189FramebufferImpl *RendererGL::createFramebuffer(const gl::Framebuffer::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500190{
Geoff Lang4ad17092015-03-10 16:47:44 -0400191 return new FramebufferGL(data, mFunctions, mStateManager, false);
Geoff Langf9a6f082015-01-22 13:32:49 -0500192}
193
194TextureImpl *RendererGL::createTexture(GLenum target)
195{
Geoff Lang14389cc2015-07-23 10:57:20 -0400196 return new TextureGL(target, mFunctions, mWorkarounds, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500197}
198
199RenderbufferImpl *RendererGL::createRenderbuffer()
200{
Geoff Lang23a2ae02015-07-28 12:42:52 -0400201 return new RenderbufferGL(mFunctions, mWorkarounds, mStateManager, getRendererTextureCaps());
Geoff Langf9a6f082015-01-22 13:32:49 -0500202}
203
204BufferImpl *RendererGL::createBuffer()
205{
Geoff Lang36c79012015-02-24 11:47:20 -0500206 return new BufferGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500207}
208
Jamie Madill8e344942015-07-09 14:22:07 -0400209VertexArrayImpl *RendererGL::createVertexArray(const gl::VertexArray::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500210{
Jamie Madill8e344942015-07-09 14:22:07 -0400211 return new VertexArrayGL(data, mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500212}
213
214QueryImpl *RendererGL::createQuery(GLenum type)
215{
216 return new QueryGL(type);
217}
218
219FenceNVImpl *RendererGL::createFenceNV()
220{
Geoff Langb11ad262015-04-09 14:43:34 -0400221 return new FenceNVGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500222}
223
224FenceSyncImpl *RendererGL::createFenceSync()
225{
Geoff Lang7d433dd2015-04-02 11:21:20 -0400226 return new FenceSyncGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500227}
228
229TransformFeedbackImpl *RendererGL::createTransformFeedback()
230{
231 return new TransformFeedbackGL();
232}
233
Austin Kinross6ee1e782015-05-29 17:05:37 -0700234void RendererGL::insertEventMarker(GLsizei, const char *)
235{
236 UNREACHABLE();
237}
238
239void RendererGL::pushGroupMarker(GLsizei, const char *)
240{
241 UNREACHABLE();
242}
243
244void RendererGL::popGroupMarker()
245{
246 UNREACHABLE();
247}
248
Geoff Langf9a6f082015-01-22 13:32:49 -0500249void RendererGL::notifyDeviceLost()
250{
251 UNIMPLEMENTED();
252}
253
254bool RendererGL::isDeviceLost() const
255{
256 UNIMPLEMENTED();
257 return bool();
258}
259
260bool RendererGL::testDeviceLost()
261{
262 UNIMPLEMENTED();
263 return bool();
264}
265
266bool RendererGL::testDeviceResettable()
267{
268 UNIMPLEMENTED();
269 return bool();
270}
271
272VendorID RendererGL::getVendorId() const
273{
274 UNIMPLEMENTED();
275 return VendorID();
276}
277
278std::string RendererGL::getVendorString() const
279{
Geoff Lange42753b2015-04-08 13:46:33 -0400280 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500281}
282
283std::string RendererGL::getRendererDescription() const
284{
Geoff Lange42753b2015-04-08 13:46:33 -0400285 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
286 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
287
Geoff Lange42753b2015-04-08 13:46:33 -0400288 std::ostringstream rendererString;
289 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Lang08dcfed2015-05-25 13:38:42 -0400290 if (mFunctions->standard == STANDARD_GL_ES)
Geoff Lange42753b2015-04-08 13:46:33 -0400291 {
292 rendererString << " ES";
293 }
Geoff Lang08dcfed2015-05-25 13:38:42 -0400294 rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
Geoff Lang8b0f0b32015-07-20 15:59:28 -0400295 if (mFunctions->standard == STANDARD_GL_DESKTOP)
296 {
297 // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
298 if ((mFunctions->profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
299 (mFunctions->isAtLeastGL(gl::Version(3, 2)) && mFunctions->profile == 0))
300 {
301 rendererString << " compatibility";
302 }
303 else if ((mFunctions->profile & GL_CONTEXT_CORE_PROFILE_BIT) != 0)
304 {
305 rendererString << " core";
306 }
307 }
Geoff Lange42753b2015-04-08 13:46:33 -0400308
309 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500310}
311
Geoff Lang862c0ba2015-05-25 15:31:16 -0400312const gl::Version &RendererGL::getMaxSupportedESVersion() const
313{
314 // Force generation of caps
315 getRendererCaps();
316
317 return mMaxSupportedESVersion;
318}
319
Austin Kinross02df7962015-07-01 10:03:42 -0700320void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
321 gl::Extensions *outExtensions,
322 gl::Limitations * /* outLimitations */) const
Geoff Langf9a6f082015-01-22 13:32:49 -0500323{
Geoff Lang862c0ba2015-05-25 15:31:16 -0400324 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions, &mMaxSupportedESVersion);
Geoff Langf9a6f082015-01-22 13:32:49 -0500325}
326
Geoff Langf9a6f082015-01-22 13:32:49 -0500327}