blob: 902d903c060d8623d26b8dbb938193e7bcf4d5ba [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Geoff Langf6db0982015-08-25 13:04:00 -040050namespace
51{
52
Jamie Madillb6664922017-07-25 12:55:04 -040053#define ANGLE_HANDLE_ERR(X) \
54 handleError(X); \
55 return;
56#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
57
Ian Ewell3ffd78b2016-01-22 16:09:42 -050058template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050059std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030060 GLsizei numPaths,
61 const void *paths,
62 GLuint pathBase)
63{
64 std::vector<gl::Path *> ret;
65 ret.reserve(numPaths);
66
67 const auto *nameArray = static_cast<const T *>(paths);
68
69 for (GLsizei i = 0; i < numPaths; ++i)
70 {
71 const GLuint pathName = nameArray[i] + pathBase;
72
73 ret.push_back(resourceManager.getPath(pathName));
74 }
75
76 return ret;
77}
78
Geoff Lang4ddf5af2016-12-01 14:30:44 -050079std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030080 GLsizei numPaths,
81 GLenum pathNameType,
82 const void *paths,
83 GLuint pathBase)
84{
85 switch (pathNameType)
86 {
87 case GL_UNSIGNED_BYTE:
88 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_BYTE:
91 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_UNSIGNED_SHORT:
94 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_SHORT:
97 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_UNSIGNED_INT:
100 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
101
102 case GL_INT:
103 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
104 }
105
106 UNREACHABLE();
107 return std::vector<gl::Path *>();
108}
109
110template <typename T>
Jamie Madill5188a272018-07-25 10:53:56 -0400111gl::Error GetQueryObjectParameter(const gl::Context *context,
112 gl::Query *query,
113 GLenum pname,
114 T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115{
Geoff Lang2186c382016-10-14 10:54:54 -0400116 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500117
118 switch (pname)
119 {
120 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400121 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500122 case GL_QUERY_RESULT_AVAILABLE_EXT:
123 {
124 bool available;
Jamie Madill5188a272018-07-25 10:53:56 -0400125 gl::Error error = query->isResultAvailable(context, &available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 if (!error.isError())
127 {
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130 return error;
131 }
132 default:
133 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500134 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500135 }
136}
137
Jamie Madill956ab4d2018-10-10 16:13:03 -0400138ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const gl::Context *context,
139 gl::TransformFeedback *transformFeedback,
140 GLsizei count,
141 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400142{
Geoff Lang1a683462015-09-29 15:09:59 -0400143 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400144 {
Jamie Madill09463932018-04-04 05:26:59 -0400145 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800167 EGLAttrib attrib =
168 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
Jamie Madill4230d482018-09-14 10:14:45 -0400201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400202}
203
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400204bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
205{
206 // If the context is WebGL, extensions are disabled by default
207 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
208 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
209}
210
Geoff Langf41a7152016-09-19 15:11:17 -0400211bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
212{
Jamie Madill4230d482018-09-14 10:14:45 -0400213 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400214}
215
Geoff Langfeb8c682017-02-13 16:07:35 -0500216bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
219}
220
Geoff Langb433e872017-10-05 14:01:47 -0400221bool GetRobustResourceInit(const egl::AttributeMap &attribs)
222{
223 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
224}
225
Martin Radev9d901792016-07-15 15:58:58 +0300226std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
227{
228 std::string labelName;
229 if (label != nullptr)
230 {
231 size_t labelLength = length < 0 ? strlen(label) : length;
232 labelName = std::string(label, labelLength);
233 }
234 return labelName;
235}
236
237void GetObjectLabelBase(const std::string &objectLabel,
238 GLsizei bufSize,
239 GLsizei *length,
240 GLchar *label)
241{
242 size_t writeLength = objectLabel.length();
243 if (label != nullptr && bufSize > 0)
244 {
245 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
246 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
247 label[writeLength] = '\0';
248 }
249
250 if (length != nullptr)
251 {
252 *length = static_cast<GLsizei>(writeLength);
253 }
254}
255
Jamie Madill0f80ed82017-09-19 00:24:56 -0400256template <typename CapT, typename MaxT>
257void LimitCap(CapT *cap, MaxT maximum)
258{
259 *cap = std::min(*cap, static_cast<CapT>(maximum));
260}
261
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600262constexpr angle::PackedEnumMap<gl::PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
Jamie Madill526a6f62018-09-12 11:03:05 -0400263 1, /* Points */
264 2, /* Lines */
265 2, /* LineLoop */
266 2, /* LineStrip */
267 3, /* Triangles */
268 3, /* TriangleStrip */
269 3, /* TriangleFan */
270 2, /* LinesAdjacency */
271 2, /* LineStripAdjacency */
272 3, /* TrianglesAdjacency */
273 3, /* TriangleStripAdjacency */
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600274}};
275// Indices above are code-gen'd so make sure they don't change
276// if any of these static asserts are hit, must update kMinimumPrimitiveCounts abouve
277static_assert(static_cast<gl::PrimitiveMode>(0) == gl::PrimitiveMode::Points,
278 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
279static_assert(static_cast<gl::PrimitiveMode>(1) == gl::PrimitiveMode::Lines,
280 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
281static_assert(static_cast<gl::PrimitiveMode>(2) == gl::PrimitiveMode::LineLoop,
282 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
283static_assert(static_cast<gl::PrimitiveMode>(3) == gl::PrimitiveMode::LineStrip,
284 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
285static_assert(static_cast<gl::PrimitiveMode>(4) == gl::PrimitiveMode::Triangles,
286 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
287static_assert(static_cast<gl::PrimitiveMode>(5) == gl::PrimitiveMode::TriangleStrip,
288 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
289static_assert(static_cast<gl::PrimitiveMode>(6) == gl::PrimitiveMode::TriangleFan,
290 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
291static_assert(static_cast<gl::PrimitiveMode>(7) == gl::PrimitiveMode::LinesAdjacency,
292 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
293static_assert(static_cast<gl::PrimitiveMode>(8) == gl::PrimitiveMode::LineStripAdjacency,
294 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
295static_assert(static_cast<gl::PrimitiveMode>(9) == gl::PrimitiveMode::TrianglesAdjacency,
296 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
297static_assert(static_cast<gl::PrimitiveMode>(10) == gl::PrimitiveMode::TriangleStripAdjacency,
298 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
299static_assert(static_cast<gl::PrimitiveMode>(11) == gl::PrimitiveMode::EnumCount,
300 "gl::PrimitiveMode enum values have changed, update kMinimumPrimitiveCounts.");
301
Jamie Madill6d32cef2018-08-14 02:34:28 -0400302enum SubjectIndexes : angle::SubjectIndex
303{
304 kTexture0SubjectIndex = 0,
305 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
306 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
307 kUniformBufferMaxSubjectIndex =
308 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400309 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
310 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
311 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400312 kReadFramebufferSubjectIndex,
313 kDrawFramebufferSubjectIndex
314};
Geoff Langf6db0982015-08-25 13:04:00 -0400315} // anonymous namespace
316
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317namespace gl
318{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000319
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400320Context::Context(rx::EGLImplFactory *implFactory,
321 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400322 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500323 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400324 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500325 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700326 const egl::DisplayExtensions &displayExtensions,
327 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500328 : mState(reinterpret_cast<ContextID>(this),
329 shareContext ? &shareContext->mState : nullptr,
330 shareTextures,
331 GetClientVersion(attribs),
332 &mGLState,
333 mCaps,
334 mTextureCaps,
335 mExtensions,
336 mLimitations),
337 mSkipValidation(GetNoError(attribs)),
338 mDisplayTextureShareGroup(shareTextures != nullptr),
339 mSavedArgsType(nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400340 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400341 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400342 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState(GetDebug(attribs),
344 GetBindGeneratesResource(attribs),
345 GetClientArraysEnabled(attribs),
346 GetRobustResourceInit(attribs),
347 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400348 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500349 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400350 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500351 mHasBeenCurrent(false),
352 mContextLost(false),
353 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700354 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500355 mResetStrategy(GetResetStrategy(attribs)),
356 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400357 mSurfacelessSupported(displayExtensions.surfacelessContext),
358 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400359 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
360 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500361 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400362 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400363 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400364 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
365 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
366 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400367 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800368 mZeroFilledBuffer(1000u),
369 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000370{
Jamie Madill5b772312018-03-08 20:28:32 -0500371 // Needed to solve a Clang warning of unused variables.
Jamie Madillc6dbc252018-04-30 19:07:56 -0400372 ANGLE_UNUSED_VARIABLE(mSavedArgsType);
373 ANGLE_UNUSED_VARIABLE(mParamsBuffer);
Jamie Madill6d32cef2018-08-14 02:34:28 -0400374
375 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
376 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
377 {
378 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
379 }
Jamie Madille25b8002018-09-20 13:39:49 -0400380
381 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
382 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
383 {
384 mSamplerObserverBindings.emplace_back(this, samplerIndex);
385 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400386}
Jamie Madill5b772312018-03-08 20:28:32 -0500387
Geoff Lang33f11fb2018-05-07 13:42:47 -0400388void Context::initialize()
389{
390 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400391
Geoff Lang33f11fb2018-05-07 13:42:47 -0400392 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700393 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400394
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400395 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100396
Shannon Woods53a94a82014-06-24 15:20:36 -0400397 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400398
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000399 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400400 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000401 // and cube map texture state vectors respectively associated with them.
402 // In order that access to these initial textures not be lost, they are treated as texture
403 // objects all of whose names are 0.
404
Corentin Wallez99d492c2018-02-27 15:17:10 -0500405 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800406 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500407
Corentin Wallez99d492c2018-02-27 15:17:10 -0500408 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800409 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400410
Geoff Langeb66a6e2016-10-31 13:06:12 -0400411 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400412 {
413 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500414 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800415 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400416
Corentin Wallez99d492c2018-02-27 15:17:10 -0500417 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800418 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400419 }
Geoff Lang3b573612016-10-31 14:08:10 -0400420 if (getClientVersion() >= Version(3, 1))
421 {
Olli Etuahod310a432018-08-24 15:40:23 +0300422 // TODO(http://anglebug.com/2775): These could also be enabled via extension
Geoff Lang3b573612016-10-31 14:08:10 -0400423 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500424 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800425 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Olli Etuahod310a432018-08-24 15:40:23 +0300426 Texture *zeroTexture2DMultisampleArray =
427 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
428 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800429
Jiajia Qin6eafb042016-12-27 17:04:07 +0800430 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
431 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800432 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800433 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800434
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800435 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
436 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400437 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800438 }
Geoff Lang3b573612016-10-31 14:08:10 -0400439 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000440
Geoff Langb0f917f2017-12-05 13:41:54 -0500441 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400442 {
443 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500444 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800445 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400446 }
447
Geoff Langb0f917f2017-12-05 13:41:54 -0500448 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400449 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500450 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800451 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400452 }
453
Jamie Madill4928b7c2017-06-20 12:57:39 -0400454 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500455
Jamie Madill57a89722013-07-02 11:57:03 -0400456 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000457
Geoff Langeb66a6e2016-10-31 13:06:12 -0400458 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400459 {
460 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
461 // In the initial state, a default transform feedback object is bound and treated as
462 // a transform feedback object with a name of zero. That object is bound any time
463 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400464 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400465 }
Geoff Langc8058452014-02-03 12:04:11 -0500466
Corentin Wallez336129f2017-10-17 15:55:40 -0400467 for (auto type : angle::AllEnums<BufferBinding>())
468 {
469 bindBuffer(type, 0);
470 }
471
472 bindRenderbuffer(GL_RENDERBUFFER, 0);
473
474 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
475 {
476 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
477 }
478
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700479 // Initialize GLES1 renderer if appropriate.
480 if (getClientVersion() < Version(2, 0))
481 {
482 mGLES1Renderer.reset(new GLES1Renderer());
483 }
484
Jamie Madillad9f24e2016-02-12 09:27:24 -0500485 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400486 mAllDirtyBits.set();
487
Geoff Lang9bf86f02018-07-26 11:46:34 -0400488 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
489 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
490 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400491 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400492 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400493
494 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
495 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
496 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400497 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400498
Jamie Madillc67323a2017-11-02 23:11:41 -0400499 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500500 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500501 // No dirty objects.
502
503 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400504 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500505 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400506 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500507 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
508
509 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
510 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
511 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
512 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
513 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
514 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
515 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
516 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
517 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
518 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
519 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400520 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500521 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
522
523 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
524 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700525 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400526 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
527 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500528 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
529 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400530
Xinghua Cao10a4d432017-11-28 14:46:26 +0800531 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800532 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
533 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800534 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
535 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
536 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
537 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800538 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800539 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800540 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400541 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400542 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800543
Jamie Madillb4927eb2018-07-16 11:39:46 -0400544 mImplementation->setErrorSet(&mErrors);
545
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400546 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547}
548
Jamie Madill4928b7c2017-06-20 12:57:39 -0400549egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000550{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700551 if (mGLES1Renderer)
552 {
553 mGLES1Renderer->onDestroy(this, &mGLState);
554 }
555
Jamie Madille7b3fe22018-04-05 09:42:46 -0400556 // Delete the Surface first to trigger a finish() in Vulkan.
Jamie Madille7b3fe22018-04-05 09:42:46 -0400557 ANGLE_TRY(releaseSurface(display));
558
Corentin Wallez80b24112015-08-25 16:41:57 -0400559 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000560 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400561 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400563 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000564
Corentin Wallez80b24112015-08-25 16:41:57 -0400565 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000566 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400567 if (query.second != nullptr)
568 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400569 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400570 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000571 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400572 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000573
Corentin Wallez80b24112015-08-25 16:41:57 -0400574 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400575 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400576 if (vertexArray.second)
577 {
578 vertexArray.second->onDestroy(this);
579 }
Jamie Madill57a89722013-07-02 11:57:03 -0400580 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400581 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400582
Corentin Wallez80b24112015-08-25 16:41:57 -0400583 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500584 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500585 if (transformFeedback.second != nullptr)
586 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500587 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500588 }
Geoff Langc8058452014-02-03 12:04:11 -0500589 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400590 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500591
Jamie Madill5b772312018-03-08 20:28:32 -0500592 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400593 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800594 if (zeroTexture.get() != nullptr)
595 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400596 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800597 zeroTexture.set(this, nullptr);
598 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400599 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000600
Jamie Madill2f348d22017-06-05 10:50:59 -0400601 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500602
Jamie Madill4928b7c2017-06-20 12:57:39 -0400603 mGLState.reset(this);
604
Jamie Madill6c1f6712017-02-14 19:08:04 -0500605 mState.mBuffers->release(this);
606 mState.mShaderPrograms->release(this);
607 mState.mTextures->release(this);
608 mState.mRenderbuffers->release(this);
609 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400610 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500611 mState.mPaths->release(this);
612 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800613 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400614
jchen107ae70d82018-07-06 13:47:01 +0800615 mThreadPool.reset();
616
Jamie Madill76e471e2017-10-21 09:56:01 -0400617 mImplementation->onDestroy(this);
618
Jamie Madill4928b7c2017-06-20 12:57:39 -0400619 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000620}
621
Jamie Madill70ee0f62017-02-06 16:04:20 -0500622Context::~Context()
623{
624}
625
Geoff Lang75359662018-04-11 01:42:27 -0400626void Context::setLabel(EGLLabelKHR label)
627{
628 mLabel = label;
629}
630
631EGLLabelKHR Context::getLabel() const
632{
633 return mLabel;
634}
635
Jamie Madill4928b7c2017-06-20 12:57:39 -0400636egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000637{
Jamie Madill61e16b42017-06-19 11:13:23 -0400638 mCurrentDisplay = display;
639
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000640 if (!mHasBeenCurrent)
641 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400642 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500644 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400645 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646
Corentin Wallezc295e512017-01-27 17:47:50 -0500647 int width = 0;
648 int height = 0;
649 if (surface != nullptr)
650 {
651 width = surface->getWidth();
652 height = surface->getHeight();
653 }
654
655 mGLState.setViewportParams(0, 0, width, height);
656 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000657
658 mHasBeenCurrent = true;
659 }
660
Jamie Madill1b94d432015-08-07 13:23:23 -0400661 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700662 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400663 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400664
Jamie Madill4928b7c2017-06-20 12:57:39 -0400665 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500666
667 Framebuffer *newDefault = nullptr;
668 if (surface != nullptr)
669 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400670 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500671 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400672 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500673 }
674 else
675 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400676 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500677 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000678
Corentin Wallez37c39792015-08-20 14:19:46 -0400679 // Update default framebuffer, the binding of the previous default
680 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400681 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400682 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700683 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400684 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400685 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400686 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700687 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400688 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400689 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400690 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400691 }
Ian Ewell292f0052016-02-04 10:37:32 -0500692
Jamie Madill32643ce2018-10-19 11:38:03 -0400693 // Notify the renderer of a context switch.
694 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
695 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400696 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000697}
698
Jamie Madill4928b7c2017-06-20 12:57:39 -0400699egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400700{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400701 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400702
Geoff Langbf7b95d2018-05-01 16:48:21 -0400703 // Remove the default framebuffer
704 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500705 {
706 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400707 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500708 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400709
710 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500711 {
712 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400713 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500714 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400715
716 if (defaultFramebuffer)
717 {
718 defaultFramebuffer->onDestroy(this);
719 delete defaultFramebuffer;
720 }
721
Corentin Wallezc295e512017-01-27 17:47:50 -0500722 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
723
724 if (mCurrentSurface)
725 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400726 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500727 mCurrentSurface = nullptr;
728 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400729
730 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400731}
732
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000733GLuint Context::createBuffer()
734{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500735 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000736}
737
738GLuint Context::createProgram()
739{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500740 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000741}
742
Jiawei Shao385b3e02018-03-21 09:43:28 +0800743GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500745 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000746}
747
748GLuint Context::createTexture()
749{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500750 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000751}
752
753GLuint Context::createRenderbuffer()
754{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500755 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000756}
757
Jamie Madill13951342018-09-30 15:24:28 -0400758void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
759{
760 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(mImplementation.get(), range, createdOut));
761}
762
Brandon Jones59770802018-04-02 13:18:42 -0700763GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300764{
Jamie Madill13951342018-09-30 15:24:28 -0400765 GLuint created = 0;
766 tryGenPaths(range, &created);
767 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300768}
769
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000770// Returns an unused framebuffer name
771GLuint Context::createFramebuffer()
772{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500773 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774}
775
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500776void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000777{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500778 for (int i = 0; i < n; i++)
779 {
780 GLuint handle = mFenceNVHandleAllocator.allocate();
781 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
782 fences[i] = handle;
783 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000784}
785
Yunchao Hea336b902017-08-02 16:05:21 +0800786GLuint Context::createProgramPipeline()
787{
788 return mState.mPipelines->createProgramPipeline();
789}
790
Jiawei Shao385b3e02018-03-21 09:43:28 +0800791GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800792{
793 UNIMPLEMENTED();
794 return 0u;
795}
796
James Darpinian4d9d4832018-03-13 12:43:28 -0700797void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000798{
James Darpinian4d9d4832018-03-13 12:43:28 -0700799 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
800 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000801 {
802 detachBuffer(buffer);
803 }
Jamie Madill893ab082014-05-16 16:56:10 -0400804
James Darpinian4d9d4832018-03-13 12:43:28 -0700805 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806}
807
808void Context::deleteShader(GLuint shader)
809{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500810 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000811}
812
813void Context::deleteProgram(GLuint program)
814{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500815 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000816}
817
818void Context::deleteTexture(GLuint texture)
819{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500820 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000821 {
822 detachTexture(texture);
823 }
824
Jamie Madill6c1f6712017-02-14 19:08:04 -0500825 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000826}
827
828void Context::deleteRenderbuffer(GLuint renderbuffer)
829{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500830 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000831 {
832 detachRenderbuffer(renderbuffer);
833 }
Jamie Madill893ab082014-05-16 16:56:10 -0400834
Jamie Madill6c1f6712017-02-14 19:08:04 -0500835 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000836}
837
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400838void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400839{
840 // The spec specifies the underlying Fence object is not deleted until all current
841 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
842 // and since our API is currently designed for being called from a single thread, we can delete
843 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400844 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400845}
846
Yunchao Hea336b902017-08-02 16:05:21 +0800847void Context::deleteProgramPipeline(GLuint pipeline)
848{
849 if (mState.mPipelines->getProgramPipeline(pipeline))
850 {
851 detachProgramPipeline(pipeline);
852 }
853
854 mState.mPipelines->deleteObject(this, pipeline);
855}
856
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857void Context::deletePaths(GLuint first, GLsizei range)
858{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500859 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300860}
861
Brandon Jones59770802018-04-02 13:18:42 -0700862bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300863{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500864 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300865 if (pathObj == nullptr)
866 return false;
867
868 return pathObj->hasPathData();
869}
870
Brandon Jones59770802018-04-02 13:18:42 -0700871bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300872{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500873 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300874}
875
Brandon Jones59770802018-04-02 13:18:42 -0700876void Context::pathCommands(GLuint path,
877 GLsizei numCommands,
878 const GLubyte *commands,
879 GLsizei numCoords,
880 GLenum coordType,
881 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300882{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500883 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300884
885 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
886}
887
Jamie Madill007530e2017-12-28 14:27:04 -0500888void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300889{
Jamie Madill007530e2017-12-28 14:27:04 -0500890 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300891
892 switch (pname)
893 {
894 case GL_PATH_STROKE_WIDTH_CHROMIUM:
895 pathObj->setStrokeWidth(value);
896 break;
897 case GL_PATH_END_CAPS_CHROMIUM:
898 pathObj->setEndCaps(static_cast<GLenum>(value));
899 break;
900 case GL_PATH_JOIN_STYLE_CHROMIUM:
901 pathObj->setJoinStyle(static_cast<GLenum>(value));
902 break;
903 case GL_PATH_MITER_LIMIT_CHROMIUM:
904 pathObj->setMiterLimit(value);
905 break;
906 case GL_PATH_STROKE_BOUND_CHROMIUM:
907 pathObj->setStrokeBound(value);
908 break;
909 default:
910 UNREACHABLE();
911 break;
912 }
913}
914
Jamie Madill007530e2017-12-28 14:27:04 -0500915void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300916{
Jamie Madill007530e2017-12-28 14:27:04 -0500917 // TODO(jmadill): Should use proper clamping/casting.
918 pathParameterf(path, pname, static_cast<GLfloat>(value));
919}
920
921void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
922{
923 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300924
925 switch (pname)
926 {
927 case GL_PATH_STROKE_WIDTH_CHROMIUM:
928 *value = pathObj->getStrokeWidth();
929 break;
930 case GL_PATH_END_CAPS_CHROMIUM:
931 *value = static_cast<GLfloat>(pathObj->getEndCaps());
932 break;
933 case GL_PATH_JOIN_STYLE_CHROMIUM:
934 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
935 break;
936 case GL_PATH_MITER_LIMIT_CHROMIUM:
937 *value = pathObj->getMiterLimit();
938 break;
939 case GL_PATH_STROKE_BOUND_CHROMIUM:
940 *value = pathObj->getStrokeBound();
941 break;
942 default:
943 UNREACHABLE();
944 break;
945 }
946}
947
Jamie Madill007530e2017-12-28 14:27:04 -0500948void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
949{
950 GLfloat val = 0.0f;
951 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
952 if (value)
953 *value = static_cast<GLint>(val);
954}
955
Brandon Jones59770802018-04-02 13:18:42 -0700956void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300957{
958 mGLState.setPathStencilFunc(func, ref, mask);
959}
960
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961void Context::deleteFramebuffer(GLuint framebuffer)
962{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500963 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964 {
965 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000966 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500967
Jamie Madill6c1f6712017-02-14 19:08:04 -0500968 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000969}
970
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500971void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000972{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500973 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000974 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500975 GLuint fence = fences[i];
976
977 FenceNV *fenceObject = nullptr;
978 if (mFenceNVMap.erase(fence, &fenceObject))
979 {
980 mFenceNVHandleAllocator.release(fence);
981 delete fenceObject;
982 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983 }
984}
985
Geoff Lang70d0f492015-12-10 17:45:46 -0500986Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000987{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500988 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000989}
990
Geoff Lang70d0f492015-12-10 17:45:46 -0500991Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000992{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500993 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000994}
995
Jamie Madill70b5bb02017-08-28 13:32:37 -0400996Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400997{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400998 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400999}
1000
Jamie Madill57a89722013-07-02 11:57:03 -04001001VertexArray *Context::getVertexArray(GLuint handle) const
1002{
Jamie Madill96a483b2017-06-27 16:49:21 -04001003 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -04001004}
1005
Jamie Madilldc356042013-07-19 16:36:57 -04001006Sampler *Context::getSampler(GLuint handle) const
1007{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001008 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -04001009}
1010
Geoff Langc8058452014-02-03 12:04:11 -05001011TransformFeedback *Context::getTransformFeedback(GLuint handle) const
1012{
Jamie Madill96a483b2017-06-27 16:49:21 -04001013 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -05001014}
1015
Yunchao Hea336b902017-08-02 16:05:21 +08001016ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
1017{
1018 return mState.mPipelines->getProgramPipeline(handle);
1019}
1020
Geoff Lang75359662018-04-11 01:42:27 -04001021gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001022{
1023 switch (identifier)
1024 {
1025 case GL_BUFFER:
1026 return getBuffer(name);
1027 case GL_SHADER:
1028 return getShader(name);
1029 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001030 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001031 case GL_VERTEX_ARRAY:
1032 return getVertexArray(name);
1033 case GL_QUERY:
1034 return getQuery(name);
1035 case GL_TRANSFORM_FEEDBACK:
1036 return getTransformFeedback(name);
1037 case GL_SAMPLER:
1038 return getSampler(name);
1039 case GL_TEXTURE:
1040 return getTexture(name);
1041 case GL_RENDERBUFFER:
1042 return getRenderbuffer(name);
1043 case GL_FRAMEBUFFER:
1044 return getFramebuffer(name);
1045 default:
1046 UNREACHABLE();
1047 return nullptr;
1048 }
1049}
1050
Geoff Lang75359662018-04-11 01:42:27 -04001051gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001052{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001053 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001054}
1055
Martin Radev9d901792016-07-15 15:58:58 +03001056void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1057{
Geoff Lang75359662018-04-11 01:42:27 -04001058 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001059 ASSERT(object != nullptr);
1060
1061 std::string labelName = GetObjectLabelFromPointer(length, label);
1062 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001063
1064 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1065 // specified object is active until we do this.
1066 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001067}
1068
1069void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1070{
Geoff Lang75359662018-04-11 01:42:27 -04001071 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001072 ASSERT(object != nullptr);
1073
1074 std::string labelName = GetObjectLabelFromPointer(length, label);
1075 object->setLabel(labelName);
1076}
1077
1078void Context::getObjectLabel(GLenum identifier,
1079 GLuint name,
1080 GLsizei bufSize,
1081 GLsizei *length,
1082 GLchar *label) const
1083{
Geoff Lang75359662018-04-11 01:42:27 -04001084 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001085 ASSERT(object != nullptr);
1086
1087 const std::string &objectLabel = object->getLabel();
1088 GetObjectLabelBase(objectLabel, bufSize, length, label);
1089}
1090
1091void Context::getObjectPtrLabel(const void *ptr,
1092 GLsizei bufSize,
1093 GLsizei *length,
1094 GLchar *label) const
1095{
Geoff Lang75359662018-04-11 01:42:27 -04001096 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001097 ASSERT(object != nullptr);
1098
1099 const std::string &objectLabel = object->getLabel();
1100 GetObjectLabelBase(objectLabel, bufSize, length, label);
1101}
1102
Jamie Madilldc356042013-07-19 16:36:57 -04001103bool Context::isSampler(GLuint samplerName) const
1104{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001105 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001106}
1107
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001108void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001109{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001110 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001111
Jamie Madilldedd7b92014-11-05 16:30:36 -05001112 if (handle == 0)
1113 {
1114 texture = mZeroTextures[target].get();
1115 }
1116 else
1117 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001118 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001119 }
1120
1121 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001122 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001123 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001124}
1125
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001126void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001127{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001128 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1129 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001130 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001131 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001132}
1133
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001134void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001135{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001136 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1137 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001138 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001139 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001140 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001141}
1142
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001143void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001144{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001145 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001146 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001147 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001148 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001149}
1150
Shao80957d92017-02-20 21:25:59 +08001151void Context::bindVertexBuffer(GLuint bindingIndex,
1152 GLuint bufferHandle,
1153 GLintptr offset,
1154 GLsizei stride)
1155{
1156 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001157 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001158 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001159}
1160
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001161void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001162{
Geoff Lang76b10c92014-09-05 16:28:14 -04001163 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001164 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001165 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001166 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001167 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001168}
1169
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001170void Context::bindImageTexture(GLuint unit,
1171 GLuint texture,
1172 GLint level,
1173 GLboolean layered,
1174 GLint layer,
1175 GLenum access,
1176 GLenum format)
1177{
1178 Texture *tex = mState.mTextures->getTexture(texture);
1179 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1180}
1181
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001182void Context::useProgram(GLuint program)
1183{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001184 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001185 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001186}
1187
Jiajia Qin5451d532017-11-16 17:16:34 +08001188void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1189{
1190 UNIMPLEMENTED();
1191}
1192
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001193void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001194{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001195 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001196 TransformFeedback *transformFeedback =
1197 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001198 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001199 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001200}
1201
Yunchao Hea336b902017-08-02 16:05:21 +08001202void Context::bindProgramPipeline(GLuint pipelineHandle)
1203{
1204 ProgramPipeline *pipeline =
1205 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1206 mGLState.setProgramPipelineBinding(this, pipeline);
1207}
1208
Corentin Wallezad3ae902018-03-09 13:40:42 -05001209void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001210{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001211 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001212 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213
Geoff Lang5aad9672014-09-08 11:10:42 -04001214 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001215 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001216
1217 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001218 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001219 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001220}
1221
Corentin Wallezad3ae902018-03-09 13:40:42 -05001222void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001223{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001224 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001225 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001226
Jamie Madill5188a272018-07-25 10:53:56 -04001227 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001228
Geoff Lang5aad9672014-09-08 11:10:42 -04001229 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001230 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001231 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001232}
1233
Corentin Wallezad3ae902018-03-09 13:40:42 -05001234void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001235{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001236 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001237
1238 Query *queryObject = getQuery(id, true, target);
1239 ASSERT(queryObject);
1240
Jamie Madill5188a272018-07-25 10:53:56 -04001241 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001242}
1243
Corentin Wallezad3ae902018-03-09 13:40:42 -05001244void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001245{
1246 switch (pname)
1247 {
1248 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001249 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001250 break;
1251 case GL_QUERY_COUNTER_BITS_EXT:
1252 switch (target)
1253 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001254 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1256 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001257 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001258 params[0] = getExtensions().queryCounterBitsTimestamp;
1259 break;
1260 default:
1261 UNREACHABLE();
1262 params[0] = 0;
1263 break;
1264 }
1265 break;
1266 default:
1267 UNREACHABLE();
1268 return;
1269 }
1270}
1271
Corentin Wallezad3ae902018-03-09 13:40:42 -05001272void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001273 GLenum pname,
1274 GLsizei bufSize,
1275 GLsizei *length,
1276 GLint *params)
1277{
1278 getQueryiv(target, pname, params);
1279}
1280
Geoff Lang2186c382016-10-14 10:54:54 -04001281void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282{
Jamie Madill5188a272018-07-25 10:53:56 -04001283 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001284}
1285
Brandon Jones59770802018-04-02 13:18:42 -07001286void Context::getQueryObjectivRobust(GLuint id,
1287 GLenum pname,
1288 GLsizei bufSize,
1289 GLsizei *length,
1290 GLint *params)
1291{
1292 getQueryObjectiv(id, pname, params);
1293}
1294
Geoff Lang2186c382016-10-14 10:54:54 -04001295void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001296{
Jamie Madill5188a272018-07-25 10:53:56 -04001297 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001298}
1299
Brandon Jones59770802018-04-02 13:18:42 -07001300void Context::getQueryObjectuivRobust(GLuint id,
1301 GLenum pname,
1302 GLsizei bufSize,
1303 GLsizei *length,
1304 GLuint *params)
1305{
1306 getQueryObjectuiv(id, pname, params);
1307}
1308
Geoff Lang2186c382016-10-14 10:54:54 -04001309void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001310{
Jamie Madill5188a272018-07-25 10:53:56 -04001311 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001312}
1313
Brandon Jones59770802018-04-02 13:18:42 -07001314void Context::getQueryObjecti64vRobust(GLuint id,
1315 GLenum pname,
1316 GLsizei bufSize,
1317 GLsizei *length,
1318 GLint64 *params)
1319{
1320 getQueryObjecti64v(id, pname, params);
1321}
1322
Geoff Lang2186c382016-10-14 10:54:54 -04001323void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001324{
Jamie Madill5188a272018-07-25 10:53:56 -04001325 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001326}
1327
Brandon Jones59770802018-04-02 13:18:42 -07001328void Context::getQueryObjectui64vRobust(GLuint id,
1329 GLenum pname,
1330 GLsizei bufSize,
1331 GLsizei *length,
1332 GLuint64 *params)
1333{
1334 getQueryObjectui64v(id, pname, params);
1335}
1336
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001337Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001339 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340}
1341
Jamie Madill2f348d22017-06-05 10:50:59 -04001342FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343{
Jamie Madill96a483b2017-06-27 16:49:21 -04001344 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001345}
1346
Corentin Wallezad3ae902018-03-09 13:40:42 -05001347Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348{
Jamie Madill96a483b2017-06-27 16:49:21 -04001349 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001351 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001353
1354 Query *query = mQueryMap.query(handle);
1355 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001356 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001357 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001358 query = new Query(mImplementation->createQuery(type), handle);
1359 query->addRef();
1360 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001362 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001363}
1364
Geoff Lang70d0f492015-12-10 17:45:46 -05001365Query *Context::getQuery(GLuint handle) const
1366{
Jamie Madill96a483b2017-06-27 16:49:21 -04001367 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001368}
1369
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001370Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001371{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001372 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1373 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001374}
1375
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001376Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001378 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001379}
1380
Geoff Lang492a7e42014-11-05 13:27:06 -05001381Compiler *Context::getCompiler() const
1382{
Jamie Madill2f348d22017-06-05 10:50:59 -04001383 if (mCompiler.get() == nullptr)
1384 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001385 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001386 }
1387 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001388}
1389
Jamie Madillc1d770e2017-04-13 17:31:24 -04001390void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001391{
1392 switch (pname)
1393 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001394 case GL_SHADER_COMPILER:
1395 *params = GL_TRUE;
1396 break;
1397 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1398 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1399 break;
1400 default:
1401 mGLState.getBooleanv(pname, params);
1402 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001404}
1405
Jamie Madillc1d770e2017-04-13 17:31:24 -04001406void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001407{
Shannon Woods53a94a82014-06-24 15:20:36 -04001408 // Queries about context capabilities and maximums are answered by Context.
1409 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001410 switch (pname)
1411 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001412 case GL_ALIASED_LINE_WIDTH_RANGE:
1413 params[0] = mCaps.minAliasedLineWidth;
1414 params[1] = mCaps.maxAliasedLineWidth;
1415 break;
1416 case GL_ALIASED_POINT_SIZE_RANGE:
1417 params[0] = mCaps.minAliasedPointSize;
1418 params[1] = mCaps.maxAliasedPointSize;
1419 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001420 case GL_SMOOTH_POINT_SIZE_RANGE:
1421 params[0] = mCaps.minSmoothPointSize;
1422 params[1] = mCaps.maxSmoothPointSize;
1423 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001424 case GL_SMOOTH_LINE_WIDTH_RANGE:
1425 params[0] = mCaps.minSmoothLineWidth;
1426 params[1] = mCaps.maxSmoothLineWidth;
1427 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001428 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1429 ASSERT(mExtensions.textureFilterAnisotropic);
1430 *params = mExtensions.maxTextureAnisotropy;
1431 break;
1432 case GL_MAX_TEXTURE_LOD_BIAS:
1433 *params = mCaps.maxLODBias;
1434 break;
1435
1436 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1437 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1438 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001439 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1440 // GLES1 constants for modelview/projection matrix.
1441 if (getClientVersion() < Version(2, 0))
1442 {
1443 mGLState.getFloatv(pname, params);
1444 }
1445 else
1446 {
1447 ASSERT(mExtensions.pathRendering);
1448 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1449 memcpy(params, m, 16 * sizeof(GLfloat));
1450 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001452 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001453
Jamie Madill231c7f52017-04-26 13:45:37 -04001454 default:
1455 mGLState.getFloatv(pname, params);
1456 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001457 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001458}
1459
Jamie Madillc1d770e2017-04-13 17:31:24 -04001460void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001461{
Shannon Woods53a94a82014-06-24 15:20:36 -04001462 // Queries about context capabilities and maximums are answered by Context.
1463 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001464
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001465 switch (pname)
1466 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001467 case GL_MAX_VERTEX_ATTRIBS:
1468 *params = mCaps.maxVertexAttributes;
1469 break;
1470 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1471 *params = mCaps.maxVertexUniformVectors;
1472 break;
1473 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001474 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001475 break;
1476 case GL_MAX_VARYING_VECTORS:
1477 *params = mCaps.maxVaryingVectors;
1478 break;
1479 case GL_MAX_VARYING_COMPONENTS:
1480 *params = mCaps.maxVertexOutputComponents;
1481 break;
1482 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1483 *params = mCaps.maxCombinedTextureImageUnits;
1484 break;
1485 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001486 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001489 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001490 break;
1491 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1492 *params = mCaps.maxFragmentUniformVectors;
1493 break;
1494 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001495 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001496 break;
1497 case GL_MAX_RENDERBUFFER_SIZE:
1498 *params = mCaps.maxRenderbufferSize;
1499 break;
1500 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1501 *params = mCaps.maxColorAttachments;
1502 break;
1503 case GL_MAX_DRAW_BUFFERS_EXT:
1504 *params = mCaps.maxDrawBuffers;
1505 break;
1506 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1507 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1508 case GL_SUBPIXEL_BITS:
1509 *params = 4;
1510 break;
1511 case GL_MAX_TEXTURE_SIZE:
1512 *params = mCaps.max2DTextureSize;
1513 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001514 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1515 *params = mCaps.maxRectangleTextureSize;
1516 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001517 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1518 *params = mCaps.maxCubeMapTextureSize;
1519 break;
1520 case GL_MAX_3D_TEXTURE_SIZE:
1521 *params = mCaps.max3DTextureSize;
1522 break;
1523 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1524 *params = mCaps.maxArrayTextureLayers;
1525 break;
1526 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1527 *params = mCaps.uniformBufferOffsetAlignment;
1528 break;
1529 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1530 *params = mCaps.maxUniformBufferBindings;
1531 break;
1532 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001533 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001534 break;
1535 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001536 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001537 break;
1538 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1539 *params = mCaps.maxCombinedTextureImageUnits;
1540 break;
1541 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1542 *params = mCaps.maxVertexOutputComponents;
1543 break;
1544 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1545 *params = mCaps.maxFragmentInputComponents;
1546 break;
1547 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1548 *params = mCaps.minProgramTexelOffset;
1549 break;
1550 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1551 *params = mCaps.maxProgramTexelOffset;
1552 break;
1553 case GL_MAJOR_VERSION:
1554 *params = getClientVersion().major;
1555 break;
1556 case GL_MINOR_VERSION:
1557 *params = getClientVersion().minor;
1558 break;
1559 case GL_MAX_ELEMENTS_INDICES:
1560 *params = mCaps.maxElementsIndices;
1561 break;
1562 case GL_MAX_ELEMENTS_VERTICES:
1563 *params = mCaps.maxElementsVertices;
1564 break;
1565 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1566 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1567 break;
1568 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1569 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1570 break;
1571 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1572 *params = mCaps.maxTransformFeedbackSeparateComponents;
1573 break;
1574 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1575 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1576 break;
1577 case GL_MAX_SAMPLES_ANGLE:
1578 *params = mCaps.maxSamples;
1579 break;
1580 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001581 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001582 params[0] = mCaps.maxViewportWidth;
1583 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001584 }
1585 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001586 case GL_COMPRESSED_TEXTURE_FORMATS:
1587 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1588 params);
1589 break;
1590 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1591 *params = mResetStrategy;
1592 break;
1593 case GL_NUM_SHADER_BINARY_FORMATS:
1594 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1595 break;
1596 case GL_SHADER_BINARY_FORMATS:
1597 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1598 break;
1599 case GL_NUM_PROGRAM_BINARY_FORMATS:
1600 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1601 break;
1602 case GL_PROGRAM_BINARY_FORMATS:
1603 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1604 break;
1605 case GL_NUM_EXTENSIONS:
1606 *params = static_cast<GLint>(mExtensionStrings.size());
1607 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001608
Geoff Lang38f24ee2018-10-01 13:04:59 -04001609 // GL_ANGLE_request_extension
1610 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1611 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1612 break;
1613
Jamie Madill231c7f52017-04-26 13:45:37 -04001614 // GL_KHR_debug
1615 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1616 *params = mExtensions.maxDebugMessageLength;
1617 break;
1618 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1619 *params = mExtensions.maxDebugLoggedMessages;
1620 break;
1621 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1622 *params = mExtensions.maxDebugGroupStackDepth;
1623 break;
1624 case GL_MAX_LABEL_LENGTH:
1625 *params = mExtensions.maxLabelLength;
1626 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001627
Martin Radeve5285d22017-07-14 16:23:53 +03001628 // GL_ANGLE_multiview
1629 case GL_MAX_VIEWS_ANGLE:
1630 *params = mExtensions.maxViews;
1631 break;
1632
Jamie Madill231c7f52017-04-26 13:45:37 -04001633 // GL_EXT_disjoint_timer_query
1634 case GL_GPU_DISJOINT_EXT:
1635 *params = mImplementation->getGPUDisjoint();
1636 break;
1637 case GL_MAX_FRAMEBUFFER_WIDTH:
1638 *params = mCaps.maxFramebufferWidth;
1639 break;
1640 case GL_MAX_FRAMEBUFFER_HEIGHT:
1641 *params = mCaps.maxFramebufferHeight;
1642 break;
1643 case GL_MAX_FRAMEBUFFER_SAMPLES:
1644 *params = mCaps.maxFramebufferSamples;
1645 break;
1646 case GL_MAX_SAMPLE_MASK_WORDS:
1647 *params = mCaps.maxSampleMaskWords;
1648 break;
1649 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1650 *params = mCaps.maxColorTextureSamples;
1651 break;
1652 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1653 *params = mCaps.maxDepthTextureSamples;
1654 break;
1655 case GL_MAX_INTEGER_SAMPLES:
1656 *params = mCaps.maxIntegerSamples;
1657 break;
1658 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1659 *params = mCaps.maxVertexAttribRelativeOffset;
1660 break;
1661 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1662 *params = mCaps.maxVertexAttribBindings;
1663 break;
1664 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1665 *params = mCaps.maxVertexAttribStride;
1666 break;
1667 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001668 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001669 break;
1670 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001671 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001672 break;
1673 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001674 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001677 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001680 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001681 break;
1682 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001686 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001689 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001690 break;
1691 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1692 *params = mCaps.minProgramTextureGatherOffset;
1693 break;
1694 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1695 *params = mCaps.maxProgramTextureGatherOffset;
1696 break;
1697 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1698 *params = mCaps.maxComputeWorkGroupInvocations;
1699 break;
1700 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001701 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001702 break;
1703 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001704 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001705 break;
1706 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1707 *params = mCaps.maxComputeSharedMemorySize;
1708 break;
1709 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001710 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001711 break;
1712 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001714 break;
1715 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001716 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001717 break;
1718 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001720 break;
1721 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001722 *params =
1723 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001724 break;
1725 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001726 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001727 break;
1728 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1729 *params = mCaps.maxCombinedShaderOutputResources;
1730 break;
1731 case GL_MAX_UNIFORM_LOCATIONS:
1732 *params = mCaps.maxUniformLocations;
1733 break;
1734 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1735 *params = mCaps.maxAtomicCounterBufferBindings;
1736 break;
1737 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1738 *params = mCaps.maxAtomicCounterBufferSize;
1739 break;
1740 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1741 *params = mCaps.maxCombinedAtomicCounterBuffers;
1742 break;
1743 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1744 *params = mCaps.maxCombinedAtomicCounters;
1745 break;
1746 case GL_MAX_IMAGE_UNITS:
1747 *params = mCaps.maxImageUnits;
1748 break;
1749 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1750 *params = mCaps.maxCombinedImageUniforms;
1751 break;
1752 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1753 *params = mCaps.maxShaderStorageBufferBindings;
1754 break;
1755 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1756 *params = mCaps.maxCombinedShaderStorageBlocks;
1757 break;
1758 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1759 *params = mCaps.shaderStorageBufferOffsetAlignment;
1760 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001761
1762 // GL_EXT_geometry_shader
1763 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1764 *params = mCaps.maxFramebufferLayers;
1765 break;
1766 case GL_LAYER_PROVOKING_VERTEX_EXT:
1767 *params = mCaps.layerProvokingVertex;
1768 break;
1769 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001770 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001771 break;
1772 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001773 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001774 break;
1775 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001776 *params =
1777 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001778 break;
1779 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1780 *params = mCaps.maxGeometryInputComponents;
1781 break;
1782 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1783 *params = mCaps.maxGeometryOutputComponents;
1784 break;
1785 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1786 *params = mCaps.maxGeometryOutputVertices;
1787 break;
1788 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1789 *params = mCaps.maxGeometryTotalOutputComponents;
1790 break;
1791 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1792 *params = mCaps.maxGeometryShaderInvocations;
1793 break;
1794 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001795 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001796 break;
1797 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001798 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001799 break;
1800 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001801 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001802 break;
1803 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001804 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001805 break;
1806 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001807 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001808 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001809 // GLES1 emulation: Caps queries
1810 case GL_MAX_TEXTURE_UNITS:
1811 *params = mCaps.maxMultitextureUnits;
1812 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001813 case GL_MAX_MODELVIEW_STACK_DEPTH:
1814 *params = mCaps.maxModelviewMatrixStackDepth;
1815 break;
1816 case GL_MAX_PROJECTION_STACK_DEPTH:
1817 *params = mCaps.maxProjectionMatrixStackDepth;
1818 break;
1819 case GL_MAX_TEXTURE_STACK_DEPTH:
1820 *params = mCaps.maxTextureMatrixStackDepth;
1821 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001822 case GL_MAX_LIGHTS:
1823 *params = mCaps.maxLights;
1824 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001825 case GL_MAX_CLIP_PLANES:
1826 *params = mCaps.maxClipPlanes;
1827 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001828 // GLES1 emulation: Vertex attribute queries
1829 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1830 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1831 case GL_COLOR_ARRAY_BUFFER_BINDING:
1832 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1833 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1834 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1835 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1836 break;
1837 case GL_VERTEX_ARRAY_STRIDE:
1838 case GL_NORMAL_ARRAY_STRIDE:
1839 case GL_COLOR_ARRAY_STRIDE:
1840 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1841 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1842 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1843 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1844 break;
1845 case GL_VERTEX_ARRAY_SIZE:
1846 case GL_COLOR_ARRAY_SIZE:
1847 case GL_TEXTURE_COORD_ARRAY_SIZE:
1848 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1849 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1850 break;
1851 case GL_VERTEX_ARRAY_TYPE:
1852 case GL_COLOR_ARRAY_TYPE:
1853 case GL_NORMAL_ARRAY_TYPE:
1854 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1855 case GL_TEXTURE_COORD_ARRAY_TYPE:
1856 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1857 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1858 break;
1859
jchen1082af6202018-06-22 10:59:52 +08001860 // GL_KHR_parallel_shader_compile
1861 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1862 *params = mGLState.getMaxShaderCompilerThreads();
1863 break;
1864
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001865 // GL_EXT_blend_func_extended
1866 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1867 *params = mExtensions.maxDualSourceDrawBuffers;
1868 break;
1869
Jamie Madill231c7f52017-04-26 13:45:37 -04001870 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001871 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001872 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001873 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001874}
1875
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001876void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001877{
Shannon Woods53a94a82014-06-24 15:20:36 -04001878 // Queries about context capabilities and maximums are answered by Context.
1879 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001880 switch (pname)
1881 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001882 case GL_MAX_ELEMENT_INDEX:
1883 *params = mCaps.maxElementIndex;
1884 break;
1885 case GL_MAX_UNIFORM_BLOCK_SIZE:
1886 *params = mCaps.maxUniformBlockSize;
1887 break;
1888 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001889 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001890 break;
1891 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001892 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001893 break;
1894 case GL_MAX_SERVER_WAIT_TIMEOUT:
1895 *params = mCaps.maxServerWaitTimeout;
1896 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001897
Jamie Madill231c7f52017-04-26 13:45:37 -04001898 // GL_EXT_disjoint_timer_query
1899 case GL_TIMESTAMP_EXT:
1900 *params = mImplementation->getTimestamp();
1901 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001902
Jamie Madill231c7f52017-04-26 13:45:37 -04001903 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1904 *params = mCaps.maxShaderStorageBlockSize;
1905 break;
1906 default:
1907 UNREACHABLE();
1908 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001909 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001910}
1911
Geoff Lang70d0f492015-12-10 17:45:46 -05001912void Context::getPointerv(GLenum pname, void **params) const
1913{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001914 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001915}
1916
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001917void Context::getPointervRobustANGLERobust(GLenum pname,
1918 GLsizei bufSize,
1919 GLsizei *length,
1920 void **params)
1921{
1922 UNIMPLEMENTED();
1923}
1924
Martin Radev66fb8202016-07-28 11:45:20 +03001925void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001926{
Shannon Woods53a94a82014-06-24 15:20:36 -04001927 // Queries about context capabilities and maximums are answered by Context.
1928 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001929
1930 GLenum nativeType;
1931 unsigned int numParams;
1932 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1933 ASSERT(queryStatus);
1934
1935 if (nativeType == GL_INT)
1936 {
1937 switch (target)
1938 {
1939 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1940 ASSERT(index < 3u);
1941 *data = mCaps.maxComputeWorkGroupCount[index];
1942 break;
1943 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1944 ASSERT(index < 3u);
1945 *data = mCaps.maxComputeWorkGroupSize[index];
1946 break;
1947 default:
1948 mGLState.getIntegeri_v(target, index, data);
1949 }
1950 }
1951 else
1952 {
1953 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1954 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001955}
1956
Brandon Jones59770802018-04-02 13:18:42 -07001957void Context::getIntegeri_vRobust(GLenum target,
1958 GLuint index,
1959 GLsizei bufSize,
1960 GLsizei *length,
1961 GLint *data)
1962{
1963 getIntegeri_v(target, index, data);
1964}
1965
Martin Radev66fb8202016-07-28 11:45:20 +03001966void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001967{
Shannon Woods53a94a82014-06-24 15:20:36 -04001968 // Queries about context capabilities and maximums are answered by Context.
1969 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001970
1971 GLenum nativeType;
1972 unsigned int numParams;
1973 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1974 ASSERT(queryStatus);
1975
1976 if (nativeType == GL_INT_64_ANGLEX)
1977 {
1978 mGLState.getInteger64i_v(target, index, data);
1979 }
1980 else
1981 {
1982 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1983 }
1984}
1985
Brandon Jones59770802018-04-02 13:18:42 -07001986void Context::getInteger64i_vRobust(GLenum target,
1987 GLuint index,
1988 GLsizei bufSize,
1989 GLsizei *length,
1990 GLint64 *data)
1991{
1992 getInteger64i_v(target, index, data);
1993}
1994
Martin Radev66fb8202016-07-28 11:45:20 +03001995void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1996{
1997 // Queries about context capabilities and maximums are answered by Context.
1998 // Queries about current GL state values are answered by State.
1999
2000 GLenum nativeType;
2001 unsigned int numParams;
2002 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
2003 ASSERT(queryStatus);
2004
2005 if (nativeType == GL_BOOL)
2006 {
2007 mGLState.getBooleani_v(target, index, data);
2008 }
2009 else
2010 {
2011 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
2012 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04002013}
2014
Brandon Jones59770802018-04-02 13:18:42 -07002015void Context::getBooleani_vRobust(GLenum target,
2016 GLuint index,
2017 GLsizei bufSize,
2018 GLsizei *length,
2019 GLboolean *data)
2020{
2021 getBooleani_v(target, index, data);
2022}
2023
Corentin Wallez336129f2017-10-17 15:55:40 -04002024void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002025{
2026 Buffer *buffer = mGLState.getTargetBuffer(target);
2027 QueryBufferParameteriv(buffer, pname, params);
2028}
2029
Brandon Jones59770802018-04-02 13:18:42 -07002030void Context::getBufferParameterivRobust(BufferBinding target,
2031 GLenum pname,
2032 GLsizei bufSize,
2033 GLsizei *length,
2034 GLint *params)
2035{
2036 getBufferParameteriv(target, pname, params);
2037}
2038
He Yunchao010e4db2017-03-03 14:22:06 +08002039void Context::getFramebufferAttachmentParameteriv(GLenum target,
2040 GLenum attachment,
2041 GLenum pname,
2042 GLint *params)
2043{
2044 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002045 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002046}
2047
Brandon Jones59770802018-04-02 13:18:42 -07002048void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2049 GLenum attachment,
2050 GLenum pname,
2051 GLsizei bufSize,
2052 GLsizei *length,
2053 GLint *params)
2054{
2055 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2056}
2057
He Yunchao010e4db2017-03-03 14:22:06 +08002058void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2059{
2060 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2061 QueryRenderbufferiv(this, renderbuffer, pname, params);
2062}
2063
Brandon Jones59770802018-04-02 13:18:42 -07002064void Context::getRenderbufferParameterivRobust(GLenum target,
2065 GLenum pname,
2066 GLsizei bufSize,
2067 GLsizei *length,
2068 GLint *params)
2069{
2070 getRenderbufferParameteriv(target, pname, params);
2071}
2072
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002073void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002074{
2075 Texture *texture = getTargetTexture(target);
2076 QueryTexParameterfv(texture, pname, params);
2077}
2078
Brandon Jones59770802018-04-02 13:18:42 -07002079void Context::getTexParameterfvRobust(TextureType target,
2080 GLenum pname,
2081 GLsizei bufSize,
2082 GLsizei *length,
2083 GLfloat *params)
2084{
2085 getTexParameterfv(target, pname, params);
2086}
2087
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002088void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002089{
2090 Texture *texture = getTargetTexture(target);
2091 QueryTexParameteriv(texture, pname, params);
2092}
Jiajia Qin5451d532017-11-16 17:16:34 +08002093
Brandon Jones59770802018-04-02 13:18:42 -07002094void Context::getTexParameterivRobust(TextureType target,
2095 GLenum pname,
2096 GLsizei bufSize,
2097 GLsizei *length,
2098 GLint *params)
2099{
2100 getTexParameteriv(target, pname, params);
2101}
2102
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002103void Context::getTexParameterIivRobust(TextureType target,
2104 GLenum pname,
2105 GLsizei bufSize,
2106 GLsizei *length,
2107 GLint *params)
2108{
2109 UNIMPLEMENTED();
2110}
2111
2112void Context::getTexParameterIuivRobust(TextureType target,
2113 GLenum pname,
2114 GLsizei bufSize,
2115 GLsizei *length,
2116 GLuint *params)
2117{
2118 UNIMPLEMENTED();
2119}
2120
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002121void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002122{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002123 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002124 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002125}
2126
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002127void Context::getTexLevelParameterivRobust(TextureTarget target,
2128 GLint level,
2129 GLenum pname,
2130 GLsizei bufSize,
2131 GLsizei *length,
2132 GLint *params)
2133{
2134 UNIMPLEMENTED();
2135}
2136
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002137void Context::getTexLevelParameterfv(TextureTarget target,
2138 GLint level,
2139 GLenum pname,
2140 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002141{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002142 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002143 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002144}
2145
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002146void Context::getTexLevelParameterfvRobust(TextureTarget target,
2147 GLint level,
2148 GLenum pname,
2149 GLsizei bufSize,
2150 GLsizei *length,
2151 GLfloat *params)
2152{
2153 UNIMPLEMENTED();
2154}
2155
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002156void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002157{
2158 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002159 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002160 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002161}
2162
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002163void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002164{
2165 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002166 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002167 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002168}
2169
Brandon Jones59770802018-04-02 13:18:42 -07002170void Context::texParameterfvRobust(TextureType target,
2171 GLenum pname,
2172 GLsizei bufSize,
2173 const GLfloat *params)
2174{
2175 texParameterfv(target, pname, params);
2176}
2177
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002178void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002179{
2180 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002181 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002182 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002183}
2184
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002185void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002186{
2187 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002188 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002189 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002190}
2191
Brandon Jones59770802018-04-02 13:18:42 -07002192void Context::texParameterivRobust(TextureType target,
2193 GLenum pname,
2194 GLsizei bufSize,
2195 const GLint *params)
2196{
2197 texParameteriv(target, pname, params);
2198}
2199
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002200void Context::texParameterIivRobust(TextureType target,
2201 GLenum pname,
2202 GLsizei bufSize,
2203 const GLint *params)
2204{
2205 UNIMPLEMENTED();
2206}
2207
2208void Context::texParameterIuivRobust(TextureType target,
2209 GLenum pname,
2210 GLsizei bufSize,
2211 const GLuint *params)
2212{
2213 UNIMPLEMENTED();
2214}
2215
Jamie Madill493f9572018-05-24 19:52:15 -04002216void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002217{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002218 // No-op if count draws no primitives for given mode
2219 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002220 {
2221 return;
2222 }
2223
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002224 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002225 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002226 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002227}
2228
Jamie Madill493f9572018-05-24 19:52:15 -04002229void Context::drawArraysInstanced(PrimitiveMode mode,
2230 GLint first,
2231 GLsizei count,
2232 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002233{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002234 // No-op if count draws no primitives for given mode
2235 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002236 {
2237 return;
2238 }
2239
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002240 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002241 ANGLE_CONTEXT_TRY(
2242 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002243 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2244 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002245}
2246
Jamie Madill493f9572018-05-24 19:52:15 -04002247void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002248{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002249 // No-op if count draws no primitives for given mode
2250 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002251 {
2252 return;
2253 }
2254
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002255 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002256 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002257}
2258
Jamie Madill493f9572018-05-24 19:52:15 -04002259void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002260 GLsizei count,
2261 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002262 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002263 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002264{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002265 // No-op if count draws no primitives for given mode
2266 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002267 {
2268 return;
2269 }
2270
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002271 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002272 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002273 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002274}
2275
Jamie Madill493f9572018-05-24 19:52:15 -04002276void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002277 GLuint start,
2278 GLuint end,
2279 GLsizei count,
2280 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002281 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002282{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002283 // No-op if count draws no primitives for given mode
2284 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002285 {
2286 return;
2287 }
2288
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002289 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002290 ANGLE_CONTEXT_TRY(
2291 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002292}
2293
Jamie Madill493f9572018-05-24 19:52:15 -04002294void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002295{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002296 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002297 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002298}
2299
Jamie Madill493f9572018-05-24 19:52:15 -04002300void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002301{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002302 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002303 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002304}
2305
Jamie Madill675fe712016-12-19 13:07:54 -05002306void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002307{
Jamie Madillafa02a22017-11-23 12:57:38 -05002308 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002309}
2310
Jamie Madill675fe712016-12-19 13:07:54 -05002311void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002312{
Jamie Madillafa02a22017-11-23 12:57:38 -05002313 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002314}
2315
Austin Kinross6ee1e782015-05-29 17:05:37 -07002316void Context::insertEventMarker(GLsizei length, const char *marker)
2317{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002318 ASSERT(mImplementation);
2319 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002320}
2321
2322void Context::pushGroupMarker(GLsizei length, const char *marker)
2323{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002324 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002325
2326 if (marker == nullptr)
2327 {
2328 // From the EXT_debug_marker spec,
2329 // "If <marker> is null then an empty string is pushed on the stack."
2330 mImplementation->pushGroupMarker(length, "");
2331 }
2332 else
2333 {
2334 mImplementation->pushGroupMarker(length, marker);
2335 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002336}
2337
2338void Context::popGroupMarker()
2339{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002340 ASSERT(mImplementation);
2341 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002342}
2343
Geoff Langd8605522016-04-13 10:19:12 -04002344void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2345{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002346 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002347 ASSERT(programObject);
2348
2349 programObject->bindUniformLocation(location, name);
2350}
2351
Brandon Jones59770802018-04-02 13:18:42 -07002352void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002353{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002354 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002355}
2356
Brandon Jones59770802018-04-02 13:18:42 -07002357void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002358{
2359 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2360}
2361
Brandon Jones59770802018-04-02 13:18:42 -07002362void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002363{
2364 GLfloat I[16];
2365 angle::Matrix<GLfloat>::setToIdentity(I);
2366
2367 mGLState.loadPathRenderingMatrix(matrixMode, I);
2368}
2369
2370void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2371{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002372 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002373 if (!pathObj)
2374 return;
2375
Geoff Lang9bf86f02018-07-26 11:46:34 -04002376 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002377
2378 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2379}
2380
2381void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2382{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002383 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002384 if (!pathObj)
2385 return;
2386
Geoff Lang9bf86f02018-07-26 11:46:34 -04002387 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002388
2389 mImplementation->stencilStrokePath(pathObj, reference, mask);
2390}
2391
2392void Context::coverFillPath(GLuint path, GLenum coverMode)
2393{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002394 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002395 if (!pathObj)
2396 return;
2397
Geoff Lang9bf86f02018-07-26 11:46:34 -04002398 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002399
2400 mImplementation->coverFillPath(pathObj, coverMode);
2401}
2402
2403void Context::coverStrokePath(GLuint path, GLenum coverMode)
2404{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002405 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002406 if (!pathObj)
2407 return;
2408
Geoff Lang9bf86f02018-07-26 11:46:34 -04002409 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002410
2411 mImplementation->coverStrokePath(pathObj, coverMode);
2412}
2413
2414void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2415{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002416 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002417 if (!pathObj)
2418 return;
2419
Geoff Lang9bf86f02018-07-26 11:46:34 -04002420 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002421
2422 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2423}
2424
2425void Context::stencilThenCoverStrokePath(GLuint path,
2426 GLint reference,
2427 GLuint mask,
2428 GLenum coverMode)
2429{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002430 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002431 if (!pathObj)
2432 return;
2433
Geoff Lang9bf86f02018-07-26 11:46:34 -04002434 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002435
2436 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2437}
2438
Sami Väisänend59ca052016-06-21 16:10:00 +03002439void Context::coverFillPathInstanced(GLsizei numPaths,
2440 GLenum pathNameType,
2441 const void *paths,
2442 GLuint pathBase,
2443 GLenum coverMode,
2444 GLenum transformType,
2445 const GLfloat *transformValues)
2446{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002447 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002448
Geoff Lang9bf86f02018-07-26 11:46:34 -04002449 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002450
2451 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2452}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002453
Sami Väisänend59ca052016-06-21 16:10:00 +03002454void Context::coverStrokePathInstanced(GLsizei numPaths,
2455 GLenum pathNameType,
2456 const void *paths,
2457 GLuint pathBase,
2458 GLenum coverMode,
2459 GLenum transformType,
2460 const GLfloat *transformValues)
2461{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002462 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002463
2464 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002465 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002466
2467 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2468 transformValues);
2469}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002470
Sami Väisänend59ca052016-06-21 16:10:00 +03002471void Context::stencilFillPathInstanced(GLsizei numPaths,
2472 GLenum pathNameType,
2473 const void *paths,
2474 GLuint pathBase,
2475 GLenum fillMode,
2476 GLuint mask,
2477 GLenum transformType,
2478 const GLfloat *transformValues)
2479{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002480 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002481
2482 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002483 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002484
2485 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2486 transformValues);
2487}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002488
Sami Väisänend59ca052016-06-21 16:10:00 +03002489void Context::stencilStrokePathInstanced(GLsizei numPaths,
2490 GLenum pathNameType,
2491 const void *paths,
2492 GLuint pathBase,
2493 GLint reference,
2494 GLuint mask,
2495 GLenum transformType,
2496 const GLfloat *transformValues)
2497{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002498 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002499
Geoff Lang9bf86f02018-07-26 11:46:34 -04002500 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002501
2502 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2503 transformValues);
2504}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002505
Sami Väisänend59ca052016-06-21 16:10:00 +03002506void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2507 GLenum pathNameType,
2508 const void *paths,
2509 GLuint pathBase,
2510 GLenum fillMode,
2511 GLuint mask,
2512 GLenum coverMode,
2513 GLenum transformType,
2514 const GLfloat *transformValues)
2515{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002516 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002517
Geoff Lang9bf86f02018-07-26 11:46:34 -04002518 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002519
2520 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2521 transformType, transformValues);
2522}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002523
Sami Väisänend59ca052016-06-21 16:10:00 +03002524void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2525 GLenum pathNameType,
2526 const void *paths,
2527 GLuint pathBase,
2528 GLint reference,
2529 GLuint mask,
2530 GLenum coverMode,
2531 GLenum transformType,
2532 const GLfloat *transformValues)
2533{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002534 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002535
Geoff Lang9bf86f02018-07-26 11:46:34 -04002536 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002537
2538 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2539 transformType, transformValues);
2540}
2541
Sami Väisänen46eaa942016-06-29 10:26:37 +03002542void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2543{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002544 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002545
2546 programObject->bindFragmentInputLocation(location, name);
2547}
2548
2549void Context::programPathFragmentInputGen(GLuint program,
2550 GLint location,
2551 GLenum genMode,
2552 GLint components,
2553 const GLfloat *coeffs)
2554{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002555 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002556
jchen103fd614d2018-08-13 12:21:58 +08002557 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002558}
2559
jchen1015015f72017-03-16 13:54:21 +08002560GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2561{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002562 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002563 return QueryProgramResourceIndex(programObject, programInterface, name);
2564}
2565
jchen10fd7c3b52017-03-21 15:36:03 +08002566void Context::getProgramResourceName(GLuint program,
2567 GLenum programInterface,
2568 GLuint index,
2569 GLsizei bufSize,
2570 GLsizei *length,
2571 GLchar *name)
2572{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002573 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002574 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2575}
2576
jchen10191381f2017-04-11 13:59:04 +08002577GLint Context::getProgramResourceLocation(GLuint program,
2578 GLenum programInterface,
2579 const GLchar *name)
2580{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002581 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002582 return QueryProgramResourceLocation(programObject, programInterface, name);
2583}
2584
jchen10880683b2017-04-12 16:21:55 +08002585void Context::getProgramResourceiv(GLuint program,
2586 GLenum programInterface,
2587 GLuint index,
2588 GLsizei propCount,
2589 const GLenum *props,
2590 GLsizei bufSize,
2591 GLsizei *length,
2592 GLint *params)
2593{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002594 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002595 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2596 length, params);
2597}
2598
jchen10d9cd7b72017-08-30 15:04:25 +08002599void Context::getProgramInterfaceiv(GLuint program,
2600 GLenum programInterface,
2601 GLenum pname,
2602 GLint *params)
2603{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002604 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002605 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2606}
2607
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002608void Context::getProgramInterfaceivRobust(GLuint program,
2609 GLenum programInterface,
2610 GLenum pname,
2611 GLsizei bufSize,
2612 GLsizei *length,
2613 GLint *params)
2614{
2615 UNIMPLEMENTED();
2616}
2617
Jamie Madill306b6c12018-07-27 08:12:49 -04002618void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002619{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002620 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002621}
2622
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002623void Context::handleError(GLenum errorCode,
2624 const char *message,
2625 const char *file,
2626 const char *function,
2627 unsigned int line)
2628{
2629 mErrors.handleError(errorCode, message, file, function, line);
2630}
2631
Jamie Madilla139f012018-10-10 16:13:03 -04002632void Context::validationError(GLenum errorCode, const char *message)
2633{
2634 mErrors.validationError(errorCode, message);
2635}
2636
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002637// Get one of the recorded errors and clear its flag, if any.
2638// [OpenGL ES 2.0.24] section 2.5 page 13.
2639GLenum Context::getError()
2640{
Geoff Langda5777c2014-07-11 09:52:58 -04002641 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002642 {
Geoff Langda5777c2014-07-11 09:52:58 -04002643 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002644 }
Geoff Langda5777c2014-07-11 09:52:58 -04002645 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002646 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002647 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002648 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002649}
2650
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002651// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002652void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002653{
2654 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002655 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002656 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002657 mContextLostForced = true;
2658 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002659 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002660}
2661
Jamie Madillfa920eb2018-01-04 11:45:50 -05002662GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002663{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002664 // Even if the application doesn't want to know about resets, we want to know
2665 // as it will allow us to skip all the calls.
2666 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002667 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002668 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002669 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002671 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002672
2673 // EXT_robustness, section 2.6: If the reset notification behavior is
2674 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2675 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2676 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002677 }
2678
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002679 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2680 // status should be returned at least once, and GL_NO_ERROR should be returned
2681 // once the device has finished resetting.
2682 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002683 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002684 ASSERT(mResetStatus == GL_NO_ERROR);
2685 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002686
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002687 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002688 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002689 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002690 }
2691 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002692 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002693 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002694 // If markContextLost was used to mark the context lost then
2695 // assume that is not recoverable, and continue to report the
2696 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002697 mResetStatus = mImplementation->getResetStatus();
2698 }
Jamie Madill893ab082014-05-16 16:56:10 -04002699
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002700 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002701}
2702
2703bool Context::isResetNotificationEnabled()
2704{
2705 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2706}
2707
Corentin Walleze3b10e82015-05-20 11:06:25 -04002708const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002709{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002710 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002711}
2712
2713EGLenum Context::getClientType() const
2714{
2715 return mClientType;
2716}
2717
2718EGLenum Context::getRenderBuffer() const
2719{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002720 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2721 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002722 {
2723 return EGL_NONE;
2724 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002725
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002726 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002727 ASSERT(backAttachment != nullptr);
2728 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002729}
2730
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002731VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002732{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002733 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002734 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2735 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002736 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002737 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2738 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002739
Jamie Madill96a483b2017-06-27 16:49:21 -04002740 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002741 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002742
2743 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002744}
2745
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002746TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002747{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002748 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002749 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2750 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002751 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002752 transformFeedback =
2753 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002754 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002755 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002756 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002757
2758 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002759}
2760
2761bool Context::isVertexArrayGenerated(GLuint vertexArray)
2762{
Jamie Madill96a483b2017-06-27 16:49:21 -04002763 ASSERT(mVertexArrayMap.contains(0));
2764 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002765}
2766
2767bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2768{
Jamie Madill96a483b2017-06-27 16:49:21 -04002769 ASSERT(mTransformFeedbackMap.contains(0));
2770 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002771}
2772
Shannon Woods53a94a82014-06-24 15:20:36 -04002773void Context::detachTexture(GLuint texture)
2774{
2775 // Simple pass-through to State's detachTexture method, as textures do not require
2776 // allocation map management either here or in the resource manager at detach time.
2777 // Zero textures are held by the Context, and we don't attempt to request them from
2778 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002779 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002780}
2781
James Darpinian4d9d4832018-03-13 12:43:28 -07002782void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002783{
Yuly Novikov5807a532015-12-03 13:01:22 -05002784 // Simple pass-through to State's detachBuffer method, since
2785 // only buffer attachments to container objects that are bound to the current context
2786 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002787
Yuly Novikov5807a532015-12-03 13:01:22 -05002788 // [OpenGL ES 3.2] section 5.1.2 page 45:
2789 // Attachments to unbound container objects, such as
2790 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2791 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002792 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002793}
2794
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002795void Context::detachFramebuffer(GLuint framebuffer)
2796{
Shannon Woods53a94a82014-06-24 15:20:36 -04002797 // Framebuffer detachment is handled by Context, because 0 is a valid
2798 // Framebuffer object, and a pointer to it must be passed from Context
2799 // to State at binding time.
2800
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002801 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002802 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2803 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2804 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002805
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002806 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002807 {
2808 bindReadFramebuffer(0);
2809 }
2810
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002811 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002812 {
2813 bindDrawFramebuffer(0);
2814 }
2815}
2816
2817void Context::detachRenderbuffer(GLuint renderbuffer)
2818{
Jamie Madilla02315b2017-02-23 14:14:47 -05002819 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002820}
2821
Jamie Madill57a89722013-07-02 11:57:03 -04002822void Context::detachVertexArray(GLuint vertexArray)
2823{
Jamie Madill77a72f62015-04-14 11:18:32 -04002824 // Vertex array detachment is handled by Context, because 0 is a valid
2825 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002826 // binding time.
2827
Jamie Madill57a89722013-07-02 11:57:03 -04002828 // [OpenGL ES 3.0.2] section 2.10 page 43:
2829 // If a vertex array object that is currently bound is deleted, the binding
2830 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002831 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002832 {
2833 bindVertexArray(0);
2834 }
2835}
2836
Geoff Langc8058452014-02-03 12:04:11 -05002837void Context::detachTransformFeedback(GLuint transformFeedback)
2838{
Corentin Walleza2257da2016-04-19 16:43:12 -04002839 // Transform feedback detachment is handled by Context, because 0 is a valid
2840 // transform feedback, and a pointer to it must be passed from Context to State at
2841 // binding time.
2842
2843 // The OpenGL specification doesn't mention what should happen when the currently bound
2844 // transform feedback object is deleted. Since it is a container object, we treat it like
2845 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002846 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002847 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002848 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002849 }
Geoff Langc8058452014-02-03 12:04:11 -05002850}
2851
Jamie Madilldc356042013-07-19 16:36:57 -04002852void Context::detachSampler(GLuint sampler)
2853{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002854 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002855}
2856
Yunchao Hea336b902017-08-02 16:05:21 +08002857void Context::detachProgramPipeline(GLuint pipeline)
2858{
2859 mGLState.detachProgramPipeline(this, pipeline);
2860}
2861
Jamie Madill3ef140a2017-08-26 23:11:21 -04002862void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002863{
Shaodde78e82017-05-22 14:13:27 +08002864 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002865 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002866}
2867
Jamie Madille29d1672013-07-19 16:36:57 -04002868void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2869{
Geoff Langc1984ed2016-10-07 12:41:00 -04002870 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002871 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002872 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002873}
Jamie Madille29d1672013-07-19 16:36:57 -04002874
Geoff Langc1984ed2016-10-07 12:41:00 -04002875void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2876{
2877 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002878 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002879 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002880}
2881
Brandon Jones59770802018-04-02 13:18:42 -07002882void Context::samplerParameterivRobust(GLuint sampler,
2883 GLenum pname,
2884 GLsizei bufSize,
2885 const GLint *param)
2886{
2887 samplerParameteriv(sampler, pname, param);
2888}
2889
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002890void Context::samplerParameterIivRobust(GLuint sampler,
2891 GLenum pname,
2892 GLsizei bufSize,
2893 const GLint *param)
2894{
2895 UNIMPLEMENTED();
2896}
2897
2898void Context::samplerParameterIuivRobust(GLuint sampler,
2899 GLenum pname,
2900 GLsizei bufSize,
2901 const GLuint *param)
2902{
2903 UNIMPLEMENTED();
2904}
2905
Jamie Madille29d1672013-07-19 16:36:57 -04002906void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2907{
Geoff Langc1984ed2016-10-07 12:41:00 -04002908 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002909 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002910 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002911}
2912
Geoff Langc1984ed2016-10-07 12:41:00 -04002913void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002914{
Geoff Langc1984ed2016-10-07 12:41:00 -04002915 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002916 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002917 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002918}
2919
Brandon Jones59770802018-04-02 13:18:42 -07002920void Context::samplerParameterfvRobust(GLuint sampler,
2921 GLenum pname,
2922 GLsizei bufSize,
2923 const GLfloat *param)
2924{
2925 samplerParameterfv(sampler, pname, param);
2926}
2927
Geoff Langc1984ed2016-10-07 12:41:00 -04002928void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002929{
Geoff Langc1984ed2016-10-07 12:41:00 -04002930 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002931 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002932 QuerySamplerParameteriv(samplerObject, pname, params);
2933}
Jamie Madill9675b802013-07-19 16:36:59 -04002934
Brandon Jones59770802018-04-02 13:18:42 -07002935void Context::getSamplerParameterivRobust(GLuint sampler,
2936 GLenum pname,
2937 GLsizei bufSize,
2938 GLsizei *length,
2939 GLint *params)
2940{
2941 getSamplerParameteriv(sampler, pname, params);
2942}
2943
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002944void Context::getSamplerParameterIivRobust(GLuint sampler,
2945 GLenum pname,
2946 GLsizei bufSize,
2947 GLsizei *length,
2948 GLint *params)
2949{
2950 UNIMPLEMENTED();
2951}
2952
2953void Context::getSamplerParameterIuivRobust(GLuint sampler,
2954 GLenum pname,
2955 GLsizei bufSize,
2956 GLsizei *length,
2957 GLuint *params)
2958{
2959 UNIMPLEMENTED();
2960}
2961
Geoff Langc1984ed2016-10-07 12:41:00 -04002962void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2963{
2964 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002965 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002966 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002967}
2968
Brandon Jones59770802018-04-02 13:18:42 -07002969void Context::getSamplerParameterfvRobust(GLuint sampler,
2970 GLenum pname,
2971 GLsizei bufSize,
2972 GLsizei *length,
2973 GLfloat *params)
2974{
2975 getSamplerParameterfv(sampler, pname, params);
2976}
2977
Olli Etuahof0fee072016-03-30 15:11:58 +03002978void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2979{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002980 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002981 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002982}
2983
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002984void Context::initRendererString()
2985{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002986 std::ostringstream rendererString;
2987 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002988 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002989 rendererString << ")";
2990
Geoff Langcec35902014-04-16 10:52:36 -04002991 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002992}
2993
Geoff Langc339c4e2016-11-29 10:37:36 -05002994void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002995{
Geoff Langc339c4e2016-11-29 10:37:36 -05002996 const Version &clientVersion = getClientVersion();
2997
2998 std::ostringstream versionString;
2999 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3000 << ANGLE_VERSION_STRING << ")";
3001 mVersionString = MakeStaticString(versionString.str());
3002
3003 std::ostringstream shadingLanguageVersionString;
3004 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3005 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3006 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3007 << ")";
3008 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003009}
3010
Geoff Langcec35902014-04-16 10:52:36 -04003011void Context::initExtensionStrings()
3012{
Geoff Langc339c4e2016-11-29 10:37:36 -05003013 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3014 std::ostringstream combinedStringStream;
3015 std::copy(strings.begin(), strings.end(),
3016 std::ostream_iterator<const char *>(combinedStringStream, " "));
3017 return MakeStaticString(combinedStringStream.str());
3018 };
3019
3020 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003021 for (const auto &extensionString : mExtensions.getStrings())
3022 {
3023 mExtensionStrings.push_back(MakeStaticString(extensionString));
3024 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003025 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003026
Geoff Langc339c4e2016-11-29 10:37:36 -05003027 mRequestableExtensionStrings.clear();
3028 for (const auto &extensionInfo : GetExtensionInfoMap())
3029 {
3030 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003031 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003032 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003033 {
3034 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3035 }
3036 }
3037 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003038}
3039
Geoff Langc339c4e2016-11-29 10:37:36 -05003040const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003041{
Geoff Langc339c4e2016-11-29 10:37:36 -05003042 switch (name)
3043 {
3044 case GL_VENDOR:
3045 return reinterpret_cast<const GLubyte *>("Google Inc.");
3046
3047 case GL_RENDERER:
3048 return reinterpret_cast<const GLubyte *>(mRendererString);
3049
3050 case GL_VERSION:
3051 return reinterpret_cast<const GLubyte *>(mVersionString);
3052
3053 case GL_SHADING_LANGUAGE_VERSION:
3054 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3055
3056 case GL_EXTENSIONS:
3057 return reinterpret_cast<const GLubyte *>(mExtensionString);
3058
3059 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3060 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3061
3062 default:
3063 UNREACHABLE();
3064 return nullptr;
3065 }
Geoff Langcec35902014-04-16 10:52:36 -04003066}
3067
Geoff Langc339c4e2016-11-29 10:37:36 -05003068const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003069{
Geoff Langc339c4e2016-11-29 10:37:36 -05003070 switch (name)
3071 {
3072 case GL_EXTENSIONS:
3073 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3074
3075 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3076 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3077
3078 default:
3079 UNREACHABLE();
3080 return nullptr;
3081 }
Geoff Langcec35902014-04-16 10:52:36 -04003082}
3083
3084size_t Context::getExtensionStringCount() const
3085{
3086 return mExtensionStrings.size();
3087}
3088
Geoff Lang111a99e2017-10-17 10:58:41 -04003089bool Context::isExtensionRequestable(const char *name)
3090{
3091 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3092 auto extension = extensionInfos.find(name);
3093
Geoff Lang111a99e2017-10-17 10:58:41 -04003094 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003095 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003096}
3097
Geoff Langc339c4e2016-11-29 10:37:36 -05003098void Context::requestExtension(const char *name)
3099{
3100 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3101 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3102 const auto &extension = extensionInfos.at(name);
3103 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003104 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003105
3106 if (mExtensions.*(extension.ExtensionsMember))
3107 {
3108 // Extension already enabled
3109 return;
3110 }
3111
3112 mExtensions.*(extension.ExtensionsMember) = true;
3113 updateCaps();
3114 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003115
Jamie Madill2f348d22017-06-05 10:50:59 -04003116 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3117 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003118
Jamie Madill81c2e252017-09-09 23:32:46 -04003119 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3120 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003121 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003122 for (auto &zeroTexture : mZeroTextures)
3123 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003124 if (zeroTexture.get() != nullptr)
3125 {
3126 zeroTexture->signalDirty(this, InitState::Initialized);
3127 }
Geoff Lang9aded172017-04-05 11:07:56 -04003128 }
3129
Jamie Madillb983a4b2018-08-01 11:34:51 -04003130 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003131}
3132
3133size_t Context::getRequestableExtensionStringCount() const
3134{
3135 return mRequestableExtensionStrings.size();
3136}
3137
Jamie Madill493f9572018-05-24 19:52:15 -04003138void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003139{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003140 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003141 ASSERT(transformFeedback != nullptr);
3142 ASSERT(!transformFeedback->isPaused());
3143
Jamie Madill6c1f6712017-02-14 19:08:04 -05003144 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003145 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003146}
3147
3148bool Context::hasActiveTransformFeedback(GLuint program) const
3149{
3150 for (auto pair : mTransformFeedbackMap)
3151 {
3152 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3153 {
3154 return true;
3155 }
3156 }
3157 return false;
3158}
3159
Geoff Lang33f11fb2018-05-07 13:42:47 -04003160Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003161{
3162 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3163
jchen1082af6202018-06-22 10:59:52 +08003164 // Explicitly enable GL_KHR_parallel_shader_compile
3165 supportedExtensions.parallelShaderCompile = true;
3166
Geoff Langb0f917f2017-12-05 13:41:54 -05003167 if (getClientVersion() < ES_2_0)
3168 {
3169 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003170 supportedExtensions.pointSizeArray = true;
3171 supportedExtensions.textureCubeMap = true;
3172 supportedExtensions.pointSprite = true;
3173 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003174 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003175 }
3176
3177 if (getClientVersion() < ES_3_0)
3178 {
3179 // Disable ES3+ extensions
3180 supportedExtensions.colorBufferFloat = false;
3181 supportedExtensions.eglImageExternalEssl3 = false;
3182 supportedExtensions.textureNorm16 = false;
3183 supportedExtensions.multiview = false;
3184 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003185 supportedExtensions.copyTexture3d = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003186 }
3187
3188 if (getClientVersion() < ES_3_1)
3189 {
3190 // Disable ES3.1+ extensions
3191 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003192
3193 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3194 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003195 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003196 }
3197
3198 if (getClientVersion() > ES_2_0)
3199 {
3200 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3201 // supportedExtensions.sRGB = false;
3202 }
3203
3204 // Some extensions are always available because they are implemented in the GL layer.
3205 supportedExtensions.bindUniformLocation = true;
3206 supportedExtensions.vertexArrayObject = true;
3207 supportedExtensions.bindGeneratesResource = true;
3208 supportedExtensions.clientArrays = true;
3209 supportedExtensions.requestExtension = true;
3210
3211 // Enable the no error extension if the context was created with the flag.
3212 supportedExtensions.noError = mSkipValidation;
3213
3214 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003215 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003216
3217 // Explicitly enable GL_KHR_debug
3218 supportedExtensions.debug = true;
3219 supportedExtensions.maxDebugMessageLength = 1024;
3220 supportedExtensions.maxDebugLoggedMessages = 1024;
3221 supportedExtensions.maxDebugGroupStackDepth = 1024;
3222 supportedExtensions.maxLabelLength = 1024;
3223
3224 // Explicitly enable GL_ANGLE_robust_client_memory
3225 supportedExtensions.robustClientMemory = true;
3226
3227 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003228 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003229
3230 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3231 // supports it.
3232 supportedExtensions.robustBufferAccessBehavior =
3233 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3234
3235 // Enable the cache control query unconditionally.
3236 supportedExtensions.programCacheControl = true;
3237
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003238 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003239 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003240 {
3241 // GL_ANGLE_explicit_context_gles1
3242 supportedExtensions.explicitContextGles1 = true;
3243 // GL_ANGLE_explicit_context
3244 supportedExtensions.explicitContext = true;
3245 }
3246
Geoff Lang79b91402018-10-04 15:11:30 -04003247 supportedExtensions.memorySize = true;
3248
Geoff Langb0f917f2017-12-05 13:41:54 -05003249 return supportedExtensions;
3250}
3251
Geoff Lang33f11fb2018-05-07 13:42:47 -04003252void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003253{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003254 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003255
Geoff Lang33f11fb2018-05-07 13:42:47 -04003256 mSupportedExtensions = generateSupportedExtensions();
3257 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003258
3259 mLimitations = mImplementation->getNativeLimitations();
3260
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003261 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3262 if (getClientVersion() < Version(2, 0))
3263 {
3264 mCaps.maxMultitextureUnits = 4;
3265 mCaps.maxClipPlanes = 6;
3266 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003267 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3268 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3269 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003270 mCaps.minSmoothPointSize = 1.0f;
3271 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003272 mCaps.minSmoothLineWidth = 1.0f;
3273 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003274 }
3275
Luc Ferronad2ae932018-06-11 15:31:17 -04003276 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003277 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003278
Luc Ferronad2ae932018-06-11 15:31:17 -04003279 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3280
Jamie Madill0f80ed82017-09-19 00:24:56 -04003281 if (getClientVersion() < ES_3_1)
3282 {
3283 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3284 }
3285 else
3286 {
3287 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3288 }
Geoff Lang301d1612014-07-09 10:34:37 -04003289
Jiawei Shao54aafe52018-04-27 14:54:57 +08003290 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3291 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003292 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3293
Jamie Madill0f80ed82017-09-19 00:24:56 -04003294 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3295 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3296
3297 // Limit textures as well, so we can use fast bitsets with texture bindings.
3298 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003299 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3300 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3301 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3302 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003303
Jiawei Shaodb342272017-09-27 10:21:45 +08003304 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3305
Geoff Langc287ea62016-09-16 14:46:51 -04003306 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003307 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003308 for (const auto &extensionInfo : GetExtensionInfoMap())
3309 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003310 // If the user has requested that extensions start disabled and they are requestable,
3311 // disable them.
3312 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003313 {
3314 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3315 }
3316 }
3317
3318 // Generate texture caps
3319 updateCaps();
3320}
3321
3322void Context::updateCaps()
3323{
Geoff Lang900013c2014-07-07 11:32:19 -04003324 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003325 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003326
Jamie Madill7b62cf92017-11-02 15:20:49 -04003327 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003328 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003329 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003330 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003331
Geoff Lang0d8b7242015-09-09 14:56:53 -04003332 // Update the format caps based on the client version and extensions.
3333 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3334 // ES3.
3335 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003336 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003337 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003338 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003339 formatCaps.textureAttachment =
3340 formatCaps.textureAttachment &&
3341 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3342 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3343 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003344
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003345 // OpenGL ES does not support multisampling with non-rendererable formats
3346 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003347 if (!formatCaps.renderbuffer ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003348 (getClientVersion() < ES_3_1 &&
3349 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003350 {
Geoff Langd87878e2014-09-19 15:42:59 -04003351 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003352 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003353 else
3354 {
3355 // We may have limited the max samples for some required renderbuffer formats due to
3356 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3357 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3358
3359 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3360 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3361 // exception of signed and unsigned integer formats."
3362 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3363 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3364 {
3365 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3366 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3367 }
3368
3369 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
3370 if (getClientVersion() >= ES_3_1)
3371 {
3372 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3373 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3374 // the exception that the signed and unsigned integer formats are required only to
3375 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3376 // multisamples, which must be at least one."
3377 if (formatInfo.componentType == GL_INT ||
3378 formatInfo.componentType == GL_UNSIGNED_INT)
3379 {
3380 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3381 }
3382
3383 // GLES 3.1 section 19.3.1.
3384 if (formatCaps.texturable)
3385 {
3386 if (formatInfo.depthBits > 0)
3387 {
3388 mCaps.maxDepthTextureSamples =
3389 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3390 }
3391 else if (formatInfo.redBits > 0)
3392 {
3393 mCaps.maxColorTextureSamples =
3394 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3395 }
3396 }
3397 }
3398 }
Geoff Langd87878e2014-09-19 15:42:59 -04003399
3400 if (formatCaps.texturable && formatInfo.compressed)
3401 {
Geoff Langca271392017-04-05 12:30:00 -04003402 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003403 }
3404
Geoff Langca271392017-04-05 12:30:00 -04003405 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003406 }
Jamie Madill32447362017-06-28 14:53:52 -04003407
3408 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003409 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003410 {
3411 mMemoryProgramCache = nullptr;
3412 }
Corentin Walleze4477002017-12-01 14:39:58 -05003413
3414 // Compute which buffer types are allowed
3415 mValidBufferBindings.reset();
3416 mValidBufferBindings.set(BufferBinding::ElementArray);
3417 mValidBufferBindings.set(BufferBinding::Array);
3418
3419 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3420 {
3421 mValidBufferBindings.set(BufferBinding::PixelPack);
3422 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3423 }
3424
3425 if (getClientVersion() >= ES_3_0)
3426 {
3427 mValidBufferBindings.set(BufferBinding::CopyRead);
3428 mValidBufferBindings.set(BufferBinding::CopyWrite);
3429 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3430 mValidBufferBindings.set(BufferBinding::Uniform);
3431 }
3432
3433 if (getClientVersion() >= ES_3_1)
3434 {
3435 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3436 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3437 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3438 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3439 }
jchen107ae70d82018-07-06 13:47:01 +08003440
3441 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003442
3443 // Reinitialize state cache after extension changes.
3444 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003445}
3446
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003447void Context::initWorkarounds()
3448{
Jamie Madill761b02c2017-06-23 16:27:06 -04003449 // Apply back-end workarounds.
3450 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3451
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003452 // Lose the context upon out of memory error if the application is
3453 // expecting to watch for those events.
3454 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003455
3456 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3457 {
3458 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3459 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3460 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3461 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003462}
3463
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003464// Return true if the draw is a no-op, else return false.
3465// A no-op draw occurs if the count of vertices is less than the minimum required to
3466// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3467bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3468{
3469 return count < kMinimumPrimitiveCounts[mode];
3470}
3471
3472bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3473{
3474 return (instanceCount == 0) || noopDraw(mode, count);
3475}
3476
Jamie Madill6f755b22018-10-09 12:48:54 -04003477angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003478{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003479 if (mGLES1Renderer)
3480 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003481 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003482 }
3483
Geoff Lang9bf86f02018-07-26 11:46:34 -04003484 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003485
3486 if (isRobustResourceInitEnabled())
3487 {
3488 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3489 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3490 }
3491
Geoff Langa8cb2872018-03-09 16:09:40 -05003492 ANGLE_TRY(syncDirtyBits());
Jamie Madill6f755b22018-10-09 12:48:54 -04003493 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003494}
3495
3496Error Context::prepareForClear(GLbitfield mask)
3497{
Geoff Langa8cb2872018-03-09 16:09:40 -05003498 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003499 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003500 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003501 return NoError();
3502}
3503
3504Error Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
3505{
Geoff Langa8cb2872018-03-09 16:09:40 -05003506 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003507 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3508 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003509 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill05b35b22017-10-03 09:01:44 -04003510 return NoError();
3511}
3512
Geoff Langa8cb2872018-03-09 16:09:40 -05003513Error Context::syncState(const State::DirtyBits &bitMask, const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003514{
Geoff Langa8cb2872018-03-09 16:09:40 -05003515 ANGLE_TRY(syncDirtyObjects(objectMask));
3516 ANGLE_TRY(syncDirtyBits(bitMask));
Geoff Langd4fff502017-09-22 11:28:28 -04003517 return NoError();
3518}
3519
Jamie Madill6f755b22018-10-09 12:48:54 -04003520angle::Result Context::syncDirtyBits()
Geoff Langd4fff502017-09-22 11:28:28 -04003521{
3522 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003523 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Geoff Langd4fff502017-09-22 11:28:28 -04003524 mGLState.clearDirtyBits();
Jamie Madill6f755b22018-10-09 12:48:54 -04003525 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003526}
3527
Jamie Madill6f755b22018-10-09 12:48:54 -04003528angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003529{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003530 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madill9d0bb3d2018-10-09 20:29:13 -04003531 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003532 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill6f755b22018-10-09 12:48:54 -04003533 return angle::Result::Continue();
Jamie Madill1b94d432015-08-07 13:23:23 -04003534}
Jamie Madillc29968b2016-01-20 11:17:23 -05003535
Jamie Madill6f755b22018-10-09 12:48:54 -04003536angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
Geoff Langd4fff502017-09-22 11:28:28 -04003537{
3538 return mGLState.syncDirtyObjects(this, objectMask);
3539}
3540
Jamie Madillc29968b2016-01-20 11:17:23 -05003541void Context::blitFramebuffer(GLint srcX0,
3542 GLint srcY0,
3543 GLint srcX1,
3544 GLint srcY1,
3545 GLint dstX0,
3546 GLint dstY0,
3547 GLint dstX1,
3548 GLint dstY1,
3549 GLbitfield mask,
3550 GLenum filter)
3551{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003552 if (mask == 0)
3553 {
3554 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3555 // buffers are copied.
3556 return;
3557 }
3558
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003559 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003560 ASSERT(drawFramebuffer);
3561
3562 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3563 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3564
Jamie Madillbc918e72018-03-08 09:47:21 -05003565 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003566
Jamie Madillc564c072017-06-01 12:45:42 -04003567 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003568}
Jamie Madillc29968b2016-01-20 11:17:23 -05003569
3570void Context::clear(GLbitfield mask)
3571{
Geoff Langd4fff502017-09-22 11:28:28 -04003572 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3573 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003574}
3575
3576void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3577{
Olli Etuaho78df3362018-10-05 16:43:27 +03003578 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3579 const FramebufferAttachment *attachment = nullptr;
3580 if (buffer == GL_DEPTH)
3581 {
3582 attachment = framebufferObject->getDepthbuffer();
3583 }
3584 if (buffer == GL_COLOR &&
3585 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3586 {
3587 attachment = framebufferObject->getColorbuffer(drawbuffer);
3588 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003589 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3590 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003591 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003592 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003593 return;
3594 }
Geoff Langd4fff502017-09-22 11:28:28 -04003595 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003596 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003597}
3598
3599void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3600{
Olli Etuaho78df3362018-10-05 16:43:27 +03003601 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3602 const FramebufferAttachment *attachment = nullptr;
3603 if (buffer == GL_COLOR &&
3604 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3605 {
3606 attachment = framebufferObject->getColorbuffer(drawbuffer);
3607 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003608 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3609 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003610 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003611 {
3612 return;
3613 }
Geoff Langd4fff502017-09-22 11:28:28 -04003614 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003615 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003616}
3617
3618void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3619{
Olli Etuaho78df3362018-10-05 16:43:27 +03003620 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3621 const FramebufferAttachment *attachment = nullptr;
3622 if (buffer == GL_STENCIL)
3623 {
3624 attachment = framebufferObject->getStencilbuffer();
3625 }
3626 if (buffer == GL_COLOR &&
3627 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3628 {
3629 attachment = framebufferObject->getColorbuffer(drawbuffer);
3630 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003631 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3632 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003633 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003634 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003635 return;
3636 }
Geoff Langd4fff502017-09-22 11:28:28 -04003637 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003638 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003639}
3640
3641void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3642{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003643 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003644 ASSERT(framebufferObject);
3645
3646 // If a buffer is not present, the clear has no effect
3647 if (framebufferObject->getDepthbuffer() == nullptr &&
3648 framebufferObject->getStencilbuffer() == nullptr)
3649 {
3650 return;
3651 }
3652
Geoff Langd4fff502017-09-22 11:28:28 -04003653 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3654 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003655}
3656
3657void Context::readPixels(GLint x,
3658 GLint y,
3659 GLsizei width,
3660 GLsizei height,
3661 GLenum format,
3662 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003663 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003664{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003665 if (width == 0 || height == 0)
3666 {
3667 return;
3668 }
3669
Jamie Madillbc918e72018-03-08 09:47:21 -05003670 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003671
Jamie Madillb6664922017-07-25 12:55:04 -04003672 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3673 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003674
3675 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003676 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003677}
3678
Brandon Jones59770802018-04-02 13:18:42 -07003679void Context::readPixelsRobust(GLint x,
3680 GLint y,
3681 GLsizei width,
3682 GLsizei height,
3683 GLenum format,
3684 GLenum type,
3685 GLsizei bufSize,
3686 GLsizei *length,
3687 GLsizei *columns,
3688 GLsizei *rows,
3689 void *pixels)
3690{
3691 readPixels(x, y, width, height, format, type, pixels);
3692}
3693
3694void Context::readnPixelsRobust(GLint x,
3695 GLint y,
3696 GLsizei width,
3697 GLsizei height,
3698 GLenum format,
3699 GLenum type,
3700 GLsizei bufSize,
3701 GLsizei *length,
3702 GLsizei *columns,
3703 GLsizei *rows,
3704 void *data)
3705{
3706 readPixels(x, y, width, height, format, type, data);
3707}
3708
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003709void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003710 GLint level,
3711 GLenum internalformat,
3712 GLint x,
3713 GLint y,
3714 GLsizei width,
3715 GLsizei height,
3716 GLint border)
3717{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003718 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003719 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003720
Jamie Madillc29968b2016-01-20 11:17:23 -05003721 Rectangle sourceArea(x, y, width, height);
3722
Jamie Madill05b35b22017-10-03 09:01:44 -04003723 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003724 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003725 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003726}
3727
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003728void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003729 GLint level,
3730 GLint xoffset,
3731 GLint yoffset,
3732 GLint x,
3733 GLint y,
3734 GLsizei width,
3735 GLsizei height)
3736{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003737 if (width == 0 || height == 0)
3738 {
3739 return;
3740 }
3741
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003742 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003743 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003744
Jamie Madillc29968b2016-01-20 11:17:23 -05003745 Offset destOffset(xoffset, yoffset, 0);
3746 Rectangle sourceArea(x, y, width, height);
3747
Jamie Madill05b35b22017-10-03 09:01:44 -04003748 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003749 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003750 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003751}
3752
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003753void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003754 GLint level,
3755 GLint xoffset,
3756 GLint yoffset,
3757 GLint zoffset,
3758 GLint x,
3759 GLint y,
3760 GLsizei width,
3761 GLsizei height)
3762{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003763 if (width == 0 || height == 0)
3764 {
3765 return;
3766 }
3767
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003768 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003769 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003770
Jamie Madillc29968b2016-01-20 11:17:23 -05003771 Offset destOffset(xoffset, yoffset, zoffset);
3772 Rectangle sourceArea(x, y, width, height);
3773
Jamie Madill05b35b22017-10-03 09:01:44 -04003774 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3775 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003776 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3777 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003778}
3779
3780void Context::framebufferTexture2D(GLenum target,
3781 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003782 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003783 GLuint texture,
3784 GLint level)
3785{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003786 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003787 ASSERT(framebuffer);
3788
3789 if (texture != 0)
3790 {
3791 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003792 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003793 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003794 }
3795 else
3796 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003797 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003798 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003799
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003800 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003801}
3802
3803void Context::framebufferRenderbuffer(GLenum target,
3804 GLenum attachment,
3805 GLenum renderbuffertarget,
3806 GLuint renderbuffer)
3807{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003808 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003809 ASSERT(framebuffer);
3810
3811 if (renderbuffer != 0)
3812 {
3813 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003814
Jamie Madillcc129372018-04-12 09:13:18 -04003815 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003816 renderbufferObject);
3817 }
3818 else
3819 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003820 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003821 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003822
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003823 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003824}
3825
3826void Context::framebufferTextureLayer(GLenum target,
3827 GLenum attachment,
3828 GLuint texture,
3829 GLint level,
3830 GLint layer)
3831{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003832 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003833 ASSERT(framebuffer);
3834
3835 if (texture != 0)
3836 {
3837 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003838 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003839 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003840 }
3841 else
3842 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003843 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003844 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003845
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003846 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003847}
3848
Brandon Jones59770802018-04-02 13:18:42 -07003849void Context::framebufferTextureMultiviewLayered(GLenum target,
3850 GLenum attachment,
3851 GLuint texture,
3852 GLint level,
3853 GLint baseViewIndex,
3854 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003855{
Martin Radev82ef7742017-08-08 17:44:58 +03003856 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3857 ASSERT(framebuffer);
3858
3859 if (texture != 0)
3860 {
3861 Texture *textureObj = getTexture(texture);
3862
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003863 ImageIndex index;
3864 if (textureObj->getType() == TextureType::_2DArray)
3865 {
3866 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3867 }
3868 else
3869 {
3870 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3871 ASSERT(level == 0);
3872 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3873 }
Martin Radev82ef7742017-08-08 17:44:58 +03003874 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3875 numViews, baseViewIndex);
3876 }
3877 else
3878 {
3879 framebuffer->resetAttachment(this, attachment);
3880 }
3881
3882 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003883}
3884
Brandon Jones59770802018-04-02 13:18:42 -07003885void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3886 GLenum attachment,
3887 GLuint texture,
3888 GLint level,
3889 GLsizei numViews,
3890 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003891{
Martin Radev5dae57b2017-07-14 16:15:55 +03003892 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3893 ASSERT(framebuffer);
3894
3895 if (texture != 0)
3896 {
3897 Texture *textureObj = getTexture(texture);
3898
3899 ImageIndex index = ImageIndex::Make2D(level);
3900 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3901 textureObj, numViews, viewportOffsets);
3902 }
3903 else
3904 {
3905 framebuffer->resetAttachment(this, attachment);
3906 }
3907
3908 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003909}
3910
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003911void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3912{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003913 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3914 ASSERT(framebuffer);
3915
3916 if (texture != 0)
3917 {
3918 Texture *textureObj = getTexture(texture);
3919
3920 ImageIndex index = ImageIndex::MakeFromType(
3921 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3922 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3923 }
3924 else
3925 {
3926 framebuffer->resetAttachment(this, attachment);
3927 }
3928
3929 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003930}
3931
Jamie Madillc29968b2016-01-20 11:17:23 -05003932void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3933{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003934 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003935 ASSERT(framebuffer);
3936 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003937 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003938 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003939}
3940
3941void Context::readBuffer(GLenum mode)
3942{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003943 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003944 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003945 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003946}
3947
3948void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3949{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003950 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003951 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003952
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003953 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003954 ASSERT(framebuffer);
3955
3956 // The specification isn't clear what should be done when the framebuffer isn't complete.
3957 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003958 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003959}
3960
3961void Context::invalidateFramebuffer(GLenum target,
3962 GLsizei numAttachments,
3963 const GLenum *attachments)
3964{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003965 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003966 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003967
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003968 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003969 ASSERT(framebuffer);
3970
Jamie Madill427064d2018-04-13 16:20:34 -04003971 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003972 {
Jamie Madill437fa652016-05-03 15:13:24 -04003973 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003974 }
Jamie Madill437fa652016-05-03 15:13:24 -04003975
Jamie Madill4928b7c2017-06-20 12:57:39 -04003976 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003977}
3978
3979void Context::invalidateSubFramebuffer(GLenum target,
3980 GLsizei numAttachments,
3981 const GLenum *attachments,
3982 GLint x,
3983 GLint y,
3984 GLsizei width,
3985 GLsizei height)
3986{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003987 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003988 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003989
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003990 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003991 ASSERT(framebuffer);
3992
Jamie Madill427064d2018-04-13 16:20:34 -04003993 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003994 {
Jamie Madill437fa652016-05-03 15:13:24 -04003995 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003996 }
Jamie Madill437fa652016-05-03 15:13:24 -04003997
3998 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003999 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004000}
4001
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004002void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004003 GLint level,
4004 GLint internalformat,
4005 GLsizei width,
4006 GLsizei height,
4007 GLint border,
4008 GLenum format,
4009 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004010 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004011{
Jamie Madillbc918e72018-03-08 09:47:21 -05004012 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004013
4014 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004015 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004016 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004017 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004018}
4019
Brandon Jones59770802018-04-02 13:18:42 -07004020void Context::texImage2DRobust(TextureTarget target,
4021 GLint level,
4022 GLint internalformat,
4023 GLsizei width,
4024 GLsizei height,
4025 GLint border,
4026 GLenum format,
4027 GLenum type,
4028 GLsizei bufSize,
4029 const void *pixels)
4030{
4031 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4032}
4033
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004034void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004035 GLint level,
4036 GLint internalformat,
4037 GLsizei width,
4038 GLsizei height,
4039 GLsizei depth,
4040 GLint border,
4041 GLenum format,
4042 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004043 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004044{
Jamie Madillbc918e72018-03-08 09:47:21 -05004045 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004046
4047 Extents size(width, height, depth);
4048 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004049 handleError(texture->setImage(this, mGLState.getUnpackState(),
4050 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004051 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004052}
4053
Brandon Jones59770802018-04-02 13:18:42 -07004054void Context::texImage3DRobust(TextureType target,
4055 GLint level,
4056 GLint internalformat,
4057 GLsizei width,
4058 GLsizei height,
4059 GLsizei depth,
4060 GLint border,
4061 GLenum format,
4062 GLenum type,
4063 GLsizei bufSize,
4064 const void *pixels)
4065{
4066 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4067}
4068
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004069void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004070 GLint level,
4071 GLint xoffset,
4072 GLint yoffset,
4073 GLsizei width,
4074 GLsizei height,
4075 GLenum format,
4076 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004077 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004078{
4079 // Zero sized uploads are valid but no-ops
4080 if (width == 0 || height == 0)
4081 {
4082 return;
4083 }
4084
Jamie Madillbc918e72018-03-08 09:47:21 -05004085 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004086
4087 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004088 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004089
4090 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4091
4092 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4093 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004094}
4095
Brandon Jones59770802018-04-02 13:18:42 -07004096void Context::texSubImage2DRobust(TextureTarget target,
4097 GLint level,
4098 GLint xoffset,
4099 GLint yoffset,
4100 GLsizei width,
4101 GLsizei height,
4102 GLenum format,
4103 GLenum type,
4104 GLsizei bufSize,
4105 const void *pixels)
4106{
4107 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4108}
4109
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004110void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004111 GLint level,
4112 GLint xoffset,
4113 GLint yoffset,
4114 GLint zoffset,
4115 GLsizei width,
4116 GLsizei height,
4117 GLsizei depth,
4118 GLenum format,
4119 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004120 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004121{
4122 // Zero sized uploads are valid but no-ops
4123 if (width == 0 || height == 0 || depth == 0)
4124 {
4125 return;
4126 }
4127
Jamie Madillbc918e72018-03-08 09:47:21 -05004128 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004129
4130 Box area(xoffset, yoffset, zoffset, width, height, depth);
4131 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004132
4133 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4134
4135 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004136 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004137 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004138}
4139
Brandon Jones59770802018-04-02 13:18:42 -07004140void Context::texSubImage3DRobust(TextureType target,
4141 GLint level,
4142 GLint xoffset,
4143 GLint yoffset,
4144 GLint zoffset,
4145 GLsizei width,
4146 GLsizei height,
4147 GLsizei depth,
4148 GLenum format,
4149 GLenum type,
4150 GLsizei bufSize,
4151 const void *pixels)
4152{
4153 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4154 pixels);
4155}
4156
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004157void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004158 GLint level,
4159 GLenum internalformat,
4160 GLsizei width,
4161 GLsizei height,
4162 GLint border,
4163 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004164 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004165{
Jamie Madillbc918e72018-03-08 09:47:21 -05004166 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004167
4168 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004169 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004170 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4171 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004172 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004173}
4174
Brandon Jones59770802018-04-02 13:18:42 -07004175void Context::compressedTexImage2DRobust(TextureTarget target,
4176 GLint level,
4177 GLenum internalformat,
4178 GLsizei width,
4179 GLsizei height,
4180 GLint border,
4181 GLsizei imageSize,
4182 GLsizei dataSize,
4183 const GLvoid *data)
4184{
4185 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4186}
4187
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004188void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004189 GLint level,
4190 GLenum internalformat,
4191 GLsizei width,
4192 GLsizei height,
4193 GLsizei depth,
4194 GLint border,
4195 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004196 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004197{
Jamie Madillbc918e72018-03-08 09:47:21 -05004198 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004199
4200 Extents size(width, height, depth);
4201 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004202 handleError(texture->setCompressedImage(
4203 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004204 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004205}
4206
Brandon Jones59770802018-04-02 13:18:42 -07004207void Context::compressedTexImage3DRobust(TextureType target,
4208 GLint level,
4209 GLenum internalformat,
4210 GLsizei width,
4211 GLsizei height,
4212 GLsizei depth,
4213 GLint border,
4214 GLsizei imageSize,
4215 GLsizei dataSize,
4216 const GLvoid *data)
4217{
4218 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4219 data);
4220}
4221
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004222void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004223 GLint level,
4224 GLint xoffset,
4225 GLint yoffset,
4226 GLsizei width,
4227 GLsizei height,
4228 GLenum format,
4229 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004230 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004231{
Jamie Madillbc918e72018-03-08 09:47:21 -05004232 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004233
4234 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004235 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004236 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4237 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004238 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004239}
4240
Brandon Jones59770802018-04-02 13:18:42 -07004241void Context::compressedTexSubImage2DRobust(TextureTarget target,
4242 GLint level,
4243 GLint xoffset,
4244 GLint yoffset,
4245 GLsizei width,
4246 GLsizei height,
4247 GLenum format,
4248 GLsizei imageSize,
4249 GLsizei dataSize,
4250 const GLvoid *data)
4251{
4252 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4253 data);
4254}
4255
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004256void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004257 GLint level,
4258 GLint xoffset,
4259 GLint yoffset,
4260 GLint zoffset,
4261 GLsizei width,
4262 GLsizei height,
4263 GLsizei depth,
4264 GLenum format,
4265 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004266 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004267{
4268 // Zero sized uploads are valid but no-ops
4269 if (width == 0 || height == 0)
4270 {
4271 return;
4272 }
4273
Jamie Madillbc918e72018-03-08 09:47:21 -05004274 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004275
4276 Box area(xoffset, yoffset, zoffset, width, height, depth);
4277 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004278 handleError(texture->setCompressedSubImage(
4279 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004280 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004281}
4282
Brandon Jones59770802018-04-02 13:18:42 -07004283void Context::compressedTexSubImage3DRobust(TextureType target,
4284 GLint level,
4285 GLint xoffset,
4286 GLint yoffset,
4287 GLint zoffset,
4288 GLsizei width,
4289 GLsizei height,
4290 GLsizei depth,
4291 GLenum format,
4292 GLsizei imageSize,
4293 GLsizei dataSize,
4294 const GLvoid *data)
4295{
4296 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4297 imageSize, data);
4298}
4299
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004300void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004301{
4302 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004303 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004304}
4305
Jamie Madill007530e2017-12-28 14:27:04 -05004306void Context::copyTexture(GLuint sourceId,
4307 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004308 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004309 GLuint destId,
4310 GLint destLevel,
4311 GLint internalFormat,
4312 GLenum destType,
4313 GLboolean unpackFlipY,
4314 GLboolean unpackPremultiplyAlpha,
4315 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004316{
Jamie Madillbc918e72018-03-08 09:47:21 -05004317 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004318
4319 gl::Texture *sourceTexture = getTexture(sourceId);
4320 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004321 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4322 sourceLevel, ConvertToBool(unpackFlipY),
4323 ConvertToBool(unpackPremultiplyAlpha),
4324 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004325}
4326
Jamie Madill007530e2017-12-28 14:27:04 -05004327void Context::copySubTexture(GLuint sourceId,
4328 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004329 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004330 GLuint destId,
4331 GLint destLevel,
4332 GLint xoffset,
4333 GLint yoffset,
4334 GLint x,
4335 GLint y,
4336 GLsizei width,
4337 GLsizei height,
4338 GLboolean unpackFlipY,
4339 GLboolean unpackPremultiplyAlpha,
4340 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004341{
4342 // Zero sized copies are valid but no-ops
4343 if (width == 0 || height == 0)
4344 {
4345 return;
4346 }
4347
Jamie Madillbc918e72018-03-08 09:47:21 -05004348 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004349
4350 gl::Texture *sourceTexture = getTexture(sourceId);
4351 gl::Texture *destTexture = getTexture(destId);
4352 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004353 Box box(x, y, 0, width, height, 1);
4354 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4355 ConvertToBool(unpackFlipY),
4356 ConvertToBool(unpackPremultiplyAlpha),
4357 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4358}
4359
4360void Context::copyTexture3D(GLuint sourceId,
4361 GLint sourceLevel,
4362 TextureTarget destTarget,
4363 GLuint destId,
4364 GLint destLevel,
4365 GLint internalFormat,
4366 GLenum destType,
4367 GLboolean unpackFlipY,
4368 GLboolean unpackPremultiplyAlpha,
4369 GLboolean unpackUnmultiplyAlpha)
4370{
4371 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4372
4373 Texture *sourceTexture = getTexture(sourceId);
4374 Texture *destTexture = getTexture(destId);
4375 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4376 sourceLevel, ConvertToBool(unpackFlipY),
4377 ConvertToBool(unpackPremultiplyAlpha),
4378 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4379}
4380
4381void Context::copySubTexture3D(GLuint sourceId,
4382 GLint sourceLevel,
4383 TextureTarget destTarget,
4384 GLuint destId,
4385 GLint destLevel,
4386 GLint xoffset,
4387 GLint yoffset,
4388 GLint zoffset,
4389 GLint x,
4390 GLint y,
4391 GLint z,
4392 GLsizei width,
4393 GLsizei height,
4394 GLsizei depth,
4395 GLboolean unpackFlipY,
4396 GLboolean unpackPremultiplyAlpha,
4397 GLboolean unpackUnmultiplyAlpha)
4398{
4399 // Zero sized copies are valid but no-ops
4400 if (width == 0 || height == 0 || depth == 0)
4401 {
4402 return;
4403 }
4404
4405 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4406
4407 Texture *sourceTexture = getTexture(sourceId);
4408 Texture *destTexture = getTexture(destId);
4409 Offset offset(xoffset, yoffset, zoffset);
4410 Box box(x, y, z, width, height, depth);
4411 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004412 ConvertToBool(unpackFlipY),
4413 ConvertToBool(unpackPremultiplyAlpha),
4414 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004415}
4416
Jamie Madill007530e2017-12-28 14:27:04 -05004417void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004418{
Jamie Madillbc918e72018-03-08 09:47:21 -05004419 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004420
4421 gl::Texture *sourceTexture = getTexture(sourceId);
4422 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004423 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004424}
4425
Corentin Wallez336129f2017-10-17 15:55:40 -04004426void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
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
Geoff Lang496c02d2016-10-20 11:38:11 -07004431 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004432}
4433
Brandon Jones59770802018-04-02 13:18:42 -07004434void Context::getBufferPointervRobust(BufferBinding target,
4435 GLenum pname,
4436 GLsizei bufSize,
4437 GLsizei *length,
4438 void **params)
4439{
4440 getBufferPointerv(target, pname, params);
4441}
4442
Corentin Wallez336129f2017-10-17 15:55:40 -04004443void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004444{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004445 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004446 ASSERT(buffer);
4447
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004448 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004449 if (error.isError())
4450 {
Jamie Madill437fa652016-05-03 15:13:24 -04004451 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004452 return nullptr;
4453 }
4454
4455 return buffer->getMapPointer();
4456}
4457
Corentin Wallez336129f2017-10-17 15:55:40 -04004458GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004459{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004460 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004461 ASSERT(buffer);
4462
4463 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004464 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004465 if (error.isError())
4466 {
Jamie Madill437fa652016-05-03 15:13:24 -04004467 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004468 return GL_FALSE;
4469 }
4470
4471 return result;
4472}
4473
Corentin Wallez336129f2017-10-17 15:55:40 -04004474void *Context::mapBufferRange(BufferBinding target,
4475 GLintptr offset,
4476 GLsizeiptr length,
4477 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004478{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004479 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004480 ASSERT(buffer);
4481
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004482 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004483 if (error.isError())
4484 {
Jamie Madill437fa652016-05-03 15:13:24 -04004485 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004486 return nullptr;
4487 }
4488
4489 return buffer->getMapPointer();
4490}
4491
Corentin Wallez336129f2017-10-17 15:55:40 -04004492void Context::flushMappedBufferRange(BufferBinding /*target*/,
4493 GLintptr /*offset*/,
4494 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004495{
4496 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4497}
4498
Jamie Madillbc918e72018-03-08 09:47:21 -05004499Error Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004500{
Geoff Langa8cb2872018-03-09 16:09:40 -05004501 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004502}
4503
Jamie Madillbc918e72018-03-08 09:47:21 -05004504Error Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004505{
Geoff Langa8cb2872018-03-09 16:09:40 -05004506 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004507}
4508
Jamie Madillbc918e72018-03-08 09:47:21 -05004509Error Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004510{
Geoff Langa8cb2872018-03-09 16:09:40 -05004511 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004512}
4513
Geoff Lang9bf86f02018-07-26 11:46:34 -04004514Error Context::syncStateForPathOperation()
4515{
4516 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4517
4518 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4519 ANGLE_TRY(syncDirtyBits());
4520
4521 return NoError();
4522}
4523
Jiajia Qin5451d532017-11-16 17:16:34 +08004524void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4525{
4526 UNIMPLEMENTED();
4527}
4528
Jamie Madillc20ab272016-06-09 07:20:46 -07004529void Context::activeTexture(GLenum texture)
4530{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004531 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004532}
4533
Jamie Madill876429b2017-04-20 15:46:24 -04004534void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004535{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004536 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004537}
4538
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004539void Context::blendEquation(GLenum mode)
4540{
4541 mGLState.setBlendEquation(mode, mode);
4542}
4543
Jamie Madillc20ab272016-06-09 07:20:46 -07004544void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4545{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004546 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004547}
4548
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004549void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4550{
4551 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4552}
4553
Jamie Madillc20ab272016-06-09 07:20:46 -07004554void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4555{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004556 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004557}
4558
Jamie Madill876429b2017-04-20 15:46:24 -04004559void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004560{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004561 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004562}
4563
Jamie Madill876429b2017-04-20 15:46:24 -04004564void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004565{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004566 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004567}
4568
4569void Context::clearStencil(GLint s)
4570{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004571 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004572}
4573
4574void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4575{
Geoff Lang92019432017-11-20 13:09:34 -05004576 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4577 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004578}
4579
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004580void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004581{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004582 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004583}
4584
4585void Context::depthFunc(GLenum func)
4586{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004587 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004588}
4589
4590void Context::depthMask(GLboolean flag)
4591{
Geoff Lang92019432017-11-20 13:09:34 -05004592 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004593}
4594
Jamie Madill876429b2017-04-20 15:46:24 -04004595void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004596{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004597 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004598}
4599
4600void Context::disable(GLenum cap)
4601{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004602 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004603 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004604}
4605
4606void Context::disableVertexAttribArray(GLuint index)
4607{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004608 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004609 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004610}
4611
4612void Context::enable(GLenum cap)
4613{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004614 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004615 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004616}
4617
4618void Context::enableVertexAttribArray(GLuint index)
4619{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004620 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004621 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004622}
4623
4624void Context::frontFace(GLenum mode)
4625{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004626 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004627}
4628
4629void Context::hint(GLenum target, GLenum mode)
4630{
4631 switch (target)
4632 {
4633 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004634 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004635 break;
4636
4637 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004638 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004639 break;
4640
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004641 case GL_PERSPECTIVE_CORRECTION_HINT:
4642 case GL_POINT_SMOOTH_HINT:
4643 case GL_LINE_SMOOTH_HINT:
4644 case GL_FOG_HINT:
4645 mGLState.gles1().setHint(target, mode);
4646 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004647 default:
4648 UNREACHABLE();
4649 return;
4650 }
4651}
4652
4653void Context::lineWidth(GLfloat width)
4654{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004655 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004656}
4657
4658void Context::pixelStorei(GLenum pname, GLint param)
4659{
4660 switch (pname)
4661 {
4662 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004663 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004664 break;
4665
4666 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004667 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004668 break;
4669
4670 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004671 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004672 break;
4673
4674 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004675 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004676 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004677 break;
4678
4679 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004680 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004681 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004682 break;
4683
4684 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004685 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004686 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004687 break;
4688
4689 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004690 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692 break;
4693
4694 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004695 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004696 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004697 break;
4698
4699 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004700 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004701 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004702 break;
4703
4704 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004705 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004706 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004707 break;
4708
4709 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004710 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004711 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004712 break;
4713
4714 default:
4715 UNREACHABLE();
4716 return;
4717 }
4718}
4719
4720void Context::polygonOffset(GLfloat factor, GLfloat units)
4721{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004722 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004723}
4724
Jamie Madill876429b2017-04-20 15:46:24 -04004725void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004726{
Geoff Lang92019432017-11-20 13:09:34 -05004727 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004728}
4729
Jiawei Shaodb342272017-09-27 10:21:45 +08004730void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4731{
4732 mGLState.setSampleMaskParams(maskNumber, mask);
4733}
4734
Jamie Madillc20ab272016-06-09 07:20:46 -07004735void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4736{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004737 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004738}
4739
4740void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4741{
4742 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4743 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004744 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745 }
4746
4747 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4748 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004749 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004751
4752 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004753}
4754
4755void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4756{
4757 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4758 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004759 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004760 }
4761
4762 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4763 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004764 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004765 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004766
4767 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004768}
4769
4770void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4771{
4772 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4773 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004774 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004775 }
4776
4777 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4778 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004779 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004780 }
4781}
4782
4783void Context::vertexAttrib1f(GLuint index, GLfloat x)
4784{
4785 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004786 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004787 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004788}
4789
4790void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4791{
4792 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004793 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004794 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004795}
4796
4797void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4798{
4799 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004800 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004801 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004802}
4803
4804void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4805{
4806 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004807 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004808 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004809}
4810
4811void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4812{
4813 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004814 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004815 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004816}
4817
4818void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4819{
4820 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004821 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004822 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004823}
4824
4825void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4826{
4827 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004828 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004829 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004830}
4831
4832void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4833{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004834 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004835 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004836}
4837
4838void Context::vertexAttribPointer(GLuint index,
4839 GLint size,
4840 GLenum type,
4841 GLboolean normalized,
4842 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004843 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004844{
Corentin Wallez336129f2017-10-17 15:55:40 -04004845 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004846 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004847 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004848}
4849
Shao80957d92017-02-20 21:25:59 +08004850void Context::vertexAttribFormat(GLuint attribIndex,
4851 GLint size,
4852 GLenum type,
4853 GLboolean normalized,
4854 GLuint relativeOffset)
4855{
Geoff Lang92019432017-11-20 13:09:34 -05004856 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004857 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004858 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004859}
4860
4861void Context::vertexAttribIFormat(GLuint attribIndex,
4862 GLint size,
4863 GLenum type,
4864 GLuint relativeOffset)
4865{
4866 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004867 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004868}
4869
4870void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4871{
Shaodde78e82017-05-22 14:13:27 +08004872 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004873 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004874}
4875
Jiajia Qin5451d532017-11-16 17:16:34 +08004876void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004877{
4878 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004879 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004880}
4881
Jamie Madillc20ab272016-06-09 07:20:46 -07004882void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4883{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004884 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004885}
4886
4887void Context::vertexAttribIPointer(GLuint index,
4888 GLint size,
4889 GLenum type,
4890 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004891 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004892{
Corentin Wallez336129f2017-10-17 15:55:40 -04004893 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4894 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004895 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004896}
4897
4898void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4899{
4900 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004901 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004902 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004903}
4904
4905void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4906{
4907 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004908 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004909 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004910}
4911
4912void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4913{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004914 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004915 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004916}
4917
4918void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4919{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004920 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004921 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004922}
4923
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004924void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4925{
4926 const VertexAttribCurrentValueData &currentValues =
4927 getGLState().getVertexAttribCurrentValue(index);
4928 const VertexArray *vao = getGLState().getVertexArray();
4929 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4930 currentValues, pname, params);
4931}
4932
Brandon Jones59770802018-04-02 13:18:42 -07004933void Context::getVertexAttribivRobust(GLuint index,
4934 GLenum pname,
4935 GLsizei bufSize,
4936 GLsizei *length,
4937 GLint *params)
4938{
4939 getVertexAttribiv(index, pname, params);
4940}
4941
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004942void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4943{
4944 const VertexAttribCurrentValueData &currentValues =
4945 getGLState().getVertexAttribCurrentValue(index);
4946 const VertexArray *vao = getGLState().getVertexArray();
4947 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4948 currentValues, pname, params);
4949}
4950
Brandon Jones59770802018-04-02 13:18:42 -07004951void Context::getVertexAttribfvRobust(GLuint index,
4952 GLenum pname,
4953 GLsizei bufSize,
4954 GLsizei *length,
4955 GLfloat *params)
4956{
4957 getVertexAttribfv(index, pname, params);
4958}
4959
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004960void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4961{
4962 const VertexAttribCurrentValueData &currentValues =
4963 getGLState().getVertexAttribCurrentValue(index);
4964 const VertexArray *vao = getGLState().getVertexArray();
4965 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4966 currentValues, pname, params);
4967}
4968
Brandon Jones59770802018-04-02 13:18:42 -07004969void Context::getVertexAttribIivRobust(GLuint index,
4970 GLenum pname,
4971 GLsizei bufSize,
4972 GLsizei *length,
4973 GLint *params)
4974{
4975 getVertexAttribIiv(index, pname, params);
4976}
4977
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004978void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4979{
4980 const VertexAttribCurrentValueData &currentValues =
4981 getGLState().getVertexAttribCurrentValue(index);
4982 const VertexArray *vao = getGLState().getVertexArray();
4983 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4984 currentValues, pname, params);
4985}
4986
Brandon Jones59770802018-04-02 13:18:42 -07004987void Context::getVertexAttribIuivRobust(GLuint index,
4988 GLenum pname,
4989 GLsizei bufSize,
4990 GLsizei *length,
4991 GLuint *params)
4992{
4993 getVertexAttribIuiv(index, pname, params);
4994}
4995
Jamie Madill876429b2017-04-20 15:46:24 -04004996void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004997{
4998 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4999 QueryVertexAttribPointerv(attrib, pname, pointer);
5000}
5001
Brandon Jones59770802018-04-02 13:18:42 -07005002void Context::getVertexAttribPointervRobust(GLuint index,
5003 GLenum pname,
5004 GLsizei bufSize,
5005 GLsizei *length,
5006 void **pointer)
5007{
5008 getVertexAttribPointerv(index, pname, pointer);
5009}
5010
Jamie Madillc20ab272016-06-09 07:20:46 -07005011void Context::debugMessageControl(GLenum source,
5012 GLenum type,
5013 GLenum severity,
5014 GLsizei count,
5015 const GLuint *ids,
5016 GLboolean enabled)
5017{
5018 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005019 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005020 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005021}
5022
5023void Context::debugMessageInsert(GLenum source,
5024 GLenum type,
5025 GLuint id,
5026 GLenum severity,
5027 GLsizei length,
5028 const GLchar *buf)
5029{
5030 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005031 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005032}
5033
5034void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5035{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005036 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005037}
5038
5039GLuint Context::getDebugMessageLog(GLuint count,
5040 GLsizei bufSize,
5041 GLenum *sources,
5042 GLenum *types,
5043 GLuint *ids,
5044 GLenum *severities,
5045 GLsizei *lengths,
5046 GLchar *messageLog)
5047{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005048 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5049 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005050}
5051
5052void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5053{
5054 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005055 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005056 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005057}
5058
5059void Context::popDebugGroup()
5060{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005061 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005062 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005063}
5064
Corentin Wallez336129f2017-10-17 15:55:40 -04005065void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005066{
5067 Buffer *buffer = mGLState.getTargetBuffer(target);
5068 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005069 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005070}
5071
Corentin Wallez336129f2017-10-17 15:55:40 -04005072void Context::bufferSubData(BufferBinding target,
5073 GLintptr offset,
5074 GLsizeiptr size,
5075 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005076{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005077 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005078 {
5079 return;
5080 }
5081
5082 Buffer *buffer = mGLState.getTargetBuffer(target);
5083 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005084 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005085}
5086
Jamie Madillef300b12016-10-07 15:12:09 -04005087void Context::attachShader(GLuint program, GLuint shader)
5088{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005089 Program *programObject = mState.mShaderPrograms->getProgram(program);
5090 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005091 ASSERT(programObject && shaderObject);
5092 programObject->attachShader(shaderObject);
5093}
5094
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005095const Workarounds &Context::getWorkarounds() const
5096{
5097 return mWorkarounds;
5098}
5099
Corentin Wallez336129f2017-10-17 15:55:40 -04005100void Context::copyBufferSubData(BufferBinding readTarget,
5101 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005102 GLintptr readOffset,
5103 GLintptr writeOffset,
5104 GLsizeiptr size)
5105{
5106 // if size is zero, the copy is a successful no-op
5107 if (size == 0)
5108 {
5109 return;
5110 }
5111
5112 // TODO(jmadill): cache these.
5113 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5114 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5115
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005116 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005117}
5118
Jamie Madill01a80ee2016-11-07 12:06:18 -05005119void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5120{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005121 // Ideally we could share the program query with the validation layer if possible.
5122 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005123 ASSERT(programObject);
5124 programObject->bindAttributeLocation(index, name);
5125}
5126
Corentin Wallez336129f2017-10-17 15:55:40 -04005127void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005128{
Corentin Wallez336129f2017-10-17 15:55:40 -04005129 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5130 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005131 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005132}
5133
Corentin Wallez336129f2017-10-17 15:55:40 -04005134void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005135{
5136 bindBufferRange(target, index, buffer, 0, 0);
5137}
5138
Corentin Wallez336129f2017-10-17 15:55:40 -04005139void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005140 GLuint index,
5141 GLuint buffer,
5142 GLintptr offset,
5143 GLsizeiptr size)
5144{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005145 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5146 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5147 if (target == BufferBinding::Uniform)
5148 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005149 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005150 mStateCache.onUniformBufferStateChange(this);
5151 }
5152 else
5153 {
5154 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005155 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005156}
5157
Jamie Madill01a80ee2016-11-07 12:06:18 -05005158void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5159{
5160 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5161 {
5162 bindReadFramebuffer(framebuffer);
5163 }
5164
5165 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5166 {
5167 bindDrawFramebuffer(framebuffer);
5168 }
5169}
5170
5171void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5172{
5173 ASSERT(target == GL_RENDERBUFFER);
5174 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005175 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005176 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005177}
5178
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005179void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005180 GLsizei samples,
5181 GLenum internalformat,
5182 GLsizei width,
5183 GLsizei height,
5184 GLboolean fixedsamplelocations)
5185{
5186 Extents size(width, height, 1);
5187 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005188 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5189 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005190}
5191
Olli Etuaho89664842018-08-24 14:45:36 +03005192void Context::texStorage3DMultisample(TextureType target,
5193 GLsizei samples,
5194 GLenum internalformat,
5195 GLsizei width,
5196 GLsizei height,
5197 GLsizei depth,
5198 GLboolean fixedsamplelocations)
5199{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005200 Extents size(width, height, depth);
5201 Texture *texture = getTargetTexture(target);
5202 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5203 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005204}
5205
JiangYizhoubddc46b2016-12-09 09:50:51 +08005206void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5207{
JiangYizhou5b03f472017-01-09 10:22:53 +08005208 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5209 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005210 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005211 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005212
5213 switch (pname)
5214 {
5215 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005216 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005217 break;
5218 default:
5219 UNREACHABLE();
5220 }
5221}
5222
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005223void Context::getMultisamplefvRobust(GLenum pname,
5224 GLuint index,
5225 GLsizei bufSize,
5226 GLsizei *length,
5227 GLfloat *val)
5228{
5229 UNIMPLEMENTED();
5230}
5231
Jamie Madille8fb6402017-02-14 17:56:40 -05005232void Context::renderbufferStorage(GLenum target,
5233 GLenum internalformat,
5234 GLsizei width,
5235 GLsizei height)
5236{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005237 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5238 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5239
Jamie Madille8fb6402017-02-14 17:56:40 -05005240 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005241 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005242}
5243
5244void Context::renderbufferStorageMultisample(GLenum target,
5245 GLsizei samples,
5246 GLenum internalformat,
5247 GLsizei width,
5248 GLsizei height)
5249{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005250 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5251 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005252
5253 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005254 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005255 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005256}
5257
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005258void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5259{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005260 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005261 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005262}
5263
JiangYizhoue18e6392017-02-20 10:32:23 +08005264void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5265{
5266 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5267 QueryFramebufferParameteriv(framebuffer, pname, params);
5268}
5269
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005270void Context::getFramebufferParameterivRobust(GLenum target,
5271 GLenum pname,
5272 GLsizei bufSize,
5273 GLsizei *length,
5274 GLint *params)
5275{
5276 UNIMPLEMENTED();
5277}
5278
Jiajia Qin5451d532017-11-16 17:16:34 +08005279void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005280{
5281 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005282 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005283}
5284
Jamie Madilldec86232018-07-11 09:01:18 -04005285bool Context::getScratchBuffer(size_t requstedSizeBytes,
5286 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005287{
Jamie Madilldec86232018-07-11 09:01:18 -04005288 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005289}
5290
Jamie Madilldec86232018-07-11 09:01:18 -04005291bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5292 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005293{
Jamie Madilldec86232018-07-11 09:01:18 -04005294 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005295}
5296
Xinghua Cao10a4d432017-11-28 14:46:26 +08005297Error Context::prepareForDispatch()
5298{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005299 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005300
5301 if (isRobustResourceInitEnabled())
5302 {
5303 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5304 }
5305
Jamie Madill0cc11c62018-10-12 18:07:18 -04005306 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005307}
5308
Xinghua Cao2b396592017-03-29 15:36:04 +08005309void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5310{
5311 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5312 {
5313 return;
5314 }
5315
Xinghua Cao10a4d432017-11-28 14:46:26 +08005316 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005317 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005318}
5319
Jiajia Qin5451d532017-11-16 17:16:34 +08005320void Context::dispatchComputeIndirect(GLintptr indirect)
5321{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005322 ANGLE_CONTEXT_TRY(prepareForDispatch());
5323 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005324}
5325
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005326void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005327 GLsizei levels,
5328 GLenum internalFormat,
5329 GLsizei width,
5330 GLsizei height)
5331{
5332 Extents size(width, height, 1);
5333 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005334 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005335}
5336
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005337void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005338 GLsizei levels,
5339 GLenum internalFormat,
5340 GLsizei width,
5341 GLsizei height,
5342 GLsizei depth)
5343{
5344 Extents size(width, height, depth);
5345 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005346 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005347}
5348
Jiajia Qin5451d532017-11-16 17:16:34 +08005349void Context::memoryBarrier(GLbitfield barriers)
5350{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005351 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005352}
5353
5354void Context::memoryBarrierByRegion(GLbitfield barriers)
5355{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005356 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005357}
5358
Jamie Madillc1d770e2017-04-13 17:31:24 -04005359GLenum Context::checkFramebufferStatus(GLenum target)
5360{
5361 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5362 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005363 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005364}
5365
5366void Context::compileShader(GLuint shader)
5367{
5368 Shader *shaderObject = GetValidShader(this, shader);
5369 if (!shaderObject)
5370 {
5371 return;
5372 }
5373 shaderObject->compile(this);
5374}
5375
5376void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5377{
5378 for (int i = 0; i < n; i++)
5379 {
5380 deleteBuffer(buffers[i]);
5381 }
5382}
5383
5384void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5385{
5386 for (int i = 0; i < n; i++)
5387 {
5388 if (framebuffers[i] != 0)
5389 {
5390 deleteFramebuffer(framebuffers[i]);
5391 }
5392 }
5393}
5394
5395void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5396{
5397 for (int i = 0; i < n; i++)
5398 {
5399 deleteRenderbuffer(renderbuffers[i]);
5400 }
5401}
5402
5403void Context::deleteTextures(GLsizei n, const GLuint *textures)
5404{
5405 for (int i = 0; i < n; i++)
5406 {
5407 if (textures[i] != 0)
5408 {
5409 deleteTexture(textures[i]);
5410 }
5411 }
5412}
5413
5414void Context::detachShader(GLuint program, GLuint shader)
5415{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005416 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005417 ASSERT(programObject);
5418
5419 Shader *shaderObject = getShader(shader);
5420 ASSERT(shaderObject);
5421
5422 programObject->detachShader(this, shaderObject);
5423}
5424
5425void Context::genBuffers(GLsizei n, GLuint *buffers)
5426{
5427 for (int i = 0; i < n; i++)
5428 {
5429 buffers[i] = createBuffer();
5430 }
5431}
5432
5433void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5434{
5435 for (int i = 0; i < n; i++)
5436 {
5437 framebuffers[i] = createFramebuffer();
5438 }
5439}
5440
5441void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5442{
5443 for (int i = 0; i < n; i++)
5444 {
5445 renderbuffers[i] = createRenderbuffer();
5446 }
5447}
5448
5449void Context::genTextures(GLsizei n, GLuint *textures)
5450{
5451 for (int i = 0; i < n; i++)
5452 {
5453 textures[i] = createTexture();
5454 }
5455}
5456
5457void Context::getActiveAttrib(GLuint program,
5458 GLuint index,
5459 GLsizei bufsize,
5460 GLsizei *length,
5461 GLint *size,
5462 GLenum *type,
5463 GLchar *name)
5464{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005465 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005466 ASSERT(programObject);
5467 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5468}
5469
5470void Context::getActiveUniform(GLuint program,
5471 GLuint index,
5472 GLsizei bufsize,
5473 GLsizei *length,
5474 GLint *size,
5475 GLenum *type,
5476 GLchar *name)
5477{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005478 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005479 ASSERT(programObject);
5480 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5481}
5482
5483void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5484{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005485 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005486 ASSERT(programObject);
5487 programObject->getAttachedShaders(maxcount, count, shaders);
5488}
5489
5490GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5491{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005492 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005493 ASSERT(programObject);
5494 return programObject->getAttributeLocation(name);
5495}
5496
5497void Context::getBooleanv(GLenum pname, GLboolean *params)
5498{
5499 GLenum nativeType;
5500 unsigned int numParams = 0;
5501 getQueryParameterInfo(pname, &nativeType, &numParams);
5502
5503 if (nativeType == GL_BOOL)
5504 {
5505 getBooleanvImpl(pname, params);
5506 }
5507 else
5508 {
5509 CastStateValues(this, nativeType, pname, numParams, params);
5510 }
5511}
5512
Brandon Jones59770802018-04-02 13:18:42 -07005513void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5514{
5515 getBooleanv(pname, params);
5516}
5517
Jamie Madillc1d770e2017-04-13 17:31:24 -04005518void Context::getFloatv(GLenum pname, GLfloat *params)
5519{
5520 GLenum nativeType;
5521 unsigned int numParams = 0;
5522 getQueryParameterInfo(pname, &nativeType, &numParams);
5523
5524 if (nativeType == GL_FLOAT)
5525 {
5526 getFloatvImpl(pname, params);
5527 }
5528 else
5529 {
5530 CastStateValues(this, nativeType, pname, numParams, params);
5531 }
5532}
5533
Brandon Jones59770802018-04-02 13:18:42 -07005534void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5535{
5536 getFloatv(pname, params);
5537}
5538
Jamie Madillc1d770e2017-04-13 17:31:24 -04005539void Context::getIntegerv(GLenum pname, GLint *params)
5540{
5541 GLenum nativeType;
5542 unsigned int numParams = 0;
5543 getQueryParameterInfo(pname, &nativeType, &numParams);
5544
5545 if (nativeType == GL_INT)
5546 {
5547 getIntegervImpl(pname, params);
5548 }
5549 else
5550 {
5551 CastStateValues(this, nativeType, pname, numParams, params);
5552 }
5553}
5554
Brandon Jones59770802018-04-02 13:18:42 -07005555void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5556{
5557 getIntegerv(pname, data);
5558}
5559
Jamie Madillc1d770e2017-04-13 17:31:24 -04005560void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5561{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005562 // Don't resolve link if checking the link completion status.
5563 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5564 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005565 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005566 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005567}
5568
Brandon Jones59770802018-04-02 13:18:42 -07005569void Context::getProgramivRobust(GLuint program,
5570 GLenum pname,
5571 GLsizei bufSize,
5572 GLsizei *length,
5573 GLint *params)
5574{
5575 getProgramiv(program, pname, params);
5576}
5577
Jiajia Qin5451d532017-11-16 17:16:34 +08005578void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5579{
5580 UNIMPLEMENTED();
5581}
5582
Jamie Madillbe849e42017-05-02 15:49:00 -04005583void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005584{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005585 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005586 ASSERT(programObject);
5587 programObject->getInfoLog(bufsize, length, infolog);
5588}
5589
Jiajia Qin5451d532017-11-16 17:16:34 +08005590void Context::getProgramPipelineInfoLog(GLuint pipeline,
5591 GLsizei bufSize,
5592 GLsizei *length,
5593 GLchar *infoLog)
5594{
5595 UNIMPLEMENTED();
5596}
5597
Jamie Madillc1d770e2017-04-13 17:31:24 -04005598void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5599{
5600 Shader *shaderObject = getShader(shader);
5601 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005602 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005603}
5604
Brandon Jones59770802018-04-02 13:18:42 -07005605void Context::getShaderivRobust(GLuint shader,
5606 GLenum pname,
5607 GLsizei bufSize,
5608 GLsizei *length,
5609 GLint *params)
5610{
5611 getShaderiv(shader, pname, params);
5612}
5613
Jamie Madillc1d770e2017-04-13 17:31:24 -04005614void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5615{
5616 Shader *shaderObject = getShader(shader);
5617 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005618 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005619}
5620
5621void Context::getShaderPrecisionFormat(GLenum shadertype,
5622 GLenum precisiontype,
5623 GLint *range,
5624 GLint *precision)
5625{
5626 // TODO(jmadill): Compute shaders.
5627
5628 switch (shadertype)
5629 {
5630 case GL_VERTEX_SHADER:
5631 switch (precisiontype)
5632 {
5633 case GL_LOW_FLOAT:
5634 mCaps.vertexLowpFloat.get(range, precision);
5635 break;
5636 case GL_MEDIUM_FLOAT:
5637 mCaps.vertexMediumpFloat.get(range, precision);
5638 break;
5639 case GL_HIGH_FLOAT:
5640 mCaps.vertexHighpFloat.get(range, precision);
5641 break;
5642
5643 case GL_LOW_INT:
5644 mCaps.vertexLowpInt.get(range, precision);
5645 break;
5646 case GL_MEDIUM_INT:
5647 mCaps.vertexMediumpInt.get(range, precision);
5648 break;
5649 case GL_HIGH_INT:
5650 mCaps.vertexHighpInt.get(range, precision);
5651 break;
5652
5653 default:
5654 UNREACHABLE();
5655 return;
5656 }
5657 break;
5658
5659 case GL_FRAGMENT_SHADER:
5660 switch (precisiontype)
5661 {
5662 case GL_LOW_FLOAT:
5663 mCaps.fragmentLowpFloat.get(range, precision);
5664 break;
5665 case GL_MEDIUM_FLOAT:
5666 mCaps.fragmentMediumpFloat.get(range, precision);
5667 break;
5668 case GL_HIGH_FLOAT:
5669 mCaps.fragmentHighpFloat.get(range, precision);
5670 break;
5671
5672 case GL_LOW_INT:
5673 mCaps.fragmentLowpInt.get(range, precision);
5674 break;
5675 case GL_MEDIUM_INT:
5676 mCaps.fragmentMediumpInt.get(range, precision);
5677 break;
5678 case GL_HIGH_INT:
5679 mCaps.fragmentHighpInt.get(range, precision);
5680 break;
5681
5682 default:
5683 UNREACHABLE();
5684 return;
5685 }
5686 break;
5687
5688 default:
5689 UNREACHABLE();
5690 return;
5691 }
5692}
5693
5694void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5695{
5696 Shader *shaderObject = getShader(shader);
5697 ASSERT(shaderObject);
5698 shaderObject->getSource(bufsize, length, source);
5699}
5700
5701void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5702{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005703 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005704 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005705 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005706}
5707
Brandon Jones59770802018-04-02 13:18:42 -07005708void Context::getUniformfvRobust(GLuint program,
5709 GLint location,
5710 GLsizei bufSize,
5711 GLsizei *length,
5712 GLfloat *params)
5713{
5714 getUniformfv(program, location, params);
5715}
5716
Jamie Madillc1d770e2017-04-13 17:31:24 -04005717void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5718{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005719 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005720 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005721 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005722}
5723
Brandon Jones59770802018-04-02 13:18:42 -07005724void Context::getUniformivRobust(GLuint program,
5725 GLint location,
5726 GLsizei bufSize,
5727 GLsizei *length,
5728 GLint *params)
5729{
5730 getUniformiv(program, location, params);
5731}
5732
Jamie Madillc1d770e2017-04-13 17:31:24 -04005733GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5734{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005735 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005736 ASSERT(programObject);
5737 return programObject->getUniformLocation(name);
5738}
5739
5740GLboolean Context::isBuffer(GLuint buffer)
5741{
5742 if (buffer == 0)
5743 {
5744 return GL_FALSE;
5745 }
5746
5747 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5748}
5749
5750GLboolean Context::isEnabled(GLenum cap)
5751{
5752 return mGLState.getEnableFeature(cap);
5753}
5754
5755GLboolean Context::isFramebuffer(GLuint framebuffer)
5756{
5757 if (framebuffer == 0)
5758 {
5759 return GL_FALSE;
5760 }
5761
5762 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5763}
5764
5765GLboolean Context::isProgram(GLuint program)
5766{
5767 if (program == 0)
5768 {
5769 return GL_FALSE;
5770 }
5771
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005772 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005773}
5774
5775GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5776{
5777 if (renderbuffer == 0)
5778 {
5779 return GL_FALSE;
5780 }
5781
5782 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5783}
5784
5785GLboolean Context::isShader(GLuint shader)
5786{
5787 if (shader == 0)
5788 {
5789 return GL_FALSE;
5790 }
5791
5792 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5793}
5794
5795GLboolean Context::isTexture(GLuint texture)
5796{
5797 if (texture == 0)
5798 {
5799 return GL_FALSE;
5800 }
5801
5802 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5803}
5804
5805void Context::linkProgram(GLuint program)
5806{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005807 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005808 ASSERT(programObject);
5809 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005810
5811 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5812 // don't need to worry that:
5813 // 1. Draw calls after link use the new executable code or the old one depending on the link
5814 // result.
5815 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5816 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5817 // ProgramD3D.
5818 if (programObject->isInUse())
5819 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005820 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005821 if (programObject->isLinked())
5822 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005823 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005824 }
jchen107ae70d82018-07-06 13:47:01 +08005825 mStateCache.onProgramExecutableChange(this);
5826 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005827}
5828
5829void Context::releaseShaderCompiler()
5830{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005831 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005832}
5833
5834void Context::shaderBinary(GLsizei n,
5835 const GLuint *shaders,
5836 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005837 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005838 GLsizei length)
5839{
5840 // No binary shader formats are supported.
5841 UNIMPLEMENTED();
5842}
5843
Olli Etuaho0ca09752018-09-24 11:00:50 +03005844void Context::bindFragDataLocationIndexed(GLuint program,
5845 GLuint colorNumber,
5846 GLuint index,
5847 const char *name)
5848{
5849 Program *programObject = getProgramNoResolveLink(program);
5850 programObject->bindFragmentOutputLocation(colorNumber, name);
5851 programObject->bindFragmentOutputIndex(index, name);
5852}
5853
5854void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5855{
5856 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5857}
5858
5859int Context::getFragDataIndex(GLuint program, const char *name)
5860{
5861 Program *programObject = getProgramResolveLink(program);
5862 return programObject->getFragDataIndex(name);
5863}
5864
5865int Context::getProgramResourceLocationIndex(GLuint program,
5866 GLenum programInterface,
5867 const char *name)
5868{
5869 Program *programObject = getProgramResolveLink(program);
5870 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5871 return programObject->getFragDataIndex(name);
5872}
5873
Jamie Madillc1d770e2017-04-13 17:31:24 -04005874void Context::shaderSource(GLuint shader,
5875 GLsizei count,
5876 const GLchar *const *string,
5877 const GLint *length)
5878{
5879 Shader *shaderObject = getShader(shader);
5880 ASSERT(shaderObject);
5881 shaderObject->setSource(count, string, length);
5882}
5883
5884void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5885{
5886 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5887}
5888
5889void Context::stencilMask(GLuint mask)
5890{
5891 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5892}
5893
5894void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5895{
5896 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5897}
5898
5899void Context::uniform1f(GLint location, GLfloat x)
5900{
5901 Program *program = mGLState.getProgram();
5902 program->setUniform1fv(location, 1, &x);
5903}
5904
5905void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5906{
5907 Program *program = mGLState.getProgram();
5908 program->setUniform1fv(location, count, v);
5909}
5910
Jamie Madill7e4eff12018-08-08 15:49:26 -04005911void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005912{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005913 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04005914 {
5915 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04005916 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04005917 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005918}
5919
Jamie Madill7e4eff12018-08-08 15:49:26 -04005920void Context::uniform1i(GLint location, GLint x)
5921{
5922 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5923}
5924
Jamie Madillc1d770e2017-04-13 17:31:24 -04005925void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5926{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005927 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005928}
5929
5930void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5931{
5932 GLfloat xy[2] = {x, y};
5933 Program *program = mGLState.getProgram();
5934 program->setUniform2fv(location, 1, xy);
5935}
5936
5937void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
5938{
5939 Program *program = mGLState.getProgram();
5940 program->setUniform2fv(location, count, v);
5941}
5942
5943void Context::uniform2i(GLint location, GLint x, GLint y)
5944{
5945 GLint xy[2] = {x, y};
5946 Program *program = mGLState.getProgram();
5947 program->setUniform2iv(location, 1, xy);
5948}
5949
5950void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
5951{
5952 Program *program = mGLState.getProgram();
5953 program->setUniform2iv(location, count, v);
5954}
5955
5956void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5957{
5958 GLfloat xyz[3] = {x, y, z};
5959 Program *program = mGLState.getProgram();
5960 program->setUniform3fv(location, 1, xyz);
5961}
5962
5963void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
5964{
5965 Program *program = mGLState.getProgram();
5966 program->setUniform3fv(location, count, v);
5967}
5968
5969void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
5970{
5971 GLint xyz[3] = {x, y, z};
5972 Program *program = mGLState.getProgram();
5973 program->setUniform3iv(location, 1, xyz);
5974}
5975
5976void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
5977{
5978 Program *program = mGLState.getProgram();
5979 program->setUniform3iv(location, count, v);
5980}
5981
5982void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5983{
5984 GLfloat xyzw[4] = {x, y, z, w};
5985 Program *program = mGLState.getProgram();
5986 program->setUniform4fv(location, 1, xyzw);
5987}
5988
5989void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
5990{
5991 Program *program = mGLState.getProgram();
5992 program->setUniform4fv(location, count, v);
5993}
5994
5995void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5996{
5997 GLint xyzw[4] = {x, y, z, w};
5998 Program *program = mGLState.getProgram();
5999 program->setUniform4iv(location, 1, xyzw);
6000}
6001
6002void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6003{
6004 Program *program = mGLState.getProgram();
6005 program->setUniform4iv(location, count, v);
6006}
6007
6008void Context::uniformMatrix2fv(GLint location,
6009 GLsizei count,
6010 GLboolean transpose,
6011 const GLfloat *value)
6012{
6013 Program *program = mGLState.getProgram();
6014 program->setUniformMatrix2fv(location, count, transpose, value);
6015}
6016
6017void Context::uniformMatrix3fv(GLint location,
6018 GLsizei count,
6019 GLboolean transpose,
6020 const GLfloat *value)
6021{
6022 Program *program = mGLState.getProgram();
6023 program->setUniformMatrix3fv(location, count, transpose, value);
6024}
6025
6026void Context::uniformMatrix4fv(GLint location,
6027 GLsizei count,
6028 GLboolean transpose,
6029 const GLfloat *value)
6030{
6031 Program *program = mGLState.getProgram();
6032 program->setUniformMatrix4fv(location, count, transpose, value);
6033}
6034
6035void Context::validateProgram(GLuint program)
6036{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006037 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006038 ASSERT(programObject);
6039 programObject->validate(mCaps);
6040}
6041
Jiajia Qin5451d532017-11-16 17:16:34 +08006042void Context::validateProgramPipeline(GLuint pipeline)
6043{
6044 UNIMPLEMENTED();
6045}
6046
Jamie Madilld04908b2017-06-09 14:15:35 -04006047void Context::getProgramBinary(GLuint program,
6048 GLsizei bufSize,
6049 GLsizei *length,
6050 GLenum *binaryFormat,
6051 void *binary)
6052{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006053 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006054 ASSERT(programObject != nullptr);
6055
6056 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6057}
6058
6059void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6060{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006061 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006062 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006063
Jamie Madilld04908b2017-06-09 14:15:35 -04006064 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006065 if (programObject->isInUse())
6066 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006067 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006068 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006069 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006070}
6071
Jamie Madillff325f12017-08-26 15:06:05 -04006072void Context::uniform1ui(GLint location, GLuint v0)
6073{
6074 Program *program = mGLState.getProgram();
6075 program->setUniform1uiv(location, 1, &v0);
6076}
6077
6078void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6079{
6080 Program *program = mGLState.getProgram();
6081 const GLuint xy[] = {v0, v1};
6082 program->setUniform2uiv(location, 1, xy);
6083}
6084
6085void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6086{
6087 Program *program = mGLState.getProgram();
6088 const GLuint xyz[] = {v0, v1, v2};
6089 program->setUniform3uiv(location, 1, xyz);
6090}
6091
6092void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6093{
6094 Program *program = mGLState.getProgram();
6095 const GLuint xyzw[] = {v0, v1, v2, v3};
6096 program->setUniform4uiv(location, 1, xyzw);
6097}
6098
6099void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6100{
6101 Program *program = mGLState.getProgram();
6102 program->setUniform1uiv(location, count, value);
6103}
6104void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6105{
6106 Program *program = mGLState.getProgram();
6107 program->setUniform2uiv(location, count, value);
6108}
6109
6110void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6111{
6112 Program *program = mGLState.getProgram();
6113 program->setUniform3uiv(location, count, value);
6114}
6115
6116void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6117{
6118 Program *program = mGLState.getProgram();
6119 program->setUniform4uiv(location, count, value);
6120}
6121
Jamie Madillf0e04492017-08-26 15:28:42 -04006122void Context::genQueries(GLsizei n, GLuint *ids)
6123{
6124 for (GLsizei i = 0; i < n; i++)
6125 {
6126 GLuint handle = mQueryHandleAllocator.allocate();
6127 mQueryMap.assign(handle, nullptr);
6128 ids[i] = handle;
6129 }
6130}
6131
6132void Context::deleteQueries(GLsizei n, const GLuint *ids)
6133{
6134 for (int i = 0; i < n; i++)
6135 {
6136 GLuint query = ids[i];
6137
6138 Query *queryObject = nullptr;
6139 if (mQueryMap.erase(query, &queryObject))
6140 {
6141 mQueryHandleAllocator.release(query);
6142 if (queryObject)
6143 {
6144 queryObject->release(this);
6145 }
6146 }
6147 }
6148}
6149
6150GLboolean Context::isQuery(GLuint id)
6151{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006152 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006153}
6154
Jamie Madillc8c95812017-08-26 18:40:09 -04006155void Context::uniformMatrix2x3fv(GLint location,
6156 GLsizei count,
6157 GLboolean transpose,
6158 const GLfloat *value)
6159{
6160 Program *program = mGLState.getProgram();
6161 program->setUniformMatrix2x3fv(location, count, transpose, value);
6162}
6163
6164void Context::uniformMatrix3x2fv(GLint location,
6165 GLsizei count,
6166 GLboolean transpose,
6167 const GLfloat *value)
6168{
6169 Program *program = mGLState.getProgram();
6170 program->setUniformMatrix3x2fv(location, count, transpose, value);
6171}
6172
6173void Context::uniformMatrix2x4fv(GLint location,
6174 GLsizei count,
6175 GLboolean transpose,
6176 const GLfloat *value)
6177{
6178 Program *program = mGLState.getProgram();
6179 program->setUniformMatrix2x4fv(location, count, transpose, value);
6180}
6181
6182void Context::uniformMatrix4x2fv(GLint location,
6183 GLsizei count,
6184 GLboolean transpose,
6185 const GLfloat *value)
6186{
6187 Program *program = mGLState.getProgram();
6188 program->setUniformMatrix4x2fv(location, count, transpose, value);
6189}
6190
6191void Context::uniformMatrix3x4fv(GLint location,
6192 GLsizei count,
6193 GLboolean transpose,
6194 const GLfloat *value)
6195{
6196 Program *program = mGLState.getProgram();
6197 program->setUniformMatrix3x4fv(location, count, transpose, value);
6198}
6199
6200void Context::uniformMatrix4x3fv(GLint location,
6201 GLsizei count,
6202 GLboolean transpose,
6203 const GLfloat *value)
6204{
6205 Program *program = mGLState.getProgram();
6206 program->setUniformMatrix4x3fv(location, count, transpose, value);
6207}
6208
Jamie Madilld7576732017-08-26 18:49:50 -04006209void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6210{
6211 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6212 {
6213 GLuint vertexArray = arrays[arrayIndex];
6214
6215 if (arrays[arrayIndex] != 0)
6216 {
6217 VertexArray *vertexArrayObject = nullptr;
6218 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6219 {
6220 if (vertexArrayObject != nullptr)
6221 {
6222 detachVertexArray(vertexArray);
6223 vertexArrayObject->onDestroy(this);
6224 }
6225
6226 mVertexArrayHandleAllocator.release(vertexArray);
6227 }
6228 }
6229 }
6230}
6231
6232void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6233{
6234 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6235 {
6236 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6237 mVertexArrayMap.assign(vertexArray, nullptr);
6238 arrays[arrayIndex] = vertexArray;
6239 }
6240}
6241
6242bool Context::isVertexArray(GLuint array)
6243{
6244 if (array == 0)
6245 {
6246 return GL_FALSE;
6247 }
6248
6249 VertexArray *vao = getVertexArray(array);
6250 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6251}
6252
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006253void Context::endTransformFeedback()
6254{
6255 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6256 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006257 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006258}
6259
6260void Context::transformFeedbackVaryings(GLuint program,
6261 GLsizei count,
6262 const GLchar *const *varyings,
6263 GLenum bufferMode)
6264{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006265 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006266 ASSERT(programObject);
6267 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6268}
6269
6270void Context::getTransformFeedbackVarying(GLuint program,
6271 GLuint index,
6272 GLsizei bufSize,
6273 GLsizei *length,
6274 GLsizei *size,
6275 GLenum *type,
6276 GLchar *name)
6277{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006278 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006279 ASSERT(programObject);
6280 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6281}
6282
6283void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6284{
6285 for (int i = 0; i < n; i++)
6286 {
6287 GLuint transformFeedback = ids[i];
6288 if (transformFeedback == 0)
6289 {
6290 continue;
6291 }
6292
6293 TransformFeedback *transformFeedbackObject = nullptr;
6294 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6295 {
6296 if (transformFeedbackObject != nullptr)
6297 {
6298 detachTransformFeedback(transformFeedback);
6299 transformFeedbackObject->release(this);
6300 }
6301
6302 mTransformFeedbackHandleAllocator.release(transformFeedback);
6303 }
6304 }
6305}
6306
6307void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6308{
6309 for (int i = 0; i < n; i++)
6310 {
6311 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6312 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6313 ids[i] = transformFeedback;
6314 }
6315}
6316
6317bool Context::isTransformFeedback(GLuint id)
6318{
6319 if (id == 0)
6320 {
6321 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6322 // returns FALSE
6323 return GL_FALSE;
6324 }
6325
6326 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6327 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6328}
6329
6330void Context::pauseTransformFeedback()
6331{
6332 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6333 transformFeedback->pause();
6334}
6335
6336void Context::resumeTransformFeedback()
6337{
6338 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6339 transformFeedback->resume();
6340}
6341
Jamie Madill12e957f2017-08-26 21:42:26 -04006342void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6343{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006344 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006345 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006346}
6347
Brandon Jones59770802018-04-02 13:18:42 -07006348void Context::getUniformuivRobust(GLuint program,
6349 GLint location,
6350 GLsizei bufSize,
6351 GLsizei *length,
6352 GLuint *params)
6353{
6354 getUniformuiv(program, location, params);
6355}
6356
Jamie Madill12e957f2017-08-26 21:42:26 -04006357GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6358{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006359 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006360 return programObject->getFragDataLocation(name);
6361}
6362
6363void Context::getUniformIndices(GLuint program,
6364 GLsizei uniformCount,
6365 const GLchar *const *uniformNames,
6366 GLuint *uniformIndices)
6367{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006368 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006369 if (!programObject->isLinked())
6370 {
6371 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6372 {
6373 uniformIndices[uniformId] = GL_INVALID_INDEX;
6374 }
6375 }
6376 else
6377 {
6378 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6379 {
6380 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6381 }
6382 }
6383}
6384
6385void Context::getActiveUniformsiv(GLuint program,
6386 GLsizei uniformCount,
6387 const GLuint *uniformIndices,
6388 GLenum pname,
6389 GLint *params)
6390{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006391 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006392 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6393 {
6394 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006395 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006396 }
6397}
6398
6399GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6400{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006401 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006402 return programObject->getUniformBlockIndex(uniformBlockName);
6403}
6404
6405void Context::getActiveUniformBlockiv(GLuint program,
6406 GLuint uniformBlockIndex,
6407 GLenum pname,
6408 GLint *params)
6409{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006410 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006411 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6412}
6413
Brandon Jones59770802018-04-02 13:18:42 -07006414void Context::getActiveUniformBlockivRobust(GLuint program,
6415 GLuint uniformBlockIndex,
6416 GLenum pname,
6417 GLsizei bufSize,
6418 GLsizei *length,
6419 GLint *params)
6420{
6421 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6422}
6423
Jamie Madill12e957f2017-08-26 21:42:26 -04006424void Context::getActiveUniformBlockName(GLuint program,
6425 GLuint uniformBlockIndex,
6426 GLsizei bufSize,
6427 GLsizei *length,
6428 GLchar *uniformBlockName)
6429{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006430 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006431 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6432}
6433
6434void Context::uniformBlockBinding(GLuint program,
6435 GLuint uniformBlockIndex,
6436 GLuint uniformBlockBinding)
6437{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006438 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006439 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006440
Jamie Madill956ab4d2018-10-10 16:13:03 -04006441 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006442 if (programObject->isInUse())
6443 {
6444 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006445 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006446 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006447}
6448
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006449GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6450{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006451 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6452 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006453
Jamie Madill70b5bb02017-08-28 13:32:37 -04006454 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006455 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006456 if (error.isError())
6457 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006458 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006459 handleError(error);
6460 return nullptr;
6461 }
6462
Jamie Madill70b5bb02017-08-28 13:32:37 -04006463 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006464}
6465
6466GLboolean Context::isSync(GLsync sync)
6467{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006468 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006469}
6470
6471GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6472{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006473 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006474
6475 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006476 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006477 return result;
6478}
6479
6480void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6481{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006482 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006483 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006484}
6485
6486void Context::getInteger64v(GLenum pname, GLint64 *params)
6487{
6488 GLenum nativeType = GL_NONE;
6489 unsigned int numParams = 0;
6490 getQueryParameterInfo(pname, &nativeType, &numParams);
6491
6492 if (nativeType == GL_INT_64_ANGLEX)
6493 {
6494 getInteger64vImpl(pname, params);
6495 }
6496 else
6497 {
6498 CastStateValues(this, nativeType, pname, numParams, params);
6499 }
6500}
6501
Brandon Jones59770802018-04-02 13:18:42 -07006502void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6503{
6504 getInteger64v(pname, data);
6505}
6506
Corentin Wallez336129f2017-10-17 15:55:40 -04006507void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006508{
6509 Buffer *buffer = mGLState.getTargetBuffer(target);
6510 QueryBufferParameteri64v(buffer, pname, params);
6511}
6512
Brandon Jones59770802018-04-02 13:18:42 -07006513void Context::getBufferParameteri64vRobust(BufferBinding target,
6514 GLenum pname,
6515 GLsizei bufSize,
6516 GLsizei *length,
6517 GLint64 *params)
6518{
6519 getBufferParameteri64v(target, pname, params);
6520}
6521
Jamie Madill3ef140a2017-08-26 23:11:21 -04006522void Context::genSamplers(GLsizei count, GLuint *samplers)
6523{
6524 for (int i = 0; i < count; i++)
6525 {
6526 samplers[i] = mState.mSamplers->createSampler();
6527 }
6528}
6529
6530void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6531{
6532 for (int i = 0; i < count; i++)
6533 {
6534 GLuint sampler = samplers[i];
6535
6536 if (mState.mSamplers->getSampler(sampler))
6537 {
6538 detachSampler(sampler);
6539 }
6540
6541 mState.mSamplers->deleteObject(this, sampler);
6542 }
6543}
6544
6545void Context::getInternalformativ(GLenum target,
6546 GLenum internalformat,
6547 GLenum pname,
6548 GLsizei bufSize,
6549 GLint *params)
6550{
6551 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6552 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6553}
6554
Brandon Jones59770802018-04-02 13:18:42 -07006555void Context::getInternalformativRobust(GLenum target,
6556 GLenum internalformat,
6557 GLenum pname,
6558 GLsizei bufSize,
6559 GLsizei *length,
6560 GLint *params)
6561{
6562 getInternalformativ(target, internalformat, pname, bufSize, params);
6563}
6564
Jiajia Qin5451d532017-11-16 17:16:34 +08006565void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6566{
6567 programUniform1iv(program, location, 1, &v0);
6568}
6569
6570void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6571{
6572 GLint xy[2] = {v0, v1};
6573 programUniform2iv(program, location, 1, xy);
6574}
6575
6576void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6577{
6578 GLint xyz[3] = {v0, v1, v2};
6579 programUniform3iv(program, location, 1, xyz);
6580}
6581
6582void Context::programUniform4i(GLuint program,
6583 GLint location,
6584 GLint v0,
6585 GLint v1,
6586 GLint v2,
6587 GLint v3)
6588{
6589 GLint xyzw[4] = {v0, v1, v2, v3};
6590 programUniform4iv(program, location, 1, xyzw);
6591}
6592
6593void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6594{
6595 programUniform1uiv(program, location, 1, &v0);
6596}
6597
6598void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6599{
6600 GLuint xy[2] = {v0, v1};
6601 programUniform2uiv(program, location, 1, xy);
6602}
6603
6604void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6605{
6606 GLuint xyz[3] = {v0, v1, v2};
6607 programUniform3uiv(program, location, 1, xyz);
6608}
6609
6610void Context::programUniform4ui(GLuint program,
6611 GLint location,
6612 GLuint v0,
6613 GLuint v1,
6614 GLuint v2,
6615 GLuint v3)
6616{
6617 GLuint xyzw[4] = {v0, v1, v2, v3};
6618 programUniform4uiv(program, location, 1, xyzw);
6619}
6620
6621void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6622{
6623 programUniform1fv(program, location, 1, &v0);
6624}
6625
6626void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6627{
6628 GLfloat xy[2] = {v0, v1};
6629 programUniform2fv(program, location, 1, xy);
6630}
6631
6632void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6633{
6634 GLfloat xyz[3] = {v0, v1, v2};
6635 programUniform3fv(program, location, 1, xyz);
6636}
6637
6638void Context::programUniform4f(GLuint program,
6639 GLint location,
6640 GLfloat v0,
6641 GLfloat v1,
6642 GLfloat v2,
6643 GLfloat v3)
6644{
6645 GLfloat xyzw[4] = {v0, v1, v2, v3};
6646 programUniform4fv(program, location, 1, xyzw);
6647}
6648
Jamie Madill81c2e252017-09-09 23:32:46 -04006649void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6650{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006651 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006652 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006653 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006654}
6655
Jiajia Qin5451d532017-11-16 17:16:34 +08006656void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6657{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006658 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006659 ASSERT(programObject);
6660 programObject->setUniform2iv(location, count, value);
6661}
6662
6663void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6664{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006665 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006666 ASSERT(programObject);
6667 programObject->setUniform3iv(location, count, value);
6668}
6669
6670void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6671{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006672 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006673 ASSERT(programObject);
6674 programObject->setUniform4iv(location, count, value);
6675}
6676
6677void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6678{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006679 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006680 ASSERT(programObject);
6681 programObject->setUniform1uiv(location, count, value);
6682}
6683
6684void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6685{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006686 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006687 ASSERT(programObject);
6688 programObject->setUniform2uiv(location, count, value);
6689}
6690
6691void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6692{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006693 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006694 ASSERT(programObject);
6695 programObject->setUniform3uiv(location, count, value);
6696}
6697
6698void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6699{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006700 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006701 ASSERT(programObject);
6702 programObject->setUniform4uiv(location, count, value);
6703}
6704
6705void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6706{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006707 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006708 ASSERT(programObject);
6709 programObject->setUniform1fv(location, count, value);
6710}
6711
6712void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6713{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006714 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006715 ASSERT(programObject);
6716 programObject->setUniform2fv(location, count, value);
6717}
6718
6719void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6720{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006721 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006722 ASSERT(programObject);
6723 programObject->setUniform3fv(location, count, value);
6724}
6725
6726void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6727{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006728 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006729 ASSERT(programObject);
6730 programObject->setUniform4fv(location, count, value);
6731}
6732
6733void Context::programUniformMatrix2fv(GLuint program,
6734 GLint location,
6735 GLsizei count,
6736 GLboolean transpose,
6737 const GLfloat *value)
6738{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006739 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006740 ASSERT(programObject);
6741 programObject->setUniformMatrix2fv(location, count, transpose, value);
6742}
6743
6744void Context::programUniformMatrix3fv(GLuint program,
6745 GLint location,
6746 GLsizei count,
6747 GLboolean transpose,
6748 const GLfloat *value)
6749{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006750 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006751 ASSERT(programObject);
6752 programObject->setUniformMatrix3fv(location, count, transpose, value);
6753}
6754
6755void Context::programUniformMatrix4fv(GLuint program,
6756 GLint location,
6757 GLsizei count,
6758 GLboolean transpose,
6759 const GLfloat *value)
6760{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006761 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006762 ASSERT(programObject);
6763 programObject->setUniformMatrix4fv(location, count, transpose, value);
6764}
6765
6766void Context::programUniformMatrix2x3fv(GLuint program,
6767 GLint location,
6768 GLsizei count,
6769 GLboolean transpose,
6770 const GLfloat *value)
6771{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006772 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006773 ASSERT(programObject);
6774 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6775}
6776
6777void Context::programUniformMatrix3x2fv(GLuint program,
6778 GLint location,
6779 GLsizei count,
6780 GLboolean transpose,
6781 const GLfloat *value)
6782{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006783 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006784 ASSERT(programObject);
6785 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6786}
6787
6788void Context::programUniformMatrix2x4fv(GLuint program,
6789 GLint location,
6790 GLsizei count,
6791 GLboolean transpose,
6792 const GLfloat *value)
6793{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006794 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006795 ASSERT(programObject);
6796 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6797}
6798
6799void Context::programUniformMatrix4x2fv(GLuint program,
6800 GLint location,
6801 GLsizei count,
6802 GLboolean transpose,
6803 const GLfloat *value)
6804{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006805 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006806 ASSERT(programObject);
6807 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6808}
6809
6810void Context::programUniformMatrix3x4fv(GLuint program,
6811 GLint location,
6812 GLsizei count,
6813 GLboolean transpose,
6814 const GLfloat *value)
6815{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006816 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006817 ASSERT(programObject);
6818 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6819}
6820
6821void Context::programUniformMatrix4x3fv(GLuint program,
6822 GLint location,
6823 GLsizei count,
6824 GLboolean transpose,
6825 const GLfloat *value)
6826{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006827 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006828 ASSERT(programObject);
6829 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6830}
6831
Jamie Madill81c2e252017-09-09 23:32:46 -04006832void Context::onTextureChange(const Texture *texture)
6833{
6834 // Conservatively assume all textures are dirty.
6835 // TODO(jmadill): More fine-grained update.
6836 mGLState.setObjectDirty(GL_TEXTURE);
6837}
6838
James Darpiniane8a93c62018-01-04 18:02:24 -08006839bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6840{
6841 return mGLState.isCurrentTransformFeedback(tf);
6842}
James Darpiniane8a93c62018-01-04 18:02:24 -08006843
Yunchao Hea336b902017-08-02 16:05:21 +08006844void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6845{
6846 for (int i = 0; i < count; i++)
6847 {
6848 pipelines[i] = createProgramPipeline();
6849 }
6850}
6851
6852void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6853{
6854 for (int i = 0; i < count; i++)
6855 {
6856 if (pipelines[i] != 0)
6857 {
6858 deleteProgramPipeline(pipelines[i]);
6859 }
6860 }
6861}
6862
6863GLboolean Context::isProgramPipeline(GLuint pipeline)
6864{
6865 if (pipeline == 0)
6866 {
6867 return GL_FALSE;
6868 }
6869
6870 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6871}
6872
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006873void Context::finishFenceNV(GLuint fence)
6874{
6875 FenceNV *fenceObject = getFenceNV(fence);
6876
6877 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04006878 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006879}
6880
6881void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6882{
6883 FenceNV *fenceObject = getFenceNV(fence);
6884
6885 ASSERT(fenceObject && fenceObject->isSet());
6886
6887 switch (pname)
6888 {
6889 case GL_FENCE_STATUS_NV:
6890 {
6891 // GL_NV_fence spec:
6892 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6893 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6894 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6895 GLboolean status = GL_TRUE;
6896 if (fenceObject->getStatus() != GL_TRUE)
6897 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006898 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006899 }
6900 *params = status;
6901 break;
6902 }
6903
6904 case GL_FENCE_CONDITION_NV:
6905 {
6906 *params = static_cast<GLint>(fenceObject->getCondition());
6907 break;
6908 }
6909
6910 default:
6911 UNREACHABLE();
6912 }
6913}
6914
6915void Context::getTranslatedShaderSource(GLuint shader,
6916 GLsizei bufsize,
6917 GLsizei *length,
6918 GLchar *source)
6919{
6920 Shader *shaderObject = getShader(shader);
6921 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006922 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006923}
6924
6925void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6926{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006927 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006928 ASSERT(programObject);
6929
6930 programObject->getUniformfv(this, location, params);
6931}
6932
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006933void Context::getnUniformfvRobust(GLuint program,
6934 GLint location,
6935 GLsizei bufSize,
6936 GLsizei *length,
6937 GLfloat *params)
6938{
6939 UNIMPLEMENTED();
6940}
6941
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006942void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
6943{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006944 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006945 ASSERT(programObject);
6946
6947 programObject->getUniformiv(this, location, params);
6948}
6949
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006950void Context::getnUniformivRobust(GLuint program,
6951 GLint location,
6952 GLsizei bufSize,
6953 GLsizei *length,
6954 GLint *params)
6955{
6956 UNIMPLEMENTED();
6957}
6958
6959void Context::getnUniformuivRobust(GLuint program,
6960 GLint location,
6961 GLsizei bufSize,
6962 GLsizei *length,
6963 GLuint *params)
6964{
6965 UNIMPLEMENTED();
6966}
6967
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006968GLboolean Context::isFenceNV(GLuint fence)
6969{
6970 FenceNV *fenceObject = getFenceNV(fence);
6971
6972 if (fenceObject == nullptr)
6973 {
6974 return GL_FALSE;
6975 }
6976
6977 // GL_NV_fence spec:
6978 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
6979 // existing fence.
6980 return fenceObject->isSet();
6981}
6982
6983void Context::readnPixels(GLint x,
6984 GLint y,
6985 GLsizei width,
6986 GLsizei height,
6987 GLenum format,
6988 GLenum type,
6989 GLsizei bufSize,
6990 void *data)
6991{
6992 return readPixels(x, y, width, height, format, type, data);
6993}
6994
Jamie Madill007530e2017-12-28 14:27:04 -05006995void Context::setFenceNV(GLuint fence, GLenum condition)
6996{
6997 ASSERT(condition == GL_ALL_COMPLETED_NV);
6998
6999 FenceNV *fenceObject = getFenceNV(fence);
7000 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007001 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007002}
7003
7004GLboolean Context::testFenceNV(GLuint fence)
7005{
7006 FenceNV *fenceObject = getFenceNV(fence);
7007
7008 ASSERT(fenceObject != nullptr);
7009 ASSERT(fenceObject->isSet() == GL_TRUE);
7010
7011 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007012 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007013 if (error.isError())
7014 {
7015 handleError(error);
7016 return GL_TRUE;
7017 }
7018
7019 return result;
7020}
7021
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007022void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007023{
7024 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007025 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007026 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007027}
7028
Jamie Madillfa920eb2018-01-04 11:45:50 -05007029void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007030{
7031 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007032 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007033 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7034}
7035
Jamie Madillfa920eb2018-01-04 11:45:50 -05007036void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7037{
7038 UNIMPLEMENTED();
7039}
7040
Jamie Madill5b772312018-03-08 20:28:32 -05007041bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7042{
7043 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7044 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7045 // to the fact that it is stored internally as a float, and so would require conversion
7046 // if returned from Context::getIntegerv. Since this conversion is already implemented
7047 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7048 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7049 // application.
7050 switch (pname)
7051 {
7052 case GL_COMPRESSED_TEXTURE_FORMATS:
7053 {
7054 *type = GL_INT;
7055 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7056 return true;
7057 }
7058 case GL_SHADER_BINARY_FORMATS:
7059 {
7060 *type = GL_INT;
7061 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7062 return true;
7063 }
7064
7065 case GL_MAX_VERTEX_ATTRIBS:
7066 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7067 case GL_MAX_VARYING_VECTORS:
7068 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7069 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7070 case GL_MAX_TEXTURE_IMAGE_UNITS:
7071 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7072 case GL_MAX_RENDERBUFFER_SIZE:
7073 case GL_NUM_SHADER_BINARY_FORMATS:
7074 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7075 case GL_ARRAY_BUFFER_BINDING:
7076 case GL_FRAMEBUFFER_BINDING:
7077 case GL_RENDERBUFFER_BINDING:
7078 case GL_CURRENT_PROGRAM:
7079 case GL_PACK_ALIGNMENT:
7080 case GL_UNPACK_ALIGNMENT:
7081 case GL_GENERATE_MIPMAP_HINT:
7082 case GL_RED_BITS:
7083 case GL_GREEN_BITS:
7084 case GL_BLUE_BITS:
7085 case GL_ALPHA_BITS:
7086 case GL_DEPTH_BITS:
7087 case GL_STENCIL_BITS:
7088 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7089 case GL_CULL_FACE_MODE:
7090 case GL_FRONT_FACE:
7091 case GL_ACTIVE_TEXTURE:
7092 case GL_STENCIL_FUNC:
7093 case GL_STENCIL_VALUE_MASK:
7094 case GL_STENCIL_REF:
7095 case GL_STENCIL_FAIL:
7096 case GL_STENCIL_PASS_DEPTH_FAIL:
7097 case GL_STENCIL_PASS_DEPTH_PASS:
7098 case GL_STENCIL_BACK_FUNC:
7099 case GL_STENCIL_BACK_VALUE_MASK:
7100 case GL_STENCIL_BACK_REF:
7101 case GL_STENCIL_BACK_FAIL:
7102 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7103 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7104 case GL_DEPTH_FUNC:
7105 case GL_BLEND_SRC_RGB:
7106 case GL_BLEND_SRC_ALPHA:
7107 case GL_BLEND_DST_RGB:
7108 case GL_BLEND_DST_ALPHA:
7109 case GL_BLEND_EQUATION_RGB:
7110 case GL_BLEND_EQUATION_ALPHA:
7111 case GL_STENCIL_WRITEMASK:
7112 case GL_STENCIL_BACK_WRITEMASK:
7113 case GL_STENCIL_CLEAR_VALUE:
7114 case GL_SUBPIXEL_BITS:
7115 case GL_MAX_TEXTURE_SIZE:
7116 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7117 case GL_SAMPLE_BUFFERS:
7118 case GL_SAMPLES:
7119 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7120 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7121 case GL_TEXTURE_BINDING_2D:
7122 case GL_TEXTURE_BINDING_CUBE_MAP:
7123 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7124 {
7125 *type = GL_INT;
7126 *numParams = 1;
7127 return true;
7128 }
7129 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7130 {
7131 if (!getExtensions().packReverseRowOrder)
7132 {
7133 return false;
7134 }
7135 *type = GL_INT;
7136 *numParams = 1;
7137 return true;
7138 }
7139 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7140 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7141 {
7142 if (!getExtensions().textureRectangle)
7143 {
7144 return false;
7145 }
7146 *type = GL_INT;
7147 *numParams = 1;
7148 return true;
7149 }
7150 case GL_MAX_DRAW_BUFFERS_EXT:
7151 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7152 {
7153 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7154 {
7155 return false;
7156 }
7157 *type = GL_INT;
7158 *numParams = 1;
7159 return true;
7160 }
7161 case GL_MAX_VIEWPORT_DIMS:
7162 {
7163 *type = GL_INT;
7164 *numParams = 2;
7165 return true;
7166 }
7167 case GL_VIEWPORT:
7168 case GL_SCISSOR_BOX:
7169 {
7170 *type = GL_INT;
7171 *numParams = 4;
7172 return true;
7173 }
7174 case GL_SHADER_COMPILER:
7175 case GL_SAMPLE_COVERAGE_INVERT:
7176 case GL_DEPTH_WRITEMASK:
7177 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7178 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7179 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7180 // bool-natural
7181 case GL_SAMPLE_COVERAGE:
7182 case GL_SCISSOR_TEST:
7183 case GL_STENCIL_TEST:
7184 case GL_DEPTH_TEST:
7185 case GL_BLEND:
7186 case GL_DITHER:
7187 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7188 {
7189 *type = GL_BOOL;
7190 *numParams = 1;
7191 return true;
7192 }
7193 case GL_COLOR_WRITEMASK:
7194 {
7195 *type = GL_BOOL;
7196 *numParams = 4;
7197 return true;
7198 }
7199 case GL_POLYGON_OFFSET_FACTOR:
7200 case GL_POLYGON_OFFSET_UNITS:
7201 case GL_SAMPLE_COVERAGE_VALUE:
7202 case GL_DEPTH_CLEAR_VALUE:
7203 case GL_LINE_WIDTH:
7204 {
7205 *type = GL_FLOAT;
7206 *numParams = 1;
7207 return true;
7208 }
7209 case GL_ALIASED_LINE_WIDTH_RANGE:
7210 case GL_ALIASED_POINT_SIZE_RANGE:
7211 case GL_DEPTH_RANGE:
7212 {
7213 *type = GL_FLOAT;
7214 *numParams = 2;
7215 return true;
7216 }
7217 case GL_COLOR_CLEAR_VALUE:
7218 case GL_BLEND_COLOR:
7219 {
7220 *type = GL_FLOAT;
7221 *numParams = 4;
7222 return true;
7223 }
7224 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7225 if (!getExtensions().textureFilterAnisotropic)
7226 {
7227 return false;
7228 }
7229 *type = GL_FLOAT;
7230 *numParams = 1;
7231 return true;
7232 case GL_TIMESTAMP_EXT:
7233 if (!getExtensions().disjointTimerQuery)
7234 {
7235 return false;
7236 }
7237 *type = GL_INT_64_ANGLEX;
7238 *numParams = 1;
7239 return true;
7240 case GL_GPU_DISJOINT_EXT:
7241 if (!getExtensions().disjointTimerQuery)
7242 {
7243 return false;
7244 }
7245 *type = GL_INT;
7246 *numParams = 1;
7247 return true;
7248 case GL_COVERAGE_MODULATION_CHROMIUM:
7249 if (!getExtensions().framebufferMixedSamples)
7250 {
7251 return false;
7252 }
7253 *type = GL_INT;
7254 *numParams = 1;
7255 return true;
7256 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7257 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7258 {
7259 return false;
7260 }
7261 *type = GL_INT;
7262 *numParams = 1;
7263 return true;
7264 }
7265
7266 if (getExtensions().debug)
7267 {
7268 switch (pname)
7269 {
7270 case GL_DEBUG_LOGGED_MESSAGES:
7271 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7272 case GL_DEBUG_GROUP_STACK_DEPTH:
7273 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7274 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7275 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7276 case GL_MAX_LABEL_LENGTH:
7277 *type = GL_INT;
7278 *numParams = 1;
7279 return true;
7280
7281 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7282 case GL_DEBUG_OUTPUT:
7283 *type = GL_BOOL;
7284 *numParams = 1;
7285 return true;
7286 }
7287 }
7288
7289 if (getExtensions().multisampleCompatibility)
7290 {
7291 switch (pname)
7292 {
7293 case GL_MULTISAMPLE_EXT:
7294 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7295 *type = GL_BOOL;
7296 *numParams = 1;
7297 return true;
7298 }
7299 }
7300
7301 if (getExtensions().pathRendering)
7302 {
7303 switch (pname)
7304 {
7305 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7306 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7307 *type = GL_FLOAT;
7308 *numParams = 16;
7309 return true;
7310 }
7311 }
7312
7313 if (getExtensions().bindGeneratesResource)
7314 {
7315 switch (pname)
7316 {
7317 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7318 *type = GL_BOOL;
7319 *numParams = 1;
7320 return true;
7321 }
7322 }
7323
7324 if (getExtensions().clientArrays)
7325 {
7326 switch (pname)
7327 {
7328 case GL_CLIENT_ARRAYS_ANGLE:
7329 *type = GL_BOOL;
7330 *numParams = 1;
7331 return true;
7332 }
7333 }
7334
7335 if (getExtensions().sRGBWriteControl)
7336 {
7337 switch (pname)
7338 {
7339 case GL_FRAMEBUFFER_SRGB_EXT:
7340 *type = GL_BOOL;
7341 *numParams = 1;
7342 return true;
7343 }
7344 }
7345
7346 if (getExtensions().robustResourceInitialization &&
7347 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7348 {
7349 *type = GL_BOOL;
7350 *numParams = 1;
7351 return true;
7352 }
7353
7354 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7355 {
7356 *type = GL_BOOL;
7357 *numParams = 1;
7358 return true;
7359 }
7360
jchen1082af6202018-06-22 10:59:52 +08007361 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7362 {
7363 *type = GL_INT;
7364 *numParams = 1;
7365 return true;
7366 }
7367
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007368 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7369 {
7370 *type = GL_INT;
7371 *numParams = 1;
7372 return true;
7373 }
7374
Jamie Madill5b772312018-03-08 20:28:32 -05007375 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7376 switch (pname)
7377 {
7378 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7379 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7380 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7381 {
7382 return false;
7383 }
7384 *type = GL_INT;
7385 *numParams = 1;
7386 return true;
7387
7388 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7389 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7390 {
7391 return false;
7392 }
7393 *type = GL_INT;
7394 *numParams = 1;
7395 return true;
7396
7397 case GL_PROGRAM_BINARY_FORMATS_OES:
7398 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7399 {
7400 return false;
7401 }
7402 *type = GL_INT;
7403 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7404 return true;
7405
7406 case GL_PACK_ROW_LENGTH:
7407 case GL_PACK_SKIP_ROWS:
7408 case GL_PACK_SKIP_PIXELS:
7409 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7410 {
7411 return false;
7412 }
7413 *type = GL_INT;
7414 *numParams = 1;
7415 return true;
7416 case GL_UNPACK_ROW_LENGTH:
7417 case GL_UNPACK_SKIP_ROWS:
7418 case GL_UNPACK_SKIP_PIXELS:
7419 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7420 {
7421 return false;
7422 }
7423 *type = GL_INT;
7424 *numParams = 1;
7425 return true;
7426 case GL_VERTEX_ARRAY_BINDING:
7427 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7428 {
7429 return false;
7430 }
7431 *type = GL_INT;
7432 *numParams = 1;
7433 return true;
7434 case GL_PIXEL_PACK_BUFFER_BINDING:
7435 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7436 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7437 {
7438 return false;
7439 }
7440 *type = GL_INT;
7441 *numParams = 1;
7442 return true;
7443 case GL_MAX_SAMPLES:
7444 {
7445 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7446 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7447 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7448 {
7449 return false;
7450 }
7451 *type = GL_INT;
7452 *numParams = 1;
7453 return true;
7454
7455 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7456 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7457 {
7458 return false;
7459 }
7460 *type = GL_INT;
7461 *numParams = 1;
7462 return true;
7463 }
7464 }
7465
7466 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7467 {
7468 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7469 {
7470 return false;
7471 }
7472 *type = GL_INT;
7473 *numParams = 1;
7474 return true;
7475 }
7476
7477 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7478 {
7479 *type = GL_INT;
7480 *numParams = 1;
7481 return true;
7482 }
7483
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007484 if (getClientVersion() < Version(2, 0))
7485 {
7486 switch (pname)
7487 {
7488 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007489 case GL_CLIENT_ACTIVE_TEXTURE:
7490 case GL_MATRIX_MODE:
7491 case GL_MAX_TEXTURE_UNITS:
7492 case GL_MAX_MODELVIEW_STACK_DEPTH:
7493 case GL_MAX_PROJECTION_STACK_DEPTH:
7494 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007495 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007496 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007497 case GL_VERTEX_ARRAY_STRIDE:
7498 case GL_NORMAL_ARRAY_STRIDE:
7499 case GL_COLOR_ARRAY_STRIDE:
7500 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7501 case GL_VERTEX_ARRAY_SIZE:
7502 case GL_COLOR_ARRAY_SIZE:
7503 case GL_TEXTURE_COORD_ARRAY_SIZE:
7504 case GL_VERTEX_ARRAY_TYPE:
7505 case GL_NORMAL_ARRAY_TYPE:
7506 case GL_COLOR_ARRAY_TYPE:
7507 case GL_TEXTURE_COORD_ARRAY_TYPE:
7508 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7509 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7510 case GL_COLOR_ARRAY_BUFFER_BINDING:
7511 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7512 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7513 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7514 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007515 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007516 case GL_MODELVIEW_STACK_DEPTH:
7517 case GL_PROJECTION_STACK_DEPTH:
7518 case GL_TEXTURE_STACK_DEPTH:
7519 case GL_LOGIC_OP_MODE:
7520 case GL_BLEND_SRC:
7521 case GL_BLEND_DST:
7522 case GL_PERSPECTIVE_CORRECTION_HINT:
7523 case GL_POINT_SMOOTH_HINT:
7524 case GL_LINE_SMOOTH_HINT:
7525 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007526 *type = GL_INT;
7527 *numParams = 1;
7528 return true;
7529 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007530 case GL_FOG_DENSITY:
7531 case GL_FOG_START:
7532 case GL_FOG_END:
7533 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007534 case GL_POINT_SIZE:
7535 case GL_POINT_SIZE_MIN:
7536 case GL_POINT_SIZE_MAX:
7537 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007538 *type = GL_FLOAT;
7539 *numParams = 1;
7540 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007541 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007542 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007543 *type = GL_FLOAT;
7544 *numParams = 2;
7545 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007546 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007547 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007548 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007549 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007550 *type = GL_FLOAT;
7551 *numParams = 4;
7552 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007553 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007554 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007555 *type = GL_FLOAT;
7556 *numParams = 3;
7557 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007558 case GL_MODELVIEW_MATRIX:
7559 case GL_PROJECTION_MATRIX:
7560 case GL_TEXTURE_MATRIX:
7561 *type = GL_FLOAT;
7562 *numParams = 16;
7563 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007564 case GL_LIGHT_MODEL_TWO_SIDE:
7565 *type = GL_BOOL;
7566 *numParams = 1;
7567 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007568 }
7569 }
7570
Jamie Madill5b772312018-03-08 20:28:32 -05007571 if (getClientVersion() < Version(3, 0))
7572 {
7573 return false;
7574 }
7575
7576 // Check for ES3.0+ parameter names
7577 switch (pname)
7578 {
7579 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7580 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7581 case GL_UNIFORM_BUFFER_BINDING:
7582 case GL_TRANSFORM_FEEDBACK_BINDING:
7583 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7584 case GL_COPY_READ_BUFFER_BINDING:
7585 case GL_COPY_WRITE_BUFFER_BINDING:
7586 case GL_SAMPLER_BINDING:
7587 case GL_READ_BUFFER:
7588 case GL_TEXTURE_BINDING_3D:
7589 case GL_TEXTURE_BINDING_2D_ARRAY:
7590 case GL_MAX_3D_TEXTURE_SIZE:
7591 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7592 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7593 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7594 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7595 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7596 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7597 case GL_MAX_VARYING_COMPONENTS:
7598 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7599 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7600 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7601 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7602 case GL_NUM_EXTENSIONS:
7603 case GL_MAJOR_VERSION:
7604 case GL_MINOR_VERSION:
7605 case GL_MAX_ELEMENTS_INDICES:
7606 case GL_MAX_ELEMENTS_VERTICES:
7607 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7608 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7609 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7610 case GL_UNPACK_IMAGE_HEIGHT:
7611 case GL_UNPACK_SKIP_IMAGES:
7612 {
7613 *type = GL_INT;
7614 *numParams = 1;
7615 return true;
7616 }
7617
7618 case GL_MAX_ELEMENT_INDEX:
7619 case GL_MAX_UNIFORM_BLOCK_SIZE:
7620 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7621 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7622 case GL_MAX_SERVER_WAIT_TIMEOUT:
7623 {
7624 *type = GL_INT_64_ANGLEX;
7625 *numParams = 1;
7626 return true;
7627 }
7628
7629 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7630 case GL_TRANSFORM_FEEDBACK_PAUSED:
7631 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7632 case GL_RASTERIZER_DISCARD:
7633 {
7634 *type = GL_BOOL;
7635 *numParams = 1;
7636 return true;
7637 }
7638
7639 case GL_MAX_TEXTURE_LOD_BIAS:
7640 {
7641 *type = GL_FLOAT;
7642 *numParams = 1;
7643 return true;
7644 }
7645 }
7646
7647 if (getExtensions().requestExtension)
7648 {
7649 switch (pname)
7650 {
7651 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7652 *type = GL_INT;
7653 *numParams = 1;
7654 return true;
7655 }
7656 }
7657
7658 if (getClientVersion() < Version(3, 1))
7659 {
7660 return false;
7661 }
7662
7663 switch (pname)
7664 {
7665 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7666 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7667 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7668 case GL_MAX_FRAMEBUFFER_WIDTH:
7669 case GL_MAX_FRAMEBUFFER_HEIGHT:
7670 case GL_MAX_FRAMEBUFFER_SAMPLES:
7671 case GL_MAX_SAMPLE_MASK_WORDS:
7672 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7673 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7674 case GL_MAX_INTEGER_SAMPLES:
7675 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7676 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7677 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7678 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7679 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7680 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7681 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7682 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7683 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7684 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7685 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7686 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7687 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7688 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7689 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7690 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7691 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7692 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7693 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7694 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7695 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7696 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7697 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7698 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7699 case GL_MAX_UNIFORM_LOCATIONS:
7700 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7701 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7702 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7703 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7704 case GL_MAX_IMAGE_UNITS:
7705 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7706 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7707 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7708 case GL_SHADER_STORAGE_BUFFER_BINDING:
7709 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7710 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007711 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007712 *type = GL_INT;
7713 *numParams = 1;
7714 return true;
7715 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7716 *type = GL_INT_64_ANGLEX;
7717 *numParams = 1;
7718 return true;
7719 case GL_SAMPLE_MASK:
7720 *type = GL_BOOL;
7721 *numParams = 1;
7722 return true;
7723 }
7724
7725 if (getExtensions().geometryShader)
7726 {
7727 switch (pname)
7728 {
7729 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7730 case GL_LAYER_PROVOKING_VERTEX_EXT:
7731 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7732 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7733 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7734 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7735 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7736 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7737 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7738 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7739 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7740 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7741 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7742 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7743 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7744 *type = GL_INT;
7745 *numParams = 1;
7746 return true;
7747 }
7748 }
7749
7750 return false;
7751}
7752
7753bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7754{
7755 if (getClientVersion() < Version(3, 0))
7756 {
7757 return false;
7758 }
7759
7760 switch (target)
7761 {
7762 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7763 case GL_UNIFORM_BUFFER_BINDING:
7764 {
7765 *type = GL_INT;
7766 *numParams = 1;
7767 return true;
7768 }
7769 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7770 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7771 case GL_UNIFORM_BUFFER_START:
7772 case GL_UNIFORM_BUFFER_SIZE:
7773 {
7774 *type = GL_INT_64_ANGLEX;
7775 *numParams = 1;
7776 return true;
7777 }
7778 }
7779
7780 if (getClientVersion() < Version(3, 1))
7781 {
7782 return false;
7783 }
7784
7785 switch (target)
7786 {
7787 case GL_IMAGE_BINDING_LAYERED:
7788 {
7789 *type = GL_BOOL;
7790 *numParams = 1;
7791 return true;
7792 }
7793 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7794 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7795 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7796 case GL_SHADER_STORAGE_BUFFER_BINDING:
7797 case GL_VERTEX_BINDING_BUFFER:
7798 case GL_VERTEX_BINDING_DIVISOR:
7799 case GL_VERTEX_BINDING_OFFSET:
7800 case GL_VERTEX_BINDING_STRIDE:
7801 case GL_SAMPLE_MASK_VALUE:
7802 case GL_IMAGE_BINDING_NAME:
7803 case GL_IMAGE_BINDING_LEVEL:
7804 case GL_IMAGE_BINDING_LAYER:
7805 case GL_IMAGE_BINDING_ACCESS:
7806 case GL_IMAGE_BINDING_FORMAT:
7807 {
7808 *type = GL_INT;
7809 *numParams = 1;
7810 return true;
7811 }
7812 case GL_ATOMIC_COUNTER_BUFFER_START:
7813 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7814 case GL_SHADER_STORAGE_BUFFER_START:
7815 case GL_SHADER_STORAGE_BUFFER_SIZE:
7816 {
7817 *type = GL_INT_64_ANGLEX;
7818 *numParams = 1;
7819 return true;
7820 }
7821 }
7822
7823 return false;
7824}
7825
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007826Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007827{
7828 return mState.mShaderPrograms->getProgram(handle);
7829}
7830
7831Shader *Context::getShader(GLuint handle) const
7832{
7833 return mState.mShaderPrograms->getShader(handle);
7834}
7835
Jamie Madill5b772312018-03-08 20:28:32 -05007836bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7837{
7838 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7839}
7840
7841bool Context::isFramebufferGenerated(GLuint framebuffer) const
7842{
7843 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7844}
7845
7846bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7847{
7848 return mState.mPipelines->isHandleGenerated(pipeline);
7849}
7850
7851bool Context::usingDisplayTextureShareGroup() const
7852{
7853 return mDisplayTextureShareGroup;
7854}
7855
7856GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7857{
7858 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7859 internalformat == GL_DEPTH_STENCIL
7860 ? GL_DEPTH24_STENCIL8
7861 : internalformat;
7862}
7863
jchen1082af6202018-06-22 10:59:52 +08007864void Context::maxShaderCompilerThreads(GLuint count)
7865{
jchen107ae70d82018-07-06 13:47:01 +08007866 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007867 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007868 // A count of zero specifies a request for no parallel compiling or linking.
7869 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7870 {
7871 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7872 }
7873 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007874}
7875
Jamie Madill2eb65032018-07-30 10:25:57 -04007876bool Context::isGLES1() const
7877{
7878 return mState.getClientVersion() < Version(2, 0);
7879}
7880
Jamie Madilla11819d2018-07-30 10:26:01 -04007881void Context::onSubjectStateChange(const Context *context,
7882 angle::SubjectIndex index,
7883 angle::SubjectMessage message)
7884{
Jamie Madilla11819d2018-07-30 10:26:01 -04007885 switch (index)
7886 {
7887 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007888 switch (message)
7889 {
7890 case angle::SubjectMessage::CONTENTS_CHANGED:
7891 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7892 mStateCache.onVertexArrayBufferContentsChange(this);
7893 break;
7894 case angle::SubjectMessage::RESOURCE_MAPPED:
7895 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7896 case angle::SubjectMessage::BINDING_CHANGED:
7897 mStateCache.onVertexArrayBufferStateChange(this);
7898 break;
7899 default:
7900 break;
7901 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007902 break;
7903
7904 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007905 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7906 {
7907 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7908 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007909 break;
7910
7911 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007912 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7913 {
7914 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
7915 }
7916 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007917 break;
7918
7919 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007920 if (index < kTextureMaxSubjectIndex)
7921 {
7922 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04007923 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007924 }
Jamie Madille25b8002018-09-20 13:39:49 -04007925 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04007926 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04007927 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04007928 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04007929 }
Jamie Madille25b8002018-09-20 13:39:49 -04007930 else
7931 {
7932 ASSERT(index < kSamplerMaxSubjectIndex);
7933 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
7934 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007935 break;
7936 }
7937}
7938
Jamie Madill6b873dd2018-07-12 23:56:30 -04007939// ErrorSet implementation.
7940ErrorSet::ErrorSet(Context *context) : mContext(context)
7941{
7942}
7943
7944ErrorSet::~ErrorSet() = default;
7945
Jamie Madill306b6c12018-07-27 08:12:49 -04007946void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04007947{
7948 // This internal enum is used to filter internal errors that are already handled.
7949 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
7950 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
7951 {
7952 return;
7953 }
7954
7955 if (ANGLE_UNLIKELY(error.isError()))
7956 {
7957 GLenum code = error.getCode();
7958 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04007959
Jamie Madill6b873dd2018-07-12 23:56:30 -04007960 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
7961 {
7962 mContext->markContextLost();
7963 }
7964
7965 ASSERT(!error.getMessage().empty());
7966 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
7967 error.getID(), GL_DEBUG_SEVERITY_HIGH,
7968 error.getMessage());
7969 }
7970}
7971
Jamie Madillabfbc0f2018-10-09 12:48:52 -04007972void ErrorSet::handleError(GLenum errorCode,
7973 const char *message,
7974 const char *file,
7975 const char *function,
7976 unsigned int line)
7977{
7978 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
7979 std::stringstream errorStream;
7980 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
7981 << function << ":" << line << ". " << message;
7982
7983 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
7984}
7985
Jamie Madilla139f012018-10-10 16:13:03 -04007986void ErrorSet::validationError(GLenum errorCode, const char *message)
7987{
7988 handleError(gl::Error(errorCode, message));
7989}
7990
Jamie Madill6b873dd2018-07-12 23:56:30 -04007991bool ErrorSet::empty() const
7992{
7993 return mErrors.empty();
7994}
7995
7996GLenum ErrorSet::popError()
7997{
7998 ASSERT(!empty());
7999 GLenum error = *mErrors.begin();
8000 mErrors.erase(mErrors.begin());
8001 return error;
8002}
Jamie Madilldc358af2018-07-31 11:22:13 -04008003
8004// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008005StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008006 : mCachedHasAnyEnabledClientAttrib(false),
8007 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008008 mCachedInstancedVertexElementLimit(0),
8009 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madilldc358af2018-07-31 11:22:13 -04008010{
8011}
8012
8013StateCache::~StateCache() = default;
8014
Jamie Madillac66f982018-10-09 18:30:01 -04008015void StateCache::initialize(Context *context)
8016{
8017 updateValidDrawModes(context);
8018 updateValidBindTextureTypes(context);
8019}
8020
Jamie Madilldc358af2018-07-31 11:22:13 -04008021void StateCache::updateActiveAttribsMask(Context *context)
8022{
8023 bool isGLES1 = context->isGLES1();
8024 const State &glState = context->getGLState();
8025
8026 if (!isGLES1 && !glState.getProgram())
8027 {
8028 mCachedActiveBufferedAttribsMask = AttributesMask();
8029 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008030 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008031 return;
8032 }
8033
8034 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8035 : glState.getProgram()->getActiveAttribLocationsMask();
8036
8037 const VertexArray *vao = glState.getVertexArray();
8038 ASSERT(vao);
8039
8040 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8041 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008042 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008043
Jamie Madill0a17e482018-08-31 17:19:11 -04008044 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8045 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008046 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008047 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8048}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008049
8050void StateCache::updateVertexElementLimits(Context *context)
8051{
8052 const VertexArray *vao = context->getGLState().getVertexArray();
8053
8054 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8055 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8056
8057 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8058 // If there are no buffered attributes then we should not limit the draw call count.
8059 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8060 {
8061 return;
8062 }
8063
8064 const auto &vertexAttribs = vao->getVertexAttributes();
8065 const auto &vertexBindings = vao->getVertexBindings();
8066
8067 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8068 {
8069 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8070 ASSERT(attrib.enabled);
8071
8072 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8073 ASSERT(context->isGLES1() ||
8074 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8075
8076 GLint64 limit = attrib.getCachedElementLimit();
8077 if (binding.getDivisor() > 0)
8078 {
8079 mCachedInstancedVertexElementLimit =
8080 std::min(mCachedInstancedVertexElementLimit, limit);
8081 }
8082 else
8083 {
8084 mCachedNonInstancedVertexElementLimit =
8085 std::min(mCachedNonInstancedVertexElementLimit, limit);
8086 }
8087 }
8088}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008089
Jamie Madilld84b6732018-09-06 15:54:35 -04008090void StateCache::updateBasicDrawStatesError()
8091{
8092 mCachedBasicDrawStatesError = kInvalidPointer;
8093}
8094
8095intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8096{
8097 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8098 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8099 return mCachedBasicDrawStatesError;
8100}
8101
Jamie Madillc43cdad2018-08-08 15:49:25 -04008102void StateCache::onVertexArrayBindingChange(Context *context)
8103{
8104 updateActiveAttribsMask(context);
8105 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008106 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008107}
8108
8109void StateCache::onProgramExecutableChange(Context *context)
8110{
8111 updateActiveAttribsMask(context);
8112 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008113 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008114 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008115}
8116
Jamie Madilld84b6732018-09-06 15:54:35 -04008117void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008118{
8119 updateVertexElementLimits(context);
8120}
8121
Jamie Madilld84b6732018-09-06 15:54:35 -04008122void StateCache::onVertexArrayBufferContentsChange(Context *context)
8123{
8124 updateVertexElementLimits(context);
8125 updateBasicDrawStatesError();
8126}
8127
Jamie Madillc43cdad2018-08-08 15:49:25 -04008128void StateCache::onVertexArrayStateChange(Context *context)
8129{
8130 updateActiveAttribsMask(context);
8131 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008132 updateBasicDrawStatesError();
8133}
8134
8135void StateCache::onVertexArrayBufferStateChange(Context *context)
8136{
8137 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008138}
8139
8140void StateCache::onGLES1ClientStateChange(Context *context)
8141{
8142 updateActiveAttribsMask(context);
8143}
Jamie Madilld84b6732018-09-06 15:54:35 -04008144
8145void StateCache::onDrawFramebufferChange(Context *context)
8146{
8147 updateBasicDrawStatesError();
8148}
8149
8150void StateCache::onContextCapChange(Context *context)
8151{
8152 updateBasicDrawStatesError();
8153}
8154
8155void StateCache::onStencilStateChange(Context *context)
8156{
8157 updateBasicDrawStatesError();
8158}
8159
8160void StateCache::onDefaultVertexAttributeChange(Context *context)
8161{
8162 updateBasicDrawStatesError();
8163}
8164
8165void StateCache::onActiveTextureChange(Context *context)
8166{
8167 updateBasicDrawStatesError();
8168}
8169
8170void StateCache::onQueryChange(Context *context)
8171{
8172 updateBasicDrawStatesError();
8173}
8174
8175void StateCache::onTransformFeedbackChange(Context *context)
8176{
8177 updateBasicDrawStatesError();
8178}
8179
8180void StateCache::onUniformBufferStateChange(Context *context)
8181{
8182 updateBasicDrawStatesError();
8183}
8184
8185void StateCache::onBufferBindingChange(Context *context)
8186{
8187 updateBasicDrawStatesError();
8188}
Jamie Madill526a6f62018-09-12 11:03:05 -04008189
8190void StateCache::updateValidDrawModes(Context *context)
8191{
8192 Program *program = context->getGLState().getProgram();
8193 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8194 {
8195 mCachedValidDrawModes = {{
8196 true, /* Points */
8197 true, /* Lines */
8198 true, /* LineLoop */
8199 true, /* LineStrip */
8200 true, /* Triangles */
8201 true, /* TriangleStrip */
8202 true, /* TriangleFan */
8203 false, /* LinesAdjacency */
8204 false, /* LineStripAdjacency */
8205 false, /* TrianglesAdjacency */
8206 false, /* TriangleStripAdjacency */
8207 false, /* InvalidEnum */
8208 }};
8209 }
8210 else
8211 {
8212 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8213
8214 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8215
8216 mCachedValidDrawModes = {{
8217 gsMode == PrimitiveMode::Points, /* Points */
8218 gsMode == PrimitiveMode::Lines, /* Lines */
8219 gsMode == PrimitiveMode::Lines, /* LineLoop */
8220 gsMode == PrimitiveMode::Lines, /* LineStrip */
8221 gsMode == PrimitiveMode::Triangles, /* Triangles */
8222 gsMode == PrimitiveMode::Triangles, /* TriangleStrip */
8223 gsMode == PrimitiveMode::Triangles, /* TriangleFan */
8224 gsMode == PrimitiveMode::LinesAdjacency, /* LinesAdjacency */
8225 gsMode == PrimitiveMode::LinesAdjacency, /* LineStripAdjacency */
8226 gsMode == PrimitiveMode::TrianglesAdjacency, /* TrianglesAdjacency */
8227 gsMode == PrimitiveMode::TrianglesAdjacency, /* TriangleStripAdjacency */
8228 false, /* InvalidEnum */
8229 }};
8230 }
8231}
Jamie Madillac66f982018-10-09 18:30:01 -04008232
8233void StateCache::updateValidBindTextureTypes(Context *context)
8234{
8235 const Extensions &exts = context->getExtensions();
8236 bool isGLES3 = context->getClientMajorVersion() >= 3;
8237 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8238
8239 mCachedValidBindTextureTypes = {{
8240 true, /* _2D */
8241 isGLES3, /* _2DArray */
8242 isGLES31, /* _2DMultisample */
8243 exts.textureStorageMultisample2DArray, /* _2DMultisampleArray */
8244 isGLES3, /* _3D */
8245 exts.eglImageExternal || exts.eglStreamConsumerExternal, /* External */
8246 exts.textureRectangle, /* Rectangle */
8247 true, /* CubeMap */
8248 false, /* InvalidEnum */
8249
8250 }};
8251}
Jamie Madillc29968b2016-01-20 11:17:23 -05008252} // namespace gl