blob: 7065b2a748504b309ab5a42d8de334f1eaf0e2ee [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"
Jamie Madill222c5172017-07-19 16:15:42 -040038#include "libANGLE/renderer/renderer_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050039
Sami Väisänend59ca052016-06-21 16:10:00 +030040namespace
41{
42
43std::vector<GLuint> GatherPaths(const std::vector<gl::Path *> &paths)
44{
45 std::vector<GLuint> ret;
46 ret.reserve(paths.size());
47
48 for (const auto *p : paths)
49 {
50 const auto *pathObj = rx::GetImplAs<rx::PathGL>(p);
51 ret.push_back(pathObj->getPathID());
52 }
53 return ret;
54}
55
56} // namespace
57
Jamie Madill231c7f52017-04-26 13:45:37 -040058static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source,
59 GLenum type,
60 GLuint id,
61 GLenum severity,
62 GLsizei length,
63 const GLchar *message,
64 const void *userParam)
Geoff Langb80360f2015-05-04 15:01:31 -040065{
66 std::string sourceText;
67 switch (source)
68 {
Jamie Madill231c7f52017-04-26 13:45:37 -040069 case GL_DEBUG_SOURCE_API:
70 sourceText = "OpenGL";
71 break;
72 case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
73 sourceText = "Windows";
74 break;
75 case GL_DEBUG_SOURCE_SHADER_COMPILER:
76 sourceText = "Shader Compiler";
77 break;
78 case GL_DEBUG_SOURCE_THIRD_PARTY:
79 sourceText = "Third Party";
80 break;
81 case GL_DEBUG_SOURCE_APPLICATION:
82 sourceText = "Application";
83 break;
84 case GL_DEBUG_SOURCE_OTHER:
85 sourceText = "Other";
86 break;
87 default:
88 sourceText = "UNKNOWN";
89 break;
Geoff Langb80360f2015-05-04 15:01:31 -040090 }
91
92 std::string typeText;
93 switch (type)
94 {
Jamie Madill231c7f52017-04-26 13:45:37 -040095 case GL_DEBUG_TYPE_ERROR:
96 typeText = "Error";
97 break;
98 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
99 typeText = "Deprecated behavior";
100 break;
101 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
102 typeText = "Undefined behavior";
103 break;
104 case GL_DEBUG_TYPE_PORTABILITY:
105 typeText = "Portability";
106 break;
107 case GL_DEBUG_TYPE_PERFORMANCE:
108 typeText = "Performance";
109 break;
110 case GL_DEBUG_TYPE_OTHER:
111 typeText = "Other";
112 break;
113 case GL_DEBUG_TYPE_MARKER:
114 typeText = "Marker";
115 break;
116 default:
117 typeText = "UNKNOWN";
118 break;
Geoff Langb80360f2015-05-04 15:01:31 -0400119 }
120
121 std::string severityText;
122 switch (severity)
123 {
Jamie Madill231c7f52017-04-26 13:45:37 -0400124 case GL_DEBUG_SEVERITY_HIGH:
125 severityText = "High";
126 break;
127 case GL_DEBUG_SEVERITY_MEDIUM:
128 severityText = "Medium";
129 break;
130 case GL_DEBUG_SEVERITY_LOW:
131 severityText = "Low";
132 break;
133 case GL_DEBUG_SEVERITY_NOTIFICATION:
134 severityText = "Notification";
135 break;
136 default:
137 severityText = "UNKNOWN";
138 break;
Geoff Langb80360f2015-05-04 15:01:31 -0400139 }
140
Yuly Novikovbcb3f9b2017-01-27 22:45:18 -0500141 if (type == GL_DEBUG_TYPE_ERROR)
142 {
143 ERR() << std::endl
144 << "\tSource: " << sourceText << std::endl
145 << "\tType: " << typeText << std::endl
146 << "\tID: " << gl::Error(id) << std::endl
147 << "\tSeverity: " << severityText << std::endl
148 << "\tMessage: " << message;
149 }
150 else
151 {
152 // TODO(ynovikov): filter into WARN and INFO if INFO is ever implemented
153 WARN() << std::endl
154 << "\tSource: " << sourceText << std::endl
155 << "\tType: " << typeText << std::endl
156 << "\tID: " << gl::Error(id) << std::endl
157 << "\tSeverity: " << severityText << std::endl
158 << "\tMessage: " << message;
159 }
Geoff Langb80360f2015-05-04 15:01:31 -0400160}
Geoff Langb80360f2015-05-04 15:01:31 -0400161
Geoff Langf9a6f082015-01-22 13:32:49 -0500162namespace rx
163{
164
Jamie Madill39fcf262015-06-08 14:39:07 -0400165RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &attribMap)
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400166 : mMaxSupportedESVersion(0, 0),
Geoff Lang94463d52015-02-18 13:09:37 -0500167 mFunctions(functions),
Jamie Madill39fcf262015-06-08 14:39:07 -0400168 mStateManager(nullptr),
Geoff Lang53b8aec2015-08-24 10:33:25 -0400169 mBlitter(nullptr),
Jamie Madill222c5172017-07-19 16:15:42 -0400170 mUseDebugOutput(false),
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400171 mSkipDrawCalls(false),
Martin Radev318f9aa2017-05-17 17:47:28 +0300172 mCapsInitialized(false),
173 mMultiviewImplementationType(MultiviewImplementationTypeGL::UNSPECIFIED)
Geoff Lang56cf9af2015-02-17 10:16:49 -0500174{
175 ASSERT(mFunctions);
Geoff Langcab7e1d2015-07-27 11:20:41 -0400176 nativegl_gl::GenerateWorkarounds(mFunctions, &mWorkarounds);
Shao86904b82017-03-21 09:30:59 +0800177 mStateManager = new StateManagerGL(mFunctions, getNativeCaps());
Jamie Madill231c7f52017-04-26 13:45:37 -0400178 mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
Geoff Langb80360f2015-05-04 15:01:31 -0400179
Jamie Madill222c5172017-07-19 16:15:42 -0400180 bool hasDebugOutput = mFunctions->isAtLeastGL(gl::Version(4, 3)) ||
181 mFunctions->hasGLExtension("GL_KHR_debug") ||
182 mFunctions->isAtLeastGLES(gl::Version(3, 2)) ||
183 mFunctions->hasGLESExtension("GL_KHR_debug");
184
185 mUseDebugOutput = hasDebugOutput && ShouldUseDebugLayers(attribMap);
186
187 if (mUseDebugOutput)
Geoff Langb80360f2015-05-04 15:01:31 -0400188 {
Corentin Wallez930fefc2016-09-14 15:54:18 -0400189 mFunctions->enable(GL_DEBUG_OUTPUT);
Geoff Langb80360f2015-05-04 15:01:31 -0400190 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
Jamie Madill231c7f52017-04-26 13:45:37 -0400191 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0,
192 nullptr, GL_TRUE);
193 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0,
194 nullptr, GL_TRUE);
195 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0,
196 nullptr, GL_FALSE);
197 mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION,
198 0, nullptr, GL_FALSE);
Geoff Langb80360f2015-05-04 15:01:31 -0400199 mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
200 }
Jamie Madill39fcf262015-06-08 14:39:07 -0400201
Ian Ewellec2c0c52016-04-05 13:46:26 -0400202 EGLint deviceType =
203 static_cast<EGLint>(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
Jamie Madill39fcf262015-06-08 14:39:07 -0400204 if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
205 {
206 mSkipDrawCalls = true;
207 }
Corentin Wallez83144652016-08-31 17:03:30 -0400208
209 if (mWorkarounds.initializeCurrentVertexAttributes)
210 {
211 GLint maxVertexAttribs = 0;
212 mFunctions->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
213
214 for (GLint i = 0; i < maxVertexAttribs; ++i)
215 {
216 mFunctions->vertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 1.0f);
217 }
218 }
Geoff Lang56cf9af2015-02-17 10:16:49 -0500219}
Geoff Langf9a6f082015-01-22 13:32:49 -0500220
221RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -0500222{
Geoff Lang53b8aec2015-08-24 10:33:25 -0400223 SafeDelete(mBlitter);
Geoff Langbf8a72f2015-11-03 16:34:45 -0500224 SafeDelete(mStateManager);
Geoff Lang94463d52015-02-18 13:09:37 -0500225}
Geoff Langf9a6f082015-01-22 13:32:49 -0500226
227gl::Error RendererGL::flush()
228{
Geoff Lang2c919142015-04-01 14:44:13 -0400229 mFunctions->flush();
He Yunchaoacd18982017-01-04 10:46:42 +0800230 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500231}
232
233gl::Error RendererGL::finish()
234{
Jamie Madill222c5172017-07-19 16:15:42 -0400235 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mUseDebugOutput)
Geoff Langf0aa8422015-09-29 15:08:34 -0400236 {
237 mFunctions->enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
238 }
Geoff Langf0aa8422015-09-29 15:08:34 -0400239
Geoff Lang2c919142015-04-01 14:44:13 -0400240 mFunctions->finish();
Geoff Langf0aa8422015-09-29 15:08:34 -0400241
Jamie Madill222c5172017-07-19 16:15:42 -0400242 if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable && mUseDebugOutput)
Geoff Langf0aa8422015-09-29 15:08:34 -0400243 {
244 mFunctions->disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
245 }
Geoff Langf0aa8422015-09-29 15:08:34 -0400246
He Yunchaoacd18982017-01-04 10:46:42 +0800247 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500248}
249
Jamie Madill4928b7c2017-06-20 12:57:39 -0400250gl::Error RendererGL::drawArrays(const gl::Context *context,
Jamie Madill9082b982016-04-27 15:21:51 -0400251 GLenum mode,
252 GLint first,
253 GLsizei count)
Geoff Langf9a6f082015-01-22 13:32:49 -0500254{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400255 ANGLE_TRY(mStateManager->setDrawArraysState(context, first, count, 0));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400256
Jamie Madill39fcf262015-06-08 14:39:07 -0400257 if (!mSkipDrawCalls)
258 {
259 mFunctions->drawArrays(mode, first, count);
260 }
Geoff Langd6e50872015-02-24 12:42:26 -0500261
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400262 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500263}
264
Jamie Madill4928b7c2017-06-20 12:57:39 -0400265gl::Error RendererGL::drawArraysInstanced(const gl::Context *context,
Geoff Langf6db0982015-08-25 13:04:00 -0400266 GLenum mode,
267 GLint first,
268 GLsizei count,
269 GLsizei instanceCount)
270{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400271 ANGLE_TRY(mStateManager->setDrawArraysState(context, first, count, instanceCount));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400272
273 if (!mSkipDrawCalls)
274 {
275 mFunctions->drawArraysInstanced(mode, first, count, instanceCount);
276 }
277
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400278 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400279}
280
Jamie Madill4928b7c2017-06-20 12:57:39 -0400281gl::Error RendererGL::drawElements(const gl::Context *context,
Geoff Langf6db0982015-08-25 13:04:00 -0400282 GLenum mode,
283 GLsizei count,
284 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400285 const void *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400286 const gl::IndexRange &indexRange)
Geoff Langf9a6f082015-01-22 13:32:49 -0500287{
Jamie Madill876429b2017-04-20 15:46:24 -0400288 const void *drawIndexPtr = nullptr;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400289 ANGLE_TRY(mStateManager->setDrawElementsState(context, count, type, indices, 0, &drawIndexPtr));
Geoff Lang7c82bc42015-03-09 16:18:08 -0400290
Jamie Madill39fcf262015-06-08 14:39:07 -0400291 if (!mSkipDrawCalls)
292 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400293 mFunctions->drawElements(mode, count, type, drawIndexPtr);
Jamie Madill39fcf262015-06-08 14:39:07 -0400294 }
Geoff Langd6e50872015-02-24 12:42:26 -0500295
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400296 return gl::NoError();
Geoff Langf9a6f082015-01-22 13:32:49 -0500297}
298
Jamie Madill4928b7c2017-06-20 12:57:39 -0400299gl::Error RendererGL::drawElementsInstanced(const gl::Context *context,
Geoff Langf6db0982015-08-25 13:04:00 -0400300 GLenum mode,
301 GLsizei count,
302 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400303 const void *indices,
Geoff Langf6db0982015-08-25 13:04:00 -0400304 GLsizei instances,
Geoff Lang3edfe032015-09-04 16:38:24 -0400305 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400306{
Jamie Madill876429b2017-04-20 15:46:24 -0400307 const void *drawIndexPointer = nullptr;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400308 ANGLE_TRY(mStateManager->setDrawElementsState(context, count, type, indices, instances,
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400309 &drawIndexPointer));
Geoff Lang3cf12ce2015-08-27 14:40:48 -0400310
311 if (!mSkipDrawCalls)
312 {
313 mFunctions->drawElementsInstanced(mode, count, type, drawIndexPointer, instances);
314 }
315
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400316 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400317}
318
Jamie Madill4928b7c2017-06-20 12:57:39 -0400319gl::Error RendererGL::drawRangeElements(const gl::Context *context,
Geoff Langf6db0982015-08-25 13:04:00 -0400320 GLenum mode,
321 GLuint start,
322 GLuint end,
323 GLsizei count,
324 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400325 const void *indices,
Geoff Lang3edfe032015-09-04 16:38:24 -0400326 const gl::IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -0400327{
Jamie Madill876429b2017-04-20 15:46:24 -0400328 const void *drawIndexPointer = nullptr;
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400329 ANGLE_TRY(
Jamie Madill4928b7c2017-06-20 12:57:39 -0400330 mStateManager->setDrawElementsState(context, count, type, indices, 0, &drawIndexPointer));
Geoff Lang47502232015-08-25 16:26:10 -0400331
332 if (!mSkipDrawCalls)
333 {
334 mFunctions->drawRangeElements(mode, start, end, count, type, drawIndexPointer);
335 }
336
He Yunchaoacd18982017-01-04 10:46:42 +0800337 return gl::NoError();
Geoff Langf6db0982015-08-25 13:04:00 -0400338}
339
Jamie Madill4928b7c2017-06-20 12:57:39 -0400340gl::Error RendererGL::drawArraysIndirect(const gl::Context *context,
Jiajia Qind9671222016-11-29 16:30:31 +0800341 GLenum mode,
Jamie Madill876429b2017-04-20 15:46:24 -0400342 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800343{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400344 ANGLE_TRY(mStateManager->setDrawIndirectState(context, GL_NONE));
Jiajia Qind9671222016-11-29 16:30:31 +0800345
346 if (!mSkipDrawCalls)
347 {
348 mFunctions->drawArraysIndirect(mode, indirect);
349 }
350 return gl::NoError();
351}
352
Jamie Madill4928b7c2017-06-20 12:57:39 -0400353gl::Error RendererGL::drawElementsIndirect(const gl::Context *context,
Jiajia Qind9671222016-11-29 16:30:31 +0800354 GLenum mode,
355 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -0400356 const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +0800357{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400358 ANGLE_TRY(mStateManager->setDrawIndirectState(context, type));
Jiajia Qind9671222016-11-29 16:30:31 +0800359
360 if (!mSkipDrawCalls)
361 {
362 mFunctions->drawElementsIndirect(mode, type, indirect);
363 }
364 return gl::NoError();
365}
366
Sami Väisänene45e53b2016-05-25 10:36:04 +0300367void RendererGL::stencilFillPath(const gl::ContextState &state,
368 const gl::Path *path,
369 GLenum fillMode,
370 GLuint mask)
371{
372 const auto *pathObj = GetImplAs<PathGL>(path);
373
374 mFunctions->stencilFillPathNV(pathObj->getPathID(), fillMode, mask);
375
376 ASSERT(mFunctions->getError() == GL_NO_ERROR);
377}
378
379void RendererGL::stencilStrokePath(const gl::ContextState &state,
380 const gl::Path *path,
381 GLint reference,
382 GLuint mask)
383{
384 const auto *pathObj = GetImplAs<PathGL>(path);
385
386 mFunctions->stencilStrokePathNV(pathObj->getPathID(), reference, mask);
387
388 ASSERT(mFunctions->getError() == GL_NO_ERROR);
389}
390
391void RendererGL::coverFillPath(const gl::ContextState &state,
392 const gl::Path *path,
393 GLenum coverMode)
394{
395
396 const auto *pathObj = GetImplAs<PathGL>(path);
397 mFunctions->coverFillPathNV(pathObj->getPathID(), coverMode);
398
399 ASSERT(mFunctions->getError() == GL_NO_ERROR);
400}
401
402void RendererGL::coverStrokePath(const gl::ContextState &state,
403 const gl::Path *path,
404 GLenum coverMode)
405{
406 const auto *pathObj = GetImplAs<PathGL>(path);
407 mFunctions->coverStrokePathNV(pathObj->getPathID(), coverMode);
408
409 ASSERT(mFunctions->getError() == GL_NO_ERROR);
410}
411
412void RendererGL::stencilThenCoverFillPath(const gl::ContextState &state,
413 const gl::Path *path,
414 GLenum fillMode,
415 GLuint mask,
416 GLenum coverMode)
417{
418
419 const auto *pathObj = GetImplAs<PathGL>(path);
420 mFunctions->stencilThenCoverFillPathNV(pathObj->getPathID(), fillMode, mask, coverMode);
421
422 ASSERT(mFunctions->getError() == GL_NO_ERROR);
423}
424
425void RendererGL::stencilThenCoverStrokePath(const gl::ContextState &state,
426 const gl::Path *path,
427 GLint reference,
428 GLuint mask,
429 GLenum coverMode)
430{
431
432 const auto *pathObj = GetImplAs<PathGL>(path);
433 mFunctions->stencilThenCoverStrokePathNV(pathObj->getPathID(), reference, mask, coverMode);
434
435 ASSERT(mFunctions->getError() == GL_NO_ERROR);
436}
437
Sami Väisänend59ca052016-06-21 16:10:00 +0300438void RendererGL::coverFillPathInstanced(const gl::ContextState &state,
439 const std::vector<gl::Path *> &paths,
440 GLenum coverMode,
441 GLenum transformType,
442 const GLfloat *transformValues)
443{
444 const auto &pathObjs = GatherPaths(paths);
445
446 mFunctions->coverFillPathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
447 &pathObjs[0], 0, coverMode, transformType,
448 transformValues);
449
450 ASSERT(mFunctions->getError() == GL_NO_ERROR);
451}
452void RendererGL::coverStrokePathInstanced(const gl::ContextState &state,
453 const std::vector<gl::Path *> &paths,
454 GLenum coverMode,
455 GLenum transformType,
456 const GLfloat *transformValues)
457{
458 const auto &pathObjs = GatherPaths(paths);
459
460 mFunctions->coverStrokePathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
461 &pathObjs[0], 0, coverMode, transformType,
462 transformValues);
463
464 ASSERT(mFunctions->getError() == GL_NO_ERROR);
465}
466void RendererGL::stencilFillPathInstanced(const gl::ContextState &state,
467 const std::vector<gl::Path *> &paths,
468 GLenum fillMode,
469 GLuint mask,
470 GLenum transformType,
471 const GLfloat *transformValues)
472{
473 const auto &pathObjs = GatherPaths(paths);
474
475 mFunctions->stencilFillPathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
476 &pathObjs[0], 0, fillMode, mask, transformType,
477 transformValues);
478
479 ASSERT(mFunctions->getError() == GL_NO_ERROR);
480}
481void RendererGL::stencilStrokePathInstanced(const gl::ContextState &state,
482 const std::vector<gl::Path *> &paths,
483 GLint reference,
484 GLuint mask,
485 GLenum transformType,
486 const GLfloat *transformValues)
487{
488 const auto &pathObjs = GatherPaths(paths);
489
490 mFunctions->stencilStrokePathInstancedNV(static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT,
491 &pathObjs[0], 0, reference, mask, transformType,
492 transformValues);
493
494 ASSERT(mFunctions->getError() == GL_NO_ERROR);
495}
496
497void RendererGL::stencilThenCoverFillPathInstanced(const gl::ContextState &state,
498 const std::vector<gl::Path *> &paths,
499 GLenum coverMode,
500 GLenum fillMode,
501 GLuint mask,
502 GLenum transformType,
503 const GLfloat *transformValues)
504{
505 const auto &pathObjs = GatherPaths(paths);
506
507 mFunctions->stencilThenCoverFillPathInstancedNV(
508 static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT, &pathObjs[0], 0, fillMode, mask,
509 coverMode, transformType, transformValues);
510
511 ASSERT(mFunctions->getError() == GL_NO_ERROR);
512}
513void RendererGL::stencilThenCoverStrokePathInstanced(const gl::ContextState &state,
514 const std::vector<gl::Path *> &paths,
515 GLenum coverMode,
516 GLint reference,
517 GLuint mask,
518 GLenum transformType,
519 const GLfloat *transformValues)
520{
521 const auto &pathObjs = GatherPaths(paths);
522
523 mFunctions->stencilThenCoverStrokePathInstancedNV(
524 static_cast<GLsizei>(pathObjs.size()), GL_UNSIGNED_INT, &pathObjs[0], 0, reference, mask,
525 coverMode, transformType, transformValues);
526
527 ASSERT(mFunctions->getError() == GL_NO_ERROR);
528}
529
Corentin Wallezb920e362016-08-03 18:19:41 -0400530GLenum RendererGL::getResetStatus()
531{
532 return mFunctions->getGraphicsResetStatus();
533}
534
Jamie Madill8415b5f2016-04-26 13:41:39 -0400535ContextImpl *RendererGL::createContext(const gl::ContextState &state)
Jamie Madill437fa652016-05-03 15:13:24 -0400536{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400537 return new ContextGL(state, this);
Geoff Lang0af0b812015-09-23 13:56:25 -0400538}
539
Geoff Langf6ade2e2015-09-29 11:21:43 -0400540void RendererGL::insertEventMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700541{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400542 mFunctions->debugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
543 GL_DEBUG_SEVERITY_NOTIFICATION, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700544}
545
Geoff Langf6ade2e2015-09-29 11:21:43 -0400546void RendererGL::pushGroupMarker(GLsizei length, const char *marker)
Austin Kinross6ee1e782015-05-29 17:05:37 -0700547{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400548 mFunctions->pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -0700549}
550
551void RendererGL::popGroupMarker()
552{
Geoff Langf6ade2e2015-09-29 11:21:43 -0400553 mFunctions->popDebugGroup();
Austin Kinross6ee1e782015-05-29 17:05:37 -0700554}
555
Geoff Langf9a6f082015-01-22 13:32:49 -0500556std::string RendererGL::getVendorString() const
557{
Jamie Madill231c7f52017-04-26 13:45:37 -0400558 return std::string(reinterpret_cast<const char *>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500559}
560
561std::string RendererGL::getRendererDescription() const
562{
Jamie Madill231c7f52017-04-26 13:45:37 -0400563 std::string nativeVendorString(
564 reinterpret_cast<const char *>(mFunctions->getString(GL_VENDOR)));
565 std::string nativeRendererString(
566 reinterpret_cast<const char *>(mFunctions->getString(GL_RENDERER)));
Geoff Lange42753b2015-04-08 13:46:33 -0400567
Geoff Lange42753b2015-04-08 13:46:33 -0400568 std::ostringstream rendererString;
569 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Lang08dcfed2015-05-25 13:38:42 -0400570 if (mFunctions->standard == STANDARD_GL_ES)
Geoff Lange42753b2015-04-08 13:46:33 -0400571 {
572 rendererString << " ES";
573 }
Geoff Lang08dcfed2015-05-25 13:38:42 -0400574 rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
Geoff Lang8b0f0b32015-07-20 15:59:28 -0400575 if (mFunctions->standard == STANDARD_GL_DESKTOP)
576 {
577 // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
578 if ((mFunctions->profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
579 (mFunctions->isAtLeastGL(gl::Version(3, 2)) && mFunctions->profile == 0))
580 {
581 rendererString << " compatibility";
582 }
583 else if ((mFunctions->profile & GL_CONTEXT_CORE_PROFILE_BIT) != 0)
584 {
585 rendererString << " core";
586 }
587 }
Geoff Lange42753b2015-04-08 13:46:33 -0400588
589 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500590}
591
Geoff Lang862c0ba2015-05-25 15:31:16 -0400592const gl::Version &RendererGL::getMaxSupportedESVersion() const
593{
594 // Force generation of caps
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400595 getNativeCaps();
Geoff Lang862c0ba2015-05-25 15:31:16 -0400596
597 return mMaxSupportedESVersion;
598}
599
Jamie Madill231c7f52017-04-26 13:45:37 -0400600void RendererGL::generateCaps(gl::Caps *outCaps,
601 gl::TextureCapsMap *outTextureCaps,
Austin Kinross02df7962015-07-01 10:03:42 -0700602 gl::Extensions *outExtensions,
603 gl::Limitations * /* outLimitations */) const
Geoff Langf9a6f082015-01-22 13:32:49 -0500604{
Shao86904b82017-03-21 09:30:59 +0800605 nativegl_gl::GenerateCaps(mFunctions, mWorkarounds, outCaps, outTextureCaps, outExtensions,
Martin Radev318f9aa2017-05-17 17:47:28 +0300606 &mMaxSupportedESVersion, &mMultiviewImplementationType);
Geoff Langf9a6f082015-01-22 13:32:49 -0500607}
608
Ian Ewell53f59f42016-01-28 17:36:55 -0500609GLint RendererGL::getGPUDisjoint()
610{
611 // TODO(ewell): On GLES backends we should find a way to reliably query disjoint events
612 return 0;
613}
614
615GLint64 RendererGL::getTimestamp()
616{
617 GLint64 result = 0;
618 mFunctions->getInteger64v(GL_TIMESTAMP, &result);
619 return result;
620}
Ian Ewell292f0052016-02-04 10:37:32 -0500621
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400622void RendererGL::ensureCapsInitialized() const
Ian Ewell292f0052016-02-04 10:37:32 -0500623{
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400624 if (!mCapsInitialized)
625 {
626 generateCaps(&mNativeCaps, &mNativeTextureCaps, &mNativeExtensions, &mNativeLimitations);
627 mCapsInitialized = true;
628 }
Ian Ewell292f0052016-02-04 10:37:32 -0500629}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400630
631const gl::Caps &RendererGL::getNativeCaps() const
632{
633 ensureCapsInitialized();
634 return mNativeCaps;
Geoff Langf9a6f082015-01-22 13:32:49 -0500635}
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400636
637const gl::TextureCapsMap &RendererGL::getNativeTextureCaps() const
638{
639 ensureCapsInitialized();
640 return mNativeTextureCaps;
641}
642
643const gl::Extensions &RendererGL::getNativeExtensions() const
644{
645 ensureCapsInitialized();
646 return mNativeExtensions;
647}
648
649const gl::Limitations &RendererGL::getNativeLimitations() const
650{
651 ensureCapsInitialized();
652 return mNativeLimitations;
653}
654
Martin Radev318f9aa2017-05-17 17:47:28 +0300655MultiviewImplementationTypeGL RendererGL::getMultiviewImplementationType() const
656{
657 ensureCapsInitialized();
658 return mMultiviewImplementationType;
659}
660
Jamie Madill761b02c2017-06-23 16:27:06 -0400661void RendererGL::applyNativeWorkarounds(gl::Workarounds *workarounds) const
662{
663 ensureCapsInitialized();
664 nativegl_gl::ApplyWorkarounds(mFunctions, workarounds);
665}
666
Jamie Madill4928b7c2017-06-20 12:57:39 -0400667gl::Error RendererGL::dispatchCompute(const gl::Context *context,
Xinghua Cao2b396592017-03-29 15:36:04 +0800668 GLuint numGroupsX,
669 GLuint numGroupsY,
670 GLuint numGroupsZ)
671{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400672 ANGLE_TRY(mStateManager->setDispatchComputeState(context));
Xinghua Cao2b396592017-03-29 15:36:04 +0800673 mFunctions->dispatchCompute(numGroupsX, numGroupsY, numGroupsZ);
674 return gl::NoError();
675}
676
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400677} // namespace rx