blob: 0cc8d85ccc8d397a180f9c120859fe43cbd73265 [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"
Jamie Madill9082b982016-04-27 15:21:51 -040015#include "libANGLE/ContextState.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040016#include "libANGLE/Surface.h"
Geoff Lang53b8aec2015-08-24 10:33:25 -040017#include "libANGLE/renderer/gl/BlitGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050018#include "libANGLE/renderer/gl/BufferGL.h"
19#include "libANGLE/renderer/gl/CompilerGL.h"
Jamie Madill437fa652016-05-03 15:13:24 -040020#include "libANGLE/renderer/gl/ContextGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050021#include "libANGLE/renderer/gl/FenceNVGL.h"
22#include "libANGLE/renderer/gl/FenceSyncGL.h"
23#include "libANGLE/renderer/gl/FramebufferGL.h"
Geoff Lang56cf9af2015-02-17 10:16:49 -050024#include "libANGLE/renderer/gl/FunctionsGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050025#include "libANGLE/renderer/gl/ProgramGL.h"
26#include "libANGLE/renderer/gl/QueryGL.h"
27#include "libANGLE/renderer/gl/RenderbufferGL.h"
Geoff Lang0af0b812015-09-23 13:56:25 -040028#include "libANGLE/renderer/gl/SamplerGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050029#include "libANGLE/renderer/gl/ShaderGL.h"
Geoff Lang94463d52015-02-18 13:09:37 -050030#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040031#include "libANGLE/renderer/gl/SurfaceGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050032#include "libANGLE/renderer/gl/TextureGL.h"
33#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
34#include "libANGLE/renderer/gl/VertexArrayGL.h"
Geoff Langddc74462015-02-25 11:48:09 -050035#include "libANGLE/renderer/gl/renderergl_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050036
Geoff Langb80360f2015-05-04 15:01:31 -040037#ifndef NDEBUG
38static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
39 const GLchar *message, const void *userParam)
40{
41 std::string sourceText;
42 switch (source)
43 {
44 case GL_DEBUG_SOURCE_API: sourceText = "OpenGL"; break;
45 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: sourceText = "Windows"; break;
46 case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceText = "Shader Compiler"; break;
47 case GL_DEBUG_SOURCE_THIRD_PARTY: sourceText = "Third Party"; break;
48 case GL_DEBUG_SOURCE_APPLICATION: sourceText = "Application"; break;
49 case GL_DEBUG_SOURCE_OTHER: sourceText = "Other"; break;
50 default: sourceText = "UNKNOWN"; break;
51 }
52
53 std::string typeText;
54 switch (type)
55 {
56 case GL_DEBUG_TYPE_ERROR: typeText = "Error"; break;
57 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeText = "Deprecated behavior"; break;
58 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeText = "Undefined behavior"; break;
59 case GL_DEBUG_TYPE_PORTABILITY: typeText = "Portability"; break;
60 case GL_DEBUG_TYPE_PERFORMANCE: typeText = "Performance"; break;
61 case GL_DEBUG_TYPE_OTHER: typeText = "Other"; break;
62 case GL_DEBUG_TYPE_MARKER: typeText = "Marker"; break;
63 default: typeText = "UNKNOWN"; break;
64 }
65
66 std::string severityText;
67 switch (severity)
68 {
69 case GL_DEBUG_SEVERITY_HIGH: severityText = "High"; break;
70 case GL_DEBUG_SEVERITY_MEDIUM: severityText = "Medium"; break;
71 case GL_DEBUG_SEVERITY_LOW: severityText = "Low"; break;
72 case GL_DEBUG_SEVERITY_NOTIFICATION: severityText = "Notification"; break;
73 default: severityText = "UNKNOWN"; break;
74 }
75
76 ERR("\n\tSource: %s\n\tType: %s\n\tID: %d\n\tSeverity: %s\n\tMessage: %s", sourceText.c_str(), typeText.c_str(), id,
77 severityText.c_str(), message);
78}
79#endif
80
Geoff Langf9a6f082015-01-22 13:32:49 -050081namespace rx
82{
83
Jamie Madill39fcf262015-06-08 14:39:07 -040084RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &attribMap)
Geoff Lang56cf9af2015-02-17 10:16:49 -050085 : Renderer(),
Geoff Lang862c0ba2015-05-25 15:31:16 -040086 mMaxSupportedESVersion(0, 0),
Geoff Lang94463d52015-02-18 13:09:37 -050087 mFunctions(functions),
Jamie Madill39fcf262015-06-08 14:39:07 -040088 mStateManager(nullptr),
Geoff Lang53b8aec2015-08-24 10:33:25 -040089 mBlitter(nullptr),
Geoff Langf0aa8422015-09-29 15:08:34 -040090 mHasDebugOutput(false),
Jamie Madill39fcf262015-06-08 14:39:07 -040091 mSkipDrawCalls(false)
Geoff Lang56cf9af2015-02-17 10:16:49 -050092{
93 ASSERT(mFunctions);
Geoff Langc05f7062015-03-10 09:50:57 -070094 mStateManager = new StateManagerGL(mFunctions, getRendererCaps());
Geoff Langcab7e1d2015-07-27 11:20:41 -040095 nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
Geoff Lang53b8aec2015-08-24 10:33:25 -040096 mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
Geoff Langb80360f2015-05-04 15:01:31 -040097
Geoff Langf0aa8422015-09-29 15:08:34 -040098 mHasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
99 mFunctions->hasGLExtension("GL_KHR_debug") ||
100 mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
101 mFunctions->hasGLESExtension("GL_KHR_debug");
Geoff Langb80360f2015-05-04 15:01:31 -0400102#ifndef NDEBUG
Geoff Langf0aa8422015-09-29 15:08:34 -0400103 if (mHasDebugOutput)
Geoff Langb80360f2015-05-04 15:01:31 -0400104 {
105 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
106 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
107 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
108 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
109 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
110 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
111 }
112#endif
Jamie Madill39fcf262015-06-08 14:39:07 -0400113
Ian Ewellec2c0c52016-04-05 13:46:26 -0400114 EGLint deviceType =
115 static_cast<EGLint>(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
Jamie Madill39fcf262015-06-08 14:39:07 -0400116 if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
117 {
118 mSkipDrawCalls = true;
119 }
Geoff Lang56cf9af2015-02-17 10:16:49 -0500120}
Geoff Langf9a6f082015-01-22 13:32:49 -0500121
122RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500123{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400124 SafeDelete(mBlitter);
Geoff Langbf8a72f2015-11-03 16:34:45 -0500125 SafeDelete(mStateManager);
Geoff Lang94463d52015-02-18 13:09:37 -0500126}
Geoff Langf9a6f082015-01-22 13:32:49 -0500127
128gl::Error RendererGL::flush()
129{
Geoff Lang2c919142015-04-01 14:44:13 -0400130 mFunctions->flush();
131 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500132}
133
134gl::Error RendererGL::finish()
135{
Geoff Langf0aa8422015-09-29 15:08:34 -0400136#ifdef NDEBUG
137 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
138 {
139 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
140 }
141#endif
142
Geoff Lang2c919142015-04-01 14:44:13 -0400143 mFunctions->finish();
Geoff Langf0aa8422015-09-29 15:08:34 -0400144
145#ifdef NDEBUG
146 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
147 {
148 mFunctions->disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
149 }
150#endif
151
Geoff Lang2c919142015-04-01 14:44:13 -0400152 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500153}
154
Jamie Madill9082b982016-04-27 15:21:51 -0400155gl::Error RendererGL::drawArrays(const gl::ContextState &data,
156 GLenum mode,
157 GLint first,
158 GLsizei count)
Geoff Langf9a6f082015-01-22 13:32:49 -0500159{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400160 gl::Error error = mStateManager->setDrawArraysState(data, first, count, 0);
Geoff Lang7c82bc42015-03-09 16:18:08 -0400161 if (error.isError())
162 {
163 return error;
164 }
165
Jamie Madill39fcf262015-06-08 14:39:07 -0400166 if (!mSkipDrawCalls)
167 {
168 mFunctions->drawArrays(mode, first, count);
169 }
Geoff Langd6e50872015-02-24 12:42:26 -0500170
171 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500172}
173
Jamie Madill9082b982016-04-27 15:21:51 -0400174gl::Error RendererGL::drawArraysInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400175 GLenum mode,
176 GLint first,
177 GLsizei count,
178 GLsizei instanceCount)
179{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400180 gl::Error error = mStateManager->setDrawArraysState(data, first, count, instanceCount);
181 if (error.isError())
182 {
183 return error;
184 }
185
186 if (!mSkipDrawCalls)
187 {
188 mFunctions->drawArraysInstanced(mode, first, count, instanceCount);
189 }
190
Geoff Langf6db0982015-08-25 13:04:00 -0400191 return gl::Error(GL_NO_ERROR);
192}
193
Jamie Madill9082b982016-04-27 15:21:51 -0400194gl::Error RendererGL::drawElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400195 GLenum mode,
196 GLsizei count,
197 GLenum type,
198 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400199 const gl::IndexRange &indexRange)
Geoff Langf9a6f082015-01-22 13:32:49 -0500200{
Geoff Lang7c82bc42015-03-09 16:18:08 -0400201 const GLvoid *drawIndexPointer = nullptr;
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400202 gl::Error error =
203 mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer);
Geoff Lang7c82bc42015-03-09 16:18:08 -0400204 if (error.isError())
205 {
206 return error;
207 }
208
Jamie Madill39fcf262015-06-08 14:39:07 -0400209 if (!mSkipDrawCalls)
210 {
211 mFunctions->drawElements(mode, count, type, drawIndexPointer);
212 }
Geoff Langd6e50872015-02-24 12:42:26 -0500213
214 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500215}
216
Jamie Madill9082b982016-04-27 15:21:51 -0400217gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400218 GLenum mode,
219 GLsizei count,
220 GLenum type,
221 const GLvoid *indices,
222 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -0400223 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400224{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400225 const GLvoid *drawIndexPointer = nullptr;
226 gl::Error error = mStateManager->setDrawElementsState(data, count, type, indices, instances,
227 &drawIndexPointer);
228 if (error.isError())
229 {
230 return error;
231 }
232
233 if (!mSkipDrawCalls)
234 {
235 mFunctions->drawElementsInstanced(mode, count, type, drawIndexPointer, instances);
236 }
237
Geoff Langf6db0982015-08-25 13:04:00 -0400238 return gl::Error(GL_NO_ERROR);
239}
240
Jamie Madill9082b982016-04-27 15:21:51 -0400241gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400242 GLenum mode,
243 GLuint start,
244 GLuint end,
245 GLsizei count,
246 GLenum type,
247 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400248 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400249{
Geoff Lang47502232015-08-25 16:26:10 -0400250 const GLvoid *drawIndexPointer = nullptr;
251 gl::Error error =
252 mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer);
253 if (error.isError())
254 {
255 return error;
256 }
257
258 if (!mSkipDrawCalls)
259 {
260 mFunctions->drawRangeElements(mode, start, end, count, type, drawIndexPointer);
261 }
262
Geoff Langf6db0982015-08-25 13:04:00 -0400263 return gl::Error(GL_NO_ERROR);
264}
265
Jamie Madill437fa652016-05-03 15:13:24 -0400266ContextImpl *RendererGL::createContext()
267{
268 return new ContextGL;
269}
270
Jamie Madill83f349e2015-09-23 09:50:36 -0400271CompilerImpl *RendererGL::createCompiler()
Geoff Langf9a6f082015-01-22 13:32:49 -0500272{
Jamie Madill83f349e2015-09-23 09:50:36 -0400273 return new CompilerGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500274}
275
Jamie Madill15243d92016-04-26 13:41:35 -0400276ShaderImpl *RendererGL::createShader(const gl::ShaderState &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500277{
Corentin Wallezd4b50542015-09-28 12:19:26 -0700278 return new ShaderGL(data, mFunctions, mWorkarounds);
Geoff Langf9a6f082015-01-22 13:32:49 -0500279}
280
Jamie Madill48ef11b2016-04-27 15:21:52 -0400281ProgramImpl *RendererGL::createProgram(const gl::ProgramState &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500282{
Philippe Hamel40911192016-04-07 16:45:50 -0400283 return new ProgramGL(data, mFunctions, mWorkarounds, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500284}
285
Jamie Madill48ef11b2016-04-27 15:21:52 -0400286FramebufferImpl *RendererGL::createFramebuffer(const gl::FramebufferState &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500287{
Geoff Langafd7f0a2015-09-09 15:33:31 -0400288 return new FramebufferGL(data, mFunctions, mStateManager, mWorkarounds, false);
Geoff Langf9a6f082015-01-22 13:32:49 -0500289}
290
291TextureImpl *RendererGL::createTexture(GLenum target)
292{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400293 return new TextureGL(target, mFunctions, mWorkarounds, mStateManager, mBlitter);
Geoff Langf9a6f082015-01-22 13:32:49 -0500294}
295
296RenderbufferImpl *RendererGL::createRenderbuffer()
297{
Geoff Lang23a2ae02015-07-28 12:42:52 -0400298 return new RenderbufferGL(mFunctions, mWorkarounds, mStateManager, getRendererTextureCaps());
Geoff Langf9a6f082015-01-22 13:32:49 -0500299}
300
301BufferImpl *RendererGL::createBuffer()
302{
Geoff Lang36c79012015-02-24 11:47:20 -0500303 return new BufferGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500304}
305
Jamie Madill3f572682016-04-26 13:41:36 -0400306VertexArrayImpl *RendererGL::createVertexArray(const gl::VertexArrayState &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500307{
Jamie Madill8e344942015-07-09 14:22:07 -0400308 return new VertexArrayGL(data, mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500309}
310
311QueryImpl *RendererGL::createQuery(GLenum type)
312{
Geoff Langf0aa8422015-09-29 15:08:34 -0400313 return new QueryGL(type, mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500314}
315
316FenceNVImpl *RendererGL::createFenceNV()
317{
Geoff Langb11ad262015-04-09 14:43:34 -0400318 return new FenceNVGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500319}
320
321FenceSyncImpl *RendererGL::createFenceSync()
322{
Geoff Lang7d433dd2015-04-02 11:21:20 -0400323 return new FenceSyncGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500324}
325
326TransformFeedbackImpl *RendererGL::createTransformFeedback()
327{
Geoff Lang1a683462015-09-29 15:09:59 -0400328 return new TransformFeedbackGL(mFunctions, mStateManager,
329 getRendererCaps().maxTransformFeedbackSeparateComponents);
Geoff Langf9a6f082015-01-22 13:32:49 -0500330}
331
Geoff Lang0af0b812015-09-23 13:56:25 -0400332SamplerImpl *RendererGL::createSampler()
333{
334 return new SamplerGL(mFunctions, mStateManager);
335}
336
Geoff Langf6ade2e2015-09-29 11:21:43 -0400337void RendererGL::insertEventMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700338{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400339 mFunctions->debugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
340 GL_DEBUG_SEVERITY_NOTIFICATION, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700341}
342
Geoff Langf6ade2e2015-09-29 11:21:43 -0400343void RendererGL::pushGroupMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700344{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400345 mFunctions->pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700346}
347
348void RendererGL::popGroupMarker()
349{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400350 mFunctions->popDebugGroup();
Austin Kinross6ee1e782015-05-29 17:05:37 -0700351}
352
Geoff Langf9a6f082015-01-22 13:32:49 -0500353void RendererGL::notifyDeviceLost()
354{
355 UNIMPLEMENTED();
356}
357
358bool RendererGL::isDeviceLost() const
359{
360 UNIMPLEMENTED();
361 return bool();
362}
363
364bool RendererGL::testDeviceLost()
365{
366 UNIMPLEMENTED();
367 return bool();
368}
369
370bool RendererGL::testDeviceResettable()
371{
372 UNIMPLEMENTED();
373 return bool();
374}
375
Geoff Langf9a6f082015-01-22 13:32:49 -0500376std::string RendererGL::getVendorString() const
377{
Geoff Lange42753b2015-04-08 13:46:33 -0400378 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500379}
380
381std::string RendererGL::getRendererDescription() const
382{
Geoff Lange42753b2015-04-08 13:46:33 -0400383 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
384 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
385
Geoff Lange42753b2015-04-08 13:46:33 -0400386 std::ostringstream rendererString;
387 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Lang08dcfed2015-05-25 13:38:42 -0400388 if (mFunctions->standard == STANDARD_GL_ES)
Geoff Lange42753b2015-04-08 13:46:33 -0400389 {
390 rendererString << " ES";
391 }
Geoff Lang08dcfed2015-05-25 13:38:42 -0400392 rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
Geoff Lang8b0f0b32015-07-20 15:59:28 -0400393 if (mFunctions->standard == STANDARD_GL_DESKTOP)
394 {
395 // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
396 if ((mFunctions->profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
397 (mFunctions->isAtLeastGL(gl::Version(3, 2)) && mFunctions->profile == 0))
398 {
399 rendererString << " compatibility";
400 }
401 else if ((mFunctions->profile & GL_CONTEXT_CORE_PROFILE_BIT) != 0)
402 {
403 rendererString << " core";
404 }
405 }
Geoff Lange42753b2015-04-08 13:46:33 -0400406
407 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500408}
409
Geoff Lang862c0ba2015-05-25 15:31:16 -0400410const gl::Version &RendererGL::getMaxSupportedESVersion() const
411{
412 // Force generation of caps
413 getRendererCaps();
414
415 return mMaxSupportedESVersion;
416}
417
Austin Kinross02df7962015-07-01 10:03:42 -0700418void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
419 gl::Extensions *outExtensions,
420 gl::Limitations * /* outLimitations */) const
Geoff Langf9a6f082015-01-22 13:32:49 -0500421{
Geoff Lang862c0ba2015-05-25 15:31:16 -0400422 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions, &mMaxSupportedESVersion);
Geoff Langf9a6f082015-01-22 13:32:49 -0500423}
424
Jamie Madill63e4e722015-11-06 19:15:11 +0000425void RendererGL::syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits)
Jamie Madill1b94d432015-08-07 13:23:23 -0400426{
Jamie Madill63e4e722015-11-06 19:15:11 +0000427 mStateManager->syncState(state, dirtyBits);
Jamie Madill1b94d432015-08-07 13:23:23 -0400428}
Ian Ewell53f59f42016-01-28 17:36:55 -0500429
430GLint RendererGL::getGPUDisjoint()
431{
432 // TODO(ewell): On GLES backends we should find a way to reliably query disjoint events
433 return 0;
434}
435
436GLint64 RendererGL::getTimestamp()
437{
438 GLint64 result = 0;
439 mFunctions->getInteger64v(GL_TIMESTAMP, &result);
440 return result;
441}
Ian Ewell292f0052016-02-04 10:37:32 -0500442
Jamie Madill9082b982016-04-27 15:21:51 -0400443void RendererGL::onMakeCurrent(const gl::ContextState &data)
Ian Ewell292f0052016-02-04 10:37:32 -0500444{
445 // Queries need to be paused/resumed on context switches
446 mStateManager->onMakeCurrent(data);
447}
Geoff Langf9a6f082015-01-22 13:32:49 -0500448}