blob: 5d530d06b2a27a1ad99ba1025b4d70ccd916ea98 [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
11#include "common/debug.h"
Geoff Langc4152832015-02-20 09:57:29 -050012#include "libANGLE/Data.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040013#include "libANGLE/Surface.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050014#include "libANGLE/renderer/gl/BufferGL.h"
15#include "libANGLE/renderer/gl/CompilerGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050016#include "libANGLE/renderer/gl/FenceNVGL.h"
17#include "libANGLE/renderer/gl/FenceSyncGL.h"
18#include "libANGLE/renderer/gl/FramebufferGL.h"
Geoff Lang56cf9af2015-02-17 10:16:49 -050019#include "libANGLE/renderer/gl/FunctionsGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050020#include "libANGLE/renderer/gl/ProgramGL.h"
21#include "libANGLE/renderer/gl/QueryGL.h"
22#include "libANGLE/renderer/gl/RenderbufferGL.h"
23#include "libANGLE/renderer/gl/ShaderGL.h"
Geoff Lang94463d52015-02-18 13:09:37 -050024#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040025#include "libANGLE/renderer/gl/SurfaceGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050026#include "libANGLE/renderer/gl/TextureGL.h"
27#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
28#include "libANGLE/renderer/gl/VertexArrayGL.h"
Geoff Langddc74462015-02-25 11:48:09 -050029#include "libANGLE/renderer/gl/renderergl_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050030
Geoff Langb80360f2015-05-04 15:01:31 -040031#ifndef NDEBUG
32static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
33 const GLchar *message, const void *userParam)
34{
35 std::string sourceText;
36 switch (source)
37 {
38 case GL_DEBUG_SOURCE_API: sourceText = "OpenGL"; break;
39 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: sourceText = "Windows"; break;
40 case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceText = "Shader Compiler"; break;
41 case GL_DEBUG_SOURCE_THIRD_PARTY: sourceText = "Third Party"; break;
42 case GL_DEBUG_SOURCE_APPLICATION: sourceText = "Application"; break;
43 case GL_DEBUG_SOURCE_OTHER: sourceText = "Other"; break;
44 default: sourceText = "UNKNOWN"; break;
45 }
46
47 std::string typeText;
48 switch (type)
49 {
50 case GL_DEBUG_TYPE_ERROR: typeText = "Error"; break;
51 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeText = "Deprecated behavior"; break;
52 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeText = "Undefined behavior"; break;
53 case GL_DEBUG_TYPE_PORTABILITY: typeText = "Portability"; break;
54 case GL_DEBUG_TYPE_PERFORMANCE: typeText = "Performance"; break;
55 case GL_DEBUG_TYPE_OTHER: typeText = "Other"; break;
56 case GL_DEBUG_TYPE_MARKER: typeText = "Marker"; break;
57 default: typeText = "UNKNOWN"; break;
58 }
59
60 std::string severityText;
61 switch (severity)
62 {
63 case GL_DEBUG_SEVERITY_HIGH: severityText = "High"; break;
64 case GL_DEBUG_SEVERITY_MEDIUM: severityText = "Medium"; break;
65 case GL_DEBUG_SEVERITY_LOW: severityText = "Low"; break;
66 case GL_DEBUG_SEVERITY_NOTIFICATION: severityText = "Notification"; break;
67 default: severityText = "UNKNOWN"; break;
68 }
69
70 ERR("\n\tSource: %s\n\tType: %s\n\tID: %d\n\tSeverity: %s\n\tMessage: %s", sourceText.c_str(), typeText.c_str(), id,
71 severityText.c_str(), message);
72}
73#endif
74
Geoff Langf9a6f082015-01-22 13:32:49 -050075namespace rx
76{
77
Geoff Lang56cf9af2015-02-17 10:16:49 -050078RendererGL::RendererGL(const FunctionsGL *functions)
79 : Renderer(),
Geoff Lang94463d52015-02-18 13:09:37 -050080 mFunctions(functions),
81 mStateManager(nullptr)
Geoff Lang56cf9af2015-02-17 10:16:49 -050082{
83 ASSERT(mFunctions);
Geoff Langc05f7062015-03-10 09:50:57 -070084 mStateManager = new StateManagerGL(mFunctions, getRendererCaps());
Geoff Langb80360f2015-05-04 15:01:31 -040085
86#ifndef NDEBUG
87 if (mFunctions->debugMessageControl && mFunctions->debugMessageCallback)
88 {
89 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
90 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
91 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
92 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
93 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
94 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
95 }
96#endif
Geoff Lang56cf9af2015-02-17 10:16:49 -050097}
Geoff Langf9a6f082015-01-22 13:32:49 -050098
99RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500100{
101 SafeDelete(mStateManager);
102}
Geoff Langf9a6f082015-01-22 13:32:49 -0500103
104gl::Error RendererGL::flush()
105{
Geoff Lang2c919142015-04-01 14:44:13 -0400106 mFunctions->flush();
107 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500108}
109
110gl::Error RendererGL::finish()
111{
Geoff Lang2c919142015-04-01 14:44:13 -0400112 mFunctions->finish();
113 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500114}
115
116gl::Error RendererGL::drawArrays(const gl::Data &data, GLenum mode,
117 GLint first, GLsizei count, GLsizei instances)
118{
Geoff Lang7c82bc42015-03-09 16:18:08 -0400119 gl::Error error = mStateManager->setDrawArraysState(data, first, count);
120 if (error.isError())
121 {
122 return error;
123 }
124
Geoff Langd6e50872015-02-24 12:42:26 -0500125 mFunctions->drawArrays(mode, first, count);
126
127 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500128}
129
130gl::Error RendererGL::drawElements(const gl::Data &data, GLenum mode, GLsizei count, GLenum type,
131 const GLvoid *indices, GLsizei instances,
132 const RangeUI &indexRange)
133{
Geoff Langd6e50872015-02-24 12:42:26 -0500134 if (instances > 0)
135 {
136 UNIMPLEMENTED();
137 }
138
Geoff Lang7c82bc42015-03-09 16:18:08 -0400139 const GLvoid *drawIndexPointer = nullptr;
140 gl::Error error = mStateManager->setDrawElementsState(data, count, type, indices, &drawIndexPointer);
141 if (error.isError())
142 {
143 return error;
144 }
145
146 mFunctions->drawElements(mode, count, type, drawIndexPointer);
Geoff Langd6e50872015-02-24 12:42:26 -0500147
148 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500149}
150
151CompilerImpl *RendererGL::createCompiler(const gl::Data &data)
152{
Geoff Langc4152832015-02-20 09:57:29 -0500153 return new CompilerGL(data);
Geoff Langf9a6f082015-01-22 13:32:49 -0500154}
155
156ShaderImpl *RendererGL::createShader(GLenum type)
157{
Geoff Lang295ed4c2015-02-20 09:58:25 -0500158 return new ShaderGL(type, mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500159}
160
161ProgramImpl *RendererGL::createProgram()
162{
Geoff Langb1f435e2015-02-20 10:01:01 -0500163 return new ProgramGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500164}
165
Geoff Lang4ad17092015-03-10 16:47:44 -0400166FramebufferImpl *RendererGL::createDefaultFramebuffer(const gl::Framebuffer::Data &data)
167{
168 return new FramebufferGL(data, mFunctions, mStateManager, true);
Geoff Langf9a6f082015-01-22 13:32:49 -0500169}
170
Jamie Madilld1405e52015-03-05 15:41:39 -0500171FramebufferImpl *RendererGL::createFramebuffer(const gl::Framebuffer::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500172{
Geoff Lang4ad17092015-03-10 16:47:44 -0400173 return new FramebufferGL(data, mFunctions, mStateManager, false);
Geoff Langf9a6f082015-01-22 13:32:49 -0500174}
175
176TextureImpl *RendererGL::createTexture(GLenum target)
177{
Geoff Langc05f7062015-03-10 09:50:57 -0700178 return new TextureGL(target, mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500179}
180
181RenderbufferImpl *RendererGL::createRenderbuffer()
182{
Geoff Langa4903b72015-03-02 16:02:48 -0800183 return new RenderbufferGL(mFunctions, mStateManager, getRendererTextureCaps());
Geoff Langf9a6f082015-01-22 13:32:49 -0500184}
185
186BufferImpl *RendererGL::createBuffer()
187{
Geoff Lang36c79012015-02-24 11:47:20 -0500188 return new BufferGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500189}
190
191VertexArrayImpl *RendererGL::createVertexArray()
192{
Geoff Langba4c4a82015-02-24 12:38:46 -0500193 return new VertexArrayGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500194}
195
196QueryImpl *RendererGL::createQuery(GLenum type)
197{
198 return new QueryGL(type);
199}
200
201FenceNVImpl *RendererGL::createFenceNV()
202{
Geoff Langb11ad262015-04-09 14:43:34 -0400203 return new FenceNVGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500204}
205
206FenceSyncImpl *RendererGL::createFenceSync()
207{
Geoff Lang7d433dd2015-04-02 11:21:20 -0400208 return new FenceSyncGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500209}
210
211TransformFeedbackImpl *RendererGL::createTransformFeedback()
212{
213 return new TransformFeedbackGL();
214}
215
216void RendererGL::notifyDeviceLost()
217{
218 UNIMPLEMENTED();
219}
220
221bool RendererGL::isDeviceLost() const
222{
223 UNIMPLEMENTED();
224 return bool();
225}
226
227bool RendererGL::testDeviceLost()
228{
229 UNIMPLEMENTED();
230 return bool();
231}
232
233bool RendererGL::testDeviceResettable()
234{
235 UNIMPLEMENTED();
236 return bool();
237}
238
239VendorID RendererGL::getVendorId() const
240{
241 UNIMPLEMENTED();
242 return VendorID();
243}
244
245std::string RendererGL::getVendorString() const
246{
Geoff Lange42753b2015-04-08 13:46:33 -0400247 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500248}
249
250std::string RendererGL::getRendererDescription() const
251{
Geoff Lange42753b2015-04-08 13:46:33 -0400252 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
253 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
254
Geoff Lange42753b2015-04-08 13:46:33 -0400255 std::ostringstream rendererString;
256 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Langa4903b72015-03-02 16:02:48 -0800257 if (mFunctions->openGLES)
Geoff Lange42753b2015-04-08 13:46:33 -0400258 {
259 rendererString << " ES";
260 }
Geoff Langa4903b72015-03-02 16:02:48 -0800261 rendererString << " " << mFunctions->majorVersion << "." << mFunctions->minorVersion;
Geoff Lange42753b2015-04-08 13:46:33 -0400262
263 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500264}
265
266void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps, gl::Extensions *outExtensions) const
267{
Geoff Langddc74462015-02-25 11:48:09 -0500268 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500269}
270
271Workarounds RendererGL::generateWorkarounds() const
272{
273 Workarounds workarounds;
274 return workarounds;
275}
276
277}