blob: 682a89567220474e499eca21c4f416f2d7045fa7 [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"
Sami Väisänene45e53b2016-05-25 10:36:04 +030016#include "libANGLE/Path.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040017#include "libANGLE/Surface.h"
Geoff Lang53b8aec2015-08-24 10:33:25 -040018#include "libANGLE/renderer/gl/BlitGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050019#include "libANGLE/renderer/gl/BufferGL.h"
20#include "libANGLE/renderer/gl/CompilerGL.h"
Jamie Madill437fa652016-05-03 15:13:24 -040021#include "libANGLE/renderer/gl/ContextGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050022#include "libANGLE/renderer/gl/FenceNVGL.h"
23#include "libANGLE/renderer/gl/FenceSyncGL.h"
24#include "libANGLE/renderer/gl/FramebufferGL.h"
Geoff Lang56cf9af2015-02-17 10:16:49 -050025#include "libANGLE/renderer/gl/FunctionsGL.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030026#include "libANGLE/renderer/gl/PathGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050027#include "libANGLE/renderer/gl/ProgramGL.h"
28#include "libANGLE/renderer/gl/QueryGL.h"
29#include "libANGLE/renderer/gl/RenderbufferGL.h"
Geoff Lang0af0b812015-09-23 13:56:25 -040030#include "libANGLE/renderer/gl/SamplerGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050031#include "libANGLE/renderer/gl/ShaderGL.h"
Geoff Lang94463d52015-02-18 13:09:37 -050032#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040033#include "libANGLE/renderer/gl/SurfaceGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050034#include "libANGLE/renderer/gl/TextureGL.h"
35#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
36#include "libANGLE/renderer/gl/VertexArrayGL.h"
Geoff Langddc74462015-02-25 11:48:09 -050037#include "libANGLE/renderer/gl/renderergl_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050038
Geoff Langb80360f2015-05-04 15:01:31 -040039#ifndef NDEBUG
40static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
41 const GLchar *message, const void *userParam)
42{
43 std::string sourceText;
44 switch (source)
45 {
46 case GL_DEBUG_SOURCE_API: sourceText = "OpenGL"; break;
47 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: sourceText = "Windows"; break;
48 case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceText = "Shader Compiler"; break;
49 case GL_DEBUG_SOURCE_THIRD_PARTY: sourceText = "Third Party"; break;
50 case GL_DEBUG_SOURCE_APPLICATION: sourceText = "Application"; break;
51 case GL_DEBUG_SOURCE_OTHER: sourceText = "Other"; break;
52 default: sourceText = "UNKNOWN"; break;
53 }
54
55 std::string typeText;
56 switch (type)
57 {
58 case GL_DEBUG_TYPE_ERROR: typeText = "Error"; break;
59 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeText = "Deprecated behavior"; break;
60 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeText = "Undefined behavior"; break;
61 case GL_DEBUG_TYPE_PORTABILITY: typeText = "Portability"; break;
62 case GL_DEBUG_TYPE_PERFORMANCE: typeText = "Performance"; break;
63 case GL_DEBUG_TYPE_OTHER: typeText = "Other"; break;
64 case GL_DEBUG_TYPE_MARKER: typeText = "Marker"; break;
65 default: typeText = "UNKNOWN"; break;
66 }
67
68 std::string severityText;
69 switch (severity)
70 {
71 case GL_DEBUG_SEVERITY_HIGH: severityText = "High"; break;
72 case GL_DEBUG_SEVERITY_MEDIUM: severityText = "Medium"; break;
73 case GL_DEBUG_SEVERITY_LOW: severityText = "Low"; break;
74 case GL_DEBUG_SEVERITY_NOTIFICATION: severityText = "Notification"; break;
75 default: severityText = "UNKNOWN"; break;
76 }
77
78 ERR("\n\tSource: %s\n\tType: %s\n\tID: %d\n\tSeverity: %s\n\tMessage: %s", sourceText.c_str(), typeText.c_str(), id,
79 severityText.c_str(), message);
80}
81#endif
82
Geoff Langf9a6f082015-01-22 13:32:49 -050083namespace rx
84{
85
Jamie Madill39fcf262015-06-08 14:39:07 -040086RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &attribMap)
Jamie Madill53ea9cc2016-05-17 10:12:52 -040087 : mMaxSupportedESVersion(0, 0),
Geoff Lang94463d52015-02-18 13:09:37 -050088 mFunctions(functions),
Jamie Madill39fcf262015-06-08 14:39:07 -040089 mStateManager(nullptr),
Geoff Lang53b8aec2015-08-24 10:33:25 -040090 mBlitter(nullptr),
Geoff Langf0aa8422015-09-29 15:08:34 -040091 mHasDebugOutput(false),
Jamie Madill53ea9cc2016-05-17 10:12:52 -040092 mSkipDrawCalls(false),
93 mCapsInitialized(false)
Geoff Lang56cf9af2015-02-17 10:16:49 -050094{
95 ASSERT(mFunctions);
Jamie Madill53ea9cc2016-05-17 10:12:52 -040096 mStateManager = new StateManagerGL(mFunctions, getNativeCaps());
Geoff Langcab7e1d2015-07-27 11:20:41 -040097 nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
Geoff Lang53b8aec2015-08-24 10:33:25 -040098 mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
Geoff Langb80360f2015-05-04 15:01:31 -040099
Geoff Langf0aa8422015-09-29 15:08:34 -0400100 mHasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
101 mFunctions->hasGLExtension("GL_KHR_debug") ||
102 mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
103 mFunctions->hasGLESExtension("GL_KHR_debug");
Geoff Langb80360f2015-05-04 15:01:31 -0400104#ifndef NDEBUG
Geoff Langf0aa8422015-09-29 15:08:34 -0400105 if (mHasDebugOutput)
Geoff Langb80360f2015-05-04 15:01:31 -0400106 {
107 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
108 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
109 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
110 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
111 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
112 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
113 }
114#endif
Jamie Madill39fcf262015-06-08 14:39:07 -0400115
Ian Ewellec2c0c52016-04-05 13:46:26 -0400116 EGLint deviceType =
117 static_cast<EGLint>(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
Jamie Madill39fcf262015-06-08 14:39:07 -0400118 if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
119 {
120 mSkipDrawCalls = true;
121 }
Geoff Lang56cf9af2015-02-17 10:16:49 -0500122}
Geoff Langf9a6f082015-01-22 13:32:49 -0500123
124RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500125{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400126 SafeDelete(mBlitter);
Geoff Langbf8a72f2015-11-03 16:34:45 -0500127 SafeDelete(mStateManager);
Geoff Lang94463d52015-02-18 13:09:37 -0500128}
Geoff Langf9a6f082015-01-22 13:32:49 -0500129
130gl::Error RendererGL::flush()
131{
Geoff Lang2c919142015-04-01 14:44:13 -0400132 mFunctions->flush();
133 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500134}
135
136gl::Error RendererGL::finish()
137{
Geoff Langf0aa8422015-09-29 15:08:34 -0400138#ifdef NDEBUG
139 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
140 {
141 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
142 }
143#endif
144
Geoff Lang2c919142015-04-01 14:44:13 -0400145 mFunctions->finish();
Geoff Langf0aa8422015-09-29 15:08:34 -0400146
147#ifdef NDEBUG
148 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
149 {
150 mFunctions->disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
151 }
152#endif
153
Geoff Lang2c919142015-04-01 14:44:13 -0400154 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -0500155}
156
Jamie Madill9082b982016-04-27 15:21:51 -0400157gl::Error RendererGL::drawArrays(const gl::ContextState &data,
158 GLenum mode,
159 GLint first,
160 GLsizei count)
Geoff Langf9a6f082015-01-22 13:32:49 -0500161{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400162 ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, 0));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400163
Jamie Madill39fcf262015-06-08 14:39:07 -0400164 if (!mSkipDrawCalls)
165 {
166 mFunctions->drawArrays(mode, first, count);
167 }
Geoff Langd6e50872015-02-24 12:42:26 -0500168
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400169 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500170}
171
Jamie Madill9082b982016-04-27 15:21:51 -0400172gl::Error RendererGL::drawArraysInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400173 GLenum mode,
174 GLint first,
175 GLsizei count,
176 GLsizei instanceCount)
177{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400178 ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, instanceCount));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400179
180 if (!mSkipDrawCalls)
181 {
182 mFunctions->drawArraysInstanced(mode, first, count, instanceCount);
183 }
184
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400185 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400186}
187
Jamie Madill9082b982016-04-27 15:21:51 -0400188gl::Error RendererGL::drawElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400189 GLenum mode,
190 GLsizei count,
191 GLenum type,
192 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400193 const gl::IndexRange &indexRange)
Geoff Langf9a6f082015-01-22 13:32:49 -0500194{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400195 const GLvoid *drawIndexPtr = nullptr;
196 ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPtr));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400197
Jamie Madill39fcf262015-06-08 14:39:07 -0400198 if (!mSkipDrawCalls)
199 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400200 mFunctions->drawElements(mode, count, type, drawIndexPtr);
Jamie Madill39fcf262015-06-08 14:39:07 -0400201 }
Geoff Langd6e50872015-02-24 12:42:26 -0500202
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400203 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500204}
205
Jamie Madill9082b982016-04-27 15:21:51 -0400206gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400207 GLenum mode,
208 GLsizei count,
209 GLenum type,
210 const GLvoid *indices,
211 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -0400212 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400213{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400214 const GLvoid *drawIndexPointer = nullptr;
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400215 ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, instances,
216 &drawIndexPointer));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400217
218 if (!mSkipDrawCalls)
219 {
220 mFunctions->drawElementsInstanced(mode, count, type, drawIndexPointer, instances);
221 }
222
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400223 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400224}
225
Jamie Madill9082b982016-04-27 15:21:51 -0400226gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400227 GLenum mode,
228 GLuint start,
229 GLuint end,
230 GLsizei count,
231 GLenum type,
232 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400233 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400234{
Geoff Lang47502232015-08-25 16:26:10 -0400235 const GLvoid *drawIndexPointer = nullptr;
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400236 ANGLE_TRY(
237 mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer));
Geoff Lang47502232015-08-25 16:26:10 -0400238
239 if (!mSkipDrawCalls)
240 {
241 mFunctions->drawRangeElements(mode, start, end, count, type, drawIndexPointer);
242 }
243
Geoff Langf6db0982015-08-25 13:04:00 -0400244 return gl::Error(GL_NO_ERROR);
245}
246
Sami Väisänene45e53b2016-05-25 10:36:04 +0300247void RendererGL::stencilFillPath(const gl::ContextState &state,
248 const gl::Path *path,
249 GLenum fillMode,
250 GLuint mask)
251{
252 const auto *pathObj = GetImplAs<PathGL>(path);
253
254 mFunctions->stencilFillPathNV(pathObj->getPathID(), fillMode, mask);
255
256 ASSERT(mFunctions->getError() == GL_NO_ERROR);
257}
258
259void RendererGL::stencilStrokePath(const gl::ContextState &state,
260 const gl::Path *path,
261 GLint reference,
262 GLuint mask)
263{
264 const auto *pathObj = GetImplAs<PathGL>(path);
265
266 mFunctions->stencilStrokePathNV(pathObj->getPathID(), reference, mask);
267
268 ASSERT(mFunctions->getError() == GL_NO_ERROR);
269}
270
271void RendererGL::coverFillPath(const gl::ContextState &state,
272 const gl::Path *path,
273 GLenum coverMode)
274{
275
276 const auto *pathObj = GetImplAs<PathGL>(path);
277 mFunctions->coverFillPathNV(pathObj->getPathID(), coverMode);
278
279 ASSERT(mFunctions->getError() == GL_NO_ERROR);
280}
281
282void RendererGL::coverStrokePath(const gl::ContextState &state,
283 const gl::Path *path,
284 GLenum coverMode)
285{
286 const auto *pathObj = GetImplAs<PathGL>(path);
287 mFunctions->coverStrokePathNV(pathObj->getPathID(), coverMode);
288
289 ASSERT(mFunctions->getError() == GL_NO_ERROR);
290}
291
292void RendererGL::stencilThenCoverFillPath(const gl::ContextState &state,
293 const gl::Path *path,
294 GLenum fillMode,
295 GLuint mask,
296 GLenum coverMode)
297{
298
299 const auto *pathObj = GetImplAs<PathGL>(path);
300 mFunctions->stencilThenCoverFillPathNV(pathObj->getPathID(), fillMode, mask, coverMode);
301
302 ASSERT(mFunctions->getError() == GL_NO_ERROR);
303}
304
305void RendererGL::stencilThenCoverStrokePath(const gl::ContextState &state,
306 const gl::Path *path,
307 GLint reference,
308 GLuint mask,
309 GLenum coverMode)
310{
311
312 const auto *pathObj = GetImplAs<PathGL>(path);
313 mFunctions->stencilThenCoverStrokePathNV(pathObj->getPathID(), reference, mask, coverMode);
314
315 ASSERT(mFunctions->getError() == GL_NO_ERROR);
316}
317
Jamie Madill8415b5f2016-04-26 13:41:39 -0400318ContextImpl *RendererGL::createContext(const gl::ContextState &state)
Jamie Madill437fa652016-05-03 15:13:24 -0400319{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320 return new ContextGL(state, this);
Geoff Lang0af0b812015-09-23 13:56:25 -0400321}
322
Geoff Langf6ade2e2015-09-29 11:21:43 -0400323void RendererGL::insertEventMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700324{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400325 mFunctions->debugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
326 GL_DEBUG_SEVERITY_NOTIFICATION, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700327}
328
Geoff Langf6ade2e2015-09-29 11:21:43 -0400329void RendererGL::pushGroupMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700330{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400331 mFunctions->pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700332}
333
334void RendererGL::popGroupMarker()
335{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400336 mFunctions->popDebugGroup();
Austin Kinross6ee1e782015-05-29 17:05:37 -0700337}
338
Geoff Langf9a6f082015-01-22 13:32:49 -0500339void RendererGL::notifyDeviceLost()
340{
341 UNIMPLEMENTED();
342}
343
344bool RendererGL::isDeviceLost() const
345{
346 UNIMPLEMENTED();
347 return bool();
348}
349
350bool RendererGL::testDeviceLost()
351{
352 UNIMPLEMENTED();
353 return bool();
354}
355
356bool RendererGL::testDeviceResettable()
357{
358 UNIMPLEMENTED();
359 return bool();
360}
361
Geoff Langf9a6f082015-01-22 13:32:49 -0500362std::string RendererGL::getVendorString() const
363{
Geoff Lange42753b2015-04-08 13:46:33 -0400364 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500365}
366
367std::string RendererGL::getRendererDescription() const
368{
Geoff Lange42753b2015-04-08 13:46:33 -0400369 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
370 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
371
Geoff Lange42753b2015-04-08 13:46:33 -0400372 std::ostringstream rendererString;
373 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Lang08dcfed2015-05-25 13:38:42 -0400374 if (mFunctions->standard == STANDARD_GL_ES)
Geoff Lange42753b2015-04-08 13:46:33 -0400375 {
376 rendererString << " ES";
377 }
Geoff Lang08dcfed2015-05-25 13:38:42 -0400378 rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
Geoff Lang8b0f0b32015-07-20 15:59:28 -0400379 if (mFunctions->standard == STANDARD_GL_DESKTOP)
380 {
381 // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
382 if ((mFunctions->profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
383 (mFunctions->isAtLeastGL(gl::Version(3, 2)) && mFunctions->profile == 0))
384 {
385 rendererString << " compatibility";
386 }
387 else if ((mFunctions->profile & GL_CONTEXT_CORE_PROFILE_BIT) != 0)
388 {
389 rendererString << " core";
390 }
391 }
Geoff Lange42753b2015-04-08 13:46:33 -0400392
393 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500394}
395
Geoff Lang862c0ba2015-05-25 15:31:16 -0400396const gl::Version &RendererGL::getMaxSupportedESVersion() const
397{
398 // Force generation of caps
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400399 getNativeCaps();
Geoff Lang862c0ba2015-05-25 15:31:16 -0400400
401 return mMaxSupportedESVersion;
402}
403
Austin Kinross02df7962015-07-01 10:03:42 -0700404void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
405 gl::Extensions *outExtensions,
406 gl::Limitations * /* outLimitations */) const
Geoff Langf9a6f082015-01-22 13:32:49 -0500407{
Geoff Lang862c0ba2015-05-25 15:31:16 -0400408 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions, &mMaxSupportedESVersion);
Geoff Langf9a6f082015-01-22 13:32:49 -0500409}
410
Ian Ewell53f59f42016-01-28 17:36:55 -0500411GLint RendererGL::getGPUDisjoint()
412{
413 // TODO(ewell): On GLES backends we should find a way to reliably query disjoint events
414 return 0;
415}
416
417GLint64 RendererGL::getTimestamp()
418{
419 GLint64 result = 0;
420 mFunctions->getInteger64v(GL_TIMESTAMP, &result);
421 return result;
422}
Ian Ewell292f0052016-02-04 10:37:32 -0500423
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400424void RendererGL::ensureCapsInitialized() const
Ian Ewell292f0052016-02-04 10:37:32 -0500425{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400426 if (!mCapsInitialized)
427 {
428 generateCaps(&mNativeCaps, &mNativeTextureCaps, &mNativeExtensions, &mNativeLimitations);
429 mCapsInitialized = true;
430 }
Ian Ewell292f0052016-02-04 10:37:32 -0500431}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400432
433const gl::Caps &RendererGL::getNativeCaps() const
434{
435 ensureCapsInitialized();
436 return mNativeCaps;
Geoff Langf9a6f082015-01-22 13:32:49 -0500437}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400438
439const gl::TextureCapsMap &RendererGL::getNativeTextureCaps() const
440{
441 ensureCapsInitialized();
442 return mNativeTextureCaps;
443}
444
445const gl::Extensions &RendererGL::getNativeExtensions() const
446{
447 ensureCapsInitialized();
448 return mNativeExtensions;
449}
450
451const gl::Limitations &RendererGL::getNativeLimitations() const
452{
453 ensureCapsInitialized();
454 return mNativeLimitations;
455}
456
457} // namespace rx