blob: a1a9c434e02249f5bc6ec11b3acd86e054a7a3a6 [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"
Geoff Langf9a6f082015-01-22 13:32:49 -050020#include "libANGLE/renderer/gl/FenceNVGL.h"
21#include "libANGLE/renderer/gl/FenceSyncGL.h"
22#include "libANGLE/renderer/gl/FramebufferGL.h"
Geoff Lang56cf9af2015-02-17 10:16:49 -050023#include "libANGLE/renderer/gl/FunctionsGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050024#include "libANGLE/renderer/gl/ProgramGL.h"
25#include "libANGLE/renderer/gl/QueryGL.h"
26#include "libANGLE/renderer/gl/RenderbufferGL.h"
Geoff Lang0af0b812015-09-23 13:56:25 -040027#include "libANGLE/renderer/gl/SamplerGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050028#include "libANGLE/renderer/gl/ShaderGL.h"
Geoff Lang94463d52015-02-18 13:09:37 -050029#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040030#include "libANGLE/renderer/gl/SurfaceGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050031#include "libANGLE/renderer/gl/TextureGL.h"
32#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
33#include "libANGLE/renderer/gl/VertexArrayGL.h"
Geoff Langddc74462015-02-25 11:48:09 -050034#include "libANGLE/renderer/gl/renderergl_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050035
Geoff Langb80360f2015-05-04 15:01:31 -040036#ifndef NDEBUG
37static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
38 const GLchar *message, const void *userParam)
39{
40 std::string sourceText;
41 switch (source)
42 {
43 case GL_DEBUG_SOURCE_API: sourceText = "OpenGL"; break;
44 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: sourceText = "Windows"; break;
45 case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceText = "Shader Compiler"; break;
46 case GL_DEBUG_SOURCE_THIRD_PARTY: sourceText = "Third Party"; break;
47 case GL_DEBUG_SOURCE_APPLICATION: sourceText = "Application"; break;
48 case GL_DEBUG_SOURCE_OTHER: sourceText = "Other"; break;
49 default: sourceText = "UNKNOWN"; break;
50 }
51
52 std::string typeText;
53 switch (type)
54 {
55 case GL_DEBUG_TYPE_ERROR: typeText = "Error"; break;
56 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeText = "Deprecated behavior"; break;
57 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeText = "Undefined behavior"; break;
58 case GL_DEBUG_TYPE_PORTABILITY: typeText = "Portability"; break;
59 case GL_DEBUG_TYPE_PERFORMANCE: typeText = "Performance"; break;
60 case GL_DEBUG_TYPE_OTHER: typeText = "Other"; break;
61 case GL_DEBUG_TYPE_MARKER: typeText = "Marker"; break;
62 default: typeText = "UNKNOWN"; break;
63 }
64
65 std::string severityText;
66 switch (severity)
67 {
68 case GL_DEBUG_SEVERITY_HIGH: severityText = "High"; break;
69 case GL_DEBUG_SEVERITY_MEDIUM: severityText = "Medium"; break;
70 case GL_DEBUG_SEVERITY_LOW: severityText = "Low"; break;
71 case GL_DEBUG_SEVERITY_NOTIFICATION: severityText = "Notification"; break;
72 default: severityText = "UNKNOWN"; break;
73 }
74
75 ERR("\n\tSource: %s\n\tType: %s\n\tID: %d\n\tSeverity: %s\n\tMessage: %s", sourceText.c_str(), typeText.c_str(), id,
76 severityText.c_str(), message);
77}
78#endif
79
Geoff Langf9a6f082015-01-22 13:32:49 -050080namespace rx
81{
82
Jamie Madill39fcf262015-06-08 14:39:07 -040083RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &attribMap)
Geoff Lang56cf9af2015-02-17 10:16:49 -050084 : Renderer(),
Geoff Lang862c0ba2015-05-25 15:31:16 -040085 mMaxSupportedESVersion(0, 0),
Geoff Lang94463d52015-02-18 13:09:37 -050086 mFunctions(functions),
Jamie Madill39fcf262015-06-08 14:39:07 -040087 mStateManager(nullptr),
Geoff Lang53b8aec2015-08-24 10:33:25 -040088 mBlitter(nullptr),
Geoff Langf0aa8422015-09-29 15:08:34 -040089 mHasDebugOutput(false),
Jamie Madill39fcf262015-06-08 14:39:07 -040090 mSkipDrawCalls(false)
Geoff Lang56cf9af2015-02-17 10:16:49 -050091{
92 ASSERT(mFunctions);
Geoff Langc05f7062015-03-10 09:50:57 -070093 mStateManager = new StateManagerGL(mFunctions, getRendererCaps());
Geoff Langcab7e1d2015-07-27 11:20:41 -040094 nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
Geoff Lang53b8aec2015-08-24 10:33:25 -040095 mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
Geoff Langb80360f2015-05-04 15:01:31 -040096
Geoff Langf0aa8422015-09-29 15:08:34 -040097 mHasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
98 mFunctions->hasGLExtension("GL_KHR_debug") ||
99 mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
100 mFunctions->hasGLESExtension("GL_KHR_debug");
Geoff Langb80360f2015-05-04 15:01:31 -0400101#ifndef NDEBUG
Geoff Langf0aa8422015-09-29 15:08:34 -0400102 if (mHasDebugOutput)
Geoff Langb80360f2015-05-04 15:01:31 -0400103 {
104 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
105 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
106 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
107 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
108 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
109 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
110 }
111#endif
Jamie Madill39fcf262015-06-08 14:39:07 -0400112
Ian Ewellec2c0c52016-04-05 13:46:26 -0400113 EGLint deviceType =
114 static_cast<EGLint>(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
Jamie Madill39fcf262015-06-08 14:39:07 -0400115 if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
116 {
117 mSkipDrawCalls = true;
118 }
Geoff Lang56cf9af2015-02-17 10:16:49 -0500119}
Geoff Langf9a6f082015-01-22 13:32:49 -0500120
121RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500122{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400123 SafeDelete(mBlitter);
Geoff Langbf8a72f2015-11-03 16:34:45 -0500124 SafeDelete(mStateManager);
Geoff Lang94463d52015-02-18 13:09:37 -0500125}
Geoff Langf9a6f082015-01-22 13:32:49 -0500126
127gl::Error RendererGL::flush()
128{
Geoff Lang2c919142015-04-01 14:44:13 -0400129 mFunctions->flush();
130 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500131}
132
133gl::Error RendererGL::finish()
134{
Geoff Langf0aa8422015-09-29 15:08:34 -0400135#ifdef NDEBUG
136 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
137 {
138 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
139 }
140#endif
141
Geoff Lang2c919142015-04-01 14:44:13 -0400142 mFunctions->finish();
Geoff Langf0aa8422015-09-29 15:08:34 -0400143
144#ifdef NDEBUG
145 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
146 {
147 mFunctions->disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
148 }
149#endif
150
Geoff Lang2c919142015-04-01 14:44:13 -0400151 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500152}
153
Jamie Madill9082b982016-04-27 15:21:51 -0400154gl::Error RendererGL::drawArrays(const gl::ContextState &data,
155 GLenum mode,
156 GLint first,
157 GLsizei count)
Geoff Langf9a6f082015-01-22 13:32:49 -0500158{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400159 gl::Error error = mStateManager->setDrawArraysState(data, first, count, 0);
Geoff Lang7c82bc42015-03-09 16:18:08 -0400160 if (error.isError())
161 {
162 return error;
163 }
164
Jamie Madill39fcf262015-06-08 14:39:07 -0400165 if (!mSkipDrawCalls)
166 {
167 mFunctions->drawArrays(mode, first, count);
168 }
Geoff Langd6e50872015-02-24 12:42:26 -0500169
170 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500171}
172
Jamie Madill9082b982016-04-27 15:21:51 -0400173gl::Error RendererGL::drawArraysInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400174 GLenum mode,
175 GLint first,
176 GLsizei count,
177 GLsizei instanceCount)
178{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400179 gl::Error error = mStateManager->setDrawArraysState(data, first, count, instanceCount);
180 if (error.isError())
181 {
182 return error;
183 }
184
185 if (!mSkipDrawCalls)
186 {
187 mFunctions->drawArraysInstanced(mode, first, count, instanceCount);
188 }
189
Geoff Langf6db0982015-08-25 13:04:00 -0400190 return gl::Error(GL_NO_ERROR);
191}
192
Jamie Madill9082b982016-04-27 15:21:51 -0400193gl::Error RendererGL::drawElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400194 GLenum mode,
195 GLsizei count,
196 GLenum type,
197 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400198 const gl::IndexRange &indexRange)
Geoff Langf9a6f082015-01-22 13:32:49 -0500199{
Geoff Lang7c82bc42015-03-09 16:18:08 -0400200 const GLvoid *drawIndexPointer = nullptr;
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400201 gl::Error error =
202 mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer);
Geoff Lang7c82bc42015-03-09 16:18:08 -0400203 if (error.isError())
204 {
205 return error;
206 }
207
Jamie Madill39fcf262015-06-08 14:39:07 -0400208 if (!mSkipDrawCalls)
209 {
210 mFunctions->drawElements(mode, count, type, drawIndexPointer);
211 }
Geoff Langd6e50872015-02-24 12:42:26 -0500212
213 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500214}
215
Jamie Madill9082b982016-04-27 15:21:51 -0400216gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400217 GLenum mode,
218 GLsizei count,
219 GLenum type,
220 const GLvoid *indices,
221 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -0400222 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400223{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400224 const GLvoid *drawIndexPointer = nullptr;
225 gl::Error error = mStateManager->setDrawElementsState(data, count, type, indices, instances,
226 &drawIndexPointer);
227 if (error.isError())
228 {
229 return error;
230 }
231
232 if (!mSkipDrawCalls)
233 {
234 mFunctions->drawElementsInstanced(mode, count, type, drawIndexPointer, instances);
235 }
236
Geoff Langf6db0982015-08-25 13:04:00 -0400237 return gl::Error(GL_NO_ERROR);
238}
239
Jamie Madill9082b982016-04-27 15:21:51 -0400240gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400241 GLenum mode,
242 GLuint start,
243 GLuint end,
244 GLsizei count,
245 GLenum type,
246 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400247 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400248{
Geoff Lang47502232015-08-25 16:26:10 -0400249 const GLvoid *drawIndexPointer = nullptr;
250 gl::Error error =
251 mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer);
252 if (error.isError())
253 {
254 return error;
255 }
256
257 if (!mSkipDrawCalls)
258 {
259 mFunctions->drawRangeElements(mode, start, end, count, type, drawIndexPointer);
260 }
261
Geoff Langf6db0982015-08-25 13:04:00 -0400262 return gl::Error(GL_NO_ERROR);
263}
264
Jamie Madill83f349e2015-09-23 09:50:36 -0400265CompilerImpl *RendererGL::createCompiler()
Geoff Langf9a6f082015-01-22 13:32:49 -0500266{
Jamie Madill83f349e2015-09-23 09:50:36 -0400267 return new CompilerGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500268}
269
Jamie Madill006cbc52015-09-23 16:47:54 -0400270ShaderImpl *RendererGL::createShader(const gl::Shader::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500271{
Corentin Wallezd4b50542015-09-28 12:19:26 -0700272 return new ShaderGL(data, mFunctions, mWorkarounds);
Geoff Langf9a6f082015-01-22 13:32:49 -0500273}
274
Jamie Madill5c6b7bf2015-08-17 12:53:35 -0400275ProgramImpl *RendererGL::createProgram(const gl::Program::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500276{
Philippe Hamel40911192016-04-07 16:45:50 -0400277 return new ProgramGL(data, mFunctions, mWorkarounds, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500278}
279
Jamie Madilld1405e52015-03-05 15:41:39 -0500280FramebufferImpl *RendererGL::createFramebuffer(const gl::Framebuffer::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500281{
Geoff Langafd7f0a2015-09-09 15:33:31 -0400282 return new FramebufferGL(data, mFunctions, mStateManager, mWorkarounds, false);
Geoff Langf9a6f082015-01-22 13:32:49 -0500283}
284
285TextureImpl *RendererGL::createTexture(GLenum target)
286{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400287 return new TextureGL(target, mFunctions, mWorkarounds, mStateManager, mBlitter);
Geoff Langf9a6f082015-01-22 13:32:49 -0500288}
289
290RenderbufferImpl *RendererGL::createRenderbuffer()
291{
Geoff Lang23a2ae02015-07-28 12:42:52 -0400292 return new RenderbufferGL(mFunctions, mWorkarounds, mStateManager, getRendererTextureCaps());
Geoff Langf9a6f082015-01-22 13:32:49 -0500293}
294
295BufferImpl *RendererGL::createBuffer()
296{
Geoff Lang36c79012015-02-24 11:47:20 -0500297 return new BufferGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500298}
299
Jamie Madill8e344942015-07-09 14:22:07 -0400300VertexArrayImpl *RendererGL::createVertexArray(const gl::VertexArray::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500301{
Jamie Madill8e344942015-07-09 14:22:07 -0400302 return new VertexArrayGL(data, mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500303}
304
305QueryImpl *RendererGL::createQuery(GLenum type)
306{
Geoff Langf0aa8422015-09-29 15:08:34 -0400307 return new QueryGL(type, mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500308}
309
310FenceNVImpl *RendererGL::createFenceNV()
311{
Geoff Langb11ad262015-04-09 14:43:34 -0400312 return new FenceNVGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500313}
314
315FenceSyncImpl *RendererGL::createFenceSync()
316{
Geoff Lang7d433dd2015-04-02 11:21:20 -0400317 return new FenceSyncGL(mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500318}
319
320TransformFeedbackImpl *RendererGL::createTransformFeedback()
321{
Geoff Lang1a683462015-09-29 15:09:59 -0400322 return new TransformFeedbackGL(mFunctions, mStateManager,
323 getRendererCaps().maxTransformFeedbackSeparateComponents);
Geoff Langf9a6f082015-01-22 13:32:49 -0500324}
325
Geoff Lang0af0b812015-09-23 13:56:25 -0400326SamplerImpl *RendererGL::createSampler()
327{
328 return new SamplerGL(mFunctions, mStateManager);
329}
330
Geoff Langf6ade2e2015-09-29 11:21:43 -0400331void RendererGL::insertEventMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700332{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400333 mFunctions->debugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
334 GL_DEBUG_SEVERITY_NOTIFICATION, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700335}
336
Geoff Langf6ade2e2015-09-29 11:21:43 -0400337void RendererGL::pushGroupMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700338{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400339 mFunctions->pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700340}
341
342void RendererGL::popGroupMarker()
343{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400344 mFunctions->popDebugGroup();
Austin Kinross6ee1e782015-05-29 17:05:37 -0700345}
346
Geoff Langf9a6f082015-01-22 13:32:49 -0500347void RendererGL::notifyDeviceLost()
348{
349 UNIMPLEMENTED();
350}
351
352bool RendererGL::isDeviceLost() const
353{
354 UNIMPLEMENTED();
355 return bool();
356}
357
358bool RendererGL::testDeviceLost()
359{
360 UNIMPLEMENTED();
361 return bool();
362}
363
364bool RendererGL::testDeviceResettable()
365{
366 UNIMPLEMENTED();
367 return bool();
368}
369
Geoff Langf9a6f082015-01-22 13:32:49 -0500370std::string RendererGL::getVendorString() const
371{
Geoff Lange42753b2015-04-08 13:46:33 -0400372 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500373}
374
375std::string RendererGL::getRendererDescription() const
376{
Geoff Lange42753b2015-04-08 13:46:33 -0400377 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
378 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
379
Geoff Lange42753b2015-04-08 13:46:33 -0400380 std::ostringstream rendererString;
381 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Lang08dcfed2015-05-25 13:38:42 -0400382 if (mFunctions->standard == STANDARD_GL_ES)
Geoff Lange42753b2015-04-08 13:46:33 -0400383 {
384 rendererString << " ES";
385 }
Geoff Lang08dcfed2015-05-25 13:38:42 -0400386 rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
Geoff Lang8b0f0b32015-07-20 15:59:28 -0400387 if (mFunctions->standard == STANDARD_GL_DESKTOP)
388 {
389 // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
390 if ((mFunctions->profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
391 (mFunctions->isAtLeastGL(gl::Version(3, 2)) && mFunctions->profile == 0))
392 {
393 rendererString << " compatibility";
394 }
395 else if ((mFunctions->profile & GL_CONTEXT_CORE_PROFILE_BIT) != 0)
396 {
397 rendererString << " core";
398 }
399 }
Geoff Lange42753b2015-04-08 13:46:33 -0400400
401 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500402}
403
Geoff Lang862c0ba2015-05-25 15:31:16 -0400404const gl::Version &RendererGL::getMaxSupportedESVersion() const
405{
406 // Force generation of caps
407 getRendererCaps();
408
409 return mMaxSupportedESVersion;
410}
411
Austin Kinross02df7962015-07-01 10:03:42 -0700412void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
413 gl::Extensions *outExtensions,
414 gl::Limitations * /* outLimitations */) const
Geoff Langf9a6f082015-01-22 13:32:49 -0500415{
Geoff Lang862c0ba2015-05-25 15:31:16 -0400416 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions, &mMaxSupportedESVersion);
Geoff Langf9a6f082015-01-22 13:32:49 -0500417}
418
Jamie Madill63e4e722015-11-06 19:15:11 +0000419void RendererGL::syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits)
Jamie Madill1b94d432015-08-07 13:23:23 -0400420{
Jamie Madill63e4e722015-11-06 19:15:11 +0000421 mStateManager->syncState(state, dirtyBits);
Jamie Madill1b94d432015-08-07 13:23:23 -0400422}
Ian Ewell53f59f42016-01-28 17:36:55 -0500423
424GLint RendererGL::getGPUDisjoint()
425{
426 // TODO(ewell): On GLES backends we should find a way to reliably query disjoint events
427 return 0;
428}
429
430GLint64 RendererGL::getTimestamp()
431{
432 GLint64 result = 0;
433 mFunctions->getInteger64v(GL_TIMESTAMP, &result);
434 return result;
435}
Ian Ewell292f0052016-02-04 10:37:32 -0500436
Jamie Madill9082b982016-04-27 15:21:51 -0400437void RendererGL::onMakeCurrent(const gl::ContextState &data)
Ian Ewell292f0052016-02-04 10:37:32 -0500438{
439 // Queries need to be paused/resumed on context switches
440 mStateManager->onMakeCurrent(data);
441}
Geoff Langf9a6f082015-01-22 13:32:49 -0500442}