blob: 315045259997427975cecf972222f1e592f1f4db [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 Madill09463932018-04-04 05:26:59 -0400138void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
James Darpinian30b604d2018-03-12 17:26:57 -0700140 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
Geoff Lang9bf86f02018-07-26 11:46:34 -0400486 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
487 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400491
492 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
493 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400495 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400496
Jamie Madillc67323a2017-11-02 23:11:41 -0400497 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500498 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500499 // No dirty objects.
500
501 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400502 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500503 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400504 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500505 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
506
507 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
508 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
509 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
510 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
511 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
512 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
513 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
514 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
515 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
516 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
517 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400518 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500519 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
520
521 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
522 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700523 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400524 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
525 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500526 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
527 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400528
Xinghua Cao10a4d432017-11-28 14:46:26 +0800529 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800530 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
531 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800532 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
533 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
534 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
535 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800536 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800537 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800538 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400539 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400540 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800541
Jamie Madillb4927eb2018-07-16 11:39:46 -0400542 mImplementation->setErrorSet(&mErrors);
543
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400544 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000545}
546
Jamie Madill4928b7c2017-06-20 12:57:39 -0400547egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000548{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700549 if (mGLES1Renderer)
550 {
551 mGLES1Renderer->onDestroy(this, &mGLState);
552 }
553
Jamie Madille7b3fe22018-04-05 09:42:46 -0400554 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400555 ANGLE_TRY(releaseSurface(display));
556
Corentin Wallez80b24112015-08-25 16:41:57 -0400557 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000558 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400559 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000560 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400561 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562
Corentin Wallez80b24112015-08-25 16:41:57 -0400563 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400565 if (query.second != nullptr)
566 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400567 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400568 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000569 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400570 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000571
Corentin Wallez80b24112015-08-25 16:41:57 -0400572 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400573 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400574 if (vertexArray.second)
575 {
576 vertexArray.second->onDestroy(this);
577 }
Jamie Madill57a89722013-07-02 11:57:03 -0400578 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400579 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400580
Corentin Wallez80b24112015-08-25 16:41:57 -0400581 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500582 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500583 if (transformFeedback.second != nullptr)
584 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500585 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500586 }
Geoff Langc8058452014-02-03 12:04:11 -0500587 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400588 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500589
Jamie Madill5b772312018-03-08 20:28:32 -0500590 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400591 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800592 if (zeroTexture.get() != nullptr)
593 {
594 ANGLE_TRY(zeroTexture->onDestroy(this));
595 zeroTexture.set(this, nullptr);
596 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400597 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000598
Jamie Madill2f348d22017-06-05 10:50:59 -0400599 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500600
Jamie Madill4928b7c2017-06-20 12:57:39 -0400601 mGLState.reset(this);
602
Jamie Madill6c1f6712017-02-14 19:08:04 -0500603 mState.mBuffers->release(this);
604 mState.mShaderPrograms->release(this);
605 mState.mTextures->release(this);
606 mState.mRenderbuffers->release(this);
607 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400608 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500609 mState.mPaths->release(this);
610 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800611 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400612
jchen107ae70d82018-07-06 13:47:01 +0800613 mThreadPool.reset();
614
Jamie Madill76e471e2017-10-21 09:56:01 -0400615 mImplementation->onDestroy(this);
616
Jamie Madill4928b7c2017-06-20 12:57:39 -0400617 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000618}
619
Jamie Madill70ee0f62017-02-06 16:04:20 -0500620Context::~Context()
621{
622}
623
Geoff Lang75359662018-04-11 01:42:27 -0400624void Context::setLabel(EGLLabelKHR label)
625{
626 mLabel = label;
627}
628
629EGLLabelKHR Context::getLabel() const
630{
631 return mLabel;
632}
633
Jamie Madill4928b7c2017-06-20 12:57:39 -0400634egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000635{
Jamie Madill61e16b42017-06-19 11:13:23 -0400636 mCurrentDisplay = display;
637
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000638 if (!mHasBeenCurrent)
639 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400640 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000641 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500642 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400643 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000644
Corentin Wallezc295e512017-01-27 17:47:50 -0500645 int width = 0;
646 int height = 0;
647 if (surface != nullptr)
648 {
649 width = surface->getWidth();
650 height = surface->getHeight();
651 }
652
653 mGLState.setViewportParams(0, 0, width, height);
654 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000655
656 mHasBeenCurrent = true;
657 }
658
Jamie Madill1b94d432015-08-07 13:23:23 -0400659 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700660 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400661 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400662
Jamie Madill4928b7c2017-06-20 12:57:39 -0400663 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500664
665 Framebuffer *newDefault = nullptr;
666 if (surface != nullptr)
667 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400668 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500669 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400670 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500671 }
672 else
673 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400674 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500675 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000676
Corentin Wallez37c39792015-08-20 14:19:46 -0400677 // Update default framebuffer, the binding of the previous default
678 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400679 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400680 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700681 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400682 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400683 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400684 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700685 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400687 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400688 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400689 }
Ian Ewell292f0052016-02-04 10:37:32 -0500690
691 // Notify the renderer of a context switch
Luc Ferron5396f2a2018-07-12 08:24:23 -0400692 ANGLE_TRY(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400693 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000694}
695
Jamie Madill4928b7c2017-06-20 12:57:39 -0400696egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400697{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400698 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400699
Geoff Langbf7b95d2018-05-01 16:48:21 -0400700 // Remove the default framebuffer
701 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500702 {
703 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400704 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500705 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400706
707 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500708 {
709 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400710 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500711 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400712
713 if (defaultFramebuffer)
714 {
715 defaultFramebuffer->onDestroy(this);
716 delete defaultFramebuffer;
717 }
718
Corentin Wallezc295e512017-01-27 17:47:50 -0500719 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
720
721 if (mCurrentSurface)
722 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400723 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500724 mCurrentSurface = nullptr;
725 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400726
727 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400728}
729
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000730GLuint Context::createBuffer()
731{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500732 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000733}
734
735GLuint Context::createProgram()
736{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500737 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000738}
739
Jiawei Shao385b3e02018-03-21 09:43:28 +0800740GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000741{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500742 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743}
744
745GLuint Context::createTexture()
746{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500747 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000748}
749
750GLuint Context::createRenderbuffer()
751{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500752 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000753}
754
Jamie Madill13951342018-09-30 15:24:28 -0400755void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
756{
757 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
758}
759
Brandon Jones59770802018-04-02 13:18:42 -0700760GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300761{
Jamie Madill13951342018-09-30 15:24:28 -0400762 GLuint created = 0;
763 tryGenPaths(range, &created);
764 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300765}
766
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000767// Returns an unused framebuffer name
768GLuint Context::createFramebuffer()
769{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500770 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000771}
772
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500773void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500775 for (int i = 0; i < n; i++)
776 {
777 GLuint handle = mFenceNVHandleAllocator.allocate();
778 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
779 fences[i] = handle;
780 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000781}
782
Yunchao Hea336b902017-08-02 16:05:21 +0800783GLuint Context::createProgramPipeline()
784{
785 return mState.mPipelines->createProgramPipeline();
786}
787
Jiawei Shao385b3e02018-03-21 09:43:28 +0800788GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800789{
790 UNIMPLEMENTED();
791 return 0u;
792}
793
James Darpinian4d9d4832018-03-13 12:43:28 -0700794void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795{
James Darpinian4d9d4832018-03-13 12:43:28 -0700796 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
797 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798 {
799 detachBuffer(buffer);
800 }
Jamie Madill893ab082014-05-16 16:56:10 -0400801
James Darpinian4d9d4832018-03-13 12:43:28 -0700802 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803}
804
805void Context::deleteShader(GLuint shader)
806{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500807 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000808}
809
810void Context::deleteProgram(GLuint program)
811{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500812 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000813}
814
815void Context::deleteTexture(GLuint texture)
816{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500817 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818 {
819 detachTexture(texture);
820 }
821
Jamie Madill6c1f6712017-02-14 19:08:04 -0500822 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823}
824
825void Context::deleteRenderbuffer(GLuint renderbuffer)
826{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500827 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828 {
829 detachRenderbuffer(renderbuffer);
830 }
Jamie Madill893ab082014-05-16 16:56:10 -0400831
Jamie Madill6c1f6712017-02-14 19:08:04 -0500832 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833}
834
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400835void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400836{
837 // The spec specifies the underlying Fence object is not deleted until all current
838 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
839 // and since our API is currently designed for being called from a single thread, we can delete
840 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400841 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400842}
843
Yunchao Hea336b902017-08-02 16:05:21 +0800844void Context::deleteProgramPipeline(GLuint pipeline)
845{
846 if (mState.mPipelines->getProgramPipeline(pipeline))
847 {
848 detachProgramPipeline(pipeline);
849 }
850
851 mState.mPipelines->deleteObject(this, pipeline);
852}
853
Sami Väisänene45e53b2016-05-25 10:36:04 +0300854void Context::deletePaths(GLuint first, GLsizei range)
855{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500856 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857}
858
Brandon Jones59770802018-04-02 13:18:42 -0700859bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300860{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500861 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862 if (pathObj == nullptr)
863 return false;
864
865 return pathObj->hasPathData();
866}
867
Brandon Jones59770802018-04-02 13:18:42 -0700868bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300869{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500870 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300871}
872
Brandon Jones59770802018-04-02 13:18:42 -0700873void Context::pathCommands(GLuint path,
874 GLsizei numCommands,
875 const GLubyte *commands,
876 GLsizei numCoords,
877 GLenum coordType,
878 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300879{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500880 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300881
882 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
883}
884
Jamie Madill007530e2017-12-28 14:27:04 -0500885void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300886{
Jamie Madill007530e2017-12-28 14:27:04 -0500887 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300888
889 switch (pname)
890 {
891 case GL_PATH_STROKE_WIDTH_CHROMIUM:
892 pathObj->setStrokeWidth(value);
893 break;
894 case GL_PATH_END_CAPS_CHROMIUM:
895 pathObj->setEndCaps(static_cast<GLenum>(value));
896 break;
897 case GL_PATH_JOIN_STYLE_CHROMIUM:
898 pathObj->setJoinStyle(static_cast<GLenum>(value));
899 break;
900 case GL_PATH_MITER_LIMIT_CHROMIUM:
901 pathObj->setMiterLimit(value);
902 break;
903 case GL_PATH_STROKE_BOUND_CHROMIUM:
904 pathObj->setStrokeBound(value);
905 break;
906 default:
907 UNREACHABLE();
908 break;
909 }
910}
911
Jamie Madill007530e2017-12-28 14:27:04 -0500912void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300913{
Jamie Madill007530e2017-12-28 14:27:04 -0500914 // TODO(jmadill): Should use proper clamping/casting.
915 pathParameterf(path, pname, static_cast<GLfloat>(value));
916}
917
918void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
919{
920 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300921
922 switch (pname)
923 {
924 case GL_PATH_STROKE_WIDTH_CHROMIUM:
925 *value = pathObj->getStrokeWidth();
926 break;
927 case GL_PATH_END_CAPS_CHROMIUM:
928 *value = static_cast<GLfloat>(pathObj->getEndCaps());
929 break;
930 case GL_PATH_JOIN_STYLE_CHROMIUM:
931 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
932 break;
933 case GL_PATH_MITER_LIMIT_CHROMIUM:
934 *value = pathObj->getMiterLimit();
935 break;
936 case GL_PATH_STROKE_BOUND_CHROMIUM:
937 *value = pathObj->getStrokeBound();
938 break;
939 default:
940 UNREACHABLE();
941 break;
942 }
943}
944
Jamie Madill007530e2017-12-28 14:27:04 -0500945void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
946{
947 GLfloat val = 0.0f;
948 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
949 if (value)
950 *value = static_cast<GLint>(val);
951}
952
Brandon Jones59770802018-04-02 13:18:42 -0700953void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300954{
955 mGLState.setPathStencilFunc(func, ref, mask);
956}
957
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000958void Context::deleteFramebuffer(GLuint framebuffer)
959{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500960 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961 {
962 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000963 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500964
Jamie Madill6c1f6712017-02-14 19:08:04 -0500965 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966}
967
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500968void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000969{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500970 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000971 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500972 GLuint fence = fences[i];
973
974 FenceNV *fenceObject = nullptr;
975 if (mFenceNVMap.erase(fence, &fenceObject))
976 {
977 mFenceNVHandleAllocator.release(fence);
978 delete fenceObject;
979 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980 }
981}
982
Geoff Lang70d0f492015-12-10 17:45:46 -0500983Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000984{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500985 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000986}
987
Geoff Lang70d0f492015-12-10 17:45:46 -0500988Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500990 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000991}
992
Jamie Madill70b5bb02017-08-28 13:32:37 -0400993Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400994{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400995 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400996}
997
Jamie Madill57a89722013-07-02 11:57:03 -0400998VertexArray *Context::getVertexArray(GLuint handle) const
999{
Jamie Madill96a483b2017-06-27 16:49:21 -04001000 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001001}
1002
Jamie Madilldc356042013-07-19 16:36:57 -04001003Sampler *Context::getSampler(GLuint handle) const
1004{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001005 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001006}
1007
Geoff Langc8058452014-02-03 12:04:11 -05001008TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1009{
Jamie Madill96a483b2017-06-27 16:49:21 -04001010 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001011}
1012
Yunchao Hea336b902017-08-02 16:05:21 +08001013ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1014{
1015 return mState.mPipelines->getProgramPipeline(handle);
1016}
1017
Geoff Lang75359662018-04-11 01:42:27 -04001018gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001019{
1020 switch (identifier)
1021 {
1022 case GL_BUFFER:
1023 return getBuffer(name);
1024 case GL_SHADER:
1025 return getShader(name);
1026 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001027 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001028 case GL_VERTEX_ARRAY:
1029 return getVertexArray(name);
1030 case GL_QUERY:
1031 return getQuery(name);
1032 case GL_TRANSFORM_FEEDBACK:
1033 return getTransformFeedback(name);
1034 case GL_SAMPLER:
1035 return getSampler(name);
1036 case GL_TEXTURE:
1037 return getTexture(name);
1038 case GL_RENDERBUFFER:
1039 return getRenderbuffer(name);
1040 case GL_FRAMEBUFFER:
1041 return getFramebuffer(name);
1042 default:
1043 UNREACHABLE();
1044 return nullptr;
1045 }
1046}
1047
Geoff Lang75359662018-04-11 01:42:27 -04001048gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001049{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001050 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001051}
1052
Martin Radev9d901792016-07-15 15:58:58 +03001053void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1054{
Geoff Lang75359662018-04-11 01:42:27 -04001055 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001056 ASSERT(object != nullptr);
1057
1058 std::string labelName = GetObjectLabelFromPointer(length, label);
1059 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001060
1061 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1062 // specified object is active until we do this.
1063 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001064}
1065
1066void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1067{
Geoff Lang75359662018-04-11 01:42:27 -04001068 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001069 ASSERT(object != nullptr);
1070
1071 std::string labelName = GetObjectLabelFromPointer(length, label);
1072 object->setLabel(labelName);
1073}
1074
1075void Context::getObjectLabel(GLenum identifier,
1076 GLuint name,
1077 GLsizei bufSize,
1078 GLsizei *length,
1079 GLchar *label) const
1080{
Geoff Lang75359662018-04-11 01:42:27 -04001081 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001082 ASSERT(object != nullptr);
1083
1084 const std::string &objectLabel = object->getLabel();
1085 GetObjectLabelBase(objectLabel, bufSize, length, label);
1086}
1087
1088void Context::getObjectPtrLabel(const void *ptr,
1089 GLsizei bufSize,
1090 GLsizei *length,
1091 GLchar *label) const
1092{
Geoff Lang75359662018-04-11 01:42:27 -04001093 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001094 ASSERT(object != nullptr);
1095
1096 const std::string &objectLabel = object->getLabel();
1097 GetObjectLabelBase(objectLabel, bufSize, length, label);
1098}
1099
Jamie Madilldc356042013-07-19 16:36:57 -04001100bool Context::isSampler(GLuint samplerName) const
1101{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001102 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001103}
1104
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001105void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001106{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001107 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001108
Jamie Madilldedd7b92014-11-05 16:30:36 -05001109 if (handle == 0)
1110 {
1111 texture = mZeroTextures[target].get();
1112 }
1113 else
1114 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001115 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001116 }
1117
1118 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001119 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001120 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001121}
1122
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001123void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001124{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001125 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1126 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001127 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001128 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001129}
1130
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001131void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001132{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001133 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1134 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001135 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001136 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001137 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001138}
1139
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001140void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001141{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001142 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001143 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001144 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001145 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001146}
1147
Shao80957d92017-02-20 21:25:59 +08001148void Context::bindVertexBuffer(GLuint bindingIndex,
1149 GLuint bufferHandle,
1150 GLintptr offset,
1151 GLsizei stride)
1152{
1153 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001154 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001155 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001156}
1157
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001158void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001159{
Geoff Lang76b10c92014-09-05 16:28:14 -04001160 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001161 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001162 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001163 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001164 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001165}
1166
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001167void Context::bindImageTexture(GLuint unit,
1168 GLuint texture,
1169 GLint level,
1170 GLboolean layered,
1171 GLint layer,
1172 GLenum access,
1173 GLenum format)
1174{
1175 Texture *tex = mState.mTextures->getTexture(texture);
1176 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1177}
1178
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001179void Context::useProgram(GLuint program)
1180{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001181 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001182 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001183}
1184
Jiajia Qin5451d532017-11-16 17:16:34 +08001185void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1186{
1187 UNIMPLEMENTED();
1188}
1189
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001190void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001191{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001192 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001193 TransformFeedback *transformFeedback =
1194 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001195 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001196 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001197}
1198
Yunchao Hea336b902017-08-02 16:05:21 +08001199void Context::bindProgramPipeline(GLuint pipelineHandle)
1200{
1201 ProgramPipeline *pipeline =
1202 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1203 mGLState.setProgramPipelineBinding(this, pipeline);
1204}
1205
Corentin Wallezad3ae902018-03-09 13:40:42 -05001206void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001207{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001208 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001209 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210
Geoff Lang5aad9672014-09-08 11:10:42 -04001211 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001212 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001213
1214 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001215 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001216 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217}
1218
Corentin Wallezad3ae902018-03-09 13:40:42 -05001219void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001221 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001222 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223
Jamie Madill5188a272018-07-25 10:53:56 -04001224 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225
Geoff Lang5aad9672014-09-08 11:10:42 -04001226 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001227 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001228 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001229}
1230
Corentin Wallezad3ae902018-03-09 13:40:42 -05001231void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001232{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001233 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001234
1235 Query *queryObject = getQuery(id, true, target);
1236 ASSERT(queryObject);
1237
Jamie Madill5188a272018-07-25 10:53:56 -04001238 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001239}
1240
Corentin Wallezad3ae902018-03-09 13:40:42 -05001241void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242{
1243 switch (pname)
1244 {
1245 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001246 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001247 break;
1248 case GL_QUERY_COUNTER_BITS_EXT:
1249 switch (target)
1250 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001251 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001252 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1253 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001254 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255 params[0] = getExtensions().queryCounterBitsTimestamp;
1256 break;
1257 default:
1258 UNREACHABLE();
1259 params[0] = 0;
1260 break;
1261 }
1262 break;
1263 default:
1264 UNREACHABLE();
1265 return;
1266 }
1267}
1268
Corentin Wallezad3ae902018-03-09 13:40:42 -05001269void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001270 GLenum pname,
1271 GLsizei bufSize,
1272 GLsizei *length,
1273 GLint *params)
1274{
1275 getQueryiv(target, pname, params);
1276}
1277
Geoff Lang2186c382016-10-14 10:54:54 -04001278void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001279{
Jamie Madill5188a272018-07-25 10:53:56 -04001280 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001281}
1282
Brandon Jones59770802018-04-02 13:18:42 -07001283void Context::getQueryObjectivRobust(GLuint id,
1284 GLenum pname,
1285 GLsizei bufSize,
1286 GLsizei *length,
1287 GLint *params)
1288{
1289 getQueryObjectiv(id, pname, params);
1290}
1291
Geoff Lang2186c382016-10-14 10:54:54 -04001292void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001293{
Jamie Madill5188a272018-07-25 10:53:56 -04001294 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001295}
1296
Brandon Jones59770802018-04-02 13:18:42 -07001297void Context::getQueryObjectuivRobust(GLuint id,
1298 GLenum pname,
1299 GLsizei bufSize,
1300 GLsizei *length,
1301 GLuint *params)
1302{
1303 getQueryObjectuiv(id, pname, params);
1304}
1305
Geoff Lang2186c382016-10-14 10:54:54 -04001306void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001307{
Jamie Madill5188a272018-07-25 10:53:56 -04001308 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001309}
1310
Brandon Jones59770802018-04-02 13:18:42 -07001311void Context::getQueryObjecti64vRobust(GLuint id,
1312 GLenum pname,
1313 GLsizei bufSize,
1314 GLsizei *length,
1315 GLint64 *params)
1316{
1317 getQueryObjecti64v(id, pname, params);
1318}
1319
Geoff Lang2186c382016-10-14 10:54:54 -04001320void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001321{
Jamie Madill5188a272018-07-25 10:53:56 -04001322 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001323}
1324
Brandon Jones59770802018-04-02 13:18:42 -07001325void Context::getQueryObjectui64vRobust(GLuint id,
1326 GLenum pname,
1327 GLsizei bufSize,
1328 GLsizei *length,
1329 GLuint64 *params)
1330{
1331 getQueryObjectui64v(id, pname, params);
1332}
1333
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001334Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001335{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001336 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337}
1338
Jamie Madill2f348d22017-06-05 10:50:59 -04001339FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340{
Jamie Madill96a483b2017-06-27 16:49:21 -04001341 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001342}
1343
Corentin Wallezad3ae902018-03-09 13:40:42 -05001344Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345{
Jamie Madill96a483b2017-06-27 16:49:21 -04001346 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001348 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001350
1351 Query *query = mQueryMap.query(handle);
1352 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001353 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001354 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001355 query = new Query(mImplementation->createQuery(type), handle);
1356 query->addRef();
1357 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001358 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001359 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001360}
1361
Geoff Lang70d0f492015-12-10 17:45:46 -05001362Query *Context::getQuery(GLuint handle) const
1363{
Jamie Madill96a483b2017-06-27 16:49:21 -04001364 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001365}
1366
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001367Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001368{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001369 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1370 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001371}
1372
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001373Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001374{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001375 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001376}
1377
Geoff Lang492a7e42014-11-05 13:27:06 -05001378Compiler *Context::getCompiler() const
1379{
Jamie Madill2f348d22017-06-05 10:50:59 -04001380 if (mCompiler.get() == nullptr)
1381 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001382 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001383 }
1384 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001385}
1386
Jamie Madillc1d770e2017-04-13 17:31:24 -04001387void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001388{
1389 switch (pname)
1390 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001391 case GL_SHADER_COMPILER:
1392 *params = GL_TRUE;
1393 break;
1394 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1395 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1396 break;
1397 default:
1398 mGLState.getBooleanv(pname, params);
1399 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001400 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401}
1402
Jamie Madillc1d770e2017-04-13 17:31:24 -04001403void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001404{
Shannon Woods53a94a82014-06-24 15:20:36 -04001405 // Queries about context capabilities and maximums are answered by Context.
1406 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001407 switch (pname)
1408 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001409 case GL_ALIASED_LINE_WIDTH_RANGE:
1410 params[0] = mCaps.minAliasedLineWidth;
1411 params[1] = mCaps.maxAliasedLineWidth;
1412 break;
1413 case GL_ALIASED_POINT_SIZE_RANGE:
1414 params[0] = mCaps.minAliasedPointSize;
1415 params[1] = mCaps.maxAliasedPointSize;
1416 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001417 case GL_SMOOTH_POINT_SIZE_RANGE:
1418 params[0] = mCaps.minSmoothPointSize;
1419 params[1] = mCaps.maxSmoothPointSize;
1420 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001421 case GL_SMOOTH_LINE_WIDTH_RANGE:
1422 params[0] = mCaps.minSmoothLineWidth;
1423 params[1] = mCaps.maxSmoothLineWidth;
1424 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001425 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1426 ASSERT(mExtensions.textureFilterAnisotropic);
1427 *params = mExtensions.maxTextureAnisotropy;
1428 break;
1429 case GL_MAX_TEXTURE_LOD_BIAS:
1430 *params = mCaps.maxLODBias;
1431 break;
1432
1433 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1434 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1435 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001436 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1437 // GLES1 constants for modelview/projection matrix.
1438 if (getClientVersion() < Version(2, 0))
1439 {
1440 mGLState.getFloatv(pname, params);
1441 }
1442 else
1443 {
1444 ASSERT(mExtensions.pathRendering);
1445 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1446 memcpy(params, m, 16 * sizeof(GLfloat));
1447 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001448 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001449 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001450
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 default:
1452 mGLState.getFloatv(pname, params);
1453 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001454 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001455}
1456
Jamie Madillc1d770e2017-04-13 17:31:24 -04001457void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458{
Shannon Woods53a94a82014-06-24 15:20:36 -04001459 // Queries about context capabilities and maximums are answered by Context.
1460 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001461
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001462 switch (pname)
1463 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001464 case GL_MAX_VERTEX_ATTRIBS:
1465 *params = mCaps.maxVertexAttributes;
1466 break;
1467 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1468 *params = mCaps.maxVertexUniformVectors;
1469 break;
1470 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001471 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001472 break;
1473 case GL_MAX_VARYING_VECTORS:
1474 *params = mCaps.maxVaryingVectors;
1475 break;
1476 case GL_MAX_VARYING_COMPONENTS:
1477 *params = mCaps.maxVertexOutputComponents;
1478 break;
1479 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1480 *params = mCaps.maxCombinedTextureImageUnits;
1481 break;
1482 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001483 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001484 break;
1485 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001486 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1489 *params = mCaps.maxFragmentUniformVectors;
1490 break;
1491 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001492 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001493 break;
1494 case GL_MAX_RENDERBUFFER_SIZE:
1495 *params = mCaps.maxRenderbufferSize;
1496 break;
1497 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1498 *params = mCaps.maxColorAttachments;
1499 break;
1500 case GL_MAX_DRAW_BUFFERS_EXT:
1501 *params = mCaps.maxDrawBuffers;
1502 break;
1503 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1504 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1505 case GL_SUBPIXEL_BITS:
1506 *params = 4;
1507 break;
1508 case GL_MAX_TEXTURE_SIZE:
1509 *params = mCaps.max2DTextureSize;
1510 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001511 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1512 *params = mCaps.maxRectangleTextureSize;
1513 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001514 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1515 *params = mCaps.maxCubeMapTextureSize;
1516 break;
1517 case GL_MAX_3D_TEXTURE_SIZE:
1518 *params = mCaps.max3DTextureSize;
1519 break;
1520 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1521 *params = mCaps.maxArrayTextureLayers;
1522 break;
1523 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1524 *params = mCaps.uniformBufferOffsetAlignment;
1525 break;
1526 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1527 *params = mCaps.maxUniformBufferBindings;
1528 break;
1529 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001530 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001531 break;
1532 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001533 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001534 break;
1535 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1536 *params = mCaps.maxCombinedTextureImageUnits;
1537 break;
1538 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1539 *params = mCaps.maxVertexOutputComponents;
1540 break;
1541 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1542 *params = mCaps.maxFragmentInputComponents;
1543 break;
1544 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1545 *params = mCaps.minProgramTexelOffset;
1546 break;
1547 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1548 *params = mCaps.maxProgramTexelOffset;
1549 break;
1550 case GL_MAJOR_VERSION:
1551 *params = getClientVersion().major;
1552 break;
1553 case GL_MINOR_VERSION:
1554 *params = getClientVersion().minor;
1555 break;
1556 case GL_MAX_ELEMENTS_INDICES:
1557 *params = mCaps.maxElementsIndices;
1558 break;
1559 case GL_MAX_ELEMENTS_VERTICES:
1560 *params = mCaps.maxElementsVertices;
1561 break;
1562 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1563 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1564 break;
1565 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1566 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1567 break;
1568 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1569 *params = mCaps.maxTransformFeedbackSeparateComponents;
1570 break;
1571 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1572 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1573 break;
1574 case GL_MAX_SAMPLES_ANGLE:
1575 *params = mCaps.maxSamples;
1576 break;
1577 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001578 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001579 params[0] = mCaps.maxViewportWidth;
1580 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001581 }
1582 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001583 case GL_COMPRESSED_TEXTURE_FORMATS:
1584 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1585 params);
1586 break;
1587 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1588 *params = mResetStrategy;
1589 break;
1590 case GL_NUM_SHADER_BINARY_FORMATS:
1591 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1592 break;
1593 case GL_SHADER_BINARY_FORMATS:
1594 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1595 break;
1596 case GL_NUM_PROGRAM_BINARY_FORMATS:
1597 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1598 break;
1599 case GL_PROGRAM_BINARY_FORMATS:
1600 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1601 break;
1602 case GL_NUM_EXTENSIONS:
1603 *params = static_cast<GLint>(mExtensionStrings.size());
1604 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001605
Geoff Lang38f24ee2018-10-01 13:04:59 -04001606 // GL_ANGLE_request_extension
1607 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1608 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1609 break;
1610
Jamie Madill231c7f52017-04-26 13:45:37 -04001611 // GL_KHR_debug
1612 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1613 *params = mExtensions.maxDebugMessageLength;
1614 break;
1615 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1616 *params = mExtensions.maxDebugLoggedMessages;
1617 break;
1618 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1619 *params = mExtensions.maxDebugGroupStackDepth;
1620 break;
1621 case GL_MAX_LABEL_LENGTH:
1622 *params = mExtensions.maxLabelLength;
1623 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001624
Martin Radeve5285d22017-07-14 16:23:53 +03001625 // GL_ANGLE_multiview
1626 case GL_MAX_VIEWS_ANGLE:
1627 *params = mExtensions.maxViews;
1628 break;
1629
Jamie Madill231c7f52017-04-26 13:45:37 -04001630 // GL_EXT_disjoint_timer_query
1631 case GL_GPU_DISJOINT_EXT:
1632 *params = mImplementation->getGPUDisjoint();
1633 break;
1634 case GL_MAX_FRAMEBUFFER_WIDTH:
1635 *params = mCaps.maxFramebufferWidth;
1636 break;
1637 case GL_MAX_FRAMEBUFFER_HEIGHT:
1638 *params = mCaps.maxFramebufferHeight;
1639 break;
1640 case GL_MAX_FRAMEBUFFER_SAMPLES:
1641 *params = mCaps.maxFramebufferSamples;
1642 break;
1643 case GL_MAX_SAMPLE_MASK_WORDS:
1644 *params = mCaps.maxSampleMaskWords;
1645 break;
1646 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1647 *params = mCaps.maxColorTextureSamples;
1648 break;
1649 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1650 *params = mCaps.maxDepthTextureSamples;
1651 break;
1652 case GL_MAX_INTEGER_SAMPLES:
1653 *params = mCaps.maxIntegerSamples;
1654 break;
1655 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1656 *params = mCaps.maxVertexAttribRelativeOffset;
1657 break;
1658 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1659 *params = mCaps.maxVertexAttribBindings;
1660 break;
1661 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1662 *params = mCaps.maxVertexAttribStride;
1663 break;
1664 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001665 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001666 break;
1667 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001668 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001672 break;
1673 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001674 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001677 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001680 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001681 break;
1682 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001686 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1689 *params = mCaps.minProgramTextureGatherOffset;
1690 break;
1691 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1692 *params = mCaps.maxProgramTextureGatherOffset;
1693 break;
1694 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1695 *params = mCaps.maxComputeWorkGroupInvocations;
1696 break;
1697 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001698 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001699 break;
1700 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001701 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
1703 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1704 *params = mCaps.maxComputeSharedMemorySize;
1705 break;
1706 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001707 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001708 break;
1709 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001710 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001711 break;
1712 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001714 break;
1715 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001716 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params =
1720 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001721 break;
1722 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001723 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001724 break;
1725 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1726 *params = mCaps.maxCombinedShaderOutputResources;
1727 break;
1728 case GL_MAX_UNIFORM_LOCATIONS:
1729 *params = mCaps.maxUniformLocations;
1730 break;
1731 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1732 *params = mCaps.maxAtomicCounterBufferBindings;
1733 break;
1734 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1735 *params = mCaps.maxAtomicCounterBufferSize;
1736 break;
1737 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1738 *params = mCaps.maxCombinedAtomicCounterBuffers;
1739 break;
1740 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1741 *params = mCaps.maxCombinedAtomicCounters;
1742 break;
1743 case GL_MAX_IMAGE_UNITS:
1744 *params = mCaps.maxImageUnits;
1745 break;
1746 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1747 *params = mCaps.maxCombinedImageUniforms;
1748 break;
1749 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1750 *params = mCaps.maxShaderStorageBufferBindings;
1751 break;
1752 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1753 *params = mCaps.maxCombinedShaderStorageBlocks;
1754 break;
1755 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1756 *params = mCaps.shaderStorageBufferOffsetAlignment;
1757 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001758
1759 // GL_EXT_geometry_shader
1760 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1761 *params = mCaps.maxFramebufferLayers;
1762 break;
1763 case GL_LAYER_PROVOKING_VERTEX_EXT:
1764 *params = mCaps.layerProvokingVertex;
1765 break;
1766 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001767 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001768 break;
1769 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001770 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001773 *params =
1774 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001775 break;
1776 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1777 *params = mCaps.maxGeometryInputComponents;
1778 break;
1779 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1780 *params = mCaps.maxGeometryOutputComponents;
1781 break;
1782 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1783 *params = mCaps.maxGeometryOutputVertices;
1784 break;
1785 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1786 *params = mCaps.maxGeometryTotalOutputComponents;
1787 break;
1788 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1789 *params = mCaps.maxGeometryShaderInvocations;
1790 break;
1791 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001792 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001793 break;
1794 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001795 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001796 break;
1797 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001798 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001799 break;
1800 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001801 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001802 break;
1803 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001804 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001805 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001806 // GLES1 emulation: Caps queries
1807 case GL_MAX_TEXTURE_UNITS:
1808 *params = mCaps.maxMultitextureUnits;
1809 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001810 case GL_MAX_MODELVIEW_STACK_DEPTH:
1811 *params = mCaps.maxModelviewMatrixStackDepth;
1812 break;
1813 case GL_MAX_PROJECTION_STACK_DEPTH:
1814 *params = mCaps.maxProjectionMatrixStackDepth;
1815 break;
1816 case GL_MAX_TEXTURE_STACK_DEPTH:
1817 *params = mCaps.maxTextureMatrixStackDepth;
1818 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001819 case GL_MAX_LIGHTS:
1820 *params = mCaps.maxLights;
1821 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001822 case GL_MAX_CLIP_PLANES:
1823 *params = mCaps.maxClipPlanes;
1824 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001825 // GLES1 emulation: Vertex attribute queries
1826 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1827 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1828 case GL_COLOR_ARRAY_BUFFER_BINDING:
1829 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1830 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1831 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1832 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1833 break;
1834 case GL_VERTEX_ARRAY_STRIDE:
1835 case GL_NORMAL_ARRAY_STRIDE:
1836 case GL_COLOR_ARRAY_STRIDE:
1837 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1838 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1839 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1840 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1841 break;
1842 case GL_VERTEX_ARRAY_SIZE:
1843 case GL_COLOR_ARRAY_SIZE:
1844 case GL_TEXTURE_COORD_ARRAY_SIZE:
1845 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1846 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1847 break;
1848 case GL_VERTEX_ARRAY_TYPE:
1849 case GL_COLOR_ARRAY_TYPE:
1850 case GL_NORMAL_ARRAY_TYPE:
1851 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1852 case GL_TEXTURE_COORD_ARRAY_TYPE:
1853 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1854 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1855 break;
1856
jchen1082af6202018-06-22 10:59:52 +08001857 // GL_KHR_parallel_shader_compile
1858 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1859 *params = mGLState.getMaxShaderCompilerThreads();
1860 break;
1861
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001862 // GL_EXT_blend_func_extended
1863 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1864 *params = mExtensions.maxDualSourceDrawBuffers;
1865 break;
1866
Jamie Madill231c7f52017-04-26 13:45:37 -04001867 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001868 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001869 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001870 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001871}
1872
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001873void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001874{
Shannon Woods53a94a82014-06-24 15:20:36 -04001875 // Queries about context capabilities and maximums are answered by Context.
1876 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001877 switch (pname)
1878 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001879 case GL_MAX_ELEMENT_INDEX:
1880 *params = mCaps.maxElementIndex;
1881 break;
1882 case GL_MAX_UNIFORM_BLOCK_SIZE:
1883 *params = mCaps.maxUniformBlockSize;
1884 break;
1885 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001886 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001887 break;
1888 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001889 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001890 break;
1891 case GL_MAX_SERVER_WAIT_TIMEOUT:
1892 *params = mCaps.maxServerWaitTimeout;
1893 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001894
Jamie Madill231c7f52017-04-26 13:45:37 -04001895 // GL_EXT_disjoint_timer_query
1896 case GL_TIMESTAMP_EXT:
1897 *params = mImplementation->getTimestamp();
1898 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001899
Jamie Madill231c7f52017-04-26 13:45:37 -04001900 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1901 *params = mCaps.maxShaderStorageBlockSize;
1902 break;
1903 default:
1904 UNREACHABLE();
1905 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001906 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001907}
1908
Geoff Lang70d0f492015-12-10 17:45:46 -05001909void Context::getPointerv(GLenum pname, void **params) const
1910{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001911 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001912}
1913
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001914void Context::getPointervRobustANGLERobust(GLenum pname,
1915 GLsizei bufSize,
1916 GLsizei *length,
1917 void **params)
1918{
1919 UNIMPLEMENTED();
1920}
1921
Martin Radev66fb8202016-07-28 11:45:20 +03001922void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001923{
Shannon Woods53a94a82014-06-24 15:20:36 -04001924 // Queries about context capabilities and maximums are answered by Context.
1925 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001926
1927 GLenum nativeType;
1928 unsigned int numParams;
1929 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1930 ASSERT(queryStatus);
1931
1932 if (nativeType == GL_INT)
1933 {
1934 switch (target)
1935 {
1936 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1937 ASSERT(index < 3u);
1938 *data = mCaps.maxComputeWorkGroupCount[index];
1939 break;
1940 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1941 ASSERT(index < 3u);
1942 *data = mCaps.maxComputeWorkGroupSize[index];
1943 break;
1944 default:
1945 mGLState.getIntegeri_v(target, index, data);
1946 }
1947 }
1948 else
1949 {
1950 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1951 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001952}
1953
Brandon Jones59770802018-04-02 13:18:42 -07001954void Context::getIntegeri_vRobust(GLenum target,
1955 GLuint index,
1956 GLsizei bufSize,
1957 GLsizei *length,
1958 GLint *data)
1959{
1960 getIntegeri_v(target, index, data);
1961}
1962
Martin Radev66fb8202016-07-28 11:45:20 +03001963void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001964{
Shannon Woods53a94a82014-06-24 15:20:36 -04001965 // Queries about context capabilities and maximums are answered by Context.
1966 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001967
1968 GLenum nativeType;
1969 unsigned int numParams;
1970 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1971 ASSERT(queryStatus);
1972
1973 if (nativeType == GL_INT_64_ANGLEX)
1974 {
1975 mGLState.getInteger64i_v(target, index, data);
1976 }
1977 else
1978 {
1979 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1980 }
1981}
1982
Brandon Jones59770802018-04-02 13:18:42 -07001983void Context::getInteger64i_vRobust(GLenum target,
1984 GLuint index,
1985 GLsizei bufSize,
1986 GLsizei *length,
1987 GLint64 *data)
1988{
1989 getInteger64i_v(target, index, data);
1990}
1991
Martin Radev66fb8202016-07-28 11:45:20 +03001992void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1993{
1994 // Queries about context capabilities and maximums are answered by Context.
1995 // Queries about current GL state values are answered by State.
1996
1997 GLenum nativeType;
1998 unsigned int numParams;
1999 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2000 ASSERT(queryStatus);
2001
2002 if (nativeType == GL_BOOL)
2003 {
2004 mGLState.getBooleani_v(target, index, data);
2005 }
2006 else
2007 {
2008 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2009 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002010}
2011
Brandon Jones59770802018-04-02 13:18:42 -07002012void Context::getBooleani_vRobust(GLenum target,
2013 GLuint index,
2014 GLsizei bufSize,
2015 GLsizei *length,
2016 GLboolean *data)
2017{
2018 getBooleani_v(target, index, data);
2019}
2020
Corentin Wallez336129f2017-10-17 15:55:40 -04002021void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002022{
2023 Buffer *buffer = mGLState.getTargetBuffer(target);
2024 QueryBufferParameteriv(buffer, pname, params);
2025}
2026
Brandon Jones59770802018-04-02 13:18:42 -07002027void Context::getBufferParameterivRobust(BufferBinding target,
2028 GLenum pname,
2029 GLsizei bufSize,
2030 GLsizei *length,
2031 GLint *params)
2032{
2033 getBufferParameteriv(target, pname, params);
2034}
2035
He Yunchao010e4db2017-03-03 14:22:06 +08002036void Context::getFramebufferAttachmentParameteriv(GLenum target,
2037 GLenum attachment,
2038 GLenum pname,
2039 GLint *params)
2040{
2041 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002042 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002043}
2044
Brandon Jones59770802018-04-02 13:18:42 -07002045void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2046 GLenum attachment,
2047 GLenum pname,
2048 GLsizei bufSize,
2049 GLsizei *length,
2050 GLint *params)
2051{
2052 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2053}
2054
He Yunchao010e4db2017-03-03 14:22:06 +08002055void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2056{
2057 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2058 QueryRenderbufferiv(this, renderbuffer, pname, params);
2059}
2060
Brandon Jones59770802018-04-02 13:18:42 -07002061void Context::getRenderbufferParameterivRobust(GLenum target,
2062 GLenum pname,
2063 GLsizei bufSize,
2064 GLsizei *length,
2065 GLint *params)
2066{
2067 getRenderbufferParameteriv(target, pname, params);
2068}
2069
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002070void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002071{
2072 Texture *texture = getTargetTexture(target);
2073 QueryTexParameterfv(texture, pname, params);
2074}
2075
Brandon Jones59770802018-04-02 13:18:42 -07002076void Context::getTexParameterfvRobust(TextureType target,
2077 GLenum pname,
2078 GLsizei bufSize,
2079 GLsizei *length,
2080 GLfloat *params)
2081{
2082 getTexParameterfv(target, pname, params);
2083}
2084
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002085void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002086{
2087 Texture *texture = getTargetTexture(target);
2088 QueryTexParameteriv(texture, pname, params);
2089}
Jiajia Qin5451d532017-11-16 17:16:34 +08002090
Brandon Jones59770802018-04-02 13:18:42 -07002091void Context::getTexParameterivRobust(TextureType target,
2092 GLenum pname,
2093 GLsizei bufSize,
2094 GLsizei *length,
2095 GLint *params)
2096{
2097 getTexParameteriv(target, pname, params);
2098}
2099
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002100void Context::getTexParameterIivRobust(TextureType target,
2101 GLenum pname,
2102 GLsizei bufSize,
2103 GLsizei *length,
2104 GLint *params)
2105{
2106 UNIMPLEMENTED();
2107}
2108
2109void Context::getTexParameterIuivRobust(TextureType target,
2110 GLenum pname,
2111 GLsizei bufSize,
2112 GLsizei *length,
2113 GLuint *params)
2114{
2115 UNIMPLEMENTED();
2116}
2117
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002118void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002119{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002120 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002121 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002122}
2123
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002124void Context::getTexLevelParameterivRobust(TextureTarget target,
2125 GLint level,
2126 GLenum pname,
2127 GLsizei bufSize,
2128 GLsizei *length,
2129 GLint *params)
2130{
2131 UNIMPLEMENTED();
2132}
2133
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002134void Context::getTexLevelParameterfv(TextureTarget target,
2135 GLint level,
2136 GLenum pname,
2137 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002138{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002139 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002140 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002141}
2142
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002143void Context::getTexLevelParameterfvRobust(TextureTarget target,
2144 GLint level,
2145 GLenum pname,
2146 GLsizei bufSize,
2147 GLsizei *length,
2148 GLfloat *params)
2149{
2150 UNIMPLEMENTED();
2151}
2152
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002153void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002154{
2155 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002156 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002157 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002158}
2159
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002160void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002161{
2162 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002163 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002164 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002165}
2166
Brandon Jones59770802018-04-02 13:18:42 -07002167void Context::texParameterfvRobust(TextureType target,
2168 GLenum pname,
2169 GLsizei bufSize,
2170 const GLfloat *params)
2171{
2172 texParameterfv(target, pname, params);
2173}
2174
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002175void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002176{
2177 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002178 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002179 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002180}
2181
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002182void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002183{
2184 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002185 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002186 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002187}
2188
Brandon Jones59770802018-04-02 13:18:42 -07002189void Context::texParameterivRobust(TextureType target,
2190 GLenum pname,
2191 GLsizei bufSize,
2192 const GLint *params)
2193{
2194 texParameteriv(target, pname, params);
2195}
2196
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002197void Context::texParameterIivRobust(TextureType target,
2198 GLenum pname,
2199 GLsizei bufSize,
2200 const GLint *params)
2201{
2202 UNIMPLEMENTED();
2203}
2204
2205void Context::texParameterIuivRobust(TextureType target,
2206 GLenum pname,
2207 GLsizei bufSize,
2208 const GLuint *params)
2209{
2210 UNIMPLEMENTED();
2211}
2212
Jamie Madill493f9572018-05-24 19:52:15 -04002213void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002214{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002215 // No-op if count draws no primitives for given mode
2216 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002217 {
2218 return;
2219 }
2220
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002221 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002222 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002223 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002224}
2225
Jamie Madill493f9572018-05-24 19:52:15 -04002226void Context::drawArraysInstanced(PrimitiveMode mode,
2227 GLint first,
2228 GLsizei count,
2229 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002230{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002231 // No-op if count draws no primitives for given mode
2232 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002233 {
2234 return;
2235 }
2236
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002237 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002238 ANGLE_CONTEXT_TRY(
2239 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002240 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2241 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002242}
2243
Jamie Madill493f9572018-05-24 19:52:15 -04002244void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002245{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002246 // No-op if count draws no primitives for given mode
2247 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002248 {
2249 return;
2250 }
2251
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002252 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002253 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002254}
2255
Jamie Madill493f9572018-05-24 19:52:15 -04002256void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002257 GLsizei count,
2258 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002259 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002260 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002261{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002262 // No-op if count draws no primitives for given mode
2263 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002264 {
2265 return;
2266 }
2267
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002268 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002269 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002270 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002271}
2272
Jamie Madill493f9572018-05-24 19:52:15 -04002273void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002274 GLuint start,
2275 GLuint end,
2276 GLsizei count,
2277 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002278 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002279{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002280 // No-op if count draws no primitives for given mode
2281 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002282 {
2283 return;
2284 }
2285
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002286 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002287 ANGLE_CONTEXT_TRY(
2288 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002289}
2290
Jamie Madill493f9572018-05-24 19:52:15 -04002291void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002292{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002293 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002294 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002295}
2296
Jamie Madill493f9572018-05-24 19:52:15 -04002297void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002298{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002299 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002300 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002301}
2302
Jamie Madill675fe712016-12-19 13:07:54 -05002303void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002304{
Jamie Madillafa02a22017-11-23 12:57:38 -05002305 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002306}
2307
Jamie Madill675fe712016-12-19 13:07:54 -05002308void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002309{
Jamie Madillafa02a22017-11-23 12:57:38 -05002310 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002311}
2312
Austin Kinross6ee1e782015-05-29 17:05:37 -07002313void Context::insertEventMarker(GLsizei length, const char *marker)
2314{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002315 ASSERT(mImplementation);
2316 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002317}
2318
2319void Context::pushGroupMarker(GLsizei length, const char *marker)
2320{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002321 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002322
2323 if (marker == nullptr)
2324 {
2325 // From the EXT_debug_marker spec,
2326 // "If <marker> is null then an empty string is pushed on the stack."
2327 mImplementation->pushGroupMarker(length, "");
2328 }
2329 else
2330 {
2331 mImplementation->pushGroupMarker(length, marker);
2332 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002333}
2334
2335void Context::popGroupMarker()
2336{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002337 ASSERT(mImplementation);
2338 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002339}
2340
Geoff Langd8605522016-04-13 10:19:12 -04002341void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2342{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002343 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002344 ASSERT(programObject);
2345
2346 programObject->bindUniformLocation(location, name);
2347}
2348
Brandon Jones59770802018-04-02 13:18:42 -07002349void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002350{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002351 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002352}
2353
Brandon Jones59770802018-04-02 13:18:42 -07002354void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002355{
2356 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2357}
2358
Brandon Jones59770802018-04-02 13:18:42 -07002359void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002360{
2361 GLfloat I[16];
2362 angle::Matrix<GLfloat>::setToIdentity(I);
2363
2364 mGLState.loadPathRenderingMatrix(matrixMode, I);
2365}
2366
2367void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2368{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002369 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002370 if (!pathObj)
2371 return;
2372
Geoff Lang9bf86f02018-07-26 11:46:34 -04002373 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002374
2375 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2376}
2377
2378void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2379{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002380 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002381 if (!pathObj)
2382 return;
2383
Geoff Lang9bf86f02018-07-26 11:46:34 -04002384 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002385
2386 mImplementation->stencilStrokePath(pathObj, reference, mask);
2387}
2388
2389void Context::coverFillPath(GLuint path, GLenum coverMode)
2390{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002392 if (!pathObj)
2393 return;
2394
Geoff Lang9bf86f02018-07-26 11:46:34 -04002395 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002396
2397 mImplementation->coverFillPath(pathObj, coverMode);
2398}
2399
2400void Context::coverStrokePath(GLuint path, GLenum coverMode)
2401{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002402 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002403 if (!pathObj)
2404 return;
2405
Geoff Lang9bf86f02018-07-26 11:46:34 -04002406 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002407
2408 mImplementation->coverStrokePath(pathObj, coverMode);
2409}
2410
2411void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2412{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002413 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002414 if (!pathObj)
2415 return;
2416
Geoff Lang9bf86f02018-07-26 11:46:34 -04002417 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002418
2419 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2420}
2421
2422void Context::stencilThenCoverStrokePath(GLuint path,
2423 GLint reference,
2424 GLuint mask,
2425 GLenum coverMode)
2426{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002427 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002428 if (!pathObj)
2429 return;
2430
Geoff Lang9bf86f02018-07-26 11:46:34 -04002431 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002432
2433 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2434}
2435
Sami Väisänend59ca052016-06-21 16:10:00 +03002436void Context::coverFillPathInstanced(GLsizei numPaths,
2437 GLenum pathNameType,
2438 const void *paths,
2439 GLuint pathBase,
2440 GLenum coverMode,
2441 GLenum transformType,
2442 const GLfloat *transformValues)
2443{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002444 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002445
Geoff Lang9bf86f02018-07-26 11:46:34 -04002446 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002447
2448 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2449}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002450
Sami Väisänend59ca052016-06-21 16:10:00 +03002451void Context::coverStrokePathInstanced(GLsizei numPaths,
2452 GLenum pathNameType,
2453 const void *paths,
2454 GLuint pathBase,
2455 GLenum coverMode,
2456 GLenum transformType,
2457 const GLfloat *transformValues)
2458{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002459 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002460
2461 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002462 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002463
2464 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2465 transformValues);
2466}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002467
Sami Väisänend59ca052016-06-21 16:10:00 +03002468void Context::stencilFillPathInstanced(GLsizei numPaths,
2469 GLenum pathNameType,
2470 const void *paths,
2471 GLuint pathBase,
2472 GLenum fillMode,
2473 GLuint mask,
2474 GLenum transformType,
2475 const GLfloat *transformValues)
2476{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002477 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002478
2479 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002480 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002481
2482 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2483 transformValues);
2484}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002485
Sami Väisänend59ca052016-06-21 16:10:00 +03002486void Context::stencilStrokePathInstanced(GLsizei numPaths,
2487 GLenum pathNameType,
2488 const void *paths,
2489 GLuint pathBase,
2490 GLint reference,
2491 GLuint mask,
2492 GLenum transformType,
2493 const GLfloat *transformValues)
2494{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002495 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002496
Geoff Lang9bf86f02018-07-26 11:46:34 -04002497 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002498
2499 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2500 transformValues);
2501}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002502
Sami Väisänend59ca052016-06-21 16:10:00 +03002503void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2504 GLenum pathNameType,
2505 const void *paths,
2506 GLuint pathBase,
2507 GLenum fillMode,
2508 GLuint mask,
2509 GLenum coverMode,
2510 GLenum transformType,
2511 const GLfloat *transformValues)
2512{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002513 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002514
Geoff Lang9bf86f02018-07-26 11:46:34 -04002515 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002516
2517 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2518 transformType, transformValues);
2519}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002520
Sami Väisänend59ca052016-06-21 16:10:00 +03002521void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2522 GLenum pathNameType,
2523 const void *paths,
2524 GLuint pathBase,
2525 GLint reference,
2526 GLuint mask,
2527 GLenum coverMode,
2528 GLenum transformType,
2529 const GLfloat *transformValues)
2530{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002531 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002532
Geoff Lang9bf86f02018-07-26 11:46:34 -04002533 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002534
2535 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2536 transformType, transformValues);
2537}
2538
Sami Väisänen46eaa942016-06-29 10:26:37 +03002539void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2540{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002541 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002542
2543 programObject->bindFragmentInputLocation(location, name);
2544}
2545
2546void Context::programPathFragmentInputGen(GLuint program,
2547 GLint location,
2548 GLenum genMode,
2549 GLint components,
2550 const GLfloat *coeffs)
2551{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002552 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002553
jchen103fd614d2018-08-13 12:21:58 +08002554 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002555}
2556
jchen1015015f72017-03-16 13:54:21 +08002557GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2558{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002559 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002560 return QueryProgramResourceIndex(programObject, programInterface, name);
2561}
2562
jchen10fd7c3b52017-03-21 15:36:03 +08002563void Context::getProgramResourceName(GLuint program,
2564 GLenum programInterface,
2565 GLuint index,
2566 GLsizei bufSize,
2567 GLsizei *length,
2568 GLchar *name)
2569{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002570 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002571 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2572}
2573
jchen10191381f2017-04-11 13:59:04 +08002574GLint Context::getProgramResourceLocation(GLuint program,
2575 GLenum programInterface,
2576 const GLchar *name)
2577{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002578 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002579 return QueryProgramResourceLocation(programObject, programInterface, name);
2580}
2581
jchen10880683b2017-04-12 16:21:55 +08002582void Context::getProgramResourceiv(GLuint program,
2583 GLenum programInterface,
2584 GLuint index,
2585 GLsizei propCount,
2586 const GLenum *props,
2587 GLsizei bufSize,
2588 GLsizei *length,
2589 GLint *params)
2590{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002591 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002592 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2593 length, params);
2594}
2595
jchen10d9cd7b72017-08-30 15:04:25 +08002596void Context::getProgramInterfaceiv(GLuint program,
2597 GLenum programInterface,
2598 GLenum pname,
2599 GLint *params)
2600{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002601 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002602 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2603}
2604
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002605void Context::getProgramInterfaceivRobust(GLuint program,
2606 GLenum programInterface,
2607 GLenum pname,
2608 GLsizei bufSize,
2609 GLsizei *length,
2610 GLint *params)
2611{
2612 UNIMPLEMENTED();
2613}
2614
Jamie Madill306b6c12018-07-27 08:12:49 -04002615void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002616{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002617 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002618}
2619
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002620void Context::handleError(GLenum errorCode,
2621 const char *message,
2622 const char *file,
2623 const char *function,
2624 unsigned int line)
2625{
2626 mErrors.handleError(errorCode, message, file, function, line);
2627}
2628
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002629// Get one of the recorded errors and clear its flag, if any.
2630// [OpenGL ES 2.0.24] section 2.5 page 13.
2631GLenum Context::getError()
2632{
Geoff Langda5777c2014-07-11 09:52:58 -04002633 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002634 {
Geoff Langda5777c2014-07-11 09:52:58 -04002635 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636 }
Geoff Langda5777c2014-07-11 09:52:58 -04002637 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002638 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002639 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002640 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002641}
2642
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002643// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002644void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002645{
2646 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002647 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002648 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002649 mContextLostForced = true;
2650 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002651 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652}
2653
Jamie Madillfa920eb2018-01-04 11:45:50 -05002654GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002655{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002656 // Even if the application doesn't want to know about resets, we want to know
2657 // as it will allow us to skip all the calls.
2658 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002659 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002660 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002661 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002662 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002663 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002664
2665 // EXT_robustness, section 2.6: If the reset notification behavior is
2666 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2667 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2668 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002669 }
2670
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002671 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2672 // status should be returned at least once, and GL_NO_ERROR should be returned
2673 // once the device has finished resetting.
2674 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002675 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002676 ASSERT(mResetStatus == GL_NO_ERROR);
2677 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002678
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002680 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002681 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002682 }
2683 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002684 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002685 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002686 // If markContextLost was used to mark the context lost then
2687 // assume that is not recoverable, and continue to report the
2688 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689 mResetStatus = mImplementation->getResetStatus();
2690 }
Jamie Madill893ab082014-05-16 16:56:10 -04002691
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002692 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002693}
2694
2695bool Context::isResetNotificationEnabled()
2696{
2697 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2698}
2699
Corentin Walleze3b10e82015-05-20 11:06:25 -04002700const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002701{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002702 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002703}
2704
2705EGLenum Context::getClientType() const
2706{
2707 return mClientType;
2708}
2709
2710EGLenum Context::getRenderBuffer() const
2711{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002712 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2713 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002714 {
2715 return EGL_NONE;
2716 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002717
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002718 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002719 ASSERT(backAttachment != nullptr);
2720 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002721}
2722
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002723VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002724{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002725 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002726 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2727 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002728 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002729 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2730 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002731
Jamie Madill96a483b2017-06-27 16:49:21 -04002732 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002733 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002734
2735 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002736}
2737
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002738TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002739{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002740 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002741 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2742 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002743 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002744 transformFeedback =
2745 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002746 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002747 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002748 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002749
2750 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002751}
2752
2753bool Context::isVertexArrayGenerated(GLuint vertexArray)
2754{
Jamie Madill96a483b2017-06-27 16:49:21 -04002755 ASSERT(mVertexArrayMap.contains(0));
2756 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002757}
2758
2759bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2760{
Jamie Madill96a483b2017-06-27 16:49:21 -04002761 ASSERT(mTransformFeedbackMap.contains(0));
2762 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002763}
2764
Shannon Woods53a94a82014-06-24 15:20:36 -04002765void Context::detachTexture(GLuint texture)
2766{
2767 // Simple pass-through to State's detachTexture method, as textures do not require
2768 // allocation map management either here or in the resource manager at detach time.
2769 // Zero textures are held by the Context, and we don't attempt to request them from
2770 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002771 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002772}
2773
James Darpinian4d9d4832018-03-13 12:43:28 -07002774void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002775{
Yuly Novikov5807a532015-12-03 13:01:22 -05002776 // Simple pass-through to State's detachBuffer method, since
2777 // only buffer attachments to container objects that are bound to the current context
2778 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002779
Yuly Novikov5807a532015-12-03 13:01:22 -05002780 // [OpenGL ES 3.2] section 5.1.2 page 45:
2781 // Attachments to unbound container objects, such as
2782 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2783 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002784 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002785}
2786
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002787void Context::detachFramebuffer(GLuint framebuffer)
2788{
Shannon Woods53a94a82014-06-24 15:20:36 -04002789 // Framebuffer detachment is handled by Context, because 0 is a valid
2790 // Framebuffer object, and a pointer to it must be passed from Context
2791 // to State at binding time.
2792
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002793 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002794 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2795 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2796 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002797
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002798 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002799 {
2800 bindReadFramebuffer(0);
2801 }
2802
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002803 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002804 {
2805 bindDrawFramebuffer(0);
2806 }
2807}
2808
2809void Context::detachRenderbuffer(GLuint renderbuffer)
2810{
Jamie Madilla02315b2017-02-23 14:14:47 -05002811 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002812}
2813
Jamie Madill57a89722013-07-02 11:57:03 -04002814void Context::detachVertexArray(GLuint vertexArray)
2815{
Jamie Madill77a72f62015-04-14 11:18:32 -04002816 // Vertex array detachment is handled by Context, because 0 is a valid
2817 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002818 // binding time.
2819
Jamie Madill57a89722013-07-02 11:57:03 -04002820 // [OpenGL ES 3.0.2] section 2.10 page 43:
2821 // If a vertex array object that is currently bound is deleted, the binding
2822 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002823 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002824 {
2825 bindVertexArray(0);
2826 }
2827}
2828
Geoff Langc8058452014-02-03 12:04:11 -05002829void Context::detachTransformFeedback(GLuint transformFeedback)
2830{
Corentin Walleza2257da2016-04-19 16:43:12 -04002831 // Transform feedback detachment is handled by Context, because 0 is a valid
2832 // transform feedback, and a pointer to it must be passed from Context to State at
2833 // binding time.
2834
2835 // The OpenGL specification doesn't mention what should happen when the currently bound
2836 // transform feedback object is deleted. Since it is a container object, we treat it like
2837 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002838 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002839 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002840 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002841 }
Geoff Langc8058452014-02-03 12:04:11 -05002842}
2843
Jamie Madilldc356042013-07-19 16:36:57 -04002844void Context::detachSampler(GLuint sampler)
2845{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002846 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002847}
2848
Yunchao Hea336b902017-08-02 16:05:21 +08002849void Context::detachProgramPipeline(GLuint pipeline)
2850{
2851 mGLState.detachProgramPipeline(this, pipeline);
2852}
2853
Jamie Madill3ef140a2017-08-26 23:11:21 -04002854void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002855{
Shaodde78e82017-05-22 14:13:27 +08002856 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002857 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002858}
2859
Jamie Madille29d1672013-07-19 16:36:57 -04002860void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2861{
Geoff Langc1984ed2016-10-07 12:41:00 -04002862 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002863 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002864 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002865}
Jamie Madille29d1672013-07-19 16:36:57 -04002866
Geoff Langc1984ed2016-10-07 12:41:00 -04002867void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2868{
2869 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002870 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002871 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002872}
2873
Brandon Jones59770802018-04-02 13:18:42 -07002874void Context::samplerParameterivRobust(GLuint sampler,
2875 GLenum pname,
2876 GLsizei bufSize,
2877 const GLint *param)
2878{
2879 samplerParameteriv(sampler, pname, param);
2880}
2881
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002882void Context::samplerParameterIivRobust(GLuint sampler,
2883 GLenum pname,
2884 GLsizei bufSize,
2885 const GLint *param)
2886{
2887 UNIMPLEMENTED();
2888}
2889
2890void Context::samplerParameterIuivRobust(GLuint sampler,
2891 GLenum pname,
2892 GLsizei bufSize,
2893 const GLuint *param)
2894{
2895 UNIMPLEMENTED();
2896}
2897
Jamie Madille29d1672013-07-19 16:36:57 -04002898void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2899{
Geoff Langc1984ed2016-10-07 12:41:00 -04002900 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002901 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002902 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002903}
2904
Geoff Langc1984ed2016-10-07 12:41:00 -04002905void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002906{
Geoff Langc1984ed2016-10-07 12:41:00 -04002907 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002908 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002909 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002910}
2911
Brandon Jones59770802018-04-02 13:18:42 -07002912void Context::samplerParameterfvRobust(GLuint sampler,
2913 GLenum pname,
2914 GLsizei bufSize,
2915 const GLfloat *param)
2916{
2917 samplerParameterfv(sampler, pname, param);
2918}
2919
Geoff Langc1984ed2016-10-07 12:41:00 -04002920void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002921{
Geoff Langc1984ed2016-10-07 12:41:00 -04002922 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002923 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002924 QuerySamplerParameteriv(samplerObject, pname, params);
2925}
Jamie Madill9675b802013-07-19 16:36:59 -04002926
Brandon Jones59770802018-04-02 13:18:42 -07002927void Context::getSamplerParameterivRobust(GLuint sampler,
2928 GLenum pname,
2929 GLsizei bufSize,
2930 GLsizei *length,
2931 GLint *params)
2932{
2933 getSamplerParameteriv(sampler, pname, params);
2934}
2935
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002936void Context::getSamplerParameterIivRobust(GLuint sampler,
2937 GLenum pname,
2938 GLsizei bufSize,
2939 GLsizei *length,
2940 GLint *params)
2941{
2942 UNIMPLEMENTED();
2943}
2944
2945void Context::getSamplerParameterIuivRobust(GLuint sampler,
2946 GLenum pname,
2947 GLsizei bufSize,
2948 GLsizei *length,
2949 GLuint *params)
2950{
2951 UNIMPLEMENTED();
2952}
2953
Geoff Langc1984ed2016-10-07 12:41:00 -04002954void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2955{
2956 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002957 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002958 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002959}
2960
Brandon Jones59770802018-04-02 13:18:42 -07002961void Context::getSamplerParameterfvRobust(GLuint sampler,
2962 GLenum pname,
2963 GLsizei bufSize,
2964 GLsizei *length,
2965 GLfloat *params)
2966{
2967 getSamplerParameterfv(sampler, pname, params);
2968}
2969
Olli Etuahof0fee072016-03-30 15:11:58 +03002970void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2971{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002972 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002973 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002974}
2975
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002976void Context::initRendererString()
2977{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002978 std::ostringstream rendererString;
2979 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002980 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002981 rendererString << ")";
2982
Geoff Langcec35902014-04-16 10:52:36 -04002983 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002984}
2985
Geoff Langc339c4e2016-11-29 10:37:36 -05002986void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002987{
Geoff Langc339c4e2016-11-29 10:37:36 -05002988 const Version &clientVersion = getClientVersion();
2989
2990 std::ostringstream versionString;
2991 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2992 << ANGLE_VERSION_STRING << ")";
2993 mVersionString = MakeStaticString(versionString.str());
2994
2995 std::ostringstream shadingLanguageVersionString;
2996 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2997 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2998 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2999 << ")";
3000 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003001}
3002
Geoff Langcec35902014-04-16 10:52:36 -04003003void Context::initExtensionStrings()
3004{
Geoff Langc339c4e2016-11-29 10:37:36 -05003005 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3006 std::ostringstream combinedStringStream;
3007 std::copy(strings.begin(), strings.end(),
3008 std::ostream_iterator<const char *>(combinedStringStream, " "));
3009 return MakeStaticString(combinedStringStream.str());
3010 };
3011
3012 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003013 for (const auto &extensionString : mExtensions.getStrings())
3014 {
3015 mExtensionStrings.push_back(MakeStaticString(extensionString));
3016 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003017 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003018
Geoff Langc339c4e2016-11-29 10:37:36 -05003019 mRequestableExtensionStrings.clear();
3020 for (const auto &extensionInfo : GetExtensionInfoMap())
3021 {
3022 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003023 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003024 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003025 {
3026 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3027 }
3028 }
3029 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003030}
3031
Geoff Langc339c4e2016-11-29 10:37:36 -05003032const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003033{
Geoff Langc339c4e2016-11-29 10:37:36 -05003034 switch (name)
3035 {
3036 case GL_VENDOR:
3037 return reinterpret_cast<const GLubyte *>("Google Inc.");
3038
3039 case GL_RENDERER:
3040 return reinterpret_cast<const GLubyte *>(mRendererString);
3041
3042 case GL_VERSION:
3043 return reinterpret_cast<const GLubyte *>(mVersionString);
3044
3045 case GL_SHADING_LANGUAGE_VERSION:
3046 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3047
3048 case GL_EXTENSIONS:
3049 return reinterpret_cast<const GLubyte *>(mExtensionString);
3050
3051 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3052 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3053
3054 default:
3055 UNREACHABLE();
3056 return nullptr;
3057 }
Geoff Langcec35902014-04-16 10:52:36 -04003058}
3059
Geoff Langc339c4e2016-11-29 10:37:36 -05003060const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003061{
Geoff Langc339c4e2016-11-29 10:37:36 -05003062 switch (name)
3063 {
3064 case GL_EXTENSIONS:
3065 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3066
3067 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3068 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3069
3070 default:
3071 UNREACHABLE();
3072 return nullptr;
3073 }
Geoff Langcec35902014-04-16 10:52:36 -04003074}
3075
3076size_t Context::getExtensionStringCount() const
3077{
3078 return mExtensionStrings.size();
3079}
3080
Geoff Lang111a99e2017-10-17 10:58:41 -04003081bool Context::isExtensionRequestable(const char *name)
3082{
3083 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3084 auto extension = extensionInfos.find(name);
3085
Geoff Lang111a99e2017-10-17 10:58:41 -04003086 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003087 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003088}
3089
Geoff Langc339c4e2016-11-29 10:37:36 -05003090void Context::requestExtension(const char *name)
3091{
3092 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3093 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3094 const auto &extension = extensionInfos.at(name);
3095 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003096 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003097
3098 if (mExtensions.*(extension.ExtensionsMember))
3099 {
3100 // Extension already enabled
3101 return;
3102 }
3103
3104 mExtensions.*(extension.ExtensionsMember) = true;
3105 updateCaps();
3106 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003107
Jamie Madill2f348d22017-06-05 10:50:59 -04003108 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3109 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003110
Jamie Madill81c2e252017-09-09 23:32:46 -04003111 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3112 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003113 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003114 for (auto &zeroTexture : mZeroTextures)
3115 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003116 if (zeroTexture.get() != nullptr)
3117 {
3118 zeroTexture->signalDirty(this, InitState::Initialized);
3119 }
Geoff Lang9aded172017-04-05 11:07:56 -04003120 }
3121
Jamie Madillb983a4b2018-08-01 11:34:51 -04003122 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003123}
3124
3125size_t Context::getRequestableExtensionStringCount() const
3126{
3127 return mRequestableExtensionStrings.size();
3128}
3129
Jamie Madill493f9572018-05-24 19:52:15 -04003130void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003131{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003132 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003133 ASSERT(transformFeedback != nullptr);
3134 ASSERT(!transformFeedback->isPaused());
3135
Jamie Madill6c1f6712017-02-14 19:08:04 -05003136 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003137 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003138}
3139
3140bool Context::hasActiveTransformFeedback(GLuint program) const
3141{
3142 for (auto pair : mTransformFeedbackMap)
3143 {
3144 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3145 {
3146 return true;
3147 }
3148 }
3149 return false;
3150}
3151
Geoff Lang33f11fb2018-05-07 13:42:47 -04003152Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003153{
3154 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3155
jchen1082af6202018-06-22 10:59:52 +08003156 // Explicitly enable GL_KHR_parallel_shader_compile
3157 supportedExtensions.parallelShaderCompile = true;
3158
Geoff Langb0f917f2017-12-05 13:41:54 -05003159 if (getClientVersion() < ES_2_0)
3160 {
3161 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003162 supportedExtensions.pointSizeArray = true;
3163 supportedExtensions.textureCubeMap = true;
3164 supportedExtensions.pointSprite = true;
3165 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003166 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003167 }
3168
3169 if (getClientVersion() < ES_3_0)
3170 {
3171 // Disable ES3+ extensions
3172 supportedExtensions.colorBufferFloat = false;
3173 supportedExtensions.eglImageExternalEssl3 = false;
3174 supportedExtensions.textureNorm16 = false;
3175 supportedExtensions.multiview = false;
3176 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003177 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003178 }
3179
3180 if (getClientVersion() < ES_3_1)
3181 {
3182 // Disable ES3.1+ extensions
3183 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003184
3185 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3186 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003187 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003188 }
3189
3190 if (getClientVersion() > ES_2_0)
3191 {
3192 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3193 // supportedExtensions.sRGB = false;
3194 }
3195
3196 // Some extensions are always available because they are implemented in the GL layer.
3197 supportedExtensions.bindUniformLocation = true;
3198 supportedExtensions.vertexArrayObject = true;
3199 supportedExtensions.bindGeneratesResource = true;
3200 supportedExtensions.clientArrays = true;
3201 supportedExtensions.requestExtension = true;
3202
3203 // Enable the no error extension if the context was created with the flag.
3204 supportedExtensions.noError = mSkipValidation;
3205
3206 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003207 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003208
3209 // Explicitly enable GL_KHR_debug
3210 supportedExtensions.debug = true;
3211 supportedExtensions.maxDebugMessageLength = 1024;
3212 supportedExtensions.maxDebugLoggedMessages = 1024;
3213 supportedExtensions.maxDebugGroupStackDepth = 1024;
3214 supportedExtensions.maxLabelLength = 1024;
3215
3216 // Explicitly enable GL_ANGLE_robust_client_memory
3217 supportedExtensions.robustClientMemory = true;
3218
3219 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003220 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003221
3222 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3223 // supports it.
3224 supportedExtensions.robustBufferAccessBehavior =
3225 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3226
3227 // Enable the cache control query unconditionally.
3228 supportedExtensions.programCacheControl = true;
3229
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003230 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003231 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003232 {
3233 // GL_ANGLE_explicit_context_gles1
3234 supportedExtensions.explicitContextGles1 = true;
3235 // GL_ANGLE_explicit_context
3236 supportedExtensions.explicitContext = true;
3237 }
3238
Geoff Langb0f917f2017-12-05 13:41:54 -05003239 return supportedExtensions;
3240}
3241
Geoff Lang33f11fb2018-05-07 13:42:47 -04003242void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003243{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003244 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003245
Geoff Lang33f11fb2018-05-07 13:42:47 -04003246 mSupportedExtensions = generateSupportedExtensions();
3247 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003248
3249 mLimitations = mImplementation->getNativeLimitations();
3250
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003251 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3252 if (getClientVersion() < Version(2, 0))
3253 {
3254 mCaps.maxMultitextureUnits = 4;
3255 mCaps.maxClipPlanes = 6;
3256 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003257 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3258 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3259 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003260 mCaps.minSmoothPointSize = 1.0f;
3261 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003262 mCaps.minSmoothLineWidth = 1.0f;
3263 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003264 }
3265
Luc Ferronad2ae932018-06-11 15:31:17 -04003266 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003267 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003268
Luc Ferronad2ae932018-06-11 15:31:17 -04003269 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3270
Jamie Madill0f80ed82017-09-19 00:24:56 -04003271 if (getClientVersion() < ES_3_1)
3272 {
3273 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3274 }
3275 else
3276 {
3277 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3278 }
Geoff Lang301d1612014-07-09 10:34:37 -04003279
Jiawei Shao54aafe52018-04-27 14:54:57 +08003280 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3281 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003282 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3283
Jamie Madill0f80ed82017-09-19 00:24:56 -04003284 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3285 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3286
3287 // Limit textures as well, so we can use fast bitsets with texture bindings.
3288 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003289 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3290 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3291 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3292 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003293
Jiawei Shaodb342272017-09-27 10:21:45 +08003294 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3295
Geoff Langc287ea62016-09-16 14:46:51 -04003296 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003297 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003298 for (const auto &extensionInfo : GetExtensionInfoMap())
3299 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003300 // If the user has requested that extensions start disabled and they are requestable,
3301 // disable them.
3302 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003303 {
3304 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3305 }
3306 }
3307
3308 // Generate texture caps
3309 updateCaps();
3310}
3311
3312void Context::updateCaps()
3313{
Geoff Lang900013c2014-07-07 11:32:19 -04003314 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003315 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003316
Jamie Madill7b62cf92017-11-02 15:20:49 -04003317 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003318 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003319 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003320 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003321
Geoff Lang0d8b7242015-09-09 14:56:53 -04003322 // Update the format caps based on the client version and extensions.
3323 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3324 // ES3.
3325 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003326 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003327 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003328 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003329 formatCaps.textureAttachment =
3330 formatCaps.textureAttachment &&
3331 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3332 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3333 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003334
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003335 // OpenGL ES does not support multisampling with non-rendererable formats
3336 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003337 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003338 (getClientVersion() < ES_3_1 &&
3339 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003340 {
Geoff Langd87878e2014-09-19 15:42:59 -04003341 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003342 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003343 else
3344 {
3345 // We may have limited the max samples for some required renderbuffer formats due to
3346 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3347 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3348
3349 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3350 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3351 // exception of signed and unsigned integer formats."
3352 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3353 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3354 {
3355 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3356 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3357 }
3358
3359 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3360 if (getClientVersion() >= ES_3_1)
3361 {
3362 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3363 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3364 // the exception that the signed and unsigned integer formats are required only to
3365 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3366 // multisamples, which must be at least one."
3367 if (formatInfo.componentType == GL_INT ||
3368 formatInfo.componentType == GL_UNSIGNED_INT)
3369 {
3370 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3371 }
3372
3373 // GLES 3.1 section 19.3.1.
3374 if (formatCaps.texturable)
3375 {
3376 if (formatInfo.depthBits > 0)
3377 {
3378 mCaps.maxDepthTextureSamples =
3379 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3380 }
3381 else if (formatInfo.redBits > 0)
3382 {
3383 mCaps.maxColorTextureSamples =
3384 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3385 }
3386 }
3387 }
3388 }
Geoff Langd87878e2014-09-19 15:42:59 -04003389
3390 if (formatCaps.texturable && formatInfo.compressed)
3391 {
Geoff Langca271392017-04-05 12:30:00 -04003392 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003393 }
3394
Geoff Langca271392017-04-05 12:30:00 -04003395 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003396 }
Jamie Madill32447362017-06-28 14:53:52 -04003397
3398 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003399 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003400 {
3401 mMemoryProgramCache = nullptr;
3402 }
Corentin Walleze4477002017-12-01 14:39:58 -05003403
3404 // Compute which buffer types are allowed
3405 mValidBufferBindings.reset();
3406 mValidBufferBindings.set(BufferBinding::ElementArray);
3407 mValidBufferBindings.set(BufferBinding::Array);
3408
3409 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3410 {
3411 mValidBufferBindings.set(BufferBinding::PixelPack);
3412 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3413 }
3414
3415 if (getClientVersion() >= ES_3_0)
3416 {
3417 mValidBufferBindings.set(BufferBinding::CopyRead);
3418 mValidBufferBindings.set(BufferBinding::CopyWrite);
3419 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3420 mValidBufferBindings.set(BufferBinding::Uniform);
3421 }
3422
3423 if (getClientVersion() >= ES_3_1)
3424 {
3425 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3426 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3427 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3428 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3429 }
jchen107ae70d82018-07-06 13:47:01 +08003430
3431 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003432
3433 // Reinitialize state cache after extension changes.
3434 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003435}
3436
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003437void Context::initWorkarounds()
3438{
Jamie Madill761b02c2017-06-23 16:27:06 -04003439 // Apply back-end workarounds.
3440 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3441
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003442 // Lose the context upon out of memory error if the application is
3443 // expecting to watch for those events.
3444 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
3445}
3446
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003447// Return true if the draw is a no-op, else return false.
3448// A no-op draw occurs if the count of vertices is less than the minimum required to
3449// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3450bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3451{
3452 return count < kMinimumPrimitiveCounts[mode];
3453}
3454
3455bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3456{
3457 return (instanceCount == 0) || noopDraw(mode, count);
3458}
3459
Jamie Madill6f755b22018-10-09 12:48:54 -04003460angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003461{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003462 if (mGLES1Renderer)
3463 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003464 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003465 }
3466
Geoff Lang9bf86f02018-07-26 11:46:34 -04003467 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003468
3469 if (isRobustResourceInitEnabled())
3470 {
3471 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3472 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3473 }
3474
Geoff Langa8cb2872018-03-09 16:09:40 -05003475 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003476 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003477}
3478
3479Error Context::prepareForClear(GLbitfield mask)
3480{
Geoff Langa8cb2872018-03-09 16:09:40 -05003481 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003482 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003483 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003484 return NoError();
3485}
3486
3487Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3488{
Geoff Langa8cb2872018-03-09 16:09:40 -05003489 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003490 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3491 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003492 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003493 return NoError();
3494}
3495
Geoff Langa8cb2872018-03-09 16:09:40 -05003496Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003497{
Geoff Langa8cb2872018-03-09 16:09:40 -05003498 ANGLE_TRY(syncDirtyObjects(objectMask));
3499 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003500 return NoError();
3501}
3502
Jamie Madill6f755b22018-10-09 12:48:54 -04003503angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003504{
3505 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill189ad872018-07-09 13:32:37 -04003506 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003507 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003508 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003509}
3510
Jamie Madill6f755b22018-10-09 12:48:54 -04003511angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003512{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003513 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill189ad872018-07-09 13:32:37 -04003514 ANGLE_TRY(mImplementation->syncState(this, dirtyBits));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003515 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003516 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003517}
Jamie Madillc29968b2016-01-20 11:17:23 -05003518
Jamie Madill6f755b22018-10-09 12:48:54 -04003519angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003520{
3521 return mGLState.syncDirtyObjects(this, objectMask);
3522}
3523
Jamie Madillc29968b2016-01-20 11:17:23 -05003524void Context::blitFramebuffer(GLint srcX0,
3525 GLint srcY0,
3526 GLint srcX1,
3527 GLint srcY1,
3528 GLint dstX0,
3529 GLint dstY0,
3530 GLint dstX1,
3531 GLint dstY1,
3532 GLbitfield mask,
3533 GLenum filter)
3534{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003535 if (mask == 0)
3536 {
3537 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3538 // buffers are copied.
3539 return;
3540 }
3541
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003542 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003543 ASSERT(drawFramebuffer);
3544
3545 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3546 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3547
Jamie Madillbc918e72018-03-08 09:47:21 -05003548 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003549
Jamie Madillc564c072017-06-01 12:45:42 -04003550 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003551}
Jamie Madillc29968b2016-01-20 11:17:23 -05003552
3553void Context::clear(GLbitfield mask)
3554{
Geoff Langd4fff502017-09-22 11:28:28 -04003555 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3556 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003557}
3558
3559void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3560{
Olli Etuaho78df3362018-10-05 16:43:27 +03003561 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3562 const FramebufferAttachment *attachment = nullptr;
3563 if (buffer == GL_DEPTH)
3564 {
3565 attachment = framebufferObject->getDepthbuffer();
3566 }
3567 if (buffer == GL_COLOR &&
3568 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3569 {
3570 attachment = framebufferObject->getColorbuffer(drawbuffer);
3571 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003572 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3573 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003574 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003575 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003576 return;
3577 }
Geoff Langd4fff502017-09-22 11:28:28 -04003578 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003579 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003580}
3581
3582void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3583{
Olli Etuaho78df3362018-10-05 16:43:27 +03003584 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3585 const FramebufferAttachment *attachment = nullptr;
3586 if (buffer == GL_COLOR &&
3587 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3588 {
3589 attachment = framebufferObject->getColorbuffer(drawbuffer);
3590 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003591 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3592 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003593 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003594 {
3595 return;
3596 }
Geoff Langd4fff502017-09-22 11:28:28 -04003597 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003598 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003599}
3600
3601void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3602{
Olli Etuaho78df3362018-10-05 16:43:27 +03003603 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3604 const FramebufferAttachment *attachment = nullptr;
3605 if (buffer == GL_STENCIL)
3606 {
3607 attachment = framebufferObject->getStencilbuffer();
3608 }
3609 if (buffer == GL_COLOR &&
3610 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3611 {
3612 attachment = framebufferObject->getColorbuffer(drawbuffer);
3613 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003614 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3615 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003616 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003617 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003618 return;
3619 }
Geoff Langd4fff502017-09-22 11:28:28 -04003620 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003621 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003622}
3623
3624void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3625{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003626 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003627 ASSERT(framebufferObject);
3628
3629 // If a buffer is not present, the clear has no effect
3630 if (framebufferObject->getDepthbuffer() == nullptr &&
3631 framebufferObject->getStencilbuffer() == nullptr)
3632 {
3633 return;
3634 }
3635
Geoff Langd4fff502017-09-22 11:28:28 -04003636 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3637 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003638}
3639
3640void Context::readPixels(GLint x,
3641 GLint y,
3642 GLsizei width,
3643 GLsizei height,
3644 GLenum format,
3645 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003646 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003647{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003648 if (width == 0 || height == 0)
3649 {
3650 return;
3651 }
3652
Jamie Madillbc918e72018-03-08 09:47:21 -05003653 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003654
Jamie Madillb6664922017-07-25 12:55:04 -04003655 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3656 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003657
3658 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003659 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003660}
3661
Brandon Jones59770802018-04-02 13:18:42 -07003662void Context::readPixelsRobust(GLint x,
3663 GLint y,
3664 GLsizei width,
3665 GLsizei height,
3666 GLenum format,
3667 GLenum type,
3668 GLsizei bufSize,
3669 GLsizei *length,
3670 GLsizei *columns,
3671 GLsizei *rows,
3672 void *pixels)
3673{
3674 readPixels(x, y, width, height, format, type, pixels);
3675}
3676
3677void Context::readnPixelsRobust(GLint x,
3678 GLint y,
3679 GLsizei width,
3680 GLsizei height,
3681 GLenum format,
3682 GLenum type,
3683 GLsizei bufSize,
3684 GLsizei *length,
3685 GLsizei *columns,
3686 GLsizei *rows,
3687 void *data)
3688{
3689 readPixels(x, y, width, height, format, type, data);
3690}
3691
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003692void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003693 GLint level,
3694 GLenum internalformat,
3695 GLint x,
3696 GLint y,
3697 GLsizei width,
3698 GLsizei height,
3699 GLint border)
3700{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003701 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003702 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003703
Jamie Madillc29968b2016-01-20 11:17:23 -05003704 Rectangle sourceArea(x, y, width, height);
3705
Jamie Madill05b35b22017-10-03 09:01:44 -04003706 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003707 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003708 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003709}
3710
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003711void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003712 GLint level,
3713 GLint xoffset,
3714 GLint yoffset,
3715 GLint x,
3716 GLint y,
3717 GLsizei width,
3718 GLsizei height)
3719{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003720 if (width == 0 || height == 0)
3721 {
3722 return;
3723 }
3724
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003725 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003726 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003727
Jamie Madillc29968b2016-01-20 11:17:23 -05003728 Offset destOffset(xoffset, yoffset, 0);
3729 Rectangle sourceArea(x, y, width, height);
3730
Jamie Madill05b35b22017-10-03 09:01:44 -04003731 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003732 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003733 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003734}
3735
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003736void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003737 GLint level,
3738 GLint xoffset,
3739 GLint yoffset,
3740 GLint zoffset,
3741 GLint x,
3742 GLint y,
3743 GLsizei width,
3744 GLsizei height)
3745{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003746 if (width == 0 || height == 0)
3747 {
3748 return;
3749 }
3750
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003751 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003752 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003753
Jamie Madillc29968b2016-01-20 11:17:23 -05003754 Offset destOffset(xoffset, yoffset, zoffset);
3755 Rectangle sourceArea(x, y, width, height);
3756
Jamie Madill05b35b22017-10-03 09:01:44 -04003757 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3758 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003759 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3760 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003761}
3762
3763void Context::framebufferTexture2D(GLenum target,
3764 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003765 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003766 GLuint texture,
3767 GLint level)
3768{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003769 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003770 ASSERT(framebuffer);
3771
3772 if (texture != 0)
3773 {
3774 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003775 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003776 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003777 }
3778 else
3779 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003780 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003781 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003782
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003783 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003784}
3785
3786void Context::framebufferRenderbuffer(GLenum target,
3787 GLenum attachment,
3788 GLenum renderbuffertarget,
3789 GLuint renderbuffer)
3790{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003791 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003792 ASSERT(framebuffer);
3793
3794 if (renderbuffer != 0)
3795 {
3796 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003797
Jamie Madillcc129372018-04-12 09:13:18 -04003798 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003799 renderbufferObject);
3800 }
3801 else
3802 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003803 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003804 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003805
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003806 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003807}
3808
3809void Context::framebufferTextureLayer(GLenum target,
3810 GLenum attachment,
3811 GLuint texture,
3812 GLint level,
3813 GLint layer)
3814{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003815 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003816 ASSERT(framebuffer);
3817
3818 if (texture != 0)
3819 {
3820 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003821 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003822 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003823 }
3824 else
3825 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003826 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003827 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003828
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003829 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003830}
3831
Brandon Jones59770802018-04-02 13:18:42 -07003832void Context::framebufferTextureMultiviewLayered(GLenum target,
3833 GLenum attachment,
3834 GLuint texture,
3835 GLint level,
3836 GLint baseViewIndex,
3837 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003838{
Martin Radev82ef7742017-08-08 17:44:58 +03003839 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3840 ASSERT(framebuffer);
3841
3842 if (texture != 0)
3843 {
3844 Texture *textureObj = getTexture(texture);
3845
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003846 ImageIndex index;
3847 if (textureObj->getType() == TextureType::_2DArray)
3848 {
3849 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3850 }
3851 else
3852 {
3853 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3854 ASSERT(level == 0);
3855 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3856 }
Martin Radev82ef7742017-08-08 17:44:58 +03003857 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3858 numViews, baseViewIndex);
3859 }
3860 else
3861 {
3862 framebuffer->resetAttachment(this, attachment);
3863 }
3864
3865 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003866}
3867
Brandon Jones59770802018-04-02 13:18:42 -07003868void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3869 GLenum attachment,
3870 GLuint texture,
3871 GLint level,
3872 GLsizei numViews,
3873 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003874{
Martin Radev5dae57b2017-07-14 16:15:55 +03003875 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3876 ASSERT(framebuffer);
3877
3878 if (texture != 0)
3879 {
3880 Texture *textureObj = getTexture(texture);
3881
3882 ImageIndex index = ImageIndex::Make2D(level);
3883 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3884 textureObj, numViews, viewportOffsets);
3885 }
3886 else
3887 {
3888 framebuffer->resetAttachment(this, attachment);
3889 }
3890
3891 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003892}
3893
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003894void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3895{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003896 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3897 ASSERT(framebuffer);
3898
3899 if (texture != 0)
3900 {
3901 Texture *textureObj = getTexture(texture);
3902
3903 ImageIndex index = ImageIndex::MakeFromType(
3904 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3905 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3906 }
3907 else
3908 {
3909 framebuffer->resetAttachment(this, attachment);
3910 }
3911
3912 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003913}
3914
Jamie Madillc29968b2016-01-20 11:17:23 -05003915void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3916{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003917 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003918 ASSERT(framebuffer);
3919 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003920 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003921 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003922}
3923
3924void Context::readBuffer(GLenum mode)
3925{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003926 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003927 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003928 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003929}
3930
3931void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3932{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003933 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003934 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003935
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003936 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003937 ASSERT(framebuffer);
3938
3939 // The specification isn't clear what should be done when the framebuffer isn't complete.
3940 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003941 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003942}
3943
3944void Context::invalidateFramebuffer(GLenum target,
3945 GLsizei numAttachments,
3946 const GLenum *attachments)
3947{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003948 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003949 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003950
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003951 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003952 ASSERT(framebuffer);
3953
Jamie Madill427064d2018-04-13 16:20:34 -04003954 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003955 {
Jamie Madill437fa652016-05-03 15:13:24 -04003956 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003957 }
Jamie Madill437fa652016-05-03 15:13:24 -04003958
Jamie Madill4928b7c2017-06-20 12:57:39 -04003959 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003960}
3961
3962void Context::invalidateSubFramebuffer(GLenum target,
3963 GLsizei numAttachments,
3964 const GLenum *attachments,
3965 GLint x,
3966 GLint y,
3967 GLsizei width,
3968 GLsizei height)
3969{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003970 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003971 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003972
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003973 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003974 ASSERT(framebuffer);
3975
Jamie Madill427064d2018-04-13 16:20:34 -04003976 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003977 {
Jamie Madill437fa652016-05-03 15:13:24 -04003978 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003979 }
Jamie Madill437fa652016-05-03 15:13:24 -04003980
3981 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003982 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003983}
3984
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003985void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003986 GLint level,
3987 GLint internalformat,
3988 GLsizei width,
3989 GLsizei height,
3990 GLint border,
3991 GLenum format,
3992 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003993 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003994{
Jamie Madillbc918e72018-03-08 09:47:21 -05003995 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003996
3997 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003998 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003999 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004000 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004001}
4002
Brandon Jones59770802018-04-02 13:18:42 -07004003void Context::texImage2DRobust(TextureTarget target,
4004 GLint level,
4005 GLint internalformat,
4006 GLsizei width,
4007 GLsizei height,
4008 GLint border,
4009 GLenum format,
4010 GLenum type,
4011 GLsizei bufSize,
4012 const void *pixels)
4013{
4014 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4015}
4016
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004017void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004018 GLint level,
4019 GLint internalformat,
4020 GLsizei width,
4021 GLsizei height,
4022 GLsizei depth,
4023 GLint border,
4024 GLenum format,
4025 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004026 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004027{
Jamie Madillbc918e72018-03-08 09:47:21 -05004028 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004029
4030 Extents size(width, height, depth);
4031 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004032 handleError(texture->setImage(this, mGLState.getUnpackState(),
4033 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004034 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004035}
4036
Brandon Jones59770802018-04-02 13:18:42 -07004037void Context::texImage3DRobust(TextureType target,
4038 GLint level,
4039 GLint internalformat,
4040 GLsizei width,
4041 GLsizei height,
4042 GLsizei depth,
4043 GLint border,
4044 GLenum format,
4045 GLenum type,
4046 GLsizei bufSize,
4047 const void *pixels)
4048{
4049 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4050}
4051
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004052void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004053 GLint level,
4054 GLint xoffset,
4055 GLint yoffset,
4056 GLsizei width,
4057 GLsizei height,
4058 GLenum format,
4059 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004060 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004061{
4062 // Zero sized uploads are valid but no-ops
4063 if (width == 0 || height == 0)
4064 {
4065 return;
4066 }
4067
Jamie Madillbc918e72018-03-08 09:47:21 -05004068 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004069
4070 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004071 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004072
4073 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4074
4075 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4076 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004077}
4078
Brandon Jones59770802018-04-02 13:18:42 -07004079void Context::texSubImage2DRobust(TextureTarget target,
4080 GLint level,
4081 GLint xoffset,
4082 GLint yoffset,
4083 GLsizei width,
4084 GLsizei height,
4085 GLenum format,
4086 GLenum type,
4087 GLsizei bufSize,
4088 const void *pixels)
4089{
4090 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4091}
4092
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004093void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004094 GLint level,
4095 GLint xoffset,
4096 GLint yoffset,
4097 GLint zoffset,
4098 GLsizei width,
4099 GLsizei height,
4100 GLsizei depth,
4101 GLenum format,
4102 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004103 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004104{
4105 // Zero sized uploads are valid but no-ops
4106 if (width == 0 || height == 0 || depth == 0)
4107 {
4108 return;
4109 }
4110
Jamie Madillbc918e72018-03-08 09:47:21 -05004111 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004112
4113 Box area(xoffset, yoffset, zoffset, width, height, depth);
4114 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004115
4116 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4117
4118 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004119 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004120 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004121}
4122
Brandon Jones59770802018-04-02 13:18:42 -07004123void Context::texSubImage3DRobust(TextureType target,
4124 GLint level,
4125 GLint xoffset,
4126 GLint yoffset,
4127 GLint zoffset,
4128 GLsizei width,
4129 GLsizei height,
4130 GLsizei depth,
4131 GLenum format,
4132 GLenum type,
4133 GLsizei bufSize,
4134 const void *pixels)
4135{
4136 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4137 pixels);
4138}
4139
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004140void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004141 GLint level,
4142 GLenum internalformat,
4143 GLsizei width,
4144 GLsizei height,
4145 GLint border,
4146 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004147 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004148{
Jamie Madillbc918e72018-03-08 09:47:21 -05004149 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004150
4151 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004152 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004153 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4154 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004155 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004156}
4157
Brandon Jones59770802018-04-02 13:18:42 -07004158void Context::compressedTexImage2DRobust(TextureTarget target,
4159 GLint level,
4160 GLenum internalformat,
4161 GLsizei width,
4162 GLsizei height,
4163 GLint border,
4164 GLsizei imageSize,
4165 GLsizei dataSize,
4166 const GLvoid *data)
4167{
4168 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4169}
4170
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004171void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004172 GLint level,
4173 GLenum internalformat,
4174 GLsizei width,
4175 GLsizei height,
4176 GLsizei depth,
4177 GLint border,
4178 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004179 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004180{
Jamie Madillbc918e72018-03-08 09:47:21 -05004181 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004182
4183 Extents size(width, height, depth);
4184 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004185 handleError(texture->setCompressedImage(
4186 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004187 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004188}
4189
Brandon Jones59770802018-04-02 13:18:42 -07004190void Context::compressedTexImage3DRobust(TextureType target,
4191 GLint level,
4192 GLenum internalformat,
4193 GLsizei width,
4194 GLsizei height,
4195 GLsizei depth,
4196 GLint border,
4197 GLsizei imageSize,
4198 GLsizei dataSize,
4199 const GLvoid *data)
4200{
4201 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4202 data);
4203}
4204
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004205void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004206 GLint level,
4207 GLint xoffset,
4208 GLint yoffset,
4209 GLsizei width,
4210 GLsizei height,
4211 GLenum format,
4212 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004213 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004214{
Jamie Madillbc918e72018-03-08 09:47:21 -05004215 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004216
4217 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004218 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004219 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4220 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004221 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004222}
4223
Brandon Jones59770802018-04-02 13:18:42 -07004224void Context::compressedTexSubImage2DRobust(TextureTarget target,
4225 GLint level,
4226 GLint xoffset,
4227 GLint yoffset,
4228 GLsizei width,
4229 GLsizei height,
4230 GLenum format,
4231 GLsizei imageSize,
4232 GLsizei dataSize,
4233 const GLvoid *data)
4234{
4235 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4236 data);
4237}
4238
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004239void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004240 GLint level,
4241 GLint xoffset,
4242 GLint yoffset,
4243 GLint zoffset,
4244 GLsizei width,
4245 GLsizei height,
4246 GLsizei depth,
4247 GLenum format,
4248 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004249 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004250{
4251 // Zero sized uploads are valid but no-ops
4252 if (width == 0 || height == 0)
4253 {
4254 return;
4255 }
4256
Jamie Madillbc918e72018-03-08 09:47:21 -05004257 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004258
4259 Box area(xoffset, yoffset, zoffset, width, height, depth);
4260 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004261 handleError(texture->setCompressedSubImage(
4262 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004263 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004264}
4265
Brandon Jones59770802018-04-02 13:18:42 -07004266void Context::compressedTexSubImage3DRobust(TextureType target,
4267 GLint level,
4268 GLint xoffset,
4269 GLint yoffset,
4270 GLint zoffset,
4271 GLsizei width,
4272 GLsizei height,
4273 GLsizei depth,
4274 GLenum format,
4275 GLsizei imageSize,
4276 GLsizei dataSize,
4277 const GLvoid *data)
4278{
4279 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4280 imageSize, data);
4281}
4282
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004283void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004284{
4285 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004286 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004287}
4288
Jamie Madill007530e2017-12-28 14:27:04 -05004289void Context::copyTexture(GLuint sourceId,
4290 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004291 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004292 GLuint destId,
4293 GLint destLevel,
4294 GLint internalFormat,
4295 GLenum destType,
4296 GLboolean unpackFlipY,
4297 GLboolean unpackPremultiplyAlpha,
4298 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004299{
Jamie Madillbc918e72018-03-08 09:47:21 -05004300 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004301
4302 gl::Texture *sourceTexture = getTexture(sourceId);
4303 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004304 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4305 sourceLevel, ConvertToBool(unpackFlipY),
4306 ConvertToBool(unpackPremultiplyAlpha),
4307 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004308}
4309
Jamie Madill007530e2017-12-28 14:27:04 -05004310void Context::copySubTexture(GLuint sourceId,
4311 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004312 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004313 GLuint destId,
4314 GLint destLevel,
4315 GLint xoffset,
4316 GLint yoffset,
4317 GLint x,
4318 GLint y,
4319 GLsizei width,
4320 GLsizei height,
4321 GLboolean unpackFlipY,
4322 GLboolean unpackPremultiplyAlpha,
4323 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004324{
4325 // Zero sized copies are valid but no-ops
4326 if (width == 0 || height == 0)
4327 {
4328 return;
4329 }
4330
Jamie Madillbc918e72018-03-08 09:47:21 -05004331 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004332
4333 gl::Texture *sourceTexture = getTexture(sourceId);
4334 gl::Texture *destTexture = getTexture(destId);
4335 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004336 Box box(x, y, 0, width, height, 1);
4337 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4338 ConvertToBool(unpackFlipY),
4339 ConvertToBool(unpackPremultiplyAlpha),
4340 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4341}
4342
4343void Context::copyTexture3D(GLuint sourceId,
4344 GLint sourceLevel,
4345 TextureTarget destTarget,
4346 GLuint destId,
4347 GLint destLevel,
4348 GLint internalFormat,
4349 GLenum destType,
4350 GLboolean unpackFlipY,
4351 GLboolean unpackPremultiplyAlpha,
4352 GLboolean unpackUnmultiplyAlpha)
4353{
4354 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4355
4356 Texture *sourceTexture = getTexture(sourceId);
4357 Texture *destTexture = getTexture(destId);
4358 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4359 sourceLevel, ConvertToBool(unpackFlipY),
4360 ConvertToBool(unpackPremultiplyAlpha),
4361 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4362}
4363
4364void Context::copySubTexture3D(GLuint sourceId,
4365 GLint sourceLevel,
4366 TextureTarget destTarget,
4367 GLuint destId,
4368 GLint destLevel,
4369 GLint xoffset,
4370 GLint yoffset,
4371 GLint zoffset,
4372 GLint x,
4373 GLint y,
4374 GLint z,
4375 GLsizei width,
4376 GLsizei height,
4377 GLsizei depth,
4378 GLboolean unpackFlipY,
4379 GLboolean unpackPremultiplyAlpha,
4380 GLboolean unpackUnmultiplyAlpha)
4381{
4382 // Zero sized copies are valid but no-ops
4383 if (width == 0 || height == 0 || depth == 0)
4384 {
4385 return;
4386 }
4387
4388 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4389
4390 Texture *sourceTexture = getTexture(sourceId);
4391 Texture *destTexture = getTexture(destId);
4392 Offset offset(xoffset, yoffset, zoffset);
4393 Box box(x, y, z, width, height, depth);
4394 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004395 ConvertToBool(unpackFlipY),
4396 ConvertToBool(unpackPremultiplyAlpha),
4397 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004398}
4399
Jamie Madill007530e2017-12-28 14:27:04 -05004400void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004401{
Jamie Madillbc918e72018-03-08 09:47:21 -05004402 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004403
4404 gl::Texture *sourceTexture = getTexture(sourceId);
4405 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004406 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004407}
4408
Corentin Wallez336129f2017-10-17 15:55:40 -04004409void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004410{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004411 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004412 ASSERT(buffer);
4413
Geoff Lang496c02d2016-10-20 11:38:11 -07004414 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004415}
4416
Brandon Jones59770802018-04-02 13:18:42 -07004417void Context::getBufferPointervRobust(BufferBinding target,
4418 GLenum pname,
4419 GLsizei bufSize,
4420 GLsizei *length,
4421 void **params)
4422{
4423 getBufferPointerv(target, pname, params);
4424}
4425
Corentin Wallez336129f2017-10-17 15:55:40 -04004426void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004427{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004428 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004429 ASSERT(buffer);
4430
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004431 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004432 if (error.isError())
4433 {
Jamie Madill437fa652016-05-03 15:13:24 -04004434 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004435 return nullptr;
4436 }
4437
4438 return buffer->getMapPointer();
4439}
4440
Corentin Wallez336129f2017-10-17 15:55:40 -04004441GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004442{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004443 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004444 ASSERT(buffer);
4445
4446 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004447 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004448 if (error.isError())
4449 {
Jamie Madill437fa652016-05-03 15:13:24 -04004450 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004451 return GL_FALSE;
4452 }
4453
4454 return result;
4455}
4456
Corentin Wallez336129f2017-10-17 15:55:40 -04004457void *Context::mapBufferRange(BufferBinding target,
4458 GLintptr offset,
4459 GLsizeiptr length,
4460 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004461{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004462 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004463 ASSERT(buffer);
4464
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004465 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004466 if (error.isError())
4467 {
Jamie Madill437fa652016-05-03 15:13:24 -04004468 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004469 return nullptr;
4470 }
4471
4472 return buffer->getMapPointer();
4473}
4474
Corentin Wallez336129f2017-10-17 15:55:40 -04004475void Context::flushMappedBufferRange(BufferBinding /*target*/,
4476 GLintptr /*offset*/,
4477 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004478{
4479 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4480}
4481
Jamie Madillbc918e72018-03-08 09:47:21 -05004482Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004483{
Geoff Langa8cb2872018-03-09 16:09:40 -05004484 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004485}
4486
Jamie Madillbc918e72018-03-08 09:47:21 -05004487Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004488{
Geoff Langa8cb2872018-03-09 16:09:40 -05004489 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004490}
4491
Jamie Madillbc918e72018-03-08 09:47:21 -05004492Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004493{
Geoff Langa8cb2872018-03-09 16:09:40 -05004494 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004495}
4496
Geoff Lang9bf86f02018-07-26 11:46:34 -04004497Error Context::syncStateForPathOperation()
4498{
4499 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4500
4501 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4502 ANGLE_TRY(syncDirtyBits());
4503
4504 return NoError();
4505}
4506
Jiajia Qin5451d532017-11-16 17:16:34 +08004507void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4508{
4509 UNIMPLEMENTED();
4510}
4511
Jamie Madillc20ab272016-06-09 07:20:46 -07004512void Context::activeTexture(GLenum texture)
4513{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004514 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004515}
4516
Jamie Madill876429b2017-04-20 15:46:24 -04004517void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004518{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004519 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004520}
4521
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004522void Context::blendEquation(GLenum mode)
4523{
4524 mGLState.setBlendEquation(mode, mode);
4525}
4526
Jamie Madillc20ab272016-06-09 07:20:46 -07004527void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4528{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004529 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004530}
4531
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004532void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4533{
4534 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4535}
4536
Jamie Madillc20ab272016-06-09 07:20:46 -07004537void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4538{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004539 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004540}
4541
Jamie Madill876429b2017-04-20 15:46:24 -04004542void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004543{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004544 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004545}
4546
Jamie Madill876429b2017-04-20 15:46:24 -04004547void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004548{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004549 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07004550}
4551
4552void Context::clearStencil(GLint s)
4553{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004554 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004555}
4556
4557void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4558{
Geoff Lang92019432017-11-20 13:09:34 -05004559 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4560 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004561}
4562
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004563void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004564{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004565 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004566}
4567
4568void Context::depthFunc(GLenum func)
4569{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004570 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004571}
4572
4573void Context::depthMask(GLboolean flag)
4574{
Geoff Lang92019432017-11-20 13:09:34 -05004575 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004576}
4577
Jamie Madill876429b2017-04-20 15:46:24 -04004578void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004579{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004580 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07004581}
4582
4583void Context::disable(GLenum cap)
4584{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004585 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004586 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004587}
4588
4589void Context::disableVertexAttribArray(GLuint index)
4590{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004591 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004592 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004593}
4594
4595void Context::enable(GLenum cap)
4596{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004597 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004598 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004599}
4600
4601void Context::enableVertexAttribArray(GLuint index)
4602{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004603 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004604 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004605}
4606
4607void Context::frontFace(GLenum mode)
4608{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004609 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004610}
4611
4612void Context::hint(GLenum target, GLenum mode)
4613{
4614 switch (target)
4615 {
4616 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004617 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004618 break;
4619
4620 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004621 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004622 break;
4623
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004624 case GL_PERSPECTIVE_CORRECTION_HINT:
4625 case GL_POINT_SMOOTH_HINT:
4626 case GL_LINE_SMOOTH_HINT:
4627 case GL_FOG_HINT:
4628 mGLState.gles1().setHint(target, mode);
4629 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004630 default:
4631 UNREACHABLE();
4632 return;
4633 }
4634}
4635
4636void Context::lineWidth(GLfloat width)
4637{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004638 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004639}
4640
4641void Context::pixelStorei(GLenum pname, GLint param)
4642{
4643 switch (pname)
4644 {
4645 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004646 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004647 break;
4648
4649 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004650 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004651 break;
4652
4653 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004654 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004655 break;
4656
4657 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004658 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004659 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004660 break;
4661
4662 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004663 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004664 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004665 break;
4666
4667 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004668 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004669 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004670 break;
4671
4672 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004673 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004674 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675 break;
4676
4677 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004678 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004679 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004680 break;
4681
4682 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004683 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004684 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004685 break;
4686
4687 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004688 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004689 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004690 break;
4691
4692 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004693 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004694 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004695 break;
4696
4697 default:
4698 UNREACHABLE();
4699 return;
4700 }
4701}
4702
4703void Context::polygonOffset(GLfloat factor, GLfloat units)
4704{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004705 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004706}
4707
Jamie Madill876429b2017-04-20 15:46:24 -04004708void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004709{
Geoff Lang92019432017-11-20 13:09:34 -05004710 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004711}
4712
Jiawei Shaodb342272017-09-27 10:21:45 +08004713void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4714{
4715 mGLState.setSampleMaskParams(maskNumber, mask);
4716}
4717
Jamie Madillc20ab272016-06-09 07:20:46 -07004718void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4719{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004720 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004721}
4722
4723void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4724{
4725 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4726 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004727 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004728 }
4729
4730 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4731 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004732 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004733 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004734
4735 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004736}
4737
4738void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4739{
4740 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4741 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004742 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004743 }
4744
4745 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4746 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004747 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004748 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004749
4750 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004751}
4752
4753void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4754{
4755 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4756 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004757 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004758 }
4759
4760 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4761 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004762 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004763 }
4764}
4765
4766void Context::vertexAttrib1f(GLuint index, GLfloat x)
4767{
4768 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004769 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004770 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004771}
4772
4773void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4774{
4775 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004776 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004777 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004778}
4779
4780void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4781{
4782 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004783 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004784 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004785}
4786
4787void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4788{
4789 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004790 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004791 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004792}
4793
4794void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4795{
4796 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004797 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004798 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004799}
4800
4801void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4802{
4803 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004804 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004805 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004806}
4807
4808void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4809{
4810 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004811 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004812 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004813}
4814
4815void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4816{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004817 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004818 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004819}
4820
4821void Context::vertexAttribPointer(GLuint index,
4822 GLint size,
4823 GLenum type,
4824 GLboolean normalized,
4825 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004826 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004827{
Corentin Wallez336129f2017-10-17 15:55:40 -04004828 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004829 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004830 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004831}
4832
Shao80957d92017-02-20 21:25:59 +08004833void Context::vertexAttribFormat(GLuint attribIndex,
4834 GLint size,
4835 GLenum type,
4836 GLboolean normalized,
4837 GLuint relativeOffset)
4838{
Geoff Lang92019432017-11-20 13:09:34 -05004839 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004840 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004841 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004842}
4843
4844void Context::vertexAttribIFormat(GLuint attribIndex,
4845 GLint size,
4846 GLenum type,
4847 GLuint relativeOffset)
4848{
4849 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004850 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004851}
4852
4853void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4854{
Shaodde78e82017-05-22 14:13:27 +08004855 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004856 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004857}
4858
Jiajia Qin5451d532017-11-16 17:16:34 +08004859void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004860{
4861 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004862 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004863}
4864
Jamie Madillc20ab272016-06-09 07:20:46 -07004865void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4866{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004867 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004868}
4869
4870void Context::vertexAttribIPointer(GLuint index,
4871 GLint size,
4872 GLenum type,
4873 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004874 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004875{
Corentin Wallez336129f2017-10-17 15:55:40 -04004876 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4877 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004878 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004879}
4880
4881void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4882{
4883 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004884 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004885 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004886}
4887
4888void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4889{
4890 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004891 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004892 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004893}
4894
4895void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4896{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004897 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004898 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004899}
4900
4901void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4902{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004903 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004904 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004905}
4906
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004907void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4908{
4909 const VertexAttribCurrentValueData &currentValues =
4910 getGLState().getVertexAttribCurrentValue(index);
4911 const VertexArray *vao = getGLState().getVertexArray();
4912 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4913 currentValues, pname, params);
4914}
4915
Brandon Jones59770802018-04-02 13:18:42 -07004916void Context::getVertexAttribivRobust(GLuint index,
4917 GLenum pname,
4918 GLsizei bufSize,
4919 GLsizei *length,
4920 GLint *params)
4921{
4922 getVertexAttribiv(index, pname, params);
4923}
4924
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004925void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4926{
4927 const VertexAttribCurrentValueData &currentValues =
4928 getGLState().getVertexAttribCurrentValue(index);
4929 const VertexArray *vao = getGLState().getVertexArray();
4930 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4931 currentValues, pname, params);
4932}
4933
Brandon Jones59770802018-04-02 13:18:42 -07004934void Context::getVertexAttribfvRobust(GLuint index,
4935 GLenum pname,
4936 GLsizei bufSize,
4937 GLsizei *length,
4938 GLfloat *params)
4939{
4940 getVertexAttribfv(index, pname, params);
4941}
4942
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004943void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4944{
4945 const VertexAttribCurrentValueData &currentValues =
4946 getGLState().getVertexAttribCurrentValue(index);
4947 const VertexArray *vao = getGLState().getVertexArray();
4948 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4949 currentValues, pname, params);
4950}
4951
Brandon Jones59770802018-04-02 13:18:42 -07004952void Context::getVertexAttribIivRobust(GLuint index,
4953 GLenum pname,
4954 GLsizei bufSize,
4955 GLsizei *length,
4956 GLint *params)
4957{
4958 getVertexAttribIiv(index, pname, params);
4959}
4960
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004961void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4962{
4963 const VertexAttribCurrentValueData &currentValues =
4964 getGLState().getVertexAttribCurrentValue(index);
4965 const VertexArray *vao = getGLState().getVertexArray();
4966 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4967 currentValues, pname, params);
4968}
4969
Brandon Jones59770802018-04-02 13:18:42 -07004970void Context::getVertexAttribIuivRobust(GLuint index,
4971 GLenum pname,
4972 GLsizei bufSize,
4973 GLsizei *length,
4974 GLuint *params)
4975{
4976 getVertexAttribIuiv(index, pname, params);
4977}
4978
Jamie Madill876429b2017-04-20 15:46:24 -04004979void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004980{
4981 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4982 QueryVertexAttribPointerv(attrib, pname, pointer);
4983}
4984
Brandon Jones59770802018-04-02 13:18:42 -07004985void Context::getVertexAttribPointervRobust(GLuint index,
4986 GLenum pname,
4987 GLsizei bufSize,
4988 GLsizei *length,
4989 void **pointer)
4990{
4991 getVertexAttribPointerv(index, pname, pointer);
4992}
4993
Jamie Madillc20ab272016-06-09 07:20:46 -07004994void Context::debugMessageControl(GLenum source,
4995 GLenum type,
4996 GLenum severity,
4997 GLsizei count,
4998 const GLuint *ids,
4999 GLboolean enabled)
5000{
5001 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005002 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005003 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005004}
5005
5006void Context::debugMessageInsert(GLenum source,
5007 GLenum type,
5008 GLuint id,
5009 GLenum severity,
5010 GLsizei length,
5011 const GLchar *buf)
5012{
5013 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005014 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005015}
5016
5017void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5018{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005019 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005020}
5021
5022GLuint Context::getDebugMessageLog(GLuint count,
5023 GLsizei bufSize,
5024 GLenum *sources,
5025 GLenum *types,
5026 GLuint *ids,
5027 GLenum *severities,
5028 GLsizei *lengths,
5029 GLchar *messageLog)
5030{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005031 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5032 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005033}
5034
5035void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5036{
5037 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005038 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005039 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005040}
5041
5042void Context::popDebugGroup()
5043{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005044 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005045 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005046}
5047
Corentin Wallez336129f2017-10-17 15:55:40 -04005048void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005049{
5050 Buffer *buffer = mGLState.getTargetBuffer(target);
5051 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005052 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005053}
5054
Corentin Wallez336129f2017-10-17 15:55:40 -04005055void Context::bufferSubData(BufferBinding target,
5056 GLintptr offset,
5057 GLsizeiptr size,
5058 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005059{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005060 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005061 {
5062 return;
5063 }
5064
5065 Buffer *buffer = mGLState.getTargetBuffer(target);
5066 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005067 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005068}
5069
Jamie Madillef300b12016-10-07 15:12:09 -04005070void Context::attachShader(GLuint program, GLuint shader)
5071{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005072 Program *programObject = mState.mShaderPrograms->getProgram(program);
5073 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005074 ASSERT(programObject && shaderObject);
5075 programObject->attachShader(shaderObject);
5076}
5077
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005078const Workarounds &Context::getWorkarounds() const
5079{
5080 return mWorkarounds;
5081}
5082
Corentin Wallez336129f2017-10-17 15:55:40 -04005083void Context::copyBufferSubData(BufferBinding readTarget,
5084 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005085 GLintptr readOffset,
5086 GLintptr writeOffset,
5087 GLsizeiptr size)
5088{
5089 // if size is zero, the copy is a successful no-op
5090 if (size == 0)
5091 {
5092 return;
5093 }
5094
5095 // TODO(jmadill): cache these.
5096 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5097 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5098
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005099 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005100}
5101
Jamie Madill01a80ee2016-11-07 12:06:18 -05005102void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5103{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005104 // Ideally we could share the program query with the validation layer if possible.
5105 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005106 ASSERT(programObject);
5107 programObject->bindAttributeLocation(index, name);
5108}
5109
Corentin Wallez336129f2017-10-17 15:55:40 -04005110void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005111{
Corentin Wallez336129f2017-10-17 15:55:40 -04005112 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5113 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005114 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005115}
5116
Corentin Wallez336129f2017-10-17 15:55:40 -04005117void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005118{
5119 bindBufferRange(target, index, buffer, 0, 0);
5120}
5121
Corentin Wallez336129f2017-10-17 15:55:40 -04005122void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005123 GLuint index,
5124 GLuint buffer,
5125 GLintptr offset,
5126 GLsizeiptr size)
5127{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005128 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5129 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5130 if (target == BufferBinding::Uniform)
5131 {
5132 mUniformBufferObserverBindings[index].bind(object ? object->getImplementation() : nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04005133 mStateCache.onUniformBufferStateChange(this);
5134 }
5135 else
5136 {
5137 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005138 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005139}
5140
Jamie Madill01a80ee2016-11-07 12:06:18 -05005141void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5142{
5143 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5144 {
5145 bindReadFramebuffer(framebuffer);
5146 }
5147
5148 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5149 {
5150 bindDrawFramebuffer(framebuffer);
5151 }
5152}
5153
5154void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5155{
5156 ASSERT(target == GL_RENDERBUFFER);
5157 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005158 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005159 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005160}
5161
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005162void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005163 GLsizei samples,
5164 GLenum internalformat,
5165 GLsizei width,
5166 GLsizei height,
5167 GLboolean fixedsamplelocations)
5168{
5169 Extents size(width, height, 1);
5170 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005171 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5172 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005173}
5174
Olli Etuaho89664842018-08-24 14:45:36 +03005175void Context::texStorage3DMultisample(TextureType target,
5176 GLsizei samples,
5177 GLenum internalformat,
5178 GLsizei width,
5179 GLsizei height,
5180 GLsizei depth,
5181 GLboolean fixedsamplelocations)
5182{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005183 Extents size(width, height, depth);
5184 Texture *texture = getTargetTexture(target);
5185 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5186 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005187}
5188
JiangYizhoubddc46b2016-12-09 09:50:51 +08005189void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5190{
JiangYizhou5b03f472017-01-09 10:22:53 +08005191 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5192 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005193 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005194 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005195
5196 switch (pname)
5197 {
5198 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005199 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005200 break;
5201 default:
5202 UNREACHABLE();
5203 }
5204}
5205
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005206void Context::getMultisamplefvRobust(GLenum pname,
5207 GLuint index,
5208 GLsizei bufSize,
5209 GLsizei *length,
5210 GLfloat *val)
5211{
5212 UNIMPLEMENTED();
5213}
5214
Jamie Madille8fb6402017-02-14 17:56:40 -05005215void Context::renderbufferStorage(GLenum target,
5216 GLenum internalformat,
5217 GLsizei width,
5218 GLsizei height)
5219{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005220 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5221 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5222
Jamie Madille8fb6402017-02-14 17:56:40 -05005223 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005224 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005225}
5226
5227void Context::renderbufferStorageMultisample(GLenum target,
5228 GLsizei samples,
5229 GLenum internalformat,
5230 GLsizei width,
5231 GLsizei height)
5232{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005233 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5234 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005235
5236 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005237 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005238 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005239}
5240
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005241void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5242{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005243 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005244 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005245}
5246
JiangYizhoue18e6392017-02-20 10:32:23 +08005247void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5248{
5249 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5250 QueryFramebufferParameteriv(framebuffer, pname, params);
5251}
5252
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005253void Context::getFramebufferParameterivRobust(GLenum target,
5254 GLenum pname,
5255 GLsizei bufSize,
5256 GLsizei *length,
5257 GLint *params)
5258{
5259 UNIMPLEMENTED();
5260}
5261
Jiajia Qin5451d532017-11-16 17:16:34 +08005262void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005263{
5264 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005265 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005266}
5267
Jamie Madilldec86232018-07-11 09:01:18 -04005268bool Context::getScratchBuffer(size_t requstedSizeBytes,
5269 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005270{
Jamie Madilldec86232018-07-11 09:01:18 -04005271 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005272}
5273
Jamie Madilldec86232018-07-11 09:01:18 -04005274bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5275 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005276{
Jamie Madilldec86232018-07-11 09:01:18 -04005277 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005278}
5279
Xinghua Cao10a4d432017-11-28 14:46:26 +08005280Error Context::prepareForDispatch()
5281{
Geoff Langa8cb2872018-03-09 16:09:40 -05005282 ANGLE_TRY(syncState(mComputeDirtyBits, mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005283
5284 if (isRobustResourceInitEnabled())
5285 {
5286 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5287 }
5288
5289 return NoError();
5290}
5291
Xinghua Cao2b396592017-03-29 15:36:04 +08005292void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5293{
5294 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5295 {
5296 return;
5297 }
5298
Xinghua Cao10a4d432017-11-28 14:46:26 +08005299 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005300 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005301}
5302
Jiajia Qin5451d532017-11-16 17:16:34 +08005303void Context::dispatchComputeIndirect(GLintptr indirect)
5304{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005305 ANGLE_CONTEXT_TRY(prepareForDispatch());
5306 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005307}
5308
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005309void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005310 GLsizei levels,
5311 GLenum internalFormat,
5312 GLsizei width,
5313 GLsizei height)
5314{
5315 Extents size(width, height, 1);
5316 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005317 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005318}
5319
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005320void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005321 GLsizei levels,
5322 GLenum internalFormat,
5323 GLsizei width,
5324 GLsizei height,
5325 GLsizei depth)
5326{
5327 Extents size(width, height, depth);
5328 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005329 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005330}
5331
Jiajia Qin5451d532017-11-16 17:16:34 +08005332void Context::memoryBarrier(GLbitfield barriers)
5333{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005334 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005335}
5336
5337void Context::memoryBarrierByRegion(GLbitfield barriers)
5338{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005339 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005340}
5341
Jamie Madillc1d770e2017-04-13 17:31:24 -04005342GLenum Context::checkFramebufferStatus(GLenum target)
5343{
5344 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5345 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005346 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005347}
5348
5349void Context::compileShader(GLuint shader)
5350{
5351 Shader *shaderObject = GetValidShader(this, shader);
5352 if (!shaderObject)
5353 {
5354 return;
5355 }
5356 shaderObject->compile(this);
5357}
5358
5359void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5360{
5361 for (int i = 0; i < n; i++)
5362 {
5363 deleteBuffer(buffers[i]);
5364 }
5365}
5366
5367void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5368{
5369 for (int i = 0; i < n; i++)
5370 {
5371 if (framebuffers[i] != 0)
5372 {
5373 deleteFramebuffer(framebuffers[i]);
5374 }
5375 }
5376}
5377
5378void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5379{
5380 for (int i = 0; i < n; i++)
5381 {
5382 deleteRenderbuffer(renderbuffers[i]);
5383 }
5384}
5385
5386void Context::deleteTextures(GLsizei n, const GLuint *textures)
5387{
5388 for (int i = 0; i < n; i++)
5389 {
5390 if (textures[i] != 0)
5391 {
5392 deleteTexture(textures[i]);
5393 }
5394 }
5395}
5396
5397void Context::detachShader(GLuint program, GLuint shader)
5398{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005399 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005400 ASSERT(programObject);
5401
5402 Shader *shaderObject = getShader(shader);
5403 ASSERT(shaderObject);
5404
5405 programObject->detachShader(this, shaderObject);
5406}
5407
5408void Context::genBuffers(GLsizei n, GLuint *buffers)
5409{
5410 for (int i = 0; i < n; i++)
5411 {
5412 buffers[i] = createBuffer();
5413 }
5414}
5415
5416void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5417{
5418 for (int i = 0; i < n; i++)
5419 {
5420 framebuffers[i] = createFramebuffer();
5421 }
5422}
5423
5424void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5425{
5426 for (int i = 0; i < n; i++)
5427 {
5428 renderbuffers[i] = createRenderbuffer();
5429 }
5430}
5431
5432void Context::genTextures(GLsizei n, GLuint *textures)
5433{
5434 for (int i = 0; i < n; i++)
5435 {
5436 textures[i] = createTexture();
5437 }
5438}
5439
5440void Context::getActiveAttrib(GLuint program,
5441 GLuint index,
5442 GLsizei bufsize,
5443 GLsizei *length,
5444 GLint *size,
5445 GLenum *type,
5446 GLchar *name)
5447{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005448 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005449 ASSERT(programObject);
5450 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5451}
5452
5453void Context::getActiveUniform(GLuint program,
5454 GLuint index,
5455 GLsizei bufsize,
5456 GLsizei *length,
5457 GLint *size,
5458 GLenum *type,
5459 GLchar *name)
5460{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005461 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005462 ASSERT(programObject);
5463 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5464}
5465
5466void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5467{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005468 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005469 ASSERT(programObject);
5470 programObject->getAttachedShaders(maxcount, count, shaders);
5471}
5472
5473GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5474{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005475 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005476 ASSERT(programObject);
5477 return programObject->getAttributeLocation(name);
5478}
5479
5480void Context::getBooleanv(GLenum pname, GLboolean *params)
5481{
5482 GLenum nativeType;
5483 unsigned int numParams = 0;
5484 getQueryParameterInfo(pname, &nativeType, &numParams);
5485
5486 if (nativeType == GL_BOOL)
5487 {
5488 getBooleanvImpl(pname, params);
5489 }
5490 else
5491 {
5492 CastStateValues(this, nativeType, pname, numParams, params);
5493 }
5494}
5495
Brandon Jones59770802018-04-02 13:18:42 -07005496void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5497{
5498 getBooleanv(pname, params);
5499}
5500
Jamie Madillc1d770e2017-04-13 17:31:24 -04005501void Context::getFloatv(GLenum pname, GLfloat *params)
5502{
5503 GLenum nativeType;
5504 unsigned int numParams = 0;
5505 getQueryParameterInfo(pname, &nativeType, &numParams);
5506
5507 if (nativeType == GL_FLOAT)
5508 {
5509 getFloatvImpl(pname, params);
5510 }
5511 else
5512 {
5513 CastStateValues(this, nativeType, pname, numParams, params);
5514 }
5515}
5516
Brandon Jones59770802018-04-02 13:18:42 -07005517void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5518{
5519 getFloatv(pname, params);
5520}
5521
Jamie Madillc1d770e2017-04-13 17:31:24 -04005522void Context::getIntegerv(GLenum pname, GLint *params)
5523{
5524 GLenum nativeType;
5525 unsigned int numParams = 0;
5526 getQueryParameterInfo(pname, &nativeType, &numParams);
5527
5528 if (nativeType == GL_INT)
5529 {
5530 getIntegervImpl(pname, params);
5531 }
5532 else
5533 {
5534 CastStateValues(this, nativeType, pname, numParams, params);
5535 }
5536}
5537
Brandon Jones59770802018-04-02 13:18:42 -07005538void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5539{
5540 getIntegerv(pname, data);
5541}
5542
Jamie Madillc1d770e2017-04-13 17:31:24 -04005543void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5544{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005545 // Don't resolve link if checking the link completion status.
5546 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5547 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005548 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005549 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005550}
5551
Brandon Jones59770802018-04-02 13:18:42 -07005552void Context::getProgramivRobust(GLuint program,
5553 GLenum pname,
5554 GLsizei bufSize,
5555 GLsizei *length,
5556 GLint *params)
5557{
5558 getProgramiv(program, pname, params);
5559}
5560
Jiajia Qin5451d532017-11-16 17:16:34 +08005561void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5562{
5563 UNIMPLEMENTED();
5564}
5565
Jamie Madillbe849e42017-05-02 15:49:00 -04005566void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005567{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005568 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005569 ASSERT(programObject);
5570 programObject->getInfoLog(bufsize, length, infolog);
5571}
5572
Jiajia Qin5451d532017-11-16 17:16:34 +08005573void Context::getProgramPipelineInfoLog(GLuint pipeline,
5574 GLsizei bufSize,
5575 GLsizei *length,
5576 GLchar *infoLog)
5577{
5578 UNIMPLEMENTED();
5579}
5580
Jamie Madillc1d770e2017-04-13 17:31:24 -04005581void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5582{
5583 Shader *shaderObject = getShader(shader);
5584 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005585 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005586}
5587
Brandon Jones59770802018-04-02 13:18:42 -07005588void Context::getShaderivRobust(GLuint shader,
5589 GLenum pname,
5590 GLsizei bufSize,
5591 GLsizei *length,
5592 GLint *params)
5593{
5594 getShaderiv(shader, pname, params);
5595}
5596
Jamie Madillc1d770e2017-04-13 17:31:24 -04005597void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5598{
5599 Shader *shaderObject = getShader(shader);
5600 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005601 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005602}
5603
5604void Context::getShaderPrecisionFormat(GLenum shadertype,
5605 GLenum precisiontype,
5606 GLint *range,
5607 GLint *precision)
5608{
5609 // TODO(jmadill): Compute shaders.
5610
5611 switch (shadertype)
5612 {
5613 case GL_VERTEX_SHADER:
5614 switch (precisiontype)
5615 {
5616 case GL_LOW_FLOAT:
5617 mCaps.vertexLowpFloat.get(range, precision);
5618 break;
5619 case GL_MEDIUM_FLOAT:
5620 mCaps.vertexMediumpFloat.get(range, precision);
5621 break;
5622 case GL_HIGH_FLOAT:
5623 mCaps.vertexHighpFloat.get(range, precision);
5624 break;
5625
5626 case GL_LOW_INT:
5627 mCaps.vertexLowpInt.get(range, precision);
5628 break;
5629 case GL_MEDIUM_INT:
5630 mCaps.vertexMediumpInt.get(range, precision);
5631 break;
5632 case GL_HIGH_INT:
5633 mCaps.vertexHighpInt.get(range, precision);
5634 break;
5635
5636 default:
5637 UNREACHABLE();
5638 return;
5639 }
5640 break;
5641
5642 case GL_FRAGMENT_SHADER:
5643 switch (precisiontype)
5644 {
5645 case GL_LOW_FLOAT:
5646 mCaps.fragmentLowpFloat.get(range, precision);
5647 break;
5648 case GL_MEDIUM_FLOAT:
5649 mCaps.fragmentMediumpFloat.get(range, precision);
5650 break;
5651 case GL_HIGH_FLOAT:
5652 mCaps.fragmentHighpFloat.get(range, precision);
5653 break;
5654
5655 case GL_LOW_INT:
5656 mCaps.fragmentLowpInt.get(range, precision);
5657 break;
5658 case GL_MEDIUM_INT:
5659 mCaps.fragmentMediumpInt.get(range, precision);
5660 break;
5661 case GL_HIGH_INT:
5662 mCaps.fragmentHighpInt.get(range, precision);
5663 break;
5664
5665 default:
5666 UNREACHABLE();
5667 return;
5668 }
5669 break;
5670
5671 default:
5672 UNREACHABLE();
5673 return;
5674 }
5675}
5676
5677void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5678{
5679 Shader *shaderObject = getShader(shader);
5680 ASSERT(shaderObject);
5681 shaderObject->getSource(bufsize, length, source);
5682}
5683
5684void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5685{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005686 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005687 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005688 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005689}
5690
Brandon Jones59770802018-04-02 13:18:42 -07005691void Context::getUniformfvRobust(GLuint program,
5692 GLint location,
5693 GLsizei bufSize,
5694 GLsizei *length,
5695 GLfloat *params)
5696{
5697 getUniformfv(program, location, params);
5698}
5699
Jamie Madillc1d770e2017-04-13 17:31:24 -04005700void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5701{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005702 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005703 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005704 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005705}
5706
Brandon Jones59770802018-04-02 13:18:42 -07005707void Context::getUniformivRobust(GLuint program,
5708 GLint location,
5709 GLsizei bufSize,
5710 GLsizei *length,
5711 GLint *params)
5712{
5713 getUniformiv(program, location, params);
5714}
5715
Jamie Madillc1d770e2017-04-13 17:31:24 -04005716GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5717{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005718 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005719 ASSERT(programObject);
5720 return programObject->getUniformLocation(name);
5721}
5722
5723GLboolean Context::isBuffer(GLuint buffer)
5724{
5725 if (buffer == 0)
5726 {
5727 return GL_FALSE;
5728 }
5729
5730 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5731}
5732
5733GLboolean Context::isEnabled(GLenum cap)
5734{
5735 return mGLState.getEnableFeature(cap);
5736}
5737
5738GLboolean Context::isFramebuffer(GLuint framebuffer)
5739{
5740 if (framebuffer == 0)
5741 {
5742 return GL_FALSE;
5743 }
5744
5745 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5746}
5747
5748GLboolean Context::isProgram(GLuint program)
5749{
5750 if (program == 0)
5751 {
5752 return GL_FALSE;
5753 }
5754
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005755 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005756}
5757
5758GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5759{
5760 if (renderbuffer == 0)
5761 {
5762 return GL_FALSE;
5763 }
5764
5765 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5766}
5767
5768GLboolean Context::isShader(GLuint shader)
5769{
5770 if (shader == 0)
5771 {
5772 return GL_FALSE;
5773 }
5774
5775 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5776}
5777
5778GLboolean Context::isTexture(GLuint texture)
5779{
5780 if (texture == 0)
5781 {
5782 return GL_FALSE;
5783 }
5784
5785 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5786}
5787
5788void Context::linkProgram(GLuint program)
5789{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005790 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005791 ASSERT(programObject);
5792 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005793
5794 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5795 // don't need to worry that:
5796 // 1. Draw calls after link use the new executable code or the old one depending on the link
5797 // result.
5798 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5799 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5800 // ProgramD3D.
5801 if (programObject->isInUse())
5802 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005803 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005804 if (programObject->isLinked())
5805 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005806 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005807 }
jchen107ae70d82018-07-06 13:47:01 +08005808 mStateCache.onProgramExecutableChange(this);
5809 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005810}
5811
5812void Context::releaseShaderCompiler()
5813{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005814 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005815}
5816
5817void Context::shaderBinary(GLsizei n,
5818 const GLuint *shaders,
5819 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005820 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005821 GLsizei length)
5822{
5823 // No binary shader formats are supported.
5824 UNIMPLEMENTED();
5825}
5826
Olli Etuaho0ca09752018-09-24 11:00:50 +03005827void Context::bindFragDataLocationIndexed(GLuint program,
5828 GLuint colorNumber,
5829 GLuint index,
5830 const char *name)
5831{
5832 Program *programObject = getProgramNoResolveLink(program);
5833 programObject->bindFragmentOutputLocation(colorNumber, name);
5834 programObject->bindFragmentOutputIndex(index, name);
5835}
5836
5837void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5838{
5839 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5840}
5841
5842int Context::getFragDataIndex(GLuint program, const char *name)
5843{
5844 Program *programObject = getProgramResolveLink(program);
5845 return programObject->getFragDataIndex(name);
5846}
5847
5848int Context::getProgramResourceLocationIndex(GLuint program,
5849 GLenum programInterface,
5850 const char *name)
5851{
5852 Program *programObject = getProgramResolveLink(program);
5853 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5854 return programObject->getFragDataIndex(name);
5855}
5856
Jamie Madillc1d770e2017-04-13 17:31:24 -04005857void Context::shaderSource(GLuint shader,
5858 GLsizei count,
5859 const GLchar *const *string,
5860 const GLint *length)
5861{
5862 Shader *shaderObject = getShader(shader);
5863 ASSERT(shaderObject);
5864 shaderObject->setSource(count, string, length);
5865}
5866
5867void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5868{
5869 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5870}
5871
5872void Context::stencilMask(GLuint mask)
5873{
5874 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5875}
5876
5877void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5878{
5879 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5880}
5881
5882void Context::uniform1f(GLint location, GLfloat x)
5883{
5884 Program *program = mGLState.getProgram();
5885 program->setUniform1fv(location, 1, &x);
5886}
5887
5888void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5889{
5890 Program *program = mGLState.getProgram();
5891 program->setUniform1fv(location, count, v);
5892}
5893
Jamie Madill7e4eff12018-08-08 15:49:26 -04005894void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005895{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005896 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005897 {
5898 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005899 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005900 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005901}
5902
Jamie Madill7e4eff12018-08-08 15:49:26 -04005903void Context::uniform1i(GLint location, GLint x)
5904{
5905 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5906}
5907
Jamie Madillc1d770e2017-04-13 17:31:24 -04005908void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5909{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005910 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005911}
5912
5913void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5914{
5915 GLfloat xy[2] = {x, y};
5916 Program *program = mGLState.getProgram();
5917 program->setUniform2fv(location, 1, xy);
5918}
5919
5920void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5921{
5922 Program *program = mGLState.getProgram();
5923 program->setUniform2fv(location, count, v);
5924}
5925
5926void Context::uniform2i(GLint location, GLint x, GLint y)
5927{
5928 GLint xy[2] = {x, y};
5929 Program *program = mGLState.getProgram();
5930 program->setUniform2iv(location, 1, xy);
5931}
5932
5933void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5934{
5935 Program *program = mGLState.getProgram();
5936 program->setUniform2iv(location, count, v);
5937}
5938
5939void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5940{
5941 GLfloat xyz[3] = {x, y, z};
5942 Program *program = mGLState.getProgram();
5943 program->setUniform3fv(location, 1, xyz);
5944}
5945
5946void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5947{
5948 Program *program = mGLState.getProgram();
5949 program->setUniform3fv(location, count, v);
5950}
5951
5952void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5953{
5954 GLint xyz[3] = {x, y, z};
5955 Program *program = mGLState.getProgram();
5956 program->setUniform3iv(location, 1, xyz);
5957}
5958
5959void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5960{
5961 Program *program = mGLState.getProgram();
5962 program->setUniform3iv(location, count, v);
5963}
5964
5965void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5966{
5967 GLfloat xyzw[4] = {x, y, z, w};
5968 Program *program = mGLState.getProgram();
5969 program->setUniform4fv(location, 1, xyzw);
5970}
5971
5972void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5973{
5974 Program *program = mGLState.getProgram();
5975 program->setUniform4fv(location, count, v);
5976}
5977
5978void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5979{
5980 GLint xyzw[4] = {x, y, z, w};
5981 Program *program = mGLState.getProgram();
5982 program->setUniform4iv(location, 1, xyzw);
5983}
5984
5985void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
5986{
5987 Program *program = mGLState.getProgram();
5988 program->setUniform4iv(location, count, v);
5989}
5990
5991void Context::uniformMatrix2fv(GLint location,
5992 GLsizei count,
5993 GLboolean transpose,
5994 const GLfloat *value)
5995{
5996 Program *program = mGLState.getProgram();
5997 program->setUniformMatrix2fv(location, count, transpose, value);
5998}
5999
6000void Context::uniformMatrix3fv(GLint location,
6001 GLsizei count,
6002 GLboolean transpose,
6003 const GLfloat *value)
6004{
6005 Program *program = mGLState.getProgram();
6006 program->setUniformMatrix3fv(location, count, transpose, value);
6007}
6008
6009void Context::uniformMatrix4fv(GLint location,
6010 GLsizei count,
6011 GLboolean transpose,
6012 const GLfloat *value)
6013{
6014 Program *program = mGLState.getProgram();
6015 program->setUniformMatrix4fv(location, count, transpose, value);
6016}
6017
6018void Context::validateProgram(GLuint program)
6019{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006020 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006021 ASSERT(programObject);
6022 programObject->validate(mCaps);
6023}
6024
Jiajia Qin5451d532017-11-16 17:16:34 +08006025void Context::validateProgramPipeline(GLuint pipeline)
6026{
6027 UNIMPLEMENTED();
6028}
6029
Jamie Madilld04908b2017-06-09 14:15:35 -04006030void Context::getProgramBinary(GLuint program,
6031 GLsizei bufSize,
6032 GLsizei *length,
6033 GLenum *binaryFormat,
6034 void *binary)
6035{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006036 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006037 ASSERT(programObject != nullptr);
6038
6039 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6040}
6041
6042void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6043{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006044 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006045 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006046
Jamie Madilld04908b2017-06-09 14:15:35 -04006047 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006048 if (programObject->isInUse())
6049 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006050 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006051 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006052 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006053}
6054
Jamie Madillff325f12017-08-26 15:06:05 -04006055void Context::uniform1ui(GLint location, GLuint v0)
6056{
6057 Program *program = mGLState.getProgram();
6058 program->setUniform1uiv(location, 1, &v0);
6059}
6060
6061void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6062{
6063 Program *program = mGLState.getProgram();
6064 const GLuint xy[] = {v0, v1};
6065 program->setUniform2uiv(location, 1, xy);
6066}
6067
6068void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6069{
6070 Program *program = mGLState.getProgram();
6071 const GLuint xyz[] = {v0, v1, v2};
6072 program->setUniform3uiv(location, 1, xyz);
6073}
6074
6075void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6076{
6077 Program *program = mGLState.getProgram();
6078 const GLuint xyzw[] = {v0, v1, v2, v3};
6079 program->setUniform4uiv(location, 1, xyzw);
6080}
6081
6082void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6083{
6084 Program *program = mGLState.getProgram();
6085 program->setUniform1uiv(location, count, value);
6086}
6087void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6088{
6089 Program *program = mGLState.getProgram();
6090 program->setUniform2uiv(location, count, value);
6091}
6092
6093void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6094{
6095 Program *program = mGLState.getProgram();
6096 program->setUniform3uiv(location, count, value);
6097}
6098
6099void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6100{
6101 Program *program = mGLState.getProgram();
6102 program->setUniform4uiv(location, count, value);
6103}
6104
Jamie Madillf0e04492017-08-26 15:28:42 -04006105void Context::genQueries(GLsizei n, GLuint *ids)
6106{
6107 for (GLsizei i = 0; i < n; i++)
6108 {
6109 GLuint handle = mQueryHandleAllocator.allocate();
6110 mQueryMap.assign(handle, nullptr);
6111 ids[i] = handle;
6112 }
6113}
6114
6115void Context::deleteQueries(GLsizei n, const GLuint *ids)
6116{
6117 for (int i = 0; i < n; i++)
6118 {
6119 GLuint query = ids[i];
6120
6121 Query *queryObject = nullptr;
6122 if (mQueryMap.erase(query, &queryObject))
6123 {
6124 mQueryHandleAllocator.release(query);
6125 if (queryObject)
6126 {
6127 queryObject->release(this);
6128 }
6129 }
6130 }
6131}
6132
6133GLboolean Context::isQuery(GLuint id)
6134{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006135 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006136}
6137
Jamie Madillc8c95812017-08-26 18:40:09 -04006138void Context::uniformMatrix2x3fv(GLint location,
6139 GLsizei count,
6140 GLboolean transpose,
6141 const GLfloat *value)
6142{
6143 Program *program = mGLState.getProgram();
6144 program->setUniformMatrix2x3fv(location, count, transpose, value);
6145}
6146
6147void Context::uniformMatrix3x2fv(GLint location,
6148 GLsizei count,
6149 GLboolean transpose,
6150 const GLfloat *value)
6151{
6152 Program *program = mGLState.getProgram();
6153 program->setUniformMatrix3x2fv(location, count, transpose, value);
6154}
6155
6156void Context::uniformMatrix2x4fv(GLint location,
6157 GLsizei count,
6158 GLboolean transpose,
6159 const GLfloat *value)
6160{
6161 Program *program = mGLState.getProgram();
6162 program->setUniformMatrix2x4fv(location, count, transpose, value);
6163}
6164
6165void Context::uniformMatrix4x2fv(GLint location,
6166 GLsizei count,
6167 GLboolean transpose,
6168 const GLfloat *value)
6169{
6170 Program *program = mGLState.getProgram();
6171 program->setUniformMatrix4x2fv(location, count, transpose, value);
6172}
6173
6174void Context::uniformMatrix3x4fv(GLint location,
6175 GLsizei count,
6176 GLboolean transpose,
6177 const GLfloat *value)
6178{
6179 Program *program = mGLState.getProgram();
6180 program->setUniformMatrix3x4fv(location, count, transpose, value);
6181}
6182
6183void Context::uniformMatrix4x3fv(GLint location,
6184 GLsizei count,
6185 GLboolean transpose,
6186 const GLfloat *value)
6187{
6188 Program *program = mGLState.getProgram();
6189 program->setUniformMatrix4x3fv(location, count, transpose, value);
6190}
6191
Jamie Madilld7576732017-08-26 18:49:50 -04006192void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6193{
6194 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6195 {
6196 GLuint vertexArray = arrays[arrayIndex];
6197
6198 if (arrays[arrayIndex] != 0)
6199 {
6200 VertexArray *vertexArrayObject = nullptr;
6201 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6202 {
6203 if (vertexArrayObject != nullptr)
6204 {
6205 detachVertexArray(vertexArray);
6206 vertexArrayObject->onDestroy(this);
6207 }
6208
6209 mVertexArrayHandleAllocator.release(vertexArray);
6210 }
6211 }
6212 }
6213}
6214
6215void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6216{
6217 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6218 {
6219 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6220 mVertexArrayMap.assign(vertexArray, nullptr);
6221 arrays[arrayIndex] = vertexArray;
6222 }
6223}
6224
6225bool Context::isVertexArray(GLuint array)
6226{
6227 if (array == 0)
6228 {
6229 return GL_FALSE;
6230 }
6231
6232 VertexArray *vao = getVertexArray(array);
6233 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6234}
6235
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006236void Context::endTransformFeedback()
6237{
6238 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6239 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006240 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006241}
6242
6243void Context::transformFeedbackVaryings(GLuint program,
6244 GLsizei count,
6245 const GLchar *const *varyings,
6246 GLenum bufferMode)
6247{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006248 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006249 ASSERT(programObject);
6250 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6251}
6252
6253void Context::getTransformFeedbackVarying(GLuint program,
6254 GLuint index,
6255 GLsizei bufSize,
6256 GLsizei *length,
6257 GLsizei *size,
6258 GLenum *type,
6259 GLchar *name)
6260{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006261 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006262 ASSERT(programObject);
6263 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6264}
6265
6266void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6267{
6268 for (int i = 0; i < n; i++)
6269 {
6270 GLuint transformFeedback = ids[i];
6271 if (transformFeedback == 0)
6272 {
6273 continue;
6274 }
6275
6276 TransformFeedback *transformFeedbackObject = nullptr;
6277 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6278 {
6279 if (transformFeedbackObject != nullptr)
6280 {
6281 detachTransformFeedback(transformFeedback);
6282 transformFeedbackObject->release(this);
6283 }
6284
6285 mTransformFeedbackHandleAllocator.release(transformFeedback);
6286 }
6287 }
6288}
6289
6290void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6291{
6292 for (int i = 0; i < n; i++)
6293 {
6294 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6295 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6296 ids[i] = transformFeedback;
6297 }
6298}
6299
6300bool Context::isTransformFeedback(GLuint id)
6301{
6302 if (id == 0)
6303 {
6304 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6305 // returns FALSE
6306 return GL_FALSE;
6307 }
6308
6309 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6310 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6311}
6312
6313void Context::pauseTransformFeedback()
6314{
6315 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6316 transformFeedback->pause();
6317}
6318
6319void Context::resumeTransformFeedback()
6320{
6321 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6322 transformFeedback->resume();
6323}
6324
Jamie Madill12e957f2017-08-26 21:42:26 -04006325void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6326{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006327 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006328 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006329}
6330
Brandon Jones59770802018-04-02 13:18:42 -07006331void Context::getUniformuivRobust(GLuint program,
6332 GLint location,
6333 GLsizei bufSize,
6334 GLsizei *length,
6335 GLuint *params)
6336{
6337 getUniformuiv(program, location, params);
6338}
6339
Jamie Madill12e957f2017-08-26 21:42:26 -04006340GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6341{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006342 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006343 return programObject->getFragDataLocation(name);
6344}
6345
6346void Context::getUniformIndices(GLuint program,
6347 GLsizei uniformCount,
6348 const GLchar *const *uniformNames,
6349 GLuint *uniformIndices)
6350{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006351 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006352 if (!programObject->isLinked())
6353 {
6354 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6355 {
6356 uniformIndices[uniformId] = GL_INVALID_INDEX;
6357 }
6358 }
6359 else
6360 {
6361 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6362 {
6363 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6364 }
6365 }
6366}
6367
6368void Context::getActiveUniformsiv(GLuint program,
6369 GLsizei uniformCount,
6370 const GLuint *uniformIndices,
6371 GLenum pname,
6372 GLint *params)
6373{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006374 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006375 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6376 {
6377 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006378 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006379 }
6380}
6381
6382GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6383{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006384 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006385 return programObject->getUniformBlockIndex(uniformBlockName);
6386}
6387
6388void Context::getActiveUniformBlockiv(GLuint program,
6389 GLuint uniformBlockIndex,
6390 GLenum pname,
6391 GLint *params)
6392{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006393 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006394 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6395}
6396
Brandon Jones59770802018-04-02 13:18:42 -07006397void Context::getActiveUniformBlockivRobust(GLuint program,
6398 GLuint uniformBlockIndex,
6399 GLenum pname,
6400 GLsizei bufSize,
6401 GLsizei *length,
6402 GLint *params)
6403{
6404 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6405}
6406
Jamie Madill12e957f2017-08-26 21:42:26 -04006407void Context::getActiveUniformBlockName(GLuint program,
6408 GLuint uniformBlockIndex,
6409 GLsizei bufSize,
6410 GLsizei *length,
6411 GLchar *uniformBlockName)
6412{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006413 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006414 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6415}
6416
6417void Context::uniformBlockBinding(GLuint program,
6418 GLuint uniformBlockIndex,
6419 GLuint uniformBlockBinding)
6420{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006421 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006422 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006423
6424 if (programObject->isInUse())
6425 {
6426 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006427 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006428 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006429}
6430
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006431GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6432{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006433 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6434 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006435
Jamie Madill70b5bb02017-08-28 13:32:37 -04006436 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006437 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006438 if (error.isError())
6439 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006440 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006441 handleError(error);
6442 return nullptr;
6443 }
6444
Jamie Madill70b5bb02017-08-28 13:32:37 -04006445 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006446}
6447
6448GLboolean Context::isSync(GLsync sync)
6449{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006450 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006451}
6452
6453GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6454{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006455 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006456
6457 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006458 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006459 return result;
6460}
6461
6462void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6463{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006464 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006465 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006466}
6467
6468void Context::getInteger64v(GLenum pname, GLint64 *params)
6469{
6470 GLenum nativeType = GL_NONE;
6471 unsigned int numParams = 0;
6472 getQueryParameterInfo(pname, &nativeType, &numParams);
6473
6474 if (nativeType == GL_INT_64_ANGLEX)
6475 {
6476 getInteger64vImpl(pname, params);
6477 }
6478 else
6479 {
6480 CastStateValues(this, nativeType, pname, numParams, params);
6481 }
6482}
6483
Brandon Jones59770802018-04-02 13:18:42 -07006484void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6485{
6486 getInteger64v(pname, data);
6487}
6488
Corentin Wallez336129f2017-10-17 15:55:40 -04006489void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006490{
6491 Buffer *buffer = mGLState.getTargetBuffer(target);
6492 QueryBufferParameteri64v(buffer, pname, params);
6493}
6494
Brandon Jones59770802018-04-02 13:18:42 -07006495void Context::getBufferParameteri64vRobust(BufferBinding target,
6496 GLenum pname,
6497 GLsizei bufSize,
6498 GLsizei *length,
6499 GLint64 *params)
6500{
6501 getBufferParameteri64v(target, pname, params);
6502}
6503
Jamie Madill3ef140a2017-08-26 23:11:21 -04006504void Context::genSamplers(GLsizei count, GLuint *samplers)
6505{
6506 for (int i = 0; i < count; i++)
6507 {
6508 samplers[i] = mState.mSamplers->createSampler();
6509 }
6510}
6511
6512void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6513{
6514 for (int i = 0; i < count; i++)
6515 {
6516 GLuint sampler = samplers[i];
6517
6518 if (mState.mSamplers->getSampler(sampler))
6519 {
6520 detachSampler(sampler);
6521 }
6522
6523 mState.mSamplers->deleteObject(this, sampler);
6524 }
6525}
6526
6527void Context::getInternalformativ(GLenum target,
6528 GLenum internalformat,
6529 GLenum pname,
6530 GLsizei bufSize,
6531 GLint *params)
6532{
6533 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6534 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6535}
6536
Brandon Jones59770802018-04-02 13:18:42 -07006537void Context::getInternalformativRobust(GLenum target,
6538 GLenum internalformat,
6539 GLenum pname,
6540 GLsizei bufSize,
6541 GLsizei *length,
6542 GLint *params)
6543{
6544 getInternalformativ(target, internalformat, pname, bufSize, params);
6545}
6546
Jiajia Qin5451d532017-11-16 17:16:34 +08006547void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6548{
6549 programUniform1iv(program, location, 1, &v0);
6550}
6551
6552void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6553{
6554 GLint xy[2] = {v0, v1};
6555 programUniform2iv(program, location, 1, xy);
6556}
6557
6558void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6559{
6560 GLint xyz[3] = {v0, v1, v2};
6561 programUniform3iv(program, location, 1, xyz);
6562}
6563
6564void Context::programUniform4i(GLuint program,
6565 GLint location,
6566 GLint v0,
6567 GLint v1,
6568 GLint v2,
6569 GLint v3)
6570{
6571 GLint xyzw[4] = {v0, v1, v2, v3};
6572 programUniform4iv(program, location, 1, xyzw);
6573}
6574
6575void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6576{
6577 programUniform1uiv(program, location, 1, &v0);
6578}
6579
6580void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6581{
6582 GLuint xy[2] = {v0, v1};
6583 programUniform2uiv(program, location, 1, xy);
6584}
6585
6586void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6587{
6588 GLuint xyz[3] = {v0, v1, v2};
6589 programUniform3uiv(program, location, 1, xyz);
6590}
6591
6592void Context::programUniform4ui(GLuint program,
6593 GLint location,
6594 GLuint v0,
6595 GLuint v1,
6596 GLuint v2,
6597 GLuint v3)
6598{
6599 GLuint xyzw[4] = {v0, v1, v2, v3};
6600 programUniform4uiv(program, location, 1, xyzw);
6601}
6602
6603void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6604{
6605 programUniform1fv(program, location, 1, &v0);
6606}
6607
6608void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6609{
6610 GLfloat xy[2] = {v0, v1};
6611 programUniform2fv(program, location, 1, xy);
6612}
6613
6614void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6615{
6616 GLfloat xyz[3] = {v0, v1, v2};
6617 programUniform3fv(program, location, 1, xyz);
6618}
6619
6620void Context::programUniform4f(GLuint program,
6621 GLint location,
6622 GLfloat v0,
6623 GLfloat v1,
6624 GLfloat v2,
6625 GLfloat v3)
6626{
6627 GLfloat xyzw[4] = {v0, v1, v2, v3};
6628 programUniform4fv(program, location, 1, xyzw);
6629}
6630
Jamie Madill81c2e252017-09-09 23:32:46 -04006631void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6632{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006633 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006634 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006635 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006636}
6637
Jiajia Qin5451d532017-11-16 17:16:34 +08006638void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6639{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006640 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006641 ASSERT(programObject);
6642 programObject->setUniform2iv(location, count, value);
6643}
6644
6645void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6646{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006647 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006648 ASSERT(programObject);
6649 programObject->setUniform3iv(location, count, value);
6650}
6651
6652void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6653{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006654 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006655 ASSERT(programObject);
6656 programObject->setUniform4iv(location, count, value);
6657}
6658
6659void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6660{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006661 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006662 ASSERT(programObject);
6663 programObject->setUniform1uiv(location, count, value);
6664}
6665
6666void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6667{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006668 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006669 ASSERT(programObject);
6670 programObject->setUniform2uiv(location, count, value);
6671}
6672
6673void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6674{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006675 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006676 ASSERT(programObject);
6677 programObject->setUniform3uiv(location, count, value);
6678}
6679
6680void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6681{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006682 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006683 ASSERT(programObject);
6684 programObject->setUniform4uiv(location, count, value);
6685}
6686
6687void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6688{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006689 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006690 ASSERT(programObject);
6691 programObject->setUniform1fv(location, count, value);
6692}
6693
6694void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6695{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006696 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006697 ASSERT(programObject);
6698 programObject->setUniform2fv(location, count, value);
6699}
6700
6701void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6702{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006703 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006704 ASSERT(programObject);
6705 programObject->setUniform3fv(location, count, value);
6706}
6707
6708void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6709{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006710 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006711 ASSERT(programObject);
6712 programObject->setUniform4fv(location, count, value);
6713}
6714
6715void Context::programUniformMatrix2fv(GLuint program,
6716 GLint location,
6717 GLsizei count,
6718 GLboolean transpose,
6719 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->setUniformMatrix2fv(location, count, transpose, value);
6724}
6725
6726void Context::programUniformMatrix3fv(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->setUniformMatrix3fv(location, count, transpose, value);
6735}
6736
6737void Context::programUniformMatrix4fv(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->setUniformMatrix4fv(location, count, transpose, value);
6746}
6747
6748void Context::programUniformMatrix2x3fv(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->setUniformMatrix2x3fv(location, count, transpose, value);
6757}
6758
6759void Context::programUniformMatrix3x2fv(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->setUniformMatrix3x2fv(location, count, transpose, value);
6768}
6769
6770void Context::programUniformMatrix2x4fv(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->setUniformMatrix2x4fv(location, count, transpose, value);
6779}
6780
6781void Context::programUniformMatrix4x2fv(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->setUniformMatrix4x2fv(location, count, transpose, value);
6790}
6791
6792void Context::programUniformMatrix3x4fv(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->setUniformMatrix3x4fv(location, count, transpose, value);
6801}
6802
6803void Context::programUniformMatrix4x3fv(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->setUniformMatrix4x3fv(location, count, transpose, value);
6812}
6813
Jamie Madill81c2e252017-09-09 23:32:46 -04006814void Context::onTextureChange(const Texture *texture)
6815{
6816 // Conservatively assume all textures are dirty.
6817 // TODO(jmadill): More fine-grained update.
6818 mGLState.setObjectDirty(GL_TEXTURE);
6819}
6820
James Darpiniane8a93c62018-01-04 18:02:24 -08006821bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6822{
6823 return mGLState.isCurrentTransformFeedback(tf);
6824}
James Darpiniane8a93c62018-01-04 18:02:24 -08006825
Yunchao Hea336b902017-08-02 16:05:21 +08006826void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6827{
6828 for (int i = 0; i < count; i++)
6829 {
6830 pipelines[i] = createProgramPipeline();
6831 }
6832}
6833
6834void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6835{
6836 for (int i = 0; i < count; i++)
6837 {
6838 if (pipelines[i] != 0)
6839 {
6840 deleteProgramPipeline(pipelines[i]);
6841 }
6842 }
6843}
6844
6845GLboolean Context::isProgramPipeline(GLuint pipeline)
6846{
6847 if (pipeline == 0)
6848 {
6849 return GL_FALSE;
6850 }
6851
6852 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6853}
6854
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006855void Context::finishFenceNV(GLuint fence)
6856{
6857 FenceNV *fenceObject = getFenceNV(fence);
6858
6859 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006860 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006861}
6862
6863void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6864{
6865 FenceNV *fenceObject = getFenceNV(fence);
6866
6867 ASSERT(fenceObject && fenceObject->isSet());
6868
6869 switch (pname)
6870 {
6871 case GL_FENCE_STATUS_NV:
6872 {
6873 // GL_NV_fence spec:
6874 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6875 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6876 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6877 GLboolean status = GL_TRUE;
6878 if (fenceObject->getStatus() != GL_TRUE)
6879 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006880 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006881 }
6882 *params = status;
6883 break;
6884 }
6885
6886 case GL_FENCE_CONDITION_NV:
6887 {
6888 *params = static_cast<GLint>(fenceObject->getCondition());
6889 break;
6890 }
6891
6892 default:
6893 UNREACHABLE();
6894 }
6895}
6896
6897void Context::getTranslatedShaderSource(GLuint shader,
6898 GLsizei bufsize,
6899 GLsizei *length,
6900 GLchar *source)
6901{
6902 Shader *shaderObject = getShader(shader);
6903 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006904 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006905}
6906
6907void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6908{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006909 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006910 ASSERT(programObject);
6911
6912 programObject->getUniformfv(this, location, params);
6913}
6914
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006915void Context::getnUniformfvRobust(GLuint program,
6916 GLint location,
6917 GLsizei bufSize,
6918 GLsizei *length,
6919 GLfloat *params)
6920{
6921 UNIMPLEMENTED();
6922}
6923
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006924void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6925{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006926 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006927 ASSERT(programObject);
6928
6929 programObject->getUniformiv(this, location, params);
6930}
6931
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006932void Context::getnUniformivRobust(GLuint program,
6933 GLint location,
6934 GLsizei bufSize,
6935 GLsizei *length,
6936 GLint *params)
6937{
6938 UNIMPLEMENTED();
6939}
6940
6941void Context::getnUniformuivRobust(GLuint program,
6942 GLint location,
6943 GLsizei bufSize,
6944 GLsizei *length,
6945 GLuint *params)
6946{
6947 UNIMPLEMENTED();
6948}
6949
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006950GLboolean Context::isFenceNV(GLuint fence)
6951{
6952 FenceNV *fenceObject = getFenceNV(fence);
6953
6954 if (fenceObject == nullptr)
6955 {
6956 return GL_FALSE;
6957 }
6958
6959 // GL_NV_fence spec:
6960 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6961 // existing fence.
6962 return fenceObject->isSet();
6963}
6964
6965void Context::readnPixels(GLint x,
6966 GLint y,
6967 GLsizei width,
6968 GLsizei height,
6969 GLenum format,
6970 GLenum type,
6971 GLsizei bufSize,
6972 void *data)
6973{
6974 return readPixels(x, y, width, height, format, type, data);
6975}
6976
Jamie Madill007530e2017-12-28 14:27:04 -05006977void Context::setFenceNV(GLuint fence, GLenum condition)
6978{
6979 ASSERT(condition == GL_ALL_COMPLETED_NV);
6980
6981 FenceNV *fenceObject = getFenceNV(fence);
6982 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04006983 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05006984}
6985
6986GLboolean Context::testFenceNV(GLuint fence)
6987{
6988 FenceNV *fenceObject = getFenceNV(fence);
6989
6990 ASSERT(fenceObject != nullptr);
6991 ASSERT(fenceObject->isSet() == GL_TRUE);
6992
6993 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04006994 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05006995 if (error.isError())
6996 {
6997 handleError(error);
6998 return GL_TRUE;
6999 }
7000
7001 return result;
7002}
7003
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007004void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007005{
7006 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007007 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007008 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007009}
7010
Jamie Madillfa920eb2018-01-04 11:45:50 -05007011void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007012{
7013 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007014 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007015 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7016}
7017
Jamie Madillfa920eb2018-01-04 11:45:50 -05007018void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7019{
7020 UNIMPLEMENTED();
7021}
7022
Jamie Madill5b772312018-03-08 20:28:32 -05007023bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7024{
7025 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7026 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7027 // to the fact that it is stored internally as a float, and so would require conversion
7028 // if returned from Context::getIntegerv. Since this conversion is already implemented
7029 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7030 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7031 // application.
7032 switch (pname)
7033 {
7034 case GL_COMPRESSED_TEXTURE_FORMATS:
7035 {
7036 *type = GL_INT;
7037 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7038 return true;
7039 }
7040 case GL_SHADER_BINARY_FORMATS:
7041 {
7042 *type = GL_INT;
7043 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7044 return true;
7045 }
7046
7047 case GL_MAX_VERTEX_ATTRIBS:
7048 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7049 case GL_MAX_VARYING_VECTORS:
7050 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7051 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7052 case GL_MAX_TEXTURE_IMAGE_UNITS:
7053 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7054 case GL_MAX_RENDERBUFFER_SIZE:
7055 case GL_NUM_SHADER_BINARY_FORMATS:
7056 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7057 case GL_ARRAY_BUFFER_BINDING:
7058 case GL_FRAMEBUFFER_BINDING:
7059 case GL_RENDERBUFFER_BINDING:
7060 case GL_CURRENT_PROGRAM:
7061 case GL_PACK_ALIGNMENT:
7062 case GL_UNPACK_ALIGNMENT:
7063 case GL_GENERATE_MIPMAP_HINT:
7064 case GL_RED_BITS:
7065 case GL_GREEN_BITS:
7066 case GL_BLUE_BITS:
7067 case GL_ALPHA_BITS:
7068 case GL_DEPTH_BITS:
7069 case GL_STENCIL_BITS:
7070 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7071 case GL_CULL_FACE_MODE:
7072 case GL_FRONT_FACE:
7073 case GL_ACTIVE_TEXTURE:
7074 case GL_STENCIL_FUNC:
7075 case GL_STENCIL_VALUE_MASK:
7076 case GL_STENCIL_REF:
7077 case GL_STENCIL_FAIL:
7078 case GL_STENCIL_PASS_DEPTH_FAIL:
7079 case GL_STENCIL_PASS_DEPTH_PASS:
7080 case GL_STENCIL_BACK_FUNC:
7081 case GL_STENCIL_BACK_VALUE_MASK:
7082 case GL_STENCIL_BACK_REF:
7083 case GL_STENCIL_BACK_FAIL:
7084 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7085 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7086 case GL_DEPTH_FUNC:
7087 case GL_BLEND_SRC_RGB:
7088 case GL_BLEND_SRC_ALPHA:
7089 case GL_BLEND_DST_RGB:
7090 case GL_BLEND_DST_ALPHA:
7091 case GL_BLEND_EQUATION_RGB:
7092 case GL_BLEND_EQUATION_ALPHA:
7093 case GL_STENCIL_WRITEMASK:
7094 case GL_STENCIL_BACK_WRITEMASK:
7095 case GL_STENCIL_CLEAR_VALUE:
7096 case GL_SUBPIXEL_BITS:
7097 case GL_MAX_TEXTURE_SIZE:
7098 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7099 case GL_SAMPLE_BUFFERS:
7100 case GL_SAMPLES:
7101 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7102 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7103 case GL_TEXTURE_BINDING_2D:
7104 case GL_TEXTURE_BINDING_CUBE_MAP:
7105 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7106 {
7107 *type = GL_INT;
7108 *numParams = 1;
7109 return true;
7110 }
7111 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7112 {
7113 if (!getExtensions().packReverseRowOrder)
7114 {
7115 return false;
7116 }
7117 *type = GL_INT;
7118 *numParams = 1;
7119 return true;
7120 }
7121 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7122 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7123 {
7124 if (!getExtensions().textureRectangle)
7125 {
7126 return false;
7127 }
7128 *type = GL_INT;
7129 *numParams = 1;
7130 return true;
7131 }
7132 case GL_MAX_DRAW_BUFFERS_EXT:
7133 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7134 {
7135 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7136 {
7137 return false;
7138 }
7139 *type = GL_INT;
7140 *numParams = 1;
7141 return true;
7142 }
7143 case GL_MAX_VIEWPORT_DIMS:
7144 {
7145 *type = GL_INT;
7146 *numParams = 2;
7147 return true;
7148 }
7149 case GL_VIEWPORT:
7150 case GL_SCISSOR_BOX:
7151 {
7152 *type = GL_INT;
7153 *numParams = 4;
7154 return true;
7155 }
7156 case GL_SHADER_COMPILER:
7157 case GL_SAMPLE_COVERAGE_INVERT:
7158 case GL_DEPTH_WRITEMASK:
7159 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7160 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7161 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7162 // bool-natural
7163 case GL_SAMPLE_COVERAGE:
7164 case GL_SCISSOR_TEST:
7165 case GL_STENCIL_TEST:
7166 case GL_DEPTH_TEST:
7167 case GL_BLEND:
7168 case GL_DITHER:
7169 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7170 {
7171 *type = GL_BOOL;
7172 *numParams = 1;
7173 return true;
7174 }
7175 case GL_COLOR_WRITEMASK:
7176 {
7177 *type = GL_BOOL;
7178 *numParams = 4;
7179 return true;
7180 }
7181 case GL_POLYGON_OFFSET_FACTOR:
7182 case GL_POLYGON_OFFSET_UNITS:
7183 case GL_SAMPLE_COVERAGE_VALUE:
7184 case GL_DEPTH_CLEAR_VALUE:
7185 case GL_LINE_WIDTH:
7186 {
7187 *type = GL_FLOAT;
7188 *numParams = 1;
7189 return true;
7190 }
7191 case GL_ALIASED_LINE_WIDTH_RANGE:
7192 case GL_ALIASED_POINT_SIZE_RANGE:
7193 case GL_DEPTH_RANGE:
7194 {
7195 *type = GL_FLOAT;
7196 *numParams = 2;
7197 return true;
7198 }
7199 case GL_COLOR_CLEAR_VALUE:
7200 case GL_BLEND_COLOR:
7201 {
7202 *type = GL_FLOAT;
7203 *numParams = 4;
7204 return true;
7205 }
7206 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7207 if (!getExtensions().textureFilterAnisotropic)
7208 {
7209 return false;
7210 }
7211 *type = GL_FLOAT;
7212 *numParams = 1;
7213 return true;
7214 case GL_TIMESTAMP_EXT:
7215 if (!getExtensions().disjointTimerQuery)
7216 {
7217 return false;
7218 }
7219 *type = GL_INT_64_ANGLEX;
7220 *numParams = 1;
7221 return true;
7222 case GL_GPU_DISJOINT_EXT:
7223 if (!getExtensions().disjointTimerQuery)
7224 {
7225 return false;
7226 }
7227 *type = GL_INT;
7228 *numParams = 1;
7229 return true;
7230 case GL_COVERAGE_MODULATION_CHROMIUM:
7231 if (!getExtensions().framebufferMixedSamples)
7232 {
7233 return false;
7234 }
7235 *type = GL_INT;
7236 *numParams = 1;
7237 return true;
7238 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7239 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7240 {
7241 return false;
7242 }
7243 *type = GL_INT;
7244 *numParams = 1;
7245 return true;
7246 }
7247
7248 if (getExtensions().debug)
7249 {
7250 switch (pname)
7251 {
7252 case GL_DEBUG_LOGGED_MESSAGES:
7253 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7254 case GL_DEBUG_GROUP_STACK_DEPTH:
7255 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7256 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7257 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7258 case GL_MAX_LABEL_LENGTH:
7259 *type = GL_INT;
7260 *numParams = 1;
7261 return true;
7262
7263 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7264 case GL_DEBUG_OUTPUT:
7265 *type = GL_BOOL;
7266 *numParams = 1;
7267 return true;
7268 }
7269 }
7270
7271 if (getExtensions().multisampleCompatibility)
7272 {
7273 switch (pname)
7274 {
7275 case GL_MULTISAMPLE_EXT:
7276 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7277 *type = GL_BOOL;
7278 *numParams = 1;
7279 return true;
7280 }
7281 }
7282
7283 if (getExtensions().pathRendering)
7284 {
7285 switch (pname)
7286 {
7287 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7288 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7289 *type = GL_FLOAT;
7290 *numParams = 16;
7291 return true;
7292 }
7293 }
7294
7295 if (getExtensions().bindGeneratesResource)
7296 {
7297 switch (pname)
7298 {
7299 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7300 *type = GL_BOOL;
7301 *numParams = 1;
7302 return true;
7303 }
7304 }
7305
7306 if (getExtensions().clientArrays)
7307 {
7308 switch (pname)
7309 {
7310 case GL_CLIENT_ARRAYS_ANGLE:
7311 *type = GL_BOOL;
7312 *numParams = 1;
7313 return true;
7314 }
7315 }
7316
7317 if (getExtensions().sRGBWriteControl)
7318 {
7319 switch (pname)
7320 {
7321 case GL_FRAMEBUFFER_SRGB_EXT:
7322 *type = GL_BOOL;
7323 *numParams = 1;
7324 return true;
7325 }
7326 }
7327
7328 if (getExtensions().robustResourceInitialization &&
7329 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7330 {
7331 *type = GL_BOOL;
7332 *numParams = 1;
7333 return true;
7334 }
7335
7336 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7337 {
7338 *type = GL_BOOL;
7339 *numParams = 1;
7340 return true;
7341 }
7342
jchen1082af6202018-06-22 10:59:52 +08007343 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7344 {
7345 *type = GL_INT;
7346 *numParams = 1;
7347 return true;
7348 }
7349
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007350 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7351 {
7352 *type = GL_INT;
7353 *numParams = 1;
7354 return true;
7355 }
7356
Jamie Madill5b772312018-03-08 20:28:32 -05007357 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7358 switch (pname)
7359 {
7360 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7361 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7362 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7363 {
7364 return false;
7365 }
7366 *type = GL_INT;
7367 *numParams = 1;
7368 return true;
7369
7370 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7371 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7372 {
7373 return false;
7374 }
7375 *type = GL_INT;
7376 *numParams = 1;
7377 return true;
7378
7379 case GL_PROGRAM_BINARY_FORMATS_OES:
7380 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7381 {
7382 return false;
7383 }
7384 *type = GL_INT;
7385 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7386 return true;
7387
7388 case GL_PACK_ROW_LENGTH:
7389 case GL_PACK_SKIP_ROWS:
7390 case GL_PACK_SKIP_PIXELS:
7391 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7392 {
7393 return false;
7394 }
7395 *type = GL_INT;
7396 *numParams = 1;
7397 return true;
7398 case GL_UNPACK_ROW_LENGTH:
7399 case GL_UNPACK_SKIP_ROWS:
7400 case GL_UNPACK_SKIP_PIXELS:
7401 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7402 {
7403 return false;
7404 }
7405 *type = GL_INT;
7406 *numParams = 1;
7407 return true;
7408 case GL_VERTEX_ARRAY_BINDING:
7409 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7410 {
7411 return false;
7412 }
7413 *type = GL_INT;
7414 *numParams = 1;
7415 return true;
7416 case GL_PIXEL_PACK_BUFFER_BINDING:
7417 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7418 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7419 {
7420 return false;
7421 }
7422 *type = GL_INT;
7423 *numParams = 1;
7424 return true;
7425 case GL_MAX_SAMPLES:
7426 {
7427 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7428 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7429 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7430 {
7431 return false;
7432 }
7433 *type = GL_INT;
7434 *numParams = 1;
7435 return true;
7436
7437 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7438 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7439 {
7440 return false;
7441 }
7442 *type = GL_INT;
7443 *numParams = 1;
7444 return true;
7445 }
7446 }
7447
7448 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7449 {
7450 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7451 {
7452 return false;
7453 }
7454 *type = GL_INT;
7455 *numParams = 1;
7456 return true;
7457 }
7458
7459 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7460 {
7461 *type = GL_INT;
7462 *numParams = 1;
7463 return true;
7464 }
7465
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007466 if (getClientVersion() < Version(2, 0))
7467 {
7468 switch (pname)
7469 {
7470 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007471 case GL_CLIENT_ACTIVE_TEXTURE:
7472 case GL_MATRIX_MODE:
7473 case GL_MAX_TEXTURE_UNITS:
7474 case GL_MAX_MODELVIEW_STACK_DEPTH:
7475 case GL_MAX_PROJECTION_STACK_DEPTH:
7476 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007477 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007478 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007479 case GL_VERTEX_ARRAY_STRIDE:
7480 case GL_NORMAL_ARRAY_STRIDE:
7481 case GL_COLOR_ARRAY_STRIDE:
7482 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7483 case GL_VERTEX_ARRAY_SIZE:
7484 case GL_COLOR_ARRAY_SIZE:
7485 case GL_TEXTURE_COORD_ARRAY_SIZE:
7486 case GL_VERTEX_ARRAY_TYPE:
7487 case GL_NORMAL_ARRAY_TYPE:
7488 case GL_COLOR_ARRAY_TYPE:
7489 case GL_TEXTURE_COORD_ARRAY_TYPE:
7490 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7491 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7492 case GL_COLOR_ARRAY_BUFFER_BINDING:
7493 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7494 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7495 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7496 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007497 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007498 case GL_MODELVIEW_STACK_DEPTH:
7499 case GL_PROJECTION_STACK_DEPTH:
7500 case GL_TEXTURE_STACK_DEPTH:
7501 case GL_LOGIC_OP_MODE:
7502 case GL_BLEND_SRC:
7503 case GL_BLEND_DST:
7504 case GL_PERSPECTIVE_CORRECTION_HINT:
7505 case GL_POINT_SMOOTH_HINT:
7506 case GL_LINE_SMOOTH_HINT:
7507 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007508 *type = GL_INT;
7509 *numParams = 1;
7510 return true;
7511 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007512 case GL_FOG_DENSITY:
7513 case GL_FOG_START:
7514 case GL_FOG_END:
7515 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007516 case GL_POINT_SIZE:
7517 case GL_POINT_SIZE_MIN:
7518 case GL_POINT_SIZE_MAX:
7519 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007520 *type = GL_FLOAT;
7521 *numParams = 1;
7522 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007523 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007524 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007525 *type = GL_FLOAT;
7526 *numParams = 2;
7527 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007528 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007529 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007530 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007531 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007532 *type = GL_FLOAT;
7533 *numParams = 4;
7534 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007535 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007536 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007537 *type = GL_FLOAT;
7538 *numParams = 3;
7539 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007540 case GL_MODELVIEW_MATRIX:
7541 case GL_PROJECTION_MATRIX:
7542 case GL_TEXTURE_MATRIX:
7543 *type = GL_FLOAT;
7544 *numParams = 16;
7545 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007546 case GL_LIGHT_MODEL_TWO_SIDE:
7547 *type = GL_BOOL;
7548 *numParams = 1;
7549 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007550 }
7551 }
7552
Jamie Madill5b772312018-03-08 20:28:32 -05007553 if (getClientVersion() < Version(3, 0))
7554 {
7555 return false;
7556 }
7557
7558 // Check for ES3.0+ parameter names
7559 switch (pname)
7560 {
7561 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7562 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7563 case GL_UNIFORM_BUFFER_BINDING:
7564 case GL_TRANSFORM_FEEDBACK_BINDING:
7565 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7566 case GL_COPY_READ_BUFFER_BINDING:
7567 case GL_COPY_WRITE_BUFFER_BINDING:
7568 case GL_SAMPLER_BINDING:
7569 case GL_READ_BUFFER:
7570 case GL_TEXTURE_BINDING_3D:
7571 case GL_TEXTURE_BINDING_2D_ARRAY:
7572 case GL_MAX_3D_TEXTURE_SIZE:
7573 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7574 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7575 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7576 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7577 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7578 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7579 case GL_MAX_VARYING_COMPONENTS:
7580 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7581 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7582 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7583 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7584 case GL_NUM_EXTENSIONS:
7585 case GL_MAJOR_VERSION:
7586 case GL_MINOR_VERSION:
7587 case GL_MAX_ELEMENTS_INDICES:
7588 case GL_MAX_ELEMENTS_VERTICES:
7589 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7590 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7591 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7592 case GL_UNPACK_IMAGE_HEIGHT:
7593 case GL_UNPACK_SKIP_IMAGES:
7594 {
7595 *type = GL_INT;
7596 *numParams = 1;
7597 return true;
7598 }
7599
7600 case GL_MAX_ELEMENT_INDEX:
7601 case GL_MAX_UNIFORM_BLOCK_SIZE:
7602 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7603 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7604 case GL_MAX_SERVER_WAIT_TIMEOUT:
7605 {
7606 *type = GL_INT_64_ANGLEX;
7607 *numParams = 1;
7608 return true;
7609 }
7610
7611 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7612 case GL_TRANSFORM_FEEDBACK_PAUSED:
7613 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7614 case GL_RASTERIZER_DISCARD:
7615 {
7616 *type = GL_BOOL;
7617 *numParams = 1;
7618 return true;
7619 }
7620
7621 case GL_MAX_TEXTURE_LOD_BIAS:
7622 {
7623 *type = GL_FLOAT;
7624 *numParams = 1;
7625 return true;
7626 }
7627 }
7628
7629 if (getExtensions().requestExtension)
7630 {
7631 switch (pname)
7632 {
7633 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7634 *type = GL_INT;
7635 *numParams = 1;
7636 return true;
7637 }
7638 }
7639
7640 if (getClientVersion() < Version(3, 1))
7641 {
7642 return false;
7643 }
7644
7645 switch (pname)
7646 {
7647 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7648 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7649 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7650 case GL_MAX_FRAMEBUFFER_WIDTH:
7651 case GL_MAX_FRAMEBUFFER_HEIGHT:
7652 case GL_MAX_FRAMEBUFFER_SAMPLES:
7653 case GL_MAX_SAMPLE_MASK_WORDS:
7654 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7655 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7656 case GL_MAX_INTEGER_SAMPLES:
7657 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7658 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7659 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7660 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7661 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7662 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7663 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7664 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7665 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7666 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7667 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7668 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7669 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7670 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7671 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7672 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7673 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7674 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7675 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7676 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7677 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7678 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7679 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7680 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7681 case GL_MAX_UNIFORM_LOCATIONS:
7682 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7683 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7684 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7685 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7686 case GL_MAX_IMAGE_UNITS:
7687 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7688 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7689 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7690 case GL_SHADER_STORAGE_BUFFER_BINDING:
7691 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7692 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007693 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007694 *type = GL_INT;
7695 *numParams = 1;
7696 return true;
7697 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7698 *type = GL_INT_64_ANGLEX;
7699 *numParams = 1;
7700 return true;
7701 case GL_SAMPLE_MASK:
7702 *type = GL_BOOL;
7703 *numParams = 1;
7704 return true;
7705 }
7706
7707 if (getExtensions().geometryShader)
7708 {
7709 switch (pname)
7710 {
7711 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7712 case GL_LAYER_PROVOKING_VERTEX_EXT:
7713 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7714 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7715 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7716 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7717 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7718 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7719 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7720 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7721 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7722 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7723 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7724 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7725 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7726 *type = GL_INT;
7727 *numParams = 1;
7728 return true;
7729 }
7730 }
7731
7732 return false;
7733}
7734
7735bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7736{
7737 if (getClientVersion() < Version(3, 0))
7738 {
7739 return false;
7740 }
7741
7742 switch (target)
7743 {
7744 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7745 case GL_UNIFORM_BUFFER_BINDING:
7746 {
7747 *type = GL_INT;
7748 *numParams = 1;
7749 return true;
7750 }
7751 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7752 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7753 case GL_UNIFORM_BUFFER_START:
7754 case GL_UNIFORM_BUFFER_SIZE:
7755 {
7756 *type = GL_INT_64_ANGLEX;
7757 *numParams = 1;
7758 return true;
7759 }
7760 }
7761
7762 if (getClientVersion() < Version(3, 1))
7763 {
7764 return false;
7765 }
7766
7767 switch (target)
7768 {
7769 case GL_IMAGE_BINDING_LAYERED:
7770 {
7771 *type = GL_BOOL;
7772 *numParams = 1;
7773 return true;
7774 }
7775 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7776 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7777 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7778 case GL_SHADER_STORAGE_BUFFER_BINDING:
7779 case GL_VERTEX_BINDING_BUFFER:
7780 case GL_VERTEX_BINDING_DIVISOR:
7781 case GL_VERTEX_BINDING_OFFSET:
7782 case GL_VERTEX_BINDING_STRIDE:
7783 case GL_SAMPLE_MASK_VALUE:
7784 case GL_IMAGE_BINDING_NAME:
7785 case GL_IMAGE_BINDING_LEVEL:
7786 case GL_IMAGE_BINDING_LAYER:
7787 case GL_IMAGE_BINDING_ACCESS:
7788 case GL_IMAGE_BINDING_FORMAT:
7789 {
7790 *type = GL_INT;
7791 *numParams = 1;
7792 return true;
7793 }
7794 case GL_ATOMIC_COUNTER_BUFFER_START:
7795 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7796 case GL_SHADER_STORAGE_BUFFER_START:
7797 case GL_SHADER_STORAGE_BUFFER_SIZE:
7798 {
7799 *type = GL_INT_64_ANGLEX;
7800 *numParams = 1;
7801 return true;
7802 }
7803 }
7804
7805 return false;
7806}
7807
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007808Program *Context::getProgramResolveLink(GLuint handle) const
7809{
7810 Program *program = mState.mShaderPrograms->getProgram(handle);
7811 if (program)
7812 {
Jamie Madill785e8a02018-10-04 17:42:00 -04007813 program->resolveLink(this);
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007814 }
7815 return program;
7816}
7817
7818Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007819{
7820 return mState.mShaderPrograms->getProgram(handle);
7821}
7822
7823Shader *Context::getShader(GLuint handle) const
7824{
7825 return mState.mShaderPrograms->getShader(handle);
7826}
7827
Jamie Madill5b772312018-03-08 20:28:32 -05007828bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7829{
7830 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7831}
7832
7833bool Context::isFramebufferGenerated(GLuint framebuffer) const
7834{
7835 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7836}
7837
7838bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7839{
7840 return mState.mPipelines->isHandleGenerated(pipeline);
7841}
7842
7843bool Context::usingDisplayTextureShareGroup() const
7844{
7845 return mDisplayTextureShareGroup;
7846}
7847
7848GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7849{
7850 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7851 internalformat == GL_DEPTH_STENCIL
7852 ? GL_DEPTH24_STENCIL8
7853 : internalformat;
7854}
7855
jchen1082af6202018-06-22 10:59:52 +08007856void Context::maxShaderCompilerThreads(GLuint count)
7857{
jchen107ae70d82018-07-06 13:47:01 +08007858 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007859 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007860 // A count of zero specifies a request for no parallel compiling or linking.
7861 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7862 {
7863 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7864 }
7865 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007866}
7867
Jamie Madill2eb65032018-07-30 10:25:57 -04007868bool Context::isGLES1() const
7869{
7870 return mState.getClientVersion() < Version(2, 0);
7871}
7872
Jamie Madilla11819d2018-07-30 10:26:01 -04007873void Context::onSubjectStateChange(const Context *context,
7874 angle::SubjectIndex index,
7875 angle::SubjectMessage message)
7876{
Jamie Madilla11819d2018-07-30 10:26:01 -04007877 switch (index)
7878 {
7879 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007880 switch (message)
7881 {
7882 case angle::SubjectMessage::CONTENTS_CHANGED:
7883 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7884 mStateCache.onVertexArrayBufferContentsChange(this);
7885 break;
7886 case angle::SubjectMessage::RESOURCE_MAPPED:
7887 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7888 case angle::SubjectMessage::BINDING_CHANGED:
7889 mStateCache.onVertexArrayBufferStateChange(this);
7890 break;
7891 default:
7892 break;
7893 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007894 break;
7895
7896 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007897 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7898 {
7899 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7900 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007901 break;
7902
7903 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007904 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7905 {
7906 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7907 }
7908 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007909 break;
7910
7911 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007912 if (index < kTextureMaxSubjectIndex)
7913 {
7914 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007915 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007916 }
Jamie Madille25b8002018-09-20 13:39:49 -04007917 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007918 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007919 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007920 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007921 }
Jamie Madille25b8002018-09-20 13:39:49 -04007922 else
7923 {
7924 ASSERT(index < kSamplerMaxSubjectIndex);
7925 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7926 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007927 break;
7928 }
7929}
7930
Jamie Madill6b873dd2018-07-12 23:56:30 -04007931// ErrorSet implementation.
7932ErrorSet::ErrorSet(Context *context) : mContext(context)
7933{
7934}
7935
7936ErrorSet::~ErrorSet() = default;
7937
Jamie Madill306b6c12018-07-27 08:12:49 -04007938void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007939{
7940 // This internal enum is used to filter internal errors that are already handled.
7941 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7942 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7943 {
7944 return;
7945 }
7946
7947 if (ANGLE_UNLIKELY(error.isError()))
7948 {
7949 GLenum code = error.getCode();
7950 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007951
Jamie Madill6b873dd2018-07-12 23:56:30 -04007952 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7953 {
7954 mContext->markContextLost();
7955 }
7956
7957 ASSERT(!error.getMessage().empty());
7958 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7959 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7960 error.getMessage());
7961 }
7962}
7963
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007964void ErrorSet::handleError(GLenum errorCode,
7965 const char *message,
7966 const char *file,
7967 const char *function,
7968 unsigned int line)
7969{
7970 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7971 std::stringstream errorStream;
7972 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7973 << function << ":" << line << ". " << message;
7974
7975 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
7976}
7977
Jamie Madill6b873dd2018-07-12 23:56:30 -04007978bool ErrorSet::empty() const
7979{
7980 return mErrors.empty();
7981}
7982
7983GLenum ErrorSet::popError()
7984{
7985 ASSERT(!empty());
7986 GLenum error = *mErrors.begin();
7987 mErrors.erase(mErrors.begin());
7988 return error;
7989}
Jamie Madilldc358af2018-07-31 11:22:13 -04007990
7991// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04007992StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04007993 : mCachedHasAnyEnabledClientAttrib(false),
7994 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04007995 mCachedInstancedVertexElementLimit(0),
7996 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04007997{
7998}
7999
8000StateCache::~StateCache() = default;
8001
Jamie Madillac66f982018-10-09 18:30:01 -04008002void StateCache::initialize(Context *context)
8003{
8004 updateValidDrawModes(context);
8005 updateValidBindTextureTypes(context);
8006}
8007
Jamie Madilldc358af2018-07-31 11:22:13 -04008008void StateCache::updateActiveAttribsMask(Context *context)
8009{
8010 bool isGLES1 = context->isGLES1();
8011 const State &glState = context->getGLState();
8012
8013 if (!isGLES1 && !glState.getProgram())
8014 {
8015 mCachedActiveBufferedAttribsMask = AttributesMask();
8016 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008017 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008018 return;
8019 }
8020
8021 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8022 : glState.getProgram()->getActiveAttribLocationsMask();
8023
8024 const VertexArray *vao = glState.getVertexArray();
8025 ASSERT(vao);
8026
8027 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8028 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008029 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008030
Jamie Madill0a17e482018-08-31 17:19:11 -04008031 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8032 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008033 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008034 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8035}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008036
8037void StateCache::updateVertexElementLimits(Context *context)
8038{
8039 const VertexArray *vao = context->getGLState().getVertexArray();
8040
8041 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8042 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8043
8044 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8045 // If there are no buffered attributes then we should not limit the draw call count.
8046 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8047 {
8048 return;
8049 }
8050
8051 const auto &vertexAttribs = vao->getVertexAttributes();
8052 const auto &vertexBindings = vao->getVertexBindings();
8053
8054 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8055 {
8056 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8057 ASSERT(attrib.enabled);
8058
8059 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8060 ASSERT(context->isGLES1() ||
8061 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8062
8063 GLint64 limit = attrib.getCachedElementLimit();
8064 if (binding.getDivisor() > 0)
8065 {
8066 mCachedInstancedVertexElementLimit =
8067 std::min(mCachedInstancedVertexElementLimit, limit);
8068 }
8069 else
8070 {
8071 mCachedNonInstancedVertexElementLimit =
8072 std::min(mCachedNonInstancedVertexElementLimit, limit);
8073 }
8074 }
8075}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008076
Jamie Madilld84b6732018-09-06 15:54:35 -04008077void StateCache::updateBasicDrawStatesError()
8078{
8079 mCachedBasicDrawStatesError = kInvalidPointer;
8080}
8081
8082intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8083{
8084 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8085 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8086 return mCachedBasicDrawStatesError;
8087}
8088
Jamie Madillc43cdad2018-08-08 15:49:25 -04008089void StateCache::onVertexArrayBindingChange(Context *context)
8090{
8091 updateActiveAttribsMask(context);
8092 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008093 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008094}
8095
8096void StateCache::onProgramExecutableChange(Context *context)
8097{
8098 updateActiveAttribsMask(context);
8099 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008100 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008101 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008102}
8103
Jamie Madilld84b6732018-09-06 15:54:35 -04008104void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008105{
8106 updateVertexElementLimits(context);
8107}
8108
Jamie Madilld84b6732018-09-06 15:54:35 -04008109void StateCache::onVertexArrayBufferContentsChange(Context *context)
8110{
8111 updateVertexElementLimits(context);
8112 updateBasicDrawStatesError();
8113}
8114
Jamie Madillc43cdad2018-08-08 15:49:25 -04008115void StateCache::onVertexArrayStateChange(Context *context)
8116{
8117 updateActiveAttribsMask(context);
8118 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008119 updateBasicDrawStatesError();
8120}
8121
8122void StateCache::onVertexArrayBufferStateChange(Context *context)
8123{
8124 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008125}
8126
8127void StateCache::onGLES1ClientStateChange(Context *context)
8128{
8129 updateActiveAttribsMask(context);
8130}
Jamie Madilld84b6732018-09-06 15:54:35 -04008131
8132void StateCache::onDrawFramebufferChange(Context *context)
8133{
8134 updateBasicDrawStatesError();
8135}
8136
8137void StateCache::onContextCapChange(Context *context)
8138{
8139 updateBasicDrawStatesError();
8140}
8141
8142void StateCache::onStencilStateChange(Context *context)
8143{
8144 updateBasicDrawStatesError();
8145}
8146
8147void StateCache::onDefaultVertexAttributeChange(Context *context)
8148{
8149 updateBasicDrawStatesError();
8150}
8151
8152void StateCache::onActiveTextureChange(Context *context)
8153{
8154 updateBasicDrawStatesError();
8155}
8156
8157void StateCache::onQueryChange(Context *context)
8158{
8159 updateBasicDrawStatesError();
8160}
8161
8162void StateCache::onTransformFeedbackChange(Context *context)
8163{
8164 updateBasicDrawStatesError();
8165}
8166
8167void StateCache::onUniformBufferStateChange(Context *context)
8168{
8169 updateBasicDrawStatesError();
8170}
8171
8172void StateCache::onBufferBindingChange(Context *context)
8173{
8174 updateBasicDrawStatesError();
8175}
Jamie Madill526a6f62018-09-12 11:03:05 -04008176
8177void StateCache::updateValidDrawModes(Context *context)
8178{
8179 Program *program = context->getGLState().getProgram();
8180 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8181 {
8182 mCachedValidDrawModes = {{
8183 true, /* Points */
8184 true, /* Lines */
8185 true, /* LineLoop */
8186 true, /* LineStrip */
8187 true, /* Triangles */
8188 true, /* TriangleStrip */
8189 true, /* TriangleFan */
8190 false, /* LinesAdjacency */
8191 false, /* LineStripAdjacency */
8192 false, /* TrianglesAdjacency */
8193 false, /* TriangleStripAdjacency */
8194 false, /* InvalidEnum */
8195 }};
8196 }
8197 else
8198 {
8199 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8200
8201 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8202
8203 mCachedValidDrawModes = {{
8204 gsMode == PrimitiveMode::Points, /* Points */
8205 gsMode == PrimitiveMode::Lines, /* Lines */
8206 gsMode == PrimitiveMode::Lines, /* LineLoop */
8207 gsMode == PrimitiveMode::Lines, /* LineStrip */
8208 gsMode == PrimitiveMode::Triangles, /* Triangles */
8209 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8210 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8211 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8212 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8213 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8214 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8215 false, /* InvalidEnum */
8216 }};
8217 }
8218}
Jamie Madillac66f982018-10-09 18:30:01 -04008219
8220void StateCache::updateValidBindTextureTypes(Context *context)
8221{
8222 const Extensions &exts = context->getExtensions();
8223 bool isGLES3 = context->getClientMajorVersion() >= 3;
8224 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8225
8226 mCachedValidBindTextureTypes = {{
8227 true, /* _2D */
8228 isGLES3, /* _2DArray */
8229 isGLES31, /* _2DMultisample */
8230 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8231 isGLES3, /* _3D */
8232 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8233 exts.textureRectangle, /* Rectangle */
8234 true, /* CubeMap */
8235 false, /* InvalidEnum */
8236
8237 }};
8238}
Jamie Madillc29968b2016-01-20 11:17:23 -05008239} // namespace gl