blob: b367968829dc5f395bfe94bbd3eea8c0c06dcb5f [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
Yuly Novikovbcb3f9b2017-01-27 22:45:18 -050096 if (type == GL_DEBUG_TYPE_ERROR)
97 {
98 ERR() << std::endl
99 << "\tSource: " << sourceText << std::endl
100 << "\tType: " << typeText << std::endl
101 << "\tID: " << gl::Error(id) << std::endl
102 << "\tSeverity: " << severityText << std::endl
103 << "\tMessage: " << message;
104 }
105 else
106 {
107 // TODO(ynovikov): filter into WARN and INFO if INFO is ever implemented
108 WARN() << std::endl
109 << "\tSource: " << sourceText << std::endl
110 << "\tType: " << typeText << std::endl
111 << "\tID: " << gl::Error(id) << std::endl
112 << "\tSeverity: " << severityText << std::endl
113 << "\tMessage: " << message;
114 }
Geoff Langb80360f2015-05-04 15:01:31 -0400115}
116#endif
117
Geoff Langf9a6f082015-01-22 13:32:49 -0500118namespace rx
119{
120
Jamie Madill39fcf262015-06-08 14:39:07 -0400121RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &attribMap)
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400122 : mMaxSupportedESVersion(0, 0),
Geoff Lang94463d52015-02-18 13:09:37 -0500123 mFunctions(functions),
Jamie Madill39fcf262015-06-08 14:39:07 -0400124 mStateManager(nullptr),
Geoff Lang53b8aec2015-08-24 10:33:25 -0400125 mBlitter(nullptr),
Geoff Langf0aa8422015-09-29 15:08:34 -0400126 mHasDebugOutput(false),
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400127 mSkipDrawCalls(false),
128 mCapsInitialized(false)
Geoff Lang56cf9af2015-02-17 10:16:49 -0500129{
130 ASSERT(mFunctions);
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400131 mStateManager = new StateManagerGL(mFunctions, getNativeCaps());
Geoff Langcab7e1d2015-07-27 11:20:41 -0400132 nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
Geoff Lang53b8aec2015-08-24 10:33:25 -0400133 mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
Geoff Langb80360f2015-05-04 15:01:31 -0400134
Geoff Langf0aa8422015-09-29 15:08:34 -0400135 mHasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
136 mFunctions->hasGLExtension("GL_KHR_debug") ||
137 mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
138 mFunctions->hasGLESExtension("GL_KHR_debug");
Geoff Langb80360f2015-05-04 15:01:31 -0400139#ifndef NDEBUG
Geoff Langf0aa8422015-09-29 15:08:34 -0400140 if (mHasDebugOutput)
Geoff Langb80360f2015-05-04 15:01:31 -0400141 {
Corentin Wallez930fefc2016-09-14 15:54:18 -0400142 mFunctions->enable(GL_DEBUG_OUTPUT);
Geoff Langb80360f2015-05-04 15:01:31 -0400143 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
144 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
145 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
146 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
147 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
148 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
149 }
150#endif
Jamie Madill39fcf262015-06-08 14:39:07 -0400151
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 EGLint deviceType =
153 static_cast<EGLint>(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
Jamie Madill39fcf262015-06-08 14:39:07 -0400154 if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
155 {
156 mSkipDrawCalls = true;
157 }
Corentin Wallez83144652016-08-31 17:03:30 -0400158
159 if (mWorkarounds.initializeCurrentVertexAttributes)
160 {
161 GLint maxVertexAttribs = 0;
162 mFunctions->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
163
164 for (GLint i = 0; i < maxVertexAttribs; ++i)
165 {
166 mFunctions->vertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 1.0f);
167 }
168 }
Geoff Lang56cf9af2015-02-17 10:16:49 -0500169}
Geoff Langf9a6f082015-01-22 13:32:49 -0500170
171RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500172{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400173 SafeDelete(mBlitter);
Geoff Langbf8a72f2015-11-03 16:34:45 -0500174 SafeDelete(mStateManager);
Geoff Lang94463d52015-02-18 13:09:37 -0500175}
Geoff Langf9a6f082015-01-22 13:32:49 -0500176
177gl::Error RendererGL::flush()
178{
Geoff Lang2c919142015-04-01 14:44:13 -0400179 mFunctions->flush();
He Yunchaoacd18982017-01-04 10:46:42 +0800180 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500181}
182
183gl::Error RendererGL::finish()
184{
Geoff Langf0aa8422015-09-29 15:08:34 -0400185#ifdef NDEBUG
186 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
187 {
188 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
189 }
190#endif
191
Geoff Lang2c919142015-04-01 14:44:13 -0400192 mFunctions->finish();
Geoff Langf0aa8422015-09-29 15:08:34 -0400193
194#ifdef NDEBUG
195 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mHasDebugOutput)
196 {
197 mFunctions->disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
198 }
199#endif
200
He Yunchaoacd18982017-01-04 10:46:42 +0800201 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500202}
203
Jamie Madill9082b982016-04-27 15:21:51 -0400204gl::Error RendererGL::drawArrays(const gl::ContextState &data,
205 GLenum mode,
206 GLint first,
207 GLsizei count)
Geoff Langf9a6f082015-01-22 13:32:49 -0500208{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400209 ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, 0));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400210
Jamie Madill39fcf262015-06-08 14:39:07 -0400211 if (!mSkipDrawCalls)
212 {
213 mFunctions->drawArrays(mode, first, count);
214 }
Geoff Langd6e50872015-02-24 12:42:26 -0500215
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400216 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500217}
218
Jamie Madill9082b982016-04-27 15:21:51 -0400219gl::Error RendererGL::drawArraysInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400220 GLenum mode,
221 GLint first,
222 GLsizei count,
223 GLsizei instanceCount)
224{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400225 ANGLE_TRY(mStateManager->setDrawArraysState(data, first, count, instanceCount));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400226
227 if (!mSkipDrawCalls)
228 {
229 mFunctions->drawArraysInstanced(mode, first, count, instanceCount);
230 }
231
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400232 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400233}
234
Jamie Madill9082b982016-04-27 15:21:51 -0400235gl::Error RendererGL::drawElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400236 GLenum mode,
237 GLsizei count,
238 GLenum type,
239 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400240 const gl::IndexRange &indexRange)
Geoff Langf9a6f082015-01-22 13:32:49 -0500241{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400242 const GLvoid *drawIndexPtr = nullptr;
243 ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPtr));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400244
Jamie Madill39fcf262015-06-08 14:39:07 -0400245 if (!mSkipDrawCalls)
246 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400247 mFunctions->drawElements(mode, count, type, drawIndexPtr);
Jamie Madill39fcf262015-06-08 14:39:07 -0400248 }
Geoff Langd6e50872015-02-24 12:42:26 -0500249
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400250 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500251}
252
Jamie Madill9082b982016-04-27 15:21:51 -0400253gl::Error RendererGL::drawElementsInstanced(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400254 GLenum mode,
255 GLsizei count,
256 GLenum type,
257 const GLvoid *indices,
258 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -0400259 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400260{
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400261 const GLvoid *drawIndexPointer = nullptr;
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400262 ANGLE_TRY(mStateManager->setDrawElementsState(data, count, type, indices, instances,
263 &drawIndexPointer));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400264
265 if (!mSkipDrawCalls)
266 {
267 mFunctions->drawElementsInstanced(mode, count, type, drawIndexPointer, instances);
268 }
269
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400270 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400271}
272
Jamie Madill9082b982016-04-27 15:21:51 -0400273gl::Error RendererGL::drawRangeElements(const gl::ContextState &data,
Geoff Langf6db0982015-08-25 13:04:00 -0400274 GLenum mode,
275 GLuint start,
276 GLuint end,
277 GLsizei count,
278 GLenum type,
279 const GLvoid *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400280 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400281{
Geoff Lang47502232015-08-25 16:26:10 -0400282 const GLvoid *drawIndexPointer = nullptr;
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400283 ANGLE_TRY(
284 mStateManager->setDrawElementsState(data, count, type, indices, 0, &drawIndexPointer));
Geoff Lang47502232015-08-25 16:26:10 -0400285
286 if (!mSkipDrawCalls)
287 {
288 mFunctions->drawRangeElements(mode, start, end, count, type, drawIndexPointer);
289 }
290
He Yunchaoacd18982017-01-04 10:46:42 +0800291 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400292}
293
Jiajia Qind9671222016-11-29 16:30:31 +0800294gl::Error RendererGL::drawArraysIndirect(const gl::ContextState &data,
295 GLenum mode,
296 const GLvoid *indirect)
297{
298 ANGLE_TRY(mStateManager->setDrawIndirectState(data, GL_NONE));
299
300 if (!mSkipDrawCalls)
301 {
302 mFunctions->drawArraysIndirect(mode, indirect);
303 }
304 return gl::NoError();
305}
306
307gl::Error RendererGL::drawElementsIndirect(const gl::ContextState &data,
308 GLenum mode,
309 GLenum type,
310 const GLvoid *indirect)
311{
312 ANGLE_TRY(mStateManager->setDrawIndirectState(data, type));
313
314 if (!mSkipDrawCalls)
315 {
316 mFunctions->drawElementsIndirect(mode, type, indirect);
317 }
318 return gl::NoError();
319}
320
Sami Väisänene45e53b2016-05-25 10:36:04 +0300321void RendererGL::stencilFillPath(const gl::ContextState &state,
322 const gl::Path *path,
323 GLenum fillMode,
324 GLuint mask)
325{
326 const auto *pathObj = GetImplAs<PathGL>(path);
327
328 mFunctions->stencilFillPathNV(pathObj->getPathID(), fillMode, mask);
329
330 ASSERT(mFunctions->getError() == GL_NO_ERROR);
331}
332
333void RendererGL::stencilStrokePath(const gl::ContextState &state,
334 const gl::Path *path,
335 GLint reference,
336 GLuint mask)
337{
338 const auto *pathObj = GetImplAs<PathGL>(path);
339
340 mFunctions->stencilStrokePathNV(pathObj->getPathID(), reference, mask);
341
342 ASSERT(mFunctions->getError() == GL_NO_ERROR);
343}
344
345void RendererGL::coverFillPath(const gl::ContextState &state,
346 const gl::Path *path,
347 GLenum coverMode)
348{
349
350 const auto *pathObj = GetImplAs<PathGL>(path);
351 mFunctions->coverFillPathNV(pathObj->getPathID(), coverMode);
352
353 ASSERT(mFunctions->getError() == GL_NO_ERROR);
354}
355
356void RendererGL::coverStrokePath(const gl::ContextState &state,
357 const gl::Path *path,
358 GLenum coverMode)
359{
360 const auto *pathObj = GetImplAs<PathGL>(path);
361 mFunctions->coverStrokePathNV(pathObj->getPathID(), coverMode);
362
363 ASSERT(mFunctions->getError() == GL_NO_ERROR);
364}
365
366void RendererGL::stencilThenCoverFillPath(const gl::ContextState &state,
367 const gl::Path *path,
368 GLenum fillMode,
369 GLuint mask,
370 GLenum coverMode)
371{
372
373 const auto *pathObj = GetImplAs<PathGL>(path);
374 mFunctions->stencilThenCoverFillPathNV(pathObj->getPathID(), fillMode, mask, coverMode);
375
376 ASSERT(mFunctions->getError() == GL_NO_ERROR);
377}
378
379void RendererGL::stencilThenCoverStrokePath(const gl::ContextState &state,
380 const gl::Path *path,
381 GLint reference,
382 GLuint mask,
383 GLenum coverMode)
384{
385
386 const auto *pathObj = GetImplAs<PathGL>(path);
387 mFunctions->stencilThenCoverStrokePathNV(pathObj->getPathID(), reference, mask, coverMode);
388
389 ASSERT(mFunctions->getError() == GL_NO_ERROR);
390}
391
Sami Väisänend59ca052016-06-21 16:10:00 +0300392void RendererGL::coverFillPathInstanced(const gl::ContextState &state,
393 const std::vector<gl::Path *> &paths,
394 GLenum coverMode,
395 GLenum transformType,
396 const GLfloat *transformValues)
397{
398 const auto &pathObjs = GatherPaths(paths);
399
400 mFunctions->coverFillPathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
401 &pathObjs[0], 0, coverMode, transformType,
402 transformValues);
403
404 ASSERT(mFunctions->getError() == GL_NO_ERROR);
405}
406void RendererGL::coverStrokePathInstanced(const gl::ContextState &state,
407 const std::vector<gl::Path *> &paths,
408 GLenum coverMode,
409 GLenum transformType,
410 const GLfloat *transformValues)
411{
412 const auto &pathObjs = GatherPaths(paths);
413
414 mFunctions->coverStrokePathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
415 &pathObjs[0], 0, coverMode, transformType,
416 transformValues);
417
418 ASSERT(mFunctions->getError() == GL_NO_ERROR);
419}
420void RendererGL::stencilFillPathInstanced(const gl::ContextState &state,
421 const std::vector<gl::Path *> &paths,
422 GLenum fillMode,
423 GLuint mask,
424 GLenum transformType,
425 const GLfloat *transformValues)
426{
427 const auto &pathObjs = GatherPaths(paths);
428
429 mFunctions->stencilFillPathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
430 &pathObjs[0], 0, fillMode, mask, transformType,
431 transformValues);
432
433 ASSERT(mFunctions->getError() == GL_NO_ERROR);
434}
435void RendererGL::stencilStrokePathInstanced(const gl::ContextState &state,
436 const std::vector<gl::Path *> &paths,
437 GLint reference,
438 GLuint mask,
439 GLenum transformType,
440 const GLfloat *transformValues)
441{
442 const auto &pathObjs = GatherPaths(paths);
443
444 mFunctions->stencilStrokePathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
445 &pathObjs[0], 0, reference, mask, transformType,
446 transformValues);
447
448 ASSERT(mFunctions->getError() == GL_NO_ERROR);
449}
450
451void RendererGL::stencilThenCoverFillPathInstanced(const gl::ContextState &state,
452 const std::vector<gl::Path *> &paths,
453 GLenum coverMode,
454 GLenum fillMode,
455 GLuint mask,
456 GLenum transformType,
457 const GLfloat *transformValues)
458{
459 const auto &pathObjs = GatherPaths(paths);
460
461 mFunctions->stencilThenCoverFillPathInstancedNV(
462 static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT, &pathObjs[0], 0, fillMode, mask,
463 coverMode, transformType, transformValues);
464
465 ASSERT(mFunctions->getError() == GL_NO_ERROR);
466}
467void RendererGL::stencilThenCoverStrokePathInstanced(const gl::ContextState &state,
468 const std::vector<gl::Path *> &paths,
469 GLenum coverMode,
470 GLint reference,
471 GLuint mask,
472 GLenum transformType,
473 const GLfloat *transformValues)
474{
475 const auto &pathObjs = GatherPaths(paths);
476
477 mFunctions->stencilThenCoverStrokePathInstancedNV(
478 static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT, &pathObjs[0], 0, reference, mask,
479 coverMode, transformType, transformValues);
480
481 ASSERT(mFunctions->getError() == GL_NO_ERROR);
482}
483
Corentin Wallezb920e362016-08-03 18:19:41 -0400484GLenum RendererGL::getResetStatus()
485{
486 return mFunctions->getGraphicsResetStatus();
487}
488
Jamie Madill8415b5f2016-04-26 13:41:39 -0400489ContextImpl *RendererGL::createContext(const gl::ContextState &state)
Jamie Madill437fa652016-05-03 15:13:24 -0400490{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400491 return new ContextGL(state, this);
Geoff Lang0af0b812015-09-23 13:56:25 -0400492}
493
Geoff Langf6ade2e2015-09-29 11:21:43 -0400494void RendererGL::insertEventMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700495{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400496 mFunctions->debugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
497 GL_DEBUG_SEVERITY_NOTIFICATION, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700498}
499
Geoff Langf6ade2e2015-09-29 11:21:43 -0400500void RendererGL::pushGroupMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700501{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400502 mFunctions->pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700503}
504
505void RendererGL::popGroupMarker()
506{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400507 mFunctions->popDebugGroup();
Austin Kinross6ee1e782015-05-29 17:05:37 -0700508}
509
Geoff Langf9a6f082015-01-22 13:32:49 -0500510std::string RendererGL::getVendorString() const
511{
Geoff Lange42753b2015-04-08 13:46:33 -0400512 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500513}
514
515std::string RendererGL::getRendererDescription() const
516{
Geoff Lange42753b2015-04-08 13:46:33 -0400517 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
518 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
519
Geoff Lange42753b2015-04-08 13:46:33 -0400520 std::ostringstream rendererString;
521 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Lang08dcfed2015-05-25 13:38:42 -0400522 if (mFunctions->standard == STANDARD_GL_ES)
Geoff Lange42753b2015-04-08 13:46:33 -0400523 {
524 rendererString << " ES";
525 }
Geoff Lang08dcfed2015-05-25 13:38:42 -0400526 rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
Geoff Lang8b0f0b32015-07-20 15:59:28 -0400527 if (mFunctions->standard == STANDARD_GL_DESKTOP)
528 {
529 // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
530 if ((mFunctions->profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
531 (mFunctions->isAtLeastGL(gl::Version(3, 2)) && mFunctions->profile == 0))
532 {
533 rendererString << " compatibility";
534 }
535 else if ((mFunctions->profile & GL_CONTEXT_CORE_PROFILE_BIT) != 0)
536 {
537 rendererString << " core";
538 }
539 }
Geoff Lange42753b2015-04-08 13:46:33 -0400540
541 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500542}
543
Geoff Lang862c0ba2015-05-25 15:31:16 -0400544const gl::Version &RendererGL::getMaxSupportedESVersion() const
545{
546 // Force generation of caps
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400547 getNativeCaps();
Geoff Lang862c0ba2015-05-25 15:31:16 -0400548
549 return mMaxSupportedESVersion;
550}
551
Austin Kinross02df7962015-07-01 10:03:42 -0700552void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
553 gl::Extensions *outExtensions,
554 gl::Limitations * /* outLimitations */) const
Geoff Langf9a6f082015-01-22 13:32:49 -0500555{
Geoff Lang862c0ba2015-05-25 15:31:16 -0400556 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions, &mMaxSupportedESVersion);
Geoff Langf9a6f082015-01-22 13:32:49 -0500557}
558
Ian Ewell53f59f42016-01-28 17:36:55 -0500559GLint RendererGL::getGPUDisjoint()
560{
561 // TODO(ewell): On GLES backends we should find a way to reliably query disjoint events
562 return 0;
563}
564
565GLint64 RendererGL::getTimestamp()
566{
567 GLint64 result = 0;
568 mFunctions->getInteger64v(GL_TIMESTAMP, &result);
569 return result;
570}
Ian Ewell292f0052016-02-04 10:37:32 -0500571
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400572void RendererGL::ensureCapsInitialized() const
Ian Ewell292f0052016-02-04 10:37:32 -0500573{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400574 if (!mCapsInitialized)
575 {
576 generateCaps(&mNativeCaps, &mNativeTextureCaps, &mNativeExtensions, &mNativeLimitations);
577 mCapsInitialized = true;
578 }
Ian Ewell292f0052016-02-04 10:37:32 -0500579}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400580
581const gl::Caps &RendererGL::getNativeCaps() const
582{
583 ensureCapsInitialized();
584 return mNativeCaps;
Geoff Langf9a6f082015-01-22 13:32:49 -0500585}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400586
587const gl::TextureCapsMap &RendererGL::getNativeTextureCaps() const
588{
589 ensureCapsInitialized();
590 return mNativeTextureCaps;
591}
592
593const gl::Extensions &RendererGL::getNativeExtensions() const
594{
595 ensureCapsInitialized();
596 return mNativeExtensions;
597}
598
599const gl::Limitations &RendererGL::getNativeLimitations() const
600{
601 ensureCapsInitialized();
602 return mNativeLimitations;
603}
604
605} // namespace rx