blob: 7865ee2b5a4cef74c8f515337d7f4e2dca0c440b [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
Sami Väisänend59ca052016-06-21 16:10:00 +030039namespace
40{
41
42std::vector<GLuint> GatherPaths(const std::vector<gl::Path *> &paths)
43{
44 std::vector<GLuint> ret;
45 ret.reserve(paths.size());
46
47 for (const auto *p : paths)
48 {
49 const auto *pathObj = rx::GetImplAs<rx::PathGL>(p);
50 ret.push_back(pathObj->getPathID());
51 }
52 return ret;
53}
54
55} // namespace
56
Geoff Langb80360f2015-05-04 15:01:31 -040057#ifndef NDEBUG
58static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
59 const GLchar *message, const void *userParam)
60{
61 std::string sourceText;
62 switch (source)
63 {
64 case GL_DEBUG_SOURCE_API: sourceText = "OpenGL"; break;
65 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: sourceText = "Windows"; break;
66 case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceText = "Shader Compiler"; break;
67 case GL_DEBUG_SOURCE_THIRD_PARTY: sourceText = "Third Party"; break;
68 case GL_DEBUG_SOURCE_APPLICATION: sourceText = "Application"; break;
69 case GL_DEBUG_SOURCE_OTHER: sourceText = "Other"; break;
70 default: sourceText = "UNKNOWN"; break;
71 }
72
73 std::string typeText;
74 switch (type)
75 {
76 case GL_DEBUG_TYPE_ERROR: typeText = "Error"; break;
77 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeText = "Deprecated behavior"; break;
78 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeText = "Undefined behavior"; break;
79 case GL_DEBUG_TYPE_PORTABILITY: typeText = "Portability"; break;
80 case GL_DEBUG_TYPE_PERFORMANCE: typeText = "Performance"; break;
81 case GL_DEBUG_TYPE_OTHER: typeText = "Other"; break;
82 case GL_DEBUG_TYPE_MARKER: typeText = "Marker"; break;
83 default: typeText = "UNKNOWN"; break;
84 }
85
86 std::string severityText;
87 switch (severity)
88 {
89 case GL_DEBUG_SEVERITY_HIGH: severityText = "High"; break;
90 case GL_DEBUG_SEVERITY_MEDIUM: severityText = "Medium"; break;
91 case GL_DEBUG_SEVERITY_LOW: severityText = "Low"; break;
92 case GL_DEBUG_SEVERITY_NOTIFICATION: severityText = "Notification"; break;
93 default: severityText = "UNKNOWN"; break;
94 }
95
96 ERR("\n\tSource: %s\n\tType: %s\n\tID: %d\n\tSeverity: %s\n\tMessage: %s", sourceText.c_str(), typeText.c_str(), id,
97 severityText.c_str(), message);
98}
99#endif
100
Geoff Langf9a6f082015-01-22 13:32:49 -0500101namespace rx
102{
103
Jamie Madill39fcf262015-06-08 14:39:07 -0400104RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &attribMap)
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400105 : mMaxSupportedESVersion(0, 0),
Geoff Lang94463d52015-02-18 13:09:37 -0500106 mFunctions(functions),
Jamie Madill39fcf262015-06-08 14:39:07 -0400107 mStateManager(nullptr),
Geoff Lang53b8aec2015-08-24 10:33:25 -0400108 mBlitter(nullptr),
Geoff Langf0aa8422015-09-29 15:08:34 -0400109 mHasDebugOutput(false),
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400110 mSkipDrawCalls(false),
111 mCapsInitialized(false)
Geoff Lang56cf9af2015-02-17 10:16:49 -0500112{
113 ASSERT(mFunctions);
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400114 mStateManager = new StateManagerGL(mFunctions, getNativeCaps());
Geoff Langcab7e1d2015-07-27 11:20:41 -0400115 nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
Geoff Lang53b8aec2015-08-24 10:33:25 -0400116 mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
Geoff Langb80360f2015-05-04 15:01:31 -0400117
Geoff Langf0aa8422015-09-29 15:08:34 -0400118 mHasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
119 mFunctions->hasGLExtension("GL_KHR_debug") ||
120 mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
121 mFunctions->hasGLESExtension("GL_KHR_debug");
Geoff Langb80360f2015-05-04 15:01:31 -0400122#ifndef NDEBUG
Geoff Langf0aa8422015-09-29 15:08:34 -0400123 if (mHasDebugOutput)
Geoff Langb80360f2015-05-04 15:01:31 -0400124 {
Corentin Wallez930fefc2016-09-14 15:54:18 -0400125 mFunctions->enable(GL_DEBUG_OUTPUT);
Geoff Langb80360f2015-05-04 15:01:31 -0400126 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
127 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
128 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
129 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
130 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
131 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
132 }
133#endif
Jamie Madill39fcf262015-06-08 14:39:07 -0400134
Ian Ewellec2c0c52016-04-05 13:46:26 -0400135 EGLint deviceType =
136 static_cast<EGLint>(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
Jamie Madill39fcf262015-06-08 14:39:07 -0400137 if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
138 {
139 mSkipDrawCalls = true;
140 }
Corentin Wallez83144652016-08-31 17:03:30 -0400141
142 if (mWorkarounds.initializeCurrentVertexAttributes)
143 {
144 GLint maxVertexAttribs = 0;
145 mFunctions->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
146
147 for (GLint i = 0; i < maxVertexAttribs; ++i)
148 {
149 mFunctions->vertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 1.0f);
150 }
151 }
Geoff Lang56cf9af2015-02-17 10:16:49 -0500152}
Geoff Langf9a6f082015-01-22 13:32:49 -0500153
154RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500155{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400156 SafeDelete(mBlitter);
Geoff Langbf8a72f2015-11-03 16:34:45 -0500157 SafeDelete(mStateManager);
Geoff Lang94463d52015-02-18 13:09:37 -0500158}
Geoff Langf9a6f082015-01-22 13:32:49 -0500159
160gl::Error RendererGL::flush()
161{
Geoff Lang2c919142015-04-01 14:44:13 -0400162 mFunctions->flush();
He Yunchaoacd18982017-01-04 10:46:42 +0800163 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500164}
165
166gl::Error RendererGL::finish()
167{
Geoff Langf0aa8422015-09-29 15:08:34 -0400168#ifdef NDEBUG
169 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
170 {
171 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
172 }
173#endif
174
Geoff Lang2c919142015-04-01 14:44:13 -0400175 mFunctions->finish();
Geoff Langf0aa8422015-09-29 15:08:34 -0400176
177#ifdef NDEBUG
178 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
179 {
180 mFunctions->disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
181 }
182#endif
183
He Yunchaoacd18982017-01-04 10:46:42 +0800184 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500185}
186
Jamie Madill9082b982016-04-27 15:21:51 -0400187gl::Error RendererGL::drawArrays(const gl::ContextState &data,
188 GLenum mode,
189 GLint first,
190 GLsizei count)
Geoff Langf9a6f082015-01-22 13:32:49 -0500191{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400192 ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, 0));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400193
Jamie Madill39fcf262015-06-08 14:39:07 -0400194 if (!mSkipDrawCalls)
195 {
196 mFunctions->drawArrays(mode, first, count);
197 }
Geoff Langd6e50872015-02-24 12:42:26 -0500198
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400199 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500200}
201
Jamie Madill9082b982016-04-27 15:21:51 -0400202gl::Error RendererGL::drawArraysInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400203 GLenum mode,
204 GLint first,
205 GLsizei count,
206 GLsizei instanceCount)
207{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400208 ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, instanceCount));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400209
210 if (!mSkipDrawCalls)
211 {
212 mFunctions->drawArraysInstanced(mode, first, count, instanceCount);
213 }
214
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400215 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400216}
217
Jamie Madill9082b982016-04-27 15:21:51 -0400218gl::Error RendererGL::drawElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400219 GLenum mode,
220 GLsizei count,
221 GLenum type,
222 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400223 const gl::IndexRange &indexRange)
Geoff Langf9a6f082015-01-22 13:32:49 -0500224{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400225 const GLvoid *drawIndexPtr = nullptr;
226 ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPtr));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400227
Jamie Madill39fcf262015-06-08 14:39:07 -0400228 if (!mSkipDrawCalls)
229 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400230 mFunctions->drawElements(mode, count, type, drawIndexPtr);
Jamie Madill39fcf262015-06-08 14:39:07 -0400231 }
Geoff Langd6e50872015-02-24 12:42:26 -0500232
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400233 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500234}
235
Jamie Madill9082b982016-04-27 15:21:51 -0400236gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400237 GLenum mode,
238 GLsizei count,
239 GLenum type,
240 const GLvoid *indices,
241 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -0400242 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400243{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400244 const GLvoid *drawIndexPointer = nullptr;
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400245 ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, instances,
246 &drawIndexPointer));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400247
248 if (!mSkipDrawCalls)
249 {
250 mFunctions->drawElementsInstanced(mode, count, type, drawIndexPointer, instances);
251 }
252
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400253 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400254}
255
Jamie Madill9082b982016-04-27 15:21:51 -0400256gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400257 GLenum mode,
258 GLuint start,
259 GLuint end,
260 GLsizei count,
261 GLenum type,
262 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400263 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400264{
Geoff Lang47502232015-08-25 16:26:10 -0400265 const GLvoid *drawIndexPointer = nullptr;
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400266 ANGLE_TRY(
267 mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer));
Geoff Lang47502232015-08-25 16:26:10 -0400268
269 if (!mSkipDrawCalls)
270 {
271 mFunctions->drawRangeElements(mode, start, end, count, type, drawIndexPointer);
272 }
273
He Yunchaoacd18982017-01-04 10:46:42 +0800274 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400275}
276
Jiajia Qind9671222016-11-29 16:30:31 +0800277gl::Error RendererGL::drawArraysIndirect(const gl::ContextState &data,
278 GLenum mode,
279 const GLvoid *indirect)
280{
281 ANGLE_TRY(mStateManager->setDrawIndirectState(data, GL_NONE));
282
283 if (!mSkipDrawCalls)
284 {
285 mFunctions->drawArraysIndirect(mode, indirect);
286 }
287 return gl::NoError();
288}
289
290gl::Error RendererGL::drawElementsIndirect(const gl::ContextState &data,
291 GLenum mode,
292 GLenum type,
293 const GLvoid *indirect)
294{
295 ANGLE_TRY(mStateManager->setDrawIndirectState(data, type));
296
297 if (!mSkipDrawCalls)
298 {
299 mFunctions->drawElementsIndirect(mode, type, indirect);
300 }
301 return gl::NoError();
302}
303
Sami Väisänene45e53b2016-05-25 10:36:04 +0300304void RendererGL::stencilFillPath(const gl::ContextState &state,
305 const gl::Path *path,
306 GLenum fillMode,
307 GLuint mask)
308{
309 const auto *pathObj = GetImplAs<PathGL>(path);
310
311 mFunctions->stencilFillPathNV(pathObj->getPathID(), fillMode, mask);
312
313 ASSERT(mFunctions->getError() == GL_NO_ERROR);
314}
315
316void RendererGL::stencilStrokePath(const gl::ContextState &state,
317 const gl::Path *path,
318 GLint reference,
319 GLuint mask)
320{
321 const auto *pathObj = GetImplAs<PathGL>(path);
322
323 mFunctions->stencilStrokePathNV(pathObj->getPathID(), reference, mask);
324
325 ASSERT(mFunctions->getError() == GL_NO_ERROR);
326}
327
328void RendererGL::coverFillPath(const gl::ContextState &state,
329 const gl::Path *path,
330 GLenum coverMode)
331{
332
333 const auto *pathObj = GetImplAs<PathGL>(path);
334 mFunctions->coverFillPathNV(pathObj->getPathID(), coverMode);
335
336 ASSERT(mFunctions->getError() == GL_NO_ERROR);
337}
338
339void RendererGL::coverStrokePath(const gl::ContextState &state,
340 const gl::Path *path,
341 GLenum coverMode)
342{
343 const auto *pathObj = GetImplAs<PathGL>(path);
344 mFunctions->coverStrokePathNV(pathObj->getPathID(), coverMode);
345
346 ASSERT(mFunctions->getError() == GL_NO_ERROR);
347}
348
349void RendererGL::stencilThenCoverFillPath(const gl::ContextState &state,
350 const gl::Path *path,
351 GLenum fillMode,
352 GLuint mask,
353 GLenum coverMode)
354{
355
356 const auto *pathObj = GetImplAs<PathGL>(path);
357 mFunctions->stencilThenCoverFillPathNV(pathObj->getPathID(), fillMode, mask, coverMode);
358
359 ASSERT(mFunctions->getError() == GL_NO_ERROR);
360}
361
362void RendererGL::stencilThenCoverStrokePath(const gl::ContextState &state,
363 const gl::Path *path,
364 GLint reference,
365 GLuint mask,
366 GLenum coverMode)
367{
368
369 const auto *pathObj = GetImplAs<PathGL>(path);
370 mFunctions->stencilThenCoverStrokePathNV(pathObj->getPathID(), reference, mask, coverMode);
371
372 ASSERT(mFunctions->getError() == GL_NO_ERROR);
373}
374
Sami Väisänend59ca052016-06-21 16:10:00 +0300375void RendererGL::coverFillPathInstanced(const gl::ContextState &state,
376 const std::vector<gl::Path *> &paths,
377 GLenum coverMode,
378 GLenum transformType,
379 const GLfloat *transformValues)
380{
381 const auto &pathObjs = GatherPaths(paths);
382
383 mFunctions->coverFillPathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
384 &pathObjs[0], 0, coverMode, transformType,
385 transformValues);
386
387 ASSERT(mFunctions->getError() == GL_NO_ERROR);
388}
389void RendererGL::coverStrokePathInstanced(const gl::ContextState &state,
390 const std::vector<gl::Path *> &paths,
391 GLenum coverMode,
392 GLenum transformType,
393 const GLfloat *transformValues)
394{
395 const auto &pathObjs = GatherPaths(paths);
396
397 mFunctions->coverStrokePathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
398 &pathObjs[0], 0, coverMode, transformType,
399 transformValues);
400
401 ASSERT(mFunctions->getError() == GL_NO_ERROR);
402}
403void RendererGL::stencilFillPathInstanced(const gl::ContextState &state,
404 const std::vector<gl::Path *> &paths,
405 GLenum fillMode,
406 GLuint mask,
407 GLenum transformType,
408 const GLfloat *transformValues)
409{
410 const auto &pathObjs = GatherPaths(paths);
411
412 mFunctions->stencilFillPathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
413 &pathObjs[0], 0, fillMode, mask, transformType,
414 transformValues);
415
416 ASSERT(mFunctions->getError() == GL_NO_ERROR);
417}
418void RendererGL::stencilStrokePathInstanced(const gl::ContextState &state,
419 const std::vector<gl::Path *> &paths,
420 GLint reference,
421 GLuint mask,
422 GLenum transformType,
423 const GLfloat *transformValues)
424{
425 const auto &pathObjs = GatherPaths(paths);
426
427 mFunctions->stencilStrokePathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
428 &pathObjs[0], 0, reference, mask, transformType,
429 transformValues);
430
431 ASSERT(mFunctions->getError() == GL_NO_ERROR);
432}
433
434void RendererGL::stencilThenCoverFillPathInstanced(const gl::ContextState &state,
435 const std::vector<gl::Path *> &paths,
436 GLenum coverMode,
437 GLenum fillMode,
438 GLuint mask,
439 GLenum transformType,
440 const GLfloat *transformValues)
441{
442 const auto &pathObjs = GatherPaths(paths);
443
444 mFunctions->stencilThenCoverFillPathInstancedNV(
445 static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT, &pathObjs[0], 0, fillMode, mask,
446 coverMode, transformType, transformValues);
447
448 ASSERT(mFunctions->getError() == GL_NO_ERROR);
449}
450void RendererGL::stencilThenCoverStrokePathInstanced(const gl::ContextState &state,
451 const std::vector<gl::Path *> &paths,
452 GLenum coverMode,
453 GLint reference,
454 GLuint mask,
455 GLenum transformType,
456 const GLfloat *transformValues)
457{
458 const auto &pathObjs = GatherPaths(paths);
459
460 mFunctions->stencilThenCoverStrokePathInstancedNV(
461 static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT, &pathObjs[0], 0, reference, mask,
462 coverMode, transformType, transformValues);
463
464 ASSERT(mFunctions->getError() == GL_NO_ERROR);
465}
466
Corentin Wallezb920e362016-08-03 18:19:41 -0400467GLenum RendererGL::getResetStatus()
468{
469 return mFunctions->getGraphicsResetStatus();
470}
471
Jamie Madill8415b5f2016-04-26 13:41:39 -0400472ContextImpl *RendererGL::createContext(const gl::ContextState &state)
Jamie Madill437fa652016-05-03 15:13:24 -0400473{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400474 return new ContextGL(state, this);
Geoff Lang0af0b812015-09-23 13:56:25 -0400475}
476
Geoff Langf6ade2e2015-09-29 11:21:43 -0400477void RendererGL::insertEventMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700478{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400479 mFunctions->debugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
480 GL_DEBUG_SEVERITY_NOTIFICATION, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700481}
482
Geoff Langf6ade2e2015-09-29 11:21:43 -0400483void RendererGL::pushGroupMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700484{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400485 mFunctions->pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700486}
487
488void RendererGL::popGroupMarker()
489{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400490 mFunctions->popDebugGroup();
Austin Kinross6ee1e782015-05-29 17:05:37 -0700491}
492
Geoff Langf9a6f082015-01-22 13:32:49 -0500493std::string RendererGL::getVendorString() const
494{
Geoff Lange42753b2015-04-08 13:46:33 -0400495 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500496}
497
498std::string RendererGL::getRendererDescription() const
499{
Geoff Lange42753b2015-04-08 13:46:33 -0400500 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
501 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
502
Geoff Lange42753b2015-04-08 13:46:33 -0400503 std::ostringstream rendererString;
504 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Lang08dcfed2015-05-25 13:38:42 -0400505 if (mFunctions->standard == STANDARD_GL_ES)
Geoff Lange42753b2015-04-08 13:46:33 -0400506 {
507 rendererString << " ES";
508 }
Geoff Lang08dcfed2015-05-25 13:38:42 -0400509 rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
Geoff Lang8b0f0b32015-07-20 15:59:28 -0400510 if (mFunctions->standard == STANDARD_GL_DESKTOP)
511 {
512 // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
513 if ((mFunctions->profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
514 (mFunctions->isAtLeastGL(gl::Version(3, 2)) && mFunctions->profile == 0))
515 {
516 rendererString << " compatibility";
517 }
518 else if ((mFunctions->profile & GL_CONTEXT_CORE_PROFILE_BIT) != 0)
519 {
520 rendererString << " core";
521 }
522 }
Geoff Lange42753b2015-04-08 13:46:33 -0400523
524 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500525}
526
Geoff Lang862c0ba2015-05-25 15:31:16 -0400527const gl::Version &RendererGL::getMaxSupportedESVersion() const
528{
529 // Force generation of caps
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400530 getNativeCaps();
Geoff Lang862c0ba2015-05-25 15:31:16 -0400531
532 return mMaxSupportedESVersion;
533}
534
Austin Kinross02df7962015-07-01 10:03:42 -0700535void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
536 gl::Extensions *outExtensions,
537 gl::Limitations * /* outLimitations */) const
Geoff Langf9a6f082015-01-22 13:32:49 -0500538{
Geoff Lang862c0ba2015-05-25 15:31:16 -0400539 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions, &mMaxSupportedESVersion);
Geoff Langf9a6f082015-01-22 13:32:49 -0500540}
541
Ian Ewell53f59f42016-01-28 17:36:55 -0500542GLint RendererGL::getGPUDisjoint()
543{
544 // TODO(ewell): On GLES backends we should find a way to reliably query disjoint events
545 return 0;
546}
547
548GLint64 RendererGL::getTimestamp()
549{
550 GLint64 result = 0;
551 mFunctions->getInteger64v(GL_TIMESTAMP, &result);
552 return result;
553}
Ian Ewell292f0052016-02-04 10:37:32 -0500554
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400555void RendererGL::ensureCapsInitialized() const
Ian Ewell292f0052016-02-04 10:37:32 -0500556{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400557 if (!mCapsInitialized)
558 {
559 generateCaps(&mNativeCaps, &mNativeTextureCaps, &mNativeExtensions, &mNativeLimitations);
560 mCapsInitialized = true;
561 }
Ian Ewell292f0052016-02-04 10:37:32 -0500562}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400563
564const gl::Caps &RendererGL::getNativeCaps() const
565{
566 ensureCapsInitialized();
567 return mNativeCaps;
Geoff Langf9a6f082015-01-22 13:32:49 -0500568}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400569
570const gl::TextureCapsMap &RendererGL::getNativeTextureCaps() const
571{
572 ensureCapsInitialized();
573 return mNativeTextureCaps;
574}
575
576const gl::Extensions &RendererGL::getNativeExtensions() const
577{
578 ensureCapsInitialized();
579 return mNativeExtensions;
580}
581
582const gl::Limitations &RendererGL::getNativeLimitations() const
583{
584 ensureCapsInitialized();
585 return mNativeLimitations;
586}
587
588} // namespace rx