blob: 5c8462bff9bf5f83718c6e465201955dc94d8ffe [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill956ab4d2018-10-10 16:13:03 -0400138ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400364 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
365 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
366 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400367 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800368 mZeroFilledBuffer(1000u),
369 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000370{
Jamie Madill5b772312018-03-08 20:28:32 -0500371 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400372 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
373 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400374
375 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
376 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
377 {
378 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
379 }
Jamie Madille25b8002018-09-20 13:39:49 -0400380
381 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
382 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
383 {
384 mSamplerObserverBindings.emplace_back(this, samplerIndex);
385 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400386}
Jamie Madill5b772312018-03-08 20:28:32 -0500387
Geoff Lang33f11fb2018-05-07 13:42:47 -0400388void Context::initialize()
389{
390 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400391
Geoff Lang33f11fb2018-05-07 13:42:47 -0400392 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700393 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400394
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400395 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100396
Shannon Woods53a94a82014-06-24 15:20:36 -0400397 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400398
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000399 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400400 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000401 // and cube map texture state vectors respectively associated with them.
402 // In order that access to these initial textures not be lost, they are treated as texture
403 // objects all of whose names are 0.
404
Corentin Wallez99d492c2018-02-27 15:17:10 -0500405 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800406 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500407
Corentin Wallez99d492c2018-02-27 15:17:10 -0500408 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800409 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400410
Geoff Langeb66a6e2016-10-31 13:06:12 -0400411 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400412 {
413 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500414 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800415 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400416
Corentin Wallez99d492c2018-02-27 15:17:10 -0500417 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800418 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400419 }
Geoff Lang3b573612016-10-31 14:08:10 -0400420 if (getClientVersion() >= Version(3, 1))
421 {
Olli Etuahod310a432018-08-24 15:40:23 +0300422 // TODO(http://anglebug.com/2775): These could also be enabled via extension
Geoff Lang3b573612016-10-31 14:08:10 -0400423 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500424 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800425 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Olli Etuahod310a432018-08-24 15:40:23 +0300426 Texture *zeroTexture2DMultisampleArray =
427 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
428 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800429
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
431 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800432 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800433 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800434
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
436 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400437 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800438 }
Geoff Lang3b573612016-10-31 14:08:10 -0400439 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000440
Geoff Langb0f917f2017-12-05 13:41:54 -0500441 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400442 {
443 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500444 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800445 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400446 }
447
Geoff Langb0f917f2017-12-05 13:41:54 -0500448 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400449 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500450 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800451 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400452 }
453
Jamie Madill4928b7c2017-06-20 12:57:39 -0400454 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500455
Jamie Madill57a89722013-07-02 11:57:03 -0400456 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000457
Geoff Langeb66a6e2016-10-31 13:06:12 -0400458 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400459 {
460 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
461 // In the initial state, a default transform feedback object is bound and treated as
462 // a transform feedback object with a name of zero. That object is bound any time
463 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400464 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400465 }
Geoff Langc8058452014-02-03 12:04:11 -0500466
Corentin Wallez336129f2017-10-17 15:55:40 -0400467 for (auto type : angle::AllEnums<BufferBinding>())
468 {
469 bindBuffer(type, 0);
470 }
471
472 bindRenderbuffer(GL_RENDERBUFFER, 0);
473
474 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
475 {
476 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
477 }
478
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700479 // Initialize GLES1 renderer if appropriate.
480 if (getClientVersion() < Version(2, 0))
481 {
482 mGLES1Renderer.reset(new GLES1Renderer());
483 }
484
Jamie Madillad9f24e2016-02-12 09:27:24 -0500485 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400486 mAllDirtyBits.set();
487
Geoff Lang9bf86f02018-07-26 11:46:34 -0400488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400492 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400493
494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
495 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400497 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400498
Jamie Madillc67323a2017-11-02 23:11:41 -0400499 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500500 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500501 // No dirty objects.
502
503 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400504 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500505 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400506 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500507 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
508
509 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
510 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
511 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
512 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
513 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
514 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
515 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
516 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
517 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
518 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
519 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400520 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500521 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
522
523 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
524 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700525 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400526 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
527 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500528 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
529 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400530
Xinghua Cao10a4d432017-11-28 14:46:26 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800532 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
533 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800534 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
535 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
536 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
537 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800538 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800539 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800540 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400541 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400542 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800543
Jamie Madillb4927eb2018-07-16 11:39:46 -0400544 mImplementation->setErrorSet(&mErrors);
545
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400546 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547}
548
Jamie Madill4928b7c2017-06-20 12:57:39 -0400549egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000550{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700551 if (mGLES1Renderer)
552 {
553 mGLES1Renderer->onDestroy(this, &mGLState);
554 }
555
Jamie Madille7b3fe22018-04-05 09:42:46 -0400556 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400557 ANGLE_TRY(releaseSurface(display));
558
Corentin Wallez80b24112015-08-25 16:41:57 -0400559 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000560 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400561 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400563 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564
Corentin Wallez80b24112015-08-25 16:41:57 -0400565 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400567 if (query.second != nullptr)
568 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400569 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400570 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000571 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400572 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000573
Corentin Wallez80b24112015-08-25 16:41:57 -0400574 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400575 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400576 if (vertexArray.second)
577 {
578 vertexArray.second->onDestroy(this);
579 }
Jamie Madill57a89722013-07-02 11:57:03 -0400580 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400581 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400582
Corentin Wallez80b24112015-08-25 16:41:57 -0400583 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500584 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500585 if (transformFeedback.second != nullptr)
586 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500587 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500588 }
Geoff Langc8058452014-02-03 12:04:11 -0500589 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400590 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500591
Jamie Madill5b772312018-03-08 20:28:32 -0500592 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400593 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800594 if (zeroTexture.get() != nullptr)
595 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400596 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800597 zeroTexture.set(this, nullptr);
598 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400599 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000600
Jamie Madill2f348d22017-06-05 10:50:59 -0400601 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500602
Jamie Madill4928b7c2017-06-20 12:57:39 -0400603 mGLState.reset(this);
604
Jamie Madill6c1f6712017-02-14 19:08:04 -0500605 mState.mBuffers->release(this);
606 mState.mShaderPrograms->release(this);
607 mState.mTextures->release(this);
608 mState.mRenderbuffers->release(this);
609 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400610 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500611 mState.mPaths->release(this);
612 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800613 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400614
jchen107ae70d82018-07-06 13:47:01 +0800615 mThreadPool.reset();
616
Jamie Madill76e471e2017-10-21 09:56:01 -0400617 mImplementation->onDestroy(this);
618
Jamie Madill4928b7c2017-06-20 12:57:39 -0400619 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000620}
621
Jamie Madill70ee0f62017-02-06 16:04:20 -0500622Context::~Context()
623{
624}
625
Geoff Lang75359662018-04-11 01:42:27 -0400626void Context::setLabel(EGLLabelKHR label)
627{
628 mLabel = label;
629}
630
631EGLLabelKHR Context::getLabel() const
632{
633 return mLabel;
634}
635
Jamie Madill4928b7c2017-06-20 12:57:39 -0400636egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637{
Jamie Madill61e16b42017-06-19 11:13:23 -0400638 mCurrentDisplay = display;
639
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000640 if (!mHasBeenCurrent)
641 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400642 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500644 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400645 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646
Corentin Wallezc295e512017-01-27 17:47:50 -0500647 int width = 0;
648 int height = 0;
649 if (surface != nullptr)
650 {
651 width = surface->getWidth();
652 height = surface->getHeight();
653 }
654
655 mGLState.setViewportParams(0, 0, width, height);
656 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000657
658 mHasBeenCurrent = true;
659 }
660
Jamie Madill1b94d432015-08-07 13:23:23 -0400661 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700662 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400663 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400664
Jamie Madill4928b7c2017-06-20 12:57:39 -0400665 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500666
667 Framebuffer *newDefault = nullptr;
668 if (surface != nullptr)
669 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400670 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500671 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400672 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500673 }
674 else
675 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400676 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500677 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000678
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 // Update default framebuffer, the binding of the previous default
680 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700683 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400684 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400685 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700687 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400688 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400689 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400690 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400691 }
Ian Ewell292f0052016-02-04 10:37:32 -0500692
Jamie Madill32643ce2018-10-19 11:38:03 -0400693 // Notify the renderer of a context switch.
694 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
695 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400696 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000697}
698
Jamie Madill4928b7c2017-06-20 12:57:39 -0400699egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400700{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400701 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400702
Geoff Langbf7b95d2018-05-01 16:48:21 -0400703 // Remove the default framebuffer
704 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500705 {
706 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400707 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500708 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400709
710 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500711 {
712 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400713 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500714 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400715
716 if (defaultFramebuffer)
717 {
718 defaultFramebuffer->onDestroy(this);
719 delete defaultFramebuffer;
720 }
721
Corentin Wallezc295e512017-01-27 17:47:50 -0500722 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
723
724 if (mCurrentSurface)
725 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400726 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500727 mCurrentSurface = nullptr;
728 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400729
730 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400731}
732
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000733GLuint Context::createBuffer()
734{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500735 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000736}
737
738GLuint Context::createProgram()
739{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500740 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000741}
742
Jiawei Shao385b3e02018-03-21 09:43:28 +0800743GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500745 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000746}
747
748GLuint Context::createTexture()
749{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500750 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000751}
752
753GLuint Context::createRenderbuffer()
754{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500755 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000756}
757
Jamie Madill13951342018-09-30 15:24:28 -0400758void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
759{
760 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
761}
762
Brandon Jones59770802018-04-02 13:18:42 -0700763GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300764{
Jamie Madill13951342018-09-30 15:24:28 -0400765 GLuint created = 0;
766 tryGenPaths(range, &created);
767 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300768}
769
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770// Returns an unused framebuffer name
771GLuint Context::createFramebuffer()
772{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500773 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774}
775
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500776void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500778 for (int i = 0; i < n; i++)
779 {
780 GLuint handle = mFenceNVHandleAllocator.allocate();
781 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
782 fences[i] = handle;
783 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000784}
785
Yunchao Hea336b902017-08-02 16:05:21 +0800786GLuint Context::createProgramPipeline()
787{
788 return mState.mPipelines->createProgramPipeline();
789}
790
Jiawei Shao385b3e02018-03-21 09:43:28 +0800791GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800792{
793 UNIMPLEMENTED();
794 return 0u;
795}
796
James Darpinian4d9d4832018-03-13 12:43:28 -0700797void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798{
James Darpinian4d9d4832018-03-13 12:43:28 -0700799 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
800 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000801 {
802 detachBuffer(buffer);
803 }
Jamie Madill893ab082014-05-16 16:56:10 -0400804
James Darpinian4d9d4832018-03-13 12:43:28 -0700805 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806}
807
808void Context::deleteShader(GLuint shader)
809{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500810 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000811}
812
813void Context::deleteProgram(GLuint program)
814{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500815 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000816}
817
818void Context::deleteTexture(GLuint texture)
819{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500820 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000821 {
822 detachTexture(texture);
823 }
824
Jamie Madill6c1f6712017-02-14 19:08:04 -0500825 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000826}
827
828void Context::deleteRenderbuffer(GLuint renderbuffer)
829{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500830 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000831 {
832 detachRenderbuffer(renderbuffer);
833 }
Jamie Madill893ab082014-05-16 16:56:10 -0400834
Jamie Madill6c1f6712017-02-14 19:08:04 -0500835 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000836}
837
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400838void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400839{
840 // The spec specifies the underlying Fence object is not deleted until all current
841 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
842 // and since our API is currently designed for being called from a single thread, we can delete
843 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400844 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400845}
846
Yunchao Hea336b902017-08-02 16:05:21 +0800847void Context::deleteProgramPipeline(GLuint pipeline)
848{
849 if (mState.mPipelines->getProgramPipeline(pipeline))
850 {
851 detachProgramPipeline(pipeline);
852 }
853
854 mState.mPipelines->deleteObject(this, pipeline);
855}
856
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857void Context::deletePaths(GLuint first, GLsizei range)
858{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500859 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300860}
861
Brandon Jones59770802018-04-02 13:18:42 -0700862bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500864 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865 if (pathObj == nullptr)
866 return false;
867
868 return pathObj->hasPathData();
869}
870
Brandon Jones59770802018-04-02 13:18:42 -0700871bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300872{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500873 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300874}
875
Brandon Jones59770802018-04-02 13:18:42 -0700876void Context::pathCommands(GLuint path,
877 GLsizei numCommands,
878 const GLubyte *commands,
879 GLsizei numCoords,
880 GLenum coordType,
881 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500883 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884
885 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
886}
887
Jamie Madill007530e2017-12-28 14:27:04 -0500888void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300889{
Jamie Madill007530e2017-12-28 14:27:04 -0500890 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300891
892 switch (pname)
893 {
894 case GL_PATH_STROKE_WIDTH_CHROMIUM:
895 pathObj->setStrokeWidth(value);
896 break;
897 case GL_PATH_END_CAPS_CHROMIUM:
898 pathObj->setEndCaps(static_cast<GLenum>(value));
899 break;
900 case GL_PATH_JOIN_STYLE_CHROMIUM:
901 pathObj->setJoinStyle(static_cast<GLenum>(value));
902 break;
903 case GL_PATH_MITER_LIMIT_CHROMIUM:
904 pathObj->setMiterLimit(value);
905 break;
906 case GL_PATH_STROKE_BOUND_CHROMIUM:
907 pathObj->setStrokeBound(value);
908 break;
909 default:
910 UNREACHABLE();
911 break;
912 }
913}
914
Jamie Madill007530e2017-12-28 14:27:04 -0500915void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300916{
Jamie Madill007530e2017-12-28 14:27:04 -0500917 // TODO(jmadill): Should use proper clamping/casting.
918 pathParameterf(path, pname, static_cast<GLfloat>(value));
919}
920
921void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
922{
923 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300924
925 switch (pname)
926 {
927 case GL_PATH_STROKE_WIDTH_CHROMIUM:
928 *value = pathObj->getStrokeWidth();
929 break;
930 case GL_PATH_END_CAPS_CHROMIUM:
931 *value = static_cast<GLfloat>(pathObj->getEndCaps());
932 break;
933 case GL_PATH_JOIN_STYLE_CHROMIUM:
934 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
935 break;
936 case GL_PATH_MITER_LIMIT_CHROMIUM:
937 *value = pathObj->getMiterLimit();
938 break;
939 case GL_PATH_STROKE_BOUND_CHROMIUM:
940 *value = pathObj->getStrokeBound();
941 break;
942 default:
943 UNREACHABLE();
944 break;
945 }
946}
947
Jamie Madill007530e2017-12-28 14:27:04 -0500948void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
949{
950 GLfloat val = 0.0f;
951 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
952 if (value)
953 *value = static_cast<GLint>(val);
954}
955
Brandon Jones59770802018-04-02 13:18:42 -0700956void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300957{
958 mGLState.setPathStencilFunc(func, ref, mask);
959}
960
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961void Context::deleteFramebuffer(GLuint framebuffer)
962{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500963 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964 {
965 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500967
Jamie Madill6c1f6712017-02-14 19:08:04 -0500968 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000969}
970
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500971void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000972{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000974 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500975 GLuint fence = fences[i];
976
977 FenceNV *fenceObject = nullptr;
978 if (mFenceNVMap.erase(fence, &fenceObject))
979 {
980 mFenceNVHandleAllocator.release(fence);
981 delete fenceObject;
982 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983 }
984}
985
Geoff Lang70d0f492015-12-10 17:45:46 -0500986Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500988 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989}
990
Geoff Lang70d0f492015-12-10 17:45:46 -0500991Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000992{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500993 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000994}
995
Jamie Madill70b5bb02017-08-28 13:32:37 -0400996Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400997{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400998 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400999}
1000
Jamie Madill57a89722013-07-02 11:57:03 -04001001VertexArray *Context::getVertexArray(GLuint handle) const
1002{
Jamie Madill96a483b2017-06-27 16:49:21 -04001003 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001004}
1005
Jamie Madilldc356042013-07-19 16:36:57 -04001006Sampler *Context::getSampler(GLuint handle) const
1007{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001008 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001009}
1010
Geoff Langc8058452014-02-03 12:04:11 -05001011TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1012{
Jamie Madill96a483b2017-06-27 16:49:21 -04001013 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001014}
1015
Yunchao Hea336b902017-08-02 16:05:21 +08001016ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1017{
1018 return mState.mPipelines->getProgramPipeline(handle);
1019}
1020
Geoff Lang75359662018-04-11 01:42:27 -04001021gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001022{
1023 switch (identifier)
1024 {
1025 case GL_BUFFER:
1026 return getBuffer(name);
1027 case GL_SHADER:
1028 return getShader(name);
1029 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001030 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001031 case GL_VERTEX_ARRAY:
1032 return getVertexArray(name);
1033 case GL_QUERY:
1034 return getQuery(name);
1035 case GL_TRANSFORM_FEEDBACK:
1036 return getTransformFeedback(name);
1037 case GL_SAMPLER:
1038 return getSampler(name);
1039 case GL_TEXTURE:
1040 return getTexture(name);
1041 case GL_RENDERBUFFER:
1042 return getRenderbuffer(name);
1043 case GL_FRAMEBUFFER:
1044 return getFramebuffer(name);
1045 default:
1046 UNREACHABLE();
1047 return nullptr;
1048 }
1049}
1050
Geoff Lang75359662018-04-11 01:42:27 -04001051gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001052{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001053 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001054}
1055
Martin Radev9d901792016-07-15 15:58:58 +03001056void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1057{
Geoff Lang75359662018-04-11 01:42:27 -04001058 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001059 ASSERT(object != nullptr);
1060
1061 std::string labelName = GetObjectLabelFromPointer(length, label);
1062 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001063
1064 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1065 // specified object is active until we do this.
1066 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001067}
1068
1069void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1070{
Geoff Lang75359662018-04-11 01:42:27 -04001071 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001072 ASSERT(object != nullptr);
1073
1074 std::string labelName = GetObjectLabelFromPointer(length, label);
1075 object->setLabel(labelName);
1076}
1077
1078void Context::getObjectLabel(GLenum identifier,
1079 GLuint name,
1080 GLsizei bufSize,
1081 GLsizei *length,
1082 GLchar *label) const
1083{
Geoff Lang75359662018-04-11 01:42:27 -04001084 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001085 ASSERT(object != nullptr);
1086
1087 const std::string &objectLabel = object->getLabel();
1088 GetObjectLabelBase(objectLabel, bufSize, length, label);
1089}
1090
1091void Context::getObjectPtrLabel(const void *ptr,
1092 GLsizei bufSize,
1093 GLsizei *length,
1094 GLchar *label) const
1095{
Geoff Lang75359662018-04-11 01:42:27 -04001096 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001097 ASSERT(object != nullptr);
1098
1099 const std::string &objectLabel = object->getLabel();
1100 GetObjectLabelBase(objectLabel, bufSize, length, label);
1101}
1102
Jamie Madilldc356042013-07-19 16:36:57 -04001103bool Context::isSampler(GLuint samplerName) const
1104{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001105 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001106}
1107
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001108void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001109{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001110 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001111
Jamie Madilldedd7b92014-11-05 16:30:36 -05001112 if (handle == 0)
1113 {
1114 texture = mZeroTextures[target].get();
1115 }
1116 else
1117 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001118 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001119 }
1120
1121 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001122 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001123 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001124}
1125
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001126void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001127{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001128 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1129 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001130 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001131 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001132}
1133
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001134void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001135{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001136 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1137 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001138 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001139 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001140 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001141}
1142
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001143void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001144{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001145 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001146 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001147 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001148 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001149}
1150
Shao80957d92017-02-20 21:25:59 +08001151void Context::bindVertexBuffer(GLuint bindingIndex,
1152 GLuint bufferHandle,
1153 GLintptr offset,
1154 GLsizei stride)
1155{
1156 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001157 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001158 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001159}
1160
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001161void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001162{
Geoff Lang76b10c92014-09-05 16:28:14 -04001163 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001164 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001165 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001166 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001167 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001168}
1169
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001170void Context::bindImageTexture(GLuint unit,
1171 GLuint texture,
1172 GLint level,
1173 GLboolean layered,
1174 GLint layer,
1175 GLenum access,
1176 GLenum format)
1177{
1178 Texture *tex = mState.mTextures->getTexture(texture);
1179 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1180}
1181
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001182void Context::useProgram(GLuint program)
1183{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001184 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001185 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001186}
1187
Jiajia Qin5451d532017-11-16 17:16:34 +08001188void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1189{
1190 UNIMPLEMENTED();
1191}
1192
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001193void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001194{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001195 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001196 TransformFeedback *transformFeedback =
1197 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001198 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001199 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001200}
1201
Yunchao Hea336b902017-08-02 16:05:21 +08001202void Context::bindProgramPipeline(GLuint pipelineHandle)
1203{
1204 ProgramPipeline *pipeline =
1205 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1206 mGLState.setProgramPipelineBinding(this, pipeline);
1207}
1208
Corentin Wallezad3ae902018-03-09 13:40:42 -05001209void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001212 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213
Geoff Lang5aad9672014-09-08 11:10:42 -04001214 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001215 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001216
1217 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001218 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001219 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220}
1221
Corentin Wallezad3ae902018-03-09 13:40:42 -05001222void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001224 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001225 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226
Jamie Madill5188a272018-07-25 10:53:56 -04001227 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001228
Geoff Lang5aad9672014-09-08 11:10:42 -04001229 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001230 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001231 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001232}
1233
Corentin Wallezad3ae902018-03-09 13:40:42 -05001234void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001236 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001237
1238 Query *queryObject = getQuery(id, true, target);
1239 ASSERT(queryObject);
1240
Jamie Madill5188a272018-07-25 10:53:56 -04001241 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242}
1243
Corentin Wallezad3ae902018-03-09 13:40:42 -05001244void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001245{
1246 switch (pname)
1247 {
1248 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001249 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001250 break;
1251 case GL_QUERY_COUNTER_BITS_EXT:
1252 switch (target)
1253 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001254 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1256 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001257 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001258 params[0] = getExtensions().queryCounterBitsTimestamp;
1259 break;
1260 default:
1261 UNREACHABLE();
1262 params[0] = 0;
1263 break;
1264 }
1265 break;
1266 default:
1267 UNREACHABLE();
1268 return;
1269 }
1270}
1271
Corentin Wallezad3ae902018-03-09 13:40:42 -05001272void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001273 GLenum pname,
1274 GLsizei bufSize,
1275 GLsizei *length,
1276 GLint *params)
1277{
1278 getQueryiv(target, pname, params);
1279}
1280
Geoff Lang2186c382016-10-14 10:54:54 -04001281void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282{
Jamie Madill5188a272018-07-25 10:53:56 -04001283 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001284}
1285
Brandon Jones59770802018-04-02 13:18:42 -07001286void Context::getQueryObjectivRobust(GLuint id,
1287 GLenum pname,
1288 GLsizei bufSize,
1289 GLsizei *length,
1290 GLint *params)
1291{
1292 getQueryObjectiv(id, pname, params);
1293}
1294
Geoff Lang2186c382016-10-14 10:54:54 -04001295void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001296{
Jamie Madill5188a272018-07-25 10:53:56 -04001297 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001298}
1299
Brandon Jones59770802018-04-02 13:18:42 -07001300void Context::getQueryObjectuivRobust(GLuint id,
1301 GLenum pname,
1302 GLsizei bufSize,
1303 GLsizei *length,
1304 GLuint *params)
1305{
1306 getQueryObjectuiv(id, pname, params);
1307}
1308
Geoff Lang2186c382016-10-14 10:54:54 -04001309void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001310{
Jamie Madill5188a272018-07-25 10:53:56 -04001311 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001312}
1313
Brandon Jones59770802018-04-02 13:18:42 -07001314void Context::getQueryObjecti64vRobust(GLuint id,
1315 GLenum pname,
1316 GLsizei bufSize,
1317 GLsizei *length,
1318 GLint64 *params)
1319{
1320 getQueryObjecti64v(id, pname, params);
1321}
1322
Geoff Lang2186c382016-10-14 10:54:54 -04001323void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001324{
Jamie Madill5188a272018-07-25 10:53:56 -04001325 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001326}
1327
Brandon Jones59770802018-04-02 13:18:42 -07001328void Context::getQueryObjectui64vRobust(GLuint id,
1329 GLenum pname,
1330 GLsizei bufSize,
1331 GLsizei *length,
1332 GLuint64 *params)
1333{
1334 getQueryObjectui64v(id, pname, params);
1335}
1336
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001337Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001339 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340}
1341
Jamie Madill2f348d22017-06-05 10:50:59 -04001342FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343{
Jamie Madill96a483b2017-06-27 16:49:21 -04001344 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345}
1346
Corentin Wallezad3ae902018-03-09 13:40:42 -05001347Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348{
Jamie Madill96a483b2017-06-27 16:49:21 -04001349 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001351 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001353
1354 Query *query = mQueryMap.query(handle);
1355 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001356 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001357 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001358 query = new Query(mImplementation->createQuery(type), handle);
1359 query->addRef();
1360 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001362 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001363}
1364
Geoff Lang70d0f492015-12-10 17:45:46 -05001365Query *Context::getQuery(GLuint handle) const
1366{
Jamie Madill96a483b2017-06-27 16:49:21 -04001367 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001368}
1369
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001370Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001371{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001372 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1373 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001374}
1375
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001376Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001378 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001379}
1380
Geoff Lang492a7e42014-11-05 13:27:06 -05001381Compiler *Context::getCompiler() const
1382{
Jamie Madill2f348d22017-06-05 10:50:59 -04001383 if (mCompiler.get() == nullptr)
1384 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001385 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001386 }
1387 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001388}
1389
Jamie Madillc1d770e2017-04-13 17:31:24 -04001390void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001391{
1392 switch (pname)
1393 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001394 case GL_SHADER_COMPILER:
1395 *params = GL_TRUE;
1396 break;
1397 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1398 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1399 break;
1400 default:
1401 mGLState.getBooleanv(pname, params);
1402 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001404}
1405
Jamie Madillc1d770e2017-04-13 17:31:24 -04001406void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001407{
Shannon Woods53a94a82014-06-24 15:20:36 -04001408 // Queries about context capabilities and maximums are answered by Context.
1409 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001410 switch (pname)
1411 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001412 case GL_ALIASED_LINE_WIDTH_RANGE:
1413 params[0] = mCaps.minAliasedLineWidth;
1414 params[1] = mCaps.maxAliasedLineWidth;
1415 break;
1416 case GL_ALIASED_POINT_SIZE_RANGE:
1417 params[0] = mCaps.minAliasedPointSize;
1418 params[1] = mCaps.maxAliasedPointSize;
1419 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001420 case GL_SMOOTH_POINT_SIZE_RANGE:
1421 params[0] = mCaps.minSmoothPointSize;
1422 params[1] = mCaps.maxSmoothPointSize;
1423 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001424 case GL_SMOOTH_LINE_WIDTH_RANGE:
1425 params[0] = mCaps.minSmoothLineWidth;
1426 params[1] = mCaps.maxSmoothLineWidth;
1427 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001428 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1429 ASSERT(mExtensions.textureFilterAnisotropic);
1430 *params = mExtensions.maxTextureAnisotropy;
1431 break;
1432 case GL_MAX_TEXTURE_LOD_BIAS:
1433 *params = mCaps.maxLODBias;
1434 break;
1435
1436 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1437 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1438 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001439 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1440 // GLES1 constants for modelview/projection matrix.
1441 if (getClientVersion() < Version(2, 0))
1442 {
1443 mGLState.getFloatv(pname, params);
1444 }
1445 else
1446 {
1447 ASSERT(mExtensions.pathRendering);
1448 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1449 memcpy(params, m, 16 * sizeof(GLfloat));
1450 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001452 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001453
Jamie Madill231c7f52017-04-26 13:45:37 -04001454 default:
1455 mGLState.getFloatv(pname, params);
1456 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001457 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458}
1459
Jamie Madillc1d770e2017-04-13 17:31:24 -04001460void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001461{
Shannon Woods53a94a82014-06-24 15:20:36 -04001462 // Queries about context capabilities and maximums are answered by Context.
1463 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001464
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001465 switch (pname)
1466 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001467 case GL_MAX_VERTEX_ATTRIBS:
1468 *params = mCaps.maxVertexAttributes;
1469 break;
1470 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1471 *params = mCaps.maxVertexUniformVectors;
1472 break;
1473 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001474 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001475 break;
1476 case GL_MAX_VARYING_VECTORS:
1477 *params = mCaps.maxVaryingVectors;
1478 break;
1479 case GL_MAX_VARYING_COMPONENTS:
1480 *params = mCaps.maxVertexOutputComponents;
1481 break;
1482 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1483 *params = mCaps.maxCombinedTextureImageUnits;
1484 break;
1485 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001486 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001489 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001490 break;
1491 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1492 *params = mCaps.maxFragmentUniformVectors;
1493 break;
1494 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001495 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001496 break;
1497 case GL_MAX_RENDERBUFFER_SIZE:
1498 *params = mCaps.maxRenderbufferSize;
1499 break;
1500 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1501 *params = mCaps.maxColorAttachments;
1502 break;
1503 case GL_MAX_DRAW_BUFFERS_EXT:
1504 *params = mCaps.maxDrawBuffers;
1505 break;
1506 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1507 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1508 case GL_SUBPIXEL_BITS:
1509 *params = 4;
1510 break;
1511 case GL_MAX_TEXTURE_SIZE:
1512 *params = mCaps.max2DTextureSize;
1513 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001514 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1515 *params = mCaps.maxRectangleTextureSize;
1516 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001517 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1518 *params = mCaps.maxCubeMapTextureSize;
1519 break;
1520 case GL_MAX_3D_TEXTURE_SIZE:
1521 *params = mCaps.max3DTextureSize;
1522 break;
1523 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1524 *params = mCaps.maxArrayTextureLayers;
1525 break;
1526 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1527 *params = mCaps.uniformBufferOffsetAlignment;
1528 break;
1529 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1530 *params = mCaps.maxUniformBufferBindings;
1531 break;
1532 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001533 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001534 break;
1535 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001536 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001537 break;
1538 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1539 *params = mCaps.maxCombinedTextureImageUnits;
1540 break;
1541 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1542 *params = mCaps.maxVertexOutputComponents;
1543 break;
1544 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1545 *params = mCaps.maxFragmentInputComponents;
1546 break;
1547 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1548 *params = mCaps.minProgramTexelOffset;
1549 break;
1550 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1551 *params = mCaps.maxProgramTexelOffset;
1552 break;
1553 case GL_MAJOR_VERSION:
1554 *params = getClientVersion().major;
1555 break;
1556 case GL_MINOR_VERSION:
1557 *params = getClientVersion().minor;
1558 break;
1559 case GL_MAX_ELEMENTS_INDICES:
1560 *params = mCaps.maxElementsIndices;
1561 break;
1562 case GL_MAX_ELEMENTS_VERTICES:
1563 *params = mCaps.maxElementsVertices;
1564 break;
1565 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1566 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1567 break;
1568 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1569 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1570 break;
1571 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1572 *params = mCaps.maxTransformFeedbackSeparateComponents;
1573 break;
1574 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1575 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1576 break;
1577 case GL_MAX_SAMPLES_ANGLE:
1578 *params = mCaps.maxSamples;
1579 break;
1580 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001581 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001582 params[0] = mCaps.maxViewportWidth;
1583 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001584 }
1585 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001586 case GL_COMPRESSED_TEXTURE_FORMATS:
1587 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1588 params);
1589 break;
1590 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1591 *params = mResetStrategy;
1592 break;
1593 case GL_NUM_SHADER_BINARY_FORMATS:
1594 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1595 break;
1596 case GL_SHADER_BINARY_FORMATS:
1597 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1598 break;
1599 case GL_NUM_PROGRAM_BINARY_FORMATS:
1600 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1601 break;
1602 case GL_PROGRAM_BINARY_FORMATS:
1603 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1604 break;
1605 case GL_NUM_EXTENSIONS:
1606 *params = static_cast<GLint>(mExtensionStrings.size());
1607 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001608
Geoff Lang38f24ee2018-10-01 13:04:59 -04001609 // GL_ANGLE_request_extension
1610 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1611 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1612 break;
1613
Jamie Madill231c7f52017-04-26 13:45:37 -04001614 // GL_KHR_debug
1615 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1616 *params = mExtensions.maxDebugMessageLength;
1617 break;
1618 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1619 *params = mExtensions.maxDebugLoggedMessages;
1620 break;
1621 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1622 *params = mExtensions.maxDebugGroupStackDepth;
1623 break;
1624 case GL_MAX_LABEL_LENGTH:
1625 *params = mExtensions.maxLabelLength;
1626 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001627
Martin Radeve5285d22017-07-14 16:23:53 +03001628 // GL_ANGLE_multiview
1629 case GL_MAX_VIEWS_ANGLE:
1630 *params = mExtensions.maxViews;
1631 break;
1632
Jamie Madill231c7f52017-04-26 13:45:37 -04001633 // GL_EXT_disjoint_timer_query
1634 case GL_GPU_DISJOINT_EXT:
1635 *params = mImplementation->getGPUDisjoint();
1636 break;
1637 case GL_MAX_FRAMEBUFFER_WIDTH:
1638 *params = mCaps.maxFramebufferWidth;
1639 break;
1640 case GL_MAX_FRAMEBUFFER_HEIGHT:
1641 *params = mCaps.maxFramebufferHeight;
1642 break;
1643 case GL_MAX_FRAMEBUFFER_SAMPLES:
1644 *params = mCaps.maxFramebufferSamples;
1645 break;
1646 case GL_MAX_SAMPLE_MASK_WORDS:
1647 *params = mCaps.maxSampleMaskWords;
1648 break;
1649 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1650 *params = mCaps.maxColorTextureSamples;
1651 break;
1652 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1653 *params = mCaps.maxDepthTextureSamples;
1654 break;
1655 case GL_MAX_INTEGER_SAMPLES:
1656 *params = mCaps.maxIntegerSamples;
1657 break;
1658 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1659 *params = mCaps.maxVertexAttribRelativeOffset;
1660 break;
1661 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1662 *params = mCaps.maxVertexAttribBindings;
1663 break;
1664 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1665 *params = mCaps.maxVertexAttribStride;
1666 break;
1667 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001668 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001672 break;
1673 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001674 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001677 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001680 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001681 break;
1682 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001686 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001689 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001690 break;
1691 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1692 *params = mCaps.minProgramTextureGatherOffset;
1693 break;
1694 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1695 *params = mCaps.maxProgramTextureGatherOffset;
1696 break;
1697 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1698 *params = mCaps.maxComputeWorkGroupInvocations;
1699 break;
1700 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001701 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
1703 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001704 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001705 break;
1706 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1707 *params = mCaps.maxComputeSharedMemorySize;
1708 break;
1709 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001710 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001711 break;
1712 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001714 break;
1715 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001716 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001720 break;
1721 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001722 *params =
1723 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001724 break;
1725 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001726 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001727 break;
1728 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1729 *params = mCaps.maxCombinedShaderOutputResources;
1730 break;
1731 case GL_MAX_UNIFORM_LOCATIONS:
1732 *params = mCaps.maxUniformLocations;
1733 break;
1734 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1735 *params = mCaps.maxAtomicCounterBufferBindings;
1736 break;
1737 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1738 *params = mCaps.maxAtomicCounterBufferSize;
1739 break;
1740 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1741 *params = mCaps.maxCombinedAtomicCounterBuffers;
1742 break;
1743 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1744 *params = mCaps.maxCombinedAtomicCounters;
1745 break;
1746 case GL_MAX_IMAGE_UNITS:
1747 *params = mCaps.maxImageUnits;
1748 break;
1749 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1750 *params = mCaps.maxCombinedImageUniforms;
1751 break;
1752 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1753 *params = mCaps.maxShaderStorageBufferBindings;
1754 break;
1755 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1756 *params = mCaps.maxCombinedShaderStorageBlocks;
1757 break;
1758 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1759 *params = mCaps.shaderStorageBufferOffsetAlignment;
1760 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001761
1762 // GL_EXT_geometry_shader
1763 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1764 *params = mCaps.maxFramebufferLayers;
1765 break;
1766 case GL_LAYER_PROVOKING_VERTEX_EXT:
1767 *params = mCaps.layerProvokingVertex;
1768 break;
1769 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001770 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001773 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001774 break;
1775 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001776 *params =
1777 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001778 break;
1779 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1780 *params = mCaps.maxGeometryInputComponents;
1781 break;
1782 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1783 *params = mCaps.maxGeometryOutputComponents;
1784 break;
1785 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1786 *params = mCaps.maxGeometryOutputVertices;
1787 break;
1788 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1789 *params = mCaps.maxGeometryTotalOutputComponents;
1790 break;
1791 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1792 *params = mCaps.maxGeometryShaderInvocations;
1793 break;
1794 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001795 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001796 break;
1797 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001798 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001799 break;
1800 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001801 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001802 break;
1803 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001804 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001805 break;
1806 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001807 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001808 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001809 // GLES1 emulation: Caps queries
1810 case GL_MAX_TEXTURE_UNITS:
1811 *params = mCaps.maxMultitextureUnits;
1812 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001813 case GL_MAX_MODELVIEW_STACK_DEPTH:
1814 *params = mCaps.maxModelviewMatrixStackDepth;
1815 break;
1816 case GL_MAX_PROJECTION_STACK_DEPTH:
1817 *params = mCaps.maxProjectionMatrixStackDepth;
1818 break;
1819 case GL_MAX_TEXTURE_STACK_DEPTH:
1820 *params = mCaps.maxTextureMatrixStackDepth;
1821 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001822 case GL_MAX_LIGHTS:
1823 *params = mCaps.maxLights;
1824 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001825 case GL_MAX_CLIP_PLANES:
1826 *params = mCaps.maxClipPlanes;
1827 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001828 // GLES1 emulation: Vertex attribute queries
1829 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1830 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1831 case GL_COLOR_ARRAY_BUFFER_BINDING:
1832 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1833 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1834 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1835 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1836 break;
1837 case GL_VERTEX_ARRAY_STRIDE:
1838 case GL_NORMAL_ARRAY_STRIDE:
1839 case GL_COLOR_ARRAY_STRIDE:
1840 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1841 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1842 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1843 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1844 break;
1845 case GL_VERTEX_ARRAY_SIZE:
1846 case GL_COLOR_ARRAY_SIZE:
1847 case GL_TEXTURE_COORD_ARRAY_SIZE:
1848 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1849 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1850 break;
1851 case GL_VERTEX_ARRAY_TYPE:
1852 case GL_COLOR_ARRAY_TYPE:
1853 case GL_NORMAL_ARRAY_TYPE:
1854 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1855 case GL_TEXTURE_COORD_ARRAY_TYPE:
1856 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1857 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1858 break;
1859
jchen1082af6202018-06-22 10:59:52 +08001860 // GL_KHR_parallel_shader_compile
1861 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1862 *params = mGLState.getMaxShaderCompilerThreads();
1863 break;
1864
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001865 // GL_EXT_blend_func_extended
1866 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1867 *params = mExtensions.maxDualSourceDrawBuffers;
1868 break;
1869
Jamie Madill231c7f52017-04-26 13:45:37 -04001870 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001871 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001872 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001873 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001874}
1875
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001876void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001877{
Shannon Woods53a94a82014-06-24 15:20:36 -04001878 // Queries about context capabilities and maximums are answered by Context.
1879 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001880 switch (pname)
1881 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001882 case GL_MAX_ELEMENT_INDEX:
1883 *params = mCaps.maxElementIndex;
1884 break;
1885 case GL_MAX_UNIFORM_BLOCK_SIZE:
1886 *params = mCaps.maxUniformBlockSize;
1887 break;
1888 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001889 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001890 break;
1891 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001892 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001893 break;
1894 case GL_MAX_SERVER_WAIT_TIMEOUT:
1895 *params = mCaps.maxServerWaitTimeout;
1896 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001897
Jamie Madill231c7f52017-04-26 13:45:37 -04001898 // GL_EXT_disjoint_timer_query
1899 case GL_TIMESTAMP_EXT:
1900 *params = mImplementation->getTimestamp();
1901 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001902
Jamie Madill231c7f52017-04-26 13:45:37 -04001903 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1904 *params = mCaps.maxShaderStorageBlockSize;
1905 break;
1906 default:
1907 UNREACHABLE();
1908 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001909 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001910}
1911
Geoff Lang70d0f492015-12-10 17:45:46 -05001912void Context::getPointerv(GLenum pname, void **params) const
1913{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001914 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001915}
1916
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001917void Context::getPointervRobustANGLERobust(GLenum pname,
1918 GLsizei bufSize,
1919 GLsizei *length,
1920 void **params)
1921{
1922 UNIMPLEMENTED();
1923}
1924
Martin Radev66fb8202016-07-28 11:45:20 +03001925void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001926{
Shannon Woods53a94a82014-06-24 15:20:36 -04001927 // Queries about context capabilities and maximums are answered by Context.
1928 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001929
1930 GLenum nativeType;
1931 unsigned int numParams;
1932 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1933 ASSERT(queryStatus);
1934
1935 if (nativeType == GL_INT)
1936 {
1937 switch (target)
1938 {
1939 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1940 ASSERT(index < 3u);
1941 *data = mCaps.maxComputeWorkGroupCount[index];
1942 break;
1943 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1944 ASSERT(index < 3u);
1945 *data = mCaps.maxComputeWorkGroupSize[index];
1946 break;
1947 default:
1948 mGLState.getIntegeri_v(target, index, data);
1949 }
1950 }
1951 else
1952 {
1953 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1954 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001955}
1956
Brandon Jones59770802018-04-02 13:18:42 -07001957void Context::getIntegeri_vRobust(GLenum target,
1958 GLuint index,
1959 GLsizei bufSize,
1960 GLsizei *length,
1961 GLint *data)
1962{
1963 getIntegeri_v(target, index, data);
1964}
1965
Martin Radev66fb8202016-07-28 11:45:20 +03001966void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001967{
Shannon Woods53a94a82014-06-24 15:20:36 -04001968 // Queries about context capabilities and maximums are answered by Context.
1969 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001970
1971 GLenum nativeType;
1972 unsigned int numParams;
1973 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1974 ASSERT(queryStatus);
1975
1976 if (nativeType == GL_INT_64_ANGLEX)
1977 {
1978 mGLState.getInteger64i_v(target, index, data);
1979 }
1980 else
1981 {
1982 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1983 }
1984}
1985
Brandon Jones59770802018-04-02 13:18:42 -07001986void Context::getInteger64i_vRobust(GLenum target,
1987 GLuint index,
1988 GLsizei bufSize,
1989 GLsizei *length,
1990 GLint64 *data)
1991{
1992 getInteger64i_v(target, index, data);
1993}
1994
Martin Radev66fb8202016-07-28 11:45:20 +03001995void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1996{
1997 // Queries about context capabilities and maximums are answered by Context.
1998 // Queries about current GL state values are answered by State.
1999
2000 GLenum nativeType;
2001 unsigned int numParams;
2002 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2003 ASSERT(queryStatus);
2004
2005 if (nativeType == GL_BOOL)
2006 {
2007 mGLState.getBooleani_v(target, index, data);
2008 }
2009 else
2010 {
2011 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2012 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002013}
2014
Brandon Jones59770802018-04-02 13:18:42 -07002015void Context::getBooleani_vRobust(GLenum target,
2016 GLuint index,
2017 GLsizei bufSize,
2018 GLsizei *length,
2019 GLboolean *data)
2020{
2021 getBooleani_v(target, index, data);
2022}
2023
Corentin Wallez336129f2017-10-17 15:55:40 -04002024void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002025{
2026 Buffer *buffer = mGLState.getTargetBuffer(target);
2027 QueryBufferParameteriv(buffer, pname, params);
2028}
2029
Brandon Jones59770802018-04-02 13:18:42 -07002030void Context::getBufferParameterivRobust(BufferBinding target,
2031 GLenum pname,
2032 GLsizei bufSize,
2033 GLsizei *length,
2034 GLint *params)
2035{
2036 getBufferParameteriv(target, pname, params);
2037}
2038
He Yunchao010e4db2017-03-03 14:22:06 +08002039void Context::getFramebufferAttachmentParameteriv(GLenum target,
2040 GLenum attachment,
2041 GLenum pname,
2042 GLint *params)
2043{
2044 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002045 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002046}
2047
Brandon Jones59770802018-04-02 13:18:42 -07002048void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2049 GLenum attachment,
2050 GLenum pname,
2051 GLsizei bufSize,
2052 GLsizei *length,
2053 GLint *params)
2054{
2055 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2056}
2057
He Yunchao010e4db2017-03-03 14:22:06 +08002058void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2059{
2060 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2061 QueryRenderbufferiv(this, renderbuffer, pname, params);
2062}
2063
Brandon Jones59770802018-04-02 13:18:42 -07002064void Context::getRenderbufferParameterivRobust(GLenum target,
2065 GLenum pname,
2066 GLsizei bufSize,
2067 GLsizei *length,
2068 GLint *params)
2069{
2070 getRenderbufferParameteriv(target, pname, params);
2071}
2072
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002073void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002074{
2075 Texture *texture = getTargetTexture(target);
2076 QueryTexParameterfv(texture, pname, params);
2077}
2078
Brandon Jones59770802018-04-02 13:18:42 -07002079void Context::getTexParameterfvRobust(TextureType target,
2080 GLenum pname,
2081 GLsizei bufSize,
2082 GLsizei *length,
2083 GLfloat *params)
2084{
2085 getTexParameterfv(target, pname, params);
2086}
2087
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002088void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002089{
2090 Texture *texture = getTargetTexture(target);
2091 QueryTexParameteriv(texture, pname, params);
2092}
Jiajia Qin5451d532017-11-16 17:16:34 +08002093
Brandon Jones59770802018-04-02 13:18:42 -07002094void Context::getTexParameterivRobust(TextureType target,
2095 GLenum pname,
2096 GLsizei bufSize,
2097 GLsizei *length,
2098 GLint *params)
2099{
2100 getTexParameteriv(target, pname, params);
2101}
2102
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002103void Context::getTexParameterIivRobust(TextureType target,
2104 GLenum pname,
2105 GLsizei bufSize,
2106 GLsizei *length,
2107 GLint *params)
2108{
2109 UNIMPLEMENTED();
2110}
2111
2112void Context::getTexParameterIuivRobust(TextureType target,
2113 GLenum pname,
2114 GLsizei bufSize,
2115 GLsizei *length,
2116 GLuint *params)
2117{
2118 UNIMPLEMENTED();
2119}
2120
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002121void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002122{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002123 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002124 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002125}
2126
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002127void Context::getTexLevelParameterivRobust(TextureTarget target,
2128 GLint level,
2129 GLenum pname,
2130 GLsizei bufSize,
2131 GLsizei *length,
2132 GLint *params)
2133{
2134 UNIMPLEMENTED();
2135}
2136
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002137void Context::getTexLevelParameterfv(TextureTarget target,
2138 GLint level,
2139 GLenum pname,
2140 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002141{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002142 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002143 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002144}
2145
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002146void Context::getTexLevelParameterfvRobust(TextureTarget target,
2147 GLint level,
2148 GLenum pname,
2149 GLsizei bufSize,
2150 GLsizei *length,
2151 GLfloat *params)
2152{
2153 UNIMPLEMENTED();
2154}
2155
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002156void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002157{
2158 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002159 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002160 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002161}
2162
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002163void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002164{
2165 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002166 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002167 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002168}
2169
Brandon Jones59770802018-04-02 13:18:42 -07002170void Context::texParameterfvRobust(TextureType target,
2171 GLenum pname,
2172 GLsizei bufSize,
2173 const GLfloat *params)
2174{
2175 texParameterfv(target, pname, params);
2176}
2177
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002178void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002179{
2180 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002181 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002182 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002183}
2184
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002185void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002186{
2187 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002188 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002189 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002190}
2191
Brandon Jones59770802018-04-02 13:18:42 -07002192void Context::texParameterivRobust(TextureType target,
2193 GLenum pname,
2194 GLsizei bufSize,
2195 const GLint *params)
2196{
2197 texParameteriv(target, pname, params);
2198}
2199
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002200void Context::texParameterIivRobust(TextureType target,
2201 GLenum pname,
2202 GLsizei bufSize,
2203 const GLint *params)
2204{
2205 UNIMPLEMENTED();
2206}
2207
2208void Context::texParameterIuivRobust(TextureType target,
2209 GLenum pname,
2210 GLsizei bufSize,
2211 const GLuint *params)
2212{
2213 UNIMPLEMENTED();
2214}
2215
Jamie Madill493f9572018-05-24 19:52:15 -04002216void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002217{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002218 // No-op if count draws no primitives for given mode
2219 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002220 {
2221 return;
2222 }
2223
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002224 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002225 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002226 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002227}
2228
Jamie Madill493f9572018-05-24 19:52:15 -04002229void Context::drawArraysInstanced(PrimitiveMode mode,
2230 GLint first,
2231 GLsizei count,
2232 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002233{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002234 // No-op if count draws no primitives for given mode
2235 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002236 {
2237 return;
2238 }
2239
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002240 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002241 ANGLE_CONTEXT_TRY(
2242 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002243 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2244 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002245}
2246
Jamie Madill493f9572018-05-24 19:52:15 -04002247void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002248{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002249 // No-op if count draws no primitives for given mode
2250 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002251 {
2252 return;
2253 }
2254
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002255 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002256 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002257}
2258
Jamie Madill493f9572018-05-24 19:52:15 -04002259void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002260 GLsizei count,
2261 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002262 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002263 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002264{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002265 // No-op if count draws no primitives for given mode
2266 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002267 {
2268 return;
2269 }
2270
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002271 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002272 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002273 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002274}
2275
Jamie Madill493f9572018-05-24 19:52:15 -04002276void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002277 GLuint start,
2278 GLuint end,
2279 GLsizei count,
2280 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002281 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002282{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002283 // No-op if count draws no primitives for given mode
2284 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002285 {
2286 return;
2287 }
2288
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002289 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002290 ANGLE_CONTEXT_TRY(
2291 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002292}
2293
Jamie Madill493f9572018-05-24 19:52:15 -04002294void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002295{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002296 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002297 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002298}
2299
Jamie Madill493f9572018-05-24 19:52:15 -04002300void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002301{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002302 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002303 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002304}
2305
Jamie Madill675fe712016-12-19 13:07:54 -05002306void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002307{
Jamie Madillafa02a22017-11-23 12:57:38 -05002308 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002309}
2310
Jamie Madill675fe712016-12-19 13:07:54 -05002311void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002312{
Jamie Madillafa02a22017-11-23 12:57:38 -05002313 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002314}
2315
Austin Kinross6ee1e782015-05-29 17:05:37 -07002316void Context::insertEventMarker(GLsizei length, const char *marker)
2317{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002318 ASSERT(mImplementation);
2319 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002320}
2321
2322void Context::pushGroupMarker(GLsizei length, const char *marker)
2323{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002324 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002325
2326 if (marker == nullptr)
2327 {
2328 // From the EXT_debug_marker spec,
2329 // "If <marker> is null then an empty string is pushed on the stack."
2330 mImplementation->pushGroupMarker(length, "");
2331 }
2332 else
2333 {
2334 mImplementation->pushGroupMarker(length, marker);
2335 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002336}
2337
2338void Context::popGroupMarker()
2339{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002340 ASSERT(mImplementation);
2341 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002342}
2343
Geoff Langd8605522016-04-13 10:19:12 -04002344void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2345{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002346 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002347 ASSERT(programObject);
2348
2349 programObject->bindUniformLocation(location, name);
2350}
2351
Brandon Jones59770802018-04-02 13:18:42 -07002352void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002353{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002354 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002355}
2356
Brandon Jones59770802018-04-02 13:18:42 -07002357void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002358{
2359 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2360}
2361
Brandon Jones59770802018-04-02 13:18:42 -07002362void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002363{
2364 GLfloat I[16];
2365 angle::Matrix<GLfloat>::setToIdentity(I);
2366
2367 mGLState.loadPathRenderingMatrix(matrixMode, I);
2368}
2369
2370void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2371{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002372 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002373 if (!pathObj)
2374 return;
2375
Geoff Lang9bf86f02018-07-26 11:46:34 -04002376 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002377
2378 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2379}
2380
2381void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2382{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002383 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002384 if (!pathObj)
2385 return;
2386
Geoff Lang9bf86f02018-07-26 11:46:34 -04002387 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002388
2389 mImplementation->stencilStrokePath(pathObj, reference, mask);
2390}
2391
2392void Context::coverFillPath(GLuint path, GLenum coverMode)
2393{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002394 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002395 if (!pathObj)
2396 return;
2397
Geoff Lang9bf86f02018-07-26 11:46:34 -04002398 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002399
2400 mImplementation->coverFillPath(pathObj, coverMode);
2401}
2402
2403void Context::coverStrokePath(GLuint path, GLenum coverMode)
2404{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002405 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002406 if (!pathObj)
2407 return;
2408
Geoff Lang9bf86f02018-07-26 11:46:34 -04002409 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002410
2411 mImplementation->coverStrokePath(pathObj, coverMode);
2412}
2413
2414void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2415{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002416 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002417 if (!pathObj)
2418 return;
2419
Geoff Lang9bf86f02018-07-26 11:46:34 -04002420 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002421
2422 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2423}
2424
2425void Context::stencilThenCoverStrokePath(GLuint path,
2426 GLint reference,
2427 GLuint mask,
2428 GLenum coverMode)
2429{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002430 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002431 if (!pathObj)
2432 return;
2433
Geoff Lang9bf86f02018-07-26 11:46:34 -04002434 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002435
2436 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2437}
2438
Sami Väisänend59ca052016-06-21 16:10:00 +03002439void Context::coverFillPathInstanced(GLsizei numPaths,
2440 GLenum pathNameType,
2441 const void *paths,
2442 GLuint pathBase,
2443 GLenum coverMode,
2444 GLenum transformType,
2445 const GLfloat *transformValues)
2446{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002447 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002448
Geoff Lang9bf86f02018-07-26 11:46:34 -04002449 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002450
2451 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2452}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002453
Sami Väisänend59ca052016-06-21 16:10:00 +03002454void Context::coverStrokePathInstanced(GLsizei numPaths,
2455 GLenum pathNameType,
2456 const void *paths,
2457 GLuint pathBase,
2458 GLenum coverMode,
2459 GLenum transformType,
2460 const GLfloat *transformValues)
2461{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002462 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002463
2464 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002465 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002466
2467 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2468 transformValues);
2469}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002470
Sami Väisänend59ca052016-06-21 16:10:00 +03002471void Context::stencilFillPathInstanced(GLsizei numPaths,
2472 GLenum pathNameType,
2473 const void *paths,
2474 GLuint pathBase,
2475 GLenum fillMode,
2476 GLuint mask,
2477 GLenum transformType,
2478 const GLfloat *transformValues)
2479{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002480 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002481
2482 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002483 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002484
2485 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2486 transformValues);
2487}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002488
Sami Väisänend59ca052016-06-21 16:10:00 +03002489void Context::stencilStrokePathInstanced(GLsizei numPaths,
2490 GLenum pathNameType,
2491 const void *paths,
2492 GLuint pathBase,
2493 GLint reference,
2494 GLuint mask,
2495 GLenum transformType,
2496 const GLfloat *transformValues)
2497{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002498 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002499
Geoff Lang9bf86f02018-07-26 11:46:34 -04002500 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002501
2502 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2503 transformValues);
2504}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002505
Sami Väisänend59ca052016-06-21 16:10:00 +03002506void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2507 GLenum pathNameType,
2508 const void *paths,
2509 GLuint pathBase,
2510 GLenum fillMode,
2511 GLuint mask,
2512 GLenum coverMode,
2513 GLenum transformType,
2514 const GLfloat *transformValues)
2515{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002516 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002517
Geoff Lang9bf86f02018-07-26 11:46:34 -04002518 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002519
2520 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2521 transformType, transformValues);
2522}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002523
Sami Väisänend59ca052016-06-21 16:10:00 +03002524void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2525 GLenum pathNameType,
2526 const void *paths,
2527 GLuint pathBase,
2528 GLint reference,
2529 GLuint mask,
2530 GLenum coverMode,
2531 GLenum transformType,
2532 const GLfloat *transformValues)
2533{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002534 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002535
Geoff Lang9bf86f02018-07-26 11:46:34 -04002536 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002537
2538 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2539 transformType, transformValues);
2540}
2541
Sami Väisänen46eaa942016-06-29 10:26:37 +03002542void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2543{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002544 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002545
2546 programObject->bindFragmentInputLocation(location, name);
2547}
2548
2549void Context::programPathFragmentInputGen(GLuint program,
2550 GLint location,
2551 GLenum genMode,
2552 GLint components,
2553 const GLfloat *coeffs)
2554{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002555 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002556
jchen103fd614d2018-08-13 12:21:58 +08002557 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002558}
2559
jchen1015015f72017-03-16 13:54:21 +08002560GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2561{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002562 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002563 return QueryProgramResourceIndex(programObject, programInterface, name);
2564}
2565
jchen10fd7c3b52017-03-21 15:36:03 +08002566void Context::getProgramResourceName(GLuint program,
2567 GLenum programInterface,
2568 GLuint index,
2569 GLsizei bufSize,
2570 GLsizei *length,
2571 GLchar *name)
2572{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002573 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002574 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2575}
2576
jchen10191381f2017-04-11 13:59:04 +08002577GLint Context::getProgramResourceLocation(GLuint program,
2578 GLenum programInterface,
2579 const GLchar *name)
2580{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002581 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002582 return QueryProgramResourceLocation(programObject, programInterface, name);
2583}
2584
jchen10880683b2017-04-12 16:21:55 +08002585void Context::getProgramResourceiv(GLuint program,
2586 GLenum programInterface,
2587 GLuint index,
2588 GLsizei propCount,
2589 const GLenum *props,
2590 GLsizei bufSize,
2591 GLsizei *length,
2592 GLint *params)
2593{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002594 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002595 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2596 length, params);
2597}
2598
jchen10d9cd7b72017-08-30 15:04:25 +08002599void Context::getProgramInterfaceiv(GLuint program,
2600 GLenum programInterface,
2601 GLenum pname,
2602 GLint *params)
2603{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002604 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002605 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2606}
2607
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002608void Context::getProgramInterfaceivRobust(GLuint program,
2609 GLenum programInterface,
2610 GLenum pname,
2611 GLsizei bufSize,
2612 GLsizei *length,
2613 GLint *params)
2614{
2615 UNIMPLEMENTED();
2616}
2617
Jamie Madill306b6c12018-07-27 08:12:49 -04002618void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002619{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002620 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002621}
2622
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002623void Context::handleError(GLenum errorCode,
2624 const char *message,
2625 const char *file,
2626 const char *function,
2627 unsigned int line)
2628{
2629 mErrors.handleError(errorCode, message, file, function, line);
2630}
2631
Jamie Madilla139f012018-10-10 16:13:03 -04002632void Context::validationError(GLenum errorCode, const char *message)
2633{
2634 mErrors.validationError(errorCode, message);
2635}
2636
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002637// Get one of the recorded errors and clear its flag, if any.
2638// [OpenGL ES 2.0.24] section 2.5 page 13.
2639GLenum Context::getError()
2640{
Geoff Langda5777c2014-07-11 09:52:58 -04002641 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002642 {
Geoff Langda5777c2014-07-11 09:52:58 -04002643 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002644 }
Geoff Langda5777c2014-07-11 09:52:58 -04002645 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002646 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002647 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002648 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002649}
2650
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002651// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002652void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002653{
2654 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002655 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002656 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002657 mContextLostForced = true;
2658 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002659 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002660}
2661
Jamie Madillfa920eb2018-01-04 11:45:50 -05002662GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002663{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002664 // Even if the application doesn't want to know about resets, we want to know
2665 // as it will allow us to skip all the calls.
2666 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002668 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002669 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002671 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002672
2673 // EXT_robustness, section 2.6: If the reset notification behavior is
2674 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2675 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2676 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002677 }
2678
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2680 // status should be returned at least once, and GL_NO_ERROR should be returned
2681 // once the device has finished resetting.
2682 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002683 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002684 ASSERT(mResetStatus == GL_NO_ERROR);
2685 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002686
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002688 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002690 }
2691 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002692 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002693 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002694 // If markContextLost was used to mark the context lost then
2695 // assume that is not recoverable, and continue to report the
2696 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002697 mResetStatus = mImplementation->getResetStatus();
2698 }
Jamie Madill893ab082014-05-16 16:56:10 -04002699
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002700 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002701}
2702
2703bool Context::isResetNotificationEnabled()
2704{
2705 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2706}
2707
Corentin Walleze3b10e82015-05-20 11:06:25 -04002708const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002709{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002710 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002711}
2712
2713EGLenum Context::getClientType() const
2714{
2715 return mClientType;
2716}
2717
2718EGLenum Context::getRenderBuffer() const
2719{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002720 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2721 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002722 {
2723 return EGL_NONE;
2724 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002725
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002726 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002727 ASSERT(backAttachment != nullptr);
2728 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002729}
2730
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002731VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002732{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002733 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002734 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2735 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002736 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002737 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2738 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002739
Jamie Madill96a483b2017-06-27 16:49:21 -04002740 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002741 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002742
2743 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002744}
2745
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002746TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002747{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002748 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002749 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2750 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002751 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002752 transformFeedback =
2753 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002754 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002755 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002756 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002757
2758 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002759}
2760
2761bool Context::isVertexArrayGenerated(GLuint vertexArray)
2762{
Jamie Madill96a483b2017-06-27 16:49:21 -04002763 ASSERT(mVertexArrayMap.contains(0));
2764 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002765}
2766
2767bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2768{
Jamie Madill96a483b2017-06-27 16:49:21 -04002769 ASSERT(mTransformFeedbackMap.contains(0));
2770 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002771}
2772
Shannon Woods53a94a82014-06-24 15:20:36 -04002773void Context::detachTexture(GLuint texture)
2774{
2775 // Simple pass-through to State's detachTexture method, as textures do not require
2776 // allocation map management either here or in the resource manager at detach time.
2777 // Zero textures are held by the Context, and we don't attempt to request them from
2778 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002779 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002780}
2781
James Darpinian4d9d4832018-03-13 12:43:28 -07002782void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002783{
Yuly Novikov5807a532015-12-03 13:01:22 -05002784 // Simple pass-through to State's detachBuffer method, since
2785 // only buffer attachments to container objects that are bound to the current context
2786 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002787
Yuly Novikov5807a532015-12-03 13:01:22 -05002788 // [OpenGL ES 3.2] section 5.1.2 page 45:
2789 // Attachments to unbound container objects, such as
2790 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2791 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002792 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002793}
2794
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002795void Context::detachFramebuffer(GLuint framebuffer)
2796{
Shannon Woods53a94a82014-06-24 15:20:36 -04002797 // Framebuffer detachment is handled by Context, because 0 is a valid
2798 // Framebuffer object, and a pointer to it must be passed from Context
2799 // to State at binding time.
2800
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002801 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002802 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2803 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2804 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002805
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002806 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002807 {
2808 bindReadFramebuffer(0);
2809 }
2810
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002811 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002812 {
2813 bindDrawFramebuffer(0);
2814 }
2815}
2816
2817void Context::detachRenderbuffer(GLuint renderbuffer)
2818{
Jamie Madilla02315b2017-02-23 14:14:47 -05002819 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002820}
2821
Jamie Madill57a89722013-07-02 11:57:03 -04002822void Context::detachVertexArray(GLuint vertexArray)
2823{
Jamie Madill77a72f62015-04-14 11:18:32 -04002824 // Vertex array detachment is handled by Context, because 0 is a valid
2825 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002826 // binding time.
2827
Jamie Madill57a89722013-07-02 11:57:03 -04002828 // [OpenGL ES 3.0.2] section 2.10 page 43:
2829 // If a vertex array object that is currently bound is deleted, the binding
2830 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002831 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002832 {
2833 bindVertexArray(0);
2834 }
2835}
2836
Geoff Langc8058452014-02-03 12:04:11 -05002837void Context::detachTransformFeedback(GLuint transformFeedback)
2838{
Corentin Walleza2257da2016-04-19 16:43:12 -04002839 // Transform feedback detachment is handled by Context, because 0 is a valid
2840 // transform feedback, and a pointer to it must be passed from Context to State at
2841 // binding time.
2842
2843 // The OpenGL specification doesn't mention what should happen when the currently bound
2844 // transform feedback object is deleted. Since it is a container object, we treat it like
2845 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002846 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002847 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002848 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002849 }
Geoff Langc8058452014-02-03 12:04:11 -05002850}
2851
Jamie Madilldc356042013-07-19 16:36:57 -04002852void Context::detachSampler(GLuint sampler)
2853{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002854 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002855}
2856
Yunchao Hea336b902017-08-02 16:05:21 +08002857void Context::detachProgramPipeline(GLuint pipeline)
2858{
2859 mGLState.detachProgramPipeline(this, pipeline);
2860}
2861
Jamie Madill3ef140a2017-08-26 23:11:21 -04002862void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002863{
Shaodde78e82017-05-22 14:13:27 +08002864 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002865 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002866}
2867
Jamie Madille29d1672013-07-19 16:36:57 -04002868void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2869{
Geoff Langc1984ed2016-10-07 12:41:00 -04002870 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002871 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002872 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002873}
Jamie Madille29d1672013-07-19 16:36:57 -04002874
Geoff Langc1984ed2016-10-07 12:41:00 -04002875void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2876{
2877 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002878 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002879 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002880}
2881
Brandon Jones59770802018-04-02 13:18:42 -07002882void Context::samplerParameterivRobust(GLuint sampler,
2883 GLenum pname,
2884 GLsizei bufSize,
2885 const GLint *param)
2886{
2887 samplerParameteriv(sampler, pname, param);
2888}
2889
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002890void Context::samplerParameterIivRobust(GLuint sampler,
2891 GLenum pname,
2892 GLsizei bufSize,
2893 const GLint *param)
2894{
2895 UNIMPLEMENTED();
2896}
2897
2898void Context::samplerParameterIuivRobust(GLuint sampler,
2899 GLenum pname,
2900 GLsizei bufSize,
2901 const GLuint *param)
2902{
2903 UNIMPLEMENTED();
2904}
2905
Jamie Madille29d1672013-07-19 16:36:57 -04002906void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2907{
Geoff Langc1984ed2016-10-07 12:41:00 -04002908 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002909 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002910 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002911}
2912
Geoff Langc1984ed2016-10-07 12:41:00 -04002913void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002914{
Geoff Langc1984ed2016-10-07 12:41:00 -04002915 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002916 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002917 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002918}
2919
Brandon Jones59770802018-04-02 13:18:42 -07002920void Context::samplerParameterfvRobust(GLuint sampler,
2921 GLenum pname,
2922 GLsizei bufSize,
2923 const GLfloat *param)
2924{
2925 samplerParameterfv(sampler, pname, param);
2926}
2927
Geoff Langc1984ed2016-10-07 12:41:00 -04002928void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002929{
Geoff Langc1984ed2016-10-07 12:41:00 -04002930 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002931 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002932 QuerySamplerParameteriv(samplerObject, pname, params);
2933}
Jamie Madill9675b802013-07-19 16:36:59 -04002934
Brandon Jones59770802018-04-02 13:18:42 -07002935void Context::getSamplerParameterivRobust(GLuint sampler,
2936 GLenum pname,
2937 GLsizei bufSize,
2938 GLsizei *length,
2939 GLint *params)
2940{
2941 getSamplerParameteriv(sampler, pname, params);
2942}
2943
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002944void Context::getSamplerParameterIivRobust(GLuint sampler,
2945 GLenum pname,
2946 GLsizei bufSize,
2947 GLsizei *length,
2948 GLint *params)
2949{
2950 UNIMPLEMENTED();
2951}
2952
2953void Context::getSamplerParameterIuivRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 GLsizei *length,
2957 GLuint *params)
2958{
2959 UNIMPLEMENTED();
2960}
2961
Geoff Langc1984ed2016-10-07 12:41:00 -04002962void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2963{
2964 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002965 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002966 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002967}
2968
Brandon Jones59770802018-04-02 13:18:42 -07002969void Context::getSamplerParameterfvRobust(GLuint sampler,
2970 GLenum pname,
2971 GLsizei bufSize,
2972 GLsizei *length,
2973 GLfloat *params)
2974{
2975 getSamplerParameterfv(sampler, pname, params);
2976}
2977
Olli Etuahof0fee072016-03-30 15:11:58 +03002978void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2979{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002980 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002981 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002982}
2983
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002984void Context::initRendererString()
2985{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002986 std::ostringstream rendererString;
2987 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002988 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002989 rendererString << ")";
2990
Geoff Langcec35902014-04-16 10:52:36 -04002991 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002992}
2993
Geoff Langc339c4e2016-11-29 10:37:36 -05002994void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002995{
Geoff Langc339c4e2016-11-29 10:37:36 -05002996 const Version &clientVersion = getClientVersion();
2997
2998 std::ostringstream versionString;
2999 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3000 << ANGLE_VERSION_STRING << ")";
3001 mVersionString = MakeStaticString(versionString.str());
3002
3003 std::ostringstream shadingLanguageVersionString;
3004 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3005 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3006 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3007 << ")";
3008 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003009}
3010
Geoff Langcec35902014-04-16 10:52:36 -04003011void Context::initExtensionStrings()
3012{
Geoff Langc339c4e2016-11-29 10:37:36 -05003013 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3014 std::ostringstream combinedStringStream;
3015 std::copy(strings.begin(), strings.end(),
3016 std::ostream_iterator<const char *>(combinedStringStream, " "));
3017 return MakeStaticString(combinedStringStream.str());
3018 };
3019
3020 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003021 for (const auto &extensionString : mExtensions.getStrings())
3022 {
3023 mExtensionStrings.push_back(MakeStaticString(extensionString));
3024 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003025 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003026
Geoff Langc339c4e2016-11-29 10:37:36 -05003027 mRequestableExtensionStrings.clear();
3028 for (const auto &extensionInfo : GetExtensionInfoMap())
3029 {
3030 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003031 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003032 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003033 {
3034 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3035 }
3036 }
3037 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003038}
3039
Geoff Langc339c4e2016-11-29 10:37:36 -05003040const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003041{
Geoff Langc339c4e2016-11-29 10:37:36 -05003042 switch (name)
3043 {
3044 case GL_VENDOR:
3045 return reinterpret_cast<const GLubyte *>("Google Inc.");
3046
3047 case GL_RENDERER:
3048 return reinterpret_cast<const GLubyte *>(mRendererString);
3049
3050 case GL_VERSION:
3051 return reinterpret_cast<const GLubyte *>(mVersionString);
3052
3053 case GL_SHADING_LANGUAGE_VERSION:
3054 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3055
3056 case GL_EXTENSIONS:
3057 return reinterpret_cast<const GLubyte *>(mExtensionString);
3058
3059 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3060 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3061
3062 default:
3063 UNREACHABLE();
3064 return nullptr;
3065 }
Geoff Langcec35902014-04-16 10:52:36 -04003066}
3067
Geoff Langc339c4e2016-11-29 10:37:36 -05003068const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003069{
Geoff Langc339c4e2016-11-29 10:37:36 -05003070 switch (name)
3071 {
3072 case GL_EXTENSIONS:
3073 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3074
3075 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3076 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3077
3078 default:
3079 UNREACHABLE();
3080 return nullptr;
3081 }
Geoff Langcec35902014-04-16 10:52:36 -04003082}
3083
3084size_t Context::getExtensionStringCount() const
3085{
3086 return mExtensionStrings.size();
3087}
3088
Geoff Lang111a99e2017-10-17 10:58:41 -04003089bool Context::isExtensionRequestable(const char *name)
3090{
3091 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3092 auto extension = extensionInfos.find(name);
3093
Geoff Lang111a99e2017-10-17 10:58:41 -04003094 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003095 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003096}
3097
Geoff Langc339c4e2016-11-29 10:37:36 -05003098void Context::requestExtension(const char *name)
3099{
3100 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3101 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3102 const auto &extension = extensionInfos.at(name);
3103 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003104 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003105
3106 if (mExtensions.*(extension.ExtensionsMember))
3107 {
3108 // Extension already enabled
3109 return;
3110 }
3111
3112 mExtensions.*(extension.ExtensionsMember) = true;
3113 updateCaps();
3114 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003115
Jamie Madill2f348d22017-06-05 10:50:59 -04003116 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3117 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003118
Jamie Madill81c2e252017-09-09 23:32:46 -04003119 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3120 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003121 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003122 for (auto &zeroTexture : mZeroTextures)
3123 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003124 if (zeroTexture.get() != nullptr)
3125 {
3126 zeroTexture->signalDirty(this, InitState::Initialized);
3127 }
Geoff Lang9aded172017-04-05 11:07:56 -04003128 }
3129
Jamie Madillb983a4b2018-08-01 11:34:51 -04003130 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003131}
3132
3133size_t Context::getRequestableExtensionStringCount() const
3134{
3135 return mRequestableExtensionStrings.size();
3136}
3137
Jamie Madill493f9572018-05-24 19:52:15 -04003138void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003139{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003140 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003141 ASSERT(transformFeedback != nullptr);
3142 ASSERT(!transformFeedback->isPaused());
3143
Jamie Madill6c1f6712017-02-14 19:08:04 -05003144 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003145 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003146}
3147
3148bool Context::hasActiveTransformFeedback(GLuint program) const
3149{
3150 for (auto pair : mTransformFeedbackMap)
3151 {
3152 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3153 {
3154 return true;
3155 }
3156 }
3157 return false;
3158}
3159
Geoff Lang33f11fb2018-05-07 13:42:47 -04003160Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003161{
3162 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3163
jchen1082af6202018-06-22 10:59:52 +08003164 // Explicitly enable GL_KHR_parallel_shader_compile
3165 supportedExtensions.parallelShaderCompile = true;
3166
Geoff Langb0f917f2017-12-05 13:41:54 -05003167 if (getClientVersion() < ES_2_0)
3168 {
3169 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003170 supportedExtensions.pointSizeArray = true;
3171 supportedExtensions.textureCubeMap = true;
3172 supportedExtensions.pointSprite = true;
3173 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003174 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003175 }
3176
3177 if (getClientVersion() < ES_3_0)
3178 {
3179 // Disable ES3+ extensions
3180 supportedExtensions.colorBufferFloat = false;
3181 supportedExtensions.eglImageExternalEssl3 = false;
3182 supportedExtensions.textureNorm16 = false;
3183 supportedExtensions.multiview = false;
3184 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003185 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003186 }
3187
3188 if (getClientVersion() < ES_3_1)
3189 {
3190 // Disable ES3.1+ extensions
3191 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003192
3193 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3194 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003195 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003196 }
3197
3198 if (getClientVersion() > ES_2_0)
3199 {
3200 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3201 // supportedExtensions.sRGB = false;
3202 }
3203
3204 // Some extensions are always available because they are implemented in the GL layer.
3205 supportedExtensions.bindUniformLocation = true;
3206 supportedExtensions.vertexArrayObject = true;
3207 supportedExtensions.bindGeneratesResource = true;
3208 supportedExtensions.clientArrays = true;
3209 supportedExtensions.requestExtension = true;
3210
3211 // Enable the no error extension if the context was created with the flag.
3212 supportedExtensions.noError = mSkipValidation;
3213
3214 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003215 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003216
3217 // Explicitly enable GL_KHR_debug
3218 supportedExtensions.debug = true;
3219 supportedExtensions.maxDebugMessageLength = 1024;
3220 supportedExtensions.maxDebugLoggedMessages = 1024;
3221 supportedExtensions.maxDebugGroupStackDepth = 1024;
3222 supportedExtensions.maxLabelLength = 1024;
3223
3224 // Explicitly enable GL_ANGLE_robust_client_memory
3225 supportedExtensions.robustClientMemory = true;
3226
3227 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003228 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003229
3230 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3231 // supports it.
3232 supportedExtensions.robustBufferAccessBehavior =
3233 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3234
3235 // Enable the cache control query unconditionally.
3236 supportedExtensions.programCacheControl = true;
3237
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003238 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003239 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003240 {
3241 // GL_ANGLE_explicit_context_gles1
3242 supportedExtensions.explicitContextGles1 = true;
3243 // GL_ANGLE_explicit_context
3244 supportedExtensions.explicitContext = true;
3245 }
3246
Geoff Lang79b91402018-10-04 15:11:30 -04003247 supportedExtensions.memorySize = true;
3248
Geoff Langb0f917f2017-12-05 13:41:54 -05003249 return supportedExtensions;
3250}
3251
Geoff Lang33f11fb2018-05-07 13:42:47 -04003252void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003253{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003254 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003255
Geoff Lang33f11fb2018-05-07 13:42:47 -04003256 mSupportedExtensions = generateSupportedExtensions();
3257 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003258
3259 mLimitations = mImplementation->getNativeLimitations();
3260
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003261 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3262 if (getClientVersion() < Version(2, 0))
3263 {
3264 mCaps.maxMultitextureUnits = 4;
3265 mCaps.maxClipPlanes = 6;
3266 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003267 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3268 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3269 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003270 mCaps.minSmoothPointSize = 1.0f;
3271 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003272 mCaps.minSmoothLineWidth = 1.0f;
3273 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003274 }
3275
Luc Ferronad2ae932018-06-11 15:31:17 -04003276 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003277 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003278
Luc Ferronad2ae932018-06-11 15:31:17 -04003279 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3280
Jamie Madill0f80ed82017-09-19 00:24:56 -04003281 if (getClientVersion() < ES_3_1)
3282 {
3283 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3284 }
3285 else
3286 {
3287 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3288 }
Geoff Lang301d1612014-07-09 10:34:37 -04003289
Jiawei Shao54aafe52018-04-27 14:54:57 +08003290 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3291 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003292 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3293
Jamie Madill0f80ed82017-09-19 00:24:56 -04003294 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3295 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3296
3297 // Limit textures as well, so we can use fast bitsets with texture bindings.
3298 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003299 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3300 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3301 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3302 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003303
Jiawei Shaodb342272017-09-27 10:21:45 +08003304 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3305
Geoff Langc287ea62016-09-16 14:46:51 -04003306 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003307 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003308 for (const auto &extensionInfo : GetExtensionInfoMap())
3309 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003310 // If the user has requested that extensions start disabled and they are requestable,
3311 // disable them.
3312 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003313 {
3314 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3315 }
3316 }
3317
3318 // Generate texture caps
3319 updateCaps();
3320}
3321
3322void Context::updateCaps()
3323{
Geoff Lang900013c2014-07-07 11:32:19 -04003324 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003325 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003326
Jamie Madill7b62cf92017-11-02 15:20:49 -04003327 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003328 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003329 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003330 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003331
Geoff Lang0d8b7242015-09-09 14:56:53 -04003332 // Update the format caps based on the client version and extensions.
3333 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3334 // ES3.
3335 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003336 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003337 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003338 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003339 formatCaps.textureAttachment =
3340 formatCaps.textureAttachment &&
3341 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3342 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3343 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003344
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003345 // OpenGL ES does not support multisampling with non-rendererable formats
3346 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003347 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003348 (getClientVersion() < ES_3_1 &&
3349 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003350 {
Geoff Langd87878e2014-09-19 15:42:59 -04003351 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003352 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003353 else
3354 {
3355 // We may have limited the max samples for some required renderbuffer formats due to
3356 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3357 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3358
3359 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3360 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3361 // exception of signed and unsigned integer formats."
3362 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3363 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3364 {
3365 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3366 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3367 }
3368
3369 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3370 if (getClientVersion() >= ES_3_1)
3371 {
3372 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3373 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3374 // the exception that the signed and unsigned integer formats are required only to
3375 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3376 // multisamples, which must be at least one."
3377 if (formatInfo.componentType == GL_INT ||
3378 formatInfo.componentType == GL_UNSIGNED_INT)
3379 {
3380 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3381 }
3382
3383 // GLES 3.1 section 19.3.1.
3384 if (formatCaps.texturable)
3385 {
3386 if (formatInfo.depthBits > 0)
3387 {
3388 mCaps.maxDepthTextureSamples =
3389 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3390 }
3391 else if (formatInfo.redBits > 0)
3392 {
3393 mCaps.maxColorTextureSamples =
3394 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3395 }
3396 }
3397 }
3398 }
Geoff Langd87878e2014-09-19 15:42:59 -04003399
3400 if (formatCaps.texturable && formatInfo.compressed)
3401 {
Geoff Langca271392017-04-05 12:30:00 -04003402 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003403 }
3404
Geoff Langca271392017-04-05 12:30:00 -04003405 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003406 }
Jamie Madill32447362017-06-28 14:53:52 -04003407
3408 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003409 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003410 {
3411 mMemoryProgramCache = nullptr;
3412 }
Corentin Walleze4477002017-12-01 14:39:58 -05003413
3414 // Compute which buffer types are allowed
3415 mValidBufferBindings.reset();
3416 mValidBufferBindings.set(BufferBinding::ElementArray);
3417 mValidBufferBindings.set(BufferBinding::Array);
3418
3419 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3420 {
3421 mValidBufferBindings.set(BufferBinding::PixelPack);
3422 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3423 }
3424
3425 if (getClientVersion() >= ES_3_0)
3426 {
3427 mValidBufferBindings.set(BufferBinding::CopyRead);
3428 mValidBufferBindings.set(BufferBinding::CopyWrite);
3429 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3430 mValidBufferBindings.set(BufferBinding::Uniform);
3431 }
3432
3433 if (getClientVersion() >= ES_3_1)
3434 {
3435 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3436 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3437 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3438 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3439 }
jchen107ae70d82018-07-06 13:47:01 +08003440
3441 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003442
3443 // Reinitialize state cache after extension changes.
3444 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003445}
3446
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003447void Context::initWorkarounds()
3448{
Jamie Madill761b02c2017-06-23 16:27:06 -04003449 // Apply back-end workarounds.
3450 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3451
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003452 // Lose the context upon out of memory error if the application is
3453 // expecting to watch for those events.
3454 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3455}
3456
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003457// Return true if the draw is a no-op, else return false.
3458// A no-op draw occurs if the count of vertices is less than the minimum required to
3459// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3460bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3461{
3462 return count < kMinimumPrimitiveCounts[mode];
3463}
3464
3465bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3466{
3467 return (instanceCount == 0) || noopDraw(mode, count);
3468}
3469
Jamie Madill6f755b22018-10-09 12:48:54 -04003470angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003471{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003472 if (mGLES1Renderer)
3473 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003474 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003475 }
3476
Geoff Lang9bf86f02018-07-26 11:46:34 -04003477 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003478
3479 if (isRobustResourceInitEnabled())
3480 {
3481 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3482 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3483 }
3484
Geoff Langa8cb2872018-03-09 16:09:40 -05003485 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003486 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003487}
3488
3489Error Context::prepareForClear(GLbitfield mask)
3490{
Geoff Langa8cb2872018-03-09 16:09:40 -05003491 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003492 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003493 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003494 return NoError();
3495}
3496
3497Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3498{
Geoff Langa8cb2872018-03-09 16:09:40 -05003499 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003500 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3501 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003502 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003503 return NoError();
3504}
3505
Geoff Langa8cb2872018-03-09 16:09:40 -05003506Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003507{
Geoff Langa8cb2872018-03-09 16:09:40 -05003508 ANGLE_TRY(syncDirtyObjects(objectMask));
3509 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003510 return NoError();
3511}
3512
Jamie Madill6f755b22018-10-09 12:48:54 -04003513angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003514{
3515 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003516 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003517 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003518 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003519}
3520
Jamie Madill6f755b22018-10-09 12:48:54 -04003521angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003522{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003523 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003524 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003525 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003526 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003527}
Jamie Madillc29968b2016-01-20 11:17:23 -05003528
Jamie Madill6f755b22018-10-09 12:48:54 -04003529angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003530{
3531 return mGLState.syncDirtyObjects(this, objectMask);
3532}
3533
Jamie Madillc29968b2016-01-20 11:17:23 -05003534void Context::blitFramebuffer(GLint srcX0,
3535 GLint srcY0,
3536 GLint srcX1,
3537 GLint srcY1,
3538 GLint dstX0,
3539 GLint dstY0,
3540 GLint dstX1,
3541 GLint dstY1,
3542 GLbitfield mask,
3543 GLenum filter)
3544{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003545 if (mask == 0)
3546 {
3547 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3548 // buffers are copied.
3549 return;
3550 }
3551
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003552 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003553 ASSERT(drawFramebuffer);
3554
3555 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3556 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3557
Jamie Madillbc918e72018-03-08 09:47:21 -05003558 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003559
Jamie Madillc564c072017-06-01 12:45:42 -04003560 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003561}
Jamie Madillc29968b2016-01-20 11:17:23 -05003562
3563void Context::clear(GLbitfield mask)
3564{
Geoff Langd4fff502017-09-22 11:28:28 -04003565 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3566 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003567}
3568
3569void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3570{
Olli Etuaho78df3362018-10-05 16:43:27 +03003571 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3572 const FramebufferAttachment *attachment = nullptr;
3573 if (buffer == GL_DEPTH)
3574 {
3575 attachment = framebufferObject->getDepthbuffer();
3576 }
3577 if (buffer == GL_COLOR &&
3578 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3579 {
3580 attachment = framebufferObject->getColorbuffer(drawbuffer);
3581 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003582 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3583 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003584 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003585 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003586 return;
3587 }
Geoff Langd4fff502017-09-22 11:28:28 -04003588 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003589 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003590}
3591
3592void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3593{
Olli Etuaho78df3362018-10-05 16:43:27 +03003594 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3595 const FramebufferAttachment *attachment = nullptr;
3596 if (buffer == GL_COLOR &&
3597 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3598 {
3599 attachment = framebufferObject->getColorbuffer(drawbuffer);
3600 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003601 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3602 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003603 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003604 {
3605 return;
3606 }
Geoff Langd4fff502017-09-22 11:28:28 -04003607 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003608 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003609}
3610
3611void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3612{
Olli Etuaho78df3362018-10-05 16:43:27 +03003613 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3614 const FramebufferAttachment *attachment = nullptr;
3615 if (buffer == GL_STENCIL)
3616 {
3617 attachment = framebufferObject->getStencilbuffer();
3618 }
3619 if (buffer == GL_COLOR &&
3620 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3621 {
3622 attachment = framebufferObject->getColorbuffer(drawbuffer);
3623 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003624 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3625 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003626 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003627 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003628 return;
3629 }
Geoff Langd4fff502017-09-22 11:28:28 -04003630 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003631 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003632}
3633
3634void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3635{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003636 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003637 ASSERT(framebufferObject);
3638
3639 // If a buffer is not present, the clear has no effect
3640 if (framebufferObject->getDepthbuffer() == nullptr &&
3641 framebufferObject->getStencilbuffer() == nullptr)
3642 {
3643 return;
3644 }
3645
Geoff Langd4fff502017-09-22 11:28:28 -04003646 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3647 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003648}
3649
3650void Context::readPixels(GLint x,
3651 GLint y,
3652 GLsizei width,
3653 GLsizei height,
3654 GLenum format,
3655 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003656 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003657{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003658 if (width == 0 || height == 0)
3659 {
3660 return;
3661 }
3662
Jamie Madillbc918e72018-03-08 09:47:21 -05003663 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003664
Jamie Madillb6664922017-07-25 12:55:04 -04003665 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3666 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003667
3668 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003669 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003670}
3671
Brandon Jones59770802018-04-02 13:18:42 -07003672void Context::readPixelsRobust(GLint x,
3673 GLint y,
3674 GLsizei width,
3675 GLsizei height,
3676 GLenum format,
3677 GLenum type,
3678 GLsizei bufSize,
3679 GLsizei *length,
3680 GLsizei *columns,
3681 GLsizei *rows,
3682 void *pixels)
3683{
3684 readPixels(x, y, width, height, format, type, pixels);
3685}
3686
3687void Context::readnPixelsRobust(GLint x,
3688 GLint y,
3689 GLsizei width,
3690 GLsizei height,
3691 GLenum format,
3692 GLenum type,
3693 GLsizei bufSize,
3694 GLsizei *length,
3695 GLsizei *columns,
3696 GLsizei *rows,
3697 void *data)
3698{
3699 readPixels(x, y, width, height, format, type, data);
3700}
3701
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003702void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003703 GLint level,
3704 GLenum internalformat,
3705 GLint x,
3706 GLint y,
3707 GLsizei width,
3708 GLsizei height,
3709 GLint border)
3710{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003711 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003712 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003713
Jamie Madillc29968b2016-01-20 11:17:23 -05003714 Rectangle sourceArea(x, y, width, height);
3715
Jamie Madill05b35b22017-10-03 09:01:44 -04003716 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003717 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003718 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003719}
3720
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003721void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003722 GLint level,
3723 GLint xoffset,
3724 GLint yoffset,
3725 GLint x,
3726 GLint y,
3727 GLsizei width,
3728 GLsizei height)
3729{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003730 if (width == 0 || height == 0)
3731 {
3732 return;
3733 }
3734
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003735 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003736 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003737
Jamie Madillc29968b2016-01-20 11:17:23 -05003738 Offset destOffset(xoffset, yoffset, 0);
3739 Rectangle sourceArea(x, y, width, height);
3740
Jamie Madill05b35b22017-10-03 09:01:44 -04003741 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003742 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003743 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003744}
3745
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003746void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003747 GLint level,
3748 GLint xoffset,
3749 GLint yoffset,
3750 GLint zoffset,
3751 GLint x,
3752 GLint y,
3753 GLsizei width,
3754 GLsizei height)
3755{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003756 if (width == 0 || height == 0)
3757 {
3758 return;
3759 }
3760
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003761 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003762 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003763
Jamie Madillc29968b2016-01-20 11:17:23 -05003764 Offset destOffset(xoffset, yoffset, zoffset);
3765 Rectangle sourceArea(x, y, width, height);
3766
Jamie Madill05b35b22017-10-03 09:01:44 -04003767 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3768 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003769 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3770 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003771}
3772
3773void Context::framebufferTexture2D(GLenum target,
3774 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003775 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003776 GLuint texture,
3777 GLint level)
3778{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003779 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003780 ASSERT(framebuffer);
3781
3782 if (texture != 0)
3783 {
3784 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003785 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003786 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003787 }
3788 else
3789 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003790 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003791 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003792
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003793 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003794}
3795
3796void Context::framebufferRenderbuffer(GLenum target,
3797 GLenum attachment,
3798 GLenum renderbuffertarget,
3799 GLuint renderbuffer)
3800{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003801 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003802 ASSERT(framebuffer);
3803
3804 if (renderbuffer != 0)
3805 {
3806 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003807
Jamie Madillcc129372018-04-12 09:13:18 -04003808 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003809 renderbufferObject);
3810 }
3811 else
3812 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003813 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003814 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003815
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003816 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003817}
3818
3819void Context::framebufferTextureLayer(GLenum target,
3820 GLenum attachment,
3821 GLuint texture,
3822 GLint level,
3823 GLint layer)
3824{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003825 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003826 ASSERT(framebuffer);
3827
3828 if (texture != 0)
3829 {
3830 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003831 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003832 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003833 }
3834 else
3835 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003836 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003837 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003838
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003839 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003840}
3841
Brandon Jones59770802018-04-02 13:18:42 -07003842void Context::framebufferTextureMultiviewLayered(GLenum target,
3843 GLenum attachment,
3844 GLuint texture,
3845 GLint level,
3846 GLint baseViewIndex,
3847 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003848{
Martin Radev82ef7742017-08-08 17:44:58 +03003849 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3850 ASSERT(framebuffer);
3851
3852 if (texture != 0)
3853 {
3854 Texture *textureObj = getTexture(texture);
3855
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003856 ImageIndex index;
3857 if (textureObj->getType() == TextureType::_2DArray)
3858 {
3859 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3860 }
3861 else
3862 {
3863 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3864 ASSERT(level == 0);
3865 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3866 }
Martin Radev82ef7742017-08-08 17:44:58 +03003867 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3868 numViews, baseViewIndex);
3869 }
3870 else
3871 {
3872 framebuffer->resetAttachment(this, attachment);
3873 }
3874
3875 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003876}
3877
Brandon Jones59770802018-04-02 13:18:42 -07003878void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3879 GLenum attachment,
3880 GLuint texture,
3881 GLint level,
3882 GLsizei numViews,
3883 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003884{
Martin Radev5dae57b2017-07-14 16:15:55 +03003885 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3886 ASSERT(framebuffer);
3887
3888 if (texture != 0)
3889 {
3890 Texture *textureObj = getTexture(texture);
3891
3892 ImageIndex index = ImageIndex::Make2D(level);
3893 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3894 textureObj, numViews, viewportOffsets);
3895 }
3896 else
3897 {
3898 framebuffer->resetAttachment(this, attachment);
3899 }
3900
3901 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003902}
3903
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003904void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3905{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003906 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3907 ASSERT(framebuffer);
3908
3909 if (texture != 0)
3910 {
3911 Texture *textureObj = getTexture(texture);
3912
3913 ImageIndex index = ImageIndex::MakeFromType(
3914 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3915 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3916 }
3917 else
3918 {
3919 framebuffer->resetAttachment(this, attachment);
3920 }
3921
3922 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003923}
3924
Jamie Madillc29968b2016-01-20 11:17:23 -05003925void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3926{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003927 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003928 ASSERT(framebuffer);
3929 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003930 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003931 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003932}
3933
3934void Context::readBuffer(GLenum mode)
3935{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003936 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003937 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003938 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003939}
3940
3941void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3942{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003943 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003944 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003945
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003946 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003947 ASSERT(framebuffer);
3948
3949 // The specification isn't clear what should be done when the framebuffer isn't complete.
3950 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003951 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003952}
3953
3954void Context::invalidateFramebuffer(GLenum target,
3955 GLsizei numAttachments,
3956 const GLenum *attachments)
3957{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003958 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003959 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003960
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003961 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003962 ASSERT(framebuffer);
3963
Jamie Madill427064d2018-04-13 16:20:34 -04003964 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003965 {
Jamie Madill437fa652016-05-03 15:13:24 -04003966 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003967 }
Jamie Madill437fa652016-05-03 15:13:24 -04003968
Jamie Madill4928b7c2017-06-20 12:57:39 -04003969 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003970}
3971
3972void Context::invalidateSubFramebuffer(GLenum target,
3973 GLsizei numAttachments,
3974 const GLenum *attachments,
3975 GLint x,
3976 GLint y,
3977 GLsizei width,
3978 GLsizei height)
3979{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003980 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003981 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003982
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003983 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003984 ASSERT(framebuffer);
3985
Jamie Madill427064d2018-04-13 16:20:34 -04003986 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003987 {
Jamie Madill437fa652016-05-03 15:13:24 -04003988 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003989 }
Jamie Madill437fa652016-05-03 15:13:24 -04003990
3991 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003992 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003993}
3994
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003995void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003996 GLint level,
3997 GLint internalformat,
3998 GLsizei width,
3999 GLsizei height,
4000 GLint border,
4001 GLenum format,
4002 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004003 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004004{
Jamie Madillbc918e72018-03-08 09:47:21 -05004005 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004006
4007 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004008 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004009 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004010 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004011}
4012
Brandon Jones59770802018-04-02 13:18:42 -07004013void Context::texImage2DRobust(TextureTarget target,
4014 GLint level,
4015 GLint internalformat,
4016 GLsizei width,
4017 GLsizei height,
4018 GLint border,
4019 GLenum format,
4020 GLenum type,
4021 GLsizei bufSize,
4022 const void *pixels)
4023{
4024 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4025}
4026
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004027void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004028 GLint level,
4029 GLint internalformat,
4030 GLsizei width,
4031 GLsizei height,
4032 GLsizei depth,
4033 GLint border,
4034 GLenum format,
4035 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004036 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004037{
Jamie Madillbc918e72018-03-08 09:47:21 -05004038 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004039
4040 Extents size(width, height, depth);
4041 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004042 handleError(texture->setImage(this, mGLState.getUnpackState(),
4043 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004044 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004045}
4046
Brandon Jones59770802018-04-02 13:18:42 -07004047void Context::texImage3DRobust(TextureType target,
4048 GLint level,
4049 GLint internalformat,
4050 GLsizei width,
4051 GLsizei height,
4052 GLsizei depth,
4053 GLint border,
4054 GLenum format,
4055 GLenum type,
4056 GLsizei bufSize,
4057 const void *pixels)
4058{
4059 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4060}
4061
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004062void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004063 GLint level,
4064 GLint xoffset,
4065 GLint yoffset,
4066 GLsizei width,
4067 GLsizei height,
4068 GLenum format,
4069 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004070 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004071{
4072 // Zero sized uploads are valid but no-ops
4073 if (width == 0 || height == 0)
4074 {
4075 return;
4076 }
4077
Jamie Madillbc918e72018-03-08 09:47:21 -05004078 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004079
4080 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004081 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004082
4083 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4084
4085 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4086 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004087}
4088
Brandon Jones59770802018-04-02 13:18:42 -07004089void Context::texSubImage2DRobust(TextureTarget target,
4090 GLint level,
4091 GLint xoffset,
4092 GLint yoffset,
4093 GLsizei width,
4094 GLsizei height,
4095 GLenum format,
4096 GLenum type,
4097 GLsizei bufSize,
4098 const void *pixels)
4099{
4100 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4101}
4102
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004103void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004104 GLint level,
4105 GLint xoffset,
4106 GLint yoffset,
4107 GLint zoffset,
4108 GLsizei width,
4109 GLsizei height,
4110 GLsizei depth,
4111 GLenum format,
4112 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004113 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004114{
4115 // Zero sized uploads are valid but no-ops
4116 if (width == 0 || height == 0 || depth == 0)
4117 {
4118 return;
4119 }
4120
Jamie Madillbc918e72018-03-08 09:47:21 -05004121 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004122
4123 Box area(xoffset, yoffset, zoffset, width, height, depth);
4124 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004125
4126 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4127
4128 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004129 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004130 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004131}
4132
Brandon Jones59770802018-04-02 13:18:42 -07004133void Context::texSubImage3DRobust(TextureType target,
4134 GLint level,
4135 GLint xoffset,
4136 GLint yoffset,
4137 GLint zoffset,
4138 GLsizei width,
4139 GLsizei height,
4140 GLsizei depth,
4141 GLenum format,
4142 GLenum type,
4143 GLsizei bufSize,
4144 const void *pixels)
4145{
4146 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4147 pixels);
4148}
4149
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004150void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004151 GLint level,
4152 GLenum internalformat,
4153 GLsizei width,
4154 GLsizei height,
4155 GLint border,
4156 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004157 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004158{
Jamie Madillbc918e72018-03-08 09:47:21 -05004159 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004160
4161 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004162 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004163 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4164 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004165 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004166}
4167
Brandon Jones59770802018-04-02 13:18:42 -07004168void Context::compressedTexImage2DRobust(TextureTarget target,
4169 GLint level,
4170 GLenum internalformat,
4171 GLsizei width,
4172 GLsizei height,
4173 GLint border,
4174 GLsizei imageSize,
4175 GLsizei dataSize,
4176 const GLvoid *data)
4177{
4178 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4179}
4180
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004181void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004182 GLint level,
4183 GLenum internalformat,
4184 GLsizei width,
4185 GLsizei height,
4186 GLsizei depth,
4187 GLint border,
4188 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004189 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004190{
Jamie Madillbc918e72018-03-08 09:47:21 -05004191 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004192
4193 Extents size(width, height, depth);
4194 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004195 handleError(texture->setCompressedImage(
4196 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004197 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004198}
4199
Brandon Jones59770802018-04-02 13:18:42 -07004200void Context::compressedTexImage3DRobust(TextureType target,
4201 GLint level,
4202 GLenum internalformat,
4203 GLsizei width,
4204 GLsizei height,
4205 GLsizei depth,
4206 GLint border,
4207 GLsizei imageSize,
4208 GLsizei dataSize,
4209 const GLvoid *data)
4210{
4211 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4212 data);
4213}
4214
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004215void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004216 GLint level,
4217 GLint xoffset,
4218 GLint yoffset,
4219 GLsizei width,
4220 GLsizei height,
4221 GLenum format,
4222 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004223 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004224{
Jamie Madillbc918e72018-03-08 09:47:21 -05004225 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004226
4227 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004228 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004229 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4230 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004231 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004232}
4233
Brandon Jones59770802018-04-02 13:18:42 -07004234void Context::compressedTexSubImage2DRobust(TextureTarget target,
4235 GLint level,
4236 GLint xoffset,
4237 GLint yoffset,
4238 GLsizei width,
4239 GLsizei height,
4240 GLenum format,
4241 GLsizei imageSize,
4242 GLsizei dataSize,
4243 const GLvoid *data)
4244{
4245 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4246 data);
4247}
4248
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004249void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004250 GLint level,
4251 GLint xoffset,
4252 GLint yoffset,
4253 GLint zoffset,
4254 GLsizei width,
4255 GLsizei height,
4256 GLsizei depth,
4257 GLenum format,
4258 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004259 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004260{
4261 // Zero sized uploads are valid but no-ops
4262 if (width == 0 || height == 0)
4263 {
4264 return;
4265 }
4266
Jamie Madillbc918e72018-03-08 09:47:21 -05004267 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004268
4269 Box area(xoffset, yoffset, zoffset, width, height, depth);
4270 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004271 handleError(texture->setCompressedSubImage(
4272 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004273 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004274}
4275
Brandon Jones59770802018-04-02 13:18:42 -07004276void Context::compressedTexSubImage3DRobust(TextureType target,
4277 GLint level,
4278 GLint xoffset,
4279 GLint yoffset,
4280 GLint zoffset,
4281 GLsizei width,
4282 GLsizei height,
4283 GLsizei depth,
4284 GLenum format,
4285 GLsizei imageSize,
4286 GLsizei dataSize,
4287 const GLvoid *data)
4288{
4289 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4290 imageSize, data);
4291}
4292
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004293void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004294{
4295 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004296 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004297}
4298
Jamie Madill007530e2017-12-28 14:27:04 -05004299void Context::copyTexture(GLuint sourceId,
4300 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004301 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004302 GLuint destId,
4303 GLint destLevel,
4304 GLint internalFormat,
4305 GLenum destType,
4306 GLboolean unpackFlipY,
4307 GLboolean unpackPremultiplyAlpha,
4308 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004309{
Jamie Madillbc918e72018-03-08 09:47:21 -05004310 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004311
4312 gl::Texture *sourceTexture = getTexture(sourceId);
4313 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004314 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4315 sourceLevel, ConvertToBool(unpackFlipY),
4316 ConvertToBool(unpackPremultiplyAlpha),
4317 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004318}
4319
Jamie Madill007530e2017-12-28 14:27:04 -05004320void Context::copySubTexture(GLuint sourceId,
4321 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004322 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004323 GLuint destId,
4324 GLint destLevel,
4325 GLint xoffset,
4326 GLint yoffset,
4327 GLint x,
4328 GLint y,
4329 GLsizei width,
4330 GLsizei height,
4331 GLboolean unpackFlipY,
4332 GLboolean unpackPremultiplyAlpha,
4333 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004334{
4335 // Zero sized copies are valid but no-ops
4336 if (width == 0 || height == 0)
4337 {
4338 return;
4339 }
4340
Jamie Madillbc918e72018-03-08 09:47:21 -05004341 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004342
4343 gl::Texture *sourceTexture = getTexture(sourceId);
4344 gl::Texture *destTexture = getTexture(destId);
4345 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004346 Box box(x, y, 0, width, height, 1);
4347 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4348 ConvertToBool(unpackFlipY),
4349 ConvertToBool(unpackPremultiplyAlpha),
4350 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4351}
4352
4353void Context::copyTexture3D(GLuint sourceId,
4354 GLint sourceLevel,
4355 TextureTarget destTarget,
4356 GLuint destId,
4357 GLint destLevel,
4358 GLint internalFormat,
4359 GLenum destType,
4360 GLboolean unpackFlipY,
4361 GLboolean unpackPremultiplyAlpha,
4362 GLboolean unpackUnmultiplyAlpha)
4363{
4364 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4365
4366 Texture *sourceTexture = getTexture(sourceId);
4367 Texture *destTexture = getTexture(destId);
4368 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4369 sourceLevel, ConvertToBool(unpackFlipY),
4370 ConvertToBool(unpackPremultiplyAlpha),
4371 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4372}
4373
4374void Context::copySubTexture3D(GLuint sourceId,
4375 GLint sourceLevel,
4376 TextureTarget destTarget,
4377 GLuint destId,
4378 GLint destLevel,
4379 GLint xoffset,
4380 GLint yoffset,
4381 GLint zoffset,
4382 GLint x,
4383 GLint y,
4384 GLint z,
4385 GLsizei width,
4386 GLsizei height,
4387 GLsizei depth,
4388 GLboolean unpackFlipY,
4389 GLboolean unpackPremultiplyAlpha,
4390 GLboolean unpackUnmultiplyAlpha)
4391{
4392 // Zero sized copies are valid but no-ops
4393 if (width == 0 || height == 0 || depth == 0)
4394 {
4395 return;
4396 }
4397
4398 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4399
4400 Texture *sourceTexture = getTexture(sourceId);
4401 Texture *destTexture = getTexture(destId);
4402 Offset offset(xoffset, yoffset, zoffset);
4403 Box box(x, y, z, width, height, depth);
4404 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004405 ConvertToBool(unpackFlipY),
4406 ConvertToBool(unpackPremultiplyAlpha),
4407 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004408}
4409
Jamie Madill007530e2017-12-28 14:27:04 -05004410void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004411{
Jamie Madillbc918e72018-03-08 09:47:21 -05004412 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004413
4414 gl::Texture *sourceTexture = getTexture(sourceId);
4415 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004416 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004417}
4418
Corentin Wallez336129f2017-10-17 15:55:40 -04004419void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004420{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004421 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004422 ASSERT(buffer);
4423
Geoff Lang496c02d2016-10-20 11:38:11 -07004424 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004425}
4426
Brandon Jones59770802018-04-02 13:18:42 -07004427void Context::getBufferPointervRobust(BufferBinding target,
4428 GLenum pname,
4429 GLsizei bufSize,
4430 GLsizei *length,
4431 void **params)
4432{
4433 getBufferPointerv(target, pname, params);
4434}
4435
Corentin Wallez336129f2017-10-17 15:55:40 -04004436void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004437{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004438 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004439 ASSERT(buffer);
4440
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004441 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004442 if (error.isError())
4443 {
Jamie Madill437fa652016-05-03 15:13:24 -04004444 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004445 return nullptr;
4446 }
4447
4448 return buffer->getMapPointer();
4449}
4450
Corentin Wallez336129f2017-10-17 15:55:40 -04004451GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004452{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004453 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004454 ASSERT(buffer);
4455
4456 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004457 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004458 if (error.isError())
4459 {
Jamie Madill437fa652016-05-03 15:13:24 -04004460 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004461 return GL_FALSE;
4462 }
4463
4464 return result;
4465}
4466
Corentin Wallez336129f2017-10-17 15:55:40 -04004467void *Context::mapBufferRange(BufferBinding target,
4468 GLintptr offset,
4469 GLsizeiptr length,
4470 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004471{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004472 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004473 ASSERT(buffer);
4474
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004475 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004476 if (error.isError())
4477 {
Jamie Madill437fa652016-05-03 15:13:24 -04004478 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004479 return nullptr;
4480 }
4481
4482 return buffer->getMapPointer();
4483}
4484
Corentin Wallez336129f2017-10-17 15:55:40 -04004485void Context::flushMappedBufferRange(BufferBinding /*target*/,
4486 GLintptr /*offset*/,
4487 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004488{
4489 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4490}
4491
Jamie Madillbc918e72018-03-08 09:47:21 -05004492Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004493{
Geoff Langa8cb2872018-03-09 16:09:40 -05004494 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004495}
4496
Jamie Madillbc918e72018-03-08 09:47:21 -05004497Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004498{
Geoff Langa8cb2872018-03-09 16:09:40 -05004499 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004500}
4501
Jamie Madillbc918e72018-03-08 09:47:21 -05004502Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004503{
Geoff Langa8cb2872018-03-09 16:09:40 -05004504 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004505}
4506
Geoff Lang9bf86f02018-07-26 11:46:34 -04004507Error Context::syncStateForPathOperation()
4508{
4509 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4510
4511 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4512 ANGLE_TRY(syncDirtyBits());
4513
4514 return NoError();
4515}
4516
Jiajia Qin5451d532017-11-16 17:16:34 +08004517void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4518{
4519 UNIMPLEMENTED();
4520}
4521
Jamie Madillc20ab272016-06-09 07:20:46 -07004522void Context::activeTexture(GLenum texture)
4523{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004524 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004525}
4526
Jamie Madill876429b2017-04-20 15:46:24 -04004527void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004528{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004529 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004530}
4531
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004532void Context::blendEquation(GLenum mode)
4533{
4534 mGLState.setBlendEquation(mode, mode);
4535}
4536
Jamie Madillc20ab272016-06-09 07:20:46 -07004537void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4538{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004539 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004540}
4541
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004542void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4543{
4544 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4545}
4546
Jamie Madillc20ab272016-06-09 07:20:46 -07004547void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4548{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004549 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004550}
4551
Jamie Madill876429b2017-04-20 15:46:24 -04004552void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004553{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004554 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004555}
4556
Jamie Madill876429b2017-04-20 15:46:24 -04004557void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004558{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004559 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004560}
4561
4562void Context::clearStencil(GLint s)
4563{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004564 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004565}
4566
4567void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4568{
Geoff Lang92019432017-11-20 13:09:34 -05004569 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4570 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004571}
4572
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004573void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004574{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004575 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004576}
4577
4578void Context::depthFunc(GLenum func)
4579{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004580 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004581}
4582
4583void Context::depthMask(GLboolean flag)
4584{
Geoff Lang92019432017-11-20 13:09:34 -05004585 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004586}
4587
Jamie Madill876429b2017-04-20 15:46:24 -04004588void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004589{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004590 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004591}
4592
4593void Context::disable(GLenum cap)
4594{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004595 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004596 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004597}
4598
4599void Context::disableVertexAttribArray(GLuint index)
4600{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004601 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004602 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004603}
4604
4605void Context::enable(GLenum cap)
4606{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004607 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004608 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004609}
4610
4611void Context::enableVertexAttribArray(GLuint index)
4612{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004613 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004614 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004615}
4616
4617void Context::frontFace(GLenum mode)
4618{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004619 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004620}
4621
4622void Context::hint(GLenum target, GLenum mode)
4623{
4624 switch (target)
4625 {
4626 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004627 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004628 break;
4629
4630 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004631 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004632 break;
4633
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004634 case GL_PERSPECTIVE_CORRECTION_HINT:
4635 case GL_POINT_SMOOTH_HINT:
4636 case GL_LINE_SMOOTH_HINT:
4637 case GL_FOG_HINT:
4638 mGLState.gles1().setHint(target, mode);
4639 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004640 default:
4641 UNREACHABLE();
4642 return;
4643 }
4644}
4645
4646void Context::lineWidth(GLfloat width)
4647{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004648 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004649}
4650
4651void Context::pixelStorei(GLenum pname, GLint param)
4652{
4653 switch (pname)
4654 {
4655 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004656 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004657 break;
4658
4659 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004660 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004661 break;
4662
4663 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004664 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004665 break;
4666
4667 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004668 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004669 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004670 break;
4671
4672 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004673 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004674 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675 break;
4676
4677 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004678 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004679 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004680 break;
4681
4682 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004683 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004684 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004685 break;
4686
4687 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004688 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004689 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004690 break;
4691
4692 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004693 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004694 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004695 break;
4696
4697 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004698 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004699 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004700 break;
4701
4702 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004703 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004704 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004705 break;
4706
4707 default:
4708 UNREACHABLE();
4709 return;
4710 }
4711}
4712
4713void Context::polygonOffset(GLfloat factor, GLfloat units)
4714{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004715 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004716}
4717
Jamie Madill876429b2017-04-20 15:46:24 -04004718void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004719{
Geoff Lang92019432017-11-20 13:09:34 -05004720 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004721}
4722
Jiawei Shaodb342272017-09-27 10:21:45 +08004723void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4724{
4725 mGLState.setSampleMaskParams(maskNumber, mask);
4726}
4727
Jamie Madillc20ab272016-06-09 07:20:46 -07004728void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4729{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004730 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004731}
4732
4733void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4734{
4735 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4736 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004737 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004738 }
4739
4740 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4741 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004742 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004743 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004744
4745 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004746}
4747
4748void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4749{
4750 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4751 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004752 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004753 }
4754
4755 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4756 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004757 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004758 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004759
4760 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004761}
4762
4763void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4764{
4765 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4766 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004767 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004768 }
4769
4770 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4771 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004772 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004773 }
4774}
4775
4776void Context::vertexAttrib1f(GLuint index, GLfloat x)
4777{
4778 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004779 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004780 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004781}
4782
4783void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4784{
4785 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004786 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004787 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004788}
4789
4790void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4791{
4792 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004793 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004794 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004795}
4796
4797void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4798{
4799 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004800 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004801 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004802}
4803
4804void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4805{
4806 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004807 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004808 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004809}
4810
4811void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4812{
4813 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004814 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004815 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004816}
4817
4818void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4819{
4820 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004821 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004822 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004823}
4824
4825void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4826{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004827 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004828 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004829}
4830
4831void Context::vertexAttribPointer(GLuint index,
4832 GLint size,
4833 GLenum type,
4834 GLboolean normalized,
4835 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004836 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004837{
Corentin Wallez336129f2017-10-17 15:55:40 -04004838 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004839 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004840 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004841}
4842
Shao80957d92017-02-20 21:25:59 +08004843void Context::vertexAttribFormat(GLuint attribIndex,
4844 GLint size,
4845 GLenum type,
4846 GLboolean normalized,
4847 GLuint relativeOffset)
4848{
Geoff Lang92019432017-11-20 13:09:34 -05004849 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004850 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004851 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004852}
4853
4854void Context::vertexAttribIFormat(GLuint attribIndex,
4855 GLint size,
4856 GLenum type,
4857 GLuint relativeOffset)
4858{
4859 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004860 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004861}
4862
4863void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4864{
Shaodde78e82017-05-22 14:13:27 +08004865 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004866 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004867}
4868
Jiajia Qin5451d532017-11-16 17:16:34 +08004869void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004870{
4871 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004872 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004873}
4874
Jamie Madillc20ab272016-06-09 07:20:46 -07004875void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4876{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004877 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004878}
4879
4880void Context::vertexAttribIPointer(GLuint index,
4881 GLint size,
4882 GLenum type,
4883 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004884 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004885{
Corentin Wallez336129f2017-10-17 15:55:40 -04004886 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4887 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004888 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004889}
4890
4891void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4892{
4893 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004894 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004895 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004896}
4897
4898void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4899{
4900 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004901 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004902 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004903}
4904
4905void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4906{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004907 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004908 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004909}
4910
4911void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4912{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004913 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004914 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004915}
4916
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004917void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4918{
4919 const VertexAttribCurrentValueData &currentValues =
4920 getGLState().getVertexAttribCurrentValue(index);
4921 const VertexArray *vao = getGLState().getVertexArray();
4922 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4923 currentValues, pname, params);
4924}
4925
Brandon Jones59770802018-04-02 13:18:42 -07004926void Context::getVertexAttribivRobust(GLuint index,
4927 GLenum pname,
4928 GLsizei bufSize,
4929 GLsizei *length,
4930 GLint *params)
4931{
4932 getVertexAttribiv(index, pname, params);
4933}
4934
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004935void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4936{
4937 const VertexAttribCurrentValueData &currentValues =
4938 getGLState().getVertexAttribCurrentValue(index);
4939 const VertexArray *vao = getGLState().getVertexArray();
4940 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4941 currentValues, pname, params);
4942}
4943
Brandon Jones59770802018-04-02 13:18:42 -07004944void Context::getVertexAttribfvRobust(GLuint index,
4945 GLenum pname,
4946 GLsizei bufSize,
4947 GLsizei *length,
4948 GLfloat *params)
4949{
4950 getVertexAttribfv(index, pname, params);
4951}
4952
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004953void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4954{
4955 const VertexAttribCurrentValueData &currentValues =
4956 getGLState().getVertexAttribCurrentValue(index);
4957 const VertexArray *vao = getGLState().getVertexArray();
4958 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4959 currentValues, pname, params);
4960}
4961
Brandon Jones59770802018-04-02 13:18:42 -07004962void Context::getVertexAttribIivRobust(GLuint index,
4963 GLenum pname,
4964 GLsizei bufSize,
4965 GLsizei *length,
4966 GLint *params)
4967{
4968 getVertexAttribIiv(index, pname, params);
4969}
4970
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004971void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4972{
4973 const VertexAttribCurrentValueData &currentValues =
4974 getGLState().getVertexAttribCurrentValue(index);
4975 const VertexArray *vao = getGLState().getVertexArray();
4976 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4977 currentValues, pname, params);
4978}
4979
Brandon Jones59770802018-04-02 13:18:42 -07004980void Context::getVertexAttribIuivRobust(GLuint index,
4981 GLenum pname,
4982 GLsizei bufSize,
4983 GLsizei *length,
4984 GLuint *params)
4985{
4986 getVertexAttribIuiv(index, pname, params);
4987}
4988
Jamie Madill876429b2017-04-20 15:46:24 -04004989void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004990{
4991 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4992 QueryVertexAttribPointerv(attrib, pname, pointer);
4993}
4994
Brandon Jones59770802018-04-02 13:18:42 -07004995void Context::getVertexAttribPointervRobust(GLuint index,
4996 GLenum pname,
4997 GLsizei bufSize,
4998 GLsizei *length,
4999 void **pointer)
5000{
5001 getVertexAttribPointerv(index, pname, pointer);
5002}
5003
Jamie Madillc20ab272016-06-09 07:20:46 -07005004void Context::debugMessageControl(GLenum source,
5005 GLenum type,
5006 GLenum severity,
5007 GLsizei count,
5008 const GLuint *ids,
5009 GLboolean enabled)
5010{
5011 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005012 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005013 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005014}
5015
5016void Context::debugMessageInsert(GLenum source,
5017 GLenum type,
5018 GLuint id,
5019 GLenum severity,
5020 GLsizei length,
5021 const GLchar *buf)
5022{
5023 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005024 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005025}
5026
5027void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5028{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005029 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005030}
5031
5032GLuint Context::getDebugMessageLog(GLuint count,
5033 GLsizei bufSize,
5034 GLenum *sources,
5035 GLenum *types,
5036 GLuint *ids,
5037 GLenum *severities,
5038 GLsizei *lengths,
5039 GLchar *messageLog)
5040{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005041 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5042 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005043}
5044
5045void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5046{
5047 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005048 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005049 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005050}
5051
5052void Context::popDebugGroup()
5053{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005054 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005055 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005056}
5057
Corentin Wallez336129f2017-10-17 15:55:40 -04005058void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005059{
5060 Buffer *buffer = mGLState.getTargetBuffer(target);
5061 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005062 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005063}
5064
Corentin Wallez336129f2017-10-17 15:55:40 -04005065void Context::bufferSubData(BufferBinding target,
5066 GLintptr offset,
5067 GLsizeiptr size,
5068 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005069{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005070 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005071 {
5072 return;
5073 }
5074
5075 Buffer *buffer = mGLState.getTargetBuffer(target);
5076 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005077 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005078}
5079
Jamie Madillef300b12016-10-07 15:12:09 -04005080void Context::attachShader(GLuint program, GLuint shader)
5081{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005082 Program *programObject = mState.mShaderPrograms->getProgram(program);
5083 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005084 ASSERT(programObject && shaderObject);
5085 programObject->attachShader(shaderObject);
5086}
5087
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005088const Workarounds &Context::getWorkarounds() const
5089{
5090 return mWorkarounds;
5091}
5092
Corentin Wallez336129f2017-10-17 15:55:40 -04005093void Context::copyBufferSubData(BufferBinding readTarget,
5094 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005095 GLintptr readOffset,
5096 GLintptr writeOffset,
5097 GLsizeiptr size)
5098{
5099 // if size is zero, the copy is a successful no-op
5100 if (size == 0)
5101 {
5102 return;
5103 }
5104
5105 // TODO(jmadill): cache these.
5106 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5107 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5108
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005109 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005110}
5111
Jamie Madill01a80ee2016-11-07 12:06:18 -05005112void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5113{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005114 // Ideally we could share the program query with the validation layer if possible.
5115 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005116 ASSERT(programObject);
5117 programObject->bindAttributeLocation(index, name);
5118}
5119
Corentin Wallez336129f2017-10-17 15:55:40 -04005120void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005121{
Corentin Wallez336129f2017-10-17 15:55:40 -04005122 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5123 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005124 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005125}
5126
Corentin Wallez336129f2017-10-17 15:55:40 -04005127void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005128{
5129 bindBufferRange(target, index, buffer, 0, 0);
5130}
5131
Corentin Wallez336129f2017-10-17 15:55:40 -04005132void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005133 GLuint index,
5134 GLuint buffer,
5135 GLintptr offset,
5136 GLsizeiptr size)
5137{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005138 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5139 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5140 if (target == BufferBinding::Uniform)
5141 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005142 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005143 mStateCache.onUniformBufferStateChange(this);
5144 }
5145 else
5146 {
5147 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005148 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005149}
5150
Jamie Madill01a80ee2016-11-07 12:06:18 -05005151void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5152{
5153 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5154 {
5155 bindReadFramebuffer(framebuffer);
5156 }
5157
5158 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5159 {
5160 bindDrawFramebuffer(framebuffer);
5161 }
5162}
5163
5164void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5165{
5166 ASSERT(target == GL_RENDERBUFFER);
5167 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005168 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005169 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005170}
5171
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005172void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005173 GLsizei samples,
5174 GLenum internalformat,
5175 GLsizei width,
5176 GLsizei height,
5177 GLboolean fixedsamplelocations)
5178{
5179 Extents size(width, height, 1);
5180 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005181 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5182 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005183}
5184
Olli Etuaho89664842018-08-24 14:45:36 +03005185void Context::texStorage3DMultisample(TextureType target,
5186 GLsizei samples,
5187 GLenum internalformat,
5188 GLsizei width,
5189 GLsizei height,
5190 GLsizei depth,
5191 GLboolean fixedsamplelocations)
5192{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005193 Extents size(width, height, depth);
5194 Texture *texture = getTargetTexture(target);
5195 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5196 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005197}
5198
JiangYizhoubddc46b2016-12-09 09:50:51 +08005199void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5200{
JiangYizhou5b03f472017-01-09 10:22:53 +08005201 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5202 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005203 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005204 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005205
5206 switch (pname)
5207 {
5208 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005209 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005210 break;
5211 default:
5212 UNREACHABLE();
5213 }
5214}
5215
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005216void Context::getMultisamplefvRobust(GLenum pname,
5217 GLuint index,
5218 GLsizei bufSize,
5219 GLsizei *length,
5220 GLfloat *val)
5221{
5222 UNIMPLEMENTED();
5223}
5224
Jamie Madille8fb6402017-02-14 17:56:40 -05005225void Context::renderbufferStorage(GLenum target,
5226 GLenum internalformat,
5227 GLsizei width,
5228 GLsizei height)
5229{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005230 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5231 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5232
Jamie Madille8fb6402017-02-14 17:56:40 -05005233 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005234 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005235}
5236
5237void Context::renderbufferStorageMultisample(GLenum target,
5238 GLsizei samples,
5239 GLenum internalformat,
5240 GLsizei width,
5241 GLsizei height)
5242{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005243 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5244 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005245
5246 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005247 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005248 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005249}
5250
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005251void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5252{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005253 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005254 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005255}
5256
JiangYizhoue18e6392017-02-20 10:32:23 +08005257void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5258{
5259 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5260 QueryFramebufferParameteriv(framebuffer, pname, params);
5261}
5262
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005263void Context::getFramebufferParameterivRobust(GLenum target,
5264 GLenum pname,
5265 GLsizei bufSize,
5266 GLsizei *length,
5267 GLint *params)
5268{
5269 UNIMPLEMENTED();
5270}
5271
Jiajia Qin5451d532017-11-16 17:16:34 +08005272void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005273{
5274 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005275 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005276}
5277
Jamie Madilldec86232018-07-11 09:01:18 -04005278bool Context::getScratchBuffer(size_t requstedSizeBytes,
5279 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005280{
Jamie Madilldec86232018-07-11 09:01:18 -04005281 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005282}
5283
Jamie Madilldec86232018-07-11 09:01:18 -04005284bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5285 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005286{
Jamie Madilldec86232018-07-11 09:01:18 -04005287 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005288}
5289
Xinghua Cao10a4d432017-11-28 14:46:26 +08005290Error Context::prepareForDispatch()
5291{
Geoff Langa8cb2872018-03-09 16:09:40 -05005292 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005293
5294 if (isRobustResourceInitEnabled())
5295 {
5296 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5297 }
5298
5299 return NoError();
5300}
5301
Xinghua Cao2b396592017-03-29 15:36:04 +08005302void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5303{
5304 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5305 {
5306 return;
5307 }
5308
Xinghua Cao10a4d432017-11-28 14:46:26 +08005309 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005310 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005311}
5312
Jiajia Qin5451d532017-11-16 17:16:34 +08005313void Context::dispatchComputeIndirect(GLintptr indirect)
5314{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005315 ANGLE_CONTEXT_TRY(prepareForDispatch());
5316 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005317}
5318
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005319void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005320 GLsizei levels,
5321 GLenum internalFormat,
5322 GLsizei width,
5323 GLsizei height)
5324{
5325 Extents size(width, height, 1);
5326 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005327 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005328}
5329
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005330void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005331 GLsizei levels,
5332 GLenum internalFormat,
5333 GLsizei width,
5334 GLsizei height,
5335 GLsizei depth)
5336{
5337 Extents size(width, height, depth);
5338 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005339 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005340}
5341
Jiajia Qin5451d532017-11-16 17:16:34 +08005342void Context::memoryBarrier(GLbitfield barriers)
5343{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005344 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005345}
5346
5347void Context::memoryBarrierByRegion(GLbitfield barriers)
5348{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005349 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005350}
5351
Jamie Madillc1d770e2017-04-13 17:31:24 -04005352GLenum Context::checkFramebufferStatus(GLenum target)
5353{
5354 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5355 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005356 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005357}
5358
5359void Context::compileShader(GLuint shader)
5360{
5361 Shader *shaderObject = GetValidShader(this, shader);
5362 if (!shaderObject)
5363 {
5364 return;
5365 }
5366 shaderObject->compile(this);
5367}
5368
5369void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5370{
5371 for (int i = 0; i < n; i++)
5372 {
5373 deleteBuffer(buffers[i]);
5374 }
5375}
5376
5377void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5378{
5379 for (int i = 0; i < n; i++)
5380 {
5381 if (framebuffers[i] != 0)
5382 {
5383 deleteFramebuffer(framebuffers[i]);
5384 }
5385 }
5386}
5387
5388void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5389{
5390 for (int i = 0; i < n; i++)
5391 {
5392 deleteRenderbuffer(renderbuffers[i]);
5393 }
5394}
5395
5396void Context::deleteTextures(GLsizei n, const GLuint *textures)
5397{
5398 for (int i = 0; i < n; i++)
5399 {
5400 if (textures[i] != 0)
5401 {
5402 deleteTexture(textures[i]);
5403 }
5404 }
5405}
5406
5407void Context::detachShader(GLuint program, GLuint shader)
5408{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005409 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005410 ASSERT(programObject);
5411
5412 Shader *shaderObject = getShader(shader);
5413 ASSERT(shaderObject);
5414
5415 programObject->detachShader(this, shaderObject);
5416}
5417
5418void Context::genBuffers(GLsizei n, GLuint *buffers)
5419{
5420 for (int i = 0; i < n; i++)
5421 {
5422 buffers[i] = createBuffer();
5423 }
5424}
5425
5426void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5427{
5428 for (int i = 0; i < n; i++)
5429 {
5430 framebuffers[i] = createFramebuffer();
5431 }
5432}
5433
5434void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5435{
5436 for (int i = 0; i < n; i++)
5437 {
5438 renderbuffers[i] = createRenderbuffer();
5439 }
5440}
5441
5442void Context::genTextures(GLsizei n, GLuint *textures)
5443{
5444 for (int i = 0; i < n; i++)
5445 {
5446 textures[i] = createTexture();
5447 }
5448}
5449
5450void Context::getActiveAttrib(GLuint program,
5451 GLuint index,
5452 GLsizei bufsize,
5453 GLsizei *length,
5454 GLint *size,
5455 GLenum *type,
5456 GLchar *name)
5457{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005458 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005459 ASSERT(programObject);
5460 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5461}
5462
5463void Context::getActiveUniform(GLuint program,
5464 GLuint index,
5465 GLsizei bufsize,
5466 GLsizei *length,
5467 GLint *size,
5468 GLenum *type,
5469 GLchar *name)
5470{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005471 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005472 ASSERT(programObject);
5473 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5474}
5475
5476void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5477{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005478 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005479 ASSERT(programObject);
5480 programObject->getAttachedShaders(maxcount, count, shaders);
5481}
5482
5483GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5484{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005485 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005486 ASSERT(programObject);
5487 return programObject->getAttributeLocation(name);
5488}
5489
5490void Context::getBooleanv(GLenum pname, GLboolean *params)
5491{
5492 GLenum nativeType;
5493 unsigned int numParams = 0;
5494 getQueryParameterInfo(pname, &nativeType, &numParams);
5495
5496 if (nativeType == GL_BOOL)
5497 {
5498 getBooleanvImpl(pname, params);
5499 }
5500 else
5501 {
5502 CastStateValues(this, nativeType, pname, numParams, params);
5503 }
5504}
5505
Brandon Jones59770802018-04-02 13:18:42 -07005506void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5507{
5508 getBooleanv(pname, params);
5509}
5510
Jamie Madillc1d770e2017-04-13 17:31:24 -04005511void Context::getFloatv(GLenum pname, GLfloat *params)
5512{
5513 GLenum nativeType;
5514 unsigned int numParams = 0;
5515 getQueryParameterInfo(pname, &nativeType, &numParams);
5516
5517 if (nativeType == GL_FLOAT)
5518 {
5519 getFloatvImpl(pname, params);
5520 }
5521 else
5522 {
5523 CastStateValues(this, nativeType, pname, numParams, params);
5524 }
5525}
5526
Brandon Jones59770802018-04-02 13:18:42 -07005527void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5528{
5529 getFloatv(pname, params);
5530}
5531
Jamie Madillc1d770e2017-04-13 17:31:24 -04005532void Context::getIntegerv(GLenum pname, GLint *params)
5533{
5534 GLenum nativeType;
5535 unsigned int numParams = 0;
5536 getQueryParameterInfo(pname, &nativeType, &numParams);
5537
5538 if (nativeType == GL_INT)
5539 {
5540 getIntegervImpl(pname, params);
5541 }
5542 else
5543 {
5544 CastStateValues(this, nativeType, pname, numParams, params);
5545 }
5546}
5547
Brandon Jones59770802018-04-02 13:18:42 -07005548void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5549{
5550 getIntegerv(pname, data);
5551}
5552
Jamie Madillc1d770e2017-04-13 17:31:24 -04005553void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5554{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005555 // Don't resolve link if checking the link completion status.
5556 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5557 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005558 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005559 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005560}
5561
Brandon Jones59770802018-04-02 13:18:42 -07005562void Context::getProgramivRobust(GLuint program,
5563 GLenum pname,
5564 GLsizei bufSize,
5565 GLsizei *length,
5566 GLint *params)
5567{
5568 getProgramiv(program, pname, params);
5569}
5570
Jiajia Qin5451d532017-11-16 17:16:34 +08005571void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5572{
5573 UNIMPLEMENTED();
5574}
5575
Jamie Madillbe849e42017-05-02 15:49:00 -04005576void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005577{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005578 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005579 ASSERT(programObject);
5580 programObject->getInfoLog(bufsize, length, infolog);
5581}
5582
Jiajia Qin5451d532017-11-16 17:16:34 +08005583void Context::getProgramPipelineInfoLog(GLuint pipeline,
5584 GLsizei bufSize,
5585 GLsizei *length,
5586 GLchar *infoLog)
5587{
5588 UNIMPLEMENTED();
5589}
5590
Jamie Madillc1d770e2017-04-13 17:31:24 -04005591void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5592{
5593 Shader *shaderObject = getShader(shader);
5594 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005595 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005596}
5597
Brandon Jones59770802018-04-02 13:18:42 -07005598void Context::getShaderivRobust(GLuint shader,
5599 GLenum pname,
5600 GLsizei bufSize,
5601 GLsizei *length,
5602 GLint *params)
5603{
5604 getShaderiv(shader, pname, params);
5605}
5606
Jamie Madillc1d770e2017-04-13 17:31:24 -04005607void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5608{
5609 Shader *shaderObject = getShader(shader);
5610 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005611 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005612}
5613
5614void Context::getShaderPrecisionFormat(GLenum shadertype,
5615 GLenum precisiontype,
5616 GLint *range,
5617 GLint *precision)
5618{
5619 // TODO(jmadill): Compute shaders.
5620
5621 switch (shadertype)
5622 {
5623 case GL_VERTEX_SHADER:
5624 switch (precisiontype)
5625 {
5626 case GL_LOW_FLOAT:
5627 mCaps.vertexLowpFloat.get(range, precision);
5628 break;
5629 case GL_MEDIUM_FLOAT:
5630 mCaps.vertexMediumpFloat.get(range, precision);
5631 break;
5632 case GL_HIGH_FLOAT:
5633 mCaps.vertexHighpFloat.get(range, precision);
5634 break;
5635
5636 case GL_LOW_INT:
5637 mCaps.vertexLowpInt.get(range, precision);
5638 break;
5639 case GL_MEDIUM_INT:
5640 mCaps.vertexMediumpInt.get(range, precision);
5641 break;
5642 case GL_HIGH_INT:
5643 mCaps.vertexHighpInt.get(range, precision);
5644 break;
5645
5646 default:
5647 UNREACHABLE();
5648 return;
5649 }
5650 break;
5651
5652 case GL_FRAGMENT_SHADER:
5653 switch (precisiontype)
5654 {
5655 case GL_LOW_FLOAT:
5656 mCaps.fragmentLowpFloat.get(range, precision);
5657 break;
5658 case GL_MEDIUM_FLOAT:
5659 mCaps.fragmentMediumpFloat.get(range, precision);
5660 break;
5661 case GL_HIGH_FLOAT:
5662 mCaps.fragmentHighpFloat.get(range, precision);
5663 break;
5664
5665 case GL_LOW_INT:
5666 mCaps.fragmentLowpInt.get(range, precision);
5667 break;
5668 case GL_MEDIUM_INT:
5669 mCaps.fragmentMediumpInt.get(range, precision);
5670 break;
5671 case GL_HIGH_INT:
5672 mCaps.fragmentHighpInt.get(range, precision);
5673 break;
5674
5675 default:
5676 UNREACHABLE();
5677 return;
5678 }
5679 break;
5680
5681 default:
5682 UNREACHABLE();
5683 return;
5684 }
5685}
5686
5687void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5688{
5689 Shader *shaderObject = getShader(shader);
5690 ASSERT(shaderObject);
5691 shaderObject->getSource(bufsize, length, source);
5692}
5693
5694void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5695{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005696 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005697 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005698 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005699}
5700
Brandon Jones59770802018-04-02 13:18:42 -07005701void Context::getUniformfvRobust(GLuint program,
5702 GLint location,
5703 GLsizei bufSize,
5704 GLsizei *length,
5705 GLfloat *params)
5706{
5707 getUniformfv(program, location, params);
5708}
5709
Jamie Madillc1d770e2017-04-13 17:31:24 -04005710void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5711{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005712 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005713 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005714 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005715}
5716
Brandon Jones59770802018-04-02 13:18:42 -07005717void Context::getUniformivRobust(GLuint program,
5718 GLint location,
5719 GLsizei bufSize,
5720 GLsizei *length,
5721 GLint *params)
5722{
5723 getUniformiv(program, location, params);
5724}
5725
Jamie Madillc1d770e2017-04-13 17:31:24 -04005726GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5727{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005728 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005729 ASSERT(programObject);
5730 return programObject->getUniformLocation(name);
5731}
5732
5733GLboolean Context::isBuffer(GLuint buffer)
5734{
5735 if (buffer == 0)
5736 {
5737 return GL_FALSE;
5738 }
5739
5740 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5741}
5742
5743GLboolean Context::isEnabled(GLenum cap)
5744{
5745 return mGLState.getEnableFeature(cap);
5746}
5747
5748GLboolean Context::isFramebuffer(GLuint framebuffer)
5749{
5750 if (framebuffer == 0)
5751 {
5752 return GL_FALSE;
5753 }
5754
5755 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5756}
5757
5758GLboolean Context::isProgram(GLuint program)
5759{
5760 if (program == 0)
5761 {
5762 return GL_FALSE;
5763 }
5764
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005765 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005766}
5767
5768GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5769{
5770 if (renderbuffer == 0)
5771 {
5772 return GL_FALSE;
5773 }
5774
5775 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5776}
5777
5778GLboolean Context::isShader(GLuint shader)
5779{
5780 if (shader == 0)
5781 {
5782 return GL_FALSE;
5783 }
5784
5785 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5786}
5787
5788GLboolean Context::isTexture(GLuint texture)
5789{
5790 if (texture == 0)
5791 {
5792 return GL_FALSE;
5793 }
5794
5795 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5796}
5797
5798void Context::linkProgram(GLuint program)
5799{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005800 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005801 ASSERT(programObject);
5802 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005803
5804 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5805 // don't need to worry that:
5806 // 1. Draw calls after link use the new executable code or the old one depending on the link
5807 // result.
5808 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5809 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5810 // ProgramD3D.
5811 if (programObject->isInUse())
5812 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005813 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005814 if (programObject->isLinked())
5815 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005816 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005817 }
jchen107ae70d82018-07-06 13:47:01 +08005818 mStateCache.onProgramExecutableChange(this);
5819 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005820}
5821
5822void Context::releaseShaderCompiler()
5823{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005824 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005825}
5826
5827void Context::shaderBinary(GLsizei n,
5828 const GLuint *shaders,
5829 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005830 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005831 GLsizei length)
5832{
5833 // No binary shader formats are supported.
5834 UNIMPLEMENTED();
5835}
5836
Olli Etuaho0ca09752018-09-24 11:00:50 +03005837void Context::bindFragDataLocationIndexed(GLuint program,
5838 GLuint colorNumber,
5839 GLuint index,
5840 const char *name)
5841{
5842 Program *programObject = getProgramNoResolveLink(program);
5843 programObject->bindFragmentOutputLocation(colorNumber, name);
5844 programObject->bindFragmentOutputIndex(index, name);
5845}
5846
5847void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5848{
5849 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5850}
5851
5852int Context::getFragDataIndex(GLuint program, const char *name)
5853{
5854 Program *programObject = getProgramResolveLink(program);
5855 return programObject->getFragDataIndex(name);
5856}
5857
5858int Context::getProgramResourceLocationIndex(GLuint program,
5859 GLenum programInterface,
5860 const char *name)
5861{
5862 Program *programObject = getProgramResolveLink(program);
5863 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5864 return programObject->getFragDataIndex(name);
5865}
5866
Jamie Madillc1d770e2017-04-13 17:31:24 -04005867void Context::shaderSource(GLuint shader,
5868 GLsizei count,
5869 const GLchar *const *string,
5870 const GLint *length)
5871{
5872 Shader *shaderObject = getShader(shader);
5873 ASSERT(shaderObject);
5874 shaderObject->setSource(count, string, length);
5875}
5876
5877void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5878{
5879 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5880}
5881
5882void Context::stencilMask(GLuint mask)
5883{
5884 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5885}
5886
5887void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5888{
5889 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5890}
5891
5892void Context::uniform1f(GLint location, GLfloat x)
5893{
5894 Program *program = mGLState.getProgram();
5895 program->setUniform1fv(location, 1, &x);
5896}
5897
5898void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5899{
5900 Program *program = mGLState.getProgram();
5901 program->setUniform1fv(location, count, v);
5902}
5903
Jamie Madill7e4eff12018-08-08 15:49:26 -04005904void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005905{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005906 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005907 {
5908 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005909 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005910 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005911}
5912
Jamie Madill7e4eff12018-08-08 15:49:26 -04005913void Context::uniform1i(GLint location, GLint x)
5914{
5915 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5916}
5917
Jamie Madillc1d770e2017-04-13 17:31:24 -04005918void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5919{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005920 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005921}
5922
5923void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5924{
5925 GLfloat xy[2] = {x, y};
5926 Program *program = mGLState.getProgram();
5927 program->setUniform2fv(location, 1, xy);
5928}
5929
5930void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5931{
5932 Program *program = mGLState.getProgram();
5933 program->setUniform2fv(location, count, v);
5934}
5935
5936void Context::uniform2i(GLint location, GLint x, GLint y)
5937{
5938 GLint xy[2] = {x, y};
5939 Program *program = mGLState.getProgram();
5940 program->setUniform2iv(location, 1, xy);
5941}
5942
5943void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5944{
5945 Program *program = mGLState.getProgram();
5946 program->setUniform2iv(location, count, v);
5947}
5948
5949void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5950{
5951 GLfloat xyz[3] = {x, y, z};
5952 Program *program = mGLState.getProgram();
5953 program->setUniform3fv(location, 1, xyz);
5954}
5955
5956void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5957{
5958 Program *program = mGLState.getProgram();
5959 program->setUniform3fv(location, count, v);
5960}
5961
5962void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5963{
5964 GLint xyz[3] = {x, y, z};
5965 Program *program = mGLState.getProgram();
5966 program->setUniform3iv(location, 1, xyz);
5967}
5968
5969void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5970{
5971 Program *program = mGLState.getProgram();
5972 program->setUniform3iv(location, count, v);
5973}
5974
5975void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5976{
5977 GLfloat xyzw[4] = {x, y, z, w};
5978 Program *program = mGLState.getProgram();
5979 program->setUniform4fv(location, 1, xyzw);
5980}
5981
5982void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5983{
5984 Program *program = mGLState.getProgram();
5985 program->setUniform4fv(location, count, v);
5986}
5987
5988void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5989{
5990 GLint xyzw[4] = {x, y, z, w};
5991 Program *program = mGLState.getProgram();
5992 program->setUniform4iv(location, 1, xyzw);
5993}
5994
5995void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5996{
5997 Program *program = mGLState.getProgram();
5998 program->setUniform4iv(location, count, v);
5999}
6000
6001void Context::uniformMatrix2fv(GLint location,
6002 GLsizei count,
6003 GLboolean transpose,
6004 const GLfloat *value)
6005{
6006 Program *program = mGLState.getProgram();
6007 program->setUniformMatrix2fv(location, count, transpose, value);
6008}
6009
6010void Context::uniformMatrix3fv(GLint location,
6011 GLsizei count,
6012 GLboolean transpose,
6013 const GLfloat *value)
6014{
6015 Program *program = mGLState.getProgram();
6016 program->setUniformMatrix3fv(location, count, transpose, value);
6017}
6018
6019void Context::uniformMatrix4fv(GLint location,
6020 GLsizei count,
6021 GLboolean transpose,
6022 const GLfloat *value)
6023{
6024 Program *program = mGLState.getProgram();
6025 program->setUniformMatrix4fv(location, count, transpose, value);
6026}
6027
6028void Context::validateProgram(GLuint program)
6029{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006030 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006031 ASSERT(programObject);
6032 programObject->validate(mCaps);
6033}
6034
Jiajia Qin5451d532017-11-16 17:16:34 +08006035void Context::validateProgramPipeline(GLuint pipeline)
6036{
6037 UNIMPLEMENTED();
6038}
6039
Jamie Madilld04908b2017-06-09 14:15:35 -04006040void Context::getProgramBinary(GLuint program,
6041 GLsizei bufSize,
6042 GLsizei *length,
6043 GLenum *binaryFormat,
6044 void *binary)
6045{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006046 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006047 ASSERT(programObject != nullptr);
6048
6049 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6050}
6051
6052void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6053{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006054 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006055 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006056
Jamie Madilld04908b2017-06-09 14:15:35 -04006057 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006058 if (programObject->isInUse())
6059 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006060 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006061 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006062 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006063}
6064
Jamie Madillff325f12017-08-26 15:06:05 -04006065void Context::uniform1ui(GLint location, GLuint v0)
6066{
6067 Program *program = mGLState.getProgram();
6068 program->setUniform1uiv(location, 1, &v0);
6069}
6070
6071void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6072{
6073 Program *program = mGLState.getProgram();
6074 const GLuint xy[] = {v0, v1};
6075 program->setUniform2uiv(location, 1, xy);
6076}
6077
6078void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6079{
6080 Program *program = mGLState.getProgram();
6081 const GLuint xyz[] = {v0, v1, v2};
6082 program->setUniform3uiv(location, 1, xyz);
6083}
6084
6085void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6086{
6087 Program *program = mGLState.getProgram();
6088 const GLuint xyzw[] = {v0, v1, v2, v3};
6089 program->setUniform4uiv(location, 1, xyzw);
6090}
6091
6092void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6093{
6094 Program *program = mGLState.getProgram();
6095 program->setUniform1uiv(location, count, value);
6096}
6097void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6098{
6099 Program *program = mGLState.getProgram();
6100 program->setUniform2uiv(location, count, value);
6101}
6102
6103void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6104{
6105 Program *program = mGLState.getProgram();
6106 program->setUniform3uiv(location, count, value);
6107}
6108
6109void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6110{
6111 Program *program = mGLState.getProgram();
6112 program->setUniform4uiv(location, count, value);
6113}
6114
Jamie Madillf0e04492017-08-26 15:28:42 -04006115void Context::genQueries(GLsizei n, GLuint *ids)
6116{
6117 for (GLsizei i = 0; i < n; i++)
6118 {
6119 GLuint handle = mQueryHandleAllocator.allocate();
6120 mQueryMap.assign(handle, nullptr);
6121 ids[i] = handle;
6122 }
6123}
6124
6125void Context::deleteQueries(GLsizei n, const GLuint *ids)
6126{
6127 for (int i = 0; i < n; i++)
6128 {
6129 GLuint query = ids[i];
6130
6131 Query *queryObject = nullptr;
6132 if (mQueryMap.erase(query, &queryObject))
6133 {
6134 mQueryHandleAllocator.release(query);
6135 if (queryObject)
6136 {
6137 queryObject->release(this);
6138 }
6139 }
6140 }
6141}
6142
6143GLboolean Context::isQuery(GLuint id)
6144{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006145 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006146}
6147
Jamie Madillc8c95812017-08-26 18:40:09 -04006148void Context::uniformMatrix2x3fv(GLint location,
6149 GLsizei count,
6150 GLboolean transpose,
6151 const GLfloat *value)
6152{
6153 Program *program = mGLState.getProgram();
6154 program->setUniformMatrix2x3fv(location, count, transpose, value);
6155}
6156
6157void Context::uniformMatrix3x2fv(GLint location,
6158 GLsizei count,
6159 GLboolean transpose,
6160 const GLfloat *value)
6161{
6162 Program *program = mGLState.getProgram();
6163 program->setUniformMatrix3x2fv(location, count, transpose, value);
6164}
6165
6166void Context::uniformMatrix2x4fv(GLint location,
6167 GLsizei count,
6168 GLboolean transpose,
6169 const GLfloat *value)
6170{
6171 Program *program = mGLState.getProgram();
6172 program->setUniformMatrix2x4fv(location, count, transpose, value);
6173}
6174
6175void Context::uniformMatrix4x2fv(GLint location,
6176 GLsizei count,
6177 GLboolean transpose,
6178 const GLfloat *value)
6179{
6180 Program *program = mGLState.getProgram();
6181 program->setUniformMatrix4x2fv(location, count, transpose, value);
6182}
6183
6184void Context::uniformMatrix3x4fv(GLint location,
6185 GLsizei count,
6186 GLboolean transpose,
6187 const GLfloat *value)
6188{
6189 Program *program = mGLState.getProgram();
6190 program->setUniformMatrix3x4fv(location, count, transpose, value);
6191}
6192
6193void Context::uniformMatrix4x3fv(GLint location,
6194 GLsizei count,
6195 GLboolean transpose,
6196 const GLfloat *value)
6197{
6198 Program *program = mGLState.getProgram();
6199 program->setUniformMatrix4x3fv(location, count, transpose, value);
6200}
6201
Jamie Madilld7576732017-08-26 18:49:50 -04006202void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6203{
6204 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6205 {
6206 GLuint vertexArray = arrays[arrayIndex];
6207
6208 if (arrays[arrayIndex] != 0)
6209 {
6210 VertexArray *vertexArrayObject = nullptr;
6211 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6212 {
6213 if (vertexArrayObject != nullptr)
6214 {
6215 detachVertexArray(vertexArray);
6216 vertexArrayObject->onDestroy(this);
6217 }
6218
6219 mVertexArrayHandleAllocator.release(vertexArray);
6220 }
6221 }
6222 }
6223}
6224
6225void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6226{
6227 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6228 {
6229 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6230 mVertexArrayMap.assign(vertexArray, nullptr);
6231 arrays[arrayIndex] = vertexArray;
6232 }
6233}
6234
6235bool Context::isVertexArray(GLuint array)
6236{
6237 if (array == 0)
6238 {
6239 return GL_FALSE;
6240 }
6241
6242 VertexArray *vao = getVertexArray(array);
6243 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6244}
6245
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006246void Context::endTransformFeedback()
6247{
6248 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6249 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006250 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006251}
6252
6253void Context::transformFeedbackVaryings(GLuint program,
6254 GLsizei count,
6255 const GLchar *const *varyings,
6256 GLenum bufferMode)
6257{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006258 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006259 ASSERT(programObject);
6260 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6261}
6262
6263void Context::getTransformFeedbackVarying(GLuint program,
6264 GLuint index,
6265 GLsizei bufSize,
6266 GLsizei *length,
6267 GLsizei *size,
6268 GLenum *type,
6269 GLchar *name)
6270{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006271 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006272 ASSERT(programObject);
6273 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6274}
6275
6276void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6277{
6278 for (int i = 0; i < n; i++)
6279 {
6280 GLuint transformFeedback = ids[i];
6281 if (transformFeedback == 0)
6282 {
6283 continue;
6284 }
6285
6286 TransformFeedback *transformFeedbackObject = nullptr;
6287 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6288 {
6289 if (transformFeedbackObject != nullptr)
6290 {
6291 detachTransformFeedback(transformFeedback);
6292 transformFeedbackObject->release(this);
6293 }
6294
6295 mTransformFeedbackHandleAllocator.release(transformFeedback);
6296 }
6297 }
6298}
6299
6300void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6301{
6302 for (int i = 0; i < n; i++)
6303 {
6304 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6305 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6306 ids[i] = transformFeedback;
6307 }
6308}
6309
6310bool Context::isTransformFeedback(GLuint id)
6311{
6312 if (id == 0)
6313 {
6314 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6315 // returns FALSE
6316 return GL_FALSE;
6317 }
6318
6319 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6320 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6321}
6322
6323void Context::pauseTransformFeedback()
6324{
6325 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6326 transformFeedback->pause();
6327}
6328
6329void Context::resumeTransformFeedback()
6330{
6331 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6332 transformFeedback->resume();
6333}
6334
Jamie Madill12e957f2017-08-26 21:42:26 -04006335void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6336{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006337 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006338 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006339}
6340
Brandon Jones59770802018-04-02 13:18:42 -07006341void Context::getUniformuivRobust(GLuint program,
6342 GLint location,
6343 GLsizei bufSize,
6344 GLsizei *length,
6345 GLuint *params)
6346{
6347 getUniformuiv(program, location, params);
6348}
6349
Jamie Madill12e957f2017-08-26 21:42:26 -04006350GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6351{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006352 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006353 return programObject->getFragDataLocation(name);
6354}
6355
6356void Context::getUniformIndices(GLuint program,
6357 GLsizei uniformCount,
6358 const GLchar *const *uniformNames,
6359 GLuint *uniformIndices)
6360{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006361 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006362 if (!programObject->isLinked())
6363 {
6364 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6365 {
6366 uniformIndices[uniformId] = GL_INVALID_INDEX;
6367 }
6368 }
6369 else
6370 {
6371 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6372 {
6373 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6374 }
6375 }
6376}
6377
6378void Context::getActiveUniformsiv(GLuint program,
6379 GLsizei uniformCount,
6380 const GLuint *uniformIndices,
6381 GLenum pname,
6382 GLint *params)
6383{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006384 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006385 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6386 {
6387 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006388 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006389 }
6390}
6391
6392GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6393{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006394 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006395 return programObject->getUniformBlockIndex(uniformBlockName);
6396}
6397
6398void Context::getActiveUniformBlockiv(GLuint program,
6399 GLuint uniformBlockIndex,
6400 GLenum pname,
6401 GLint *params)
6402{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006403 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006404 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6405}
6406
Brandon Jones59770802018-04-02 13:18:42 -07006407void Context::getActiveUniformBlockivRobust(GLuint program,
6408 GLuint uniformBlockIndex,
6409 GLenum pname,
6410 GLsizei bufSize,
6411 GLsizei *length,
6412 GLint *params)
6413{
6414 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6415}
6416
Jamie Madill12e957f2017-08-26 21:42:26 -04006417void Context::getActiveUniformBlockName(GLuint program,
6418 GLuint uniformBlockIndex,
6419 GLsizei bufSize,
6420 GLsizei *length,
6421 GLchar *uniformBlockName)
6422{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006423 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006424 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6425}
6426
6427void Context::uniformBlockBinding(GLuint program,
6428 GLuint uniformBlockIndex,
6429 GLuint uniformBlockBinding)
6430{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006431 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006432 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006433
Jamie Madill956ab4d2018-10-10 16:13:03 -04006434 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006435 if (programObject->isInUse())
6436 {
6437 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006438 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006439 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006440}
6441
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006442GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6443{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006444 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6445 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006446
Jamie Madill70b5bb02017-08-28 13:32:37 -04006447 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006448 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006449 if (error.isError())
6450 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006451 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006452 handleError(error);
6453 return nullptr;
6454 }
6455
Jamie Madill70b5bb02017-08-28 13:32:37 -04006456 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006457}
6458
6459GLboolean Context::isSync(GLsync sync)
6460{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006461 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006462}
6463
6464GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6465{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006466 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006467
6468 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006469 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006470 return result;
6471}
6472
6473void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6474{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006475 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006476 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006477}
6478
6479void Context::getInteger64v(GLenum pname, GLint64 *params)
6480{
6481 GLenum nativeType = GL_NONE;
6482 unsigned int numParams = 0;
6483 getQueryParameterInfo(pname, &nativeType, &numParams);
6484
6485 if (nativeType == GL_INT_64_ANGLEX)
6486 {
6487 getInteger64vImpl(pname, params);
6488 }
6489 else
6490 {
6491 CastStateValues(this, nativeType, pname, numParams, params);
6492 }
6493}
6494
Brandon Jones59770802018-04-02 13:18:42 -07006495void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6496{
6497 getInteger64v(pname, data);
6498}
6499
Corentin Wallez336129f2017-10-17 15:55:40 -04006500void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006501{
6502 Buffer *buffer = mGLState.getTargetBuffer(target);
6503 QueryBufferParameteri64v(buffer, pname, params);
6504}
6505
Brandon Jones59770802018-04-02 13:18:42 -07006506void Context::getBufferParameteri64vRobust(BufferBinding target,
6507 GLenum pname,
6508 GLsizei bufSize,
6509 GLsizei *length,
6510 GLint64 *params)
6511{
6512 getBufferParameteri64v(target, pname, params);
6513}
6514
Jamie Madill3ef140a2017-08-26 23:11:21 -04006515void Context::genSamplers(GLsizei count, GLuint *samplers)
6516{
6517 for (int i = 0; i < count; i++)
6518 {
6519 samplers[i] = mState.mSamplers->createSampler();
6520 }
6521}
6522
6523void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6524{
6525 for (int i = 0; i < count; i++)
6526 {
6527 GLuint sampler = samplers[i];
6528
6529 if (mState.mSamplers->getSampler(sampler))
6530 {
6531 detachSampler(sampler);
6532 }
6533
6534 mState.mSamplers->deleteObject(this, sampler);
6535 }
6536}
6537
6538void Context::getInternalformativ(GLenum target,
6539 GLenum internalformat,
6540 GLenum pname,
6541 GLsizei bufSize,
6542 GLint *params)
6543{
6544 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6545 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6546}
6547
Brandon Jones59770802018-04-02 13:18:42 -07006548void Context::getInternalformativRobust(GLenum target,
6549 GLenum internalformat,
6550 GLenum pname,
6551 GLsizei bufSize,
6552 GLsizei *length,
6553 GLint *params)
6554{
6555 getInternalformativ(target, internalformat, pname, bufSize, params);
6556}
6557
Jiajia Qin5451d532017-11-16 17:16:34 +08006558void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6559{
6560 programUniform1iv(program, location, 1, &v0);
6561}
6562
6563void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6564{
6565 GLint xy[2] = {v0, v1};
6566 programUniform2iv(program, location, 1, xy);
6567}
6568
6569void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6570{
6571 GLint xyz[3] = {v0, v1, v2};
6572 programUniform3iv(program, location, 1, xyz);
6573}
6574
6575void Context::programUniform4i(GLuint program,
6576 GLint location,
6577 GLint v0,
6578 GLint v1,
6579 GLint v2,
6580 GLint v3)
6581{
6582 GLint xyzw[4] = {v0, v1, v2, v3};
6583 programUniform4iv(program, location, 1, xyzw);
6584}
6585
6586void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6587{
6588 programUniform1uiv(program, location, 1, &v0);
6589}
6590
6591void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6592{
6593 GLuint xy[2] = {v0, v1};
6594 programUniform2uiv(program, location, 1, xy);
6595}
6596
6597void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6598{
6599 GLuint xyz[3] = {v0, v1, v2};
6600 programUniform3uiv(program, location, 1, xyz);
6601}
6602
6603void Context::programUniform4ui(GLuint program,
6604 GLint location,
6605 GLuint v0,
6606 GLuint v1,
6607 GLuint v2,
6608 GLuint v3)
6609{
6610 GLuint xyzw[4] = {v0, v1, v2, v3};
6611 programUniform4uiv(program, location, 1, xyzw);
6612}
6613
6614void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6615{
6616 programUniform1fv(program, location, 1, &v0);
6617}
6618
6619void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6620{
6621 GLfloat xy[2] = {v0, v1};
6622 programUniform2fv(program, location, 1, xy);
6623}
6624
6625void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6626{
6627 GLfloat xyz[3] = {v0, v1, v2};
6628 programUniform3fv(program, location, 1, xyz);
6629}
6630
6631void Context::programUniform4f(GLuint program,
6632 GLint location,
6633 GLfloat v0,
6634 GLfloat v1,
6635 GLfloat v2,
6636 GLfloat v3)
6637{
6638 GLfloat xyzw[4] = {v0, v1, v2, v3};
6639 programUniform4fv(program, location, 1, xyzw);
6640}
6641
Jamie Madill81c2e252017-09-09 23:32:46 -04006642void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6643{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006644 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006645 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006646 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006647}
6648
Jiajia Qin5451d532017-11-16 17:16:34 +08006649void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6650{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006651 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006652 ASSERT(programObject);
6653 programObject->setUniform2iv(location, count, value);
6654}
6655
6656void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6657{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006658 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006659 ASSERT(programObject);
6660 programObject->setUniform3iv(location, count, value);
6661}
6662
6663void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6664{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006665 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006666 ASSERT(programObject);
6667 programObject->setUniform4iv(location, count, value);
6668}
6669
6670void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6671{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006672 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006673 ASSERT(programObject);
6674 programObject->setUniform1uiv(location, count, value);
6675}
6676
6677void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6678{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006679 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006680 ASSERT(programObject);
6681 programObject->setUniform2uiv(location, count, value);
6682}
6683
6684void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6685{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006686 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006687 ASSERT(programObject);
6688 programObject->setUniform3uiv(location, count, value);
6689}
6690
6691void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6692{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006693 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006694 ASSERT(programObject);
6695 programObject->setUniform4uiv(location, count, value);
6696}
6697
6698void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6699{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006700 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006701 ASSERT(programObject);
6702 programObject->setUniform1fv(location, count, value);
6703}
6704
6705void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6706{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006707 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006708 ASSERT(programObject);
6709 programObject->setUniform2fv(location, count, value);
6710}
6711
6712void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6713{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006714 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006715 ASSERT(programObject);
6716 programObject->setUniform3fv(location, count, value);
6717}
6718
6719void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6720{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006721 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006722 ASSERT(programObject);
6723 programObject->setUniform4fv(location, count, value);
6724}
6725
6726void Context::programUniformMatrix2fv(GLuint program,
6727 GLint location,
6728 GLsizei count,
6729 GLboolean transpose,
6730 const GLfloat *value)
6731{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006732 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006733 ASSERT(programObject);
6734 programObject->setUniformMatrix2fv(location, count, transpose, value);
6735}
6736
6737void Context::programUniformMatrix3fv(GLuint program,
6738 GLint location,
6739 GLsizei count,
6740 GLboolean transpose,
6741 const GLfloat *value)
6742{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006743 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006744 ASSERT(programObject);
6745 programObject->setUniformMatrix3fv(location, count, transpose, value);
6746}
6747
6748void Context::programUniformMatrix4fv(GLuint program,
6749 GLint location,
6750 GLsizei count,
6751 GLboolean transpose,
6752 const GLfloat *value)
6753{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006754 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006755 ASSERT(programObject);
6756 programObject->setUniformMatrix4fv(location, count, transpose, value);
6757}
6758
6759void Context::programUniformMatrix2x3fv(GLuint program,
6760 GLint location,
6761 GLsizei count,
6762 GLboolean transpose,
6763 const GLfloat *value)
6764{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006765 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006766 ASSERT(programObject);
6767 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6768}
6769
6770void Context::programUniformMatrix3x2fv(GLuint program,
6771 GLint location,
6772 GLsizei count,
6773 GLboolean transpose,
6774 const GLfloat *value)
6775{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006776 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006777 ASSERT(programObject);
6778 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6779}
6780
6781void Context::programUniformMatrix2x4fv(GLuint program,
6782 GLint location,
6783 GLsizei count,
6784 GLboolean transpose,
6785 const GLfloat *value)
6786{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006787 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006788 ASSERT(programObject);
6789 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6790}
6791
6792void Context::programUniformMatrix4x2fv(GLuint program,
6793 GLint location,
6794 GLsizei count,
6795 GLboolean transpose,
6796 const GLfloat *value)
6797{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006798 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006799 ASSERT(programObject);
6800 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6801}
6802
6803void Context::programUniformMatrix3x4fv(GLuint program,
6804 GLint location,
6805 GLsizei count,
6806 GLboolean transpose,
6807 const GLfloat *value)
6808{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006809 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006810 ASSERT(programObject);
6811 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6812}
6813
6814void Context::programUniformMatrix4x3fv(GLuint program,
6815 GLint location,
6816 GLsizei count,
6817 GLboolean transpose,
6818 const GLfloat *value)
6819{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006820 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006821 ASSERT(programObject);
6822 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6823}
6824
Jamie Madill81c2e252017-09-09 23:32:46 -04006825void Context::onTextureChange(const Texture *texture)
6826{
6827 // Conservatively assume all textures are dirty.
6828 // TODO(jmadill): More fine-grained update.
6829 mGLState.setObjectDirty(GL_TEXTURE);
6830}
6831
James Darpiniane8a93c62018-01-04 18:02:24 -08006832bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6833{
6834 return mGLState.isCurrentTransformFeedback(tf);
6835}
James Darpiniane8a93c62018-01-04 18:02:24 -08006836
Yunchao Hea336b902017-08-02 16:05:21 +08006837void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6838{
6839 for (int i = 0; i < count; i++)
6840 {
6841 pipelines[i] = createProgramPipeline();
6842 }
6843}
6844
6845void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6846{
6847 for (int i = 0; i < count; i++)
6848 {
6849 if (pipelines[i] != 0)
6850 {
6851 deleteProgramPipeline(pipelines[i]);
6852 }
6853 }
6854}
6855
6856GLboolean Context::isProgramPipeline(GLuint pipeline)
6857{
6858 if (pipeline == 0)
6859 {
6860 return GL_FALSE;
6861 }
6862
6863 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6864}
6865
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006866void Context::finishFenceNV(GLuint fence)
6867{
6868 FenceNV *fenceObject = getFenceNV(fence);
6869
6870 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006871 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006872}
6873
6874void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6875{
6876 FenceNV *fenceObject = getFenceNV(fence);
6877
6878 ASSERT(fenceObject && fenceObject->isSet());
6879
6880 switch (pname)
6881 {
6882 case GL_FENCE_STATUS_NV:
6883 {
6884 // GL_NV_fence spec:
6885 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6886 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6887 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6888 GLboolean status = GL_TRUE;
6889 if (fenceObject->getStatus() != GL_TRUE)
6890 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006891 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006892 }
6893 *params = status;
6894 break;
6895 }
6896
6897 case GL_FENCE_CONDITION_NV:
6898 {
6899 *params = static_cast<GLint>(fenceObject->getCondition());
6900 break;
6901 }
6902
6903 default:
6904 UNREACHABLE();
6905 }
6906}
6907
6908void Context::getTranslatedShaderSource(GLuint shader,
6909 GLsizei bufsize,
6910 GLsizei *length,
6911 GLchar *source)
6912{
6913 Shader *shaderObject = getShader(shader);
6914 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006915 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006916}
6917
6918void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6919{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006920 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006921 ASSERT(programObject);
6922
6923 programObject->getUniformfv(this, location, params);
6924}
6925
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006926void Context::getnUniformfvRobust(GLuint program,
6927 GLint location,
6928 GLsizei bufSize,
6929 GLsizei *length,
6930 GLfloat *params)
6931{
6932 UNIMPLEMENTED();
6933}
6934
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006935void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6936{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006937 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006938 ASSERT(programObject);
6939
6940 programObject->getUniformiv(this, location, params);
6941}
6942
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006943void Context::getnUniformivRobust(GLuint program,
6944 GLint location,
6945 GLsizei bufSize,
6946 GLsizei *length,
6947 GLint *params)
6948{
6949 UNIMPLEMENTED();
6950}
6951
6952void Context::getnUniformuivRobust(GLuint program,
6953 GLint location,
6954 GLsizei bufSize,
6955 GLsizei *length,
6956 GLuint *params)
6957{
6958 UNIMPLEMENTED();
6959}
6960
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006961GLboolean Context::isFenceNV(GLuint fence)
6962{
6963 FenceNV *fenceObject = getFenceNV(fence);
6964
6965 if (fenceObject == nullptr)
6966 {
6967 return GL_FALSE;
6968 }
6969
6970 // GL_NV_fence spec:
6971 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6972 // existing fence.
6973 return fenceObject->isSet();
6974}
6975
6976void Context::readnPixels(GLint x,
6977 GLint y,
6978 GLsizei width,
6979 GLsizei height,
6980 GLenum format,
6981 GLenum type,
6982 GLsizei bufSize,
6983 void *data)
6984{
6985 return readPixels(x, y, width, height, format, type, data);
6986}
6987
Jamie Madill007530e2017-12-28 14:27:04 -05006988void Context::setFenceNV(GLuint fence, GLenum condition)
6989{
6990 ASSERT(condition == GL_ALL_COMPLETED_NV);
6991
6992 FenceNV *fenceObject = getFenceNV(fence);
6993 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006994 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006995}
6996
6997GLboolean Context::testFenceNV(GLuint fence)
6998{
6999 FenceNV *fenceObject = getFenceNV(fence);
7000
7001 ASSERT(fenceObject != nullptr);
7002 ASSERT(fenceObject->isSet() == GL_TRUE);
7003
7004 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007005 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007006 if (error.isError())
7007 {
7008 handleError(error);
7009 return GL_TRUE;
7010 }
7011
7012 return result;
7013}
7014
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007015void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007016{
7017 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007018 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007019 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007020}
7021
Jamie Madillfa920eb2018-01-04 11:45:50 -05007022void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007023{
7024 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007025 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007026 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7027}
7028
Jamie Madillfa920eb2018-01-04 11:45:50 -05007029void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7030{
7031 UNIMPLEMENTED();
7032}
7033
Jamie Madill5b772312018-03-08 20:28:32 -05007034bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7035{
7036 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7037 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7038 // to the fact that it is stored internally as a float, and so would require conversion
7039 // if returned from Context::getIntegerv. Since this conversion is already implemented
7040 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7041 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7042 // application.
7043 switch (pname)
7044 {
7045 case GL_COMPRESSED_TEXTURE_FORMATS:
7046 {
7047 *type = GL_INT;
7048 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7049 return true;
7050 }
7051 case GL_SHADER_BINARY_FORMATS:
7052 {
7053 *type = GL_INT;
7054 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7055 return true;
7056 }
7057
7058 case GL_MAX_VERTEX_ATTRIBS:
7059 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7060 case GL_MAX_VARYING_VECTORS:
7061 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7062 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7063 case GL_MAX_TEXTURE_IMAGE_UNITS:
7064 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7065 case GL_MAX_RENDERBUFFER_SIZE:
7066 case GL_NUM_SHADER_BINARY_FORMATS:
7067 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7068 case GL_ARRAY_BUFFER_BINDING:
7069 case GL_FRAMEBUFFER_BINDING:
7070 case GL_RENDERBUFFER_BINDING:
7071 case GL_CURRENT_PROGRAM:
7072 case GL_PACK_ALIGNMENT:
7073 case GL_UNPACK_ALIGNMENT:
7074 case GL_GENERATE_MIPMAP_HINT:
7075 case GL_RED_BITS:
7076 case GL_GREEN_BITS:
7077 case GL_BLUE_BITS:
7078 case GL_ALPHA_BITS:
7079 case GL_DEPTH_BITS:
7080 case GL_STENCIL_BITS:
7081 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7082 case GL_CULL_FACE_MODE:
7083 case GL_FRONT_FACE:
7084 case GL_ACTIVE_TEXTURE:
7085 case GL_STENCIL_FUNC:
7086 case GL_STENCIL_VALUE_MASK:
7087 case GL_STENCIL_REF:
7088 case GL_STENCIL_FAIL:
7089 case GL_STENCIL_PASS_DEPTH_FAIL:
7090 case GL_STENCIL_PASS_DEPTH_PASS:
7091 case GL_STENCIL_BACK_FUNC:
7092 case GL_STENCIL_BACK_VALUE_MASK:
7093 case GL_STENCIL_BACK_REF:
7094 case GL_STENCIL_BACK_FAIL:
7095 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7096 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7097 case GL_DEPTH_FUNC:
7098 case GL_BLEND_SRC_RGB:
7099 case GL_BLEND_SRC_ALPHA:
7100 case GL_BLEND_DST_RGB:
7101 case GL_BLEND_DST_ALPHA:
7102 case GL_BLEND_EQUATION_RGB:
7103 case GL_BLEND_EQUATION_ALPHA:
7104 case GL_STENCIL_WRITEMASK:
7105 case GL_STENCIL_BACK_WRITEMASK:
7106 case GL_STENCIL_CLEAR_VALUE:
7107 case GL_SUBPIXEL_BITS:
7108 case GL_MAX_TEXTURE_SIZE:
7109 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7110 case GL_SAMPLE_BUFFERS:
7111 case GL_SAMPLES:
7112 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7113 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7114 case GL_TEXTURE_BINDING_2D:
7115 case GL_TEXTURE_BINDING_CUBE_MAP:
7116 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7117 {
7118 *type = GL_INT;
7119 *numParams = 1;
7120 return true;
7121 }
7122 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7123 {
7124 if (!getExtensions().packReverseRowOrder)
7125 {
7126 return false;
7127 }
7128 *type = GL_INT;
7129 *numParams = 1;
7130 return true;
7131 }
7132 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7133 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7134 {
7135 if (!getExtensions().textureRectangle)
7136 {
7137 return false;
7138 }
7139 *type = GL_INT;
7140 *numParams = 1;
7141 return true;
7142 }
7143 case GL_MAX_DRAW_BUFFERS_EXT:
7144 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7145 {
7146 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7147 {
7148 return false;
7149 }
7150 *type = GL_INT;
7151 *numParams = 1;
7152 return true;
7153 }
7154 case GL_MAX_VIEWPORT_DIMS:
7155 {
7156 *type = GL_INT;
7157 *numParams = 2;
7158 return true;
7159 }
7160 case GL_VIEWPORT:
7161 case GL_SCISSOR_BOX:
7162 {
7163 *type = GL_INT;
7164 *numParams = 4;
7165 return true;
7166 }
7167 case GL_SHADER_COMPILER:
7168 case GL_SAMPLE_COVERAGE_INVERT:
7169 case GL_DEPTH_WRITEMASK:
7170 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7171 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7172 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7173 // bool-natural
7174 case GL_SAMPLE_COVERAGE:
7175 case GL_SCISSOR_TEST:
7176 case GL_STENCIL_TEST:
7177 case GL_DEPTH_TEST:
7178 case GL_BLEND:
7179 case GL_DITHER:
7180 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7181 {
7182 *type = GL_BOOL;
7183 *numParams = 1;
7184 return true;
7185 }
7186 case GL_COLOR_WRITEMASK:
7187 {
7188 *type = GL_BOOL;
7189 *numParams = 4;
7190 return true;
7191 }
7192 case GL_POLYGON_OFFSET_FACTOR:
7193 case GL_POLYGON_OFFSET_UNITS:
7194 case GL_SAMPLE_COVERAGE_VALUE:
7195 case GL_DEPTH_CLEAR_VALUE:
7196 case GL_LINE_WIDTH:
7197 {
7198 *type = GL_FLOAT;
7199 *numParams = 1;
7200 return true;
7201 }
7202 case GL_ALIASED_LINE_WIDTH_RANGE:
7203 case GL_ALIASED_POINT_SIZE_RANGE:
7204 case GL_DEPTH_RANGE:
7205 {
7206 *type = GL_FLOAT;
7207 *numParams = 2;
7208 return true;
7209 }
7210 case GL_COLOR_CLEAR_VALUE:
7211 case GL_BLEND_COLOR:
7212 {
7213 *type = GL_FLOAT;
7214 *numParams = 4;
7215 return true;
7216 }
7217 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7218 if (!getExtensions().textureFilterAnisotropic)
7219 {
7220 return false;
7221 }
7222 *type = GL_FLOAT;
7223 *numParams = 1;
7224 return true;
7225 case GL_TIMESTAMP_EXT:
7226 if (!getExtensions().disjointTimerQuery)
7227 {
7228 return false;
7229 }
7230 *type = GL_INT_64_ANGLEX;
7231 *numParams = 1;
7232 return true;
7233 case GL_GPU_DISJOINT_EXT:
7234 if (!getExtensions().disjointTimerQuery)
7235 {
7236 return false;
7237 }
7238 *type = GL_INT;
7239 *numParams = 1;
7240 return true;
7241 case GL_COVERAGE_MODULATION_CHROMIUM:
7242 if (!getExtensions().framebufferMixedSamples)
7243 {
7244 return false;
7245 }
7246 *type = GL_INT;
7247 *numParams = 1;
7248 return true;
7249 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7250 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7251 {
7252 return false;
7253 }
7254 *type = GL_INT;
7255 *numParams = 1;
7256 return true;
7257 }
7258
7259 if (getExtensions().debug)
7260 {
7261 switch (pname)
7262 {
7263 case GL_DEBUG_LOGGED_MESSAGES:
7264 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7265 case GL_DEBUG_GROUP_STACK_DEPTH:
7266 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7267 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7268 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7269 case GL_MAX_LABEL_LENGTH:
7270 *type = GL_INT;
7271 *numParams = 1;
7272 return true;
7273
7274 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7275 case GL_DEBUG_OUTPUT:
7276 *type = GL_BOOL;
7277 *numParams = 1;
7278 return true;
7279 }
7280 }
7281
7282 if (getExtensions().multisampleCompatibility)
7283 {
7284 switch (pname)
7285 {
7286 case GL_MULTISAMPLE_EXT:
7287 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7288 *type = GL_BOOL;
7289 *numParams = 1;
7290 return true;
7291 }
7292 }
7293
7294 if (getExtensions().pathRendering)
7295 {
7296 switch (pname)
7297 {
7298 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7299 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7300 *type = GL_FLOAT;
7301 *numParams = 16;
7302 return true;
7303 }
7304 }
7305
7306 if (getExtensions().bindGeneratesResource)
7307 {
7308 switch (pname)
7309 {
7310 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7311 *type = GL_BOOL;
7312 *numParams = 1;
7313 return true;
7314 }
7315 }
7316
7317 if (getExtensions().clientArrays)
7318 {
7319 switch (pname)
7320 {
7321 case GL_CLIENT_ARRAYS_ANGLE:
7322 *type = GL_BOOL;
7323 *numParams = 1;
7324 return true;
7325 }
7326 }
7327
7328 if (getExtensions().sRGBWriteControl)
7329 {
7330 switch (pname)
7331 {
7332 case GL_FRAMEBUFFER_SRGB_EXT:
7333 *type = GL_BOOL;
7334 *numParams = 1;
7335 return true;
7336 }
7337 }
7338
7339 if (getExtensions().robustResourceInitialization &&
7340 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7341 {
7342 *type = GL_BOOL;
7343 *numParams = 1;
7344 return true;
7345 }
7346
7347 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7348 {
7349 *type = GL_BOOL;
7350 *numParams = 1;
7351 return true;
7352 }
7353
jchen1082af6202018-06-22 10:59:52 +08007354 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7355 {
7356 *type = GL_INT;
7357 *numParams = 1;
7358 return true;
7359 }
7360
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007361 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7362 {
7363 *type = GL_INT;
7364 *numParams = 1;
7365 return true;
7366 }
7367
Jamie Madill5b772312018-03-08 20:28:32 -05007368 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7369 switch (pname)
7370 {
7371 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7372 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7373 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7374 {
7375 return false;
7376 }
7377 *type = GL_INT;
7378 *numParams = 1;
7379 return true;
7380
7381 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7382 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7383 {
7384 return false;
7385 }
7386 *type = GL_INT;
7387 *numParams = 1;
7388 return true;
7389
7390 case GL_PROGRAM_BINARY_FORMATS_OES:
7391 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7392 {
7393 return false;
7394 }
7395 *type = GL_INT;
7396 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7397 return true;
7398
7399 case GL_PACK_ROW_LENGTH:
7400 case GL_PACK_SKIP_ROWS:
7401 case GL_PACK_SKIP_PIXELS:
7402 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7403 {
7404 return false;
7405 }
7406 *type = GL_INT;
7407 *numParams = 1;
7408 return true;
7409 case GL_UNPACK_ROW_LENGTH:
7410 case GL_UNPACK_SKIP_ROWS:
7411 case GL_UNPACK_SKIP_PIXELS:
7412 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7413 {
7414 return false;
7415 }
7416 *type = GL_INT;
7417 *numParams = 1;
7418 return true;
7419 case GL_VERTEX_ARRAY_BINDING:
7420 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7421 {
7422 return false;
7423 }
7424 *type = GL_INT;
7425 *numParams = 1;
7426 return true;
7427 case GL_PIXEL_PACK_BUFFER_BINDING:
7428 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7429 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7430 {
7431 return false;
7432 }
7433 *type = GL_INT;
7434 *numParams = 1;
7435 return true;
7436 case GL_MAX_SAMPLES:
7437 {
7438 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7439 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7440 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7441 {
7442 return false;
7443 }
7444 *type = GL_INT;
7445 *numParams = 1;
7446 return true;
7447
7448 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7449 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7450 {
7451 return false;
7452 }
7453 *type = GL_INT;
7454 *numParams = 1;
7455 return true;
7456 }
7457 }
7458
7459 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7460 {
7461 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7462 {
7463 return false;
7464 }
7465 *type = GL_INT;
7466 *numParams = 1;
7467 return true;
7468 }
7469
7470 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7471 {
7472 *type = GL_INT;
7473 *numParams = 1;
7474 return true;
7475 }
7476
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007477 if (getClientVersion() < Version(2, 0))
7478 {
7479 switch (pname)
7480 {
7481 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007482 case GL_CLIENT_ACTIVE_TEXTURE:
7483 case GL_MATRIX_MODE:
7484 case GL_MAX_TEXTURE_UNITS:
7485 case GL_MAX_MODELVIEW_STACK_DEPTH:
7486 case GL_MAX_PROJECTION_STACK_DEPTH:
7487 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007488 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007489 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007490 case GL_VERTEX_ARRAY_STRIDE:
7491 case GL_NORMAL_ARRAY_STRIDE:
7492 case GL_COLOR_ARRAY_STRIDE:
7493 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7494 case GL_VERTEX_ARRAY_SIZE:
7495 case GL_COLOR_ARRAY_SIZE:
7496 case GL_TEXTURE_COORD_ARRAY_SIZE:
7497 case GL_VERTEX_ARRAY_TYPE:
7498 case GL_NORMAL_ARRAY_TYPE:
7499 case GL_COLOR_ARRAY_TYPE:
7500 case GL_TEXTURE_COORD_ARRAY_TYPE:
7501 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7502 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7503 case GL_COLOR_ARRAY_BUFFER_BINDING:
7504 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7505 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7506 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7507 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007508 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007509 case GL_MODELVIEW_STACK_DEPTH:
7510 case GL_PROJECTION_STACK_DEPTH:
7511 case GL_TEXTURE_STACK_DEPTH:
7512 case GL_LOGIC_OP_MODE:
7513 case GL_BLEND_SRC:
7514 case GL_BLEND_DST:
7515 case GL_PERSPECTIVE_CORRECTION_HINT:
7516 case GL_POINT_SMOOTH_HINT:
7517 case GL_LINE_SMOOTH_HINT:
7518 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007519 *type = GL_INT;
7520 *numParams = 1;
7521 return true;
7522 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007523 case GL_FOG_DENSITY:
7524 case GL_FOG_START:
7525 case GL_FOG_END:
7526 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007527 case GL_POINT_SIZE:
7528 case GL_POINT_SIZE_MIN:
7529 case GL_POINT_SIZE_MAX:
7530 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007531 *type = GL_FLOAT;
7532 *numParams = 1;
7533 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007534 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007535 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007536 *type = GL_FLOAT;
7537 *numParams = 2;
7538 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007539 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007540 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007541 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007542 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007543 *type = GL_FLOAT;
7544 *numParams = 4;
7545 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007546 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007547 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007548 *type = GL_FLOAT;
7549 *numParams = 3;
7550 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007551 case GL_MODELVIEW_MATRIX:
7552 case GL_PROJECTION_MATRIX:
7553 case GL_TEXTURE_MATRIX:
7554 *type = GL_FLOAT;
7555 *numParams = 16;
7556 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007557 case GL_LIGHT_MODEL_TWO_SIDE:
7558 *type = GL_BOOL;
7559 *numParams = 1;
7560 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007561 }
7562 }
7563
Jamie Madill5b772312018-03-08 20:28:32 -05007564 if (getClientVersion() < Version(3, 0))
7565 {
7566 return false;
7567 }
7568
7569 // Check for ES3.0+ parameter names
7570 switch (pname)
7571 {
7572 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7573 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7574 case GL_UNIFORM_BUFFER_BINDING:
7575 case GL_TRANSFORM_FEEDBACK_BINDING:
7576 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7577 case GL_COPY_READ_BUFFER_BINDING:
7578 case GL_COPY_WRITE_BUFFER_BINDING:
7579 case GL_SAMPLER_BINDING:
7580 case GL_READ_BUFFER:
7581 case GL_TEXTURE_BINDING_3D:
7582 case GL_TEXTURE_BINDING_2D_ARRAY:
7583 case GL_MAX_3D_TEXTURE_SIZE:
7584 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7585 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7586 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7587 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7588 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7589 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7590 case GL_MAX_VARYING_COMPONENTS:
7591 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7592 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7593 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7594 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7595 case GL_NUM_EXTENSIONS:
7596 case GL_MAJOR_VERSION:
7597 case GL_MINOR_VERSION:
7598 case GL_MAX_ELEMENTS_INDICES:
7599 case GL_MAX_ELEMENTS_VERTICES:
7600 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7601 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7602 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7603 case GL_UNPACK_IMAGE_HEIGHT:
7604 case GL_UNPACK_SKIP_IMAGES:
7605 {
7606 *type = GL_INT;
7607 *numParams = 1;
7608 return true;
7609 }
7610
7611 case GL_MAX_ELEMENT_INDEX:
7612 case GL_MAX_UNIFORM_BLOCK_SIZE:
7613 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7614 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7615 case GL_MAX_SERVER_WAIT_TIMEOUT:
7616 {
7617 *type = GL_INT_64_ANGLEX;
7618 *numParams = 1;
7619 return true;
7620 }
7621
7622 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7623 case GL_TRANSFORM_FEEDBACK_PAUSED:
7624 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7625 case GL_RASTERIZER_DISCARD:
7626 {
7627 *type = GL_BOOL;
7628 *numParams = 1;
7629 return true;
7630 }
7631
7632 case GL_MAX_TEXTURE_LOD_BIAS:
7633 {
7634 *type = GL_FLOAT;
7635 *numParams = 1;
7636 return true;
7637 }
7638 }
7639
7640 if (getExtensions().requestExtension)
7641 {
7642 switch (pname)
7643 {
7644 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7645 *type = GL_INT;
7646 *numParams = 1;
7647 return true;
7648 }
7649 }
7650
7651 if (getClientVersion() < Version(3, 1))
7652 {
7653 return false;
7654 }
7655
7656 switch (pname)
7657 {
7658 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7659 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7660 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7661 case GL_MAX_FRAMEBUFFER_WIDTH:
7662 case GL_MAX_FRAMEBUFFER_HEIGHT:
7663 case GL_MAX_FRAMEBUFFER_SAMPLES:
7664 case GL_MAX_SAMPLE_MASK_WORDS:
7665 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7666 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7667 case GL_MAX_INTEGER_SAMPLES:
7668 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7669 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7670 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7671 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7672 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7673 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7674 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7675 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7676 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7677 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7678 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7679 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7680 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7681 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7682 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7683 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7684 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7685 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7686 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7687 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7688 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7689 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7690 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7691 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7692 case GL_MAX_UNIFORM_LOCATIONS:
7693 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7694 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7695 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7696 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7697 case GL_MAX_IMAGE_UNITS:
7698 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7699 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7700 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7701 case GL_SHADER_STORAGE_BUFFER_BINDING:
7702 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7703 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007704 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007705 *type = GL_INT;
7706 *numParams = 1;
7707 return true;
7708 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7709 *type = GL_INT_64_ANGLEX;
7710 *numParams = 1;
7711 return true;
7712 case GL_SAMPLE_MASK:
7713 *type = GL_BOOL;
7714 *numParams = 1;
7715 return true;
7716 }
7717
7718 if (getExtensions().geometryShader)
7719 {
7720 switch (pname)
7721 {
7722 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7723 case GL_LAYER_PROVOKING_VERTEX_EXT:
7724 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7725 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7726 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7727 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7728 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7729 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7730 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7731 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7732 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7733 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7734 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7735 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7736 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7737 *type = GL_INT;
7738 *numParams = 1;
7739 return true;
7740 }
7741 }
7742
7743 return false;
7744}
7745
7746bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7747{
7748 if (getClientVersion() < Version(3, 0))
7749 {
7750 return false;
7751 }
7752
7753 switch (target)
7754 {
7755 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7756 case GL_UNIFORM_BUFFER_BINDING:
7757 {
7758 *type = GL_INT;
7759 *numParams = 1;
7760 return true;
7761 }
7762 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7763 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7764 case GL_UNIFORM_BUFFER_START:
7765 case GL_UNIFORM_BUFFER_SIZE:
7766 {
7767 *type = GL_INT_64_ANGLEX;
7768 *numParams = 1;
7769 return true;
7770 }
7771 }
7772
7773 if (getClientVersion() < Version(3, 1))
7774 {
7775 return false;
7776 }
7777
7778 switch (target)
7779 {
7780 case GL_IMAGE_BINDING_LAYERED:
7781 {
7782 *type = GL_BOOL;
7783 *numParams = 1;
7784 return true;
7785 }
7786 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7787 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7788 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7789 case GL_SHADER_STORAGE_BUFFER_BINDING:
7790 case GL_VERTEX_BINDING_BUFFER:
7791 case GL_VERTEX_BINDING_DIVISOR:
7792 case GL_VERTEX_BINDING_OFFSET:
7793 case GL_VERTEX_BINDING_STRIDE:
7794 case GL_SAMPLE_MASK_VALUE:
7795 case GL_IMAGE_BINDING_NAME:
7796 case GL_IMAGE_BINDING_LEVEL:
7797 case GL_IMAGE_BINDING_LAYER:
7798 case GL_IMAGE_BINDING_ACCESS:
7799 case GL_IMAGE_BINDING_FORMAT:
7800 {
7801 *type = GL_INT;
7802 *numParams = 1;
7803 return true;
7804 }
7805 case GL_ATOMIC_COUNTER_BUFFER_START:
7806 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7807 case GL_SHADER_STORAGE_BUFFER_START:
7808 case GL_SHADER_STORAGE_BUFFER_SIZE:
7809 {
7810 *type = GL_INT_64_ANGLEX;
7811 *numParams = 1;
7812 return true;
7813 }
7814 }
7815
7816 return false;
7817}
7818
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007819Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007820{
7821 return mState.mShaderPrograms->getProgram(handle);
7822}
7823
7824Shader *Context::getShader(GLuint handle) const
7825{
7826 return mState.mShaderPrograms->getShader(handle);
7827}
7828
Jamie Madill5b772312018-03-08 20:28:32 -05007829bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7830{
7831 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7832}
7833
7834bool Context::isFramebufferGenerated(GLuint framebuffer) const
7835{
7836 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7837}
7838
7839bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7840{
7841 return mState.mPipelines->isHandleGenerated(pipeline);
7842}
7843
7844bool Context::usingDisplayTextureShareGroup() const
7845{
7846 return mDisplayTextureShareGroup;
7847}
7848
7849GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7850{
7851 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7852 internalformat == GL_DEPTH_STENCIL
7853 ? GL_DEPTH24_STENCIL8
7854 : internalformat;
7855}
7856
jchen1082af6202018-06-22 10:59:52 +08007857void Context::maxShaderCompilerThreads(GLuint count)
7858{
jchen107ae70d82018-07-06 13:47:01 +08007859 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007860 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007861 // A count of zero specifies a request for no parallel compiling or linking.
7862 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7863 {
7864 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7865 }
7866 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007867}
7868
Jamie Madill2eb65032018-07-30 10:25:57 -04007869bool Context::isGLES1() const
7870{
7871 return mState.getClientVersion() < Version(2, 0);
7872}
7873
Jamie Madilla11819d2018-07-30 10:26:01 -04007874void Context::onSubjectStateChange(const Context *context,
7875 angle::SubjectIndex index,
7876 angle::SubjectMessage message)
7877{
Jamie Madilla11819d2018-07-30 10:26:01 -04007878 switch (index)
7879 {
7880 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007881 switch (message)
7882 {
7883 case angle::SubjectMessage::CONTENTS_CHANGED:
7884 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7885 mStateCache.onVertexArrayBufferContentsChange(this);
7886 break;
7887 case angle::SubjectMessage::RESOURCE_MAPPED:
7888 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7889 case angle::SubjectMessage::BINDING_CHANGED:
7890 mStateCache.onVertexArrayBufferStateChange(this);
7891 break;
7892 default:
7893 break;
7894 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007895 break;
7896
7897 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007898 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7899 {
7900 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7901 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007902 break;
7903
7904 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007905 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7906 {
7907 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7908 }
7909 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007910 break;
7911
7912 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007913 if (index < kTextureMaxSubjectIndex)
7914 {
7915 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007916 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007917 }
Jamie Madille25b8002018-09-20 13:39:49 -04007918 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007919 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007920 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007921 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007922 }
Jamie Madille25b8002018-09-20 13:39:49 -04007923 else
7924 {
7925 ASSERT(index < kSamplerMaxSubjectIndex);
7926 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7927 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007928 break;
7929 }
7930}
7931
Jamie Madill6b873dd2018-07-12 23:56:30 -04007932// ErrorSet implementation.
7933ErrorSet::ErrorSet(Context *context) : mContext(context)
7934{
7935}
7936
7937ErrorSet::~ErrorSet() = default;
7938
Jamie Madill306b6c12018-07-27 08:12:49 -04007939void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007940{
7941 // This internal enum is used to filter internal errors that are already handled.
7942 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7943 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7944 {
7945 return;
7946 }
7947
7948 if (ANGLE_UNLIKELY(error.isError()))
7949 {
7950 GLenum code = error.getCode();
7951 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007952
Jamie Madill6b873dd2018-07-12 23:56:30 -04007953 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7954 {
7955 mContext->markContextLost();
7956 }
7957
7958 ASSERT(!error.getMessage().empty());
7959 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7960 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7961 error.getMessage());
7962 }
7963}
7964
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007965void ErrorSet::handleError(GLenum errorCode,
7966 const char *message,
7967 const char *file,
7968 const char *function,
7969 unsigned int line)
7970{
7971 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7972 std::stringstream errorStream;
7973 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7974 << function << ":" << line << ". " << message;
7975
7976 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
7977}
7978
Jamie Madilla139f012018-10-10 16:13:03 -04007979void ErrorSet::validationError(GLenum errorCode, const char *message)
7980{
7981 handleError(gl::Error(errorCode, message));
7982}
7983
Jamie Madill6b873dd2018-07-12 23:56:30 -04007984bool ErrorSet::empty() const
7985{
7986 return mErrors.empty();
7987}
7988
7989GLenum ErrorSet::popError()
7990{
7991 ASSERT(!empty());
7992 GLenum error = *mErrors.begin();
7993 mErrors.erase(mErrors.begin());
7994 return error;
7995}
Jamie Madilldc358af2018-07-31 11:22:13 -04007996
7997// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04007998StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007999 : mCachedHasAnyEnabledClientAttrib(false),
8000 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008001 mCachedInstancedVertexElementLimit(0),
8002 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008003{
8004}
8005
8006StateCache::~StateCache() = default;
8007
Jamie Madillac66f982018-10-09 18:30:01 -04008008void StateCache::initialize(Context *context)
8009{
8010 updateValidDrawModes(context);
8011 updateValidBindTextureTypes(context);
8012}
8013
Jamie Madilldc358af2018-07-31 11:22:13 -04008014void StateCache::updateActiveAttribsMask(Context *context)
8015{
8016 bool isGLES1 = context->isGLES1();
8017 const State &glState = context->getGLState();
8018
8019 if (!isGLES1 && !glState.getProgram())
8020 {
8021 mCachedActiveBufferedAttribsMask = AttributesMask();
8022 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008023 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008024 return;
8025 }
8026
8027 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8028 : glState.getProgram()->getActiveAttribLocationsMask();
8029
8030 const VertexArray *vao = glState.getVertexArray();
8031 ASSERT(vao);
8032
8033 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8034 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008035 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008036
Jamie Madill0a17e482018-08-31 17:19:11 -04008037 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8038 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008039 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008040 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8041}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008042
8043void StateCache::updateVertexElementLimits(Context *context)
8044{
8045 const VertexArray *vao = context->getGLState().getVertexArray();
8046
8047 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8048 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8049
8050 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8051 // If there are no buffered attributes then we should not limit the draw call count.
8052 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8053 {
8054 return;
8055 }
8056
8057 const auto &vertexAttribs = vao->getVertexAttributes();
8058 const auto &vertexBindings = vao->getVertexBindings();
8059
8060 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8061 {
8062 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8063 ASSERT(attrib.enabled);
8064
8065 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8066 ASSERT(context->isGLES1() ||
8067 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8068
8069 GLint64 limit = attrib.getCachedElementLimit();
8070 if (binding.getDivisor() > 0)
8071 {
8072 mCachedInstancedVertexElementLimit =
8073 std::min(mCachedInstancedVertexElementLimit, limit);
8074 }
8075 else
8076 {
8077 mCachedNonInstancedVertexElementLimit =
8078 std::min(mCachedNonInstancedVertexElementLimit, limit);
8079 }
8080 }
8081}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008082
Jamie Madilld84b6732018-09-06 15:54:35 -04008083void StateCache::updateBasicDrawStatesError()
8084{
8085 mCachedBasicDrawStatesError = kInvalidPointer;
8086}
8087
8088intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8089{
8090 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8091 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8092 return mCachedBasicDrawStatesError;
8093}
8094
Jamie Madillc43cdad2018-08-08 15:49:25 -04008095void StateCache::onVertexArrayBindingChange(Context *context)
8096{
8097 updateActiveAttribsMask(context);
8098 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008099 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008100}
8101
8102void StateCache::onProgramExecutableChange(Context *context)
8103{
8104 updateActiveAttribsMask(context);
8105 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008106 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008107 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008108}
8109
Jamie Madilld84b6732018-09-06 15:54:35 -04008110void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008111{
8112 updateVertexElementLimits(context);
8113}
8114
Jamie Madilld84b6732018-09-06 15:54:35 -04008115void StateCache::onVertexArrayBufferContentsChange(Context *context)
8116{
8117 updateVertexElementLimits(context);
8118 updateBasicDrawStatesError();
8119}
8120
Jamie Madillc43cdad2018-08-08 15:49:25 -04008121void StateCache::onVertexArrayStateChange(Context *context)
8122{
8123 updateActiveAttribsMask(context);
8124 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008125 updateBasicDrawStatesError();
8126}
8127
8128void StateCache::onVertexArrayBufferStateChange(Context *context)
8129{
8130 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008131}
8132
8133void StateCache::onGLES1ClientStateChange(Context *context)
8134{
8135 updateActiveAttribsMask(context);
8136}
Jamie Madilld84b6732018-09-06 15:54:35 -04008137
8138void StateCache::onDrawFramebufferChange(Context *context)
8139{
8140 updateBasicDrawStatesError();
8141}
8142
8143void StateCache::onContextCapChange(Context *context)
8144{
8145 updateBasicDrawStatesError();
8146}
8147
8148void StateCache::onStencilStateChange(Context *context)
8149{
8150 updateBasicDrawStatesError();
8151}
8152
8153void StateCache::onDefaultVertexAttributeChange(Context *context)
8154{
8155 updateBasicDrawStatesError();
8156}
8157
8158void StateCache::onActiveTextureChange(Context *context)
8159{
8160 updateBasicDrawStatesError();
8161}
8162
8163void StateCache::onQueryChange(Context *context)
8164{
8165 updateBasicDrawStatesError();
8166}
8167
8168void StateCache::onTransformFeedbackChange(Context *context)
8169{
8170 updateBasicDrawStatesError();
8171}
8172
8173void StateCache::onUniformBufferStateChange(Context *context)
8174{
8175 updateBasicDrawStatesError();
8176}
8177
8178void StateCache::onBufferBindingChange(Context *context)
8179{
8180 updateBasicDrawStatesError();
8181}
Jamie Madill526a6f62018-09-12 11:03:05 -04008182
8183void StateCache::updateValidDrawModes(Context *context)
8184{
8185 Program *program = context->getGLState().getProgram();
8186 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8187 {
8188 mCachedValidDrawModes = {{
8189 true, /* Points */
8190 true, /* Lines */
8191 true, /* LineLoop */
8192 true, /* LineStrip */
8193 true, /* Triangles */
8194 true, /* TriangleStrip */
8195 true, /* TriangleFan */
8196 false, /* LinesAdjacency */
8197 false, /* LineStripAdjacency */
8198 false, /* TrianglesAdjacency */
8199 false, /* TriangleStripAdjacency */
8200 false, /* InvalidEnum */
8201 }};
8202 }
8203 else
8204 {
8205 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8206
8207 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8208
8209 mCachedValidDrawModes = {{
8210 gsMode == PrimitiveMode::Points, /* Points */
8211 gsMode == PrimitiveMode::Lines, /* Lines */
8212 gsMode == PrimitiveMode::Lines, /* LineLoop */
8213 gsMode == PrimitiveMode::Lines, /* LineStrip */
8214 gsMode == PrimitiveMode::Triangles, /* Triangles */
8215 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8216 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8217 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8218 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8219 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8220 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8221 false, /* InvalidEnum */
8222 }};
8223 }
8224}
Jamie Madillac66f982018-10-09 18:30:01 -04008225
8226void StateCache::updateValidBindTextureTypes(Context *context)
8227{
8228 const Extensions &exts = context->getExtensions();
8229 bool isGLES3 = context->getClientMajorVersion() >= 3;
8230 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8231
8232 mCachedValidBindTextureTypes = {{
8233 true, /* _2D */
8234 isGLES3, /* _2DArray */
8235 isGLES31, /* _2DMultisample */
8236 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8237 isGLES3, /* _3D */
8238 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8239 exts.textureRectangle, /* Rectangle */
8240 true, /* CubeMap */
8241 false, /* InvalidEnum */
8242
8243 }};
8244}
Jamie Madillc29968b2016-01-20 11:17:23 -05008245} // namespace gl