blob: d9c948cafcdcbac5f1ab80db71acd187380fa3a0 [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"
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090011#include "libANGLE/Context.inl.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000012
Jamie Madill231c7f52017-04-26 13:45:37 -040013#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050014#include <iterator>
15#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030016#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050017
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060018#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030019#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040020#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050021#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050022#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050023#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050024#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040025#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050026#include "libANGLE/Fence.h"
27#include "libANGLE/Framebuffer.h"
28#include "libANGLE/FramebufferAttachment.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/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040046#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040047#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000048
Jamie Madill752d2202018-11-27 13:29:48 -050049namespace gl
50{
Geoff Langf6db0982015-08-25 13:04:00 -040051namespace
52{
53
Jamie Madillb6664922017-07-25 12:55:04 -040054#define ANGLE_HANDLE_ERR(X) \
Jamie Madill4f6592f2018-11-27 16:37:45 -050055 (void)(X); \
Jamie Madillb6664922017-07-25 12:55:04 -040056 return;
57#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
58
Ian Ewell3ffd78b2016-01-22 16:09:42 -050059template <typename T>
Jamie Madill752d2202018-11-27 13:29:48 -050060std::vector<Path *> GatherPaths(PathManager &resourceManager,
61 GLsizei numPaths,
62 const void *paths,
63 GLuint pathBase)
Sami Väisänend59ca052016-06-21 16:10:00 +030064{
Jamie Madill752d2202018-11-27 13:29:48 -050065 std::vector<Path *> ret;
Sami Väisänend59ca052016-06-21 16:10:00 +030066 ret.reserve(numPaths);
67
68 const auto *nameArray = static_cast<const T *>(paths);
69
70 for (GLsizei i = 0; i < numPaths; ++i)
71 {
72 const GLuint pathName = nameArray[i] + pathBase;
73
74 ret.push_back(resourceManager.getPath(pathName));
75 }
76
77 return ret;
78}
79
Jamie Madill752d2202018-11-27 13:29:48 -050080std::vector<Path *> GatherPaths(PathManager &resourceManager,
81 GLsizei numPaths,
82 GLenum pathNameType,
83 const void *paths,
84 GLuint pathBase)
Sami Väisänend59ca052016-06-21 16:10:00 +030085{
86 switch (pathNameType)
87 {
88 case GL_UNSIGNED_BYTE:
89 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
90
91 case GL_BYTE:
92 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
93
94 case GL_UNSIGNED_SHORT:
95 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
96
97 case GL_SHORT:
98 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
99
100 case GL_UNSIGNED_INT:
101 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
102
103 case GL_INT:
104 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
105 }
106
107 UNREACHABLE();
Jamie Madill752d2202018-11-27 13:29:48 -0500108 return std::vector<Path *>();
Sami Väisänend59ca052016-06-21 16:10:00 +0300109}
110
111template <typename T>
Jamie Madill752d2202018-11-27 13:29:48 -0500112angle::Result GetQueryObjectParameter(const Context *context, Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500113{
Geoff Lang2186c382016-10-14 10:54:54 -0400114 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115
116 switch (pname)
117 {
118 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400119 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500120 case GL_QUERY_RESULT_AVAILABLE_EXT:
121 {
122 bool available;
Jamie Madill666818e2018-11-14 09:54:33 -0500123 ANGLE_TRY(query->isResultAvailable(context, &available));
Jamie Madill752d2202018-11-27 13:29:48 -0500124 *params = CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Jamie Madill7c985f52018-11-29 18:16:17 -0500125 return angle::Result::Continue;
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 }
127 default:
128 UNREACHABLE();
Jamie Madill7c985f52018-11-29 18:16:17 -0500129 return angle::Result::Stop;
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500130 }
131}
132
Jamie Madill752d2202018-11-27 13:29:48 -0500133ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const Context *context,
Jamie Madill956ab4d2018-10-10 16:13:03 -0400134 GLsizei count,
135 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400136{
Jamie Madillae6ba9f2018-12-21 23:00:04 -0500137 if (context->getStateCache().isTransformFeedbackActiveUnpaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400138 {
Jamie Madillae6ba9f2018-12-21 23:00:04 -0500139 TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
Jamie Madill09463932018-04-04 05:26:59 -0400140 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400141 }
142}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500143
144// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300145EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500146{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400147 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148}
149
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
151{
152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
153}
154
Jamie Madill752d2202018-11-27 13:29:48 -0500155Version GetClientVersion(const egl::AttributeMap &attribs)
Geoff Langeb66a6e2016-10-31 13:06:12 -0400156{
Jamie Madill752d2202018-11-27 13:29:48 -0500157 return Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
Geoff Langeb66a6e2016-10-31 13:06:12 -0400158}
159
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500160GLenum GetResetStrategy(const egl::AttributeMap &attribs)
161{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800162 EGLAttrib attrib =
163 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500164 switch (attrib)
165 {
166 case EGL_NO_RESET_NOTIFICATION:
167 return GL_NO_RESET_NOTIFICATION_EXT;
168 case EGL_LOSE_CONTEXT_ON_RESET:
169 return GL_LOSE_CONTEXT_ON_RESET_EXT;
170 default:
171 UNREACHABLE();
172 return GL_NONE;
173 }
174}
175
176bool GetRobustAccess(const egl::AttributeMap &attribs)
177{
Geoff Lang077f20a2016-11-01 10:08:02 -0400178 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
179 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
180 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500181}
182
183bool GetDebug(const egl::AttributeMap &attribs)
184{
Geoff Lang077f20a2016-11-01 10:08:02 -0400185 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
186 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500187}
188
189bool GetNoError(const egl::AttributeMap &attribs)
190{
191 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
192}
193
Geoff Langc287ea62016-09-16 14:46:51 -0400194bool GetWebGLContext(const egl::AttributeMap &attribs)
195{
Jamie Madill4230d482018-09-14 10:14:45 -0400196 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400197}
198
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400199bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
200{
201 // If the context is WebGL, extensions are disabled by default
202 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
203 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
204}
205
Geoff Langf41a7152016-09-19 15:11:17 -0400206bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
207{
Jamie Madill4230d482018-09-14 10:14:45 -0400208 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400209}
210
Geoff Langfeb8c682017-02-13 16:07:35 -0500211bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
212{
213 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
214}
215
Geoff Langb433e872017-10-05 14:01:47 -0400216bool GetRobustResourceInit(const egl::AttributeMap &attribs)
217{
218 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
219}
220
Martin Radev9d901792016-07-15 15:58:58 +0300221std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
222{
223 std::string labelName;
224 if (label != nullptr)
225 {
226 size_t labelLength = length < 0 ? strlen(label) : length;
227 labelName = std::string(label, labelLength);
228 }
229 return labelName;
230}
231
232void GetObjectLabelBase(const std::string &objectLabel,
233 GLsizei bufSize,
234 GLsizei *length,
235 GLchar *label)
236{
237 size_t writeLength = objectLabel.length();
238 if (label != nullptr && bufSize > 0)
239 {
240 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
241 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
242 label[writeLength] = '\0';
243 }
244
245 if (length != nullptr)
246 {
247 *length = static_cast<GLsizei>(writeLength);
248 }
249}
250
Jamie Madill0f80ed82017-09-19 00:24:56 -0400251template <typename CapT, typename MaxT>
252void LimitCap(CapT *cap, MaxT maximum)
253{
254 *cap = std::min(*cap, static_cast<CapT>(maximum));
255}
256
Jamie Madill752d2202018-11-27 13:29:48 -0500257constexpr angle::PackedEnumMap<PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
258 {PrimitiveMode::Points, 1},
259 {PrimitiveMode::Lines, 2},
260 {PrimitiveMode::LineLoop, 2},
261 {PrimitiveMode::LineStrip, 2},
262 {PrimitiveMode::Triangles, 3},
263 {PrimitiveMode::TriangleStrip, 3},
264 {PrimitiveMode::TriangleFan, 3},
265 {PrimitiveMode::LinesAdjacency, 2},
266 {PrimitiveMode::LineStripAdjacency, 2},
267 {PrimitiveMode::TrianglesAdjacency, 3},
268 {PrimitiveMode::TriangleStripAdjacency, 3},
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600269}};
Jamie Madill752d2202018-11-27 13:29:48 -0500270
271// The rest default to false.
272constexpr angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
273 kValidBasicDrawModes = {{
274 {PrimitiveMode::Points, true},
275 {PrimitiveMode::Lines, true},
276 {PrimitiveMode::LineLoop, true},
277 {PrimitiveMode::LineStrip, true},
278 {PrimitiveMode::Triangles, true},
279 {PrimitiveMode::TriangleStrip, true},
280 {PrimitiveMode::TriangleFan, true},
281 }};
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600282
Jamie Madill6d32cef2018-08-14 02:34:28 -0400283enum SubjectIndexes : angle::SubjectIndex
284{
285 kTexture0SubjectIndex = 0,
Jamie Madille3e680c2018-12-03 17:49:08 -0500286 kTextureMaxSubjectIndex = kTexture0SubjectIndex + IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
Qin Jiajia3f01f532018-12-11 15:13:51 +0800287 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400288 kUniformBufferMaxSubjectIndex =
Jamie Madille3e680c2018-12-03 17:49:08 -0500289 kUniformBuffer0SubjectIndex + IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400290 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
Jamie Madille3e680c2018-12-03 17:49:08 -0500291 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
Jamie Madille25b8002018-09-20 13:39:49 -0400292 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400293 kReadFramebufferSubjectIndex,
294 kDrawFramebufferSubjectIndex
295};
Geoff Langf6db0982015-08-25 13:04:00 -0400296} // anonymous namespace
297
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400298Context::Context(rx::EGLImplFactory *implFactory,
299 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400300 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500301 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400302 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500303 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700304 const egl::DisplayExtensions &displayExtensions,
305 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500306 : mState(reinterpret_cast<ContextID>(this),
307 shareContext ? &shareContext->mState : nullptr,
308 shareTextures,
309 GetClientVersion(attribs),
310 &mGLState,
311 mCaps,
312 mTextureCaps,
313 mExtensions,
314 mLimitations),
315 mSkipValidation(GetNoError(attribs)),
316 mDisplayTextureShareGroup(shareTextures != nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400317 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400318 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400319 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400320 mGLState(GetDebug(attribs),
321 GetBindGeneratesResource(attribs),
322 GetClientArraysEnabled(attribs),
323 GetRobustResourceInit(attribs),
324 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400325 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500326 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400327 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500328 mHasBeenCurrent(false),
329 mContextLost(false),
330 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700331 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500332 mResetStrategy(GetResetStrategy(attribs)),
333 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400334 mSurfacelessSupported(displayExtensions.surfacelessContext),
335 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400336 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
337 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500338 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400339 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400340 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400341 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
342 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
343 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400344 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800345 mZeroFilledBuffer(1000u),
346 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000347{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400348 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
349 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
350 {
351 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
352 }
Jamie Madille25b8002018-09-20 13:39:49 -0400353
354 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
355 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
356 {
357 mSamplerObserverBindings.emplace_back(this, samplerIndex);
358 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400359}
Jamie Madill5b772312018-03-08 20:28:32 -0500360
Geoff Lang33f11fb2018-05-07 13:42:47 -0400361void Context::initialize()
362{
363 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400364
Geoff Lang33f11fb2018-05-07 13:42:47 -0400365 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700366 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400367
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400368 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100369
Shannon Woods53a94a82014-06-24 15:20:36 -0400370 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400371
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000372 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400373 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000374 // and cube map texture state vectors respectively associated with them.
375 // In order that access to these initial textures not be lost, they are treated as texture
376 // objects all of whose names are 0.
377
Corentin Wallez99d492c2018-02-27 15:17:10 -0500378 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800379 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500380
Corentin Wallez99d492c2018-02-27 15:17:10 -0500381 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800382 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400383
Geoff Langeb66a6e2016-10-31 13:06:12 -0400384 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400385 {
386 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500387 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800388 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400389
Corentin Wallez99d492c2018-02-27 15:17:10 -0500390 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800391 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400392 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800393 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400394 {
395 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500396 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800397 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800398 }
399 if (getClientVersion() >= Version(3, 1))
400 {
Olli Etuahod310a432018-08-24 15:40:23 +0300401 Texture *zeroTexture2DMultisampleArray =
402 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
403 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800404
Jiajia Qin6eafb042016-12-27 17:04:07 +0800405 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
406 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800407 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800408 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800409
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800410 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
411 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400412 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800413 }
Geoff Lang3b573612016-10-31 14:08:10 -0400414 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000415
Geoff Langb0f917f2017-12-05 13:41:54 -0500416 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400417 {
418 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500419 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800420 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400421 }
422
Geoff Langb0f917f2017-12-05 13:41:54 -0500423 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400424 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500425 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800426 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400427 }
428
Jamie Madill4928b7c2017-06-20 12:57:39 -0400429 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500430
Jamie Madill57a89722013-07-02 11:57:03 -0400431 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000432
Geoff Langeb66a6e2016-10-31 13:06:12 -0400433 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400434 {
435 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
436 // In the initial state, a default transform feedback object is bound and treated as
437 // a transform feedback object with a name of zero. That object is bound any time
438 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400439 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400440 }
Geoff Langc8058452014-02-03 12:04:11 -0500441
Corentin Wallez336129f2017-10-17 15:55:40 -0400442 for (auto type : angle::AllEnums<BufferBinding>())
443 {
444 bindBuffer(type, 0);
445 }
446
447 bindRenderbuffer(GL_RENDERBUFFER, 0);
448
449 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
450 {
451 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
452 }
453
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700454 // Initialize GLES1 renderer if appropriate.
455 if (getClientVersion() < Version(2, 0))
456 {
457 mGLES1Renderer.reset(new GLES1Renderer());
458 }
459
Jamie Madillad9f24e2016-02-12 09:27:24 -0500460 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400461 mAllDirtyBits.set();
462
Geoff Lang9bf86f02018-07-26 11:46:34 -0400463 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
464 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madille3e680c2018-12-03 17:49:08 -0500465 mDrawDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400466 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400467 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400468
469 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
470 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madille3e680c2018-12-03 17:49:08 -0500471 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400472 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400473
Jamie Madillc67323a2017-11-02 23:11:41 -0400474 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500475 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500476 // No dirty objects.
477
478 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400479 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500480 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400481 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500482 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
483
484 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
485 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
486 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
487 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
488 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
489 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
490 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
491 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
492 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
493 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
494 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400495 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500496 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
497
498 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
499 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700500 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400501 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
502 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500503 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
504 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400505
Xinghua Cao10a4d432017-11-28 14:46:26 +0800506 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800507 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
508 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800509 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
510 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
511 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
512 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800513 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800514 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jamie Madille3e680c2018-12-03 17:49:08 -0500515 mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400516 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400517 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800518
Jamie Madillb4927eb2018-07-16 11:39:46 -0400519 mImplementation->setErrorSet(&mErrors);
520
Jamie Madill4f6592f2018-11-27 16:37:45 -0500521 ANGLE_CONTEXT_TRY(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000522}
523
Jamie Madill4928b7c2017-06-20 12:57:39 -0400524egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000525{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700526 if (mGLES1Renderer)
527 {
528 mGLES1Renderer->onDestroy(this, &mGLState);
529 }
530
Jamie Madille7b3fe22018-04-05 09:42:46 -0400531 ANGLE_TRY(releaseSurface(display));
532
Corentin Wallez80b24112015-08-25 16:41:57 -0400533 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000534 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400535 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000536 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400537 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000538
Corentin Wallez80b24112015-08-25 16:41:57 -0400539 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000540 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400541 if (query.second != nullptr)
542 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400543 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400544 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000545 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400546 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000547
Corentin Wallez80b24112015-08-25 16:41:57 -0400548 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400549 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400550 if (vertexArray.second)
551 {
552 vertexArray.second->onDestroy(this);
553 }
Jamie Madill57a89722013-07-02 11:57:03 -0400554 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400555 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400556
Corentin Wallez80b24112015-08-25 16:41:57 -0400557 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500558 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500559 if (transformFeedback.second != nullptr)
560 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500561 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500562 }
Geoff Langc8058452014-02-03 12:04:11 -0500563 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400564 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500565
Jamie Madill5b772312018-03-08 20:28:32 -0500566 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400567 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800568 if (zeroTexture.get() != nullptr)
569 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400570 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800571 zeroTexture.set(this, nullptr);
572 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400573 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000574
Jamie Madill2f348d22017-06-05 10:50:59 -0400575 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500576
Jamie Madill4928b7c2017-06-20 12:57:39 -0400577 mGLState.reset(this);
578
Jamie Madill6c1f6712017-02-14 19:08:04 -0500579 mState.mBuffers->release(this);
580 mState.mShaderPrograms->release(this);
581 mState.mTextures->release(this);
582 mState.mRenderbuffers->release(this);
583 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400584 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500585 mState.mPaths->release(this);
586 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800587 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400588
jchen107ae70d82018-07-06 13:47:01 +0800589 mThreadPool.reset();
590
Jamie Madill76e471e2017-10-21 09:56:01 -0400591 mImplementation->onDestroy(this);
592
Jamie Madill4928b7c2017-06-20 12:57:39 -0400593 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000594}
595
Jamie Madillb980c562018-11-27 11:34:27 -0500596Context::~Context() {}
Jamie Madill70ee0f62017-02-06 16:04:20 -0500597
Geoff Lang75359662018-04-11 01:42:27 -0400598void Context::setLabel(EGLLabelKHR label)
599{
600 mLabel = label;
601}
602
603EGLLabelKHR Context::getLabel() const
604{
605 return mLabel;
606}
607
Jamie Madill4928b7c2017-06-20 12:57:39 -0400608egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000609{
Jamie Madill61e16b42017-06-19 11:13:23 -0400610 mCurrentDisplay = display;
611
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000612 if (!mHasBeenCurrent)
613 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400614 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000615 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500616 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400617 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000618
Corentin Wallezc295e512017-01-27 17:47:50 -0500619 int width = 0;
620 int height = 0;
621 if (surface != nullptr)
622 {
623 width = surface->getWidth();
624 height = surface->getHeight();
625 }
626
627 mGLState.setViewportParams(0, 0, width, height);
628 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000629
630 mHasBeenCurrent = true;
631 }
632
Jamie Madill1b94d432015-08-07 13:23:23 -0400633 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700634 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400635 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400636
Jamie Madill4928b7c2017-06-20 12:57:39 -0400637 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500638
639 Framebuffer *newDefault = nullptr;
640 if (surface != nullptr)
641 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400642 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500643 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400644 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500645 }
646 else
647 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400648 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500649 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000650
Corentin Wallez37c39792015-08-20 14:19:46 -0400651 // Update default framebuffer, the binding of the previous default
652 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400653 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400654 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700655 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400656 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400657 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400658 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700659 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400660 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400661 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400662 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400663 }
Ian Ewell292f0052016-02-04 10:37:32 -0500664
Jamie Madill32643ce2018-10-19 11:38:03 -0400665 // Notify the renderer of a context switch.
Jamie Madill7c985f52018-11-29 18:16:17 -0500666 return angle::ResultToEGL(mImplementation->onMakeCurrent(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000667}
668
Jamie Madill4928b7c2017-06-20 12:57:39 -0400669egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400670{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400671 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400672
Geoff Langbf7b95d2018-05-01 16:48:21 -0400673 // Remove the default framebuffer
674 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500675 {
676 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400677 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500678 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400679
680 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500681 {
682 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400683 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500684 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400685
686 if (defaultFramebuffer)
687 {
688 defaultFramebuffer->onDestroy(this);
689 delete defaultFramebuffer;
690 }
691
Corentin Wallezc295e512017-01-27 17:47:50 -0500692 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
693
694 if (mCurrentSurface)
695 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400696 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500697 mCurrentSurface = nullptr;
698 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400699
700 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400701}
702
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000703GLuint Context::createBuffer()
704{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500705 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000706}
707
708GLuint Context::createProgram()
709{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500710 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000711}
712
Jiawei Shao385b3e02018-03-21 09:43:28 +0800713GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000714{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500715 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000716}
717
718GLuint Context::createTexture()
719{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500720 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000721}
722
723GLuint Context::createRenderbuffer()
724{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500725 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000726}
727
Jamie Madill13951342018-09-30 15:24:28 -0400728void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
729{
Jamie Madill526392d2018-11-16 09:35:14 -0500730 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(this, range, createdOut));
Jamie Madill13951342018-09-30 15:24:28 -0400731}
732
Brandon Jones59770802018-04-02 13:18:42 -0700733GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300734{
Jamie Madill13951342018-09-30 15:24:28 -0400735 GLuint created = 0;
736 tryGenPaths(range, &created);
737 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300738}
739
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000740// Returns an unused framebuffer name
741GLuint Context::createFramebuffer()
742{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500743 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500746void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000747{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500748 for (int i = 0; i < n; i++)
749 {
750 GLuint handle = mFenceNVHandleAllocator.allocate();
751 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
752 fences[i] = handle;
753 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000754}
755
Yunchao Hea336b902017-08-02 16:05:21 +0800756GLuint Context::createProgramPipeline()
757{
758 return mState.mPipelines->createProgramPipeline();
759}
760
Jiawei Shao385b3e02018-03-21 09:43:28 +0800761GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800762{
763 UNIMPLEMENTED();
764 return 0u;
765}
766
James Darpinian4d9d4832018-03-13 12:43:28 -0700767void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000768{
James Darpinian4d9d4832018-03-13 12:43:28 -0700769 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
770 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000771 {
772 detachBuffer(buffer);
773 }
Jamie Madill893ab082014-05-16 16:56:10 -0400774
James Darpinian4d9d4832018-03-13 12:43:28 -0700775 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000776}
777
778void Context::deleteShader(GLuint shader)
779{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500780 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000781}
782
783void Context::deleteProgram(GLuint program)
784{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500785 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000786}
787
788void Context::deleteTexture(GLuint texture)
789{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500790 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000791 {
792 detachTexture(texture);
793 }
794
Jamie Madill6c1f6712017-02-14 19:08:04 -0500795 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000796}
797
798void Context::deleteRenderbuffer(GLuint renderbuffer)
799{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500800 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000801 {
802 detachRenderbuffer(renderbuffer);
803 }
Jamie Madill893ab082014-05-16 16:56:10 -0400804
Jamie Madill6c1f6712017-02-14 19:08:04 -0500805 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806}
807
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400808void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400809{
810 // The spec specifies the underlying Fence object is not deleted until all current
811 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
812 // and since our API is currently designed for being called from a single thread, we can delete
813 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400814 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400815}
816
Yunchao Hea336b902017-08-02 16:05:21 +0800817void Context::deleteProgramPipeline(GLuint pipeline)
818{
819 if (mState.mPipelines->getProgramPipeline(pipeline))
820 {
821 detachProgramPipeline(pipeline);
822 }
823
824 mState.mPipelines->deleteObject(this, pipeline);
825}
826
Sami Väisänene45e53b2016-05-25 10:36:04 +0300827void Context::deletePaths(GLuint first, GLsizei range)
828{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500829 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300830}
831
Brandon Jones59770802018-04-02 13:18:42 -0700832bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300833{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500834 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300835 if (pathObj == nullptr)
836 return false;
837
838 return pathObj->hasPathData();
839}
840
Brandon Jones59770802018-04-02 13:18:42 -0700841bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300842{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500843 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300844}
845
Brandon Jones59770802018-04-02 13:18:42 -0700846void Context::pathCommands(GLuint path,
847 GLsizei numCommands,
848 const GLubyte *commands,
849 GLsizei numCoords,
850 GLenum coordType,
851 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300852{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500853 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300854
Jamie Madill4f6592f2018-11-27 16:37:45 -0500855 ANGLE_CONTEXT_TRY(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300856}
857
Jamie Madill007530e2017-12-28 14:27:04 -0500858void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300859{
Jamie Madill007530e2017-12-28 14:27:04 -0500860 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300861
862 switch (pname)
863 {
864 case GL_PATH_STROKE_WIDTH_CHROMIUM:
865 pathObj->setStrokeWidth(value);
866 break;
867 case GL_PATH_END_CAPS_CHROMIUM:
868 pathObj->setEndCaps(static_cast<GLenum>(value));
869 break;
870 case GL_PATH_JOIN_STYLE_CHROMIUM:
871 pathObj->setJoinStyle(static_cast<GLenum>(value));
872 break;
873 case GL_PATH_MITER_LIMIT_CHROMIUM:
874 pathObj->setMiterLimit(value);
875 break;
876 case GL_PATH_STROKE_BOUND_CHROMIUM:
877 pathObj->setStrokeBound(value);
878 break;
879 default:
880 UNREACHABLE();
881 break;
882 }
883}
884
Jamie Madill007530e2017-12-28 14:27:04 -0500885void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300886{
Jamie Madill007530e2017-12-28 14:27:04 -0500887 // TODO(jmadill): Should use proper clamping/casting.
888 pathParameterf(path, pname, static_cast<GLfloat>(value));
889}
890
891void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
892{
893 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300894
895 switch (pname)
896 {
897 case GL_PATH_STROKE_WIDTH_CHROMIUM:
898 *value = pathObj->getStrokeWidth();
899 break;
900 case GL_PATH_END_CAPS_CHROMIUM:
901 *value = static_cast<GLfloat>(pathObj->getEndCaps());
902 break;
903 case GL_PATH_JOIN_STYLE_CHROMIUM:
904 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
905 break;
906 case GL_PATH_MITER_LIMIT_CHROMIUM:
907 *value = pathObj->getMiterLimit();
908 break;
909 case GL_PATH_STROKE_BOUND_CHROMIUM:
910 *value = pathObj->getStrokeBound();
911 break;
912 default:
913 UNREACHABLE();
914 break;
915 }
916}
917
Jamie Madill007530e2017-12-28 14:27:04 -0500918void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
919{
920 GLfloat val = 0.0f;
921 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
922 if (value)
923 *value = static_cast<GLint>(val);
924}
925
Brandon Jones59770802018-04-02 13:18:42 -0700926void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300927{
928 mGLState.setPathStencilFunc(func, ref, mask);
929}
930
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000931void Context::deleteFramebuffer(GLuint framebuffer)
932{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500933 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000934 {
935 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000936 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500937
Jamie Madill6c1f6712017-02-14 19:08:04 -0500938 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000939}
940
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500941void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000942{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500943 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000944 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500945 GLuint fence = fences[i];
946
947 FenceNV *fenceObject = nullptr;
948 if (mFenceNVMap.erase(fence, &fenceObject))
949 {
950 mFenceNVHandleAllocator.release(fence);
951 delete fenceObject;
952 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000953 }
954}
955
Geoff Lang70d0f492015-12-10 17:45:46 -0500956Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500958 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000959}
960
Geoff Lang70d0f492015-12-10 17:45:46 -0500961Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500963 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964}
965
Jamie Madill70b5bb02017-08-28 13:32:37 -0400966Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400967{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400968 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400969}
970
Jamie Madill57a89722013-07-02 11:57:03 -0400971VertexArray *Context::getVertexArray(GLuint handle) const
972{
Jamie Madill96a483b2017-06-27 16:49:21 -0400973 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400974}
975
Jamie Madilldc356042013-07-19 16:36:57 -0400976Sampler *Context::getSampler(GLuint handle) const
977{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500978 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400979}
980
Geoff Langc8058452014-02-03 12:04:11 -0500981TransformFeedback *Context::getTransformFeedback(GLuint handle) const
982{
Jamie Madill96a483b2017-06-27 16:49:21 -0400983 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500984}
985
Yunchao Hea336b902017-08-02 16:05:21 +0800986ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
987{
988 return mState.mPipelines->getProgramPipeline(handle);
989}
990
Geoff Lang75359662018-04-11 01:42:27 -0400991gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500992{
993 switch (identifier)
994 {
995 case GL_BUFFER:
996 return getBuffer(name);
997 case GL_SHADER:
998 return getShader(name);
999 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001000 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001001 case GL_VERTEX_ARRAY:
1002 return getVertexArray(name);
1003 case GL_QUERY:
1004 return getQuery(name);
1005 case GL_TRANSFORM_FEEDBACK:
1006 return getTransformFeedback(name);
1007 case GL_SAMPLER:
1008 return getSampler(name);
1009 case GL_TEXTURE:
1010 return getTexture(name);
1011 case GL_RENDERBUFFER:
1012 return getRenderbuffer(name);
1013 case GL_FRAMEBUFFER:
1014 return getFramebuffer(name);
1015 default:
1016 UNREACHABLE();
1017 return nullptr;
1018 }
1019}
1020
Geoff Lang75359662018-04-11 01:42:27 -04001021gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001022{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001023 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001024}
1025
Martin Radev9d901792016-07-15 15:58:58 +03001026void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1027{
Geoff Lang75359662018-04-11 01:42:27 -04001028 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001029 ASSERT(object != nullptr);
1030
1031 std::string labelName = GetObjectLabelFromPointer(length, label);
Jamie Madille90d4ee2018-11-28 14:04:00 -05001032 object->setLabel(this, labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001033
1034 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1035 // specified object is active until we do this.
1036 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001037}
1038
1039void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1040{
Geoff Lang75359662018-04-11 01:42:27 -04001041 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001042 ASSERT(object != nullptr);
1043
1044 std::string labelName = GetObjectLabelFromPointer(length, label);
Jamie Madille90d4ee2018-11-28 14:04:00 -05001045 object->setLabel(this, labelName);
Martin Radev9d901792016-07-15 15:58:58 +03001046}
1047
1048void Context::getObjectLabel(GLenum identifier,
1049 GLuint name,
1050 GLsizei bufSize,
1051 GLsizei *length,
1052 GLchar *label) const
1053{
Geoff Lang75359662018-04-11 01:42:27 -04001054 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001055 ASSERT(object != nullptr);
1056
1057 const std::string &objectLabel = object->getLabel();
1058 GetObjectLabelBase(objectLabel, bufSize, length, label);
1059}
1060
1061void Context::getObjectPtrLabel(const void *ptr,
1062 GLsizei bufSize,
1063 GLsizei *length,
1064 GLchar *label) const
1065{
Geoff Lang75359662018-04-11 01:42:27 -04001066 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001067 ASSERT(object != nullptr);
1068
1069 const std::string &objectLabel = object->getLabel();
1070 GetObjectLabelBase(objectLabel, bufSize, length, label);
1071}
1072
Jamie Madilldc356042013-07-19 16:36:57 -04001073bool Context::isSampler(GLuint samplerName) const
1074{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001075 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001076}
1077
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001078void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001079{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001080 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001081
Jamie Madilldedd7b92014-11-05 16:30:36 -05001082 if (handle == 0)
1083 {
1084 texture = mZeroTextures[target].get();
1085 }
1086 else
1087 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001088 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001089 }
1090
1091 ASSERT(texture);
Jamie Madille3e680c2018-12-03 17:49:08 -05001092 mGLState.setSamplerTexture(this, target, texture);
Jamie Madilld84b6732018-09-06 15:54:35 -04001093 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001094}
1095
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001096void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001097{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001098 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1099 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001100 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001101 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001102}
1103
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001104void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001105{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001106 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1107 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001108 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001109 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001110 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001111}
1112
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001113void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001114{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001115 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001116 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001117 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001118 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001119}
1120
Shao80957d92017-02-20 21:25:59 +08001121void Context::bindVertexBuffer(GLuint bindingIndex,
1122 GLuint bufferHandle,
1123 GLintptr offset,
1124 GLsizei stride)
1125{
1126 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001127 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001128 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001129}
1130
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001131void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001132{
Geoff Lang76b10c92014-09-05 16:28:14 -04001133 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001134 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001135 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001136 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001137 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001138}
1139
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001140void Context::bindImageTexture(GLuint unit,
1141 GLuint texture,
1142 GLint level,
1143 GLboolean layered,
1144 GLint layer,
1145 GLenum access,
1146 GLenum format)
1147{
1148 Texture *tex = mState.mTextures->getTexture(texture);
1149 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1150}
1151
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001152void Context::useProgram(GLuint program)
1153{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001154 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001155 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001156}
1157
Jiajia Qin5451d532017-11-16 17:16:34 +08001158void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1159{
1160 UNIMPLEMENTED();
1161}
1162
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001163void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001164{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001165 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001166 TransformFeedback *transformFeedback =
1167 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001168 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001169}
1170
Yunchao Hea336b902017-08-02 16:05:21 +08001171void Context::bindProgramPipeline(GLuint pipelineHandle)
1172{
1173 ProgramPipeline *pipeline =
1174 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1175 mGLState.setProgramPipelineBinding(this, pipeline);
1176}
1177
Corentin Wallezad3ae902018-03-09 13:40:42 -05001178void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001179{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001181 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001182
Geoff Lang5aad9672014-09-08 11:10:42 -04001183 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001184 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001185
1186 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001187 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001188 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001189}
1190
Corentin Wallezad3ae902018-03-09 13:40:42 -05001191void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001192{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001193 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001194 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001195
Jamie Madill4f6592f2018-11-27 16:37:45 -05001196 // Intentionally don't call try here. We don't want an early return.
1197 (void)(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001198
Geoff Lang5aad9672014-09-08 11:10:42 -04001199 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001200 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001201 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001202}
1203
Corentin Wallezad3ae902018-03-09 13:40:42 -05001204void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001205{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001206 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001207
1208 Query *queryObject = getQuery(id, true, target);
1209 ASSERT(queryObject);
1210
Jamie Madill4f6592f2018-11-27 16:37:45 -05001211 ANGLE_CONTEXT_TRY(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001212}
1213
Corentin Wallezad3ae902018-03-09 13:40:42 -05001214void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001215{
1216 switch (pname)
1217 {
1218 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001219 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001220 break;
1221 case GL_QUERY_COUNTER_BITS_EXT:
1222 switch (target)
1223 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001224 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001225 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1226 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001227 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001228 params[0] = getExtensions().queryCounterBitsTimestamp;
1229 break;
1230 default:
1231 UNREACHABLE();
1232 params[0] = 0;
1233 break;
1234 }
1235 break;
1236 default:
1237 UNREACHABLE();
1238 return;
1239 }
1240}
1241
Corentin Wallezad3ae902018-03-09 13:40:42 -05001242void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001243 GLenum pname,
1244 GLsizei bufSize,
1245 GLsizei *length,
1246 GLint *params)
1247{
1248 getQueryiv(target, pname, params);
1249}
1250
Geoff Lang2186c382016-10-14 10:54:54 -04001251void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001252{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001253 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001254}
1255
Brandon Jones59770802018-04-02 13:18:42 -07001256void Context::getQueryObjectivRobust(GLuint id,
1257 GLenum pname,
1258 GLsizei bufSize,
1259 GLsizei *length,
1260 GLint *params)
1261{
1262 getQueryObjectiv(id, pname, params);
1263}
1264
Geoff Lang2186c382016-10-14 10:54:54 -04001265void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001266{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001267 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001268}
1269
Brandon Jones59770802018-04-02 13:18:42 -07001270void Context::getQueryObjectuivRobust(GLuint id,
1271 GLenum pname,
1272 GLsizei bufSize,
1273 GLsizei *length,
1274 GLuint *params)
1275{
1276 getQueryObjectuiv(id, pname, params);
1277}
1278
Geoff Lang2186c382016-10-14 10:54:54 -04001279void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001280{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001281 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001282}
1283
Brandon Jones59770802018-04-02 13:18:42 -07001284void Context::getQueryObjecti64vRobust(GLuint id,
1285 GLenum pname,
1286 GLsizei bufSize,
1287 GLsizei *length,
1288 GLint64 *params)
1289{
1290 getQueryObjecti64v(id, pname, params);
1291}
1292
Geoff Lang2186c382016-10-14 10:54:54 -04001293void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001294{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001295 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001296}
1297
Brandon Jones59770802018-04-02 13:18:42 -07001298void Context::getQueryObjectui64vRobust(GLuint id,
1299 GLenum pname,
1300 GLsizei bufSize,
1301 GLsizei *length,
1302 GLuint64 *params)
1303{
1304 getQueryObjectui64v(id, pname, params);
1305}
1306
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001307Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001308{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001309 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001310}
1311
Jamie Madill2f348d22017-06-05 10:50:59 -04001312FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001313{
Jamie Madill96a483b2017-06-27 16:49:21 -04001314 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001315}
1316
Corentin Wallezad3ae902018-03-09 13:40:42 -05001317Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001318{
Jamie Madill96a483b2017-06-27 16:49:21 -04001319 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001320 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001321 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001322 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001323
1324 Query *query = mQueryMap.query(handle);
1325 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001326 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001327 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001328 query = new Query(mImplementation->createQuery(type), handle);
1329 query->addRef();
1330 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001332 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001333}
1334
Geoff Lang70d0f492015-12-10 17:45:46 -05001335Query *Context::getQuery(GLuint handle) const
1336{
Jamie Madill96a483b2017-06-27 16:49:21 -04001337 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001338}
1339
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001340Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001341{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001342 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1343 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001344}
1345
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001346Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001348 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349}
1350
Geoff Lang492a7e42014-11-05 13:27:06 -05001351Compiler *Context::getCompiler() const
1352{
Jamie Madill2f348d22017-06-05 10:50:59 -04001353 if (mCompiler.get() == nullptr)
1354 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001355 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001356 }
1357 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001358}
1359
Jamie Madillc1d770e2017-04-13 17:31:24 -04001360void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001361{
1362 switch (pname)
1363 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001364 case GL_SHADER_COMPILER:
1365 *params = GL_TRUE;
1366 break;
1367 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1368 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1369 break;
1370 default:
1371 mGLState.getBooleanv(pname, params);
1372 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001373 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001374}
1375
Jamie Madillc1d770e2017-04-13 17:31:24 -04001376void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377{
Shannon Woods53a94a82014-06-24 15:20:36 -04001378 // Queries about context capabilities and maximums are answered by Context.
1379 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001380 switch (pname)
1381 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001382 case GL_ALIASED_LINE_WIDTH_RANGE:
1383 params[0] = mCaps.minAliasedLineWidth;
1384 params[1] = mCaps.maxAliasedLineWidth;
1385 break;
1386 case GL_ALIASED_POINT_SIZE_RANGE:
1387 params[0] = mCaps.minAliasedPointSize;
1388 params[1] = mCaps.maxAliasedPointSize;
1389 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001390 case GL_SMOOTH_POINT_SIZE_RANGE:
1391 params[0] = mCaps.minSmoothPointSize;
1392 params[1] = mCaps.maxSmoothPointSize;
1393 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001394 case GL_SMOOTH_LINE_WIDTH_RANGE:
1395 params[0] = mCaps.minSmoothLineWidth;
1396 params[1] = mCaps.maxSmoothLineWidth;
1397 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001398 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1399 ASSERT(mExtensions.textureFilterAnisotropic);
1400 *params = mExtensions.maxTextureAnisotropy;
1401 break;
1402 case GL_MAX_TEXTURE_LOD_BIAS:
1403 *params = mCaps.maxLODBias;
1404 break;
1405
1406 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1407 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1408 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001409 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1410 // GLES1 constants for modelview/projection matrix.
1411 if (getClientVersion() < Version(2, 0))
1412 {
1413 mGLState.getFloatv(pname, params);
1414 }
1415 else
1416 {
1417 ASSERT(mExtensions.pathRendering);
1418 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1419 memcpy(params, m, 16 * sizeof(GLfloat));
1420 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001421 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001422 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001423
Jamie Madill231c7f52017-04-26 13:45:37 -04001424 default:
1425 mGLState.getFloatv(pname, params);
1426 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001427 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001428}
1429
Jamie Madillc1d770e2017-04-13 17:31:24 -04001430void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001431{
Shannon Woods53a94a82014-06-24 15:20:36 -04001432 // Queries about context capabilities and maximums are answered by Context.
1433 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001434
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001435 switch (pname)
1436 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001437 case GL_MAX_VERTEX_ATTRIBS:
1438 *params = mCaps.maxVertexAttributes;
1439 break;
1440 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1441 *params = mCaps.maxVertexUniformVectors;
1442 break;
1443 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001444 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001445 break;
1446 case GL_MAX_VARYING_VECTORS:
1447 *params = mCaps.maxVaryingVectors;
1448 break;
1449 case GL_MAX_VARYING_COMPONENTS:
1450 *params = mCaps.maxVertexOutputComponents;
1451 break;
1452 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1453 *params = mCaps.maxCombinedTextureImageUnits;
1454 break;
1455 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001456 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001457 break;
1458 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001459 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001460 break;
1461 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1462 *params = mCaps.maxFragmentUniformVectors;
1463 break;
1464 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001465 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001466 break;
1467 case GL_MAX_RENDERBUFFER_SIZE:
1468 *params = mCaps.maxRenderbufferSize;
1469 break;
1470 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1471 *params = mCaps.maxColorAttachments;
1472 break;
1473 case GL_MAX_DRAW_BUFFERS_EXT:
1474 *params = mCaps.maxDrawBuffers;
1475 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001476 case GL_SUBPIXEL_BITS:
1477 *params = 4;
1478 break;
1479 case GL_MAX_TEXTURE_SIZE:
1480 *params = mCaps.max2DTextureSize;
1481 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001482 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1483 *params = mCaps.maxRectangleTextureSize;
1484 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001485 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1486 *params = mCaps.maxCubeMapTextureSize;
1487 break;
1488 case GL_MAX_3D_TEXTURE_SIZE:
1489 *params = mCaps.max3DTextureSize;
1490 break;
1491 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1492 *params = mCaps.maxArrayTextureLayers;
1493 break;
1494 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1495 *params = mCaps.uniformBufferOffsetAlignment;
1496 break;
1497 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1498 *params = mCaps.maxUniformBufferBindings;
1499 break;
1500 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001501 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001502 break;
1503 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001504 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001505 break;
1506 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1507 *params = mCaps.maxCombinedTextureImageUnits;
1508 break;
1509 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1510 *params = mCaps.maxVertexOutputComponents;
1511 break;
1512 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1513 *params = mCaps.maxFragmentInputComponents;
1514 break;
1515 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1516 *params = mCaps.minProgramTexelOffset;
1517 break;
1518 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1519 *params = mCaps.maxProgramTexelOffset;
1520 break;
1521 case GL_MAJOR_VERSION:
1522 *params = getClientVersion().major;
1523 break;
1524 case GL_MINOR_VERSION:
1525 *params = getClientVersion().minor;
1526 break;
1527 case GL_MAX_ELEMENTS_INDICES:
1528 *params = mCaps.maxElementsIndices;
1529 break;
1530 case GL_MAX_ELEMENTS_VERTICES:
1531 *params = mCaps.maxElementsVertices;
1532 break;
1533 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1534 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1535 break;
1536 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1537 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1538 break;
1539 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1540 *params = mCaps.maxTransformFeedbackSeparateComponents;
1541 break;
1542 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1543 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1544 break;
1545 case GL_MAX_SAMPLES_ANGLE:
1546 *params = mCaps.maxSamples;
1547 break;
1548 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001549 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001550 params[0] = mCaps.maxViewportWidth;
1551 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001552 }
1553 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001554 case GL_COMPRESSED_TEXTURE_FORMATS:
1555 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1556 params);
1557 break;
1558 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1559 *params = mResetStrategy;
1560 break;
1561 case GL_NUM_SHADER_BINARY_FORMATS:
1562 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1563 break;
1564 case GL_SHADER_BINARY_FORMATS:
1565 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1566 break;
1567 case GL_NUM_PROGRAM_BINARY_FORMATS:
1568 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1569 break;
1570 case GL_PROGRAM_BINARY_FORMATS:
1571 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1572 break;
1573 case GL_NUM_EXTENSIONS:
1574 *params = static_cast<GLint>(mExtensionStrings.size());
1575 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001576
Geoff Lang38f24ee2018-10-01 13:04:59 -04001577 // GL_ANGLE_request_extension
1578 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1579 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1580 break;
1581
Jamie Madill231c7f52017-04-26 13:45:37 -04001582 // GL_KHR_debug
1583 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1584 *params = mExtensions.maxDebugMessageLength;
1585 break;
1586 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1587 *params = mExtensions.maxDebugLoggedMessages;
1588 break;
1589 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1590 *params = mExtensions.maxDebugGroupStackDepth;
1591 break;
1592 case GL_MAX_LABEL_LENGTH:
1593 *params = mExtensions.maxLabelLength;
1594 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001595
Martin Radeve5285d22017-07-14 16:23:53 +03001596 // GL_ANGLE_multiview
1597 case GL_MAX_VIEWS_ANGLE:
1598 *params = mExtensions.maxViews;
1599 break;
1600
Jamie Madill231c7f52017-04-26 13:45:37 -04001601 // GL_EXT_disjoint_timer_query
1602 case GL_GPU_DISJOINT_EXT:
1603 *params = mImplementation->getGPUDisjoint();
1604 break;
1605 case GL_MAX_FRAMEBUFFER_WIDTH:
1606 *params = mCaps.maxFramebufferWidth;
1607 break;
1608 case GL_MAX_FRAMEBUFFER_HEIGHT:
1609 *params = mCaps.maxFramebufferHeight;
1610 break;
1611 case GL_MAX_FRAMEBUFFER_SAMPLES:
1612 *params = mCaps.maxFramebufferSamples;
1613 break;
1614 case GL_MAX_SAMPLE_MASK_WORDS:
1615 *params = mCaps.maxSampleMaskWords;
1616 break;
1617 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1618 *params = mCaps.maxColorTextureSamples;
1619 break;
1620 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1621 *params = mCaps.maxDepthTextureSamples;
1622 break;
1623 case GL_MAX_INTEGER_SAMPLES:
1624 *params = mCaps.maxIntegerSamples;
1625 break;
1626 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1627 *params = mCaps.maxVertexAttribRelativeOffset;
1628 break;
1629 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1630 *params = mCaps.maxVertexAttribBindings;
1631 break;
1632 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1633 *params = mCaps.maxVertexAttribStride;
1634 break;
1635 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001636 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001637 break;
1638 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001639 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001640 break;
1641 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001642 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001643 break;
1644 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001645 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001646 break;
1647 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001648 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001649 break;
1650 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001651 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001652 break;
1653 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001654 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001655 break;
1656 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001657 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001658 break;
1659 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1660 *params = mCaps.minProgramTextureGatherOffset;
1661 break;
1662 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1663 *params = mCaps.maxProgramTextureGatherOffset;
1664 break;
1665 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1666 *params = mCaps.maxComputeWorkGroupInvocations;
1667 break;
1668 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001669 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
1671 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001672 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001673 break;
1674 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1675 *params = mCaps.maxComputeSharedMemorySize;
1676 break;
1677 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001678 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001679 break;
1680 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001681 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001682 break;
1683 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001684 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001685 break;
1686 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001687 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001688 break;
1689 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001690 *params =
1691 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001692 break;
1693 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001694 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001695 break;
1696 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1697 *params = mCaps.maxCombinedShaderOutputResources;
1698 break;
1699 case GL_MAX_UNIFORM_LOCATIONS:
1700 *params = mCaps.maxUniformLocations;
1701 break;
1702 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1703 *params = mCaps.maxAtomicCounterBufferBindings;
1704 break;
1705 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1706 *params = mCaps.maxAtomicCounterBufferSize;
1707 break;
1708 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1709 *params = mCaps.maxCombinedAtomicCounterBuffers;
1710 break;
1711 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1712 *params = mCaps.maxCombinedAtomicCounters;
1713 break;
1714 case GL_MAX_IMAGE_UNITS:
1715 *params = mCaps.maxImageUnits;
1716 break;
1717 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1718 *params = mCaps.maxCombinedImageUniforms;
1719 break;
1720 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1721 *params = mCaps.maxShaderStorageBufferBindings;
1722 break;
1723 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1724 *params = mCaps.maxCombinedShaderStorageBlocks;
1725 break;
1726 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1727 *params = mCaps.shaderStorageBufferOffsetAlignment;
1728 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001729
1730 // GL_EXT_geometry_shader
1731 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1732 *params = mCaps.maxFramebufferLayers;
1733 break;
1734 case GL_LAYER_PROVOKING_VERTEX_EXT:
1735 *params = mCaps.layerProvokingVertex;
1736 break;
1737 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001738 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001739 break;
1740 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001741 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001742 break;
1743 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001744 *params =
1745 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001746 break;
1747 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1748 *params = mCaps.maxGeometryInputComponents;
1749 break;
1750 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1751 *params = mCaps.maxGeometryOutputComponents;
1752 break;
1753 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1754 *params = mCaps.maxGeometryOutputVertices;
1755 break;
1756 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1757 *params = mCaps.maxGeometryTotalOutputComponents;
1758 break;
1759 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1760 *params = mCaps.maxGeometryShaderInvocations;
1761 break;
1762 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001763 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001764 break;
1765 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001766 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001767 break;
1768 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001769 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001770 break;
1771 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001772 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001773 break;
1774 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001775 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001776 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001777 // GLES1 emulation: Caps queries
1778 case GL_MAX_TEXTURE_UNITS:
1779 *params = mCaps.maxMultitextureUnits;
1780 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001781 case GL_MAX_MODELVIEW_STACK_DEPTH:
1782 *params = mCaps.maxModelviewMatrixStackDepth;
1783 break;
1784 case GL_MAX_PROJECTION_STACK_DEPTH:
1785 *params = mCaps.maxProjectionMatrixStackDepth;
1786 break;
1787 case GL_MAX_TEXTURE_STACK_DEPTH:
1788 *params = mCaps.maxTextureMatrixStackDepth;
1789 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001790 case GL_MAX_LIGHTS:
1791 *params = mCaps.maxLights;
1792 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001793 case GL_MAX_CLIP_PLANES:
1794 *params = mCaps.maxClipPlanes;
1795 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001796 // GLES1 emulation: Vertex attribute queries
1797 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1798 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1799 case GL_COLOR_ARRAY_BUFFER_BINDING:
1800 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1801 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1802 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1803 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1804 break;
1805 case GL_VERTEX_ARRAY_STRIDE:
1806 case GL_NORMAL_ARRAY_STRIDE:
1807 case GL_COLOR_ARRAY_STRIDE:
1808 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1809 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1810 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1811 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1812 break;
1813 case GL_VERTEX_ARRAY_SIZE:
1814 case GL_COLOR_ARRAY_SIZE:
1815 case GL_TEXTURE_COORD_ARRAY_SIZE:
1816 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1817 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1818 break;
1819 case GL_VERTEX_ARRAY_TYPE:
1820 case GL_COLOR_ARRAY_TYPE:
1821 case GL_NORMAL_ARRAY_TYPE:
1822 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1823 case GL_TEXTURE_COORD_ARRAY_TYPE:
1824 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1825 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1826 break;
1827
jchen1082af6202018-06-22 10:59:52 +08001828 // GL_KHR_parallel_shader_compile
1829 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1830 *params = mGLState.getMaxShaderCompilerThreads();
1831 break;
1832
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001833 // GL_EXT_blend_func_extended
1834 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1835 *params = mExtensions.maxDualSourceDrawBuffers;
1836 break;
1837
Jamie Madill231c7f52017-04-26 13:45:37 -04001838 default:
Jamie Madill4f6592f2018-11-27 16:37:45 -05001839 ANGLE_CONTEXT_TRY(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001840 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001841 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001842}
1843
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001844void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001845{
Shannon Woods53a94a82014-06-24 15:20:36 -04001846 // Queries about context capabilities and maximums are answered by Context.
1847 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001848 switch (pname)
1849 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001850 case GL_MAX_ELEMENT_INDEX:
1851 *params = mCaps.maxElementIndex;
1852 break;
1853 case GL_MAX_UNIFORM_BLOCK_SIZE:
1854 *params = mCaps.maxUniformBlockSize;
1855 break;
1856 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001857 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001858 break;
1859 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001860 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001861 break;
1862 case GL_MAX_SERVER_WAIT_TIMEOUT:
1863 *params = mCaps.maxServerWaitTimeout;
1864 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001865
Jamie Madill231c7f52017-04-26 13:45:37 -04001866 // GL_EXT_disjoint_timer_query
1867 case GL_TIMESTAMP_EXT:
1868 *params = mImplementation->getTimestamp();
1869 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001870
Jamie Madill231c7f52017-04-26 13:45:37 -04001871 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1872 *params = mCaps.maxShaderStorageBlockSize;
1873 break;
1874 default:
1875 UNREACHABLE();
1876 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001877 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001878}
1879
Geoff Lang70d0f492015-12-10 17:45:46 -05001880void Context::getPointerv(GLenum pname, void **params) const
1881{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001882 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001883}
1884
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001885void Context::getPointervRobustANGLERobust(GLenum pname,
1886 GLsizei bufSize,
1887 GLsizei *length,
1888 void **params)
1889{
1890 UNIMPLEMENTED();
1891}
1892
Martin Radev66fb8202016-07-28 11:45:20 +03001893void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001894{
Shannon Woods53a94a82014-06-24 15:20:36 -04001895 // Queries about context capabilities and maximums are answered by Context.
1896 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001897
1898 GLenum nativeType;
1899 unsigned int numParams;
1900 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1901 ASSERT(queryStatus);
1902
1903 if (nativeType == GL_INT)
1904 {
1905 switch (target)
1906 {
1907 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1908 ASSERT(index < 3u);
1909 *data = mCaps.maxComputeWorkGroupCount[index];
1910 break;
1911 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1912 ASSERT(index < 3u);
1913 *data = mCaps.maxComputeWorkGroupSize[index];
1914 break;
1915 default:
1916 mGLState.getIntegeri_v(target, index, data);
1917 }
1918 }
1919 else
1920 {
1921 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1922 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001923}
1924
Brandon Jones59770802018-04-02 13:18:42 -07001925void Context::getIntegeri_vRobust(GLenum target,
1926 GLuint index,
1927 GLsizei bufSize,
1928 GLsizei *length,
1929 GLint *data)
1930{
1931 getIntegeri_v(target, index, data);
1932}
1933
Martin Radev66fb8202016-07-28 11:45:20 +03001934void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001935{
Shannon Woods53a94a82014-06-24 15:20:36 -04001936 // Queries about context capabilities and maximums are answered by Context.
1937 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001938
1939 GLenum nativeType;
1940 unsigned int numParams;
1941 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1942 ASSERT(queryStatus);
1943
1944 if (nativeType == GL_INT_64_ANGLEX)
1945 {
1946 mGLState.getInteger64i_v(target, index, data);
1947 }
1948 else
1949 {
1950 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1951 }
1952}
1953
Brandon Jones59770802018-04-02 13:18:42 -07001954void Context::getInteger64i_vRobust(GLenum target,
1955 GLuint index,
1956 GLsizei bufSize,
1957 GLsizei *length,
1958 GLint64 *data)
1959{
1960 getInteger64i_v(target, index, data);
1961}
1962
Martin Radev66fb8202016-07-28 11:45:20 +03001963void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1964{
1965 // Queries about context capabilities and maximums are answered by Context.
1966 // Queries about current GL state values are answered by State.
1967
1968 GLenum nativeType;
1969 unsigned int numParams;
1970 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1971 ASSERT(queryStatus);
1972
1973 if (nativeType == GL_BOOL)
1974 {
1975 mGLState.getBooleani_v(target, index, data);
1976 }
1977 else
1978 {
1979 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1980 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001981}
1982
Brandon Jones59770802018-04-02 13:18:42 -07001983void Context::getBooleani_vRobust(GLenum target,
1984 GLuint index,
1985 GLsizei bufSize,
1986 GLsizei *length,
1987 GLboolean *data)
1988{
1989 getBooleani_v(target, index, data);
1990}
1991
Corentin Wallez336129f2017-10-17 15:55:40 -04001992void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001993{
1994 Buffer *buffer = mGLState.getTargetBuffer(target);
1995 QueryBufferParameteriv(buffer, pname, params);
1996}
1997
Brandon Jones59770802018-04-02 13:18:42 -07001998void Context::getBufferParameterivRobust(BufferBinding target,
1999 GLenum pname,
2000 GLsizei bufSize,
2001 GLsizei *length,
2002 GLint *params)
2003{
2004 getBufferParameteriv(target, pname, params);
2005}
2006
He Yunchao010e4db2017-03-03 14:22:06 +08002007void Context::getFramebufferAttachmentParameteriv(GLenum target,
2008 GLenum attachment,
2009 GLenum pname,
2010 GLint *params)
2011{
2012 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002013 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002014}
2015
Brandon Jones59770802018-04-02 13:18:42 -07002016void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2017 GLenum attachment,
2018 GLenum pname,
2019 GLsizei bufSize,
2020 GLsizei *length,
2021 GLint *params)
2022{
2023 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2024}
2025
He Yunchao010e4db2017-03-03 14:22:06 +08002026void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2027{
2028 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2029 QueryRenderbufferiv(this, renderbuffer, pname, params);
2030}
2031
Brandon Jones59770802018-04-02 13:18:42 -07002032void Context::getRenderbufferParameterivRobust(GLenum target,
2033 GLenum pname,
2034 GLsizei bufSize,
2035 GLsizei *length,
2036 GLint *params)
2037{
2038 getRenderbufferParameteriv(target, pname, params);
2039}
2040
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002041void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002042{
Till Rathmannb8543632018-10-02 19:46:14 +02002043 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002044 QueryTexParameterfv(texture, pname, params);
2045}
2046
Brandon Jones59770802018-04-02 13:18:42 -07002047void Context::getTexParameterfvRobust(TextureType target,
2048 GLenum pname,
2049 GLsizei bufSize,
2050 GLsizei *length,
2051 GLfloat *params)
2052{
2053 getTexParameterfv(target, pname, params);
2054}
2055
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002056void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002057{
Till Rathmannb8543632018-10-02 19:46:14 +02002058 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002059 QueryTexParameteriv(texture, pname, params);
2060}
Jiajia Qin5451d532017-11-16 17:16:34 +08002061
Till Rathmannb8543632018-10-02 19:46:14 +02002062void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2063{
2064 const Texture *const texture = getTargetTexture(target);
2065 QueryTexParameterIiv(texture, pname, params);
2066}
2067
2068void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2069{
2070 const Texture *const texture = getTargetTexture(target);
2071 QueryTexParameterIuiv(texture, pname, params);
2072}
2073
Brandon Jones59770802018-04-02 13:18:42 -07002074void Context::getTexParameterivRobust(TextureType target,
2075 GLenum pname,
2076 GLsizei bufSize,
2077 GLsizei *length,
2078 GLint *params)
2079{
2080 getTexParameteriv(target, pname, params);
2081}
2082
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002083void Context::getTexParameterIivRobust(TextureType target,
2084 GLenum pname,
2085 GLsizei bufSize,
2086 GLsizei *length,
2087 GLint *params)
2088{
2089 UNIMPLEMENTED();
2090}
2091
2092void Context::getTexParameterIuivRobust(TextureType target,
2093 GLenum pname,
2094 GLsizei bufSize,
2095 GLsizei *length,
2096 GLuint *params)
2097{
2098 UNIMPLEMENTED();
2099}
2100
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002101void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002102{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002103 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002104 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002105}
2106
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002107void Context::getTexLevelParameterivRobust(TextureTarget target,
2108 GLint level,
2109 GLenum pname,
2110 GLsizei bufSize,
2111 GLsizei *length,
2112 GLint *params)
2113{
2114 UNIMPLEMENTED();
2115}
2116
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002117void Context::getTexLevelParameterfv(TextureTarget target,
2118 GLint level,
2119 GLenum pname,
2120 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002121{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002122 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002123 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002124}
2125
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002126void Context::getTexLevelParameterfvRobust(TextureTarget target,
2127 GLint level,
2128 GLenum pname,
2129 GLsizei bufSize,
2130 GLsizei *length,
2131 GLfloat *params)
2132{
2133 UNIMPLEMENTED();
2134}
2135
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002136void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002137{
Till Rathmannb8543632018-10-02 19:46:14 +02002138 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002139 SetTexParameterf(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08002140}
2141
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002142void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002143{
Till Rathmannb8543632018-10-02 19:46:14 +02002144 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002145 SetTexParameterfv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002146}
2147
Brandon Jones59770802018-04-02 13:18:42 -07002148void Context::texParameterfvRobust(TextureType target,
2149 GLenum pname,
2150 GLsizei bufSize,
2151 const GLfloat *params)
2152{
2153 texParameterfv(target, pname, params);
2154}
2155
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002156void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002157{
Till Rathmannb8543632018-10-02 19:46:14 +02002158 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002159 SetTexParameteri(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08002160}
2161
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002162void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002163{
Till Rathmannb8543632018-10-02 19:46:14 +02002164 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002165 SetTexParameteriv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002166}
2167
Till Rathmannb8543632018-10-02 19:46:14 +02002168void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2169{
2170 Texture *const texture = getTargetTexture(target);
2171 SetTexParameterIiv(this, texture, pname, params);
Till Rathmannb8543632018-10-02 19:46:14 +02002172}
2173
2174void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2175{
2176 Texture *const texture = getTargetTexture(target);
2177 SetTexParameterIuiv(this, texture, pname, params);
Till Rathmannb8543632018-10-02 19:46:14 +02002178}
2179
Brandon Jones59770802018-04-02 13:18:42 -07002180void Context::texParameterivRobust(TextureType target,
2181 GLenum pname,
2182 GLsizei bufSize,
2183 const GLint *params)
2184{
2185 texParameteriv(target, pname, params);
2186}
2187
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002188void Context::texParameterIivRobust(TextureType target,
2189 GLenum pname,
2190 GLsizei bufSize,
2191 const GLint *params)
2192{
2193 UNIMPLEMENTED();
2194}
2195
2196void Context::texParameterIuivRobust(TextureType target,
2197 GLenum pname,
2198 GLsizei bufSize,
2199 const GLuint *params)
2200{
2201 UNIMPLEMENTED();
2202}
2203
Jamie Madill493f9572018-05-24 19:52:15 -04002204void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002205{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002206 // No-op if count draws no primitives for given mode
2207 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002208 {
2209 return;
2210 }
2211
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002212 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002213 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05002214 MarkTransformFeedbackBufferUsage(this, count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002215}
2216
Jamie Madill493f9572018-05-24 19:52:15 -04002217void Context::drawArraysInstanced(PrimitiveMode mode,
2218 GLint first,
2219 GLsizei count,
2220 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002221{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002222 // No-op if count draws no primitives for given mode
2223 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002224 {
2225 return;
2226 }
2227
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002228 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002229 ANGLE_CONTEXT_TRY(
2230 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05002231 MarkTransformFeedbackBufferUsage(this, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002232}
2233
Jamie Madill493f9572018-05-24 19:52:15 -04002234void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002235 GLsizei count,
Jamie Madill8dc27f92018-11-29 11:45:44 -05002236 DrawElementsType type,
Jamie Madill876429b2017-04-20 15:46:24 -04002237 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002238 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002239{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002240 // No-op if count draws no primitives for given mode
2241 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002242 {
2243 return;
2244 }
2245
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002246 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002247 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002248 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002249}
2250
Jamie Madill493f9572018-05-24 19:52:15 -04002251void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002252 GLuint start,
2253 GLuint end,
2254 GLsizei count,
Jamie Madill8dc27f92018-11-29 11:45:44 -05002255 DrawElementsType type,
Jamie Madill876429b2017-04-20 15:46:24 -04002256 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002257{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002258 // No-op if count draws no primitives for given mode
2259 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002260 {
2261 return;
2262 }
2263
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002264 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002265 ANGLE_CONTEXT_TRY(
2266 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002267}
2268
Jamie Madill493f9572018-05-24 19:52:15 -04002269void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002270{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002271 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002272 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002273}
2274
Jamie Madill8dc27f92018-11-29 11:45:44 -05002275void Context::drawElementsIndirect(PrimitiveMode mode, DrawElementsType type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002276{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002277 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002278 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002279}
2280
Jamie Madill675fe712016-12-19 13:07:54 -05002281void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002282{
Jamie Madill4f6592f2018-11-27 16:37:45 -05002283 ANGLE_CONTEXT_TRY(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002284}
2285
Jamie Madill675fe712016-12-19 13:07:54 -05002286void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002287{
Jamie Madill4f6592f2018-11-27 16:37:45 -05002288 ANGLE_CONTEXT_TRY(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002289}
2290
Austin Kinross6ee1e782015-05-29 17:05:37 -07002291void Context::insertEventMarker(GLsizei length, const char *marker)
2292{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002293 ASSERT(mImplementation);
2294 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002295}
2296
2297void Context::pushGroupMarker(GLsizei length, const char *marker)
2298{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002299 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002300
2301 if (marker == nullptr)
2302 {
2303 // From the EXT_debug_marker spec,
2304 // "If <marker> is null then an empty string is pushed on the stack."
2305 mImplementation->pushGroupMarker(length, "");
2306 }
2307 else
2308 {
2309 mImplementation->pushGroupMarker(length, marker);
2310 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002311}
2312
2313void Context::popGroupMarker()
2314{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002315 ASSERT(mImplementation);
2316 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002317}
2318
Geoff Langd8605522016-04-13 10:19:12 -04002319void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2320{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002321 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002322 ASSERT(programObject);
2323
2324 programObject->bindUniformLocation(location, name);
2325}
2326
Brandon Jones59770802018-04-02 13:18:42 -07002327void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002328{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002329 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002330}
2331
Brandon Jones59770802018-04-02 13:18:42 -07002332void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002333{
2334 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2335}
2336
Brandon Jones59770802018-04-02 13:18:42 -07002337void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002338{
2339 GLfloat I[16];
2340 angle::Matrix<GLfloat>::setToIdentity(I);
2341
2342 mGLState.loadPathRenderingMatrix(matrixMode, I);
2343}
2344
2345void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2346{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002347 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002348 if (!pathObj)
2349 return;
2350
Geoff Lang9bf86f02018-07-26 11:46:34 -04002351 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002352
2353 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2354}
2355
2356void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2357{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002358 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002359 if (!pathObj)
2360 return;
2361
Geoff Lang9bf86f02018-07-26 11:46:34 -04002362 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002363
2364 mImplementation->stencilStrokePath(pathObj, reference, mask);
2365}
2366
2367void Context::coverFillPath(GLuint path, GLenum coverMode)
2368{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002369 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002370 if (!pathObj)
2371 return;
2372
Geoff Lang9bf86f02018-07-26 11:46:34 -04002373 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002374
2375 mImplementation->coverFillPath(pathObj, coverMode);
2376}
2377
2378void Context::coverStrokePath(GLuint path, GLenum coverMode)
2379{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002380 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002381 if (!pathObj)
2382 return;
2383
Geoff Lang9bf86f02018-07-26 11:46:34 -04002384 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002385
2386 mImplementation->coverStrokePath(pathObj, coverMode);
2387}
2388
2389void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2390{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002392 if (!pathObj)
2393 return;
2394
Geoff Lang9bf86f02018-07-26 11:46:34 -04002395 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002396
2397 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2398}
2399
2400void Context::stencilThenCoverStrokePath(GLuint path,
2401 GLint reference,
2402 GLuint mask,
2403 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->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2412}
2413
Sami Väisänend59ca052016-06-21 16:10:00 +03002414void Context::coverFillPathInstanced(GLsizei numPaths,
2415 GLenum pathNameType,
2416 const void *paths,
2417 GLuint pathBase,
2418 GLenum coverMode,
2419 GLenum transformType,
2420 const GLfloat *transformValues)
2421{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002422 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002423
Geoff Lang9bf86f02018-07-26 11:46:34 -04002424 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002425
2426 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2427}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002428
Sami Väisänend59ca052016-06-21 16:10:00 +03002429void Context::coverStrokePathInstanced(GLsizei numPaths,
2430 GLenum pathNameType,
2431 const void *paths,
2432 GLuint pathBase,
2433 GLenum coverMode,
2434 GLenum transformType,
2435 const GLfloat *transformValues)
2436{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002437 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002438
2439 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002440 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002441
2442 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2443 transformValues);
2444}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002445
Sami Väisänend59ca052016-06-21 16:10:00 +03002446void Context::stencilFillPathInstanced(GLsizei numPaths,
2447 GLenum pathNameType,
2448 const void *paths,
2449 GLuint pathBase,
2450 GLenum fillMode,
2451 GLuint mask,
2452 GLenum transformType,
2453 const GLfloat *transformValues)
2454{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002455 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002456
2457 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002458 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002459
2460 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2461 transformValues);
2462}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002463
Sami Väisänend59ca052016-06-21 16:10:00 +03002464void Context::stencilStrokePathInstanced(GLsizei numPaths,
2465 GLenum pathNameType,
2466 const void *paths,
2467 GLuint pathBase,
2468 GLint reference,
2469 GLuint mask,
2470 GLenum transformType,
2471 const GLfloat *transformValues)
2472{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002473 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002474
Geoff Lang9bf86f02018-07-26 11:46:34 -04002475 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002476
2477 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2478 transformValues);
2479}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002480
Sami Väisänend59ca052016-06-21 16:10:00 +03002481void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2482 GLenum pathNameType,
2483 const void *paths,
2484 GLuint pathBase,
2485 GLenum fillMode,
2486 GLuint mask,
2487 GLenum coverMode,
2488 GLenum transformType,
2489 const GLfloat *transformValues)
2490{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002491 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002492
Geoff Lang9bf86f02018-07-26 11:46:34 -04002493 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002494
2495 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2496 transformType, transformValues);
2497}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002498
Sami Väisänend59ca052016-06-21 16:10:00 +03002499void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2500 GLenum pathNameType,
2501 const void *paths,
2502 GLuint pathBase,
2503 GLint reference,
2504 GLuint mask,
2505 GLenum coverMode,
2506 GLenum transformType,
2507 const GLfloat *transformValues)
2508{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002509 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002510
Geoff Lang9bf86f02018-07-26 11:46:34 -04002511 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002512
2513 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2514 transformType, transformValues);
2515}
2516
Sami Väisänen46eaa942016-06-29 10:26:37 +03002517void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2518{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002519 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002520
2521 programObject->bindFragmentInputLocation(location, name);
2522}
2523
2524void Context::programPathFragmentInputGen(GLuint program,
2525 GLint location,
2526 GLenum genMode,
2527 GLint components,
2528 const GLfloat *coeffs)
2529{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002530 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002531
jchen103fd614d2018-08-13 12:21:58 +08002532 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002533}
2534
jchen1015015f72017-03-16 13:54:21 +08002535GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2536{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002537 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002538 return QueryProgramResourceIndex(programObject, programInterface, name);
2539}
2540
jchen10fd7c3b52017-03-21 15:36:03 +08002541void Context::getProgramResourceName(GLuint program,
2542 GLenum programInterface,
2543 GLuint index,
2544 GLsizei bufSize,
2545 GLsizei *length,
2546 GLchar *name)
2547{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002548 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002549 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2550}
2551
jchen10191381f2017-04-11 13:59:04 +08002552GLint Context::getProgramResourceLocation(GLuint program,
2553 GLenum programInterface,
2554 const GLchar *name)
2555{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002556 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002557 return QueryProgramResourceLocation(programObject, programInterface, name);
2558}
2559
jchen10880683b2017-04-12 16:21:55 +08002560void Context::getProgramResourceiv(GLuint program,
2561 GLenum programInterface,
2562 GLuint index,
2563 GLsizei propCount,
2564 const GLenum *props,
2565 GLsizei bufSize,
2566 GLsizei *length,
2567 GLint *params)
2568{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002569 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002570 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2571 length, params);
2572}
2573
jchen10d9cd7b72017-08-30 15:04:25 +08002574void Context::getProgramInterfaceiv(GLuint program,
2575 GLenum programInterface,
2576 GLenum pname,
2577 GLint *params)
2578{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002579 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002580 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2581}
2582
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002583void Context::getProgramInterfaceivRobust(GLuint program,
2584 GLenum programInterface,
2585 GLenum pname,
2586 GLsizei bufSize,
2587 GLsizei *length,
2588 GLint *params)
2589{
2590 UNIMPLEMENTED();
2591}
2592
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002593void Context::handleError(GLenum errorCode,
2594 const char *message,
2595 const char *file,
2596 const char *function,
2597 unsigned int line)
2598{
2599 mErrors.handleError(errorCode, message, file, function, line);
2600}
2601
Jamie Madilla139f012018-10-10 16:13:03 -04002602void Context::validationError(GLenum errorCode, const char *message)
2603{
2604 mErrors.validationError(errorCode, message);
2605}
2606
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002607// Get one of the recorded errors and clear its flag, if any.
2608// [OpenGL ES 2.0.24] section 2.5 page 13.
2609GLenum Context::getError()
2610{
Geoff Langda5777c2014-07-11 09:52:58 -04002611 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002612 {
Geoff Langda5777c2014-07-11 09:52:58 -04002613 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002614 }
Geoff Langda5777c2014-07-11 09:52:58 -04002615 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002616 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002617 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002618 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002619}
2620
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002621// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002622void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002623{
2624 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002625 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002626 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002627 mContextLostForced = true;
2628 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002629 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002630}
2631
Jamie Madillfa920eb2018-01-04 11:45:50 -05002632GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002633{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002634 // Even if the application doesn't want to know about resets, we want to know
2635 // as it will allow us to skip all the calls.
2636 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002637 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002638 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002639 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002640 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002641 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002642
2643 // EXT_robustness, section 2.6: If the reset notification behavior is
2644 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2645 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2646 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647 }
2648
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002649 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2650 // status should be returned at least once, and GL_NO_ERROR should be returned
2651 // once the device has finished resetting.
2652 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002653 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002654 ASSERT(mResetStatus == GL_NO_ERROR);
2655 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002656
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002657 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002658 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002659 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002660 }
2661 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002662 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002664 // If markContextLost was used to mark the context lost then
2665 // assume that is not recoverable, and continue to report the
2666 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002667 mResetStatus = mImplementation->getResetStatus();
2668 }
Jamie Madill893ab082014-05-16 16:56:10 -04002669
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002670 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002671}
2672
2673bool Context::isResetNotificationEnabled()
2674{
2675 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2676}
2677
Corentin Walleze3b10e82015-05-20 11:06:25 -04002678const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002679{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002680 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002681}
2682
2683EGLenum Context::getClientType() const
2684{
2685 return mClientType;
2686}
2687
2688EGLenum Context::getRenderBuffer() const
2689{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002690 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2691 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002692 {
2693 return EGL_NONE;
2694 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002695
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002696 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002697 ASSERT(backAttachment != nullptr);
2698 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002699}
2700
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002701VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002702{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002703 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002704 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2705 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002706 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002707 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2708 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002709
Jamie Madill96a483b2017-06-27 16:49:21 -04002710 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002711 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002712
2713 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002714}
2715
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002716TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002717{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002718 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002719 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2720 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002721 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002722 transformFeedback =
2723 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002724 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002725 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002726 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002727
2728 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002729}
2730
2731bool Context::isVertexArrayGenerated(GLuint vertexArray)
2732{
Jamie Madill96a483b2017-06-27 16:49:21 -04002733 ASSERT(mVertexArrayMap.contains(0));
2734 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002735}
2736
2737bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2738{
Jamie Madill96a483b2017-06-27 16:49:21 -04002739 ASSERT(mTransformFeedbackMap.contains(0));
2740 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002741}
2742
Shannon Woods53a94a82014-06-24 15:20:36 -04002743void Context::detachTexture(GLuint texture)
2744{
2745 // Simple pass-through to State's detachTexture method, as textures do not require
2746 // allocation map management either here or in the resource manager at detach time.
2747 // Zero textures are held by the Context, and we don't attempt to request them from
2748 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002749 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002750}
2751
James Darpinian4d9d4832018-03-13 12:43:28 -07002752void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002753{
Yuly Novikov5807a532015-12-03 13:01:22 -05002754 // Simple pass-through to State's detachBuffer method, since
2755 // only buffer attachments to container objects that are bound to the current context
2756 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002757
Yuly Novikov5807a532015-12-03 13:01:22 -05002758 // [OpenGL ES 3.2] section 5.1.2 page 45:
2759 // Attachments to unbound container objects, such as
2760 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2761 // are not affected and continue to act as references on the deleted object
Geoff Lang91002262018-12-12 16:05:24 -05002762 ANGLE_CONTEXT_TRY(mGLState.detachBuffer(this, buffer));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002763}
2764
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002765void Context::detachFramebuffer(GLuint framebuffer)
2766{
Shannon Woods53a94a82014-06-24 15:20:36 -04002767 // Framebuffer detachment is handled by Context, because 0 is a valid
2768 // Framebuffer object, and a pointer to it must be passed from Context
2769 // to State at binding time.
2770
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002771 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002772 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2773 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2774 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002775
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002776 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002777 {
2778 bindReadFramebuffer(0);
2779 }
2780
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002781 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002782 {
2783 bindDrawFramebuffer(0);
2784 }
2785}
2786
2787void Context::detachRenderbuffer(GLuint renderbuffer)
2788{
Jamie Madilla02315b2017-02-23 14:14:47 -05002789 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002790}
2791
Jamie Madill57a89722013-07-02 11:57:03 -04002792void Context::detachVertexArray(GLuint vertexArray)
2793{
Jamie Madill77a72f62015-04-14 11:18:32 -04002794 // Vertex array detachment is handled by Context, because 0 is a valid
2795 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002796 // binding time.
2797
Jamie Madill57a89722013-07-02 11:57:03 -04002798 // [OpenGL ES 3.0.2] section 2.10 page 43:
2799 // If a vertex array object that is currently bound is deleted, the binding
2800 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002801 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002802 {
2803 bindVertexArray(0);
2804 }
2805}
2806
Geoff Langc8058452014-02-03 12:04:11 -05002807void Context::detachTransformFeedback(GLuint transformFeedback)
2808{
Corentin Walleza2257da2016-04-19 16:43:12 -04002809 // Transform feedback detachment is handled by Context, because 0 is a valid
2810 // transform feedback, and a pointer to it must be passed from Context to State at
2811 // binding time.
2812
2813 // The OpenGL specification doesn't mention what should happen when the currently bound
2814 // transform feedback object is deleted. Since it is a container object, we treat it like
2815 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002816 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002817 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002818 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002819 }
Geoff Langc8058452014-02-03 12:04:11 -05002820}
2821
Jamie Madilldc356042013-07-19 16:36:57 -04002822void Context::detachSampler(GLuint sampler)
2823{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002824 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002825}
2826
Yunchao Hea336b902017-08-02 16:05:21 +08002827void Context::detachProgramPipeline(GLuint pipeline)
2828{
2829 mGLState.detachProgramPipeline(this, pipeline);
2830}
2831
Jamie Madill3ef140a2017-08-26 23:11:21 -04002832void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002833{
Shaodde78e82017-05-22 14:13:27 +08002834 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002835 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002836}
2837
Jamie Madille29d1672013-07-19 16:36:57 -04002838void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2839{
Till Rathmannb8543632018-10-02 19:46:14 +02002840 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002841 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002842 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002843}
Jamie Madille29d1672013-07-19 16:36:57 -04002844
Geoff Langc1984ed2016-10-07 12:41:00 -04002845void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2846{
Till Rathmannb8543632018-10-02 19:46:14 +02002847 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002848 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002849 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002850}
2851
Till Rathmannb8543632018-10-02 19:46:14 +02002852void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2853{
2854 Sampler *const samplerObject =
2855 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2856 SetSamplerParameterIiv(this, samplerObject, pname, param);
2857}
2858
2859void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2860{
2861 Sampler *const samplerObject =
2862 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2863 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2864}
2865
Brandon Jones59770802018-04-02 13:18:42 -07002866void Context::samplerParameterivRobust(GLuint sampler,
2867 GLenum pname,
2868 GLsizei bufSize,
2869 const GLint *param)
2870{
2871 samplerParameteriv(sampler, pname, param);
2872}
2873
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002874void Context::samplerParameterIivRobust(GLuint sampler,
2875 GLenum pname,
2876 GLsizei bufSize,
2877 const GLint *param)
2878{
2879 UNIMPLEMENTED();
2880}
2881
2882void Context::samplerParameterIuivRobust(GLuint sampler,
2883 GLenum pname,
2884 GLsizei bufSize,
2885 const GLuint *param)
2886{
2887 UNIMPLEMENTED();
2888}
2889
Jamie Madille29d1672013-07-19 16:36:57 -04002890void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2891{
Till Rathmannb8543632018-10-02 19:46:14 +02002892 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002893 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002894 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002895}
2896
Geoff Langc1984ed2016-10-07 12:41:00 -04002897void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002898{
Till Rathmannb8543632018-10-02 19:46:14 +02002899 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002900 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002901 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002902}
2903
Brandon Jones59770802018-04-02 13:18:42 -07002904void Context::samplerParameterfvRobust(GLuint sampler,
2905 GLenum pname,
2906 GLsizei bufSize,
2907 const GLfloat *param)
2908{
2909 samplerParameterfv(sampler, pname, param);
2910}
2911
Geoff Langc1984ed2016-10-07 12:41:00 -04002912void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002913{
Till Rathmannb8543632018-10-02 19:46:14 +02002914 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002915 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002916 QuerySamplerParameteriv(samplerObject, pname, params);
2917}
Jamie Madill9675b802013-07-19 16:36:59 -04002918
Till Rathmannb8543632018-10-02 19:46:14 +02002919void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2920{
2921 const Sampler *const samplerObject =
2922 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2923 QuerySamplerParameterIiv(samplerObject, pname, params);
2924}
2925
2926void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2927{
2928 const Sampler *const samplerObject =
2929 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2930 QuerySamplerParameterIuiv(samplerObject, pname, params);
2931}
2932
Brandon Jones59770802018-04-02 13:18:42 -07002933void Context::getSamplerParameterivRobust(GLuint sampler,
2934 GLenum pname,
2935 GLsizei bufSize,
2936 GLsizei *length,
2937 GLint *params)
2938{
2939 getSamplerParameteriv(sampler, pname, params);
2940}
2941
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002942void Context::getSamplerParameterIivRobust(GLuint sampler,
2943 GLenum pname,
2944 GLsizei bufSize,
2945 GLsizei *length,
2946 GLint *params)
2947{
2948 UNIMPLEMENTED();
2949}
2950
2951void Context::getSamplerParameterIuivRobust(GLuint sampler,
2952 GLenum pname,
2953 GLsizei bufSize,
2954 GLsizei *length,
2955 GLuint *params)
2956{
2957 UNIMPLEMENTED();
2958}
2959
Geoff Langc1984ed2016-10-07 12:41:00 -04002960void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2961{
Till Rathmannb8543632018-10-02 19:46:14 +02002962 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002963 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002964 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002965}
2966
Brandon Jones59770802018-04-02 13:18:42 -07002967void Context::getSamplerParameterfvRobust(GLuint sampler,
2968 GLenum pname,
2969 GLsizei bufSize,
2970 GLsizei *length,
2971 GLfloat *params)
2972{
2973 getSamplerParameterfv(sampler, pname, params);
2974}
2975
Olli Etuahof0fee072016-03-30 15:11:58 +03002976void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2977{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002978 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002979 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002980}
2981
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002982void Context::initRendererString()
2983{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002984 std::ostringstream rendererString;
2985 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002986 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002987 rendererString << ")";
2988
Geoff Langcec35902014-04-16 10:52:36 -04002989 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002990}
2991
Geoff Langc339c4e2016-11-29 10:37:36 -05002992void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002993{
Geoff Langc339c4e2016-11-29 10:37:36 -05002994 const Version &clientVersion = getClientVersion();
2995
2996 std::ostringstream versionString;
2997 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2998 << ANGLE_VERSION_STRING << ")";
2999 mVersionString = MakeStaticString(versionString.str());
3000
3001 std::ostringstream shadingLanguageVersionString;
3002 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3003 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3004 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3005 << ")";
3006 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003007}
3008
Geoff Langcec35902014-04-16 10:52:36 -04003009void Context::initExtensionStrings()
3010{
Geoff Langc339c4e2016-11-29 10:37:36 -05003011 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3012 std::ostringstream combinedStringStream;
3013 std::copy(strings.begin(), strings.end(),
3014 std::ostream_iterator<const char *>(combinedStringStream, " "));
3015 return MakeStaticString(combinedStringStream.str());
3016 };
3017
3018 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003019 for (const auto &extensionString : mExtensions.getStrings())
3020 {
3021 mExtensionStrings.push_back(MakeStaticString(extensionString));
3022 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003023 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003024
Geoff Langc339c4e2016-11-29 10:37:36 -05003025 mRequestableExtensionStrings.clear();
3026 for (const auto &extensionInfo : GetExtensionInfoMap())
3027 {
3028 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003029 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003030 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003031 {
3032 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3033 }
3034 }
3035 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003036}
3037
Geoff Langc339c4e2016-11-29 10:37:36 -05003038const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003039{
Geoff Langc339c4e2016-11-29 10:37:36 -05003040 switch (name)
3041 {
3042 case GL_VENDOR:
3043 return reinterpret_cast<const GLubyte *>("Google Inc.");
3044
3045 case GL_RENDERER:
3046 return reinterpret_cast<const GLubyte *>(mRendererString);
3047
3048 case GL_VERSION:
3049 return reinterpret_cast<const GLubyte *>(mVersionString);
3050
3051 case GL_SHADING_LANGUAGE_VERSION:
3052 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3053
3054 case GL_EXTENSIONS:
3055 return reinterpret_cast<const GLubyte *>(mExtensionString);
3056
3057 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3058 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3059
3060 default:
3061 UNREACHABLE();
3062 return nullptr;
3063 }
Geoff Langcec35902014-04-16 10:52:36 -04003064}
3065
Geoff Langc339c4e2016-11-29 10:37:36 -05003066const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003067{
Geoff Langc339c4e2016-11-29 10:37:36 -05003068 switch (name)
3069 {
3070 case GL_EXTENSIONS:
3071 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3072
3073 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3074 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3075
3076 default:
3077 UNREACHABLE();
3078 return nullptr;
3079 }
Geoff Langcec35902014-04-16 10:52:36 -04003080}
3081
3082size_t Context::getExtensionStringCount() const
3083{
3084 return mExtensionStrings.size();
3085}
3086
Geoff Lang111a99e2017-10-17 10:58:41 -04003087bool Context::isExtensionRequestable(const char *name)
3088{
3089 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3090 auto extension = extensionInfos.find(name);
3091
Geoff Lang111a99e2017-10-17 10:58:41 -04003092 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003093 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003094}
3095
Geoff Langc339c4e2016-11-29 10:37:36 -05003096void Context::requestExtension(const char *name)
3097{
3098 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3099 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3100 const auto &extension = extensionInfos.at(name);
3101 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003102 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003103
3104 if (mExtensions.*(extension.ExtensionsMember))
3105 {
3106 // Extension already enabled
3107 return;
3108 }
3109
3110 mExtensions.*(extension.ExtensionsMember) = true;
3111 updateCaps();
3112 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003113
Jamie Madill2f348d22017-06-05 10:50:59 -04003114 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3115 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003116
Jamie Madill81c2e252017-09-09 23:32:46 -04003117 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3118 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003119 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003120 for (auto &zeroTexture : mZeroTextures)
3121 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003122 if (zeroTexture.get() != nullptr)
3123 {
Jamie Madille3e680c2018-12-03 17:49:08 -05003124 zeroTexture->signalDirtyStorage(this, InitState::Initialized);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003125 }
Geoff Lang9aded172017-04-05 11:07:56 -04003126 }
3127
Jamie Madillb983a4b2018-08-01 11:34:51 -04003128 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003129}
3130
3131size_t Context::getRequestableExtensionStringCount() const
3132{
3133 return mRequestableExtensionStrings.size();
3134}
3135
Jamie Madill493f9572018-05-24 19:52:15 -04003136void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003137{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003138 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003139 ASSERT(transformFeedback != nullptr);
3140 ASSERT(!transformFeedback->isPaused());
3141
Geoff Lang91002262018-12-12 16:05:24 -05003142 ANGLE_CONTEXT_TRY(transformFeedback->begin(this, primitiveMode, mGLState.getProgram()));
Jamie Madill3a256222018-12-08 09:56:39 -05003143 mStateCache.onActiveTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003144}
3145
3146bool Context::hasActiveTransformFeedback(GLuint program) const
3147{
3148 for (auto pair : mTransformFeedbackMap)
3149 {
3150 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3151 {
3152 return true;
3153 }
3154 }
3155 return false;
3156}
3157
Geoff Lang33f11fb2018-05-07 13:42:47 -04003158Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003159{
3160 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3161
jchen1082af6202018-06-22 10:59:52 +08003162 // Explicitly enable GL_KHR_parallel_shader_compile
3163 supportedExtensions.parallelShaderCompile = true;
3164
Geoff Langb0f917f2017-12-05 13:41:54 -05003165 if (getClientVersion() < ES_2_0)
3166 {
3167 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003168 supportedExtensions.pointSizeArray = true;
3169 supportedExtensions.textureCubeMap = true;
3170 supportedExtensions.pointSprite = true;
3171 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003172 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003173 }
3174
3175 if (getClientVersion() < ES_3_0)
3176 {
3177 // Disable ES3+ extensions
3178 supportedExtensions.colorBufferFloat = false;
3179 supportedExtensions.eglImageExternalEssl3 = false;
3180 supportedExtensions.textureNorm16 = false;
3181 supportedExtensions.multiview = false;
3182 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003183 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003184 supportedExtensions.textureMultisample = false;
Geoff Lang7198ebc2018-11-22 14:36:06 -05003185
3186 // Don't expose GL_EXT_texture_sRGB_decode without sRGB texture support
3187 if (!supportedExtensions.sRGB)
3188 {
3189 supportedExtensions.textureSRGBDecode = false;
3190 }
Geoff Langb0f917f2017-12-05 13:41:54 -05003191 }
3192
3193 if (getClientVersion() < ES_3_1)
3194 {
3195 // Disable ES3.1+ extensions
3196 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003197
3198 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3199 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003200 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003201 }
3202
3203 if (getClientVersion() > ES_2_0)
3204 {
3205 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3206 // supportedExtensions.sRGB = false;
3207 }
3208
3209 // Some extensions are always available because they are implemented in the GL layer.
3210 supportedExtensions.bindUniformLocation = true;
3211 supportedExtensions.vertexArrayObject = true;
3212 supportedExtensions.bindGeneratesResource = true;
3213 supportedExtensions.clientArrays = true;
3214 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003215 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003216
3217 // Enable the no error extension if the context was created with the flag.
3218 supportedExtensions.noError = mSkipValidation;
3219
3220 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003221 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003222
3223 // Explicitly enable GL_KHR_debug
3224 supportedExtensions.debug = true;
3225 supportedExtensions.maxDebugMessageLength = 1024;
3226 supportedExtensions.maxDebugLoggedMessages = 1024;
3227 supportedExtensions.maxDebugGroupStackDepth = 1024;
3228 supportedExtensions.maxLabelLength = 1024;
3229
3230 // Explicitly enable GL_ANGLE_robust_client_memory
3231 supportedExtensions.robustClientMemory = true;
3232
3233 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003234 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003235
3236 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3237 // supports it.
3238 supportedExtensions.robustBufferAccessBehavior =
3239 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3240
3241 // Enable the cache control query unconditionally.
3242 supportedExtensions.programCacheControl = true;
3243
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003244 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003245 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003246 {
3247 // GL_ANGLE_explicit_context_gles1
3248 supportedExtensions.explicitContextGles1 = true;
3249 // GL_ANGLE_explicit_context
3250 supportedExtensions.explicitContext = true;
3251 }
3252
Geoff Lang79b91402018-10-04 15:11:30 -04003253 supportedExtensions.memorySize = true;
3254
Geoff Langb0f917f2017-12-05 13:41:54 -05003255 return supportedExtensions;
3256}
3257
Geoff Lang33f11fb2018-05-07 13:42:47 -04003258void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003259{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003260 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003261
Geoff Lang33f11fb2018-05-07 13:42:47 -04003262 mSupportedExtensions = generateSupportedExtensions();
3263 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003264
3265 mLimitations = mImplementation->getNativeLimitations();
3266
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003267 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3268 if (getClientVersion() < Version(2, 0))
3269 {
3270 mCaps.maxMultitextureUnits = 4;
3271 mCaps.maxClipPlanes = 6;
3272 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003273 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3274 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3275 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003276 mCaps.minSmoothPointSize = 1.0f;
3277 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003278 mCaps.minSmoothLineWidth = 1.0f;
3279 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003280 }
3281
Luc Ferronad2ae932018-06-11 15:31:17 -04003282 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003283 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003284
Luc Ferronad2ae932018-06-11 15:31:17 -04003285 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3286
Jamie Madill0f80ed82017-09-19 00:24:56 -04003287 if (getClientVersion() < ES_3_1)
3288 {
3289 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3290 }
3291 else
3292 {
3293 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3294 }
Geoff Lang301d1612014-07-09 10:34:37 -04003295
Jiawei Shao54aafe52018-04-27 14:54:57 +08003296 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3297 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003298 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3299
Jamie Madill0f80ed82017-09-19 00:24:56 -04003300 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3301 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3302
3303 // Limit textures as well, so we can use fast bitsets with texture bindings.
3304 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003305 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3306 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3307 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3308 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003309
Jamie Madille3e680c2018-12-03 17:49:08 -05003310 LimitCap(&mCaps.maxImageUnits, IMPLEMENTATION_MAX_IMAGE_UNITS);
3311
Jiawei Shaodb342272017-09-27 10:21:45 +08003312 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3313
Geoff Langc287ea62016-09-16 14:46:51 -04003314 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003315 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003316 for (const auto &extensionInfo : GetExtensionInfoMap())
3317 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003318 // If the user has requested that extensions start disabled and they are requestable,
3319 // disable them.
3320 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003321 {
3322 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3323 }
3324 }
3325
3326 // Generate texture caps
3327 updateCaps();
3328}
3329
3330void Context::updateCaps()
3331{
Geoff Lang900013c2014-07-07 11:32:19 -04003332 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003333 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003334
Jamie Madill7b62cf92017-11-02 15:20:49 -04003335 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003336 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003337 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003338 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003339
Geoff Lang0d8b7242015-09-09 14:56:53 -04003340 // Update the format caps based on the client version and extensions.
3341 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3342 // ES3.
3343 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003344 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003345 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003346 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003347 formatCaps.textureAttachment =
3348 formatCaps.textureAttachment &&
3349 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3350 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3351 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003352
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003353 // OpenGL ES does not support multisampling with non-rendererable formats
3354 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003355 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003356 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003357 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003358 {
Geoff Langd87878e2014-09-19 15:42:59 -04003359 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003360 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003361 else
3362 {
3363 // We may have limited the max samples for some required renderbuffer formats due to
3364 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3365 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3366
3367 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3368 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3369 // exception of signed and unsigned integer formats."
3370 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3371 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3372 {
3373 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3374 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3375 }
3376
3377 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003378 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003379 {
3380 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3381 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3382 // the exception that the signed and unsigned integer formats are required only to
3383 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3384 // multisamples, which must be at least one."
3385 if (formatInfo.componentType == GL_INT ||
3386 formatInfo.componentType == GL_UNSIGNED_INT)
3387 {
3388 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3389 }
3390
3391 // GLES 3.1 section 19.3.1.
3392 if (formatCaps.texturable)
3393 {
3394 if (formatInfo.depthBits > 0)
3395 {
3396 mCaps.maxDepthTextureSamples =
3397 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3398 }
3399 else if (formatInfo.redBits > 0)
3400 {
3401 mCaps.maxColorTextureSamples =
3402 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3403 }
3404 }
3405 }
3406 }
Geoff Langd87878e2014-09-19 15:42:59 -04003407
3408 if (formatCaps.texturable && formatInfo.compressed)
3409 {
Geoff Langca271392017-04-05 12:30:00 -04003410 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003411 }
3412
Geoff Langca271392017-04-05 12:30:00 -04003413 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003414 }
Jamie Madill32447362017-06-28 14:53:52 -04003415
3416 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003417 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003418 {
3419 mMemoryProgramCache = nullptr;
3420 }
Corentin Walleze4477002017-12-01 14:39:58 -05003421
3422 // Compute which buffer types are allowed
3423 mValidBufferBindings.reset();
3424 mValidBufferBindings.set(BufferBinding::ElementArray);
3425 mValidBufferBindings.set(BufferBinding::Array);
3426
3427 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3428 {
3429 mValidBufferBindings.set(BufferBinding::PixelPack);
3430 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3431 }
3432
3433 if (getClientVersion() >= ES_3_0)
3434 {
3435 mValidBufferBindings.set(BufferBinding::CopyRead);
3436 mValidBufferBindings.set(BufferBinding::CopyWrite);
3437 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3438 mValidBufferBindings.set(BufferBinding::Uniform);
3439 }
3440
3441 if (getClientVersion() >= ES_3_1)
3442 {
3443 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3444 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3445 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3446 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3447 }
jchen107ae70d82018-07-06 13:47:01 +08003448
3449 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003450
Jamie Madillef9fcd92018-11-28 14:03:59 -05003451 // Reinitialize some dirty bits that depend on extensions.
Jamie Madill132d15c2018-11-30 15:25:38 -05003452 bool robustInit = mGLState.isRobustResourceInitEnabled();
3453 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_ATTACHMENTS, robustInit);
3454 mDrawDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT, robustInit);
3455 mDrawDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT, robustInit);
3456 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_ATTACHMENTS, robustInit);
3457 mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT, robustInit);
3458 mComputeDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT, robustInit);
Jamie Madillef9fcd92018-11-28 14:03:59 -05003459
Jamie Madillac66f982018-10-09 18:30:01 -04003460 // Reinitialize state cache after extension changes.
3461 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003462}
3463
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003464void Context::initWorkarounds()
3465{
Jamie Madill761b02c2017-06-23 16:27:06 -04003466 // Apply back-end workarounds.
3467 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3468
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003469 // Lose the context upon out of memory error if the application is
3470 // expecting to watch for those events.
3471 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003472
3473 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3474 {
3475 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3476 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3477 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3478 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003479}
3480
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003481// Return true if the draw is a no-op, else return false.
3482// A no-op draw occurs if the count of vertices is less than the minimum required to
3483// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3484bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3485{
3486 return count < kMinimumPrimitiveCounts[mode];
3487}
3488
3489bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3490{
3491 return (instanceCount == 0) || noopDraw(mode, count);
3492}
3493
Jamie Madill526392d2018-11-16 09:35:14 -05003494angle::Result Context::prepareForClear(GLbitfield mask)
Geoff Langd4fff502017-09-22 11:28:28 -04003495{
Geoff Langa8cb2872018-03-09 16:09:40 -05003496 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003497 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003498 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill7c985f52018-11-29 18:16:17 -05003499 return angle::Result::Continue;
Geoff Langd4fff502017-09-22 11:28:28 -04003500}
3501
Jamie Madill526392d2018-11-16 09:35:14 -05003502angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
Geoff Langd4fff502017-09-22 11:28:28 -04003503{
Geoff Langa8cb2872018-03-09 16:09:40 -05003504 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003505 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3506 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003507 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill7c985f52018-11-29 18:16:17 -05003508 return angle::Result::Continue;
Jamie Madill05b35b22017-10-03 09:01:44 -04003509}
3510
Jamie Madill132d15c2018-11-30 15:25:38 -05003511ANGLE_INLINE angle::Result Context::prepareForDispatch()
3512{
3513 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
3514 return syncDirtyBits(mComputeDirtyBits);
3515}
3516
Jamie Madill526392d2018-11-16 09:35:14 -05003517angle::Result Context::syncState(const State::DirtyBits &bitMask,
3518 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003519{
Geoff Langa8cb2872018-03-09 16:09:40 -05003520 ANGLE_TRY(syncDirtyObjects(objectMask));
3521 ANGLE_TRY(syncDirtyBits(bitMask));
Jamie Madill7c985f52018-11-29 18:16:17 -05003522 return angle::Result::Continue;
Geoff Langd4fff502017-09-22 11:28:28 -04003523}
3524
Jamie Madillc29968b2016-01-20 11:17:23 -05003525void Context::blitFramebuffer(GLint srcX0,
3526 GLint srcY0,
3527 GLint srcX1,
3528 GLint srcY1,
3529 GLint dstX0,
3530 GLint dstY0,
3531 GLint dstX1,
3532 GLint dstY1,
3533 GLbitfield mask,
3534 GLenum filter)
3535{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003536 if (mask == 0)
3537 {
3538 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3539 // buffers are copied.
3540 return;
3541 }
3542
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003543 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003544 ASSERT(drawFramebuffer);
3545
3546 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3547 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3548
Jamie Madillbc918e72018-03-08 09:47:21 -05003549 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003550
Jamie Madill4f6592f2018-11-27 16:37:45 -05003551 ANGLE_CONTEXT_TRY(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003552}
Jamie Madillc29968b2016-01-20 11:17:23 -05003553
3554void Context::clear(GLbitfield mask)
3555{
Geoff Langd4fff502017-09-22 11:28:28 -04003556 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3557 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003558}
3559
3560void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3561{
Olli Etuaho78df3362018-10-05 16:43:27 +03003562 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3563 const FramebufferAttachment *attachment = nullptr;
3564 if (buffer == GL_DEPTH)
3565 {
3566 attachment = framebufferObject->getDepthbuffer();
3567 }
3568 if (buffer == GL_COLOR &&
3569 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3570 {
3571 attachment = framebufferObject->getColorbuffer(drawbuffer);
3572 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003573 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3574 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003575 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003576 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003577 return;
3578 }
Geoff Langd4fff502017-09-22 11:28:28 -04003579 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003580 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003581}
3582
3583void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3584{
Olli Etuaho78df3362018-10-05 16:43:27 +03003585 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3586 const FramebufferAttachment *attachment = nullptr;
3587 if (buffer == GL_COLOR &&
3588 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3589 {
3590 attachment = framebufferObject->getColorbuffer(drawbuffer);
3591 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003592 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3593 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003594 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003595 {
3596 return;
3597 }
Geoff Langd4fff502017-09-22 11:28:28 -04003598 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003599 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003600}
3601
3602void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3603{
Olli Etuaho78df3362018-10-05 16:43:27 +03003604 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3605 const FramebufferAttachment *attachment = nullptr;
3606 if (buffer == GL_STENCIL)
3607 {
3608 attachment = framebufferObject->getStencilbuffer();
3609 }
3610 if (buffer == GL_COLOR &&
3611 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3612 {
3613 attachment = framebufferObject->getColorbuffer(drawbuffer);
3614 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003615 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3616 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003617 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003618 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003619 return;
3620 }
Geoff Langd4fff502017-09-22 11:28:28 -04003621 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003622 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003623}
3624
3625void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3626{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003627 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003628 ASSERT(framebufferObject);
3629
3630 // If a buffer is not present, the clear has no effect
3631 if (framebufferObject->getDepthbuffer() == nullptr &&
3632 framebufferObject->getStencilbuffer() == nullptr)
3633 {
3634 return;
3635 }
3636
Geoff Langd4fff502017-09-22 11:28:28 -04003637 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3638 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003639}
3640
3641void Context::readPixels(GLint x,
3642 GLint y,
3643 GLsizei width,
3644 GLsizei height,
3645 GLenum format,
3646 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003647 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003648{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003649 if (width == 0 || height == 0)
3650 {
3651 return;
3652 }
3653
Jamie Madillbc918e72018-03-08 09:47:21 -05003654 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003655
Jamie Madillb6664922017-07-25 12:55:04 -04003656 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3657 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003658
3659 Rectangle area(x, y, width, height);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003660 ANGLE_CONTEXT_TRY(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003661}
3662
Brandon Jones59770802018-04-02 13:18:42 -07003663void Context::readPixelsRobust(GLint x,
3664 GLint y,
3665 GLsizei width,
3666 GLsizei height,
3667 GLenum format,
3668 GLenum type,
3669 GLsizei bufSize,
3670 GLsizei *length,
3671 GLsizei *columns,
3672 GLsizei *rows,
3673 void *pixels)
3674{
3675 readPixels(x, y, width, height, format, type, pixels);
3676}
3677
3678void Context::readnPixelsRobust(GLint x,
3679 GLint y,
3680 GLsizei width,
3681 GLsizei height,
3682 GLenum format,
3683 GLenum type,
3684 GLsizei bufSize,
3685 GLsizei *length,
3686 GLsizei *columns,
3687 GLsizei *rows,
3688 void *data)
3689{
3690 readPixels(x, y, width, height, format, type, data);
3691}
3692
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003693void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003694 GLint level,
3695 GLenum internalformat,
3696 GLint x,
3697 GLint y,
3698 GLsizei width,
3699 GLsizei height,
3700 GLint border)
3701{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003702 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003703 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003704
Jamie Madillc29968b2016-01-20 11:17:23 -05003705 Rectangle sourceArea(x, y, width, height);
3706
Jamie Madill05b35b22017-10-03 09:01:44 -04003707 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003708 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05003709 ANGLE_CONTEXT_TRY(
3710 texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003711}
3712
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003713void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003714 GLint level,
3715 GLint xoffset,
3716 GLint yoffset,
3717 GLint x,
3718 GLint y,
3719 GLsizei width,
3720 GLsizei height)
3721{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003722 if (width == 0 || height == 0)
3723 {
3724 return;
3725 }
3726
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003727 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003728 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003729
Jamie Madillc29968b2016-01-20 11:17:23 -05003730 Offset destOffset(xoffset, yoffset, 0);
3731 Rectangle sourceArea(x, y, width, height);
3732
Jamie Madill05b35b22017-10-03 09:01:44 -04003733 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003734 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05003735 ANGLE_CONTEXT_TRY(
3736 texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003737}
3738
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003739void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003740 GLint level,
3741 GLint xoffset,
3742 GLint yoffset,
3743 GLint zoffset,
3744 GLint x,
3745 GLint y,
3746 GLsizei width,
3747 GLsizei height)
3748{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003749 if (width == 0 || height == 0)
3750 {
3751 return;
3752 }
3753
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003754 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003755 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003756
Jamie Madillc29968b2016-01-20 11:17:23 -05003757 Offset destOffset(xoffset, yoffset, zoffset);
3758 Rectangle sourceArea(x, y, width, height);
3759
Jamie Madill05b35b22017-10-03 09:01:44 -04003760 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3761 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003762 ANGLE_CONTEXT_TRY(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level,
3763 destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003764}
3765
3766void Context::framebufferTexture2D(GLenum target,
3767 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003768 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003769 GLuint texture,
3770 GLint level)
3771{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003772 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003773 ASSERT(framebuffer);
3774
3775 if (texture != 0)
3776 {
3777 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003778 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003779 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003780 }
3781 else
3782 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003783 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003784 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003785
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003786 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003787}
3788
3789void Context::framebufferRenderbuffer(GLenum target,
3790 GLenum attachment,
3791 GLenum renderbuffertarget,
3792 GLuint renderbuffer)
3793{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003794 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003795 ASSERT(framebuffer);
3796
3797 if (renderbuffer != 0)
3798 {
3799 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003800
Jamie Madillcc129372018-04-12 09:13:18 -04003801 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003802 renderbufferObject);
3803 }
3804 else
3805 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003806 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003807 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003808
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003809 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003810}
3811
3812void Context::framebufferTextureLayer(GLenum target,
3813 GLenum attachment,
3814 GLuint texture,
3815 GLint level,
3816 GLint layer)
3817{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003818 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003819 ASSERT(framebuffer);
3820
3821 if (texture != 0)
3822 {
3823 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003824 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003825 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003826 }
3827 else
3828 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003829 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003830 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003831
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003832 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003833}
3834
Brandon Jones59770802018-04-02 13:18:42 -07003835void Context::framebufferTextureMultiviewLayered(GLenum target,
3836 GLenum attachment,
3837 GLuint texture,
3838 GLint level,
3839 GLint baseViewIndex,
3840 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003841{
Martin Radev82ef7742017-08-08 17:44:58 +03003842 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3843 ASSERT(framebuffer);
3844
3845 if (texture != 0)
3846 {
3847 Texture *textureObj = getTexture(texture);
3848
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003849 ImageIndex index;
3850 if (textureObj->getType() == TextureType::_2DArray)
3851 {
3852 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3853 }
3854 else
3855 {
3856 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3857 ASSERT(level == 0);
3858 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3859 }
Martin Radev82ef7742017-08-08 17:44:58 +03003860 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3861 numViews, baseViewIndex);
3862 }
3863 else
3864 {
3865 framebuffer->resetAttachment(this, attachment);
3866 }
3867
3868 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003869}
3870
Brandon Jones59770802018-04-02 13:18:42 -07003871void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3872 GLenum attachment,
3873 GLuint texture,
3874 GLint level,
3875 GLsizei numViews,
3876 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003877{
Martin Radev5dae57b2017-07-14 16:15:55 +03003878 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3879 ASSERT(framebuffer);
3880
3881 if (texture != 0)
3882 {
3883 Texture *textureObj = getTexture(texture);
3884
3885 ImageIndex index = ImageIndex::Make2D(level);
3886 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3887 textureObj, numViews, viewportOffsets);
3888 }
3889 else
3890 {
3891 framebuffer->resetAttachment(this, attachment);
3892 }
3893
3894 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003895}
3896
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003897void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3898{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003899 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3900 ASSERT(framebuffer);
3901
3902 if (texture != 0)
3903 {
3904 Texture *textureObj = getTexture(texture);
3905
3906 ImageIndex index = ImageIndex::MakeFromType(
3907 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3908 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3909 }
3910 else
3911 {
3912 framebuffer->resetAttachment(this, attachment);
3913 }
3914
3915 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003916}
3917
Jamie Madillc29968b2016-01-20 11:17:23 -05003918void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3919{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003920 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003921 ASSERT(framebuffer);
3922 framebuffer->setDrawBuffers(n, bufs);
Jamie Madillef9fcd92018-11-28 14:03:59 -05003923 mGLState.setDrawFramebufferDirty();
Jamie Madilld84b6732018-09-06 15:54:35 -04003924 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003925}
3926
3927void Context::readBuffer(GLenum mode)
3928{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003929 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003930 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003931 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003932}
3933
3934void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3935{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003936 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003937 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003938
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003939 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003940 ASSERT(framebuffer);
3941
3942 // The specification isn't clear what should be done when the framebuffer isn't complete.
3943 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4f6592f2018-11-27 16:37:45 -05003944 ANGLE_CONTEXT_TRY(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003945}
3946
3947void Context::invalidateFramebuffer(GLenum target,
3948 GLsizei numAttachments,
3949 const GLenum *attachments)
3950{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003951 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003952 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003953
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003954 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003955 ASSERT(framebuffer);
3956
Jamie Madill427064d2018-04-13 16:20:34 -04003957 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003958 {
Jamie Madill437fa652016-05-03 15:13:24 -04003959 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003960 }
Jamie Madill437fa652016-05-03 15:13:24 -04003961
Jamie Madill4f6592f2018-11-27 16:37:45 -05003962 ANGLE_CONTEXT_TRY(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003963}
3964
3965void Context::invalidateSubFramebuffer(GLenum target,
3966 GLsizei numAttachments,
3967 const GLenum *attachments,
3968 GLint x,
3969 GLint y,
3970 GLsizei width,
3971 GLsizei height)
3972{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003973 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003974 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003975
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003976 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003977 ASSERT(framebuffer);
3978
Jamie Madill427064d2018-04-13 16:20:34 -04003979 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003980 {
Jamie Madill437fa652016-05-03 15:13:24 -04003981 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003982 }
Jamie Madill437fa652016-05-03 15:13:24 -04003983
3984 Rectangle area(x, y, width, height);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003985 ANGLE_CONTEXT_TRY(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003986}
3987
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003988void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003989 GLint level,
3990 GLint internalformat,
3991 GLsizei width,
3992 GLsizei height,
3993 GLint border,
3994 GLenum format,
3995 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003996 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003997{
Jamie Madillbc918e72018-03-08 09:47:21 -05003998 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003999
4000 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004001 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05004002 ANGLE_CONTEXT_TRY(texture->setImage(this, mGLState.getUnpackState(), target, level,
4003 internalformat, size, format, type,
4004 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004005}
4006
Brandon Jones59770802018-04-02 13:18:42 -07004007void Context::texImage2DRobust(TextureTarget target,
4008 GLint level,
4009 GLint internalformat,
4010 GLsizei width,
4011 GLsizei height,
4012 GLint border,
4013 GLenum format,
4014 GLenum type,
4015 GLsizei bufSize,
4016 const void *pixels)
4017{
4018 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4019}
4020
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004021void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004022 GLint level,
4023 GLint internalformat,
4024 GLsizei width,
4025 GLsizei height,
4026 GLsizei depth,
4027 GLint border,
4028 GLenum format,
4029 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004030 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004031{
Jamie Madillbc918e72018-03-08 09:47:21 -05004032 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004033
4034 Extents size(width, height, depth);
4035 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004036 ANGLE_CONTEXT_TRY(texture->setImage(this, mGLState.getUnpackState(),
4037 NonCubeTextureTypeToTarget(target), level, internalformat,
4038 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004039}
4040
Brandon Jones59770802018-04-02 13:18:42 -07004041void Context::texImage3DRobust(TextureType target,
4042 GLint level,
4043 GLint internalformat,
4044 GLsizei width,
4045 GLsizei height,
4046 GLsizei depth,
4047 GLint border,
4048 GLenum format,
4049 GLenum type,
4050 GLsizei bufSize,
4051 const void *pixels)
4052{
4053 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4054}
4055
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004056void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004057 GLint level,
4058 GLint xoffset,
4059 GLint yoffset,
4060 GLsizei width,
4061 GLsizei height,
4062 GLenum format,
4063 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004064 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004065{
4066 // Zero sized uploads are valid but no-ops
4067 if (width == 0 || height == 0)
4068 {
4069 return;
4070 }
4071
Jamie Madillbc918e72018-03-08 09:47:21 -05004072 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004073
4074 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004075 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004076
4077 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4078
Jamie Madill4f6592f2018-11-27 16:37:45 -05004079 ANGLE_CONTEXT_TRY(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target,
4080 level, area, format, type,
4081 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004082}
4083
Brandon Jones59770802018-04-02 13:18:42 -07004084void Context::texSubImage2DRobust(TextureTarget target,
4085 GLint level,
4086 GLint xoffset,
4087 GLint yoffset,
4088 GLsizei width,
4089 GLsizei height,
4090 GLenum format,
4091 GLenum type,
4092 GLsizei bufSize,
4093 const void *pixels)
4094{
4095 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4096}
4097
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004098void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004099 GLint level,
4100 GLint xoffset,
4101 GLint yoffset,
4102 GLint zoffset,
4103 GLsizei width,
4104 GLsizei height,
4105 GLsizei depth,
4106 GLenum format,
4107 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004108 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004109{
4110 // Zero sized uploads are valid but no-ops
4111 if (width == 0 || height == 0 || depth == 0)
4112 {
4113 return;
4114 }
4115
Jamie Madillbc918e72018-03-08 09:47:21 -05004116 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004117
4118 Box area(xoffset, yoffset, zoffset, width, height, depth);
4119 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004120
4121 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4122
Jamie Madill4f6592f2018-11-27 16:37:45 -05004123 ANGLE_CONTEXT_TRY(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
4124 NonCubeTextureTypeToTarget(target), level, area, format,
4125 type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004126}
4127
Brandon Jones59770802018-04-02 13:18:42 -07004128void Context::texSubImage3DRobust(TextureType target,
4129 GLint level,
4130 GLint xoffset,
4131 GLint yoffset,
4132 GLint zoffset,
4133 GLsizei width,
4134 GLsizei height,
4135 GLsizei depth,
4136 GLenum format,
4137 GLenum type,
4138 GLsizei bufSize,
4139 const void *pixels)
4140{
4141 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4142 pixels);
4143}
4144
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004145void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004146 GLint level,
4147 GLenum internalformat,
4148 GLsizei width,
4149 GLsizei height,
4150 GLint border,
4151 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004152 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004153{
Jamie Madillbc918e72018-03-08 09:47:21 -05004154 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004155
4156 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004157 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05004158 ANGLE_CONTEXT_TRY(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4159 internalformat, size, imageSize,
4160 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004161}
4162
Brandon Jones59770802018-04-02 13:18:42 -07004163void Context::compressedTexImage2DRobust(TextureTarget target,
4164 GLint level,
4165 GLenum internalformat,
4166 GLsizei width,
4167 GLsizei height,
4168 GLint border,
4169 GLsizei imageSize,
4170 GLsizei dataSize,
4171 const GLvoid *data)
4172{
4173 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4174}
4175
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004176void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004177 GLint level,
4178 GLenum internalformat,
4179 GLsizei width,
4180 GLsizei height,
4181 GLsizei depth,
4182 GLint border,
4183 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004184 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004185{
Jamie Madillbc918e72018-03-08 09:47:21 -05004186 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004187
4188 Extents size(width, height, depth);
4189 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004190 ANGLE_CONTEXT_TRY(texture->setCompressedImage(
Corentin Wallez99d492c2018-02-27 15:17:10 -05004191 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004192 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004193}
4194
Brandon Jones59770802018-04-02 13:18:42 -07004195void Context::compressedTexImage3DRobust(TextureType target,
4196 GLint level,
4197 GLenum internalformat,
4198 GLsizei width,
4199 GLsizei height,
4200 GLsizei depth,
4201 GLint border,
4202 GLsizei imageSize,
4203 GLsizei dataSize,
4204 const GLvoid *data)
4205{
4206 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4207 data);
4208}
4209
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004210void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004211 GLint level,
4212 GLint xoffset,
4213 GLint yoffset,
4214 GLsizei width,
4215 GLsizei height,
4216 GLenum format,
4217 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004218 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004219{
Jamie Madillbc918e72018-03-08 09:47:21 -05004220 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004221
4222 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004223 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05004224 ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level,
4225 area, format, imageSize,
4226 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004227}
4228
Brandon Jones59770802018-04-02 13:18:42 -07004229void Context::compressedTexSubImage2DRobust(TextureTarget target,
4230 GLint level,
4231 GLint xoffset,
4232 GLint yoffset,
4233 GLsizei width,
4234 GLsizei height,
4235 GLenum format,
4236 GLsizei imageSize,
4237 GLsizei dataSize,
4238 const GLvoid *data)
4239{
4240 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4241 data);
4242}
4243
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004244void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004245 GLint level,
4246 GLint xoffset,
4247 GLint yoffset,
4248 GLint zoffset,
4249 GLsizei width,
4250 GLsizei height,
4251 GLsizei depth,
4252 GLenum format,
4253 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004254 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004255{
4256 // Zero sized uploads are valid but no-ops
4257 if (width == 0 || height == 0)
4258 {
4259 return;
4260 }
4261
Jamie Madillbc918e72018-03-08 09:47:21 -05004262 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004263
4264 Box area(xoffset, yoffset, zoffset, width, height, depth);
4265 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004266 ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(
Corentin Wallez99d492c2018-02-27 15:17:10 -05004267 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004268 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004269}
4270
Brandon Jones59770802018-04-02 13:18:42 -07004271void Context::compressedTexSubImage3DRobust(TextureType target,
4272 GLint level,
4273 GLint xoffset,
4274 GLint yoffset,
4275 GLint zoffset,
4276 GLsizei width,
4277 GLsizei height,
4278 GLsizei depth,
4279 GLenum format,
4280 GLsizei imageSize,
4281 GLsizei dataSize,
4282 const GLvoid *data)
4283{
4284 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4285 imageSize, data);
4286}
4287
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004288void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004289{
4290 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004291 ANGLE_CONTEXT_TRY(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004292}
4293
Jamie Madill007530e2017-12-28 14:27:04 -05004294void Context::copyTexture(GLuint sourceId,
4295 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004296 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004297 GLuint destId,
4298 GLint destLevel,
4299 GLint internalFormat,
4300 GLenum destType,
4301 GLboolean unpackFlipY,
4302 GLboolean unpackPremultiplyAlpha,
4303 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004304{
Jamie Madillbc918e72018-03-08 09:47:21 -05004305 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004306
4307 gl::Texture *sourceTexture = getTexture(sourceId);
4308 gl::Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004309 ANGLE_CONTEXT_TRY(
4310 destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType, sourceLevel,
4311 ConvertToBool(unpackFlipY), ConvertToBool(unpackPremultiplyAlpha),
4312 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004313}
4314
Jamie Madill007530e2017-12-28 14:27:04 -05004315void Context::copySubTexture(GLuint sourceId,
4316 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004317 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004318 GLuint destId,
4319 GLint destLevel,
4320 GLint xoffset,
4321 GLint yoffset,
4322 GLint x,
4323 GLint y,
4324 GLsizei width,
4325 GLsizei height,
4326 GLboolean unpackFlipY,
4327 GLboolean unpackPremultiplyAlpha,
4328 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004329{
4330 // Zero sized copies are valid but no-ops
4331 if (width == 0 || height == 0)
4332 {
4333 return;
4334 }
4335
Jamie Madillbc918e72018-03-08 09:47:21 -05004336 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004337
4338 gl::Texture *sourceTexture = getTexture(sourceId);
4339 gl::Texture *destTexture = getTexture(destId);
4340 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004341 Box box(x, y, 0, width, height, 1);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004342 ANGLE_CONTEXT_TRY(destTexture->copySubTexture(
4343 this, destTarget, destLevel, offset, sourceLevel, box, ConvertToBool(unpackFlipY),
4344 ConvertToBool(unpackPremultiplyAlpha), ConvertToBool(unpackUnmultiplyAlpha),
4345 sourceTexture));
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004346}
4347
4348void Context::copyTexture3D(GLuint sourceId,
4349 GLint sourceLevel,
4350 TextureTarget destTarget,
4351 GLuint destId,
4352 GLint destLevel,
4353 GLint internalFormat,
4354 GLenum destType,
4355 GLboolean unpackFlipY,
4356 GLboolean unpackPremultiplyAlpha,
4357 GLboolean unpackUnmultiplyAlpha)
4358{
4359 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4360
4361 Texture *sourceTexture = getTexture(sourceId);
4362 Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004363 ANGLE_CONTEXT_TRY(
4364 destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType, sourceLevel,
4365 ConvertToBool(unpackFlipY), ConvertToBool(unpackPremultiplyAlpha),
4366 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004367}
4368
4369void Context::copySubTexture3D(GLuint sourceId,
4370 GLint sourceLevel,
4371 TextureTarget destTarget,
4372 GLuint destId,
4373 GLint destLevel,
4374 GLint xoffset,
4375 GLint yoffset,
4376 GLint zoffset,
4377 GLint x,
4378 GLint y,
4379 GLint z,
4380 GLsizei width,
4381 GLsizei height,
4382 GLsizei depth,
4383 GLboolean unpackFlipY,
4384 GLboolean unpackPremultiplyAlpha,
4385 GLboolean unpackUnmultiplyAlpha)
4386{
4387 // Zero sized copies are valid but no-ops
4388 if (width == 0 || height == 0 || depth == 0)
4389 {
4390 return;
4391 }
4392
4393 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4394
4395 Texture *sourceTexture = getTexture(sourceId);
4396 Texture *destTexture = getTexture(destId);
4397 Offset offset(xoffset, yoffset, zoffset);
4398 Box box(x, y, z, width, height, depth);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004399 ANGLE_CONTEXT_TRY(destTexture->copySubTexture(
4400 this, destTarget, destLevel, offset, sourceLevel, box, ConvertToBool(unpackFlipY),
4401 ConvertToBool(unpackPremultiplyAlpha), ConvertToBool(unpackUnmultiplyAlpha),
4402 sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004403}
4404
Jamie Madill007530e2017-12-28 14:27:04 -05004405void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004406{
Jamie Madillbc918e72018-03-08 09:47:21 -05004407 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004408
4409 gl::Texture *sourceTexture = getTexture(sourceId);
4410 gl::Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004411 ANGLE_CONTEXT_TRY(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004412}
4413
Corentin Wallez336129f2017-10-17 15:55:40 -04004414void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004415{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004416 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004417 ASSERT(buffer);
4418
Geoff Lang496c02d2016-10-20 11:38:11 -07004419 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004420}
4421
Brandon Jones59770802018-04-02 13:18:42 -07004422void Context::getBufferPointervRobust(BufferBinding target,
4423 GLenum pname,
4424 GLsizei bufSize,
4425 GLsizei *length,
4426 void **params)
4427{
4428 getBufferPointerv(target, pname, params);
4429}
4430
Corentin Wallez336129f2017-10-17 15:55:40 -04004431void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004432{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004433 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004434 ASSERT(buffer);
4435
Jamie Madill7c985f52018-11-29 18:16:17 -05004436 if (buffer->map(this, access) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004437 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004438 return nullptr;
4439 }
4440
4441 return buffer->getMapPointer();
4442}
4443
Corentin Wallez336129f2017-10-17 15:55:40 -04004444GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004445{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004446 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004447 ASSERT(buffer);
4448
4449 GLboolean result;
Jamie Madill7c985f52018-11-29 18:16:17 -05004450 if (buffer->unmap(this, &result) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004451 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004452 return GL_FALSE;
4453 }
4454
4455 return result;
4456}
4457
Corentin Wallez336129f2017-10-17 15:55:40 -04004458void *Context::mapBufferRange(BufferBinding target,
4459 GLintptr offset,
4460 GLsizeiptr length,
4461 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004462{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004463 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004464 ASSERT(buffer);
4465
Jamie Madill7c985f52018-11-29 18:16:17 -05004466 if (buffer->mapRange(this, offset, length, access) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004467 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004468 return nullptr;
4469 }
4470
4471 return buffer->getMapPointer();
4472}
4473
Corentin Wallez336129f2017-10-17 15:55:40 -04004474void Context::flushMappedBufferRange(BufferBinding /*target*/,
4475 GLintptr /*offset*/,
4476 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004477{
4478 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4479}
4480
Jamie Madill526392d2018-11-16 09:35:14 -05004481angle::Result Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004482{
Geoff Langa8cb2872018-03-09 16:09:40 -05004483 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004484}
4485
Jamie Madill526392d2018-11-16 09:35:14 -05004486angle::Result Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004487{
Geoff Langa8cb2872018-03-09 16:09:40 -05004488 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004489}
4490
Jamie Madill526392d2018-11-16 09:35:14 -05004491angle::Result Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004492{
Geoff Langa8cb2872018-03-09 16:09:40 -05004493 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004494}
4495
Jamie Madill526392d2018-11-16 09:35:14 -05004496angle::Result Context::syncStateForPathOperation()
Geoff Lang9bf86f02018-07-26 11:46:34 -04004497{
4498 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4499
4500 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4501 ANGLE_TRY(syncDirtyBits());
4502
Jamie Madill7c985f52018-11-29 18:16:17 -05004503 return angle::Result::Continue;
Geoff Lang9bf86f02018-07-26 11:46:34 -04004504}
4505
Jiajia Qin5451d532017-11-16 17:16:34 +08004506void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4507{
4508 UNIMPLEMENTED();
4509}
4510
Jamie Madillc20ab272016-06-09 07:20:46 -07004511void Context::activeTexture(GLenum texture)
4512{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004513 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004514}
4515
Jamie Madill876429b2017-04-20 15:46:24 -04004516void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004517{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004518 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004519}
4520
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004521void Context::blendEquation(GLenum mode)
4522{
4523 mGLState.setBlendEquation(mode, mode);
4524}
4525
Jamie Madillc20ab272016-06-09 07:20:46 -07004526void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4527{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004528 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004529}
4530
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004531void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4532{
4533 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4534}
4535
Jamie Madillc20ab272016-06-09 07:20:46 -07004536void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4537{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004538 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004539}
4540
Jamie Madill876429b2017-04-20 15:46:24 -04004541void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004542{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004543 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004544}
4545
Jamie Madill876429b2017-04-20 15:46:24 -04004546void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004547{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004548 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004549}
4550
4551void Context::clearStencil(GLint s)
4552{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004553 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004554}
4555
4556void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4557{
Geoff Lang92019432017-11-20 13:09:34 -05004558 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4559 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004560}
4561
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004562void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004563{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004564 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004565}
4566
4567void Context::depthFunc(GLenum func)
4568{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004569 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004570}
4571
4572void Context::depthMask(GLboolean flag)
4573{
Geoff Lang92019432017-11-20 13:09:34 -05004574 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004575}
4576
Jamie Madill876429b2017-04-20 15:46:24 -04004577void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004578{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004579 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004580}
4581
4582void Context::disable(GLenum cap)
4583{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004584 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004585 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004586}
4587
4588void Context::disableVertexAttribArray(GLuint index)
4589{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004590 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004591 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004592}
4593
4594void Context::enable(GLenum cap)
4595{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004596 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004597 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004598}
4599
4600void Context::enableVertexAttribArray(GLuint index)
4601{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004602 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004603 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004604}
4605
4606void Context::frontFace(GLenum mode)
4607{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004608 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004609}
4610
4611void Context::hint(GLenum target, GLenum mode)
4612{
4613 switch (target)
4614 {
4615 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004616 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004617 break;
4618
4619 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004620 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004621 break;
4622
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004623 case GL_PERSPECTIVE_CORRECTION_HINT:
4624 case GL_POINT_SMOOTH_HINT:
4625 case GL_LINE_SMOOTH_HINT:
4626 case GL_FOG_HINT:
4627 mGLState.gles1().setHint(target, mode);
4628 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004629 default:
4630 UNREACHABLE();
4631 return;
4632 }
4633}
4634
4635void Context::lineWidth(GLfloat width)
4636{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004637 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004638}
4639
4640void Context::pixelStorei(GLenum pname, GLint param)
4641{
4642 switch (pname)
4643 {
4644 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004645 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004646 break;
4647
4648 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004649 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004650 break;
4651
4652 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004653 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004654 break;
4655
4656 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004657 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004658 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004659 break;
4660
4661 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004662 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004663 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004664 break;
4665
4666 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004667 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004668 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004669 break;
4670
4671 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004672 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004673 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004674 break;
4675
4676 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004677 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004678 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004679 break;
4680
4681 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004682 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004683 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004684 break;
4685
4686 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004687 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004688 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004689 break;
4690
4691 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004692 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004693 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004694 break;
4695
4696 default:
4697 UNREACHABLE();
4698 return;
4699 }
4700}
4701
4702void Context::polygonOffset(GLfloat factor, GLfloat units)
4703{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004704 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004705}
4706
Jamie Madill876429b2017-04-20 15:46:24 -04004707void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004708{
Geoff Lang92019432017-11-20 13:09:34 -05004709 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004710}
4711
Jiawei Shaodb342272017-09-27 10:21:45 +08004712void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4713{
4714 mGLState.setSampleMaskParams(maskNumber, mask);
4715}
4716
Jamie Madillc20ab272016-06-09 07:20:46 -07004717void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4718{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004719 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004720}
4721
4722void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4723{
4724 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4725 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004726 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004727 }
4728
4729 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4730 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004731 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004732 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004733
4734 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004735}
4736
4737void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4738{
4739 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4740 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004741 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004742 }
4743
4744 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4745 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004746 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004747 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004748
4749 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004750}
4751
4752void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4753{
4754 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4755 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004756 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004757 }
4758
4759 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4760 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004761 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004762 }
4763}
4764
4765void Context::vertexAttrib1f(GLuint index, GLfloat x)
4766{
4767 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004768 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004769 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004770}
4771
4772void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4773{
4774 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004775 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004776 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004777}
4778
4779void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4780{
4781 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004782 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004783 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004784}
4785
4786void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4787{
4788 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004789 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004790 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004791}
4792
4793void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4794{
4795 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004796 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004797 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004798}
4799
4800void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4801{
4802 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004803 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004804 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004805}
4806
4807void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4808{
4809 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004810 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004811 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004812}
4813
4814void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4815{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004816 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004817 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004818}
4819
4820void Context::vertexAttribPointer(GLuint index,
4821 GLint size,
4822 GLenum type,
4823 GLboolean normalized,
4824 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004825 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004826{
Corentin Wallez336129f2017-10-17 15:55:40 -04004827 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004828 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004829 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004830}
4831
Shao80957d92017-02-20 21:25:59 +08004832void Context::vertexAttribFormat(GLuint attribIndex,
4833 GLint size,
4834 GLenum type,
4835 GLboolean normalized,
4836 GLuint relativeOffset)
4837{
Geoff Lang92019432017-11-20 13:09:34 -05004838 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004839 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004840 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004841}
4842
4843void Context::vertexAttribIFormat(GLuint attribIndex,
4844 GLint size,
4845 GLenum type,
4846 GLuint relativeOffset)
4847{
4848 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004849 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004850}
4851
4852void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4853{
Shaodde78e82017-05-22 14:13:27 +08004854 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004855 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004856}
4857
Jiajia Qin5451d532017-11-16 17:16:34 +08004858void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004859{
4860 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004861 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004862}
4863
Jamie Madillc20ab272016-06-09 07:20:46 -07004864void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4865{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004866 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004867}
4868
4869void Context::vertexAttribIPointer(GLuint index,
4870 GLint size,
4871 GLenum type,
4872 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004873 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004874{
Corentin Wallez336129f2017-10-17 15:55:40 -04004875 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4876 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004877 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004878}
4879
4880void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4881{
4882 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004883 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004884 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004885}
4886
4887void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4888{
4889 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004890 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004891 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004892}
4893
4894void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4895{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004896 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004897 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004898}
4899
4900void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4901{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004902 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004903 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004904}
4905
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004906void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4907{
4908 const VertexAttribCurrentValueData &currentValues =
4909 getGLState().getVertexAttribCurrentValue(index);
4910 const VertexArray *vao = getGLState().getVertexArray();
4911 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4912 currentValues, pname, params);
4913}
4914
Brandon Jones59770802018-04-02 13:18:42 -07004915void Context::getVertexAttribivRobust(GLuint index,
4916 GLenum pname,
4917 GLsizei bufSize,
4918 GLsizei *length,
4919 GLint *params)
4920{
4921 getVertexAttribiv(index, pname, params);
4922}
4923
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004924void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4925{
4926 const VertexAttribCurrentValueData &currentValues =
4927 getGLState().getVertexAttribCurrentValue(index);
4928 const VertexArray *vao = getGLState().getVertexArray();
4929 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4930 currentValues, pname, params);
4931}
4932
Brandon Jones59770802018-04-02 13:18:42 -07004933void Context::getVertexAttribfvRobust(GLuint index,
4934 GLenum pname,
4935 GLsizei bufSize,
4936 GLsizei *length,
4937 GLfloat *params)
4938{
4939 getVertexAttribfv(index, pname, params);
4940}
4941
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004942void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4943{
4944 const VertexAttribCurrentValueData &currentValues =
4945 getGLState().getVertexAttribCurrentValue(index);
4946 const VertexArray *vao = getGLState().getVertexArray();
4947 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4948 currentValues, pname, params);
4949}
4950
Brandon Jones59770802018-04-02 13:18:42 -07004951void Context::getVertexAttribIivRobust(GLuint index,
4952 GLenum pname,
4953 GLsizei bufSize,
4954 GLsizei *length,
4955 GLint *params)
4956{
4957 getVertexAttribIiv(index, pname, params);
4958}
4959
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004960void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4961{
4962 const VertexAttribCurrentValueData &currentValues =
4963 getGLState().getVertexAttribCurrentValue(index);
4964 const VertexArray *vao = getGLState().getVertexArray();
4965 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4966 currentValues, pname, params);
4967}
4968
Brandon Jones59770802018-04-02 13:18:42 -07004969void Context::getVertexAttribIuivRobust(GLuint index,
4970 GLenum pname,
4971 GLsizei bufSize,
4972 GLsizei *length,
4973 GLuint *params)
4974{
4975 getVertexAttribIuiv(index, pname, params);
4976}
4977
Jamie Madill876429b2017-04-20 15:46:24 -04004978void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004979{
4980 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4981 QueryVertexAttribPointerv(attrib, pname, pointer);
4982}
4983
Brandon Jones59770802018-04-02 13:18:42 -07004984void Context::getVertexAttribPointervRobust(GLuint index,
4985 GLenum pname,
4986 GLsizei bufSize,
4987 GLsizei *length,
4988 void **pointer)
4989{
4990 getVertexAttribPointerv(index, pname, pointer);
4991}
4992
Jamie Madillc20ab272016-06-09 07:20:46 -07004993void Context::debugMessageControl(GLenum source,
4994 GLenum type,
4995 GLenum severity,
4996 GLsizei count,
4997 const GLuint *ids,
4998 GLboolean enabled)
4999{
5000 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005001 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005002 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005003}
5004
5005void Context::debugMessageInsert(GLenum source,
5006 GLenum type,
5007 GLuint id,
5008 GLenum severity,
5009 GLsizei length,
5010 const GLchar *buf)
5011{
5012 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005013 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005014}
5015
5016void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5017{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005018 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005019}
5020
5021GLuint Context::getDebugMessageLog(GLuint count,
5022 GLsizei bufSize,
5023 GLenum *sources,
5024 GLenum *types,
5025 GLuint *ids,
5026 GLenum *severities,
5027 GLsizei *lengths,
5028 GLchar *messageLog)
5029{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005030 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5031 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005032}
5033
5034void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5035{
5036 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005037 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005038 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005039}
5040
5041void Context::popDebugGroup()
5042{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005043 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005044 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005045}
5046
Corentin Wallez336129f2017-10-17 15:55:40 -04005047void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005048{
5049 Buffer *buffer = mGLState.getTargetBuffer(target);
5050 ASSERT(buffer);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005051 ANGLE_CONTEXT_TRY(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005052}
5053
Corentin Wallez336129f2017-10-17 15:55:40 -04005054void Context::bufferSubData(BufferBinding target,
5055 GLintptr offset,
5056 GLsizeiptr size,
5057 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005058{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005059 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005060 {
5061 return;
5062 }
5063
5064 Buffer *buffer = mGLState.getTargetBuffer(target);
5065 ASSERT(buffer);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005066 ANGLE_CONTEXT_TRY(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005067}
5068
Jamie Madillef300b12016-10-07 15:12:09 -04005069void Context::attachShader(GLuint program, GLuint shader)
5070{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005071 Program *programObject = mState.mShaderPrograms->getProgram(program);
5072 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005073 ASSERT(programObject && shaderObject);
5074 programObject->attachShader(shaderObject);
5075}
5076
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005077const Workarounds &Context::getWorkarounds() const
5078{
5079 return mWorkarounds;
5080}
5081
Corentin Wallez336129f2017-10-17 15:55:40 -04005082void Context::copyBufferSubData(BufferBinding readTarget,
5083 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005084 GLintptr readOffset,
5085 GLintptr writeOffset,
5086 GLsizeiptr size)
5087{
5088 // if size is zero, the copy is a successful no-op
5089 if (size == 0)
5090 {
5091 return;
5092 }
5093
5094 // TODO(jmadill): cache these.
5095 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5096 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5097
Jamie Madill4f6592f2018-11-27 16:37:45 -05005098 ANGLE_CONTEXT_TRY(
5099 writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005100}
5101
Jamie Madill01a80ee2016-11-07 12:06:18 -05005102void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5103{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005104 // Ideally we could share the program query with the validation layer if possible.
5105 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005106 ASSERT(programObject);
5107 programObject->bindAttributeLocation(index, name);
5108}
5109
Corentin Wallez336129f2017-10-17 15:55:40 -04005110void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005111{
Corentin Wallez336129f2017-10-17 15:55:40 -04005112 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5113 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005114 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005115}
5116
Corentin Wallez336129f2017-10-17 15:55:40 -04005117void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005118{
5119 bindBufferRange(target, index, buffer, 0, 0);
5120}
5121
Corentin Wallez336129f2017-10-17 15:55:40 -04005122void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005123 GLuint index,
5124 GLuint buffer,
5125 GLintptr offset,
5126 GLsizeiptr size)
5127{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005128 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
Geoff Lang91002262018-12-12 16:05:24 -05005129 ANGLE_CONTEXT_TRY(mGLState.setIndexedBufferBinding(this, target, index, object, offset, size));
Jamie Madill6d32cef2018-08-14 02:34:28 -04005130 if (target == BufferBinding::Uniform)
5131 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005132 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005133 mStateCache.onUniformBufferStateChange(this);
5134 }
5135 else
5136 {
5137 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005138 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005139}
5140
Jamie Madill01a80ee2016-11-07 12:06:18 -05005141void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5142{
5143 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5144 {
5145 bindReadFramebuffer(framebuffer);
5146 }
5147
5148 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5149 {
5150 bindDrawFramebuffer(framebuffer);
5151 }
5152}
5153
5154void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5155{
5156 ASSERT(target == GL_RENDERBUFFER);
5157 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005158 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005159 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005160}
5161
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005162void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005163 GLsizei samples,
5164 GLenum internalformat,
5165 GLsizei width,
5166 GLsizei height,
5167 GLboolean fixedsamplelocations)
5168{
5169 Extents size(width, height, 1);
5170 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005171 ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
5172 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005173}
5174
Olli Etuaho89664842018-08-24 14:45:36 +03005175void Context::texStorage3DMultisample(TextureType target,
5176 GLsizei samples,
5177 GLenum internalformat,
5178 GLsizei width,
5179 GLsizei height,
5180 GLsizei depth,
5181 GLboolean fixedsamplelocations)
5182{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005183 Extents size(width, height, depth);
5184 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005185 ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
5186 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005187}
5188
JiangYizhoubddc46b2016-12-09 09:50:51 +08005189void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5190{
JiangYizhou5b03f472017-01-09 10:22:53 +08005191 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5192 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005193 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005194 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005195
5196 switch (pname)
5197 {
5198 case GL_SAMPLE_POSITION:
Jamie Madill4f6592f2018-11-27 16:37:45 -05005199 ANGLE_CONTEXT_TRY(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005200 break;
5201 default:
5202 UNREACHABLE();
5203 }
5204}
5205
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005206void Context::getMultisamplefvRobust(GLenum pname,
5207 GLuint index,
5208 GLsizei bufSize,
5209 GLsizei *length,
5210 GLfloat *val)
5211{
5212 UNIMPLEMENTED();
5213}
5214
Jamie Madille8fb6402017-02-14 17:56:40 -05005215void Context::renderbufferStorage(GLenum target,
5216 GLenum internalformat,
5217 GLsizei width,
5218 GLsizei height)
5219{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005220 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5221 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5222
Jamie Madille8fb6402017-02-14 17:56:40 -05005223 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4f6592f2018-11-27 16:37:45 -05005224 ANGLE_CONTEXT_TRY(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005225}
5226
5227void Context::renderbufferStorageMultisample(GLenum target,
5228 GLsizei samples,
5229 GLenum internalformat,
5230 GLsizei width,
5231 GLsizei height)
5232{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005233 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5234 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005235
5236 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4f6592f2018-11-27 16:37:45 -05005237 ANGLE_CONTEXT_TRY(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005238 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005239}
5240
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005241void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5242{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005243 const Sync *syncObject = getSync(sync);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005244 ANGLE_CONTEXT_TRY(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005245}
5246
JiangYizhoue18e6392017-02-20 10:32:23 +08005247void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5248{
5249 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5250 QueryFramebufferParameteriv(framebuffer, pname, params);
5251}
5252
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005253void Context::getFramebufferParameterivRobust(GLenum target,
5254 GLenum pname,
5255 GLsizei bufSize,
5256 GLsizei *length,
5257 GLint *params)
5258{
5259 UNIMPLEMENTED();
5260}
5261
Jiajia Qin5451d532017-11-16 17:16:34 +08005262void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005263{
5264 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005265 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005266}
5267
Jamie Madilldec86232018-07-11 09:01:18 -04005268bool Context::getScratchBuffer(size_t requstedSizeBytes,
5269 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005270{
Jamie Madilldec86232018-07-11 09:01:18 -04005271 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005272}
5273
Jamie Madilldec86232018-07-11 09:01:18 -04005274bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5275 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005276{
Jamie Madilldec86232018-07-11 09:01:18 -04005277 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005278}
5279
Xinghua Cao2b396592017-03-29 15:36:04 +08005280void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5281{
5282 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5283 {
5284 return;
5285 }
5286
Xinghua Cao10a4d432017-11-28 14:46:26 +08005287 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill4f6592f2018-11-27 16:37:45 -05005288 ANGLE_CONTEXT_TRY(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005289}
5290
Jiajia Qin5451d532017-11-16 17:16:34 +08005291void Context::dispatchComputeIndirect(GLintptr indirect)
5292{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005293 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill4f6592f2018-11-27 16:37:45 -05005294 ANGLE_CONTEXT_TRY(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005295}
5296
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005297void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005298 GLsizei levels,
5299 GLenum internalFormat,
5300 GLsizei width,
5301 GLsizei height)
5302{
5303 Extents size(width, height, 1);
5304 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005305 ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005306}
5307
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005308void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005309 GLsizei levels,
5310 GLenum internalFormat,
5311 GLsizei width,
5312 GLsizei height,
5313 GLsizei depth)
5314{
5315 Extents size(width, height, depth);
5316 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005317 ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005318}
5319
Jiajia Qin5451d532017-11-16 17:16:34 +08005320void Context::memoryBarrier(GLbitfield barriers)
5321{
Jamie Madill4f6592f2018-11-27 16:37:45 -05005322 ANGLE_CONTEXT_TRY(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005323}
5324
5325void Context::memoryBarrierByRegion(GLbitfield barriers)
5326{
Jamie Madill4f6592f2018-11-27 16:37:45 -05005327 ANGLE_CONTEXT_TRY(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005328}
5329
Austin Eng1bf18ce2018-10-19 15:34:02 -07005330void Context::multiDrawArrays(PrimitiveMode mode,
5331 const GLint *firsts,
5332 const GLsizei *counts,
5333 GLsizei drawcount)
5334{
5335 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5336 Program *programObject = mGLState.getLinkedProgram(this);
5337 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5338 if (hasDrawID)
5339 {
5340 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5341 {
5342 if (noopDraw(mode, counts[drawID]))
5343 {
5344 continue;
5345 }
5346 programObject->setDrawIDUniform(drawID);
5347 ANGLE_CONTEXT_TRY(
5348 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005349 MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005350 }
5351 }
5352 else
5353 {
5354 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5355 {
5356 if (noopDraw(mode, counts[drawID]))
5357 {
5358 continue;
5359 }
5360 ANGLE_CONTEXT_TRY(
5361 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005362 MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005363 }
5364 }
5365}
5366
5367void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5368 const GLint *firsts,
5369 const GLsizei *counts,
5370 const GLsizei *instanceCounts,
5371 GLsizei drawcount)
5372{
5373 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5374 Program *programObject = mGLState.getLinkedProgram(this);
5375 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5376 if (hasDrawID)
5377 {
5378 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5379 {
5380 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5381 {
5382 continue;
5383 }
5384 programObject->setDrawIDUniform(drawID);
5385 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5386 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005387 MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005388 }
5389 }
5390 else
5391 {
5392 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5393 {
5394 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5395 {
5396 continue;
5397 }
5398 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5399 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005400 MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005401 }
5402 }
5403}
5404
5405void Context::multiDrawElements(PrimitiveMode mode,
5406 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05005407 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08005408 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07005409 GLsizei drawcount)
5410{
5411 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5412 Program *programObject = mGLState.getLinkedProgram(this);
5413 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5414 if (hasDrawID)
5415 {
5416 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5417 {
5418 if (noopDraw(mode, counts[drawID]))
5419 {
5420 continue;
5421 }
5422 programObject->setDrawIDUniform(drawID);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005423 ANGLE_CONTEXT_TRY(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005424 mImplementation->drawElements(this, mode, counts[drawID], type, indices[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005425 }
5426 }
5427 else
5428 {
5429 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5430 {
5431 if (noopDraw(mode, counts[drawID]))
5432 {
5433 continue;
5434 }
Austin Eng1bf18ce2018-10-19 15:34:02 -07005435 ANGLE_CONTEXT_TRY(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005436 mImplementation->drawElements(this, mode, counts[drawID], type, indices[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005437 }
5438 }
5439}
5440
5441void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5442 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05005443 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08005444 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07005445 const GLsizei *instanceCounts,
5446 GLsizei drawcount)
5447{
5448 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5449 Program *programObject = mGLState.getLinkedProgram(this);
5450 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5451 if (hasDrawID)
5452 {
5453 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5454 {
5455 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5456 {
5457 continue;
5458 }
5459 programObject->setDrawIDUniform(drawID);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005460 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005461 this, mode, counts[drawID], type, indices[drawID], instanceCounts[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005462 }
5463 }
5464 else
5465 {
5466 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5467 {
5468 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5469 {
5470 continue;
5471 }
Austin Eng1bf18ce2018-10-19 15:34:02 -07005472 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005473 this, mode, counts[drawID], type, indices[drawID], instanceCounts[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005474 }
5475 }
5476}
5477
Jamie Madillc1d770e2017-04-13 17:31:24 -04005478GLenum Context::checkFramebufferStatus(GLenum target)
5479{
5480 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5481 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005482 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005483}
5484
5485void Context::compileShader(GLuint shader)
5486{
5487 Shader *shaderObject = GetValidShader(this, shader);
5488 if (!shaderObject)
5489 {
5490 return;
5491 }
5492 shaderObject->compile(this);
5493}
5494
5495void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5496{
5497 for (int i = 0; i < n; i++)
5498 {
5499 deleteBuffer(buffers[i]);
5500 }
5501}
5502
5503void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5504{
5505 for (int i = 0; i < n; i++)
5506 {
5507 if (framebuffers[i] != 0)
5508 {
5509 deleteFramebuffer(framebuffers[i]);
5510 }
5511 }
5512}
5513
5514void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5515{
5516 for (int i = 0; i < n; i++)
5517 {
5518 deleteRenderbuffer(renderbuffers[i]);
5519 }
5520}
5521
5522void Context::deleteTextures(GLsizei n, const GLuint *textures)
5523{
5524 for (int i = 0; i < n; i++)
5525 {
5526 if (textures[i] != 0)
5527 {
5528 deleteTexture(textures[i]);
5529 }
5530 }
5531}
5532
5533void Context::detachShader(GLuint program, GLuint shader)
5534{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005535 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005536 ASSERT(programObject);
5537
5538 Shader *shaderObject = getShader(shader);
5539 ASSERT(shaderObject);
5540
5541 programObject->detachShader(this, shaderObject);
5542}
5543
5544void Context::genBuffers(GLsizei n, GLuint *buffers)
5545{
5546 for (int i = 0; i < n; i++)
5547 {
5548 buffers[i] = createBuffer();
5549 }
5550}
5551
5552void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5553{
5554 for (int i = 0; i < n; i++)
5555 {
5556 framebuffers[i] = createFramebuffer();
5557 }
5558}
5559
5560void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5561{
5562 for (int i = 0; i < n; i++)
5563 {
5564 renderbuffers[i] = createRenderbuffer();
5565 }
5566}
5567
5568void Context::genTextures(GLsizei n, GLuint *textures)
5569{
5570 for (int i = 0; i < n; i++)
5571 {
5572 textures[i] = createTexture();
5573 }
5574}
5575
5576void Context::getActiveAttrib(GLuint program,
5577 GLuint index,
5578 GLsizei bufsize,
5579 GLsizei *length,
5580 GLint *size,
5581 GLenum *type,
5582 GLchar *name)
5583{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005584 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005585 ASSERT(programObject);
5586 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5587}
5588
5589void Context::getActiveUniform(GLuint program,
5590 GLuint index,
5591 GLsizei bufsize,
5592 GLsizei *length,
5593 GLint *size,
5594 GLenum *type,
5595 GLchar *name)
5596{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005597 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005598 ASSERT(programObject);
5599 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5600}
5601
5602void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5603{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005604 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005605 ASSERT(programObject);
5606 programObject->getAttachedShaders(maxcount, count, shaders);
5607}
5608
5609GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5610{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005611 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005612 ASSERT(programObject);
5613 return programObject->getAttributeLocation(name);
5614}
5615
5616void Context::getBooleanv(GLenum pname, GLboolean *params)
5617{
5618 GLenum nativeType;
5619 unsigned int numParams = 0;
5620 getQueryParameterInfo(pname, &nativeType, &numParams);
5621
5622 if (nativeType == GL_BOOL)
5623 {
5624 getBooleanvImpl(pname, params);
5625 }
5626 else
5627 {
5628 CastStateValues(this, nativeType, pname, numParams, params);
5629 }
5630}
5631
Brandon Jones59770802018-04-02 13:18:42 -07005632void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5633{
5634 getBooleanv(pname, params);
5635}
5636
Jamie Madillc1d770e2017-04-13 17:31:24 -04005637void Context::getFloatv(GLenum pname, GLfloat *params)
5638{
5639 GLenum nativeType;
5640 unsigned int numParams = 0;
5641 getQueryParameterInfo(pname, &nativeType, &numParams);
5642
5643 if (nativeType == GL_FLOAT)
5644 {
5645 getFloatvImpl(pname, params);
5646 }
5647 else
5648 {
5649 CastStateValues(this, nativeType, pname, numParams, params);
5650 }
5651}
5652
Brandon Jones59770802018-04-02 13:18:42 -07005653void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5654{
5655 getFloatv(pname, params);
5656}
5657
Jamie Madillc1d770e2017-04-13 17:31:24 -04005658void Context::getIntegerv(GLenum pname, GLint *params)
5659{
5660 GLenum nativeType;
5661 unsigned int numParams = 0;
5662 getQueryParameterInfo(pname, &nativeType, &numParams);
5663
5664 if (nativeType == GL_INT)
5665 {
5666 getIntegervImpl(pname, params);
5667 }
5668 else
5669 {
5670 CastStateValues(this, nativeType, pname, numParams, params);
5671 }
5672}
5673
Brandon Jones59770802018-04-02 13:18:42 -07005674void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5675{
5676 getIntegerv(pname, data);
5677}
5678
Jamie Madillc1d770e2017-04-13 17:31:24 -04005679void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5680{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005681 // Don't resolve link if checking the link completion status.
5682 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5683 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005684 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005685 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005686}
5687
Brandon Jones59770802018-04-02 13:18:42 -07005688void Context::getProgramivRobust(GLuint program,
5689 GLenum pname,
5690 GLsizei bufSize,
5691 GLsizei *length,
5692 GLint *params)
5693{
5694 getProgramiv(program, pname, params);
5695}
5696
Jiajia Qin5451d532017-11-16 17:16:34 +08005697void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5698{
5699 UNIMPLEMENTED();
5700}
5701
Jamie Madillbe849e42017-05-02 15:49:00 -04005702void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005703{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005704 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005705 ASSERT(programObject);
5706 programObject->getInfoLog(bufsize, length, infolog);
5707}
5708
Jiajia Qin5451d532017-11-16 17:16:34 +08005709void Context::getProgramPipelineInfoLog(GLuint pipeline,
5710 GLsizei bufSize,
5711 GLsizei *length,
5712 GLchar *infoLog)
5713{
5714 UNIMPLEMENTED();
5715}
5716
Jamie Madillc1d770e2017-04-13 17:31:24 -04005717void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5718{
5719 Shader *shaderObject = getShader(shader);
5720 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005721 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005722}
5723
Brandon Jones59770802018-04-02 13:18:42 -07005724void Context::getShaderivRobust(GLuint shader,
5725 GLenum pname,
5726 GLsizei bufSize,
5727 GLsizei *length,
5728 GLint *params)
5729{
5730 getShaderiv(shader, pname, params);
5731}
5732
Jamie Madillc1d770e2017-04-13 17:31:24 -04005733void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5734{
5735 Shader *shaderObject = getShader(shader);
5736 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005737 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005738}
5739
5740void Context::getShaderPrecisionFormat(GLenum shadertype,
5741 GLenum precisiontype,
5742 GLint *range,
5743 GLint *precision)
5744{
5745 // TODO(jmadill): Compute shaders.
5746
5747 switch (shadertype)
5748 {
5749 case GL_VERTEX_SHADER:
5750 switch (precisiontype)
5751 {
5752 case GL_LOW_FLOAT:
5753 mCaps.vertexLowpFloat.get(range, precision);
5754 break;
5755 case GL_MEDIUM_FLOAT:
5756 mCaps.vertexMediumpFloat.get(range, precision);
5757 break;
5758 case GL_HIGH_FLOAT:
5759 mCaps.vertexHighpFloat.get(range, precision);
5760 break;
5761
5762 case GL_LOW_INT:
5763 mCaps.vertexLowpInt.get(range, precision);
5764 break;
5765 case GL_MEDIUM_INT:
5766 mCaps.vertexMediumpInt.get(range, precision);
5767 break;
5768 case GL_HIGH_INT:
5769 mCaps.vertexHighpInt.get(range, precision);
5770 break;
5771
5772 default:
5773 UNREACHABLE();
5774 return;
5775 }
5776 break;
5777
5778 case GL_FRAGMENT_SHADER:
5779 switch (precisiontype)
5780 {
5781 case GL_LOW_FLOAT:
5782 mCaps.fragmentLowpFloat.get(range, precision);
5783 break;
5784 case GL_MEDIUM_FLOAT:
5785 mCaps.fragmentMediumpFloat.get(range, precision);
5786 break;
5787 case GL_HIGH_FLOAT:
5788 mCaps.fragmentHighpFloat.get(range, precision);
5789 break;
5790
5791 case GL_LOW_INT:
5792 mCaps.fragmentLowpInt.get(range, precision);
5793 break;
5794 case GL_MEDIUM_INT:
5795 mCaps.fragmentMediumpInt.get(range, precision);
5796 break;
5797 case GL_HIGH_INT:
5798 mCaps.fragmentHighpInt.get(range, precision);
5799 break;
5800
5801 default:
5802 UNREACHABLE();
5803 return;
5804 }
5805 break;
5806
5807 default:
5808 UNREACHABLE();
5809 return;
5810 }
5811}
5812
5813void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5814{
5815 Shader *shaderObject = getShader(shader);
5816 ASSERT(shaderObject);
5817 shaderObject->getSource(bufsize, length, source);
5818}
5819
5820void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5821{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005822 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005823 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005824 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005825}
5826
Brandon Jones59770802018-04-02 13:18:42 -07005827void Context::getUniformfvRobust(GLuint program,
5828 GLint location,
5829 GLsizei bufSize,
5830 GLsizei *length,
5831 GLfloat *params)
5832{
5833 getUniformfv(program, location, params);
5834}
5835
Jamie Madillc1d770e2017-04-13 17:31:24 -04005836void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5837{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005838 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005839 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005840 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005841}
5842
Brandon Jones59770802018-04-02 13:18:42 -07005843void Context::getUniformivRobust(GLuint program,
5844 GLint location,
5845 GLsizei bufSize,
5846 GLsizei *length,
5847 GLint *params)
5848{
5849 getUniformiv(program, location, params);
5850}
5851
Jamie Madillc1d770e2017-04-13 17:31:24 -04005852GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5853{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005854 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005855 ASSERT(programObject);
5856 return programObject->getUniformLocation(name);
5857}
5858
5859GLboolean Context::isBuffer(GLuint buffer)
5860{
5861 if (buffer == 0)
5862 {
5863 return GL_FALSE;
5864 }
5865
5866 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5867}
5868
5869GLboolean Context::isEnabled(GLenum cap)
5870{
5871 return mGLState.getEnableFeature(cap);
5872}
5873
5874GLboolean Context::isFramebuffer(GLuint framebuffer)
5875{
5876 if (framebuffer == 0)
5877 {
5878 return GL_FALSE;
5879 }
5880
5881 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5882}
5883
5884GLboolean Context::isProgram(GLuint program)
5885{
5886 if (program == 0)
5887 {
5888 return GL_FALSE;
5889 }
5890
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005891 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005892}
5893
5894GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5895{
5896 if (renderbuffer == 0)
5897 {
5898 return GL_FALSE;
5899 }
5900
5901 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5902}
5903
5904GLboolean Context::isShader(GLuint shader)
5905{
5906 if (shader == 0)
5907 {
5908 return GL_FALSE;
5909 }
5910
5911 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5912}
5913
5914GLboolean Context::isTexture(GLuint texture)
5915{
5916 if (texture == 0)
5917 {
5918 return GL_FALSE;
5919 }
5920
5921 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5922}
5923
5924void Context::linkProgram(GLuint program)
5925{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005926 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005927 ASSERT(programObject);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005928 ANGLE_CONTEXT_TRY(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005929
5930 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5931 // don't need to worry that:
5932 // 1. Draw calls after link use the new executable code or the old one depending on the link
5933 // result.
5934 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5935 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5936 // ProgramD3D.
5937 if (programObject->isInUse())
5938 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005939 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005940 if (programObject->isLinked())
5941 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005942 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005943 }
jchen107ae70d82018-07-06 13:47:01 +08005944 mStateCache.onProgramExecutableChange(this);
5945 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005946}
5947
5948void Context::releaseShaderCompiler()
5949{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005950 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005951}
5952
5953void Context::shaderBinary(GLsizei n,
5954 const GLuint *shaders,
5955 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005956 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005957 GLsizei length)
5958{
5959 // No binary shader formats are supported.
5960 UNIMPLEMENTED();
5961}
5962
Olli Etuaho0ca09752018-09-24 11:00:50 +03005963void Context::bindFragDataLocationIndexed(GLuint program,
5964 GLuint colorNumber,
5965 GLuint index,
5966 const char *name)
5967{
5968 Program *programObject = getProgramNoResolveLink(program);
5969 programObject->bindFragmentOutputLocation(colorNumber, name);
5970 programObject->bindFragmentOutputIndex(index, name);
5971}
5972
5973void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5974{
5975 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5976}
5977
5978int Context::getFragDataIndex(GLuint program, const char *name)
5979{
5980 Program *programObject = getProgramResolveLink(program);
5981 return programObject->getFragDataIndex(name);
5982}
5983
5984int Context::getProgramResourceLocationIndex(GLuint program,
5985 GLenum programInterface,
5986 const char *name)
5987{
5988 Program *programObject = getProgramResolveLink(program);
5989 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5990 return programObject->getFragDataIndex(name);
5991}
5992
Jamie Madillc1d770e2017-04-13 17:31:24 -04005993void Context::shaderSource(GLuint shader,
5994 GLsizei count,
5995 const GLchar *const *string,
5996 const GLint *length)
5997{
5998 Shader *shaderObject = getShader(shader);
5999 ASSERT(shaderObject);
6000 shaderObject->setSource(count, string, length);
6001}
6002
6003void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6004{
6005 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6006}
6007
6008void Context::stencilMask(GLuint mask)
6009{
6010 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6011}
6012
6013void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6014{
6015 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6016}
6017
6018void Context::uniform1f(GLint location, GLfloat x)
6019{
6020 Program *program = mGLState.getProgram();
6021 program->setUniform1fv(location, 1, &x);
6022}
6023
6024void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6025{
6026 Program *program = mGLState.getProgram();
6027 program->setUniform1fv(location, count, v);
6028}
6029
Jamie Madill7e4eff12018-08-08 15:49:26 -04006030void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006031{
Jamie Madille3e680c2018-12-03 17:49:08 -05006032 program->setUniform1iv(this, location, count, v);
6033}
6034
6035void Context::onSamplerUniformChange(size_t textureUnitIndex)
6036{
6037 mGLState.onActiveTextureChange(this, textureUnitIndex);
6038 mStateCache.onActiveTextureChange(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006039}
6040
Jamie Madill7e4eff12018-08-08 15:49:26 -04006041void Context::uniform1i(GLint location, GLint x)
6042{
6043 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6044}
6045
Jamie Madillc1d770e2017-04-13 17:31:24 -04006046void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6047{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006048 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006049}
6050
6051void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6052{
6053 GLfloat xy[2] = {x, y};
6054 Program *program = mGLState.getProgram();
6055 program->setUniform2fv(location, 1, xy);
6056}
6057
6058void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6059{
6060 Program *program = mGLState.getProgram();
6061 program->setUniform2fv(location, count, v);
6062}
6063
6064void Context::uniform2i(GLint location, GLint x, GLint y)
6065{
6066 GLint xy[2] = {x, y};
6067 Program *program = mGLState.getProgram();
6068 program->setUniform2iv(location, 1, xy);
6069}
6070
6071void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6072{
6073 Program *program = mGLState.getProgram();
6074 program->setUniform2iv(location, count, v);
6075}
6076
6077void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6078{
6079 GLfloat xyz[3] = {x, y, z};
6080 Program *program = mGLState.getProgram();
6081 program->setUniform3fv(location, 1, xyz);
6082}
6083
6084void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6085{
6086 Program *program = mGLState.getProgram();
6087 program->setUniform3fv(location, count, v);
6088}
6089
6090void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6091{
6092 GLint xyz[3] = {x, y, z};
6093 Program *program = mGLState.getProgram();
6094 program->setUniform3iv(location, 1, xyz);
6095}
6096
6097void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6098{
6099 Program *program = mGLState.getProgram();
6100 program->setUniform3iv(location, count, v);
6101}
6102
6103void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6104{
6105 GLfloat xyzw[4] = {x, y, z, w};
6106 Program *program = mGLState.getProgram();
6107 program->setUniform4fv(location, 1, xyzw);
6108}
6109
6110void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6111{
6112 Program *program = mGLState.getProgram();
6113 program->setUniform4fv(location, count, v);
6114}
6115
6116void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6117{
6118 GLint xyzw[4] = {x, y, z, w};
6119 Program *program = mGLState.getProgram();
6120 program->setUniform4iv(location, 1, xyzw);
6121}
6122
6123void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6124{
6125 Program *program = mGLState.getProgram();
6126 program->setUniform4iv(location, count, v);
6127}
6128
6129void Context::uniformMatrix2fv(GLint location,
6130 GLsizei count,
6131 GLboolean transpose,
6132 const GLfloat *value)
6133{
6134 Program *program = mGLState.getProgram();
6135 program->setUniformMatrix2fv(location, count, transpose, value);
6136}
6137
6138void Context::uniformMatrix3fv(GLint location,
6139 GLsizei count,
6140 GLboolean transpose,
6141 const GLfloat *value)
6142{
6143 Program *program = mGLState.getProgram();
6144 program->setUniformMatrix3fv(location, count, transpose, value);
6145}
6146
6147void Context::uniformMatrix4fv(GLint location,
6148 GLsizei count,
6149 GLboolean transpose,
6150 const GLfloat *value)
6151{
6152 Program *program = mGLState.getProgram();
6153 program->setUniformMatrix4fv(location, count, transpose, value);
6154}
6155
6156void Context::validateProgram(GLuint program)
6157{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006158 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006159 ASSERT(programObject);
6160 programObject->validate(mCaps);
6161}
6162
Jiajia Qin5451d532017-11-16 17:16:34 +08006163void Context::validateProgramPipeline(GLuint pipeline)
6164{
6165 UNIMPLEMENTED();
6166}
6167
Jamie Madilld04908b2017-06-09 14:15:35 -04006168void Context::getProgramBinary(GLuint program,
6169 GLsizei bufSize,
6170 GLsizei *length,
6171 GLenum *binaryFormat,
6172 void *binary)
6173{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006174 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006175 ASSERT(programObject != nullptr);
6176
Jamie Madill4f6592f2018-11-27 16:37:45 -05006177 ANGLE_CONTEXT_TRY(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
Jamie Madilld04908b2017-06-09 14:15:35 -04006178}
6179
6180void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6181{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006182 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006183 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006184
Jamie Madill4f6592f2018-11-27 16:37:45 -05006185 ANGLE_CONTEXT_TRY(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006186 if (programObject->isInUse())
6187 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006188 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006189 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006190 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006191}
6192
Jamie Madillff325f12017-08-26 15:06:05 -04006193void Context::uniform1ui(GLint location, GLuint v0)
6194{
6195 Program *program = mGLState.getProgram();
6196 program->setUniform1uiv(location, 1, &v0);
6197}
6198
6199void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6200{
6201 Program *program = mGLState.getProgram();
6202 const GLuint xy[] = {v0, v1};
6203 program->setUniform2uiv(location, 1, xy);
6204}
6205
6206void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6207{
6208 Program *program = mGLState.getProgram();
6209 const GLuint xyz[] = {v0, v1, v2};
6210 program->setUniform3uiv(location, 1, xyz);
6211}
6212
6213void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6214{
6215 Program *program = mGLState.getProgram();
6216 const GLuint xyzw[] = {v0, v1, v2, v3};
6217 program->setUniform4uiv(location, 1, xyzw);
6218}
6219
6220void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6221{
6222 Program *program = mGLState.getProgram();
6223 program->setUniform1uiv(location, count, value);
6224}
6225void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6226{
6227 Program *program = mGLState.getProgram();
6228 program->setUniform2uiv(location, count, value);
6229}
6230
6231void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6232{
6233 Program *program = mGLState.getProgram();
6234 program->setUniform3uiv(location, count, value);
6235}
6236
6237void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6238{
6239 Program *program = mGLState.getProgram();
6240 program->setUniform4uiv(location, count, value);
6241}
6242
Jamie Madillf0e04492017-08-26 15:28:42 -04006243void Context::genQueries(GLsizei n, GLuint *ids)
6244{
6245 for (GLsizei i = 0; i < n; i++)
6246 {
6247 GLuint handle = mQueryHandleAllocator.allocate();
6248 mQueryMap.assign(handle, nullptr);
6249 ids[i] = handle;
6250 }
6251}
6252
6253void Context::deleteQueries(GLsizei n, const GLuint *ids)
6254{
6255 for (int i = 0; i < n; i++)
6256 {
6257 GLuint query = ids[i];
6258
6259 Query *queryObject = nullptr;
6260 if (mQueryMap.erase(query, &queryObject))
6261 {
6262 mQueryHandleAllocator.release(query);
6263 if (queryObject)
6264 {
6265 queryObject->release(this);
6266 }
6267 }
6268 }
6269}
6270
6271GLboolean Context::isQuery(GLuint id)
6272{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006273 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006274}
6275
Jamie Madillc8c95812017-08-26 18:40:09 -04006276void Context::uniformMatrix2x3fv(GLint location,
6277 GLsizei count,
6278 GLboolean transpose,
6279 const GLfloat *value)
6280{
6281 Program *program = mGLState.getProgram();
6282 program->setUniformMatrix2x3fv(location, count, transpose, value);
6283}
6284
6285void Context::uniformMatrix3x2fv(GLint location,
6286 GLsizei count,
6287 GLboolean transpose,
6288 const GLfloat *value)
6289{
6290 Program *program = mGLState.getProgram();
6291 program->setUniformMatrix3x2fv(location, count, transpose, value);
6292}
6293
6294void Context::uniformMatrix2x4fv(GLint location,
6295 GLsizei count,
6296 GLboolean transpose,
6297 const GLfloat *value)
6298{
6299 Program *program = mGLState.getProgram();
6300 program->setUniformMatrix2x4fv(location, count, transpose, value);
6301}
6302
6303void Context::uniformMatrix4x2fv(GLint location,
6304 GLsizei count,
6305 GLboolean transpose,
6306 const GLfloat *value)
6307{
6308 Program *program = mGLState.getProgram();
6309 program->setUniformMatrix4x2fv(location, count, transpose, value);
6310}
6311
6312void Context::uniformMatrix3x4fv(GLint location,
6313 GLsizei count,
6314 GLboolean transpose,
6315 const GLfloat *value)
6316{
6317 Program *program = mGLState.getProgram();
6318 program->setUniformMatrix3x4fv(location, count, transpose, value);
6319}
6320
6321void Context::uniformMatrix4x3fv(GLint location,
6322 GLsizei count,
6323 GLboolean transpose,
6324 const GLfloat *value)
6325{
6326 Program *program = mGLState.getProgram();
6327 program->setUniformMatrix4x3fv(location, count, transpose, value);
6328}
6329
Jamie Madilld7576732017-08-26 18:49:50 -04006330void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6331{
6332 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6333 {
6334 GLuint vertexArray = arrays[arrayIndex];
6335
6336 if (arrays[arrayIndex] != 0)
6337 {
6338 VertexArray *vertexArrayObject = nullptr;
6339 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6340 {
6341 if (vertexArrayObject != nullptr)
6342 {
6343 detachVertexArray(vertexArray);
6344 vertexArrayObject->onDestroy(this);
6345 }
6346
6347 mVertexArrayHandleAllocator.release(vertexArray);
6348 }
6349 }
6350 }
6351}
6352
6353void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6354{
6355 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6356 {
6357 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6358 mVertexArrayMap.assign(vertexArray, nullptr);
6359 arrays[arrayIndex] = vertexArray;
6360 }
6361}
6362
6363bool Context::isVertexArray(GLuint array)
6364{
6365 if (array == 0)
6366 {
6367 return GL_FALSE;
6368 }
6369
6370 VertexArray *vao = getVertexArray(array);
6371 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6372}
6373
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006374void Context::endTransformFeedback()
6375{
6376 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006377 ANGLE_CONTEXT_TRY(transformFeedback->end(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006378 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006379}
6380
6381void Context::transformFeedbackVaryings(GLuint program,
6382 GLsizei count,
6383 const GLchar *const *varyings,
6384 GLenum bufferMode)
6385{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006386 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006387 ASSERT(programObject);
6388 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6389}
6390
6391void Context::getTransformFeedbackVarying(GLuint program,
6392 GLuint index,
6393 GLsizei bufSize,
6394 GLsizei *length,
6395 GLsizei *size,
6396 GLenum *type,
6397 GLchar *name)
6398{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006399 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006400 ASSERT(programObject);
6401 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6402}
6403
6404void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6405{
6406 for (int i = 0; i < n; i++)
6407 {
6408 GLuint transformFeedback = ids[i];
6409 if (transformFeedback == 0)
6410 {
6411 continue;
6412 }
6413
6414 TransformFeedback *transformFeedbackObject = nullptr;
6415 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6416 {
6417 if (transformFeedbackObject != nullptr)
6418 {
6419 detachTransformFeedback(transformFeedback);
6420 transformFeedbackObject->release(this);
6421 }
6422
6423 mTransformFeedbackHandleAllocator.release(transformFeedback);
6424 }
6425 }
6426}
6427
6428void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6429{
6430 for (int i = 0; i < n; i++)
6431 {
6432 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6433 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6434 ids[i] = transformFeedback;
6435 }
6436}
6437
6438bool Context::isTransformFeedback(GLuint id)
6439{
6440 if (id == 0)
6441 {
6442 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6443 // returns FALSE
6444 return GL_FALSE;
6445 }
6446
6447 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6448 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6449}
6450
6451void Context::pauseTransformFeedback()
6452{
6453 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006454 ANGLE_CONTEXT_TRY(transformFeedback->pause(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006455 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006456}
6457
6458void Context::resumeTransformFeedback()
6459{
6460 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006461 ANGLE_CONTEXT_TRY(transformFeedback->resume(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006462 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006463}
6464
Jamie Madill12e957f2017-08-26 21:42:26 -04006465void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6466{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006467 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006468 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006469}
6470
Brandon Jones59770802018-04-02 13:18:42 -07006471void Context::getUniformuivRobust(GLuint program,
6472 GLint location,
6473 GLsizei bufSize,
6474 GLsizei *length,
6475 GLuint *params)
6476{
6477 getUniformuiv(program, location, params);
6478}
6479
Jamie Madill12e957f2017-08-26 21:42:26 -04006480GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6481{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006482 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006483 return programObject->getFragDataLocation(name);
6484}
6485
6486void Context::getUniformIndices(GLuint program,
6487 GLsizei uniformCount,
6488 const GLchar *const *uniformNames,
6489 GLuint *uniformIndices)
6490{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006491 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006492 if (!programObject->isLinked())
6493 {
6494 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6495 {
6496 uniformIndices[uniformId] = GL_INVALID_INDEX;
6497 }
6498 }
6499 else
6500 {
6501 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6502 {
6503 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6504 }
6505 }
6506}
6507
6508void Context::getActiveUniformsiv(GLuint program,
6509 GLsizei uniformCount,
6510 const GLuint *uniformIndices,
6511 GLenum pname,
6512 GLint *params)
6513{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006514 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006515 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6516 {
6517 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006518 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006519 }
6520}
6521
6522GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6523{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006524 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006525 return programObject->getUniformBlockIndex(uniformBlockName);
6526}
6527
6528void Context::getActiveUniformBlockiv(GLuint program,
6529 GLuint uniformBlockIndex,
6530 GLenum pname,
6531 GLint *params)
6532{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006533 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006534 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6535}
6536
Brandon Jones59770802018-04-02 13:18:42 -07006537void Context::getActiveUniformBlockivRobust(GLuint program,
6538 GLuint uniformBlockIndex,
6539 GLenum pname,
6540 GLsizei bufSize,
6541 GLsizei *length,
6542 GLint *params)
6543{
6544 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6545}
6546
Jamie Madill12e957f2017-08-26 21:42:26 -04006547void Context::getActiveUniformBlockName(GLuint program,
6548 GLuint uniformBlockIndex,
6549 GLsizei bufSize,
6550 GLsizei *length,
6551 GLchar *uniformBlockName)
6552{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006553 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006554 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6555}
6556
6557void Context::uniformBlockBinding(GLuint program,
6558 GLuint uniformBlockIndex,
6559 GLuint uniformBlockBinding)
6560{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006561 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006562 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006563
Jamie Madill956ab4d2018-10-10 16:13:03 -04006564 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006565 if (programObject->isInUse())
6566 {
6567 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006568 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006569 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006570}
6571
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006572GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6573{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006574 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6575 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006576
Jamie Madill70b5bb02017-08-28 13:32:37 -04006577 Sync *syncObject = getSync(syncHandle);
Jamie Madill7c985f52018-11-29 18:16:17 -05006578 if (syncObject->set(this, condition, flags) == angle::Result::Stop)
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006579 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006580 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006581 return nullptr;
6582 }
6583
Jamie Madill70b5bb02017-08-28 13:32:37 -04006584 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006585}
6586
6587GLboolean Context::isSync(GLsync sync)
6588{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006589 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006590}
6591
6592GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6593{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006594 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006595
6596 GLenum result = GL_WAIT_FAILED;
Jamie Madill7c985f52018-11-29 18:16:17 -05006597 if (syncObject->clientWait(this, flags, timeout, &result) == angle::Result::Stop)
Jamie Madill4f6592f2018-11-27 16:37:45 -05006598 {
6599 return GL_WAIT_FAILED;
6600 }
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006601 return result;
6602}
6603
6604void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6605{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006606 Sync *syncObject = getSync(sync);
Jamie Madill4f6592f2018-11-27 16:37:45 -05006607 ANGLE_CONTEXT_TRY(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006608}
6609
6610void Context::getInteger64v(GLenum pname, GLint64 *params)
6611{
6612 GLenum nativeType = GL_NONE;
6613 unsigned int numParams = 0;
6614 getQueryParameterInfo(pname, &nativeType, &numParams);
6615
6616 if (nativeType == GL_INT_64_ANGLEX)
6617 {
6618 getInteger64vImpl(pname, params);
6619 }
6620 else
6621 {
6622 CastStateValues(this, nativeType, pname, numParams, params);
6623 }
6624}
6625
Brandon Jones59770802018-04-02 13:18:42 -07006626void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6627{
6628 getInteger64v(pname, data);
6629}
6630
Corentin Wallez336129f2017-10-17 15:55:40 -04006631void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006632{
6633 Buffer *buffer = mGLState.getTargetBuffer(target);
6634 QueryBufferParameteri64v(buffer, pname, params);
6635}
6636
Brandon Jones59770802018-04-02 13:18:42 -07006637void Context::getBufferParameteri64vRobust(BufferBinding target,
6638 GLenum pname,
6639 GLsizei bufSize,
6640 GLsizei *length,
6641 GLint64 *params)
6642{
6643 getBufferParameteri64v(target, pname, params);
6644}
6645
Jamie Madill3ef140a2017-08-26 23:11:21 -04006646void Context::genSamplers(GLsizei count, GLuint *samplers)
6647{
6648 for (int i = 0; i < count; i++)
6649 {
6650 samplers[i] = mState.mSamplers->createSampler();
6651 }
6652}
6653
6654void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6655{
6656 for (int i = 0; i < count; i++)
6657 {
6658 GLuint sampler = samplers[i];
6659
6660 if (mState.mSamplers->getSampler(sampler))
6661 {
6662 detachSampler(sampler);
6663 }
6664
6665 mState.mSamplers->deleteObject(this, sampler);
6666 }
6667}
6668
6669void Context::getInternalformativ(GLenum target,
6670 GLenum internalformat,
6671 GLenum pname,
6672 GLsizei bufSize,
6673 GLint *params)
6674{
6675 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6676 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6677}
6678
Brandon Jones59770802018-04-02 13:18:42 -07006679void Context::getInternalformativRobust(GLenum target,
6680 GLenum internalformat,
6681 GLenum pname,
6682 GLsizei bufSize,
6683 GLsizei *length,
6684 GLint *params)
6685{
6686 getInternalformativ(target, internalformat, pname, bufSize, params);
6687}
6688
Jiajia Qin5451d532017-11-16 17:16:34 +08006689void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6690{
6691 programUniform1iv(program, location, 1, &v0);
6692}
6693
6694void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6695{
6696 GLint xy[2] = {v0, v1};
6697 programUniform2iv(program, location, 1, xy);
6698}
6699
6700void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6701{
6702 GLint xyz[3] = {v0, v1, v2};
6703 programUniform3iv(program, location, 1, xyz);
6704}
6705
6706void Context::programUniform4i(GLuint program,
6707 GLint location,
6708 GLint v0,
6709 GLint v1,
6710 GLint v2,
6711 GLint v3)
6712{
6713 GLint xyzw[4] = {v0, v1, v2, v3};
6714 programUniform4iv(program, location, 1, xyzw);
6715}
6716
6717void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6718{
6719 programUniform1uiv(program, location, 1, &v0);
6720}
6721
6722void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6723{
6724 GLuint xy[2] = {v0, v1};
6725 programUniform2uiv(program, location, 1, xy);
6726}
6727
6728void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6729{
6730 GLuint xyz[3] = {v0, v1, v2};
6731 programUniform3uiv(program, location, 1, xyz);
6732}
6733
6734void Context::programUniform4ui(GLuint program,
6735 GLint location,
6736 GLuint v0,
6737 GLuint v1,
6738 GLuint v2,
6739 GLuint v3)
6740{
6741 GLuint xyzw[4] = {v0, v1, v2, v3};
6742 programUniform4uiv(program, location, 1, xyzw);
6743}
6744
6745void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6746{
6747 programUniform1fv(program, location, 1, &v0);
6748}
6749
6750void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6751{
6752 GLfloat xy[2] = {v0, v1};
6753 programUniform2fv(program, location, 1, xy);
6754}
6755
6756void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6757{
6758 GLfloat xyz[3] = {v0, v1, v2};
6759 programUniform3fv(program, location, 1, xyz);
6760}
6761
6762void Context::programUniform4f(GLuint program,
6763 GLint location,
6764 GLfloat v0,
6765 GLfloat v1,
6766 GLfloat v2,
6767 GLfloat v3)
6768{
6769 GLfloat xyzw[4] = {v0, v1, v2, v3};
6770 programUniform4fv(program, location, 1, xyzw);
6771}
6772
Jamie Madill81c2e252017-09-09 23:32:46 -04006773void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6774{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006775 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006776 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006777 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006778}
6779
Jiajia Qin5451d532017-11-16 17:16:34 +08006780void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6781{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006782 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006783 ASSERT(programObject);
6784 programObject->setUniform2iv(location, count, value);
6785}
6786
6787void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6788{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006789 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006790 ASSERT(programObject);
6791 programObject->setUniform3iv(location, count, value);
6792}
6793
6794void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6795{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006796 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006797 ASSERT(programObject);
6798 programObject->setUniform4iv(location, count, value);
6799}
6800
6801void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6802{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006803 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006804 ASSERT(programObject);
6805 programObject->setUniform1uiv(location, count, value);
6806}
6807
6808void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6809{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006810 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006811 ASSERT(programObject);
6812 programObject->setUniform2uiv(location, count, value);
6813}
6814
6815void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6816{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006817 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006818 ASSERT(programObject);
6819 programObject->setUniform3uiv(location, count, value);
6820}
6821
6822void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6823{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006824 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006825 ASSERT(programObject);
6826 programObject->setUniform4uiv(location, count, value);
6827}
6828
6829void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6830{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006831 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006832 ASSERT(programObject);
6833 programObject->setUniform1fv(location, count, value);
6834}
6835
6836void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6837{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006838 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006839 ASSERT(programObject);
6840 programObject->setUniform2fv(location, count, value);
6841}
6842
6843void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6844{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006845 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006846 ASSERT(programObject);
6847 programObject->setUniform3fv(location, count, value);
6848}
6849
6850void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6851{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006852 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006853 ASSERT(programObject);
6854 programObject->setUniform4fv(location, count, value);
6855}
6856
6857void Context::programUniformMatrix2fv(GLuint program,
6858 GLint location,
6859 GLsizei count,
6860 GLboolean transpose,
6861 const GLfloat *value)
6862{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006863 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006864 ASSERT(programObject);
6865 programObject->setUniformMatrix2fv(location, count, transpose, value);
6866}
6867
6868void Context::programUniformMatrix3fv(GLuint program,
6869 GLint location,
6870 GLsizei count,
6871 GLboolean transpose,
6872 const GLfloat *value)
6873{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006874 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006875 ASSERT(programObject);
6876 programObject->setUniformMatrix3fv(location, count, transpose, value);
6877}
6878
6879void Context::programUniformMatrix4fv(GLuint program,
6880 GLint location,
6881 GLsizei count,
6882 GLboolean transpose,
6883 const GLfloat *value)
6884{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006885 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006886 ASSERT(programObject);
6887 programObject->setUniformMatrix4fv(location, count, transpose, value);
6888}
6889
6890void Context::programUniformMatrix2x3fv(GLuint program,
6891 GLint location,
6892 GLsizei count,
6893 GLboolean transpose,
6894 const GLfloat *value)
6895{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006896 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006897 ASSERT(programObject);
6898 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6899}
6900
6901void Context::programUniformMatrix3x2fv(GLuint program,
6902 GLint location,
6903 GLsizei count,
6904 GLboolean transpose,
6905 const GLfloat *value)
6906{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006907 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006908 ASSERT(programObject);
6909 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6910}
6911
6912void Context::programUniformMatrix2x4fv(GLuint program,
6913 GLint location,
6914 GLsizei count,
6915 GLboolean transpose,
6916 const GLfloat *value)
6917{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006918 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006919 ASSERT(programObject);
6920 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6921}
6922
6923void Context::programUniformMatrix4x2fv(GLuint program,
6924 GLint location,
6925 GLsizei count,
6926 GLboolean transpose,
6927 const GLfloat *value)
6928{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006929 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006930 ASSERT(programObject);
6931 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6932}
6933
6934void Context::programUniformMatrix3x4fv(GLuint program,
6935 GLint location,
6936 GLsizei count,
6937 GLboolean transpose,
6938 const GLfloat *value)
6939{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006940 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006941 ASSERT(programObject);
6942 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6943}
6944
6945void Context::programUniformMatrix4x3fv(GLuint program,
6946 GLint location,
6947 GLsizei count,
6948 GLboolean transpose,
6949 const GLfloat *value)
6950{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006951 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006952 ASSERT(programObject);
6953 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6954}
6955
James Darpiniane8a93c62018-01-04 18:02:24 -08006956bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6957{
6958 return mGLState.isCurrentTransformFeedback(tf);
6959}
James Darpiniane8a93c62018-01-04 18:02:24 -08006960
Yunchao Hea336b902017-08-02 16:05:21 +08006961void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6962{
6963 for (int i = 0; i < count; i++)
6964 {
6965 pipelines[i] = createProgramPipeline();
6966 }
6967}
6968
6969void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6970{
6971 for (int i = 0; i < count; i++)
6972 {
6973 if (pipelines[i] != 0)
6974 {
6975 deleteProgramPipeline(pipelines[i]);
6976 }
6977 }
6978}
6979
6980GLboolean Context::isProgramPipeline(GLuint pipeline)
6981{
6982 if (pipeline == 0)
6983 {
6984 return GL_FALSE;
6985 }
6986
6987 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6988}
6989
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006990void Context::finishFenceNV(GLuint fence)
6991{
6992 FenceNV *fenceObject = getFenceNV(fence);
6993
6994 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madill4f6592f2018-11-27 16:37:45 -05006995 ANGLE_CONTEXT_TRY(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006996}
6997
6998void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6999{
7000 FenceNV *fenceObject = getFenceNV(fence);
7001
7002 ASSERT(fenceObject && fenceObject->isSet());
7003
7004 switch (pname)
7005 {
7006 case GL_FENCE_STATUS_NV:
7007 {
7008 // GL_NV_fence spec:
7009 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7010 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7011 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7012 GLboolean status = GL_TRUE;
7013 if (fenceObject->getStatus() != GL_TRUE)
7014 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007015 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007016 }
7017 *params = status;
7018 break;
7019 }
7020
7021 case GL_FENCE_CONDITION_NV:
7022 {
7023 *params = static_cast<GLint>(fenceObject->getCondition());
7024 break;
7025 }
7026
7027 default:
7028 UNREACHABLE();
7029 }
7030}
7031
7032void Context::getTranslatedShaderSource(GLuint shader,
7033 GLsizei bufsize,
7034 GLsizei *length,
7035 GLchar *source)
7036{
7037 Shader *shaderObject = getShader(shader);
7038 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007039 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007040}
7041
7042void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7043{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007044 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007045 ASSERT(programObject);
7046
7047 programObject->getUniformfv(this, location, params);
7048}
7049
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007050void Context::getnUniformfvRobust(GLuint program,
7051 GLint location,
7052 GLsizei bufSize,
7053 GLsizei *length,
7054 GLfloat *params)
7055{
7056 UNIMPLEMENTED();
7057}
7058
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007059void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7060{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007061 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007062 ASSERT(programObject);
7063
7064 programObject->getUniformiv(this, location, params);
7065}
7066
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007067void Context::getnUniformivRobust(GLuint program,
7068 GLint location,
7069 GLsizei bufSize,
7070 GLsizei *length,
7071 GLint *params)
7072{
7073 UNIMPLEMENTED();
7074}
7075
7076void Context::getnUniformuivRobust(GLuint program,
7077 GLint location,
7078 GLsizei bufSize,
7079 GLsizei *length,
7080 GLuint *params)
7081{
7082 UNIMPLEMENTED();
7083}
7084
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007085GLboolean Context::isFenceNV(GLuint fence)
7086{
7087 FenceNV *fenceObject = getFenceNV(fence);
7088
7089 if (fenceObject == nullptr)
7090 {
7091 return GL_FALSE;
7092 }
7093
7094 // GL_NV_fence spec:
7095 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7096 // existing fence.
7097 return fenceObject->isSet();
7098}
7099
7100void Context::readnPixels(GLint x,
7101 GLint y,
7102 GLsizei width,
7103 GLsizei height,
7104 GLenum format,
7105 GLenum type,
7106 GLsizei bufSize,
7107 void *data)
7108{
7109 return readPixels(x, y, width, height, format, type, data);
7110}
7111
Jamie Madill007530e2017-12-28 14:27:04 -05007112void Context::setFenceNV(GLuint fence, GLenum condition)
7113{
7114 ASSERT(condition == GL_ALL_COMPLETED_NV);
7115
7116 FenceNV *fenceObject = getFenceNV(fence);
7117 ASSERT(fenceObject != nullptr);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007118 ANGLE_CONTEXT_TRY(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007119}
7120
7121GLboolean Context::testFenceNV(GLuint fence)
7122{
7123 FenceNV *fenceObject = getFenceNV(fence);
7124
7125 ASSERT(fenceObject != nullptr);
7126 ASSERT(fenceObject->isSet() == GL_TRUE);
7127
7128 GLboolean result = GL_TRUE;
Jamie Madill7c985f52018-11-29 18:16:17 -05007129 if (fenceObject->test(this, &result) == angle::Result::Stop)
Jamie Madill007530e2017-12-28 14:27:04 -05007130 {
Jamie Madill007530e2017-12-28 14:27:04 -05007131 return GL_TRUE;
7132 }
7133
7134 return result;
7135}
7136
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007137void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007138{
7139 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007140 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007141 ANGLE_CONTEXT_TRY(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007142}
7143
Jamie Madillfa920eb2018-01-04 11:45:50 -05007144void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007145{
7146 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007147 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007148 ANGLE_CONTEXT_TRY(renderbuffer->setStorageEGLImageTarget(this, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007149}
7150
Jamie Madillfa920eb2018-01-04 11:45:50 -05007151void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7152{
7153 UNIMPLEMENTED();
7154}
7155
Jamie Madill5b772312018-03-08 20:28:32 -05007156bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7157{
7158 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7159 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7160 // to the fact that it is stored internally as a float, and so would require conversion
7161 // if returned from Context::getIntegerv. Since this conversion is already implemented
7162 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7163 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7164 // application.
7165 switch (pname)
7166 {
7167 case GL_COMPRESSED_TEXTURE_FORMATS:
7168 {
7169 *type = GL_INT;
7170 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7171 return true;
7172 }
7173 case GL_SHADER_BINARY_FORMATS:
7174 {
7175 *type = GL_INT;
7176 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7177 return true;
7178 }
7179
7180 case GL_MAX_VERTEX_ATTRIBS:
7181 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7182 case GL_MAX_VARYING_VECTORS:
7183 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7184 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7185 case GL_MAX_TEXTURE_IMAGE_UNITS:
7186 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7187 case GL_MAX_RENDERBUFFER_SIZE:
7188 case GL_NUM_SHADER_BINARY_FORMATS:
7189 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7190 case GL_ARRAY_BUFFER_BINDING:
Jamie Madillef9fcd92018-11-28 14:03:59 -05007191 case GL_FRAMEBUFFER_BINDING: // GL_FRAMEBUFFER_BINDING now equivalent to
7192 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
Jamie Madill5b772312018-03-08 20:28:32 -05007193 case GL_RENDERBUFFER_BINDING:
7194 case GL_CURRENT_PROGRAM:
7195 case GL_PACK_ALIGNMENT:
7196 case GL_UNPACK_ALIGNMENT:
7197 case GL_GENERATE_MIPMAP_HINT:
7198 case GL_RED_BITS:
7199 case GL_GREEN_BITS:
7200 case GL_BLUE_BITS:
7201 case GL_ALPHA_BITS:
7202 case GL_DEPTH_BITS:
7203 case GL_STENCIL_BITS:
7204 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7205 case GL_CULL_FACE_MODE:
7206 case GL_FRONT_FACE:
7207 case GL_ACTIVE_TEXTURE:
7208 case GL_STENCIL_FUNC:
7209 case GL_STENCIL_VALUE_MASK:
7210 case GL_STENCIL_REF:
7211 case GL_STENCIL_FAIL:
7212 case GL_STENCIL_PASS_DEPTH_FAIL:
7213 case GL_STENCIL_PASS_DEPTH_PASS:
7214 case GL_STENCIL_BACK_FUNC:
7215 case GL_STENCIL_BACK_VALUE_MASK:
7216 case GL_STENCIL_BACK_REF:
7217 case GL_STENCIL_BACK_FAIL:
7218 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7219 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7220 case GL_DEPTH_FUNC:
7221 case GL_BLEND_SRC_RGB:
7222 case GL_BLEND_SRC_ALPHA:
7223 case GL_BLEND_DST_RGB:
7224 case GL_BLEND_DST_ALPHA:
7225 case GL_BLEND_EQUATION_RGB:
7226 case GL_BLEND_EQUATION_ALPHA:
7227 case GL_STENCIL_WRITEMASK:
7228 case GL_STENCIL_BACK_WRITEMASK:
7229 case GL_STENCIL_CLEAR_VALUE:
7230 case GL_SUBPIXEL_BITS:
7231 case GL_MAX_TEXTURE_SIZE:
7232 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7233 case GL_SAMPLE_BUFFERS:
7234 case GL_SAMPLES:
7235 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7236 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7237 case GL_TEXTURE_BINDING_2D:
7238 case GL_TEXTURE_BINDING_CUBE_MAP:
7239 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7240 {
7241 *type = GL_INT;
7242 *numParams = 1;
7243 return true;
7244 }
7245 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7246 {
7247 if (!getExtensions().packReverseRowOrder)
7248 {
7249 return false;
7250 }
7251 *type = GL_INT;
7252 *numParams = 1;
7253 return true;
7254 }
7255 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7256 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7257 {
7258 if (!getExtensions().textureRectangle)
7259 {
7260 return false;
7261 }
7262 *type = GL_INT;
7263 *numParams = 1;
7264 return true;
7265 }
7266 case GL_MAX_DRAW_BUFFERS_EXT:
7267 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7268 {
7269 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7270 {
7271 return false;
7272 }
7273 *type = GL_INT;
7274 *numParams = 1;
7275 return true;
7276 }
7277 case GL_MAX_VIEWPORT_DIMS:
7278 {
7279 *type = GL_INT;
7280 *numParams = 2;
7281 return true;
7282 }
7283 case GL_VIEWPORT:
7284 case GL_SCISSOR_BOX:
7285 {
7286 *type = GL_INT;
7287 *numParams = 4;
7288 return true;
7289 }
7290 case GL_SHADER_COMPILER:
7291 case GL_SAMPLE_COVERAGE_INVERT:
7292 case GL_DEPTH_WRITEMASK:
7293 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7294 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7295 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7296 // bool-natural
7297 case GL_SAMPLE_COVERAGE:
7298 case GL_SCISSOR_TEST:
7299 case GL_STENCIL_TEST:
7300 case GL_DEPTH_TEST:
7301 case GL_BLEND:
7302 case GL_DITHER:
7303 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7304 {
7305 *type = GL_BOOL;
7306 *numParams = 1;
7307 return true;
7308 }
7309 case GL_COLOR_WRITEMASK:
7310 {
7311 *type = GL_BOOL;
7312 *numParams = 4;
7313 return true;
7314 }
7315 case GL_POLYGON_OFFSET_FACTOR:
7316 case GL_POLYGON_OFFSET_UNITS:
7317 case GL_SAMPLE_COVERAGE_VALUE:
7318 case GL_DEPTH_CLEAR_VALUE:
7319 case GL_LINE_WIDTH:
7320 {
7321 *type = GL_FLOAT;
7322 *numParams = 1;
7323 return true;
7324 }
7325 case GL_ALIASED_LINE_WIDTH_RANGE:
7326 case GL_ALIASED_POINT_SIZE_RANGE:
7327 case GL_DEPTH_RANGE:
7328 {
7329 *type = GL_FLOAT;
7330 *numParams = 2;
7331 return true;
7332 }
7333 case GL_COLOR_CLEAR_VALUE:
7334 case GL_BLEND_COLOR:
7335 {
7336 *type = GL_FLOAT;
7337 *numParams = 4;
7338 return true;
7339 }
7340 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7341 if (!getExtensions().textureFilterAnisotropic)
7342 {
7343 return false;
7344 }
7345 *type = GL_FLOAT;
7346 *numParams = 1;
7347 return true;
7348 case GL_TIMESTAMP_EXT:
7349 if (!getExtensions().disjointTimerQuery)
7350 {
7351 return false;
7352 }
7353 *type = GL_INT_64_ANGLEX;
7354 *numParams = 1;
7355 return true;
7356 case GL_GPU_DISJOINT_EXT:
7357 if (!getExtensions().disjointTimerQuery)
7358 {
7359 return false;
7360 }
7361 *type = GL_INT;
7362 *numParams = 1;
7363 return true;
7364 case GL_COVERAGE_MODULATION_CHROMIUM:
7365 if (!getExtensions().framebufferMixedSamples)
7366 {
7367 return false;
7368 }
7369 *type = GL_INT;
7370 *numParams = 1;
7371 return true;
7372 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7373 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7374 {
7375 return false;
7376 }
7377 *type = GL_INT;
7378 *numParams = 1;
7379 return true;
7380 }
7381
7382 if (getExtensions().debug)
7383 {
7384 switch (pname)
7385 {
7386 case GL_DEBUG_LOGGED_MESSAGES:
7387 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7388 case GL_DEBUG_GROUP_STACK_DEPTH:
7389 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7390 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7391 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7392 case GL_MAX_LABEL_LENGTH:
7393 *type = GL_INT;
7394 *numParams = 1;
7395 return true;
7396
7397 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7398 case GL_DEBUG_OUTPUT:
7399 *type = GL_BOOL;
7400 *numParams = 1;
7401 return true;
7402 }
7403 }
7404
7405 if (getExtensions().multisampleCompatibility)
7406 {
7407 switch (pname)
7408 {
7409 case GL_MULTISAMPLE_EXT:
7410 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7411 *type = GL_BOOL;
7412 *numParams = 1;
7413 return true;
7414 }
7415 }
7416
7417 if (getExtensions().pathRendering)
7418 {
7419 switch (pname)
7420 {
7421 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7422 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7423 *type = GL_FLOAT;
7424 *numParams = 16;
7425 return true;
7426 }
7427 }
7428
7429 if (getExtensions().bindGeneratesResource)
7430 {
7431 switch (pname)
7432 {
7433 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7434 *type = GL_BOOL;
7435 *numParams = 1;
7436 return true;
7437 }
7438 }
7439
7440 if (getExtensions().clientArrays)
7441 {
7442 switch (pname)
7443 {
7444 case GL_CLIENT_ARRAYS_ANGLE:
7445 *type = GL_BOOL;
7446 *numParams = 1;
7447 return true;
7448 }
7449 }
7450
7451 if (getExtensions().sRGBWriteControl)
7452 {
7453 switch (pname)
7454 {
7455 case GL_FRAMEBUFFER_SRGB_EXT:
7456 *type = GL_BOOL;
7457 *numParams = 1;
7458 return true;
7459 }
7460 }
7461
7462 if (getExtensions().robustResourceInitialization &&
7463 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7464 {
7465 *type = GL_BOOL;
7466 *numParams = 1;
7467 return true;
7468 }
7469
7470 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7471 {
7472 *type = GL_BOOL;
7473 *numParams = 1;
7474 return true;
7475 }
7476
jchen1082af6202018-06-22 10:59:52 +08007477 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7478 {
7479 *type = GL_INT;
7480 *numParams = 1;
7481 return true;
7482 }
7483
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007484 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7485 {
7486 *type = GL_INT;
7487 *numParams = 1;
7488 return true;
7489 }
7490
Jamie Madill5b772312018-03-08 20:28:32 -05007491 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7492 switch (pname)
7493 {
Jamie Madillef9fcd92018-11-28 14:03:59 -05007494 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE equivalent to FRAMEBUFFER_BINDING
Jamie Madill5b772312018-03-08 20:28:32 -05007495 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7496 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7497 {
7498 return false;
7499 }
7500 *type = GL_INT;
7501 *numParams = 1;
7502 return true;
7503
7504 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7505 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7506 {
7507 return false;
7508 }
7509 *type = GL_INT;
7510 *numParams = 1;
7511 return true;
7512
7513 case GL_PROGRAM_BINARY_FORMATS_OES:
7514 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7515 {
7516 return false;
7517 }
7518 *type = GL_INT;
7519 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7520 return true;
7521
7522 case GL_PACK_ROW_LENGTH:
7523 case GL_PACK_SKIP_ROWS:
7524 case GL_PACK_SKIP_PIXELS:
7525 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7526 {
7527 return false;
7528 }
7529 *type = GL_INT;
7530 *numParams = 1;
7531 return true;
7532 case GL_UNPACK_ROW_LENGTH:
7533 case GL_UNPACK_SKIP_ROWS:
7534 case GL_UNPACK_SKIP_PIXELS:
7535 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7536 {
7537 return false;
7538 }
7539 *type = GL_INT;
7540 *numParams = 1;
7541 return true;
7542 case GL_VERTEX_ARRAY_BINDING:
7543 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7544 {
7545 return false;
7546 }
7547 *type = GL_INT;
7548 *numParams = 1;
7549 return true;
7550 case GL_PIXEL_PACK_BUFFER_BINDING:
7551 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7552 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7553 {
7554 return false;
7555 }
7556 *type = GL_INT;
7557 *numParams = 1;
7558 return true;
7559 case GL_MAX_SAMPLES:
7560 {
7561 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7562 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7563 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7564 {
7565 return false;
7566 }
7567 *type = GL_INT;
7568 *numParams = 1;
7569 return true;
7570
7571 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7572 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7573 {
7574 return false;
7575 }
7576 *type = GL_INT;
7577 *numParams = 1;
7578 return true;
7579 }
7580 }
7581
7582 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7583 {
7584 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7585 {
7586 return false;
7587 }
7588 *type = GL_INT;
7589 *numParams = 1;
7590 return true;
7591 }
7592
7593 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7594 {
7595 *type = GL_INT;
7596 *numParams = 1;
7597 return true;
7598 }
7599
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007600 if (getClientVersion() < Version(2, 0))
7601 {
7602 switch (pname)
7603 {
7604 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007605 case GL_CLIENT_ACTIVE_TEXTURE:
7606 case GL_MATRIX_MODE:
7607 case GL_MAX_TEXTURE_UNITS:
7608 case GL_MAX_MODELVIEW_STACK_DEPTH:
7609 case GL_MAX_PROJECTION_STACK_DEPTH:
7610 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007611 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007612 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007613 case GL_VERTEX_ARRAY_STRIDE:
7614 case GL_NORMAL_ARRAY_STRIDE:
7615 case GL_COLOR_ARRAY_STRIDE:
7616 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7617 case GL_VERTEX_ARRAY_SIZE:
7618 case GL_COLOR_ARRAY_SIZE:
7619 case GL_TEXTURE_COORD_ARRAY_SIZE:
7620 case GL_VERTEX_ARRAY_TYPE:
7621 case GL_NORMAL_ARRAY_TYPE:
7622 case GL_COLOR_ARRAY_TYPE:
7623 case GL_TEXTURE_COORD_ARRAY_TYPE:
7624 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7625 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7626 case GL_COLOR_ARRAY_BUFFER_BINDING:
7627 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7628 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7629 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7630 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007631 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007632 case GL_MODELVIEW_STACK_DEPTH:
7633 case GL_PROJECTION_STACK_DEPTH:
7634 case GL_TEXTURE_STACK_DEPTH:
7635 case GL_LOGIC_OP_MODE:
7636 case GL_BLEND_SRC:
7637 case GL_BLEND_DST:
7638 case GL_PERSPECTIVE_CORRECTION_HINT:
7639 case GL_POINT_SMOOTH_HINT:
7640 case GL_LINE_SMOOTH_HINT:
7641 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007642 *type = GL_INT;
7643 *numParams = 1;
7644 return true;
7645 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007646 case GL_FOG_DENSITY:
7647 case GL_FOG_START:
7648 case GL_FOG_END:
7649 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007650 case GL_POINT_SIZE:
7651 case GL_POINT_SIZE_MIN:
7652 case GL_POINT_SIZE_MAX:
7653 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007654 *type = GL_FLOAT;
7655 *numParams = 1;
7656 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007657 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007658 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007659 *type = GL_FLOAT;
7660 *numParams = 2;
7661 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007662 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007663 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007664 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007665 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007666 *type = GL_FLOAT;
7667 *numParams = 4;
7668 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007669 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007670 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007671 *type = GL_FLOAT;
7672 *numParams = 3;
7673 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007674 case GL_MODELVIEW_MATRIX:
7675 case GL_PROJECTION_MATRIX:
7676 case GL_TEXTURE_MATRIX:
7677 *type = GL_FLOAT;
7678 *numParams = 16;
7679 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007680 case GL_LIGHT_MODEL_TWO_SIDE:
7681 *type = GL_BOOL;
7682 *numParams = 1;
7683 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007684 }
7685 }
7686
Jamie Madill5b772312018-03-08 20:28:32 -05007687 if (getClientVersion() < Version(3, 0))
7688 {
7689 return false;
7690 }
7691
7692 // Check for ES3.0+ parameter names
7693 switch (pname)
7694 {
7695 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7696 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7697 case GL_UNIFORM_BUFFER_BINDING:
7698 case GL_TRANSFORM_FEEDBACK_BINDING:
7699 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7700 case GL_COPY_READ_BUFFER_BINDING:
7701 case GL_COPY_WRITE_BUFFER_BINDING:
7702 case GL_SAMPLER_BINDING:
7703 case GL_READ_BUFFER:
7704 case GL_TEXTURE_BINDING_3D:
7705 case GL_TEXTURE_BINDING_2D_ARRAY:
7706 case GL_MAX_3D_TEXTURE_SIZE:
7707 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7708 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7709 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7710 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7711 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7712 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7713 case GL_MAX_VARYING_COMPONENTS:
7714 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7715 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7716 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7717 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7718 case GL_NUM_EXTENSIONS:
7719 case GL_MAJOR_VERSION:
7720 case GL_MINOR_VERSION:
7721 case GL_MAX_ELEMENTS_INDICES:
7722 case GL_MAX_ELEMENTS_VERTICES:
7723 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7724 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7725 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7726 case GL_UNPACK_IMAGE_HEIGHT:
7727 case GL_UNPACK_SKIP_IMAGES:
7728 {
7729 *type = GL_INT;
7730 *numParams = 1;
7731 return true;
7732 }
7733
7734 case GL_MAX_ELEMENT_INDEX:
7735 case GL_MAX_UNIFORM_BLOCK_SIZE:
7736 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7737 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7738 case GL_MAX_SERVER_WAIT_TIMEOUT:
7739 {
7740 *type = GL_INT_64_ANGLEX;
7741 *numParams = 1;
7742 return true;
7743 }
7744
7745 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7746 case GL_TRANSFORM_FEEDBACK_PAUSED:
7747 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7748 case GL_RASTERIZER_DISCARD:
7749 {
7750 *type = GL_BOOL;
7751 *numParams = 1;
7752 return true;
7753 }
7754
7755 case GL_MAX_TEXTURE_LOD_BIAS:
7756 {
7757 *type = GL_FLOAT;
7758 *numParams = 1;
7759 return true;
7760 }
7761 }
7762
7763 if (getExtensions().requestExtension)
7764 {
7765 switch (pname)
7766 {
7767 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7768 *type = GL_INT;
7769 *numParams = 1;
7770 return true;
7771 }
7772 }
7773
Yizhou Jiang7818a852018-09-06 15:02:04 +08007774 if (getExtensions().textureMultisample)
7775 {
7776 switch (pname)
7777 {
7778 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7779 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7780 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7781 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
Yizhou Jiang7310da32018-11-05 14:40:01 +08007782 case GL_MAX_SAMPLE_MASK_WORDS:
Yizhou Jiang7818a852018-09-06 15:02:04 +08007783 *type = GL_INT;
7784 *numParams = 1;
7785 return true;
7786 }
7787 }
7788
Jamie Madill5b772312018-03-08 20:28:32 -05007789 if (getClientVersion() < Version(3, 1))
7790 {
7791 return false;
7792 }
7793
7794 switch (pname)
7795 {
7796 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7797 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7798 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7799 case GL_MAX_FRAMEBUFFER_WIDTH:
7800 case GL_MAX_FRAMEBUFFER_HEIGHT:
7801 case GL_MAX_FRAMEBUFFER_SAMPLES:
7802 case GL_MAX_SAMPLE_MASK_WORDS:
7803 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7804 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7805 case GL_MAX_INTEGER_SAMPLES:
7806 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7807 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7808 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7809 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7810 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7811 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7812 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7813 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7814 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7815 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7816 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7817 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7818 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7819 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7820 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7821 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7822 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7823 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7824 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7825 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7826 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7827 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7828 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7829 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7830 case GL_MAX_UNIFORM_LOCATIONS:
7831 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7832 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7833 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7834 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7835 case GL_MAX_IMAGE_UNITS:
7836 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7837 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7838 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7839 case GL_SHADER_STORAGE_BUFFER_BINDING:
7840 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7841 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007842 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007843 *type = GL_INT;
7844 *numParams = 1;
7845 return true;
7846 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7847 *type = GL_INT_64_ANGLEX;
7848 *numParams = 1;
7849 return true;
7850 case GL_SAMPLE_MASK:
7851 *type = GL_BOOL;
7852 *numParams = 1;
7853 return true;
7854 }
7855
7856 if (getExtensions().geometryShader)
7857 {
7858 switch (pname)
7859 {
7860 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7861 case GL_LAYER_PROVOKING_VERTEX_EXT:
7862 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7863 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7864 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7865 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7866 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7867 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7868 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7869 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7870 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7871 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7872 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7873 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7874 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7875 *type = GL_INT;
7876 *numParams = 1;
7877 return true;
7878 }
7879 }
7880
7881 return false;
7882}
7883
7884bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7885{
7886 if (getClientVersion() < Version(3, 0))
7887 {
7888 return false;
7889 }
7890
7891 switch (target)
7892 {
7893 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7894 case GL_UNIFORM_BUFFER_BINDING:
7895 {
7896 *type = GL_INT;
7897 *numParams = 1;
7898 return true;
7899 }
7900 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7901 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7902 case GL_UNIFORM_BUFFER_START:
7903 case GL_UNIFORM_BUFFER_SIZE:
7904 {
7905 *type = GL_INT_64_ANGLEX;
7906 *numParams = 1;
7907 return true;
7908 }
7909 }
7910
7911 if (getClientVersion() < Version(3, 1))
7912 {
7913 return false;
7914 }
7915
7916 switch (target)
7917 {
7918 case GL_IMAGE_BINDING_LAYERED:
7919 {
7920 *type = GL_BOOL;
7921 *numParams = 1;
7922 return true;
7923 }
7924 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7925 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7926 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7927 case GL_SHADER_STORAGE_BUFFER_BINDING:
7928 case GL_VERTEX_BINDING_BUFFER:
7929 case GL_VERTEX_BINDING_DIVISOR:
7930 case GL_VERTEX_BINDING_OFFSET:
7931 case GL_VERTEX_BINDING_STRIDE:
7932 case GL_SAMPLE_MASK_VALUE:
7933 case GL_IMAGE_BINDING_NAME:
7934 case GL_IMAGE_BINDING_LEVEL:
7935 case GL_IMAGE_BINDING_LAYER:
7936 case GL_IMAGE_BINDING_ACCESS:
7937 case GL_IMAGE_BINDING_FORMAT:
7938 {
7939 *type = GL_INT;
7940 *numParams = 1;
7941 return true;
7942 }
7943 case GL_ATOMIC_COUNTER_BUFFER_START:
7944 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7945 case GL_SHADER_STORAGE_BUFFER_START:
7946 case GL_SHADER_STORAGE_BUFFER_SIZE:
7947 {
7948 *type = GL_INT_64_ANGLEX;
7949 *numParams = 1;
7950 return true;
7951 }
7952 }
7953
7954 return false;
7955}
7956
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007957Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007958{
7959 return mState.mShaderPrograms->getProgram(handle);
7960}
7961
7962Shader *Context::getShader(GLuint handle) const
7963{
7964 return mState.mShaderPrograms->getShader(handle);
7965}
7966
Jamie Madill5b772312018-03-08 20:28:32 -05007967bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7968{
7969 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7970}
7971
7972bool Context::isFramebufferGenerated(GLuint framebuffer) const
7973{
7974 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7975}
7976
7977bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7978{
7979 return mState.mPipelines->isHandleGenerated(pipeline);
7980}
7981
7982bool Context::usingDisplayTextureShareGroup() const
7983{
7984 return mDisplayTextureShareGroup;
7985}
7986
7987GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7988{
7989 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7990 internalformat == GL_DEPTH_STENCIL
7991 ? GL_DEPTH24_STENCIL8
7992 : internalformat;
7993}
7994
jchen1082af6202018-06-22 10:59:52 +08007995void Context::maxShaderCompilerThreads(GLuint count)
7996{
jchen107ae70d82018-07-06 13:47:01 +08007997 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007998 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007999 // A count of zero specifies a request for no parallel compiling or linking.
8000 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8001 {
8002 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8003 }
8004 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008005}
8006
Jamie Madill2eb65032018-07-30 10:25:57 -04008007bool Context::isGLES1() const
8008{
8009 return mState.getClientVersion() < Version(2, 0);
8010}
8011
Jamie Madilla11819d2018-07-30 10:26:01 -04008012void Context::onSubjectStateChange(const Context *context,
8013 angle::SubjectIndex index,
8014 angle::SubjectMessage message)
8015{
Jamie Madilla11819d2018-07-30 10:26:01 -04008016 switch (index)
8017 {
8018 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008019 switch (message)
8020 {
8021 case angle::SubjectMessage::CONTENTS_CHANGED:
8022 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8023 mStateCache.onVertexArrayBufferContentsChange(this);
8024 break;
8025 case angle::SubjectMessage::RESOURCE_MAPPED:
8026 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8027 case angle::SubjectMessage::BINDING_CHANGED:
8028 mStateCache.onVertexArrayBufferStateChange(this);
8029 break;
8030 default:
8031 break;
8032 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008033 break;
8034
8035 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008036 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8037 {
8038 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8039 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008040 break;
8041
8042 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008043 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8044 {
Jamie Madillef9fcd92018-11-28 14:03:59 -05008045 mGLState.setDrawFramebufferDirty();
Jamie Madilld84b6732018-09-06 15:54:35 -04008046 }
8047 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008048 break;
8049
8050 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008051 if (index < kTextureMaxSubjectIndex)
8052 {
Jamie Madille3e680c2018-12-03 17:49:08 -05008053 mGLState.onActiveTextureStateChange(this, index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008054 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008055 }
Jamie Madille25b8002018-09-20 13:39:49 -04008056 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008057 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008058 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008059 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008060 }
Jamie Madille25b8002018-09-20 13:39:49 -04008061 else
8062 {
8063 ASSERT(index < kSamplerMaxSubjectIndex);
8064 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8065 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008066 break;
8067 }
8068}
8069
Jamie Madill6b873dd2018-07-12 23:56:30 -04008070// ErrorSet implementation.
Jamie Madillb980c562018-11-27 11:34:27 -05008071ErrorSet::ErrorSet(Context *context) : mContext(context) {}
Jamie Madill6b873dd2018-07-12 23:56:30 -04008072
8073ErrorSet::~ErrorSet() = default;
8074
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008075void ErrorSet::handleError(GLenum errorCode,
8076 const char *message,
8077 const char *file,
8078 const char *function,
8079 unsigned int line)
8080{
Jamie Madill4f6592f2018-11-27 16:37:45 -05008081 if (errorCode == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8082 {
8083 mContext->markContextLost();
8084 }
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008085
Jamie Madill4f6592f2018-11-27 16:37:45 -05008086 std::stringstream errorStream;
8087 errorStream << "Error: " << gl::FmtHex(errorCode) << ", in " << file << ", " << function << ":"
8088 << line << ". " << message;
8089
Geoff Lang7139b432018-12-14 16:57:28 -05008090 std::string formattedMessage = errorStream.str();
8091
8092 // Always log a warning, this function is only called on unexpected internal errors.
8093 WARN() << formattedMessage;
8094
Jamie Madill4f6592f2018-11-27 16:37:45 -05008095 // validationError does the necessary work to process the error.
Geoff Lang7139b432018-12-14 16:57:28 -05008096 validationError(errorCode, formattedMessage.c_str());
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008097}
8098
Jamie Madilla139f012018-10-10 16:13:03 -04008099void ErrorSet::validationError(GLenum errorCode, const char *message)
8100{
Jamie Madill4f6592f2018-11-27 16:37:45 -05008101 ASSERT(errorCode != GL_NO_ERROR);
8102 mErrors.insert(errorCode);
8103
8104 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8105 errorCode, GL_DEBUG_SEVERITY_HIGH, message);
Jamie Madilla139f012018-10-10 16:13:03 -04008106}
8107
Jamie Madill6b873dd2018-07-12 23:56:30 -04008108bool ErrorSet::empty() const
8109{
8110 return mErrors.empty();
8111}
8112
8113GLenum ErrorSet::popError()
8114{
8115 ASSERT(!empty());
8116 GLenum error = *mErrors.begin();
8117 mErrors.erase(mErrors.begin());
8118 return error;
8119}
Jamie Madilldc358af2018-07-31 11:22:13 -04008120
8121// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008122StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008123 : mCachedHasAnyEnabledClientAttrib(false),
8124 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008125 mCachedInstancedVertexElementLimit(0),
Jamie Madill1e853262018-12-21 09:07:38 -05008126 mCachedBasicDrawStatesError(kInvalidPointer),
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008127 mCachedBasicDrawElementsError(kInvalidPointer),
8128 mCachedTransformFeedbackActiveUnpaused(false)
Jamie Madillb980c562018-11-27 11:34:27 -05008129{}
Jamie Madilldc358af2018-07-31 11:22:13 -04008130
8131StateCache::~StateCache() = default;
8132
Jamie Madillac66f982018-10-09 18:30:01 -04008133void StateCache::initialize(Context *context)
8134{
8135 updateValidDrawModes(context);
8136 updateValidBindTextureTypes(context);
Jamie Madill8dc27f92018-11-29 11:45:44 -05008137 updateValidDrawElementsTypes(context);
Jamie Madill1e853262018-12-21 09:07:38 -05008138 updateBasicDrawStatesError();
8139 updateBasicDrawElementsError();
Jamie Madillac66f982018-10-09 18:30:01 -04008140}
8141
Jamie Madilldc358af2018-07-31 11:22:13 -04008142void StateCache::updateActiveAttribsMask(Context *context)
8143{
8144 bool isGLES1 = context->isGLES1();
8145 const State &glState = context->getGLState();
8146
8147 if (!isGLES1 && !glState.getProgram())
8148 {
8149 mCachedActiveBufferedAttribsMask = AttributesMask();
8150 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008151 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008152 return;
8153 }
8154
8155 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8156 : glState.getProgram()->getActiveAttribLocationsMask();
8157
8158 const VertexArray *vao = glState.getVertexArray();
8159 ASSERT(vao);
8160
8161 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8162 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008163 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008164
Jamie Madill0a17e482018-08-31 17:19:11 -04008165 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8166 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008167 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008168 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8169}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008170
8171void StateCache::updateVertexElementLimits(Context *context)
8172{
8173 const VertexArray *vao = context->getGLState().getVertexArray();
8174
8175 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8176 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8177
8178 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8179 // If there are no buffered attributes then we should not limit the draw call count.
8180 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8181 {
8182 return;
8183 }
8184
8185 const auto &vertexAttribs = vao->getVertexAttributes();
8186 const auto &vertexBindings = vao->getVertexBindings();
8187
8188 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8189 {
8190 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8191 ASSERT(attrib.enabled);
8192
8193 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8194 ASSERT(context->isGLES1() ||
8195 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8196
8197 GLint64 limit = attrib.getCachedElementLimit();
8198 if (binding.getDivisor() > 0)
8199 {
8200 mCachedInstancedVertexElementLimit =
8201 std::min(mCachedInstancedVertexElementLimit, limit);
8202 }
8203 else
8204 {
8205 mCachedNonInstancedVertexElementLimit =
8206 std::min(mCachedNonInstancedVertexElementLimit, limit);
8207 }
8208 }
8209}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008210
Jamie Madilld84b6732018-09-06 15:54:35 -04008211void StateCache::updateBasicDrawStatesError()
8212{
8213 mCachedBasicDrawStatesError = kInvalidPointer;
8214}
8215
Jamie Madill1e853262018-12-21 09:07:38 -05008216void StateCache::updateBasicDrawElementsError()
8217{
8218 mCachedBasicDrawElementsError = kInvalidPointer;
8219}
8220
Jamie Madilld84b6732018-09-06 15:54:35 -04008221intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8222{
8223 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8224 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8225 return mCachedBasicDrawStatesError;
8226}
8227
Jamie Madill1e853262018-12-21 09:07:38 -05008228intptr_t StateCache::getBasicDrawElementsErrorImpl(Context *context) const
8229{
8230 ASSERT(mCachedBasicDrawElementsError == kInvalidPointer);
8231 mCachedBasicDrawElementsError = reinterpret_cast<intptr_t>(ValidateDrawElementsStates(context));
8232 return mCachedBasicDrawElementsError;
8233}
8234
Jamie Madillc43cdad2018-08-08 15:49:25 -04008235void StateCache::onVertexArrayBindingChange(Context *context)
8236{
8237 updateActiveAttribsMask(context);
8238 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008239 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008240}
8241
8242void StateCache::onProgramExecutableChange(Context *context)
8243{
8244 updateActiveAttribsMask(context);
8245 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008246 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008247 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008248}
8249
Jamie Madilld84b6732018-09-06 15:54:35 -04008250void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008251{
8252 updateVertexElementLimits(context);
8253}
8254
Jamie Madilld84b6732018-09-06 15:54:35 -04008255void StateCache::onVertexArrayBufferContentsChange(Context *context)
8256{
8257 updateVertexElementLimits(context);
8258 updateBasicDrawStatesError();
8259}
8260
Jamie Madillc43cdad2018-08-08 15:49:25 -04008261void StateCache::onVertexArrayStateChange(Context *context)
8262{
8263 updateActiveAttribsMask(context);
8264 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008265 updateBasicDrawStatesError();
8266}
8267
8268void StateCache::onVertexArrayBufferStateChange(Context *context)
8269{
8270 updateBasicDrawStatesError();
Jamie Madill1e853262018-12-21 09:07:38 -05008271 updateBasicDrawElementsError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008272}
8273
8274void StateCache::onGLES1ClientStateChange(Context *context)
8275{
8276 updateActiveAttribsMask(context);
8277}
Jamie Madilld84b6732018-09-06 15:54:35 -04008278
8279void StateCache::onDrawFramebufferChange(Context *context)
8280{
8281 updateBasicDrawStatesError();
8282}
8283
8284void StateCache::onContextCapChange(Context *context)
8285{
8286 updateBasicDrawStatesError();
8287}
8288
8289void StateCache::onStencilStateChange(Context *context)
8290{
8291 updateBasicDrawStatesError();
8292}
8293
8294void StateCache::onDefaultVertexAttributeChange(Context *context)
8295{
8296 updateBasicDrawStatesError();
8297}
8298
8299void StateCache::onActiveTextureChange(Context *context)
8300{
8301 updateBasicDrawStatesError();
8302}
8303
8304void StateCache::onQueryChange(Context *context)
8305{
8306 updateBasicDrawStatesError();
8307}
8308
Jamie Madill3a256222018-12-08 09:56:39 -05008309void StateCache::onActiveTransformFeedbackChange(Context *context)
Jamie Madilld84b6732018-09-06 15:54:35 -04008310{
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008311 updateTransformFeedbackActiveUnpaused(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008312 updateBasicDrawStatesError();
Jamie Madill1e853262018-12-21 09:07:38 -05008313 updateBasicDrawElementsError();
Jamie Madill9b025062018-12-12 15:44:12 -05008314 updateValidDrawModes(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008315}
8316
8317void StateCache::onUniformBufferStateChange(Context *context)
8318{
8319 updateBasicDrawStatesError();
8320}
8321
8322void StateCache::onBufferBindingChange(Context *context)
8323{
8324 updateBasicDrawStatesError();
Jamie Madill1e853262018-12-21 09:07:38 -05008325 updateBasicDrawElementsError();
Jamie Madilld84b6732018-09-06 15:54:35 -04008326}
Jamie Madill526a6f62018-09-12 11:03:05 -04008327
Jamie Madill9b025062018-12-12 15:44:12 -05008328void StateCache::setValidDrawModes(bool pointsOK,
8329 bool linesOK,
8330 bool trisOK,
8331 bool lineAdjOK,
8332 bool triAdjOK)
8333{
8334 mCachedValidDrawModes[PrimitiveMode::Points] = pointsOK;
8335 mCachedValidDrawModes[PrimitiveMode::Lines] = linesOK;
8336 mCachedValidDrawModes[PrimitiveMode::LineStrip] = linesOK;
8337 mCachedValidDrawModes[PrimitiveMode::LineLoop] = linesOK;
8338 mCachedValidDrawModes[PrimitiveMode::Triangles] = trisOK;
8339 mCachedValidDrawModes[PrimitiveMode::TriangleFan] = trisOK;
8340 mCachedValidDrawModes[PrimitiveMode::TriangleStrip] = trisOK;
8341 mCachedValidDrawModes[PrimitiveMode::LinesAdjacency] = lineAdjOK;
8342 mCachedValidDrawModes[PrimitiveMode::LineStripAdjacency] = lineAdjOK;
8343 mCachedValidDrawModes[PrimitiveMode::TrianglesAdjacency] = triAdjOK;
8344 mCachedValidDrawModes[PrimitiveMode::TriangleStripAdjacency] = triAdjOK;
8345}
8346
Jamie Madill526a6f62018-09-12 11:03:05 -04008347void StateCache::updateValidDrawModes(Context *context)
8348{
Jamie Madill9b025062018-12-12 15:44:12 -05008349 const State &state = context->getGLState();
8350 Program *program = state.getProgram();
8351
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008352 if (mCachedTransformFeedbackActiveUnpaused)
Jamie Madill9b025062018-12-12 15:44:12 -05008353 {
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008354 TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
8355
Jamie Madill9b025062018-12-12 15:44:12 -05008356 // ES Spec 3.0 validation text:
8357 // When transform feedback is active and not paused, all geometric primitives generated must
8358 // match the value of primitiveMode passed to BeginTransformFeedback. The error
8359 // INVALID_OPERATION is generated by DrawArrays and DrawArraysInstanced if mode is not
8360 // identical to primitiveMode. The error INVALID_OPERATION is also generated by
8361 // DrawElements, DrawElementsInstanced, and DrawRangeElements while transform feedback is
8362 // active and not paused, regardless of mode. Any primitive type may be used while transform
8363 // feedback is paused.
8364 if (!context->getExtensions().geometryShader)
8365 {
8366 mCachedValidDrawModes.fill(false);
8367 mCachedValidDrawModes[curTransformFeedback->getPrimitiveMode()] = true;
8368 return;
8369 }
8370
8371 // EXT_geometry_shader validation text:
8372 // When transform feedback is active and not paused, all geometric primitives generated must
8373 // be compatible with the value of <primitiveMode> passed to BeginTransformFeedback. If a
8374 // geometry shader is active, the type of primitive emitted by that shader is used instead
8375 // of the <mode> parameter passed to drawing commands for the purposes of this error check.
8376 // Any primitive type may be used while transform feedback is paused.
8377 bool pointsOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Points;
8378 bool linesOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Lines;
8379 bool trisOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Triangles;
8380
8381 setValidDrawModes(pointsOK, linesOK, trisOK, false, false);
8382 return;
8383 }
8384
Jamie Madill526a6f62018-09-12 11:03:05 -04008385 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8386 {
Jamie Madill752d2202018-11-27 13:29:48 -05008387 mCachedValidDrawModes = kValidBasicDrawModes;
Jamie Madill9b025062018-12-12 15:44:12 -05008388 return;
Jamie Madill526a6f62018-09-12 11:03:05 -04008389 }
Jamie Madill526a6f62018-09-12 11:03:05 -04008390
Jamie Madill9b025062018-12-12 15:44:12 -05008391 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8392 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
Jamie Madill526a6f62018-09-12 11:03:05 -04008393
Jamie Madill9b025062018-12-12 15:44:12 -05008394 bool pointsOK = gsMode == PrimitiveMode::Points;
8395 bool linesOK = gsMode == PrimitiveMode::Lines;
8396 bool trisOK = gsMode == PrimitiveMode::Triangles;
8397 bool lineAdjOK = gsMode == PrimitiveMode::LinesAdjacency;
8398 bool triAdjOK = gsMode == PrimitiveMode::TrianglesAdjacency;
8399
8400 setValidDrawModes(pointsOK, linesOK, trisOK, lineAdjOK, triAdjOK);
Jamie Madill526a6f62018-09-12 11:03:05 -04008401}
Jamie Madillac66f982018-10-09 18:30:01 -04008402
8403void StateCache::updateValidBindTextureTypes(Context *context)
8404{
8405 const Extensions &exts = context->getExtensions();
8406 bool isGLES3 = context->getClientMajorVersion() >= 3;
8407 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8408
8409 mCachedValidBindTextureTypes = {{
Jamie Madill752d2202018-11-27 13:29:48 -05008410 {TextureType::_2D, true},
8411 {TextureType::_2DArray, isGLES3},
8412 {TextureType::_2DMultisample, isGLES31 || exts.textureMultisample},
8413 {TextureType::_2DMultisampleArray, exts.textureStorageMultisample2DArray},
8414 {TextureType::_3D, isGLES3},
8415 {TextureType::External, exts.eglImageExternal || exts.eglStreamConsumerExternal},
8416 {TextureType::Rectangle, exts.textureRectangle},
8417 {TextureType::CubeMap, true},
Jamie Madillac66f982018-10-09 18:30:01 -04008418 }};
8419}
Jamie Madill8dc27f92018-11-29 11:45:44 -05008420
8421void StateCache::updateValidDrawElementsTypes(Context *context)
8422{
8423 bool supportsUint =
8424 (context->getClientMajorVersion() >= 3 || context->getExtensions().elementIndexUint);
8425
8426 mCachedValidDrawElementsTypes = {{
8427 {DrawElementsType::UnsignedByte, true},
8428 {DrawElementsType::UnsignedShort, true},
8429 {DrawElementsType::UnsignedInt, supportsUint},
8430 }};
8431}
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008432
8433void StateCache::updateTransformFeedbackActiveUnpaused(Context *context)
8434{
Markus Tavenrathcb9609f2018-12-26 00:52:44 +09008435 TransformFeedback *xfb = context->getGLState().getCurrentTransformFeedback();
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008436 mCachedTransformFeedbackActiveUnpaused = xfb && xfb->isActive() && !xfb->isPaused();
8437}
Jamie Madillc29968b2016-01-20 11:17:23 -05008438} // namespace gl