blob: 4fd3a2de8a0967f875281b9d18a684b3aa6b15cf [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060017#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030018#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040019#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050020#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050021#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050023#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040024#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050025#include "libANGLE/Fence.h"
26#include "libANGLE/Framebuffer.h"
27#include "libANGLE/FramebufferAttachment.h"
Lingfeng Yang461b09a2018-04-23 09:02:09 -070028#include "libANGLE/GLES1Renderer.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/ContextImpl.h"
46#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040047#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040048#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000049
Jamie Madill752d2202018-11-27 13:29:48 -050050namespace gl
51{
Geoff Langf6db0982015-08-25 13:04:00 -040052namespace
53{
54
Jamie Madillb6664922017-07-25 12:55:04 -040055#define ANGLE_HANDLE_ERR(X) \
56 handleError(X); \
57 return;
58#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
59
Ian Ewell3ffd78b2016-01-22 16:09:42 -050060template <typename T>
Jamie Madill752d2202018-11-27 13:29:48 -050061std::vector<Path *> GatherPaths(PathManager &resourceManager,
62 GLsizei numPaths,
63 const void *paths,
64 GLuint pathBase)
Sami Väisänend59ca052016-06-21 16:10:00 +030065{
Jamie Madill752d2202018-11-27 13:29:48 -050066 std::vector<Path *> ret;
Sami Väisänend59ca052016-06-21 16:10:00 +030067 ret.reserve(numPaths);
68
69 const auto *nameArray = static_cast<const T *>(paths);
70
71 for (GLsizei i = 0; i < numPaths; ++i)
72 {
73 const GLuint pathName = nameArray[i] + pathBase;
74
75 ret.push_back(resourceManager.getPath(pathName));
76 }
77
78 return ret;
79}
80
Jamie Madill752d2202018-11-27 13:29:48 -050081std::vector<Path *> GatherPaths(PathManager &resourceManager,
82 GLsizei numPaths,
83 GLenum pathNameType,
84 const void *paths,
85 GLuint pathBase)
Sami Väisänend59ca052016-06-21 16:10:00 +030086{
87 switch (pathNameType)
88 {
89 case GL_UNSIGNED_BYTE:
90 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
91
92 case GL_BYTE:
93 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
94
95 case GL_UNSIGNED_SHORT:
96 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
97
98 case GL_SHORT:
99 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
100
101 case GL_UNSIGNED_INT:
102 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
103
104 case GL_INT:
105 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
106 }
107
108 UNREACHABLE();
Jamie Madill752d2202018-11-27 13:29:48 -0500109 return std::vector<Path *>();
Sami Väisänend59ca052016-06-21 16:10:00 +0300110}
111
112template <typename T>
Jamie Madill752d2202018-11-27 13:29:48 -0500113angle::Result GetQueryObjectParameter(const Context *context, Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500114{
Geoff Lang2186c382016-10-14 10:54:54 -0400115 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500116
117 switch (pname)
118 {
119 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400120 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500121 case GL_QUERY_RESULT_AVAILABLE_EXT:
122 {
123 bool available;
Jamie Madill666818e2018-11-14 09:54:33 -0500124 ANGLE_TRY(query->isResultAvailable(context, &available));
Jamie Madill752d2202018-11-27 13:29:48 -0500125 *params = CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Jamie Madill666818e2018-11-14 09:54:33 -0500126 return angle::Result::Continue();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500127 }
128 default:
129 UNREACHABLE();
Jamie Madill666818e2018-11-14 09:54:33 -0500130 return angle::Result::Stop();
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500131 }
132}
133
Jamie Madill752d2202018-11-27 13:29:48 -0500134ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const Context *context,
135 TransformFeedback *transformFeedback,
Jamie Madill956ab4d2018-10-10 16:13:03 -0400136 GLsizei count,
137 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -0400138{
Geoff Lang1a683462015-09-29 15:09:59 -0400139 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400140 {
Jamie Madill09463932018-04-04 05:26:59 -0400141 transformFeedback->onVerticesDrawn(context, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -0400142 }
143}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500144
145// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300146EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500147{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400148 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500149}
150
Martin Radev1be913c2016-07-11 17:59:16 +0300151EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
152{
153 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
154}
155
Jamie Madill752d2202018-11-27 13:29:48 -0500156Version GetClientVersion(const egl::AttributeMap &attribs)
Geoff Langeb66a6e2016-10-31 13:06:12 -0400157{
Jamie Madill752d2202018-11-27 13:29:48 -0500158 return Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
Geoff Langeb66a6e2016-10-31 13:06:12 -0400159}
160
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500161GLenum GetResetStrategy(const egl::AttributeMap &attribs)
162{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800163 EGLAttrib attrib =
164 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165 switch (attrib)
166 {
167 case EGL_NO_RESET_NOTIFICATION:
168 return GL_NO_RESET_NOTIFICATION_EXT;
169 case EGL_LOSE_CONTEXT_ON_RESET:
170 return GL_LOSE_CONTEXT_ON_RESET_EXT;
171 default:
172 UNREACHABLE();
173 return GL_NONE;
174 }
175}
176
177bool GetRobustAccess(const egl::AttributeMap &attribs)
178{
Geoff Lang077f20a2016-11-01 10:08:02 -0400179 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
180 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
181 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500182}
183
184bool GetDebug(const egl::AttributeMap &attribs)
185{
Geoff Lang077f20a2016-11-01 10:08:02 -0400186 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
187 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500188}
189
190bool GetNoError(const egl::AttributeMap &attribs)
191{
192 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
193}
194
Geoff Langc287ea62016-09-16 14:46:51 -0400195bool GetWebGLContext(const egl::AttributeMap &attribs)
196{
Jamie Madill4230d482018-09-14 10:14:45 -0400197 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400198}
199
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400200bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
201{
202 // If the context is WebGL, extensions are disabled by default
203 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
204 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
205}
206
Geoff Langf41a7152016-09-19 15:11:17 -0400207bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
208{
Jamie Madill4230d482018-09-14 10:14:45 -0400209 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400210}
211
Geoff Langfeb8c682017-02-13 16:07:35 -0500212bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
213{
214 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
215}
216
Geoff Langb433e872017-10-05 14:01:47 -0400217bool GetRobustResourceInit(const egl::AttributeMap &attribs)
218{
219 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
220}
221
Martin Radev9d901792016-07-15 15:58:58 +0300222std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
223{
224 std::string labelName;
225 if (label != nullptr)
226 {
227 size_t labelLength = length < 0 ? strlen(label) : length;
228 labelName = std::string(label, labelLength);
229 }
230 return labelName;
231}
232
233void GetObjectLabelBase(const std::string &objectLabel,
234 GLsizei bufSize,
235 GLsizei *length,
236 GLchar *label)
237{
238 size_t writeLength = objectLabel.length();
239 if (label != nullptr && bufSize > 0)
240 {
241 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
242 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
243 label[writeLength] = '\0';
244 }
245
246 if (length != nullptr)
247 {
248 *length = static_cast<GLsizei>(writeLength);
249 }
250}
251
Jamie Madill0f80ed82017-09-19 00:24:56 -0400252template <typename CapT, typename MaxT>
253void LimitCap(CapT *cap, MaxT maximum)
254{
255 *cap = std::min(*cap, static_cast<CapT>(maximum));
256}
257
Jamie Madill752d2202018-11-27 13:29:48 -0500258constexpr angle::PackedEnumMap<PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
259 {PrimitiveMode::Points, 1},
260 {PrimitiveMode::Lines, 2},
261 {PrimitiveMode::LineLoop, 2},
262 {PrimitiveMode::LineStrip, 2},
263 {PrimitiveMode::Triangles, 3},
264 {PrimitiveMode::TriangleStrip, 3},
265 {PrimitiveMode::TriangleFan, 3},
266 {PrimitiveMode::LinesAdjacency, 2},
267 {PrimitiveMode::LineStripAdjacency, 2},
268 {PrimitiveMode::TrianglesAdjacency, 3},
269 {PrimitiveMode::TriangleStripAdjacency, 3},
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600270}};
Jamie Madill752d2202018-11-27 13:29:48 -0500271
272// The rest default to false.
273constexpr angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
274 kValidBasicDrawModes = {{
275 {PrimitiveMode::Points, true},
276 {PrimitiveMode::Lines, true},
277 {PrimitiveMode::LineLoop, true},
278 {PrimitiveMode::LineStrip, true},
279 {PrimitiveMode::Triangles, true},
280 {PrimitiveMode::TriangleStrip, true},
281 {PrimitiveMode::TriangleFan, true},
282 }};
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600283
Jamie Madill6d32cef2018-08-14 02:34:28 -0400284enum SubjectIndexes : angle::SubjectIndex
285{
286 kTexture0SubjectIndex = 0,
287 kTextureMaxSubjectIndex = kTexture0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
288 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
289 kUniformBufferMaxSubjectIndex =
290 kUniformBuffer0SubjectIndex + gl::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400291 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
292 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + gl::IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
293 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400294 kReadFramebufferSubjectIndex,
295 kDrawFramebufferSubjectIndex
296};
Geoff Langf6db0982015-08-25 13:04:00 -0400297} // anonymous namespace
298
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400299Context::Context(rx::EGLImplFactory *implFactory,
300 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400301 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500302 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400303 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500304 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700305 const egl::DisplayExtensions &displayExtensions,
306 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500307 : mState(reinterpret_cast<ContextID>(this),
308 shareContext ? &shareContext->mState : nullptr,
309 shareTextures,
310 GetClientVersion(attribs),
311 &mGLState,
312 mCaps,
313 mTextureCaps,
314 mExtensions,
315 mLimitations),
316 mSkipValidation(GetNoError(attribs)),
317 mDisplayTextureShareGroup(shareTextures != nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400318 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400319 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400320 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400321 mGLState(GetDebug(attribs),
322 GetBindGeneratesResource(attribs),
323 GetClientArraysEnabled(attribs),
324 GetRobustResourceInit(attribs),
325 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400326 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500327 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400328 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500329 mHasBeenCurrent(false),
330 mContextLost(false),
331 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700332 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500333 mResetStrategy(GetResetStrategy(attribs)),
334 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400335 mSurfacelessSupported(displayExtensions.surfacelessContext),
336 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400337 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
338 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500339 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400340 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400341 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400342 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
343 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
344 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400345 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800346 mZeroFilledBuffer(1000u),
347 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000348{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400349 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
350 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
351 {
352 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
353 }
Jamie Madille25b8002018-09-20 13:39:49 -0400354
355 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
356 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
357 {
358 mSamplerObserverBindings.emplace_back(this, samplerIndex);
359 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400360}
Jamie Madill5b772312018-03-08 20:28:32 -0500361
Geoff Lang33f11fb2018-05-07 13:42:47 -0400362void Context::initialize()
363{
364 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400365
Geoff Lang33f11fb2018-05-07 13:42:47 -0400366 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700367 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400368
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400369 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100370
Shannon Woods53a94a82014-06-24 15:20:36 -0400371 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400372
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000373 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400374 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000375 // and cube map texture state vectors respectively associated with them.
376 // In order that access to these initial textures not be lost, they are treated as texture
377 // objects all of whose names are 0.
378
Corentin Wallez99d492c2018-02-27 15:17:10 -0500379 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800380 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500381
Corentin Wallez99d492c2018-02-27 15:17:10 -0500382 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800383 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400384
Geoff Langeb66a6e2016-10-31 13:06:12 -0400385 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400386 {
387 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500388 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800389 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400390
Corentin Wallez99d492c2018-02-27 15:17:10 -0500391 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800392 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400393 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800394 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400395 {
396 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500397 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800398 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800399 }
400 if (getClientVersion() >= Version(3, 1))
401 {
Olli Etuahod310a432018-08-24 15:40:23 +0300402 Texture *zeroTexture2DMultisampleArray =
403 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
404 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800405
Jiajia Qin6eafb042016-12-27 17:04:07 +0800406 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
407 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800408 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800409 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800410
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800411 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
412 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400413 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800414 }
Geoff Lang3b573612016-10-31 14:08:10 -0400415 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000416
Geoff Langb0f917f2017-12-05 13:41:54 -0500417 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400418 {
419 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500420 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800421 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400422 }
423
Geoff Langb0f917f2017-12-05 13:41:54 -0500424 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400425 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500426 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800427 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400428 }
429
Jamie Madill4928b7c2017-06-20 12:57:39 -0400430 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500431
Jamie Madill57a89722013-07-02 11:57:03 -0400432 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000433
Geoff Langeb66a6e2016-10-31 13:06:12 -0400434 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400435 {
436 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
437 // In the initial state, a default transform feedback object is bound and treated as
438 // a transform feedback object with a name of zero. That object is bound any time
439 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400440 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400441 }
Geoff Langc8058452014-02-03 12:04:11 -0500442
Corentin Wallez336129f2017-10-17 15:55:40 -0400443 for (auto type : angle::AllEnums<BufferBinding>())
444 {
445 bindBuffer(type, 0);
446 }
447
448 bindRenderbuffer(GL_RENDERBUFFER, 0);
449
450 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
451 {
452 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
453 }
454
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700455 // Initialize GLES1 renderer if appropriate.
456 if (getClientVersion() < Version(2, 0))
457 {
458 mGLES1Renderer.reset(new GLES1Renderer());
459 }
460
Jamie Madillad9f24e2016-02-12 09:27:24 -0500461 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400462 mAllDirtyBits.set();
463
Geoff Lang9bf86f02018-07-26 11:46:34 -0400464 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
465 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
466 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400467 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400468 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400469
470 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
471 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
472 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400473 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400474
Jamie Madillc67323a2017-11-02 23:11:41 -0400475 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500476 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500477 // No dirty objects.
478
479 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400480 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500481 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400482 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500483 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
484
485 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
486 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
487 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
488 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
489 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
490 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
491 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
492 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
493 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
494 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
495 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400496 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500497 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
498
499 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
500 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700501 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400502 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
503 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500504 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
505 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400506
Xinghua Cao10a4d432017-11-28 14:46:26 +0800507 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800508 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
509 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800510 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
511 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
512 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
513 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800514 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800515 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jiajia Qin5ae6ee42018-03-06 17:39:42 +0800516 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400517 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400518 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800519
Jamie Madillb4927eb2018-07-16 11:39:46 -0400520 mImplementation->setErrorSet(&mErrors);
521
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400522 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000523}
524
Jamie Madill4928b7c2017-06-20 12:57:39 -0400525egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000526{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700527 if (mGLES1Renderer)
528 {
529 mGLES1Renderer->onDestroy(this, &mGLState);
530 }
531
Jamie Madille7b3fe22018-04-05 09:42:46 -0400532 ANGLE_TRY(releaseSurface(display));
533
Corentin Wallez80b24112015-08-25 16:41:57 -0400534 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000535 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400536 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000537 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400538 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000539
Corentin Wallez80b24112015-08-25 16:41:57 -0400540 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000541 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400542 if (query.second != nullptr)
543 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400544 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400545 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000546 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400547 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000548
Corentin Wallez80b24112015-08-25 16:41:57 -0400549 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400550 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400551 if (vertexArray.second)
552 {
553 vertexArray.second->onDestroy(this);
554 }
Jamie Madill57a89722013-07-02 11:57:03 -0400555 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400556 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400557
Corentin Wallez80b24112015-08-25 16:41:57 -0400558 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500559 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500560 if (transformFeedback.second != nullptr)
561 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500562 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500563 }
Geoff Langc8058452014-02-03 12:04:11 -0500564 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400565 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500566
Jamie Madill5b772312018-03-08 20:28:32 -0500567 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400568 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800569 if (zeroTexture.get() != nullptr)
570 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400571 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800572 zeroTexture.set(this, nullptr);
573 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400574 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000575
Jamie Madill2f348d22017-06-05 10:50:59 -0400576 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500577
Jamie Madill4928b7c2017-06-20 12:57:39 -0400578 mGLState.reset(this);
579
Jamie Madill6c1f6712017-02-14 19:08:04 -0500580 mState.mBuffers->release(this);
581 mState.mShaderPrograms->release(this);
582 mState.mTextures->release(this);
583 mState.mRenderbuffers->release(this);
584 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400585 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500586 mState.mPaths->release(this);
587 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800588 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400589
jchen107ae70d82018-07-06 13:47:01 +0800590 mThreadPool.reset();
591
Jamie Madill76e471e2017-10-21 09:56:01 -0400592 mImplementation->onDestroy(this);
593
Jamie Madill4928b7c2017-06-20 12:57:39 -0400594 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000595}
596
Jamie Madillb980c562018-11-27 11:34:27 -0500597Context::~Context() {}
Jamie Madill70ee0f62017-02-06 16:04:20 -0500598
Geoff Lang75359662018-04-11 01:42:27 -0400599void Context::setLabel(EGLLabelKHR label)
600{
601 mLabel = label;
602}
603
604EGLLabelKHR Context::getLabel() const
605{
606 return mLabel;
607}
608
Jamie Madill4928b7c2017-06-20 12:57:39 -0400609egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000610{
Jamie Madill61e16b42017-06-19 11:13:23 -0400611 mCurrentDisplay = display;
612
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000613 if (!mHasBeenCurrent)
614 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400615 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000616 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500617 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400618 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000619
Corentin Wallezc295e512017-01-27 17:47:50 -0500620 int width = 0;
621 int height = 0;
622 if (surface != nullptr)
623 {
624 width = surface->getWidth();
625 height = surface->getHeight();
626 }
627
628 mGLState.setViewportParams(0, 0, width, height);
629 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000630
631 mHasBeenCurrent = true;
632 }
633
Jamie Madill1b94d432015-08-07 13:23:23 -0400634 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700635 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400636 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400637
Jamie Madill4928b7c2017-06-20 12:57:39 -0400638 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500639
640 Framebuffer *newDefault = nullptr;
641 if (surface != nullptr)
642 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400643 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500644 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400645 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500646 }
647 else
648 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400649 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500650 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000651
Corentin Wallez37c39792015-08-20 14:19:46 -0400652 // Update default framebuffer, the binding of the previous default
653 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400654 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400655 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700656 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400657 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400658 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400659 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700660 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400661 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400662 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400663 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400664 }
Ian Ewell292f0052016-02-04 10:37:32 -0500665
Jamie Madill32643ce2018-10-19 11:38:03 -0400666 // Notify the renderer of a context switch.
667 // TODO(jmadill): Fix this error handling. http://anglebug.com/2491
668 (void)(mImplementation->onMakeCurrent(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400669 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000670}
671
Jamie Madill4928b7c2017-06-20 12:57:39 -0400672egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400673{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400674 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400675
Geoff Langbf7b95d2018-05-01 16:48:21 -0400676 // Remove the default framebuffer
677 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500678 {
679 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400680 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500681 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400682
683 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500684 {
685 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400686 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500687 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400688
689 if (defaultFramebuffer)
690 {
691 defaultFramebuffer->onDestroy(this);
692 delete defaultFramebuffer;
693 }
694
Corentin Wallezc295e512017-01-27 17:47:50 -0500695 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
696
697 if (mCurrentSurface)
698 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400699 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500700 mCurrentSurface = nullptr;
701 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400702
703 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400704}
705
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000706GLuint Context::createBuffer()
707{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500708 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000709}
710
711GLuint Context::createProgram()
712{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500713 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000714}
715
Jiawei Shao385b3e02018-03-21 09:43:28 +0800716GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000717{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500718 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000719}
720
721GLuint Context::createTexture()
722{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500723 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000724}
725
726GLuint Context::createRenderbuffer()
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729}
730
Jamie Madill13951342018-09-30 15:24:28 -0400731void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
732{
Jamie Madill526392d2018-11-16 09:35:14 -0500733 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(this, range, createdOut));
Jamie Madill13951342018-09-30 15:24:28 -0400734}
735
Brandon Jones59770802018-04-02 13:18:42 -0700736GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300737{
Jamie Madill13951342018-09-30 15:24:28 -0400738 GLuint created = 0;
739 tryGenPaths(range, &created);
740 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300741}
742
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743// Returns an unused framebuffer name
744GLuint Context::createFramebuffer()
745{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500746 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000747}
748
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500749void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000750{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500751 for (int i = 0; i < n; i++)
752 {
753 GLuint handle = mFenceNVHandleAllocator.allocate();
754 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
755 fences[i] = handle;
756 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000757}
758
Yunchao Hea336b902017-08-02 16:05:21 +0800759GLuint Context::createProgramPipeline()
760{
761 return mState.mPipelines->createProgramPipeline();
762}
763
Jiawei Shao385b3e02018-03-21 09:43:28 +0800764GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800765{
766 UNIMPLEMENTED();
767 return 0u;
768}
769
James Darpinian4d9d4832018-03-13 12:43:28 -0700770void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000771{
James Darpinian4d9d4832018-03-13 12:43:28 -0700772 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
773 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774 {
775 detachBuffer(buffer);
776 }
Jamie Madill893ab082014-05-16 16:56:10 -0400777
James Darpinian4d9d4832018-03-13 12:43:28 -0700778 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000779}
780
781void Context::deleteShader(GLuint shader)
782{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500783 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000784}
785
786void Context::deleteProgram(GLuint program)
787{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500788 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000789}
790
791void Context::deleteTexture(GLuint texture)
792{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500793 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000794 {
795 detachTexture(texture);
796 }
797
Jamie Madill6c1f6712017-02-14 19:08:04 -0500798 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000799}
800
801void Context::deleteRenderbuffer(GLuint renderbuffer)
802{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500803 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000804 {
805 detachRenderbuffer(renderbuffer);
806 }
Jamie Madill893ab082014-05-16 16:56:10 -0400807
Jamie Madill6c1f6712017-02-14 19:08:04 -0500808 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809}
810
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400811void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400812{
813 // The spec specifies the underlying Fence object is not deleted until all current
814 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
815 // and since our API is currently designed for being called from a single thread, we can delete
816 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400817 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400818}
819
Yunchao Hea336b902017-08-02 16:05:21 +0800820void Context::deleteProgramPipeline(GLuint pipeline)
821{
822 if (mState.mPipelines->getProgramPipeline(pipeline))
823 {
824 detachProgramPipeline(pipeline);
825 }
826
827 mState.mPipelines->deleteObject(this, pipeline);
828}
829
Sami Väisänene45e53b2016-05-25 10:36:04 +0300830void Context::deletePaths(GLuint first, GLsizei range)
831{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500832 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300833}
834
Brandon Jones59770802018-04-02 13:18:42 -0700835bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300836{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500837 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300838 if (pathObj == nullptr)
839 return false;
840
841 return pathObj->hasPathData();
842}
843
Brandon Jones59770802018-04-02 13:18:42 -0700844bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300845{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500846 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300847}
848
Brandon Jones59770802018-04-02 13:18:42 -0700849void Context::pathCommands(GLuint path,
850 GLsizei numCommands,
851 const GLubyte *commands,
852 GLsizei numCoords,
853 GLenum coordType,
854 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300855{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500856 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300857
858 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
859}
860
Jamie Madill007530e2017-12-28 14:27:04 -0500861void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862{
Jamie Madill007530e2017-12-28 14:27:04 -0500863 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300864
865 switch (pname)
866 {
867 case GL_PATH_STROKE_WIDTH_CHROMIUM:
868 pathObj->setStrokeWidth(value);
869 break;
870 case GL_PATH_END_CAPS_CHROMIUM:
871 pathObj->setEndCaps(static_cast<GLenum>(value));
872 break;
873 case GL_PATH_JOIN_STYLE_CHROMIUM:
874 pathObj->setJoinStyle(static_cast<GLenum>(value));
875 break;
876 case GL_PATH_MITER_LIMIT_CHROMIUM:
877 pathObj->setMiterLimit(value);
878 break;
879 case GL_PATH_STROKE_BOUND_CHROMIUM:
880 pathObj->setStrokeBound(value);
881 break;
882 default:
883 UNREACHABLE();
884 break;
885 }
886}
887
Jamie Madill007530e2017-12-28 14:27:04 -0500888void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300889{
Jamie Madill007530e2017-12-28 14:27:04 -0500890 // TODO(jmadill): Should use proper clamping/casting.
891 pathParameterf(path, pname, static_cast<GLfloat>(value));
892}
893
894void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
895{
896 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300897
898 switch (pname)
899 {
900 case GL_PATH_STROKE_WIDTH_CHROMIUM:
901 *value = pathObj->getStrokeWidth();
902 break;
903 case GL_PATH_END_CAPS_CHROMIUM:
904 *value = static_cast<GLfloat>(pathObj->getEndCaps());
905 break;
906 case GL_PATH_JOIN_STYLE_CHROMIUM:
907 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
908 break;
909 case GL_PATH_MITER_LIMIT_CHROMIUM:
910 *value = pathObj->getMiterLimit();
911 break;
912 case GL_PATH_STROKE_BOUND_CHROMIUM:
913 *value = pathObj->getStrokeBound();
914 break;
915 default:
916 UNREACHABLE();
917 break;
918 }
919}
920
Jamie Madill007530e2017-12-28 14:27:04 -0500921void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
922{
923 GLfloat val = 0.0f;
924 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
925 if (value)
926 *value = static_cast<GLint>(val);
927}
928
Brandon Jones59770802018-04-02 13:18:42 -0700929void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300930{
931 mGLState.setPathStencilFunc(func, ref, mask);
932}
933
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000934void Context::deleteFramebuffer(GLuint framebuffer)
935{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500936 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000937 {
938 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000939 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500940
Jamie Madill6c1f6712017-02-14 19:08:04 -0500941 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000942}
943
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500944void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000945{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500946 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000947 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500948 GLuint fence = fences[i];
949
950 FenceNV *fenceObject = nullptr;
951 if (mFenceNVMap.erase(fence, &fenceObject))
952 {
953 mFenceNVHandleAllocator.release(fence);
954 delete fenceObject;
955 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000956 }
957}
958
Geoff Lang70d0f492015-12-10 17:45:46 -0500959Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000960{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500961 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000962}
963
Geoff Lang70d0f492015-12-10 17:45:46 -0500964Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000965{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500966 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000967}
968
Jamie Madill70b5bb02017-08-28 13:32:37 -0400969Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400970{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400971 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400972}
973
Jamie Madill57a89722013-07-02 11:57:03 -0400974VertexArray *Context::getVertexArray(GLuint handle) const
975{
Jamie Madill96a483b2017-06-27 16:49:21 -0400976 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400977}
978
Jamie Madilldc356042013-07-19 16:36:57 -0400979Sampler *Context::getSampler(GLuint handle) const
980{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500981 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400982}
983
Geoff Langc8058452014-02-03 12:04:11 -0500984TransformFeedback *Context::getTransformFeedback(GLuint handle) const
985{
Jamie Madill96a483b2017-06-27 16:49:21 -0400986 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500987}
988
Yunchao Hea336b902017-08-02 16:05:21 +0800989ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
990{
991 return mState.mPipelines->getProgramPipeline(handle);
992}
993
Geoff Lang75359662018-04-11 01:42:27 -0400994gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500995{
996 switch (identifier)
997 {
998 case GL_BUFFER:
999 return getBuffer(name);
1000 case GL_SHADER:
1001 return getShader(name);
1002 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04001003 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -05001004 case GL_VERTEX_ARRAY:
1005 return getVertexArray(name);
1006 case GL_QUERY:
1007 return getQuery(name);
1008 case GL_TRANSFORM_FEEDBACK:
1009 return getTransformFeedback(name);
1010 case GL_SAMPLER:
1011 return getSampler(name);
1012 case GL_TEXTURE:
1013 return getTexture(name);
1014 case GL_RENDERBUFFER:
1015 return getRenderbuffer(name);
1016 case GL_FRAMEBUFFER:
1017 return getFramebuffer(name);
1018 default:
1019 UNREACHABLE();
1020 return nullptr;
1021 }
1022}
1023
Geoff Lang75359662018-04-11 01:42:27 -04001024gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -05001025{
Jamie Madill70b5bb02017-08-28 13:32:37 -04001026 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -05001027}
1028
Martin Radev9d901792016-07-15 15:58:58 +03001029void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1030{
Geoff Lang75359662018-04-11 01:42:27 -04001031 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001032 ASSERT(object != nullptr);
1033
1034 std::string labelName = GetObjectLabelFromPointer(length, label);
1035 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001036
1037 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1038 // specified object is active until we do this.
1039 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001040}
1041
1042void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1043{
Geoff Lang75359662018-04-11 01:42:27 -04001044 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001045 ASSERT(object != nullptr);
1046
1047 std::string labelName = GetObjectLabelFromPointer(length, label);
1048 object->setLabel(labelName);
1049}
1050
1051void Context::getObjectLabel(GLenum identifier,
1052 GLuint name,
1053 GLsizei bufSize,
1054 GLsizei *length,
1055 GLchar *label) const
1056{
Geoff Lang75359662018-04-11 01:42:27 -04001057 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001058 ASSERT(object != nullptr);
1059
1060 const std::string &objectLabel = object->getLabel();
1061 GetObjectLabelBase(objectLabel, bufSize, length, label);
1062}
1063
1064void Context::getObjectPtrLabel(const void *ptr,
1065 GLsizei bufSize,
1066 GLsizei *length,
1067 GLchar *label) const
1068{
Geoff Lang75359662018-04-11 01:42:27 -04001069 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001070 ASSERT(object != nullptr);
1071
1072 const std::string &objectLabel = object->getLabel();
1073 GetObjectLabelBase(objectLabel, bufSize, length, label);
1074}
1075
Jamie Madilldc356042013-07-19 16:36:57 -04001076bool Context::isSampler(GLuint samplerName) const
1077{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001078 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001079}
1080
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001081void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001082{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001083 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001084
Jamie Madilldedd7b92014-11-05 16:30:36 -05001085 if (handle == 0)
1086 {
1087 texture = mZeroTextures[target].get();
1088 }
1089 else
1090 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001091 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001092 }
1093
1094 ASSERT(texture);
Jamie Madill14246812018-10-03 17:51:16 -04001095 ANGLE_CONTEXT_TRY(mGLState.setSamplerTexture(this, target, texture));
Jamie Madilld84b6732018-09-06 15:54:35 -04001096 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001097}
1098
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001099void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001100{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001101 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1102 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001103 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001104 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001105}
1106
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001107void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001108{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001109 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1110 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001111 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001112 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001113 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001114}
1115
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001116void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001117{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001118 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001119 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001120 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001121 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001122}
1123
Shao80957d92017-02-20 21:25:59 +08001124void Context::bindVertexBuffer(GLuint bindingIndex,
1125 GLuint bufferHandle,
1126 GLintptr offset,
1127 GLsizei stride)
1128{
1129 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001130 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001131 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001132}
1133
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001134void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001135{
Geoff Lang76b10c92014-09-05 16:28:14 -04001136 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001137 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001138 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001139 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001140 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001141}
1142
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001143void Context::bindImageTexture(GLuint unit,
1144 GLuint texture,
1145 GLint level,
1146 GLboolean layered,
1147 GLint layer,
1148 GLenum access,
1149 GLenum format)
1150{
1151 Texture *tex = mState.mTextures->getTexture(texture);
1152 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1153}
1154
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001155void Context::useProgram(GLuint program)
1156{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001157 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001158 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001159}
1160
Jiajia Qin5451d532017-11-16 17:16:34 +08001161void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1162{
1163 UNIMPLEMENTED();
1164}
1165
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001166void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001167{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001168 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001169 TransformFeedback *transformFeedback =
1170 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001171 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Jamie Madilld84b6732018-09-06 15:54:35 -04001172 mStateCache.onTransformFeedbackChange(this);
Geoff Langc8058452014-02-03 12:04:11 -05001173}
1174
Yunchao Hea336b902017-08-02 16:05:21 +08001175void Context::bindProgramPipeline(GLuint pipelineHandle)
1176{
1177 ProgramPipeline *pipeline =
1178 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1179 mGLState.setProgramPipelineBinding(this, pipeline);
1180}
1181
Corentin Wallezad3ae902018-03-09 13:40:42 -05001182void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001183{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001184 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001185 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001186
Geoff Lang5aad9672014-09-08 11:10:42 -04001187 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001188 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001189
1190 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001191 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001192 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001193}
1194
Corentin Wallezad3ae902018-03-09 13:40:42 -05001195void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001196{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001197 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001198 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001199
Jamie Madill5188a272018-07-25 10:53:56 -04001200 handleError(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001201
Geoff Lang5aad9672014-09-08 11:10:42 -04001202 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001203 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001204 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001205}
1206
Corentin Wallezad3ae902018-03-09 13:40:42 -05001207void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001208{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001209 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001210
1211 Query *queryObject = getQuery(id, true, target);
1212 ASSERT(queryObject);
1213
Jamie Madill5188a272018-07-25 10:53:56 -04001214 handleError(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001215}
1216
Corentin Wallezad3ae902018-03-09 13:40:42 -05001217void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001218{
1219 switch (pname)
1220 {
1221 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001222 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001223 break;
1224 case GL_QUERY_COUNTER_BITS_EXT:
1225 switch (target)
1226 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001227 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001228 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1229 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001230 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001231 params[0] = getExtensions().queryCounterBitsTimestamp;
1232 break;
1233 default:
1234 UNREACHABLE();
1235 params[0] = 0;
1236 break;
1237 }
1238 break;
1239 default:
1240 UNREACHABLE();
1241 return;
1242 }
1243}
1244
Corentin Wallezad3ae902018-03-09 13:40:42 -05001245void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001246 GLenum pname,
1247 GLsizei bufSize,
1248 GLsizei *length,
1249 GLint *params)
1250{
1251 getQueryiv(target, pname, params);
1252}
1253
Geoff Lang2186c382016-10-14 10:54:54 -04001254void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255{
Jamie Madill5188a272018-07-25 10:53:56 -04001256 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001257}
1258
Brandon Jones59770802018-04-02 13:18:42 -07001259void Context::getQueryObjectivRobust(GLuint id,
1260 GLenum pname,
1261 GLsizei bufSize,
1262 GLsizei *length,
1263 GLint *params)
1264{
1265 getQueryObjectiv(id, pname, params);
1266}
1267
Geoff Lang2186c382016-10-14 10:54:54 -04001268void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001269{
Jamie Madill5188a272018-07-25 10:53:56 -04001270 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001271}
1272
Brandon Jones59770802018-04-02 13:18:42 -07001273void Context::getQueryObjectuivRobust(GLuint id,
1274 GLenum pname,
1275 GLsizei bufSize,
1276 GLsizei *length,
1277 GLuint *params)
1278{
1279 getQueryObjectuiv(id, pname, params);
1280}
1281
Geoff Lang2186c382016-10-14 10:54:54 -04001282void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001283{
Jamie Madill5188a272018-07-25 10:53:56 -04001284 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001285}
1286
Brandon Jones59770802018-04-02 13:18:42 -07001287void Context::getQueryObjecti64vRobust(GLuint id,
1288 GLenum pname,
1289 GLsizei bufSize,
1290 GLsizei *length,
1291 GLint64 *params)
1292{
1293 getQueryObjecti64v(id, pname, params);
1294}
1295
Geoff Lang2186c382016-10-14 10:54:54 -04001296void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001297{
Jamie Madill5188a272018-07-25 10:53:56 -04001298 handleError(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001299}
1300
Brandon Jones59770802018-04-02 13:18:42 -07001301void Context::getQueryObjectui64vRobust(GLuint id,
1302 GLenum pname,
1303 GLsizei bufSize,
1304 GLsizei *length,
1305 GLuint64 *params)
1306{
1307 getQueryObjectui64v(id, pname, params);
1308}
1309
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001310Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001311{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001312 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001313}
1314
Jamie Madill2f348d22017-06-05 10:50:59 -04001315FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001316{
Jamie Madill96a483b2017-06-27 16:49:21 -04001317 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001318}
1319
Corentin Wallezad3ae902018-03-09 13:40:42 -05001320Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001321{
Jamie Madill96a483b2017-06-27 16:49:21 -04001322 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001323 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001324 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001325 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001326
1327 Query *query = mQueryMap.query(handle);
1328 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001329 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001330 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001331 query = new Query(mImplementation->createQuery(type), handle);
1332 query->addRef();
1333 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001334 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001335 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336}
1337
Geoff Lang70d0f492015-12-10 17:45:46 -05001338Query *Context::getQuery(GLuint handle) const
1339{
Jamie Madill96a483b2017-06-27 16:49:21 -04001340 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001341}
1342
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001343Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001344{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001345 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1346 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001347}
1348
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001349Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001351 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352}
1353
Geoff Lang492a7e42014-11-05 13:27:06 -05001354Compiler *Context::getCompiler() const
1355{
Jamie Madill2f348d22017-06-05 10:50:59 -04001356 if (mCompiler.get() == nullptr)
1357 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001358 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001359 }
1360 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001361}
1362
Jamie Madillc1d770e2017-04-13 17:31:24 -04001363void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001364{
1365 switch (pname)
1366 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001367 case GL_SHADER_COMPILER:
1368 *params = GL_TRUE;
1369 break;
1370 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1371 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1372 break;
1373 default:
1374 mGLState.getBooleanv(pname, params);
1375 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001376 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001377}
1378
Jamie Madillc1d770e2017-04-13 17:31:24 -04001379void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001380{
Shannon Woods53a94a82014-06-24 15:20:36 -04001381 // Queries about context capabilities and maximums are answered by Context.
1382 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001383 switch (pname)
1384 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001385 case GL_ALIASED_LINE_WIDTH_RANGE:
1386 params[0] = mCaps.minAliasedLineWidth;
1387 params[1] = mCaps.maxAliasedLineWidth;
1388 break;
1389 case GL_ALIASED_POINT_SIZE_RANGE:
1390 params[0] = mCaps.minAliasedPointSize;
1391 params[1] = mCaps.maxAliasedPointSize;
1392 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001393 case GL_SMOOTH_POINT_SIZE_RANGE:
1394 params[0] = mCaps.minSmoothPointSize;
1395 params[1] = mCaps.maxSmoothPointSize;
1396 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001397 case GL_SMOOTH_LINE_WIDTH_RANGE:
1398 params[0] = mCaps.minSmoothLineWidth;
1399 params[1] = mCaps.maxSmoothLineWidth;
1400 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001401 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1402 ASSERT(mExtensions.textureFilterAnisotropic);
1403 *params = mExtensions.maxTextureAnisotropy;
1404 break;
1405 case GL_MAX_TEXTURE_LOD_BIAS:
1406 *params = mCaps.maxLODBias;
1407 break;
1408
1409 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1410 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1411 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001412 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1413 // GLES1 constants for modelview/projection matrix.
1414 if (getClientVersion() < Version(2, 0))
1415 {
1416 mGLState.getFloatv(pname, params);
1417 }
1418 else
1419 {
1420 ASSERT(mExtensions.pathRendering);
1421 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1422 memcpy(params, m, 16 * sizeof(GLfloat));
1423 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001424 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001425 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001426
Jamie Madill231c7f52017-04-26 13:45:37 -04001427 default:
1428 mGLState.getFloatv(pname, params);
1429 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001430 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001431}
1432
Jamie Madillc1d770e2017-04-13 17:31:24 -04001433void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001434{
Shannon Woods53a94a82014-06-24 15:20:36 -04001435 // Queries about context capabilities and maximums are answered by Context.
1436 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001437
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001438 switch (pname)
1439 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001440 case GL_MAX_VERTEX_ATTRIBS:
1441 *params = mCaps.maxVertexAttributes;
1442 break;
1443 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1444 *params = mCaps.maxVertexUniformVectors;
1445 break;
1446 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001447 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001448 break;
1449 case GL_MAX_VARYING_VECTORS:
1450 *params = mCaps.maxVaryingVectors;
1451 break;
1452 case GL_MAX_VARYING_COMPONENTS:
1453 *params = mCaps.maxVertexOutputComponents;
1454 break;
1455 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1456 *params = mCaps.maxCombinedTextureImageUnits;
1457 break;
1458 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001459 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001460 break;
1461 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001462 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001463 break;
1464 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1465 *params = mCaps.maxFragmentUniformVectors;
1466 break;
1467 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001468 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001469 break;
1470 case GL_MAX_RENDERBUFFER_SIZE:
1471 *params = mCaps.maxRenderbufferSize;
1472 break;
1473 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1474 *params = mCaps.maxColorAttachments;
1475 break;
1476 case GL_MAX_DRAW_BUFFERS_EXT:
1477 *params = mCaps.maxDrawBuffers;
1478 break;
1479 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1480 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1481 case GL_SUBPIXEL_BITS:
1482 *params = 4;
1483 break;
1484 case GL_MAX_TEXTURE_SIZE:
1485 *params = mCaps.max2DTextureSize;
1486 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001487 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1488 *params = mCaps.maxRectangleTextureSize;
1489 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001490 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1491 *params = mCaps.maxCubeMapTextureSize;
1492 break;
1493 case GL_MAX_3D_TEXTURE_SIZE:
1494 *params = mCaps.max3DTextureSize;
1495 break;
1496 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1497 *params = mCaps.maxArrayTextureLayers;
1498 break;
1499 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1500 *params = mCaps.uniformBufferOffsetAlignment;
1501 break;
1502 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1503 *params = mCaps.maxUniformBufferBindings;
1504 break;
1505 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001506 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001507 break;
1508 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001509 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001510 break;
1511 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1512 *params = mCaps.maxCombinedTextureImageUnits;
1513 break;
1514 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1515 *params = mCaps.maxVertexOutputComponents;
1516 break;
1517 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1518 *params = mCaps.maxFragmentInputComponents;
1519 break;
1520 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1521 *params = mCaps.minProgramTexelOffset;
1522 break;
1523 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1524 *params = mCaps.maxProgramTexelOffset;
1525 break;
1526 case GL_MAJOR_VERSION:
1527 *params = getClientVersion().major;
1528 break;
1529 case GL_MINOR_VERSION:
1530 *params = getClientVersion().minor;
1531 break;
1532 case GL_MAX_ELEMENTS_INDICES:
1533 *params = mCaps.maxElementsIndices;
1534 break;
1535 case GL_MAX_ELEMENTS_VERTICES:
1536 *params = mCaps.maxElementsVertices;
1537 break;
1538 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1539 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1540 break;
1541 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1542 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1543 break;
1544 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1545 *params = mCaps.maxTransformFeedbackSeparateComponents;
1546 break;
1547 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1548 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1549 break;
1550 case GL_MAX_SAMPLES_ANGLE:
1551 *params = mCaps.maxSamples;
1552 break;
1553 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001554 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001555 params[0] = mCaps.maxViewportWidth;
1556 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001557 }
1558 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001559 case GL_COMPRESSED_TEXTURE_FORMATS:
1560 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1561 params);
1562 break;
1563 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1564 *params = mResetStrategy;
1565 break;
1566 case GL_NUM_SHADER_BINARY_FORMATS:
1567 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1568 break;
1569 case GL_SHADER_BINARY_FORMATS:
1570 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1571 break;
1572 case GL_NUM_PROGRAM_BINARY_FORMATS:
1573 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1574 break;
1575 case GL_PROGRAM_BINARY_FORMATS:
1576 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1577 break;
1578 case GL_NUM_EXTENSIONS:
1579 *params = static_cast<GLint>(mExtensionStrings.size());
1580 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001581
Geoff Lang38f24ee2018-10-01 13:04:59 -04001582 // GL_ANGLE_request_extension
1583 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1584 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1585 break;
1586
Jamie Madill231c7f52017-04-26 13:45:37 -04001587 // GL_KHR_debug
1588 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1589 *params = mExtensions.maxDebugMessageLength;
1590 break;
1591 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1592 *params = mExtensions.maxDebugLoggedMessages;
1593 break;
1594 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1595 *params = mExtensions.maxDebugGroupStackDepth;
1596 break;
1597 case GL_MAX_LABEL_LENGTH:
1598 *params = mExtensions.maxLabelLength;
1599 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001600
Martin Radeve5285d22017-07-14 16:23:53 +03001601 // GL_ANGLE_multiview
1602 case GL_MAX_VIEWS_ANGLE:
1603 *params = mExtensions.maxViews;
1604 break;
1605
Jamie Madill231c7f52017-04-26 13:45:37 -04001606 // GL_EXT_disjoint_timer_query
1607 case GL_GPU_DISJOINT_EXT:
1608 *params = mImplementation->getGPUDisjoint();
1609 break;
1610 case GL_MAX_FRAMEBUFFER_WIDTH:
1611 *params = mCaps.maxFramebufferWidth;
1612 break;
1613 case GL_MAX_FRAMEBUFFER_HEIGHT:
1614 *params = mCaps.maxFramebufferHeight;
1615 break;
1616 case GL_MAX_FRAMEBUFFER_SAMPLES:
1617 *params = mCaps.maxFramebufferSamples;
1618 break;
1619 case GL_MAX_SAMPLE_MASK_WORDS:
1620 *params = mCaps.maxSampleMaskWords;
1621 break;
1622 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1623 *params = mCaps.maxColorTextureSamples;
1624 break;
1625 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1626 *params = mCaps.maxDepthTextureSamples;
1627 break;
1628 case GL_MAX_INTEGER_SAMPLES:
1629 *params = mCaps.maxIntegerSamples;
1630 break;
1631 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1632 *params = mCaps.maxVertexAttribRelativeOffset;
1633 break;
1634 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1635 *params = mCaps.maxVertexAttribBindings;
1636 break;
1637 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1638 *params = mCaps.maxVertexAttribStride;
1639 break;
1640 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001641 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001642 break;
1643 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001644 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001645 break;
1646 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001647 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001648 break;
1649 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001650 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001651 break;
1652 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001653 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001654 break;
1655 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001656 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001657 break;
1658 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001659 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001660 break;
1661 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001662 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001663 break;
1664 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1665 *params = mCaps.minProgramTextureGatherOffset;
1666 break;
1667 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1668 *params = mCaps.maxProgramTextureGatherOffset;
1669 break;
1670 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1671 *params = mCaps.maxComputeWorkGroupInvocations;
1672 break;
1673 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001674 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001675 break;
1676 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001677 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001678 break;
1679 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1680 *params = mCaps.maxComputeSharedMemorySize;
1681 break;
1682 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001683 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001684 break;
1685 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001686 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001687 break;
1688 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001689 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001690 break;
1691 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001692 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001693 break;
1694 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001695 *params =
1696 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001697 break;
1698 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001699 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001700 break;
1701 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1702 *params = mCaps.maxCombinedShaderOutputResources;
1703 break;
1704 case GL_MAX_UNIFORM_LOCATIONS:
1705 *params = mCaps.maxUniformLocations;
1706 break;
1707 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1708 *params = mCaps.maxAtomicCounterBufferBindings;
1709 break;
1710 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1711 *params = mCaps.maxAtomicCounterBufferSize;
1712 break;
1713 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1714 *params = mCaps.maxCombinedAtomicCounterBuffers;
1715 break;
1716 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1717 *params = mCaps.maxCombinedAtomicCounters;
1718 break;
1719 case GL_MAX_IMAGE_UNITS:
1720 *params = mCaps.maxImageUnits;
1721 break;
1722 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1723 *params = mCaps.maxCombinedImageUniforms;
1724 break;
1725 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1726 *params = mCaps.maxShaderStorageBufferBindings;
1727 break;
1728 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1729 *params = mCaps.maxCombinedShaderStorageBlocks;
1730 break;
1731 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1732 *params = mCaps.shaderStorageBufferOffsetAlignment;
1733 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001734
1735 // GL_EXT_geometry_shader
1736 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1737 *params = mCaps.maxFramebufferLayers;
1738 break;
1739 case GL_LAYER_PROVOKING_VERTEX_EXT:
1740 *params = mCaps.layerProvokingVertex;
1741 break;
1742 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001743 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001744 break;
1745 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001746 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001747 break;
1748 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001749 *params =
1750 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001751 break;
1752 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1753 *params = mCaps.maxGeometryInputComponents;
1754 break;
1755 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1756 *params = mCaps.maxGeometryOutputComponents;
1757 break;
1758 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1759 *params = mCaps.maxGeometryOutputVertices;
1760 break;
1761 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1762 *params = mCaps.maxGeometryTotalOutputComponents;
1763 break;
1764 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1765 *params = mCaps.maxGeometryShaderInvocations;
1766 break;
1767 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001768 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001769 break;
1770 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001771 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001772 break;
1773 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001774 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001775 break;
1776 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001777 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001778 break;
1779 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001780 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001781 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001782 // GLES1 emulation: Caps queries
1783 case GL_MAX_TEXTURE_UNITS:
1784 *params = mCaps.maxMultitextureUnits;
1785 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001786 case GL_MAX_MODELVIEW_STACK_DEPTH:
1787 *params = mCaps.maxModelviewMatrixStackDepth;
1788 break;
1789 case GL_MAX_PROJECTION_STACK_DEPTH:
1790 *params = mCaps.maxProjectionMatrixStackDepth;
1791 break;
1792 case GL_MAX_TEXTURE_STACK_DEPTH:
1793 *params = mCaps.maxTextureMatrixStackDepth;
1794 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001795 case GL_MAX_LIGHTS:
1796 *params = mCaps.maxLights;
1797 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001798 case GL_MAX_CLIP_PLANES:
1799 *params = mCaps.maxClipPlanes;
1800 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001801 // GLES1 emulation: Vertex attribute queries
1802 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1803 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1804 case GL_COLOR_ARRAY_BUFFER_BINDING:
1805 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1806 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1807 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1808 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1809 break;
1810 case GL_VERTEX_ARRAY_STRIDE:
1811 case GL_NORMAL_ARRAY_STRIDE:
1812 case GL_COLOR_ARRAY_STRIDE:
1813 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1814 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1815 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1816 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1817 break;
1818 case GL_VERTEX_ARRAY_SIZE:
1819 case GL_COLOR_ARRAY_SIZE:
1820 case GL_TEXTURE_COORD_ARRAY_SIZE:
1821 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1822 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1823 break;
1824 case GL_VERTEX_ARRAY_TYPE:
1825 case GL_COLOR_ARRAY_TYPE:
1826 case GL_NORMAL_ARRAY_TYPE:
1827 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1828 case GL_TEXTURE_COORD_ARRAY_TYPE:
1829 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1830 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1831 break;
1832
jchen1082af6202018-06-22 10:59:52 +08001833 // GL_KHR_parallel_shader_compile
1834 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1835 *params = mGLState.getMaxShaderCompilerThreads();
1836 break;
1837
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001838 // GL_EXT_blend_func_extended
1839 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1840 *params = mExtensions.maxDualSourceDrawBuffers;
1841 break;
1842
Jamie Madill231c7f52017-04-26 13:45:37 -04001843 default:
Jamie Madille98b1b52018-03-08 09:47:23 -05001844 handleError(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001845 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001846 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001847}
1848
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001849void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001850{
Shannon Woods53a94a82014-06-24 15:20:36 -04001851 // Queries about context capabilities and maximums are answered by Context.
1852 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001853 switch (pname)
1854 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001855 case GL_MAX_ELEMENT_INDEX:
1856 *params = mCaps.maxElementIndex;
1857 break;
1858 case GL_MAX_UNIFORM_BLOCK_SIZE:
1859 *params = mCaps.maxUniformBlockSize;
1860 break;
1861 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001862 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001863 break;
1864 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001865 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001866 break;
1867 case GL_MAX_SERVER_WAIT_TIMEOUT:
1868 *params = mCaps.maxServerWaitTimeout;
1869 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001870
Jamie Madill231c7f52017-04-26 13:45:37 -04001871 // GL_EXT_disjoint_timer_query
1872 case GL_TIMESTAMP_EXT:
1873 *params = mImplementation->getTimestamp();
1874 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001875
Jamie Madill231c7f52017-04-26 13:45:37 -04001876 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1877 *params = mCaps.maxShaderStorageBlockSize;
1878 break;
1879 default:
1880 UNREACHABLE();
1881 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001882 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001883}
1884
Geoff Lang70d0f492015-12-10 17:45:46 -05001885void Context::getPointerv(GLenum pname, void **params) const
1886{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001887 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001888}
1889
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001890void Context::getPointervRobustANGLERobust(GLenum pname,
1891 GLsizei bufSize,
1892 GLsizei *length,
1893 void **params)
1894{
1895 UNIMPLEMENTED();
1896}
1897
Martin Radev66fb8202016-07-28 11:45:20 +03001898void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001899{
Shannon Woods53a94a82014-06-24 15:20:36 -04001900 // Queries about context capabilities and maximums are answered by Context.
1901 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001902
1903 GLenum nativeType;
1904 unsigned int numParams;
1905 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1906 ASSERT(queryStatus);
1907
1908 if (nativeType == GL_INT)
1909 {
1910 switch (target)
1911 {
1912 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1913 ASSERT(index < 3u);
1914 *data = mCaps.maxComputeWorkGroupCount[index];
1915 break;
1916 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1917 ASSERT(index < 3u);
1918 *data = mCaps.maxComputeWorkGroupSize[index];
1919 break;
1920 default:
1921 mGLState.getIntegeri_v(target, index, data);
1922 }
1923 }
1924 else
1925 {
1926 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1927 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001928}
1929
Brandon Jones59770802018-04-02 13:18:42 -07001930void Context::getIntegeri_vRobust(GLenum target,
1931 GLuint index,
1932 GLsizei bufSize,
1933 GLsizei *length,
1934 GLint *data)
1935{
1936 getIntegeri_v(target, index, data);
1937}
1938
Martin Radev66fb8202016-07-28 11:45:20 +03001939void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001940{
Shannon Woods53a94a82014-06-24 15:20:36 -04001941 // Queries about context capabilities and maximums are answered by Context.
1942 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001943
1944 GLenum nativeType;
1945 unsigned int numParams;
1946 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1947 ASSERT(queryStatus);
1948
1949 if (nativeType == GL_INT_64_ANGLEX)
1950 {
1951 mGLState.getInteger64i_v(target, index, data);
1952 }
1953 else
1954 {
1955 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1956 }
1957}
1958
Brandon Jones59770802018-04-02 13:18:42 -07001959void Context::getInteger64i_vRobust(GLenum target,
1960 GLuint index,
1961 GLsizei bufSize,
1962 GLsizei *length,
1963 GLint64 *data)
1964{
1965 getInteger64i_v(target, index, data);
1966}
1967
Martin Radev66fb8202016-07-28 11:45:20 +03001968void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1969{
1970 // Queries about context capabilities and maximums are answered by Context.
1971 // Queries about current GL state values are answered by State.
1972
1973 GLenum nativeType;
1974 unsigned int numParams;
1975 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1976 ASSERT(queryStatus);
1977
1978 if (nativeType == GL_BOOL)
1979 {
1980 mGLState.getBooleani_v(target, index, data);
1981 }
1982 else
1983 {
1984 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1985 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001986}
1987
Brandon Jones59770802018-04-02 13:18:42 -07001988void Context::getBooleani_vRobust(GLenum target,
1989 GLuint index,
1990 GLsizei bufSize,
1991 GLsizei *length,
1992 GLboolean *data)
1993{
1994 getBooleani_v(target, index, data);
1995}
1996
Corentin Wallez336129f2017-10-17 15:55:40 -04001997void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001998{
1999 Buffer *buffer = mGLState.getTargetBuffer(target);
2000 QueryBufferParameteriv(buffer, pname, params);
2001}
2002
Brandon Jones59770802018-04-02 13:18:42 -07002003void Context::getBufferParameterivRobust(BufferBinding target,
2004 GLenum pname,
2005 GLsizei bufSize,
2006 GLsizei *length,
2007 GLint *params)
2008{
2009 getBufferParameteriv(target, pname, params);
2010}
2011
He Yunchao010e4db2017-03-03 14:22:06 +08002012void Context::getFramebufferAttachmentParameteriv(GLenum target,
2013 GLenum attachment,
2014 GLenum pname,
2015 GLint *params)
2016{
2017 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002018 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002019}
2020
Brandon Jones59770802018-04-02 13:18:42 -07002021void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
2022 GLenum attachment,
2023 GLenum pname,
2024 GLsizei bufSize,
2025 GLsizei *length,
2026 GLint *params)
2027{
2028 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
2029}
2030
He Yunchao010e4db2017-03-03 14:22:06 +08002031void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2032{
2033 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2034 QueryRenderbufferiv(this, renderbuffer, pname, params);
2035}
2036
Brandon Jones59770802018-04-02 13:18:42 -07002037void Context::getRenderbufferParameterivRobust(GLenum target,
2038 GLenum pname,
2039 GLsizei bufSize,
2040 GLsizei *length,
2041 GLint *params)
2042{
2043 getRenderbufferParameteriv(target, pname, params);
2044}
2045
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002046void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002047{
Till Rathmannb8543632018-10-02 19:46:14 +02002048 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002049 QueryTexParameterfv(texture, pname, params);
2050}
2051
Brandon Jones59770802018-04-02 13:18:42 -07002052void Context::getTexParameterfvRobust(TextureType target,
2053 GLenum pname,
2054 GLsizei bufSize,
2055 GLsizei *length,
2056 GLfloat *params)
2057{
2058 getTexParameterfv(target, pname, params);
2059}
2060
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002061void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002062{
Till Rathmannb8543632018-10-02 19:46:14 +02002063 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002064 QueryTexParameteriv(texture, pname, params);
2065}
Jiajia Qin5451d532017-11-16 17:16:34 +08002066
Till Rathmannb8543632018-10-02 19:46:14 +02002067void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2068{
2069 const Texture *const texture = getTargetTexture(target);
2070 QueryTexParameterIiv(texture, pname, params);
2071}
2072
2073void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2074{
2075 const Texture *const texture = getTargetTexture(target);
2076 QueryTexParameterIuiv(texture, pname, params);
2077}
2078
Brandon Jones59770802018-04-02 13:18:42 -07002079void Context::getTexParameterivRobust(TextureType target,
2080 GLenum pname,
2081 GLsizei bufSize,
2082 GLsizei *length,
2083 GLint *params)
2084{
2085 getTexParameteriv(target, pname, params);
2086}
2087
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002088void Context::getTexParameterIivRobust(TextureType target,
2089 GLenum pname,
2090 GLsizei bufSize,
2091 GLsizei *length,
2092 GLint *params)
2093{
2094 UNIMPLEMENTED();
2095}
2096
2097void Context::getTexParameterIuivRobust(TextureType target,
2098 GLenum pname,
2099 GLsizei bufSize,
2100 GLsizei *length,
2101 GLuint *params)
2102{
2103 UNIMPLEMENTED();
2104}
2105
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002106void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002107{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002108 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002109 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002110}
2111
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002112void Context::getTexLevelParameterivRobust(TextureTarget target,
2113 GLint level,
2114 GLenum pname,
2115 GLsizei bufSize,
2116 GLsizei *length,
2117 GLint *params)
2118{
2119 UNIMPLEMENTED();
2120}
2121
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002122void Context::getTexLevelParameterfv(TextureTarget target,
2123 GLint level,
2124 GLenum pname,
2125 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002126{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002127 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002128 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002129}
2130
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002131void Context::getTexLevelParameterfvRobust(TextureTarget target,
2132 GLint level,
2133 GLenum pname,
2134 GLsizei bufSize,
2135 GLsizei *length,
2136 GLfloat *params)
2137{
2138 UNIMPLEMENTED();
2139}
2140
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002141void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002142{
Till Rathmannb8543632018-10-02 19:46:14 +02002143 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002144 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002145 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002146}
2147
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002148void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002149{
Till Rathmannb8543632018-10-02 19:46:14 +02002150 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002151 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002152 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002153}
2154
Brandon Jones59770802018-04-02 13:18:42 -07002155void Context::texParameterfvRobust(TextureType target,
2156 GLenum pname,
2157 GLsizei bufSize,
2158 const GLfloat *params)
2159{
2160 texParameterfv(target, pname, params);
2161}
2162
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002163void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002164{
Till Rathmannb8543632018-10-02 19:46:14 +02002165 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002166 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04002167 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002168}
2169
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002170void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002171{
Till Rathmannb8543632018-10-02 19:46:14 +02002172 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002173 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04002174 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08002175}
2176
Till Rathmannb8543632018-10-02 19:46:14 +02002177void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2178{
2179 Texture *const texture = getTargetTexture(target);
2180 SetTexParameterIiv(this, texture, pname, params);
2181 onTextureChange(texture);
2182}
2183
2184void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2185{
2186 Texture *const texture = getTargetTexture(target);
2187 SetTexParameterIuiv(this, texture, pname, params);
2188 onTextureChange(texture);
2189}
2190
Brandon Jones59770802018-04-02 13:18:42 -07002191void Context::texParameterivRobust(TextureType target,
2192 GLenum pname,
2193 GLsizei bufSize,
2194 const GLint *params)
2195{
2196 texParameteriv(target, pname, params);
2197}
2198
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002199void Context::texParameterIivRobust(TextureType target,
2200 GLenum pname,
2201 GLsizei bufSize,
2202 const GLint *params)
2203{
2204 UNIMPLEMENTED();
2205}
2206
2207void Context::texParameterIuivRobust(TextureType target,
2208 GLenum pname,
2209 GLsizei bufSize,
2210 const GLuint *params)
2211{
2212 UNIMPLEMENTED();
2213}
2214
Jamie Madill493f9572018-05-24 19:52:15 -04002215void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002216{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002217 // No-op if count draws no primitives for given mode
2218 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002219 {
2220 return;
2221 }
2222
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002223 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002224 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
Jamie Madill09463932018-04-04 05:26:59 -04002225 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count, 1);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002226}
2227
Jamie Madill493f9572018-05-24 19:52:15 -04002228void Context::drawArraysInstanced(PrimitiveMode mode,
2229 GLint first,
2230 GLsizei count,
2231 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002232{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002233 // No-op if count draws no primitives for given mode
2234 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002235 {
2236 return;
2237 }
2238
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002239 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002240 ANGLE_CONTEXT_TRY(
2241 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madill09463932018-04-04 05:26:59 -04002242 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(), count,
2243 instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002244}
2245
Jamie Madill493f9572018-05-24 19:52:15 -04002246void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002247{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002248 // No-op if count draws no primitives for given mode
2249 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002250 {
2251 return;
2252 }
2253
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002254 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002255 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04002256}
2257
Jamie Madill493f9572018-05-24 19:52:15 -04002258void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002259 GLsizei count,
2260 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002261 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002262 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002263{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002264 // No-op if count draws no primitives for given mode
2265 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002266 {
2267 return;
2268 }
2269
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002270 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002271 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002272 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002273}
2274
Jamie Madill493f9572018-05-24 19:52:15 -04002275void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002276 GLuint start,
2277 GLuint end,
2278 GLsizei count,
2279 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002280 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002281{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002282 // No-op if count draws no primitives for given mode
2283 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002284 {
2285 return;
2286 }
2287
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002288 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002289 ANGLE_CONTEXT_TRY(
2290 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002291}
2292
Jamie Madill493f9572018-05-24 19:52:15 -04002293void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002294{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002295 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002296 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002297}
2298
Jamie Madill493f9572018-05-24 19:52:15 -04002299void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002300{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002301 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002302 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002303}
2304
Jamie Madill675fe712016-12-19 13:07:54 -05002305void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002306{
Jamie Madillafa02a22017-11-23 12:57:38 -05002307 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002308}
2309
Jamie Madill675fe712016-12-19 13:07:54 -05002310void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002311{
Jamie Madillafa02a22017-11-23 12:57:38 -05002312 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002313}
2314
Austin Kinross6ee1e782015-05-29 17:05:37 -07002315void Context::insertEventMarker(GLsizei length, const char *marker)
2316{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002317 ASSERT(mImplementation);
2318 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002319}
2320
2321void Context::pushGroupMarker(GLsizei length, const char *marker)
2322{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002323 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002324
2325 if (marker == nullptr)
2326 {
2327 // From the EXT_debug_marker spec,
2328 // "If <marker> is null then an empty string is pushed on the stack."
2329 mImplementation->pushGroupMarker(length, "");
2330 }
2331 else
2332 {
2333 mImplementation->pushGroupMarker(length, marker);
2334 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002335}
2336
2337void Context::popGroupMarker()
2338{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002339 ASSERT(mImplementation);
2340 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002341}
2342
Geoff Langd8605522016-04-13 10:19:12 -04002343void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2344{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002345 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002346 ASSERT(programObject);
2347
2348 programObject->bindUniformLocation(location, name);
2349}
2350
Brandon Jones59770802018-04-02 13:18:42 -07002351void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002352{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002353 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002354}
2355
Brandon Jones59770802018-04-02 13:18:42 -07002356void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002357{
2358 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2359}
2360
Brandon Jones59770802018-04-02 13:18:42 -07002361void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002362{
2363 GLfloat I[16];
2364 angle::Matrix<GLfloat>::setToIdentity(I);
2365
2366 mGLState.loadPathRenderingMatrix(matrixMode, I);
2367}
2368
2369void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2370{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002371 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002372 if (!pathObj)
2373 return;
2374
Geoff Lang9bf86f02018-07-26 11:46:34 -04002375 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002376
2377 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2378}
2379
2380void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2381{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002382 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002383 if (!pathObj)
2384 return;
2385
Geoff Lang9bf86f02018-07-26 11:46:34 -04002386 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002387
2388 mImplementation->stencilStrokePath(pathObj, reference, mask);
2389}
2390
2391void Context::coverFillPath(GLuint path, GLenum coverMode)
2392{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002393 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002394 if (!pathObj)
2395 return;
2396
Geoff Lang9bf86f02018-07-26 11:46:34 -04002397 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002398
2399 mImplementation->coverFillPath(pathObj, coverMode);
2400}
2401
2402void Context::coverStrokePath(GLuint path, GLenum coverMode)
2403{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002404 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002405 if (!pathObj)
2406 return;
2407
Geoff Lang9bf86f02018-07-26 11:46:34 -04002408 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002409
2410 mImplementation->coverStrokePath(pathObj, coverMode);
2411}
2412
2413void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2414{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002415 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002416 if (!pathObj)
2417 return;
2418
Geoff Lang9bf86f02018-07-26 11:46:34 -04002419 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002420
2421 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2422}
2423
2424void Context::stencilThenCoverStrokePath(GLuint path,
2425 GLint reference,
2426 GLuint mask,
2427 GLenum coverMode)
2428{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002429 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002430 if (!pathObj)
2431 return;
2432
Geoff Lang9bf86f02018-07-26 11:46:34 -04002433 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002434
2435 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2436}
2437
Sami Väisänend59ca052016-06-21 16:10:00 +03002438void Context::coverFillPathInstanced(GLsizei numPaths,
2439 GLenum pathNameType,
2440 const void *paths,
2441 GLuint pathBase,
2442 GLenum coverMode,
2443 GLenum transformType,
2444 const GLfloat *transformValues)
2445{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002446 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002447
Geoff Lang9bf86f02018-07-26 11:46:34 -04002448 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002449
2450 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2451}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002452
Sami Väisänend59ca052016-06-21 16:10:00 +03002453void Context::coverStrokePathInstanced(GLsizei numPaths,
2454 GLenum pathNameType,
2455 const void *paths,
2456 GLuint pathBase,
2457 GLenum coverMode,
2458 GLenum transformType,
2459 const GLfloat *transformValues)
2460{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002461 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002462
2463 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002464 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002465
2466 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2467 transformValues);
2468}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002469
Sami Väisänend59ca052016-06-21 16:10:00 +03002470void Context::stencilFillPathInstanced(GLsizei numPaths,
2471 GLenum pathNameType,
2472 const void *paths,
2473 GLuint pathBase,
2474 GLenum fillMode,
2475 GLuint mask,
2476 GLenum transformType,
2477 const GLfloat *transformValues)
2478{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002479 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002480
2481 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002482 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002483
2484 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2485 transformValues);
2486}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002487
Sami Väisänend59ca052016-06-21 16:10:00 +03002488void Context::stencilStrokePathInstanced(GLsizei numPaths,
2489 GLenum pathNameType,
2490 const void *paths,
2491 GLuint pathBase,
2492 GLint reference,
2493 GLuint mask,
2494 GLenum transformType,
2495 const GLfloat *transformValues)
2496{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002497 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002498
Geoff Lang9bf86f02018-07-26 11:46:34 -04002499 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002500
2501 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2502 transformValues);
2503}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002504
Sami Väisänend59ca052016-06-21 16:10:00 +03002505void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2506 GLenum pathNameType,
2507 const void *paths,
2508 GLuint pathBase,
2509 GLenum fillMode,
2510 GLuint mask,
2511 GLenum coverMode,
2512 GLenum transformType,
2513 const GLfloat *transformValues)
2514{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002515 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002516
Geoff Lang9bf86f02018-07-26 11:46:34 -04002517 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002518
2519 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2520 transformType, transformValues);
2521}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002522
Sami Väisänend59ca052016-06-21 16:10:00 +03002523void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2524 GLenum pathNameType,
2525 const void *paths,
2526 GLuint pathBase,
2527 GLint reference,
2528 GLuint mask,
2529 GLenum coverMode,
2530 GLenum transformType,
2531 const GLfloat *transformValues)
2532{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002533 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002534
Geoff Lang9bf86f02018-07-26 11:46:34 -04002535 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002536
2537 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2538 transformType, transformValues);
2539}
2540
Sami Väisänen46eaa942016-06-29 10:26:37 +03002541void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2542{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002543 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002544
2545 programObject->bindFragmentInputLocation(location, name);
2546}
2547
2548void Context::programPathFragmentInputGen(GLuint program,
2549 GLint location,
2550 GLenum genMode,
2551 GLint components,
2552 const GLfloat *coeffs)
2553{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002554 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002555
jchen103fd614d2018-08-13 12:21:58 +08002556 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002557}
2558
jchen1015015f72017-03-16 13:54:21 +08002559GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2560{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002561 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002562 return QueryProgramResourceIndex(programObject, programInterface, name);
2563}
2564
jchen10fd7c3b52017-03-21 15:36:03 +08002565void Context::getProgramResourceName(GLuint program,
2566 GLenum programInterface,
2567 GLuint index,
2568 GLsizei bufSize,
2569 GLsizei *length,
2570 GLchar *name)
2571{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002572 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002573 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2574}
2575
jchen10191381f2017-04-11 13:59:04 +08002576GLint Context::getProgramResourceLocation(GLuint program,
2577 GLenum programInterface,
2578 const GLchar *name)
2579{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002580 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002581 return QueryProgramResourceLocation(programObject, programInterface, name);
2582}
2583
jchen10880683b2017-04-12 16:21:55 +08002584void Context::getProgramResourceiv(GLuint program,
2585 GLenum programInterface,
2586 GLuint index,
2587 GLsizei propCount,
2588 const GLenum *props,
2589 GLsizei bufSize,
2590 GLsizei *length,
2591 GLint *params)
2592{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002593 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002594 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2595 length, params);
2596}
2597
jchen10d9cd7b72017-08-30 15:04:25 +08002598void Context::getProgramInterfaceiv(GLuint program,
2599 GLenum programInterface,
2600 GLenum pname,
2601 GLint *params)
2602{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002603 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002604 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2605}
2606
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002607void Context::getProgramInterfaceivRobust(GLuint program,
2608 GLenum programInterface,
2609 GLenum pname,
2610 GLsizei bufSize,
2611 GLsizei *length,
2612 GLint *params)
2613{
2614 UNIMPLEMENTED();
2615}
2616
Jamie Madill306b6c12018-07-27 08:12:49 -04002617void Context::handleError(const Error &error) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002618{
Jamie Madill6b873dd2018-07-12 23:56:30 -04002619 mErrors.handleError(error);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002620}
2621
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002622void Context::handleError(GLenum errorCode,
2623 const char *message,
2624 const char *file,
2625 const char *function,
2626 unsigned int line)
2627{
2628 mErrors.handleError(errorCode, message, file, function, line);
2629}
2630
Jamie Madilla139f012018-10-10 16:13:03 -04002631void Context::validationError(GLenum errorCode, const char *message)
2632{
2633 mErrors.validationError(errorCode, message);
2634}
2635
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636// Get one of the recorded errors and clear its flag, if any.
2637// [OpenGL ES 2.0.24] section 2.5 page 13.
2638GLenum Context::getError()
2639{
Geoff Langda5777c2014-07-11 09:52:58 -04002640 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002641 {
Geoff Langda5777c2014-07-11 09:52:58 -04002642 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002643 }
Geoff Langda5777c2014-07-11 09:52:58 -04002644 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002645 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002646 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002647 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002648}
2649
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002650// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002651void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002652{
2653 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002654 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002655 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002656 mContextLostForced = true;
2657 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002658 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002659}
2660
Jamie Madillfa920eb2018-01-04 11:45:50 -05002661GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002662{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002663 // Even if the application doesn't want to know about resets, we want to know
2664 // as it will allow us to skip all the calls.
2665 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002666 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002667 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002668 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002669 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002670 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002671
2672 // EXT_robustness, section 2.6: If the reset notification behavior is
2673 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2674 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2675 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002676 }
2677
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002678 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2679 // status should be returned at least once, and GL_NO_ERROR should be returned
2680 // once the device has finished resetting.
2681 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002682 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002683 ASSERT(mResetStatus == GL_NO_ERROR);
2684 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002685
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002686 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002687 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002688 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002689 }
2690 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002691 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002692 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002693 // If markContextLost was used to mark the context lost then
2694 // assume that is not recoverable, and continue to report the
2695 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002696 mResetStatus = mImplementation->getResetStatus();
2697 }
Jamie Madill893ab082014-05-16 16:56:10 -04002698
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002699 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002700}
2701
2702bool Context::isResetNotificationEnabled()
2703{
2704 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2705}
2706
Corentin Walleze3b10e82015-05-20 11:06:25 -04002707const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002708{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002709 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002710}
2711
2712EGLenum Context::getClientType() const
2713{
2714 return mClientType;
2715}
2716
2717EGLenum Context::getRenderBuffer() const
2718{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002719 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2720 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002721 {
2722 return EGL_NONE;
2723 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002724
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002725 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002726 ASSERT(backAttachment != nullptr);
2727 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002728}
2729
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002730VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002731{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002732 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002733 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2734 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002735 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002736 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2737 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002738
Jamie Madill96a483b2017-06-27 16:49:21 -04002739 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002740 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002741
2742 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002743}
2744
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002745TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002746{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002747 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002748 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2749 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002750 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002751 transformFeedback =
2752 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002753 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002754 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002755 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002756
2757 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002758}
2759
2760bool Context::isVertexArrayGenerated(GLuint vertexArray)
2761{
Jamie Madill96a483b2017-06-27 16:49:21 -04002762 ASSERT(mVertexArrayMap.contains(0));
2763 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002764}
2765
2766bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2767{
Jamie Madill96a483b2017-06-27 16:49:21 -04002768 ASSERT(mTransformFeedbackMap.contains(0));
2769 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002770}
2771
Shannon Woods53a94a82014-06-24 15:20:36 -04002772void Context::detachTexture(GLuint texture)
2773{
2774 // Simple pass-through to State's detachTexture method, as textures do not require
2775 // allocation map management either here or in the resource manager at detach time.
2776 // Zero textures are held by the Context, and we don't attempt to request them from
2777 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002778 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002779}
2780
James Darpinian4d9d4832018-03-13 12:43:28 -07002781void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002782{
Yuly Novikov5807a532015-12-03 13:01:22 -05002783 // Simple pass-through to State's detachBuffer method, since
2784 // only buffer attachments to container objects that are bound to the current context
2785 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002786
Yuly Novikov5807a532015-12-03 13:01:22 -05002787 // [OpenGL ES 3.2] section 5.1.2 page 45:
2788 // Attachments to unbound container objects, such as
2789 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2790 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002791 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002792}
2793
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002794void Context::detachFramebuffer(GLuint framebuffer)
2795{
Shannon Woods53a94a82014-06-24 15:20:36 -04002796 // Framebuffer detachment is handled by Context, because 0 is a valid
2797 // Framebuffer object, and a pointer to it must be passed from Context
2798 // to State at binding time.
2799
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002800 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002801 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2802 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2803 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002804
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002805 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002806 {
2807 bindReadFramebuffer(0);
2808 }
2809
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002810 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002811 {
2812 bindDrawFramebuffer(0);
2813 }
2814}
2815
2816void Context::detachRenderbuffer(GLuint renderbuffer)
2817{
Jamie Madilla02315b2017-02-23 14:14:47 -05002818 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002819}
2820
Jamie Madill57a89722013-07-02 11:57:03 -04002821void Context::detachVertexArray(GLuint vertexArray)
2822{
Jamie Madill77a72f62015-04-14 11:18:32 -04002823 // Vertex array detachment is handled by Context, because 0 is a valid
2824 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002825 // binding time.
2826
Jamie Madill57a89722013-07-02 11:57:03 -04002827 // [OpenGL ES 3.0.2] section 2.10 page 43:
2828 // If a vertex array object that is currently bound is deleted, the binding
2829 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002830 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002831 {
2832 bindVertexArray(0);
2833 }
2834}
2835
Geoff Langc8058452014-02-03 12:04:11 -05002836void Context::detachTransformFeedback(GLuint transformFeedback)
2837{
Corentin Walleza2257da2016-04-19 16:43:12 -04002838 // Transform feedback detachment is handled by Context, because 0 is a valid
2839 // transform feedback, and a pointer to it must be passed from Context to State at
2840 // binding time.
2841
2842 // The OpenGL specification doesn't mention what should happen when the currently bound
2843 // transform feedback object is deleted. Since it is a container object, we treat it like
2844 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002845 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002846 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002847 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002848 }
Geoff Langc8058452014-02-03 12:04:11 -05002849}
2850
Jamie Madilldc356042013-07-19 16:36:57 -04002851void Context::detachSampler(GLuint sampler)
2852{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002853 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002854}
2855
Yunchao Hea336b902017-08-02 16:05:21 +08002856void Context::detachProgramPipeline(GLuint pipeline)
2857{
2858 mGLState.detachProgramPipeline(this, pipeline);
2859}
2860
Jamie Madill3ef140a2017-08-26 23:11:21 -04002861void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002862{
Shaodde78e82017-05-22 14:13:27 +08002863 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002864 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002865}
2866
Jamie Madille29d1672013-07-19 16:36:57 -04002867void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2868{
Till Rathmannb8543632018-10-02 19:46:14 +02002869 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002870 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002871 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002872}
Jamie Madille29d1672013-07-19 16:36:57 -04002873
Geoff Langc1984ed2016-10-07 12:41:00 -04002874void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2875{
Till Rathmannb8543632018-10-02 19:46:14 +02002876 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002877 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002878 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002879}
2880
Till Rathmannb8543632018-10-02 19:46:14 +02002881void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2882{
2883 Sampler *const samplerObject =
2884 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2885 SetSamplerParameterIiv(this, samplerObject, pname, param);
2886}
2887
2888void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2889{
2890 Sampler *const samplerObject =
2891 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2892 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2893}
2894
Brandon Jones59770802018-04-02 13:18:42 -07002895void Context::samplerParameterivRobust(GLuint sampler,
2896 GLenum pname,
2897 GLsizei bufSize,
2898 const GLint *param)
2899{
2900 samplerParameteriv(sampler, pname, param);
2901}
2902
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002903void Context::samplerParameterIivRobust(GLuint sampler,
2904 GLenum pname,
2905 GLsizei bufSize,
2906 const GLint *param)
2907{
2908 UNIMPLEMENTED();
2909}
2910
2911void Context::samplerParameterIuivRobust(GLuint sampler,
2912 GLenum pname,
2913 GLsizei bufSize,
2914 const GLuint *param)
2915{
2916 UNIMPLEMENTED();
2917}
2918
Jamie Madille29d1672013-07-19 16:36:57 -04002919void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2920{
Till Rathmannb8543632018-10-02 19:46:14 +02002921 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002922 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002923 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002924}
2925
Geoff Langc1984ed2016-10-07 12:41:00 -04002926void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002927{
Till Rathmannb8543632018-10-02 19:46:14 +02002928 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002929 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002930 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002931}
2932
Brandon Jones59770802018-04-02 13:18:42 -07002933void Context::samplerParameterfvRobust(GLuint sampler,
2934 GLenum pname,
2935 GLsizei bufSize,
2936 const GLfloat *param)
2937{
2938 samplerParameterfv(sampler, pname, param);
2939}
2940
Geoff Langc1984ed2016-10-07 12:41:00 -04002941void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002942{
Till Rathmannb8543632018-10-02 19:46:14 +02002943 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002944 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002945 QuerySamplerParameteriv(samplerObject, pname, params);
2946}
Jamie Madill9675b802013-07-19 16:36:59 -04002947
Till Rathmannb8543632018-10-02 19:46:14 +02002948void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2949{
2950 const Sampler *const samplerObject =
2951 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2952 QuerySamplerParameterIiv(samplerObject, pname, params);
2953}
2954
2955void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2956{
2957 const Sampler *const samplerObject =
2958 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2959 QuerySamplerParameterIuiv(samplerObject, pname, params);
2960}
2961
Brandon Jones59770802018-04-02 13:18:42 -07002962void Context::getSamplerParameterivRobust(GLuint sampler,
2963 GLenum pname,
2964 GLsizei bufSize,
2965 GLsizei *length,
2966 GLint *params)
2967{
2968 getSamplerParameteriv(sampler, pname, params);
2969}
2970
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002971void Context::getSamplerParameterIivRobust(GLuint sampler,
2972 GLenum pname,
2973 GLsizei bufSize,
2974 GLsizei *length,
2975 GLint *params)
2976{
2977 UNIMPLEMENTED();
2978}
2979
2980void Context::getSamplerParameterIuivRobust(GLuint sampler,
2981 GLenum pname,
2982 GLsizei bufSize,
2983 GLsizei *length,
2984 GLuint *params)
2985{
2986 UNIMPLEMENTED();
2987}
2988
Geoff Langc1984ed2016-10-07 12:41:00 -04002989void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2990{
Till Rathmannb8543632018-10-02 19:46:14 +02002991 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002992 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002993 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002994}
2995
Brandon Jones59770802018-04-02 13:18:42 -07002996void Context::getSamplerParameterfvRobust(GLuint sampler,
2997 GLenum pname,
2998 GLsizei bufSize,
2999 GLsizei *length,
3000 GLfloat *params)
3001{
3002 getSamplerParameterfv(sampler, pname, params);
3003}
3004
Olli Etuahof0fee072016-03-30 15:11:58 +03003005void Context::programParameteri(GLuint program, GLenum pname, GLint value)
3006{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04003007 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08003008 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03003009}
3010
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003011void Context::initRendererString()
3012{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003013 std::ostringstream rendererString;
3014 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003015 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00003016 rendererString << ")";
3017
Geoff Langcec35902014-04-16 10:52:36 -04003018 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003019}
3020
Geoff Langc339c4e2016-11-29 10:37:36 -05003021void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003022{
Geoff Langc339c4e2016-11-29 10:37:36 -05003023 const Version &clientVersion = getClientVersion();
3024
3025 std::ostringstream versionString;
3026 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
3027 << ANGLE_VERSION_STRING << ")";
3028 mVersionString = MakeStaticString(versionString.str());
3029
3030 std::ostringstream shadingLanguageVersionString;
3031 shadingLanguageVersionString << "OpenGL ES GLSL ES "
3032 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
3033 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
3034 << ")";
3035 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003036}
3037
Geoff Langcec35902014-04-16 10:52:36 -04003038void Context::initExtensionStrings()
3039{
Geoff Langc339c4e2016-11-29 10:37:36 -05003040 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
3041 std::ostringstream combinedStringStream;
3042 std::copy(strings.begin(), strings.end(),
3043 std::ostream_iterator<const char *>(combinedStringStream, " "));
3044 return MakeStaticString(combinedStringStream.str());
3045 };
3046
3047 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003048 for (const auto &extensionString : mExtensions.getStrings())
3049 {
3050 mExtensionStrings.push_back(MakeStaticString(extensionString));
3051 }
Geoff Langc339c4e2016-11-29 10:37:36 -05003052 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003053
Geoff Langc339c4e2016-11-29 10:37:36 -05003054 mRequestableExtensionStrings.clear();
3055 for (const auto &extensionInfo : GetExtensionInfoMap())
3056 {
3057 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08003058 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003059 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003060 {
3061 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
3062 }
3063 }
3064 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003065}
3066
Geoff Langc339c4e2016-11-29 10:37:36 -05003067const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003068{
Geoff Langc339c4e2016-11-29 10:37:36 -05003069 switch (name)
3070 {
3071 case GL_VENDOR:
3072 return reinterpret_cast<const GLubyte *>("Google Inc.");
3073
3074 case GL_RENDERER:
3075 return reinterpret_cast<const GLubyte *>(mRendererString);
3076
3077 case GL_VERSION:
3078 return reinterpret_cast<const GLubyte *>(mVersionString);
3079
3080 case GL_SHADING_LANGUAGE_VERSION:
3081 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3082
3083 case GL_EXTENSIONS:
3084 return reinterpret_cast<const GLubyte *>(mExtensionString);
3085
3086 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3087 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3088
3089 default:
3090 UNREACHABLE();
3091 return nullptr;
3092 }
Geoff Langcec35902014-04-16 10:52:36 -04003093}
3094
Geoff Langc339c4e2016-11-29 10:37:36 -05003095const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003096{
Geoff Langc339c4e2016-11-29 10:37:36 -05003097 switch (name)
3098 {
3099 case GL_EXTENSIONS:
3100 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3101
3102 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3103 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3104
3105 default:
3106 UNREACHABLE();
3107 return nullptr;
3108 }
Geoff Langcec35902014-04-16 10:52:36 -04003109}
3110
3111size_t Context::getExtensionStringCount() const
3112{
3113 return mExtensionStrings.size();
3114}
3115
Geoff Lang111a99e2017-10-17 10:58:41 -04003116bool Context::isExtensionRequestable(const char *name)
3117{
3118 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3119 auto extension = extensionInfos.find(name);
3120
Geoff Lang111a99e2017-10-17 10:58:41 -04003121 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003122 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003123}
3124
Geoff Langc339c4e2016-11-29 10:37:36 -05003125void Context::requestExtension(const char *name)
3126{
3127 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3128 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3129 const auto &extension = extensionInfos.at(name);
3130 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003131 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003132
3133 if (mExtensions.*(extension.ExtensionsMember))
3134 {
3135 // Extension already enabled
3136 return;
3137 }
3138
3139 mExtensions.*(extension.ExtensionsMember) = true;
3140 updateCaps();
3141 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003142
Jamie Madill2f348d22017-06-05 10:50:59 -04003143 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3144 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003145
Jamie Madill81c2e252017-09-09 23:32:46 -04003146 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3147 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003148 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003149 for (auto &zeroTexture : mZeroTextures)
3150 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003151 if (zeroTexture.get() != nullptr)
3152 {
3153 zeroTexture->signalDirty(this, InitState::Initialized);
3154 }
Geoff Lang9aded172017-04-05 11:07:56 -04003155 }
3156
Jamie Madillb983a4b2018-08-01 11:34:51 -04003157 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003158}
3159
3160size_t Context::getRequestableExtensionStringCount() const
3161{
3162 return mRequestableExtensionStrings.size();
3163}
3164
Jamie Madill493f9572018-05-24 19:52:15 -04003165void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003166{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003167 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003168 ASSERT(transformFeedback != nullptr);
3169 ASSERT(!transformFeedback->isPaused());
3170
Jamie Madill6c1f6712017-02-14 19:08:04 -05003171 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Jamie Madilld84b6732018-09-06 15:54:35 -04003172 mStateCache.onTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003173}
3174
3175bool Context::hasActiveTransformFeedback(GLuint program) const
3176{
3177 for (auto pair : mTransformFeedbackMap)
3178 {
3179 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3180 {
3181 return true;
3182 }
3183 }
3184 return false;
3185}
3186
Geoff Lang33f11fb2018-05-07 13:42:47 -04003187Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003188{
3189 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3190
jchen1082af6202018-06-22 10:59:52 +08003191 // Explicitly enable GL_KHR_parallel_shader_compile
3192 supportedExtensions.parallelShaderCompile = true;
3193
Geoff Langb0f917f2017-12-05 13:41:54 -05003194 if (getClientVersion() < ES_2_0)
3195 {
3196 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003197 supportedExtensions.pointSizeArray = true;
3198 supportedExtensions.textureCubeMap = true;
3199 supportedExtensions.pointSprite = true;
3200 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003201 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003202 }
3203
3204 if (getClientVersion() < ES_3_0)
3205 {
3206 // Disable ES3+ extensions
3207 supportedExtensions.colorBufferFloat = false;
3208 supportedExtensions.eglImageExternalEssl3 = false;
3209 supportedExtensions.textureNorm16 = false;
3210 supportedExtensions.multiview = false;
3211 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003212 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003213 supportedExtensions.textureMultisample = false;
Geoff Lang7198ebc2018-11-22 14:36:06 -05003214
3215 // Don't expose GL_EXT_texture_sRGB_decode without sRGB texture support
3216 if (!supportedExtensions.sRGB)
3217 {
3218 supportedExtensions.textureSRGBDecode = false;
3219 }
Geoff Langb0f917f2017-12-05 13:41:54 -05003220 }
3221
3222 if (getClientVersion() < ES_3_1)
3223 {
3224 // Disable ES3.1+ extensions
3225 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003226
3227 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3228 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003229 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003230 }
3231
3232 if (getClientVersion() > ES_2_0)
3233 {
3234 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3235 // supportedExtensions.sRGB = false;
3236 }
3237
3238 // Some extensions are always available because they are implemented in the GL layer.
3239 supportedExtensions.bindUniformLocation = true;
3240 supportedExtensions.vertexArrayObject = true;
3241 supportedExtensions.bindGeneratesResource = true;
3242 supportedExtensions.clientArrays = true;
3243 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003244 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003245
3246 // Enable the no error extension if the context was created with the flag.
3247 supportedExtensions.noError = mSkipValidation;
3248
3249 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003250 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003251
3252 // Explicitly enable GL_KHR_debug
3253 supportedExtensions.debug = true;
3254 supportedExtensions.maxDebugMessageLength = 1024;
3255 supportedExtensions.maxDebugLoggedMessages = 1024;
3256 supportedExtensions.maxDebugGroupStackDepth = 1024;
3257 supportedExtensions.maxLabelLength = 1024;
3258
3259 // Explicitly enable GL_ANGLE_robust_client_memory
3260 supportedExtensions.robustClientMemory = true;
3261
3262 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003263 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003264
3265 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3266 // supports it.
3267 supportedExtensions.robustBufferAccessBehavior =
3268 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3269
3270 // Enable the cache control query unconditionally.
3271 supportedExtensions.programCacheControl = true;
3272
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003273 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003274 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003275 {
3276 // GL_ANGLE_explicit_context_gles1
3277 supportedExtensions.explicitContextGles1 = true;
3278 // GL_ANGLE_explicit_context
3279 supportedExtensions.explicitContext = true;
3280 }
3281
Geoff Lang79b91402018-10-04 15:11:30 -04003282 supportedExtensions.memorySize = true;
3283
Geoff Langb0f917f2017-12-05 13:41:54 -05003284 return supportedExtensions;
3285}
3286
Geoff Lang33f11fb2018-05-07 13:42:47 -04003287void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003288{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003289 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003290
Geoff Lang33f11fb2018-05-07 13:42:47 -04003291 mSupportedExtensions = generateSupportedExtensions();
3292 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003293
3294 mLimitations = mImplementation->getNativeLimitations();
3295
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003296 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3297 if (getClientVersion() < Version(2, 0))
3298 {
3299 mCaps.maxMultitextureUnits = 4;
3300 mCaps.maxClipPlanes = 6;
3301 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003302 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3303 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3304 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003305 mCaps.minSmoothPointSize = 1.0f;
3306 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003307 mCaps.minSmoothLineWidth = 1.0f;
3308 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003309 }
3310
Luc Ferronad2ae932018-06-11 15:31:17 -04003311 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003312 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003313
Luc Ferronad2ae932018-06-11 15:31:17 -04003314 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3315
Jamie Madill0f80ed82017-09-19 00:24:56 -04003316 if (getClientVersion() < ES_3_1)
3317 {
3318 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3319 }
3320 else
3321 {
3322 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3323 }
Geoff Lang301d1612014-07-09 10:34:37 -04003324
Jiawei Shao54aafe52018-04-27 14:54:57 +08003325 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3326 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003327 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3328
Jamie Madill0f80ed82017-09-19 00:24:56 -04003329 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3330 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3331
3332 // Limit textures as well, so we can use fast bitsets with texture bindings.
3333 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003334 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3335 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3336 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3337 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003338
Jiawei Shaodb342272017-09-27 10:21:45 +08003339 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3340
Geoff Langc287ea62016-09-16 14:46:51 -04003341 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003342 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003343 for (const auto &extensionInfo : GetExtensionInfoMap())
3344 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003345 // If the user has requested that extensions start disabled and they are requestable,
3346 // disable them.
3347 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003348 {
3349 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3350 }
3351 }
3352
3353 // Generate texture caps
3354 updateCaps();
3355}
3356
3357void Context::updateCaps()
3358{
Geoff Lang900013c2014-07-07 11:32:19 -04003359 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003360 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003361
Jamie Madill7b62cf92017-11-02 15:20:49 -04003362 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003363 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003364 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003365 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003366
Geoff Lang0d8b7242015-09-09 14:56:53 -04003367 // Update the format caps based on the client version and extensions.
3368 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3369 // ES3.
3370 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003371 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003372 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003373 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003374 formatCaps.textureAttachment =
3375 formatCaps.textureAttachment &&
3376 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3377 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3378 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003379
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003380 // OpenGL ES does not support multisampling with non-rendererable formats
3381 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003382 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003383 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003384 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003385 {
Geoff Langd87878e2014-09-19 15:42:59 -04003386 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003387 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003388 else
3389 {
3390 // We may have limited the max samples for some required renderbuffer formats due to
3391 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3392 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3393
3394 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3395 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3396 // exception of signed and unsigned integer formats."
3397 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3398 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3399 {
3400 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3401 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3402 }
3403
3404 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003405 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003406 {
3407 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3408 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3409 // the exception that the signed and unsigned integer formats are required only to
3410 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3411 // multisamples, which must be at least one."
3412 if (formatInfo.componentType == GL_INT ||
3413 formatInfo.componentType == GL_UNSIGNED_INT)
3414 {
3415 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3416 }
3417
3418 // GLES 3.1 section 19.3.1.
3419 if (formatCaps.texturable)
3420 {
3421 if (formatInfo.depthBits > 0)
3422 {
3423 mCaps.maxDepthTextureSamples =
3424 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3425 }
3426 else if (formatInfo.redBits > 0)
3427 {
3428 mCaps.maxColorTextureSamples =
3429 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3430 }
3431 }
3432 }
3433 }
Geoff Langd87878e2014-09-19 15:42:59 -04003434
3435 if (formatCaps.texturable && formatInfo.compressed)
3436 {
Geoff Langca271392017-04-05 12:30:00 -04003437 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003438 }
3439
Geoff Langca271392017-04-05 12:30:00 -04003440 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003441 }
Jamie Madill32447362017-06-28 14:53:52 -04003442
3443 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003444 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003445 {
3446 mMemoryProgramCache = nullptr;
3447 }
Corentin Walleze4477002017-12-01 14:39:58 -05003448
3449 // Compute which buffer types are allowed
3450 mValidBufferBindings.reset();
3451 mValidBufferBindings.set(BufferBinding::ElementArray);
3452 mValidBufferBindings.set(BufferBinding::Array);
3453
3454 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3455 {
3456 mValidBufferBindings.set(BufferBinding::PixelPack);
3457 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3458 }
3459
3460 if (getClientVersion() >= ES_3_0)
3461 {
3462 mValidBufferBindings.set(BufferBinding::CopyRead);
3463 mValidBufferBindings.set(BufferBinding::CopyWrite);
3464 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3465 mValidBufferBindings.set(BufferBinding::Uniform);
3466 }
3467
3468 if (getClientVersion() >= ES_3_1)
3469 {
3470 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3471 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3472 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3473 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3474 }
jchen107ae70d82018-07-06 13:47:01 +08003475
3476 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003477
3478 // Reinitialize state cache after extension changes.
3479 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003480}
3481
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003482void Context::initWorkarounds()
3483{
Jamie Madill761b02c2017-06-23 16:27:06 -04003484 // Apply back-end workarounds.
3485 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3486
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003487 // Lose the context upon out of memory error if the application is
3488 // expecting to watch for those events.
3489 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003490
3491 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3492 {
3493 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3494 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3495 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3496 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003497}
3498
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003499// Return true if the draw is a no-op, else return false.
3500// A no-op draw occurs if the count of vertices is less than the minimum required to
3501// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
3502bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
3503{
3504 return count < kMinimumPrimitiveCounts[mode];
3505}
3506
3507bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3508{
3509 return (instanceCount == 0) || noopDraw(mode, count);
3510}
3511
Jamie Madill6f755b22018-10-09 12:48:54 -04003512angle::Result Context::prepareForDraw(PrimitiveMode mode)
Jamie Madill05b35b22017-10-03 09:01:44 -04003513{
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003514 if (mGLES1Renderer)
3515 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003516 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mGLState));
Lingfeng Yang461b09a2018-04-23 09:02:09 -07003517 }
3518
Geoff Lang9bf86f02018-07-26 11:46:34 -04003519 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
Jamie Madilla59fc192017-11-02 12:57:58 -04003520
3521 if (isRobustResourceInitEnabled())
3522 {
3523 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
3524 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
3525 }
3526
Jamie Madill9e63a812018-11-16 12:30:04 +00003527 ANGLE_TRY(syncDirtyBits());
3528 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003529}
3530
Jamie Madill526392d2018-11-16 09:35:14 -05003531angle::Result Context::prepareForClear(GLbitfield mask)
Geoff Langd4fff502017-09-22 11:28:28 -04003532{
Geoff Langa8cb2872018-03-09 16:09:40 -05003533 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003534 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003535 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003536 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003537}
3538
Jamie Madill526392d2018-11-16 09:35:14 -05003539angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
Geoff Langd4fff502017-09-22 11:28:28 -04003540{
Geoff Langa8cb2872018-03-09 16:09:40 -05003541 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003542 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3543 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003544 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill526392d2018-11-16 09:35:14 -05003545 return angle::Result::Continue();
Jamie Madill05b35b22017-10-03 09:01:44 -04003546}
3547
Jamie Madill526392d2018-11-16 09:35:14 -05003548angle::Result Context::syncState(const State::DirtyBits &bitMask,
3549 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003550{
Geoff Langa8cb2872018-03-09 16:09:40 -05003551 ANGLE_TRY(syncDirtyObjects(objectMask));
3552 ANGLE_TRY(syncDirtyBits(bitMask));
Jamie Madill526392d2018-11-16 09:35:14 -05003553 return angle::Result::Continue();
Geoff Langd4fff502017-09-22 11:28:28 -04003554}
3555
Jamie Madill9e63a812018-11-16 12:30:04 +00003556angle::Result Context::syncDirtyBits()
3557{
3558 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
3559 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
3560 mGLState.clearDirtyBits();
3561 return angle::Result::Continue();
3562}
3563
3564angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
3565{
3566 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
3567 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
3568 mGLState.clearDirtyBits(dirtyBits);
3569 return angle::Result::Continue();
3570}
3571
3572angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
3573{
3574 return mGLState.syncDirtyObjects(this, objectMask);
3575}
3576
Jamie Madillc29968b2016-01-20 11:17:23 -05003577void Context::blitFramebuffer(GLint srcX0,
3578 GLint srcY0,
3579 GLint srcX1,
3580 GLint srcY1,
3581 GLint dstX0,
3582 GLint dstY0,
3583 GLint dstX1,
3584 GLint dstY1,
3585 GLbitfield mask,
3586 GLenum filter)
3587{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003588 if (mask == 0)
3589 {
3590 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3591 // buffers are copied.
3592 return;
3593 }
3594
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003595 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003596 ASSERT(drawFramebuffer);
3597
3598 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3599 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3600
Jamie Madillbc918e72018-03-08 09:47:21 -05003601 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003602
Jamie Madillc564c072017-06-01 12:45:42 -04003603 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003604}
Jamie Madillc29968b2016-01-20 11:17:23 -05003605
3606void Context::clear(GLbitfield mask)
3607{
Geoff Langd4fff502017-09-22 11:28:28 -04003608 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3609 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003610}
3611
3612void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3613{
Olli Etuaho78df3362018-10-05 16:43:27 +03003614 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3615 const FramebufferAttachment *attachment = nullptr;
3616 if (buffer == GL_DEPTH)
3617 {
3618 attachment = framebufferObject->getDepthbuffer();
3619 }
3620 if (buffer == GL_COLOR &&
3621 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3622 {
3623 attachment = framebufferObject->getColorbuffer(drawbuffer);
3624 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003625 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3626 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003627 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003628 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003629 return;
3630 }
Geoff Langd4fff502017-09-22 11:28:28 -04003631 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003632 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003633}
3634
3635void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3636{
Olli Etuaho78df3362018-10-05 16:43:27 +03003637 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3638 const FramebufferAttachment *attachment = nullptr;
3639 if (buffer == GL_COLOR &&
3640 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3641 {
3642 attachment = framebufferObject->getColorbuffer(drawbuffer);
3643 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003644 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3645 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003646 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003647 {
3648 return;
3649 }
Geoff Langd4fff502017-09-22 11:28:28 -04003650 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003651 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003652}
3653
3654void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3655{
Olli Etuaho78df3362018-10-05 16:43:27 +03003656 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3657 const FramebufferAttachment *attachment = nullptr;
3658 if (buffer == GL_STENCIL)
3659 {
3660 attachment = framebufferObject->getStencilbuffer();
3661 }
3662 if (buffer == GL_COLOR &&
3663 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3664 {
3665 attachment = framebufferObject->getColorbuffer(drawbuffer);
3666 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003667 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3668 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003669 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003670 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003671 return;
3672 }
Geoff Langd4fff502017-09-22 11:28:28 -04003673 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003674 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003675}
3676
3677void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3678{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003679 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003680 ASSERT(framebufferObject);
3681
3682 // If a buffer is not present, the clear has no effect
3683 if (framebufferObject->getDepthbuffer() == nullptr &&
3684 framebufferObject->getStencilbuffer() == nullptr)
3685 {
3686 return;
3687 }
3688
Geoff Langd4fff502017-09-22 11:28:28 -04003689 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3690 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003691}
3692
3693void Context::readPixels(GLint x,
3694 GLint y,
3695 GLsizei width,
3696 GLsizei height,
3697 GLenum format,
3698 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003699 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003700{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003701 if (width == 0 || height == 0)
3702 {
3703 return;
3704 }
3705
Jamie Madillbc918e72018-03-08 09:47:21 -05003706 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003707
Jamie Madillb6664922017-07-25 12:55:04 -04003708 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3709 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003710
3711 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04003712 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003713}
3714
Brandon Jones59770802018-04-02 13:18:42 -07003715void Context::readPixelsRobust(GLint x,
3716 GLint y,
3717 GLsizei width,
3718 GLsizei height,
3719 GLenum format,
3720 GLenum type,
3721 GLsizei bufSize,
3722 GLsizei *length,
3723 GLsizei *columns,
3724 GLsizei *rows,
3725 void *pixels)
3726{
3727 readPixels(x, y, width, height, format, type, pixels);
3728}
3729
3730void Context::readnPixelsRobust(GLint x,
3731 GLint y,
3732 GLsizei width,
3733 GLsizei height,
3734 GLenum format,
3735 GLenum type,
3736 GLsizei bufSize,
3737 GLsizei *length,
3738 GLsizei *columns,
3739 GLsizei *rows,
3740 void *data)
3741{
3742 readPixels(x, y, width, height, format, type, data);
3743}
3744
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003745void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003746 GLint level,
3747 GLenum internalformat,
3748 GLint x,
3749 GLint y,
3750 GLsizei width,
3751 GLsizei height,
3752 GLint border)
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 Rectangle sourceArea(x, y, width, height);
3758
Jamie Madill05b35b22017-10-03 09:01:44 -04003759 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003760 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003761 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003762}
3763
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003764void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003765 GLint level,
3766 GLint xoffset,
3767 GLint yoffset,
3768 GLint x,
3769 GLint y,
3770 GLsizei width,
3771 GLsizei height)
3772{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003773 if (width == 0 || height == 0)
3774 {
3775 return;
3776 }
3777
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003778 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003779 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003780
Jamie Madillc29968b2016-01-20 11:17:23 -05003781 Offset destOffset(xoffset, yoffset, 0);
3782 Rectangle sourceArea(x, y, width, height);
3783
Jamie Madill05b35b22017-10-03 09:01:44 -04003784 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003785 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05003786 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003787}
3788
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003789void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003790 GLint level,
3791 GLint xoffset,
3792 GLint yoffset,
3793 GLint zoffset,
3794 GLint x,
3795 GLint y,
3796 GLsizei width,
3797 GLsizei height)
3798{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003799 if (width == 0 || height == 0)
3800 {
3801 return;
3802 }
3803
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003804 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003805 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003806
Jamie Madillc29968b2016-01-20 11:17:23 -05003807 Offset destOffset(xoffset, yoffset, zoffset);
3808 Rectangle sourceArea(x, y, width, height);
3809
Jamie Madill05b35b22017-10-03 09:01:44 -04003810 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3811 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05003812 handleError(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, destOffset,
3813 sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003814}
3815
3816void Context::framebufferTexture2D(GLenum target,
3817 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003818 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003819 GLuint texture,
3820 GLint level)
3821{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003822 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003823 ASSERT(framebuffer);
3824
3825 if (texture != 0)
3826 {
3827 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003828 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003829 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003830 }
3831 else
3832 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003833 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003834 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003835
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003836 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003837}
3838
3839void Context::framebufferRenderbuffer(GLenum target,
3840 GLenum attachment,
3841 GLenum renderbuffertarget,
3842 GLuint renderbuffer)
3843{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003844 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003845 ASSERT(framebuffer);
3846
3847 if (renderbuffer != 0)
3848 {
3849 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003850
Jamie Madillcc129372018-04-12 09:13:18 -04003851 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003852 renderbufferObject);
3853 }
3854 else
3855 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003856 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003857 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003858
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003859 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003860}
3861
3862void Context::framebufferTextureLayer(GLenum target,
3863 GLenum attachment,
3864 GLuint texture,
3865 GLint level,
3866 GLint layer)
3867{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003868 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003869 ASSERT(framebuffer);
3870
3871 if (texture != 0)
3872 {
3873 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003874 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003875 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003876 }
3877 else
3878 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003879 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003880 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003881
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003882 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003883}
3884
Brandon Jones59770802018-04-02 13:18:42 -07003885void Context::framebufferTextureMultiviewLayered(GLenum target,
3886 GLenum attachment,
3887 GLuint texture,
3888 GLint level,
3889 GLint baseViewIndex,
3890 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003891{
Martin Radev82ef7742017-08-08 17:44:58 +03003892 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3893 ASSERT(framebuffer);
3894
3895 if (texture != 0)
3896 {
3897 Texture *textureObj = getTexture(texture);
3898
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003899 ImageIndex index;
3900 if (textureObj->getType() == TextureType::_2DArray)
3901 {
3902 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3903 }
3904 else
3905 {
3906 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3907 ASSERT(level == 0);
3908 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3909 }
Martin Radev82ef7742017-08-08 17:44:58 +03003910 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3911 numViews, baseViewIndex);
3912 }
3913 else
3914 {
3915 framebuffer->resetAttachment(this, attachment);
3916 }
3917
3918 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003919}
3920
Brandon Jones59770802018-04-02 13:18:42 -07003921void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3922 GLenum attachment,
3923 GLuint texture,
3924 GLint level,
3925 GLsizei numViews,
3926 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003927{
Martin Radev5dae57b2017-07-14 16:15:55 +03003928 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3929 ASSERT(framebuffer);
3930
3931 if (texture != 0)
3932 {
3933 Texture *textureObj = getTexture(texture);
3934
3935 ImageIndex index = ImageIndex::Make2D(level);
3936 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3937 textureObj, numViews, viewportOffsets);
3938 }
3939 else
3940 {
3941 framebuffer->resetAttachment(this, attachment);
3942 }
3943
3944 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003945}
3946
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003947void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3948{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003949 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3950 ASSERT(framebuffer);
3951
3952 if (texture != 0)
3953 {
3954 Texture *textureObj = getTexture(texture);
3955
3956 ImageIndex index = ImageIndex::MakeFromType(
3957 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3958 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3959 }
3960 else
3961 {
3962 framebuffer->resetAttachment(this, attachment);
3963 }
3964
3965 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003966}
3967
Jamie Madillc29968b2016-01-20 11:17:23 -05003968void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3969{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003970 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003971 ASSERT(framebuffer);
3972 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003973 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04003974 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003975}
3976
3977void Context::readBuffer(GLenum mode)
3978{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003979 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003980 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003981 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003982}
3983
3984void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3985{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003986 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003987 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003988
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003989 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003990 ASSERT(framebuffer);
3991
3992 // The specification isn't clear what should be done when the framebuffer isn't complete.
3993 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003994 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003995}
3996
3997void Context::invalidateFramebuffer(GLenum target,
3998 GLsizei numAttachments,
3999 const GLenum *attachments)
4000{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004001 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004002 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004003
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004004 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004005 ASSERT(framebuffer);
4006
Jamie Madill427064d2018-04-13 16:20:34 -04004007 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004008 {
Jamie Madill437fa652016-05-03 15:13:24 -04004009 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004010 }
Jamie Madill437fa652016-05-03 15:13:24 -04004011
Jamie Madill4928b7c2017-06-20 12:57:39 -04004012 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05004013}
4014
4015void Context::invalidateSubFramebuffer(GLenum target,
4016 GLsizei numAttachments,
4017 const GLenum *attachments,
4018 GLint x,
4019 GLint y,
4020 GLsizei width,
4021 GLsizei height)
4022{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004023 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05004024 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05004025
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004026 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05004027 ASSERT(framebuffer);
4028
Jamie Madill427064d2018-04-13 16:20:34 -04004029 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05004030 {
Jamie Madill437fa652016-05-03 15:13:24 -04004031 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05004032 }
Jamie Madill437fa652016-05-03 15:13:24 -04004033
4034 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004035 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05004036}
4037
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004038void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004039 GLint level,
4040 GLint internalformat,
4041 GLsizei width,
4042 GLsizei height,
4043 GLint border,
4044 GLenum format,
4045 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004046 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004047{
Jamie Madillbc918e72018-03-08 09:47:21 -05004048 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004049
4050 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004051 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004052 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004053 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004054}
4055
Brandon Jones59770802018-04-02 13:18:42 -07004056void Context::texImage2DRobust(TextureTarget target,
4057 GLint level,
4058 GLint internalformat,
4059 GLsizei width,
4060 GLsizei height,
4061 GLint border,
4062 GLenum format,
4063 GLenum type,
4064 GLsizei bufSize,
4065 const void *pixels)
4066{
4067 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
4068}
4069
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004070void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004071 GLint level,
4072 GLint internalformat,
4073 GLsizei width,
4074 GLsizei height,
4075 GLsizei depth,
4076 GLint border,
4077 GLenum format,
4078 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004079 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004080{
Jamie Madillbc918e72018-03-08 09:47:21 -05004081 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004082
4083 Extents size(width, height, depth);
4084 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004085 handleError(texture->setImage(this, mGLState.getUnpackState(),
4086 NonCubeTextureTypeToTarget(target), level, internalformat, size,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004087 format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004088}
4089
Brandon Jones59770802018-04-02 13:18:42 -07004090void Context::texImage3DRobust(TextureType target,
4091 GLint level,
4092 GLint internalformat,
4093 GLsizei width,
4094 GLsizei height,
4095 GLsizei depth,
4096 GLint border,
4097 GLenum format,
4098 GLenum type,
4099 GLsizei bufSize,
4100 const void *pixels)
4101{
4102 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4103}
4104
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004105void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004106 GLint level,
4107 GLint xoffset,
4108 GLint yoffset,
4109 GLsizei width,
4110 GLsizei height,
4111 GLenum format,
4112 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004113 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004114{
4115 // Zero sized uploads are valid but no-ops
4116 if (width == 0 || height == 0)
4117 {
4118 return;
4119 }
4120
Jamie Madillbc918e72018-03-08 09:47:21 -05004121 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004122
4123 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004124 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004125
4126 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4127
4128 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target, level,
4129 area, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004130}
4131
Brandon Jones59770802018-04-02 13:18:42 -07004132void Context::texSubImage2DRobust(TextureTarget target,
4133 GLint level,
4134 GLint xoffset,
4135 GLint yoffset,
4136 GLsizei width,
4137 GLsizei height,
4138 GLenum format,
4139 GLenum type,
4140 GLsizei bufSize,
4141 const void *pixels)
4142{
4143 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4144}
4145
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004146void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004147 GLint level,
4148 GLint xoffset,
4149 GLint yoffset,
4150 GLint zoffset,
4151 GLsizei width,
4152 GLsizei height,
4153 GLsizei depth,
4154 GLenum format,
4155 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004156 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004157{
4158 // Zero sized uploads are valid but no-ops
4159 if (width == 0 || height == 0 || depth == 0)
4160 {
4161 return;
4162 }
4163
Jamie Madillbc918e72018-03-08 09:47:21 -05004164 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004165
4166 Box area(xoffset, yoffset, zoffset, width, height, depth);
4167 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004168
4169 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4170
4171 handleError(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004172 NonCubeTextureTypeToTarget(target), level, area, format, type,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004173 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004174}
4175
Brandon Jones59770802018-04-02 13:18:42 -07004176void Context::texSubImage3DRobust(TextureType target,
4177 GLint level,
4178 GLint xoffset,
4179 GLint yoffset,
4180 GLint zoffset,
4181 GLsizei width,
4182 GLsizei height,
4183 GLsizei depth,
4184 GLenum format,
4185 GLenum type,
4186 GLsizei bufSize,
4187 const void *pixels)
4188{
4189 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4190 pixels);
4191}
4192
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004193void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004194 GLint level,
4195 GLenum internalformat,
4196 GLsizei width,
4197 GLsizei height,
4198 GLint border,
4199 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004200 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004201{
Jamie Madillbc918e72018-03-08 09:47:21 -05004202 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004203
4204 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004205 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004206 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4207 internalformat, size, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004208 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004209}
4210
Brandon Jones59770802018-04-02 13:18:42 -07004211void Context::compressedTexImage2DRobust(TextureTarget target,
4212 GLint level,
4213 GLenum internalformat,
4214 GLsizei width,
4215 GLsizei height,
4216 GLint border,
4217 GLsizei imageSize,
4218 GLsizei dataSize,
4219 const GLvoid *data)
4220{
4221 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4222}
4223
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004224void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004225 GLint level,
4226 GLenum internalformat,
4227 GLsizei width,
4228 GLsizei height,
4229 GLsizei depth,
4230 GLint border,
4231 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004232 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004233{
Jamie Madillbc918e72018-03-08 09:47:21 -05004234 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004235
4236 Extents size(width, height, depth);
4237 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004238 handleError(texture->setCompressedImage(
4239 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004240 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004241}
4242
Brandon Jones59770802018-04-02 13:18:42 -07004243void Context::compressedTexImage3DRobust(TextureType target,
4244 GLint level,
4245 GLenum internalformat,
4246 GLsizei width,
4247 GLsizei height,
4248 GLsizei depth,
4249 GLint border,
4250 GLsizei imageSize,
4251 GLsizei dataSize,
4252 const GLvoid *data)
4253{
4254 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4255 data);
4256}
4257
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004258void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004259 GLint level,
4260 GLint xoffset,
4261 GLint yoffset,
4262 GLsizei width,
4263 GLsizei height,
4264 GLenum format,
4265 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004266 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004267{
Jamie Madillbc918e72018-03-08 09:47:21 -05004268 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004269
4270 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004271 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05004272 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
4273 format, imageSize,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004274 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004275}
4276
Brandon Jones59770802018-04-02 13:18:42 -07004277void Context::compressedTexSubImage2DRobust(TextureTarget target,
4278 GLint level,
4279 GLint xoffset,
4280 GLint yoffset,
4281 GLsizei width,
4282 GLsizei height,
4283 GLenum format,
4284 GLsizei imageSize,
4285 GLsizei dataSize,
4286 const GLvoid *data)
4287{
4288 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4289 data);
4290}
4291
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004292void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004293 GLint level,
4294 GLint xoffset,
4295 GLint yoffset,
4296 GLint zoffset,
4297 GLsizei width,
4298 GLsizei height,
4299 GLsizei depth,
4300 GLenum format,
4301 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004302 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004303{
4304 // Zero sized uploads are valid but no-ops
4305 if (width == 0 || height == 0)
4306 {
4307 return;
4308 }
4309
Jamie Madillbc918e72018-03-08 09:47:21 -05004310 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004311
4312 Box area(xoffset, yoffset, zoffset, width, height, depth);
4313 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05004314 handleError(texture->setCompressedSubImage(
4315 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004316 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004317}
4318
Brandon Jones59770802018-04-02 13:18:42 -07004319void Context::compressedTexSubImage3DRobust(TextureType target,
4320 GLint level,
4321 GLint xoffset,
4322 GLint yoffset,
4323 GLint zoffset,
4324 GLsizei width,
4325 GLsizei height,
4326 GLsizei depth,
4327 GLenum format,
4328 GLsizei imageSize,
4329 GLsizei dataSize,
4330 const GLvoid *data)
4331{
4332 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4333 imageSize, data);
4334}
4335
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004336void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004337{
4338 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004339 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004340}
4341
Jamie Madill007530e2017-12-28 14:27:04 -05004342void Context::copyTexture(GLuint sourceId,
4343 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004344 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004345 GLuint destId,
4346 GLint destLevel,
4347 GLint internalFormat,
4348 GLenum destType,
4349 GLboolean unpackFlipY,
4350 GLboolean unpackPremultiplyAlpha,
4351 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004352{
Jamie Madillbc918e72018-03-08 09:47:21 -05004353 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004354
4355 gl::Texture *sourceTexture = getTexture(sourceId);
4356 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05004357 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4358 sourceLevel, ConvertToBool(unpackFlipY),
4359 ConvertToBool(unpackPremultiplyAlpha),
4360 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004361}
4362
Jamie Madill007530e2017-12-28 14:27:04 -05004363void Context::copySubTexture(GLuint sourceId,
4364 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004365 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004366 GLuint destId,
4367 GLint destLevel,
4368 GLint xoffset,
4369 GLint yoffset,
4370 GLint x,
4371 GLint y,
4372 GLsizei width,
4373 GLsizei height,
4374 GLboolean unpackFlipY,
4375 GLboolean unpackPremultiplyAlpha,
4376 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004377{
4378 // Zero sized copies are valid but no-ops
4379 if (width == 0 || height == 0)
4380 {
4381 return;
4382 }
4383
Jamie Madillbc918e72018-03-08 09:47:21 -05004384 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004385
4386 gl::Texture *sourceTexture = getTexture(sourceId);
4387 gl::Texture *destTexture = getTexture(destId);
4388 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004389 Box box(x, y, 0, width, height, 1);
4390 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
4391 ConvertToBool(unpackFlipY),
4392 ConvertToBool(unpackPremultiplyAlpha),
4393 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4394}
4395
4396void Context::copyTexture3D(GLuint sourceId,
4397 GLint sourceLevel,
4398 TextureTarget destTarget,
4399 GLuint destId,
4400 GLint destLevel,
4401 GLint internalFormat,
4402 GLenum destType,
4403 GLboolean unpackFlipY,
4404 GLboolean unpackPremultiplyAlpha,
4405 GLboolean unpackUnmultiplyAlpha)
4406{
4407 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4408
4409 Texture *sourceTexture = getTexture(sourceId);
4410 Texture *destTexture = getTexture(destId);
4411 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
4412 sourceLevel, ConvertToBool(unpackFlipY),
4413 ConvertToBool(unpackPremultiplyAlpha),
4414 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
4415}
4416
4417void Context::copySubTexture3D(GLuint sourceId,
4418 GLint sourceLevel,
4419 TextureTarget destTarget,
4420 GLuint destId,
4421 GLint destLevel,
4422 GLint xoffset,
4423 GLint yoffset,
4424 GLint zoffset,
4425 GLint x,
4426 GLint y,
4427 GLint z,
4428 GLsizei width,
4429 GLsizei height,
4430 GLsizei depth,
4431 GLboolean unpackFlipY,
4432 GLboolean unpackPremultiplyAlpha,
4433 GLboolean unpackUnmultiplyAlpha)
4434{
4435 // Zero sized copies are valid but no-ops
4436 if (width == 0 || height == 0 || depth == 0)
4437 {
4438 return;
4439 }
4440
4441 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4442
4443 Texture *sourceTexture = getTexture(sourceId);
4444 Texture *destTexture = getTexture(destId);
4445 Offset offset(xoffset, yoffset, zoffset);
4446 Box box(x, y, z, width, height, depth);
4447 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, box,
Geoff Lang92019432017-11-20 13:09:34 -05004448 ConvertToBool(unpackFlipY),
4449 ConvertToBool(unpackPremultiplyAlpha),
4450 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004451}
4452
Jamie Madill007530e2017-12-28 14:27:04 -05004453void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004454{
Jamie Madillbc918e72018-03-08 09:47:21 -05004455 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004456
4457 gl::Texture *sourceTexture = getTexture(sourceId);
4458 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05004459 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004460}
4461
Corentin Wallez336129f2017-10-17 15:55:40 -04004462void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004463{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004464 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004465 ASSERT(buffer);
4466
Geoff Lang496c02d2016-10-20 11:38:11 -07004467 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004468}
4469
Brandon Jones59770802018-04-02 13:18:42 -07004470void Context::getBufferPointervRobust(BufferBinding target,
4471 GLenum pname,
4472 GLsizei bufSize,
4473 GLsizei *length,
4474 void **params)
4475{
4476 getBufferPointerv(target, pname, params);
4477}
4478
Corentin Wallez336129f2017-10-17 15:55:40 -04004479void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004480{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004481 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004482 ASSERT(buffer);
4483
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004484 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004485 if (error.isError())
4486 {
Jamie Madill437fa652016-05-03 15:13:24 -04004487 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004488 return nullptr;
4489 }
4490
4491 return buffer->getMapPointer();
4492}
4493
Corentin Wallez336129f2017-10-17 15:55:40 -04004494GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004495{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004496 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004497 ASSERT(buffer);
4498
4499 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004500 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03004501 if (error.isError())
4502 {
Jamie Madill437fa652016-05-03 15:13:24 -04004503 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004504 return GL_FALSE;
4505 }
4506
4507 return result;
4508}
4509
Corentin Wallez336129f2017-10-17 15:55:40 -04004510void *Context::mapBufferRange(BufferBinding target,
4511 GLintptr offset,
4512 GLsizeiptr length,
4513 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004514{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004515 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004516 ASSERT(buffer);
4517
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004518 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03004519 if (error.isError())
4520 {
Jamie Madill437fa652016-05-03 15:13:24 -04004521 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03004522 return nullptr;
4523 }
4524
4525 return buffer->getMapPointer();
4526}
4527
Corentin Wallez336129f2017-10-17 15:55:40 -04004528void Context::flushMappedBufferRange(BufferBinding /*target*/,
4529 GLintptr /*offset*/,
4530 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004531{
4532 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4533}
4534
Jamie Madill526392d2018-11-16 09:35:14 -05004535angle::Result Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004536{
Geoff Langa8cb2872018-03-09 16:09:40 -05004537 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004538}
4539
Jamie Madill526392d2018-11-16 09:35:14 -05004540angle::Result Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004541{
Geoff Langa8cb2872018-03-09 16:09:40 -05004542 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004543}
4544
Jamie Madill526392d2018-11-16 09:35:14 -05004545angle::Result Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004546{
Geoff Langa8cb2872018-03-09 16:09:40 -05004547 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004548}
4549
Jamie Madill526392d2018-11-16 09:35:14 -05004550angle::Result Context::syncStateForPathOperation()
Geoff Lang9bf86f02018-07-26 11:46:34 -04004551{
4552 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4553
4554 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4555 ANGLE_TRY(syncDirtyBits());
4556
Jamie Madill526392d2018-11-16 09:35:14 -05004557 return angle::Result::Continue();
Geoff Lang9bf86f02018-07-26 11:46:34 -04004558}
4559
Jiajia Qin5451d532017-11-16 17:16:34 +08004560void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4561{
4562 UNIMPLEMENTED();
4563}
4564
Jamie Madillc20ab272016-06-09 07:20:46 -07004565void Context::activeTexture(GLenum texture)
4566{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004567 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004568}
4569
Jamie Madill876429b2017-04-20 15:46:24 -04004570void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004571{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004572 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004573}
4574
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004575void Context::blendEquation(GLenum mode)
4576{
4577 mGLState.setBlendEquation(mode, mode);
4578}
4579
Jamie Madillc20ab272016-06-09 07:20:46 -07004580void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4581{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004582 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004583}
4584
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004585void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4586{
4587 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4588}
4589
Jamie Madillc20ab272016-06-09 07:20:46 -07004590void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4591{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004592 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004593}
4594
Jamie Madill876429b2017-04-20 15:46:24 -04004595void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004596{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004597 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004598}
4599
Jamie Madill876429b2017-04-20 15:46:24 -04004600void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004601{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004602 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004603}
4604
4605void Context::clearStencil(GLint s)
4606{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004607 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004608}
4609
4610void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4611{
Geoff Lang92019432017-11-20 13:09:34 -05004612 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4613 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004614}
4615
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004616void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004617{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004618 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004619}
4620
4621void Context::depthFunc(GLenum func)
4622{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004623 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004624}
4625
4626void Context::depthMask(GLboolean flag)
4627{
Geoff Lang92019432017-11-20 13:09:34 -05004628 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004629}
4630
Jamie Madill876429b2017-04-20 15:46:24 -04004631void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004632{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004633 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004634}
4635
4636void Context::disable(GLenum cap)
4637{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004638 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004639 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004640}
4641
4642void Context::disableVertexAttribArray(GLuint index)
4643{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004644 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004645 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004646}
4647
4648void Context::enable(GLenum cap)
4649{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004650 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004651 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004652}
4653
4654void Context::enableVertexAttribArray(GLuint index)
4655{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004656 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004657 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004658}
4659
4660void Context::frontFace(GLenum mode)
4661{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004662 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004663}
4664
4665void Context::hint(GLenum target, GLenum mode)
4666{
4667 switch (target)
4668 {
4669 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004670 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004671 break;
4672
4673 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004674 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004675 break;
4676
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004677 case GL_PERSPECTIVE_CORRECTION_HINT:
4678 case GL_POINT_SMOOTH_HINT:
4679 case GL_LINE_SMOOTH_HINT:
4680 case GL_FOG_HINT:
4681 mGLState.gles1().setHint(target, mode);
4682 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004683 default:
4684 UNREACHABLE();
4685 return;
4686 }
4687}
4688
4689void Context::lineWidth(GLfloat width)
4690{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004691 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004692}
4693
4694void Context::pixelStorei(GLenum pname, GLint param)
4695{
4696 switch (pname)
4697 {
4698 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004699 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004700 break;
4701
4702 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004703 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004704 break;
4705
4706 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004707 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004708 break;
4709
4710 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004711 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004712 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004713 break;
4714
4715 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004716 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004717 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004718 break;
4719
4720 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004721 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004722 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004723 break;
4724
4725 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004726 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004727 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004728 break;
4729
4730 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004731 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004732 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004733 break;
4734
4735 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004736 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004737 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004738 break;
4739
4740 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004741 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004742 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004743 break;
4744
4745 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004746 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004747 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004748 break;
4749
4750 default:
4751 UNREACHABLE();
4752 return;
4753 }
4754}
4755
4756void Context::polygonOffset(GLfloat factor, GLfloat units)
4757{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004758 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004759}
4760
Jamie Madill876429b2017-04-20 15:46:24 -04004761void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004762{
Geoff Lang92019432017-11-20 13:09:34 -05004763 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004764}
4765
Jiawei Shaodb342272017-09-27 10:21:45 +08004766void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4767{
4768 mGLState.setSampleMaskParams(maskNumber, mask);
4769}
4770
Jamie Madillc20ab272016-06-09 07:20:46 -07004771void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4772{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004773 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004774}
4775
4776void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4777{
4778 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4779 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004780 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004781 }
4782
4783 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4784 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004785 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004786 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004787
4788 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004789}
4790
4791void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4792{
4793 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4794 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004795 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004796 }
4797
4798 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4799 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004800 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004801 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004802
4803 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004804}
4805
4806void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4807{
4808 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4809 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004810 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004811 }
4812
4813 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4814 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004815 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004816 }
4817}
4818
4819void Context::vertexAttrib1f(GLuint index, GLfloat x)
4820{
4821 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004822 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004823 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004824}
4825
4826void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4827{
4828 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004829 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004830 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004831}
4832
4833void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4834{
4835 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004836 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004837 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004838}
4839
4840void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4841{
4842 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004843 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004844 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004845}
4846
4847void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4848{
4849 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004850 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004851 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004852}
4853
4854void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4855{
4856 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004857 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004858 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004859}
4860
4861void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4862{
4863 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004864 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004865 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004866}
4867
4868void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4869{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004870 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004871 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004872}
4873
4874void Context::vertexAttribPointer(GLuint index,
4875 GLint size,
4876 GLenum type,
4877 GLboolean normalized,
4878 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004879 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004880{
Corentin Wallez336129f2017-10-17 15:55:40 -04004881 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004882 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004883 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004884}
4885
Shao80957d92017-02-20 21:25:59 +08004886void Context::vertexAttribFormat(GLuint attribIndex,
4887 GLint size,
4888 GLenum type,
4889 GLboolean normalized,
4890 GLuint relativeOffset)
4891{
Geoff Lang92019432017-11-20 13:09:34 -05004892 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004893 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004894 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004895}
4896
4897void Context::vertexAttribIFormat(GLuint attribIndex,
4898 GLint size,
4899 GLenum type,
4900 GLuint relativeOffset)
4901{
4902 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004903 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004904}
4905
4906void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4907{
Shaodde78e82017-05-22 14:13:27 +08004908 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004909 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004910}
4911
Jiajia Qin5451d532017-11-16 17:16:34 +08004912void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004913{
4914 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004915 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004916}
4917
Jamie Madillc20ab272016-06-09 07:20:46 -07004918void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4919{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004920 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004921}
4922
4923void Context::vertexAttribIPointer(GLuint index,
4924 GLint size,
4925 GLenum type,
4926 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004927 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004928{
Corentin Wallez336129f2017-10-17 15:55:40 -04004929 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4930 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004931 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004932}
4933
4934void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4935{
4936 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004937 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004938 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004939}
4940
4941void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4942{
4943 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004944 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004945 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004946}
4947
4948void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4949{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004950 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004951 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004952}
4953
4954void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4955{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004956 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004957 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004958}
4959
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004960void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4961{
4962 const VertexAttribCurrentValueData &currentValues =
4963 getGLState().getVertexAttribCurrentValue(index);
4964 const VertexArray *vao = getGLState().getVertexArray();
4965 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4966 currentValues, pname, params);
4967}
4968
Brandon Jones59770802018-04-02 13:18:42 -07004969void Context::getVertexAttribivRobust(GLuint index,
4970 GLenum pname,
4971 GLsizei bufSize,
4972 GLsizei *length,
4973 GLint *params)
4974{
4975 getVertexAttribiv(index, pname, params);
4976}
4977
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004978void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4979{
4980 const VertexAttribCurrentValueData &currentValues =
4981 getGLState().getVertexAttribCurrentValue(index);
4982 const VertexArray *vao = getGLState().getVertexArray();
4983 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4984 currentValues, pname, params);
4985}
4986
Brandon Jones59770802018-04-02 13:18:42 -07004987void Context::getVertexAttribfvRobust(GLuint index,
4988 GLenum pname,
4989 GLsizei bufSize,
4990 GLsizei *length,
4991 GLfloat *params)
4992{
4993 getVertexAttribfv(index, pname, params);
4994}
4995
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004996void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4997{
4998 const VertexAttribCurrentValueData &currentValues =
4999 getGLState().getVertexAttribCurrentValue(index);
5000 const VertexArray *vao = getGLState().getVertexArray();
5001 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5002 currentValues, pname, params);
5003}
5004
Brandon Jones59770802018-04-02 13:18:42 -07005005void Context::getVertexAttribIivRobust(GLuint index,
5006 GLenum pname,
5007 GLsizei bufSize,
5008 GLsizei *length,
5009 GLint *params)
5010{
5011 getVertexAttribIiv(index, pname, params);
5012}
5013
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005014void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
5015{
5016 const VertexAttribCurrentValueData &currentValues =
5017 getGLState().getVertexAttribCurrentValue(index);
5018 const VertexArray *vao = getGLState().getVertexArray();
5019 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
5020 currentValues, pname, params);
5021}
5022
Brandon Jones59770802018-04-02 13:18:42 -07005023void Context::getVertexAttribIuivRobust(GLuint index,
5024 GLenum pname,
5025 GLsizei bufSize,
5026 GLsizei *length,
5027 GLuint *params)
5028{
5029 getVertexAttribIuiv(index, pname, params);
5030}
5031
Jamie Madill876429b2017-04-20 15:46:24 -04005032void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08005033{
5034 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
5035 QueryVertexAttribPointerv(attrib, pname, pointer);
5036}
5037
Brandon Jones59770802018-04-02 13:18:42 -07005038void Context::getVertexAttribPointervRobust(GLuint index,
5039 GLenum pname,
5040 GLsizei bufSize,
5041 GLsizei *length,
5042 void **pointer)
5043{
5044 getVertexAttribPointerv(index, pname, pointer);
5045}
5046
Jamie Madillc20ab272016-06-09 07:20:46 -07005047void Context::debugMessageControl(GLenum source,
5048 GLenum type,
5049 GLenum severity,
5050 GLsizei count,
5051 const GLuint *ids,
5052 GLboolean enabled)
5053{
5054 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005055 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05005056 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07005057}
5058
5059void Context::debugMessageInsert(GLenum source,
5060 GLenum type,
5061 GLuint id,
5062 GLenum severity,
5063 GLsizei length,
5064 const GLchar *buf)
5065{
5066 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005067 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07005068}
5069
5070void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
5071{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005072 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07005073}
5074
5075GLuint Context::getDebugMessageLog(GLuint count,
5076 GLsizei bufSize,
5077 GLenum *sources,
5078 GLenum *types,
5079 GLuint *ids,
5080 GLenum *severities,
5081 GLsizei *lengths,
5082 GLchar *messageLog)
5083{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005084 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
5085 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07005086}
5087
5088void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
5089{
5090 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005091 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05005092 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005093}
5094
5095void Context::popDebugGroup()
5096{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07005097 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005098 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005099}
5100
Corentin Wallez336129f2017-10-17 15:55:40 -04005101void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005102{
5103 Buffer *buffer = mGLState.getTargetBuffer(target);
5104 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005105 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005106}
5107
Corentin Wallez336129f2017-10-17 15:55:40 -04005108void Context::bufferSubData(BufferBinding target,
5109 GLintptr offset,
5110 GLsizeiptr size,
5111 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005112{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005113 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005114 {
5115 return;
5116 }
5117
5118 Buffer *buffer = mGLState.getTargetBuffer(target);
5119 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08005120 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005121}
5122
Jamie Madillef300b12016-10-07 15:12:09 -04005123void Context::attachShader(GLuint program, GLuint shader)
5124{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005125 Program *programObject = mState.mShaderPrograms->getProgram(program);
5126 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005127 ASSERT(programObject && shaderObject);
5128 programObject->attachShader(shaderObject);
5129}
5130
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005131const Workarounds &Context::getWorkarounds() const
5132{
5133 return mWorkarounds;
5134}
5135
Corentin Wallez336129f2017-10-17 15:55:40 -04005136void Context::copyBufferSubData(BufferBinding readTarget,
5137 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005138 GLintptr readOffset,
5139 GLintptr writeOffset,
5140 GLsizeiptr size)
5141{
5142 // if size is zero, the copy is a successful no-op
5143 if (size == 0)
5144 {
5145 return;
5146 }
5147
5148 // TODO(jmadill): cache these.
5149 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5150 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5151
Jamie Madill5f56ddb2017-01-13 17:29:55 -05005152 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005153}
5154
Jamie Madill01a80ee2016-11-07 12:06:18 -05005155void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5156{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005157 // Ideally we could share the program query with the validation layer if possible.
5158 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005159 ASSERT(programObject);
5160 programObject->bindAttributeLocation(index, name);
5161}
5162
Corentin Wallez336129f2017-10-17 15:55:40 -04005163void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05005164{
Corentin Wallez336129f2017-10-17 15:55:40 -04005165 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5166 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04005167 mStateCache.onBufferBindingChange(this);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005168}
5169
Corentin Wallez336129f2017-10-17 15:55:40 -04005170void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005171{
5172 bindBufferRange(target, index, buffer, 0, 0);
5173}
5174
Corentin Wallez336129f2017-10-17 15:55:40 -04005175void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005176 GLuint index,
5177 GLuint buffer,
5178 GLintptr offset,
5179 GLsizeiptr size)
5180{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005181 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
5182 mGLState.setIndexedBufferBinding(this, target, index, object, offset, size);
5183 if (target == BufferBinding::Uniform)
5184 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005185 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005186 mStateCache.onUniformBufferStateChange(this);
5187 }
5188 else
5189 {
5190 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005191 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005192}
5193
Jamie Madill01a80ee2016-11-07 12:06:18 -05005194void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5195{
5196 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5197 {
5198 bindReadFramebuffer(framebuffer);
5199 }
5200
5201 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5202 {
5203 bindDrawFramebuffer(framebuffer);
5204 }
5205}
5206
5207void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5208{
5209 ASSERT(target == GL_RENDERBUFFER);
5210 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005211 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005212 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005213}
5214
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005215void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005216 GLsizei samples,
5217 GLenum internalformat,
5218 GLsizei width,
5219 GLsizei height,
5220 GLboolean fixedsamplelocations)
5221{
5222 Extents size(width, height, 1);
5223 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005224 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5225 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005226}
5227
Olli Etuaho89664842018-08-24 14:45:36 +03005228void Context::texStorage3DMultisample(TextureType target,
5229 GLsizei samples,
5230 GLenum internalformat,
5231 GLsizei width,
5232 GLsizei height,
5233 GLsizei depth,
5234 GLboolean fixedsamplelocations)
5235{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005236 Extents size(width, height, depth);
5237 Texture *texture = getTargetTexture(target);
5238 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
5239 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005240}
5241
JiangYizhoubddc46b2016-12-09 09:50:51 +08005242void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5243{
JiangYizhou5b03f472017-01-09 10:22:53 +08005244 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5245 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005246 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005247 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005248
5249 switch (pname)
5250 {
5251 case GL_SAMPLE_POSITION:
Geoff Lang13455072018-05-09 11:24:43 -04005252 handleError(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005253 break;
5254 default:
5255 UNREACHABLE();
5256 }
5257}
5258
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005259void Context::getMultisamplefvRobust(GLenum pname,
5260 GLuint index,
5261 GLsizei bufSize,
5262 GLsizei *length,
5263 GLfloat *val)
5264{
5265 UNIMPLEMENTED();
5266}
5267
Jamie Madille8fb6402017-02-14 17:56:40 -05005268void Context::renderbufferStorage(GLenum target,
5269 GLenum internalformat,
5270 GLsizei width,
5271 GLsizei height)
5272{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005273 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5274 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5275
Jamie Madille8fb6402017-02-14 17:56:40 -05005276 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04005277 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005278}
5279
5280void Context::renderbufferStorageMultisample(GLenum target,
5281 GLsizei samples,
5282 GLenum internalformat,
5283 GLsizei width,
5284 GLsizei height)
5285{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005286 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5287 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005288
5289 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005290 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005291 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005292}
5293
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005294void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5295{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005296 const Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04005297 handleError(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005298}
5299
JiangYizhoue18e6392017-02-20 10:32:23 +08005300void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5301{
5302 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5303 QueryFramebufferParameteriv(framebuffer, pname, params);
5304}
5305
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005306void Context::getFramebufferParameterivRobust(GLenum target,
5307 GLenum pname,
5308 GLsizei bufSize,
5309 GLsizei *length,
5310 GLint *params)
5311{
5312 UNIMPLEMENTED();
5313}
5314
Jiajia Qin5451d532017-11-16 17:16:34 +08005315void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005316{
5317 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005318 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005319}
5320
Jamie Madilldec86232018-07-11 09:01:18 -04005321bool Context::getScratchBuffer(size_t requstedSizeBytes,
5322 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005323{
Jamie Madilldec86232018-07-11 09:01:18 -04005324 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005325}
5326
Jamie Madilldec86232018-07-11 09:01:18 -04005327bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5328 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005329{
Jamie Madilldec86232018-07-11 09:01:18 -04005330 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005331}
5332
Jamie Madill526392d2018-11-16 09:35:14 -05005333angle::Result Context::prepareForDispatch()
Xinghua Cao10a4d432017-11-28 14:46:26 +08005334{
Jamie Madill0cc11c62018-10-12 18:07:18 -04005335 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
Xinghua Cao10a4d432017-11-28 14:46:26 +08005336
5337 if (isRobustResourceInitEnabled())
5338 {
5339 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
5340 }
5341
Jamie Madill0cc11c62018-10-12 18:07:18 -04005342 return syncDirtyBits(mComputeDirtyBits);
Xinghua Cao10a4d432017-11-28 14:46:26 +08005343}
5344
Xinghua Cao2b396592017-03-29 15:36:04 +08005345void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5346{
5347 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5348 {
5349 return;
5350 }
5351
Xinghua Cao10a4d432017-11-28 14:46:26 +08005352 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04005353 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005354}
5355
Jiajia Qin5451d532017-11-16 17:16:34 +08005356void Context::dispatchComputeIndirect(GLintptr indirect)
5357{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005358 ANGLE_CONTEXT_TRY(prepareForDispatch());
5359 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005360}
5361
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005362void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005363 GLsizei levels,
5364 GLenum internalFormat,
5365 GLsizei width,
5366 GLsizei height)
5367{
5368 Extents size(width, height, 1);
5369 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005370 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005371}
5372
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005373void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005374 GLsizei levels,
5375 GLenum internalFormat,
5376 GLsizei width,
5377 GLsizei height,
5378 GLsizei depth)
5379{
5380 Extents size(width, height, depth);
5381 Texture *texture = getTargetTexture(target);
Corentin Wallez99d492c2018-02-27 15:17:10 -05005382 handleError(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005383}
5384
Jiajia Qin5451d532017-11-16 17:16:34 +08005385void Context::memoryBarrier(GLbitfield barriers)
5386{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005387 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005388}
5389
5390void Context::memoryBarrierByRegion(GLbitfield barriers)
5391{
Xinghua Cao89c422a2017-11-29 18:24:20 +08005392 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005393}
5394
Austin Eng1bf18ce2018-10-19 15:34:02 -07005395void Context::multiDrawArrays(PrimitiveMode mode,
5396 const GLint *firsts,
5397 const GLsizei *counts,
5398 GLsizei drawcount)
5399{
5400 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5401 Program *programObject = mGLState.getLinkedProgram(this);
5402 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5403 if (hasDrawID)
5404 {
5405 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5406 {
5407 if (noopDraw(mode, counts[drawID]))
5408 {
5409 continue;
5410 }
5411 programObject->setDrawIDUniform(drawID);
5412 ANGLE_CONTEXT_TRY(
5413 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5414 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5415 counts[drawID], 1);
5416 }
5417 }
5418 else
5419 {
5420 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5421 {
5422 if (noopDraw(mode, counts[drawID]))
5423 {
5424 continue;
5425 }
5426 ANGLE_CONTEXT_TRY(
5427 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
5428 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5429 counts[drawID], 1);
5430 }
5431 }
5432}
5433
5434void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5435 const GLint *firsts,
5436 const GLsizei *counts,
5437 const GLsizei *instanceCounts,
5438 GLsizei drawcount)
5439{
5440 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5441 Program *programObject = mGLState.getLinkedProgram(this);
5442 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5443 if (hasDrawID)
5444 {
5445 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5446 {
5447 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5448 {
5449 continue;
5450 }
5451 programObject->setDrawIDUniform(drawID);
5452 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5453 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5454 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5455 counts[drawID], instanceCounts[drawID]);
5456 }
5457 }
5458 else
5459 {
5460 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5461 {
5462 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5463 {
5464 continue;
5465 }
5466 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5467 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
5468 MarkTransformFeedbackBufferUsage(this, mGLState.getCurrentTransformFeedback(),
5469 counts[drawID], instanceCounts[drawID]);
5470 }
5471 }
5472}
5473
5474void Context::multiDrawElements(PrimitiveMode mode,
5475 const GLsizei *counts,
5476 GLenum type,
5477 const GLsizei *offsets,
5478 GLsizei drawcount)
5479{
5480 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5481 Program *programObject = mGLState.getLinkedProgram(this);
5482 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5483 if (hasDrawID)
5484 {
5485 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5486 {
5487 if (noopDraw(mode, counts[drawID]))
5488 {
5489 continue;
5490 }
5491 programObject->setDrawIDUniform(drawID);
5492 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5493 ANGLE_CONTEXT_TRY(
5494 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5495 }
5496 }
5497 else
5498 {
5499 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5500 {
5501 if (noopDraw(mode, counts[drawID]))
5502 {
5503 continue;
5504 }
5505 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5506 ANGLE_CONTEXT_TRY(
5507 mImplementation->drawElements(this, mode, counts[drawID], type, indices));
5508 }
5509 }
5510}
5511
5512void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5513 const GLsizei *counts,
5514 GLenum type,
5515 const GLsizei *offsets,
5516 const GLsizei *instanceCounts,
5517 GLsizei drawcount)
5518{
5519 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5520 Program *programObject = mGLState.getLinkedProgram(this);
5521 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5522 if (hasDrawID)
5523 {
5524 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5525 {
5526 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5527 {
5528 continue;
5529 }
5530 programObject->setDrawIDUniform(drawID);
5531 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5532 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5533 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5534 }
5535 }
5536 else
5537 {
5538 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5539 {
5540 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5541 {
5542 continue;
5543 }
5544 const void *indices = reinterpret_cast<void *>(static_cast<long>(offsets[drawID]));
5545 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
5546 this, mode, counts[drawID], type, indices, instanceCounts[drawID]));
5547 }
5548 }
5549}
5550
Jamie Madillc1d770e2017-04-13 17:31:24 -04005551GLenum Context::checkFramebufferStatus(GLenum target)
5552{
5553 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5554 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005555 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005556}
5557
5558void Context::compileShader(GLuint shader)
5559{
5560 Shader *shaderObject = GetValidShader(this, shader);
5561 if (!shaderObject)
5562 {
5563 return;
5564 }
5565 shaderObject->compile(this);
5566}
5567
5568void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5569{
5570 for (int i = 0; i < n; i++)
5571 {
5572 deleteBuffer(buffers[i]);
5573 }
5574}
5575
5576void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5577{
5578 for (int i = 0; i < n; i++)
5579 {
5580 if (framebuffers[i] != 0)
5581 {
5582 deleteFramebuffer(framebuffers[i]);
5583 }
5584 }
5585}
5586
5587void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5588{
5589 for (int i = 0; i < n; i++)
5590 {
5591 deleteRenderbuffer(renderbuffers[i]);
5592 }
5593}
5594
5595void Context::deleteTextures(GLsizei n, const GLuint *textures)
5596{
5597 for (int i = 0; i < n; i++)
5598 {
5599 if (textures[i] != 0)
5600 {
5601 deleteTexture(textures[i]);
5602 }
5603 }
5604}
5605
5606void Context::detachShader(GLuint program, GLuint shader)
5607{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005608 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005609 ASSERT(programObject);
5610
5611 Shader *shaderObject = getShader(shader);
5612 ASSERT(shaderObject);
5613
5614 programObject->detachShader(this, shaderObject);
5615}
5616
5617void Context::genBuffers(GLsizei n, GLuint *buffers)
5618{
5619 for (int i = 0; i < n; i++)
5620 {
5621 buffers[i] = createBuffer();
5622 }
5623}
5624
5625void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5626{
5627 for (int i = 0; i < n; i++)
5628 {
5629 framebuffers[i] = createFramebuffer();
5630 }
5631}
5632
5633void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5634{
5635 for (int i = 0; i < n; i++)
5636 {
5637 renderbuffers[i] = createRenderbuffer();
5638 }
5639}
5640
5641void Context::genTextures(GLsizei n, GLuint *textures)
5642{
5643 for (int i = 0; i < n; i++)
5644 {
5645 textures[i] = createTexture();
5646 }
5647}
5648
5649void Context::getActiveAttrib(GLuint program,
5650 GLuint index,
5651 GLsizei bufsize,
5652 GLsizei *length,
5653 GLint *size,
5654 GLenum *type,
5655 GLchar *name)
5656{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005657 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005658 ASSERT(programObject);
5659 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5660}
5661
5662void Context::getActiveUniform(GLuint program,
5663 GLuint index,
5664 GLsizei bufsize,
5665 GLsizei *length,
5666 GLint *size,
5667 GLenum *type,
5668 GLchar *name)
5669{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005670 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005671 ASSERT(programObject);
5672 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5673}
5674
5675void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5676{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005677 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005678 ASSERT(programObject);
5679 programObject->getAttachedShaders(maxcount, count, shaders);
5680}
5681
5682GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5683{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005684 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005685 ASSERT(programObject);
5686 return programObject->getAttributeLocation(name);
5687}
5688
5689void Context::getBooleanv(GLenum pname, GLboolean *params)
5690{
5691 GLenum nativeType;
5692 unsigned int numParams = 0;
5693 getQueryParameterInfo(pname, &nativeType, &numParams);
5694
5695 if (nativeType == GL_BOOL)
5696 {
5697 getBooleanvImpl(pname, params);
5698 }
5699 else
5700 {
5701 CastStateValues(this, nativeType, pname, numParams, params);
5702 }
5703}
5704
Brandon Jones59770802018-04-02 13:18:42 -07005705void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5706{
5707 getBooleanv(pname, params);
5708}
5709
Jamie Madillc1d770e2017-04-13 17:31:24 -04005710void Context::getFloatv(GLenum pname, GLfloat *params)
5711{
5712 GLenum nativeType;
5713 unsigned int numParams = 0;
5714 getQueryParameterInfo(pname, &nativeType, &numParams);
5715
5716 if (nativeType == GL_FLOAT)
5717 {
5718 getFloatvImpl(pname, params);
5719 }
5720 else
5721 {
5722 CastStateValues(this, nativeType, pname, numParams, params);
5723 }
5724}
5725
Brandon Jones59770802018-04-02 13:18:42 -07005726void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5727{
5728 getFloatv(pname, params);
5729}
5730
Jamie Madillc1d770e2017-04-13 17:31:24 -04005731void Context::getIntegerv(GLenum pname, GLint *params)
5732{
5733 GLenum nativeType;
5734 unsigned int numParams = 0;
5735 getQueryParameterInfo(pname, &nativeType, &numParams);
5736
5737 if (nativeType == GL_INT)
5738 {
5739 getIntegervImpl(pname, params);
5740 }
5741 else
5742 {
5743 CastStateValues(this, nativeType, pname, numParams, params);
5744 }
5745}
5746
Brandon Jones59770802018-04-02 13:18:42 -07005747void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5748{
5749 getIntegerv(pname, data);
5750}
5751
Jamie Madillc1d770e2017-04-13 17:31:24 -04005752void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5753{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005754 // Don't resolve link if checking the link completion status.
5755 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5756 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005757 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005758 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005759}
5760
Brandon Jones59770802018-04-02 13:18:42 -07005761void Context::getProgramivRobust(GLuint program,
5762 GLenum pname,
5763 GLsizei bufSize,
5764 GLsizei *length,
5765 GLint *params)
5766{
5767 getProgramiv(program, pname, params);
5768}
5769
Jiajia Qin5451d532017-11-16 17:16:34 +08005770void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5771{
5772 UNIMPLEMENTED();
5773}
5774
Jamie Madillbe849e42017-05-02 15:49:00 -04005775void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005776{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005777 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005778 ASSERT(programObject);
5779 programObject->getInfoLog(bufsize, length, infolog);
5780}
5781
Jiajia Qin5451d532017-11-16 17:16:34 +08005782void Context::getProgramPipelineInfoLog(GLuint pipeline,
5783 GLsizei bufSize,
5784 GLsizei *length,
5785 GLchar *infoLog)
5786{
5787 UNIMPLEMENTED();
5788}
5789
Jamie Madillc1d770e2017-04-13 17:31:24 -04005790void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5791{
5792 Shader *shaderObject = getShader(shader);
5793 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005794 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005795}
5796
Brandon Jones59770802018-04-02 13:18:42 -07005797void Context::getShaderivRobust(GLuint shader,
5798 GLenum pname,
5799 GLsizei bufSize,
5800 GLsizei *length,
5801 GLint *params)
5802{
5803 getShaderiv(shader, pname, params);
5804}
5805
Jamie Madillc1d770e2017-04-13 17:31:24 -04005806void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5807{
5808 Shader *shaderObject = getShader(shader);
5809 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005810 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005811}
5812
5813void Context::getShaderPrecisionFormat(GLenum shadertype,
5814 GLenum precisiontype,
5815 GLint *range,
5816 GLint *precision)
5817{
5818 // TODO(jmadill): Compute shaders.
5819
5820 switch (shadertype)
5821 {
5822 case GL_VERTEX_SHADER:
5823 switch (precisiontype)
5824 {
5825 case GL_LOW_FLOAT:
5826 mCaps.vertexLowpFloat.get(range, precision);
5827 break;
5828 case GL_MEDIUM_FLOAT:
5829 mCaps.vertexMediumpFloat.get(range, precision);
5830 break;
5831 case GL_HIGH_FLOAT:
5832 mCaps.vertexHighpFloat.get(range, precision);
5833 break;
5834
5835 case GL_LOW_INT:
5836 mCaps.vertexLowpInt.get(range, precision);
5837 break;
5838 case GL_MEDIUM_INT:
5839 mCaps.vertexMediumpInt.get(range, precision);
5840 break;
5841 case GL_HIGH_INT:
5842 mCaps.vertexHighpInt.get(range, precision);
5843 break;
5844
5845 default:
5846 UNREACHABLE();
5847 return;
5848 }
5849 break;
5850
5851 case GL_FRAGMENT_SHADER:
5852 switch (precisiontype)
5853 {
5854 case GL_LOW_FLOAT:
5855 mCaps.fragmentLowpFloat.get(range, precision);
5856 break;
5857 case GL_MEDIUM_FLOAT:
5858 mCaps.fragmentMediumpFloat.get(range, precision);
5859 break;
5860 case GL_HIGH_FLOAT:
5861 mCaps.fragmentHighpFloat.get(range, precision);
5862 break;
5863
5864 case GL_LOW_INT:
5865 mCaps.fragmentLowpInt.get(range, precision);
5866 break;
5867 case GL_MEDIUM_INT:
5868 mCaps.fragmentMediumpInt.get(range, precision);
5869 break;
5870 case GL_HIGH_INT:
5871 mCaps.fragmentHighpInt.get(range, precision);
5872 break;
5873
5874 default:
5875 UNREACHABLE();
5876 return;
5877 }
5878 break;
5879
5880 default:
5881 UNREACHABLE();
5882 return;
5883 }
5884}
5885
5886void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5887{
5888 Shader *shaderObject = getShader(shader);
5889 ASSERT(shaderObject);
5890 shaderObject->getSource(bufsize, length, source);
5891}
5892
5893void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5894{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005895 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005896 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005897 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005898}
5899
Brandon Jones59770802018-04-02 13:18:42 -07005900void Context::getUniformfvRobust(GLuint program,
5901 GLint location,
5902 GLsizei bufSize,
5903 GLsizei *length,
5904 GLfloat *params)
5905{
5906 getUniformfv(program, location, params);
5907}
5908
Jamie Madillc1d770e2017-04-13 17:31:24 -04005909void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5910{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005911 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005912 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005913 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005914}
5915
Brandon Jones59770802018-04-02 13:18:42 -07005916void Context::getUniformivRobust(GLuint program,
5917 GLint location,
5918 GLsizei bufSize,
5919 GLsizei *length,
5920 GLint *params)
5921{
5922 getUniformiv(program, location, params);
5923}
5924
Jamie Madillc1d770e2017-04-13 17:31:24 -04005925GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5926{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005927 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005928 ASSERT(programObject);
5929 return programObject->getUniformLocation(name);
5930}
5931
5932GLboolean Context::isBuffer(GLuint buffer)
5933{
5934 if (buffer == 0)
5935 {
5936 return GL_FALSE;
5937 }
5938
5939 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5940}
5941
5942GLboolean Context::isEnabled(GLenum cap)
5943{
5944 return mGLState.getEnableFeature(cap);
5945}
5946
5947GLboolean Context::isFramebuffer(GLuint framebuffer)
5948{
5949 if (framebuffer == 0)
5950 {
5951 return GL_FALSE;
5952 }
5953
5954 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5955}
5956
5957GLboolean Context::isProgram(GLuint program)
5958{
5959 if (program == 0)
5960 {
5961 return GL_FALSE;
5962 }
5963
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005964 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005965}
5966
5967GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5968{
5969 if (renderbuffer == 0)
5970 {
5971 return GL_FALSE;
5972 }
5973
5974 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5975}
5976
5977GLboolean Context::isShader(GLuint shader)
5978{
5979 if (shader == 0)
5980 {
5981 return GL_FALSE;
5982 }
5983
5984 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5985}
5986
5987GLboolean Context::isTexture(GLuint texture)
5988{
5989 if (texture == 0)
5990 {
5991 return GL_FALSE;
5992 }
5993
5994 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5995}
5996
5997void Context::linkProgram(GLuint program)
5998{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005999 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006000 ASSERT(programObject);
6001 handleError(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08006002
6003 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
6004 // don't need to worry that:
6005 // 1. Draw calls after link use the new executable code or the old one depending on the link
6006 // result.
6007 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
6008 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
6009 // ProgramD3D.
6010 if (programObject->isInUse())
6011 {
Jamie Madill785e8a02018-10-04 17:42:00 -04006012 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04006013 if (programObject->isLinked())
6014 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006015 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006016 }
jchen107ae70d82018-07-06 13:47:01 +08006017 mStateCache.onProgramExecutableChange(this);
6018 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006019}
6020
6021void Context::releaseShaderCompiler()
6022{
Jamie Madill4928b7c2017-06-20 12:57:39 -04006023 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006024}
6025
6026void Context::shaderBinary(GLsizei n,
6027 const GLuint *shaders,
6028 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04006029 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006030 GLsizei length)
6031{
6032 // No binary shader formats are supported.
6033 UNIMPLEMENTED();
6034}
6035
Olli Etuaho0ca09752018-09-24 11:00:50 +03006036void Context::bindFragDataLocationIndexed(GLuint program,
6037 GLuint colorNumber,
6038 GLuint index,
6039 const char *name)
6040{
6041 Program *programObject = getProgramNoResolveLink(program);
6042 programObject->bindFragmentOutputLocation(colorNumber, name);
6043 programObject->bindFragmentOutputIndex(index, name);
6044}
6045
6046void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
6047{
6048 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
6049}
6050
6051int Context::getFragDataIndex(GLuint program, const char *name)
6052{
6053 Program *programObject = getProgramResolveLink(program);
6054 return programObject->getFragDataIndex(name);
6055}
6056
6057int Context::getProgramResourceLocationIndex(GLuint program,
6058 GLenum programInterface,
6059 const char *name)
6060{
6061 Program *programObject = getProgramResolveLink(program);
6062 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
6063 return programObject->getFragDataIndex(name);
6064}
6065
Jamie Madillc1d770e2017-04-13 17:31:24 -04006066void Context::shaderSource(GLuint shader,
6067 GLsizei count,
6068 const GLchar *const *string,
6069 const GLint *length)
6070{
6071 Shader *shaderObject = getShader(shader);
6072 ASSERT(shaderObject);
6073 shaderObject->setSource(count, string, length);
6074}
6075
6076void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
6077{
6078 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
6079}
6080
6081void Context::stencilMask(GLuint mask)
6082{
6083 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6084}
6085
6086void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6087{
6088 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6089}
6090
6091void Context::uniform1f(GLint location, GLfloat x)
6092{
6093 Program *program = mGLState.getProgram();
6094 program->setUniform1fv(location, 1, &x);
6095}
6096
6097void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6098{
6099 Program *program = mGLState.getProgram();
6100 program->setUniform1fv(location, count, v);
6101}
6102
Jamie Madill7e4eff12018-08-08 15:49:26 -04006103void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006104{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006105 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
Jamie Madill81c2e252017-09-09 23:32:46 -04006106 {
6107 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006108 mStateCache.onActiveTextureChange(this);
Jamie Madill81c2e252017-09-09 23:32:46 -04006109 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04006110}
6111
Jamie Madill7e4eff12018-08-08 15:49:26 -04006112void Context::uniform1i(GLint location, GLint x)
6113{
6114 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
6115}
6116
Jamie Madillc1d770e2017-04-13 17:31:24 -04006117void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6118{
Jamie Madill7e4eff12018-08-08 15:49:26 -04006119 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006120}
6121
6122void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6123{
6124 GLfloat xy[2] = {x, y};
6125 Program *program = mGLState.getProgram();
6126 program->setUniform2fv(location, 1, xy);
6127}
6128
6129void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6130{
6131 Program *program = mGLState.getProgram();
6132 program->setUniform2fv(location, count, v);
6133}
6134
6135void Context::uniform2i(GLint location, GLint x, GLint y)
6136{
6137 GLint xy[2] = {x, y};
6138 Program *program = mGLState.getProgram();
6139 program->setUniform2iv(location, 1, xy);
6140}
6141
6142void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6143{
6144 Program *program = mGLState.getProgram();
6145 program->setUniform2iv(location, count, v);
6146}
6147
6148void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6149{
6150 GLfloat xyz[3] = {x, y, z};
6151 Program *program = mGLState.getProgram();
6152 program->setUniform3fv(location, 1, xyz);
6153}
6154
6155void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6156{
6157 Program *program = mGLState.getProgram();
6158 program->setUniform3fv(location, count, v);
6159}
6160
6161void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6162{
6163 GLint xyz[3] = {x, y, z};
6164 Program *program = mGLState.getProgram();
6165 program->setUniform3iv(location, 1, xyz);
6166}
6167
6168void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6169{
6170 Program *program = mGLState.getProgram();
6171 program->setUniform3iv(location, count, v);
6172}
6173
6174void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6175{
6176 GLfloat xyzw[4] = {x, y, z, w};
6177 Program *program = mGLState.getProgram();
6178 program->setUniform4fv(location, 1, xyzw);
6179}
6180
6181void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6182{
6183 Program *program = mGLState.getProgram();
6184 program->setUniform4fv(location, count, v);
6185}
6186
6187void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6188{
6189 GLint xyzw[4] = {x, y, z, w};
6190 Program *program = mGLState.getProgram();
6191 program->setUniform4iv(location, 1, xyzw);
6192}
6193
6194void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6195{
6196 Program *program = mGLState.getProgram();
6197 program->setUniform4iv(location, count, v);
6198}
6199
6200void Context::uniformMatrix2fv(GLint location,
6201 GLsizei count,
6202 GLboolean transpose,
6203 const GLfloat *value)
6204{
6205 Program *program = mGLState.getProgram();
6206 program->setUniformMatrix2fv(location, count, transpose, value);
6207}
6208
6209void Context::uniformMatrix3fv(GLint location,
6210 GLsizei count,
6211 GLboolean transpose,
6212 const GLfloat *value)
6213{
6214 Program *program = mGLState.getProgram();
6215 program->setUniformMatrix3fv(location, count, transpose, value);
6216}
6217
6218void Context::uniformMatrix4fv(GLint location,
6219 GLsizei count,
6220 GLboolean transpose,
6221 const GLfloat *value)
6222{
6223 Program *program = mGLState.getProgram();
6224 program->setUniformMatrix4fv(location, count, transpose, value);
6225}
6226
6227void Context::validateProgram(GLuint program)
6228{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006229 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006230 ASSERT(programObject);
6231 programObject->validate(mCaps);
6232}
6233
Jiajia Qin5451d532017-11-16 17:16:34 +08006234void Context::validateProgramPipeline(GLuint pipeline)
6235{
6236 UNIMPLEMENTED();
6237}
6238
Jamie Madilld04908b2017-06-09 14:15:35 -04006239void Context::getProgramBinary(GLuint program,
6240 GLsizei bufSize,
6241 GLsizei *length,
6242 GLenum *binaryFormat,
6243 void *binary)
6244{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006245 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006246 ASSERT(programObject != nullptr);
6247
6248 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
6249}
6250
6251void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6252{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006253 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006254 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006255
Jamie Madilld04908b2017-06-09 14:15:35 -04006256 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006257 if (programObject->isInUse())
6258 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006259 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006260 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006261 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006262}
6263
Jamie Madillff325f12017-08-26 15:06:05 -04006264void Context::uniform1ui(GLint location, GLuint v0)
6265{
6266 Program *program = mGLState.getProgram();
6267 program->setUniform1uiv(location, 1, &v0);
6268}
6269
6270void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6271{
6272 Program *program = mGLState.getProgram();
6273 const GLuint xy[] = {v0, v1};
6274 program->setUniform2uiv(location, 1, xy);
6275}
6276
6277void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6278{
6279 Program *program = mGLState.getProgram();
6280 const GLuint xyz[] = {v0, v1, v2};
6281 program->setUniform3uiv(location, 1, xyz);
6282}
6283
6284void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6285{
6286 Program *program = mGLState.getProgram();
6287 const GLuint xyzw[] = {v0, v1, v2, v3};
6288 program->setUniform4uiv(location, 1, xyzw);
6289}
6290
6291void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6292{
6293 Program *program = mGLState.getProgram();
6294 program->setUniform1uiv(location, count, value);
6295}
6296void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6297{
6298 Program *program = mGLState.getProgram();
6299 program->setUniform2uiv(location, count, value);
6300}
6301
6302void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6303{
6304 Program *program = mGLState.getProgram();
6305 program->setUniform3uiv(location, count, value);
6306}
6307
6308void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6309{
6310 Program *program = mGLState.getProgram();
6311 program->setUniform4uiv(location, count, value);
6312}
6313
Jamie Madillf0e04492017-08-26 15:28:42 -04006314void Context::genQueries(GLsizei n, GLuint *ids)
6315{
6316 for (GLsizei i = 0; i < n; i++)
6317 {
6318 GLuint handle = mQueryHandleAllocator.allocate();
6319 mQueryMap.assign(handle, nullptr);
6320 ids[i] = handle;
6321 }
6322}
6323
6324void Context::deleteQueries(GLsizei n, const GLuint *ids)
6325{
6326 for (int i = 0; i < n; i++)
6327 {
6328 GLuint query = ids[i];
6329
6330 Query *queryObject = nullptr;
6331 if (mQueryMap.erase(query, &queryObject))
6332 {
6333 mQueryHandleAllocator.release(query);
6334 if (queryObject)
6335 {
6336 queryObject->release(this);
6337 }
6338 }
6339 }
6340}
6341
6342GLboolean Context::isQuery(GLuint id)
6343{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006344 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006345}
6346
Jamie Madillc8c95812017-08-26 18:40:09 -04006347void Context::uniformMatrix2x3fv(GLint location,
6348 GLsizei count,
6349 GLboolean transpose,
6350 const GLfloat *value)
6351{
6352 Program *program = mGLState.getProgram();
6353 program->setUniformMatrix2x3fv(location, count, transpose, value);
6354}
6355
6356void Context::uniformMatrix3x2fv(GLint location,
6357 GLsizei count,
6358 GLboolean transpose,
6359 const GLfloat *value)
6360{
6361 Program *program = mGLState.getProgram();
6362 program->setUniformMatrix3x2fv(location, count, transpose, value);
6363}
6364
6365void Context::uniformMatrix2x4fv(GLint location,
6366 GLsizei count,
6367 GLboolean transpose,
6368 const GLfloat *value)
6369{
6370 Program *program = mGLState.getProgram();
6371 program->setUniformMatrix2x4fv(location, count, transpose, value);
6372}
6373
6374void Context::uniformMatrix4x2fv(GLint location,
6375 GLsizei count,
6376 GLboolean transpose,
6377 const GLfloat *value)
6378{
6379 Program *program = mGLState.getProgram();
6380 program->setUniformMatrix4x2fv(location, count, transpose, value);
6381}
6382
6383void Context::uniformMatrix3x4fv(GLint location,
6384 GLsizei count,
6385 GLboolean transpose,
6386 const GLfloat *value)
6387{
6388 Program *program = mGLState.getProgram();
6389 program->setUniformMatrix3x4fv(location, count, transpose, value);
6390}
6391
6392void Context::uniformMatrix4x3fv(GLint location,
6393 GLsizei count,
6394 GLboolean transpose,
6395 const GLfloat *value)
6396{
6397 Program *program = mGLState.getProgram();
6398 program->setUniformMatrix4x3fv(location, count, transpose, value);
6399}
6400
Jamie Madilld7576732017-08-26 18:49:50 -04006401void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6402{
6403 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6404 {
6405 GLuint vertexArray = arrays[arrayIndex];
6406
6407 if (arrays[arrayIndex] != 0)
6408 {
6409 VertexArray *vertexArrayObject = nullptr;
6410 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6411 {
6412 if (vertexArrayObject != nullptr)
6413 {
6414 detachVertexArray(vertexArray);
6415 vertexArrayObject->onDestroy(this);
6416 }
6417
6418 mVertexArrayHandleAllocator.release(vertexArray);
6419 }
6420 }
6421 }
6422}
6423
6424void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6425{
6426 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6427 {
6428 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6429 mVertexArrayMap.assign(vertexArray, nullptr);
6430 arrays[arrayIndex] = vertexArray;
6431 }
6432}
6433
6434bool Context::isVertexArray(GLuint array)
6435{
6436 if (array == 0)
6437 {
6438 return GL_FALSE;
6439 }
6440
6441 VertexArray *vao = getVertexArray(array);
6442 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6443}
6444
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006445void Context::endTransformFeedback()
6446{
6447 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6448 transformFeedback->end(this);
Jamie Madilld84b6732018-09-06 15:54:35 -04006449 mStateCache.onTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006450}
6451
6452void Context::transformFeedbackVaryings(GLuint program,
6453 GLsizei count,
6454 const GLchar *const *varyings,
6455 GLenum bufferMode)
6456{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006457 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006458 ASSERT(programObject);
6459 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6460}
6461
6462void Context::getTransformFeedbackVarying(GLuint program,
6463 GLuint index,
6464 GLsizei bufSize,
6465 GLsizei *length,
6466 GLsizei *size,
6467 GLenum *type,
6468 GLchar *name)
6469{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006470 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006471 ASSERT(programObject);
6472 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6473}
6474
6475void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6476{
6477 for (int i = 0; i < n; i++)
6478 {
6479 GLuint transformFeedback = ids[i];
6480 if (transformFeedback == 0)
6481 {
6482 continue;
6483 }
6484
6485 TransformFeedback *transformFeedbackObject = nullptr;
6486 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6487 {
6488 if (transformFeedbackObject != nullptr)
6489 {
6490 detachTransformFeedback(transformFeedback);
6491 transformFeedbackObject->release(this);
6492 }
6493
6494 mTransformFeedbackHandleAllocator.release(transformFeedback);
6495 }
6496 }
6497}
6498
6499void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6500{
6501 for (int i = 0; i < n; i++)
6502 {
6503 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6504 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6505 ids[i] = transformFeedback;
6506 }
6507}
6508
6509bool Context::isTransformFeedback(GLuint id)
6510{
6511 if (id == 0)
6512 {
6513 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6514 // returns FALSE
6515 return GL_FALSE;
6516 }
6517
6518 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6519 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6520}
6521
6522void Context::pauseTransformFeedback()
6523{
6524 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6525 transformFeedback->pause();
6526}
6527
6528void Context::resumeTransformFeedback()
6529{
6530 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
6531 transformFeedback->resume();
6532}
6533
Jamie Madill12e957f2017-08-26 21:42:26 -04006534void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6535{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006536 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006537 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006538}
6539
Brandon Jones59770802018-04-02 13:18:42 -07006540void Context::getUniformuivRobust(GLuint program,
6541 GLint location,
6542 GLsizei bufSize,
6543 GLsizei *length,
6544 GLuint *params)
6545{
6546 getUniformuiv(program, location, params);
6547}
6548
Jamie Madill12e957f2017-08-26 21:42:26 -04006549GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6550{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006551 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006552 return programObject->getFragDataLocation(name);
6553}
6554
6555void Context::getUniformIndices(GLuint program,
6556 GLsizei uniformCount,
6557 const GLchar *const *uniformNames,
6558 GLuint *uniformIndices)
6559{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006560 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006561 if (!programObject->isLinked())
6562 {
6563 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6564 {
6565 uniformIndices[uniformId] = GL_INVALID_INDEX;
6566 }
6567 }
6568 else
6569 {
6570 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6571 {
6572 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6573 }
6574 }
6575}
6576
6577void Context::getActiveUniformsiv(GLuint program,
6578 GLsizei uniformCount,
6579 const GLuint *uniformIndices,
6580 GLenum pname,
6581 GLint *params)
6582{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006583 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006584 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6585 {
6586 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006587 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006588 }
6589}
6590
6591GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6592{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006593 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006594 return programObject->getUniformBlockIndex(uniformBlockName);
6595}
6596
6597void Context::getActiveUniformBlockiv(GLuint program,
6598 GLuint uniformBlockIndex,
6599 GLenum pname,
6600 GLint *params)
6601{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006602 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006603 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6604}
6605
Brandon Jones59770802018-04-02 13:18:42 -07006606void Context::getActiveUniformBlockivRobust(GLuint program,
6607 GLuint uniformBlockIndex,
6608 GLenum pname,
6609 GLsizei bufSize,
6610 GLsizei *length,
6611 GLint *params)
6612{
6613 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6614}
6615
Jamie Madill12e957f2017-08-26 21:42:26 -04006616void Context::getActiveUniformBlockName(GLuint program,
6617 GLuint uniformBlockIndex,
6618 GLsizei bufSize,
6619 GLsizei *length,
6620 GLchar *uniformBlockName)
6621{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006622 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006623 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6624}
6625
6626void Context::uniformBlockBinding(GLuint program,
6627 GLuint uniformBlockIndex,
6628 GLuint uniformBlockBinding)
6629{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006630 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006631 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006632
Jamie Madill956ab4d2018-10-10 16:13:03 -04006633 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006634 if (programObject->isInUse())
6635 {
6636 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006637 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006638 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006639}
6640
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006641GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6642{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006643 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6644 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006645
Jamie Madill70b5bb02017-08-28 13:32:37 -04006646 Sync *syncObject = getSync(syncHandle);
Jamie Madilla0691b72018-07-25 10:41:22 -04006647 Error error = syncObject->set(this, condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006648 if (error.isError())
6649 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006650 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006651 handleError(error);
6652 return nullptr;
6653 }
6654
Jamie Madill70b5bb02017-08-28 13:32:37 -04006655 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006656}
6657
6658GLboolean Context::isSync(GLsync sync)
6659{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006660 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006661}
6662
6663GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6664{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006665 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006666
6667 GLenum result = GL_WAIT_FAILED;
Jamie Madilla0691b72018-07-25 10:41:22 -04006668 handleError(syncObject->clientWait(this, flags, timeout, &result));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006669 return result;
6670}
6671
6672void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6673{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006674 Sync *syncObject = getSync(sync);
Jamie Madilla0691b72018-07-25 10:41:22 -04006675 handleError(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006676}
6677
6678void Context::getInteger64v(GLenum pname, GLint64 *params)
6679{
6680 GLenum nativeType = GL_NONE;
6681 unsigned int numParams = 0;
6682 getQueryParameterInfo(pname, &nativeType, &numParams);
6683
6684 if (nativeType == GL_INT_64_ANGLEX)
6685 {
6686 getInteger64vImpl(pname, params);
6687 }
6688 else
6689 {
6690 CastStateValues(this, nativeType, pname, numParams, params);
6691 }
6692}
6693
Brandon Jones59770802018-04-02 13:18:42 -07006694void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6695{
6696 getInteger64v(pname, data);
6697}
6698
Corentin Wallez336129f2017-10-17 15:55:40 -04006699void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006700{
6701 Buffer *buffer = mGLState.getTargetBuffer(target);
6702 QueryBufferParameteri64v(buffer, pname, params);
6703}
6704
Brandon Jones59770802018-04-02 13:18:42 -07006705void Context::getBufferParameteri64vRobust(BufferBinding target,
6706 GLenum pname,
6707 GLsizei bufSize,
6708 GLsizei *length,
6709 GLint64 *params)
6710{
6711 getBufferParameteri64v(target, pname, params);
6712}
6713
Jamie Madill3ef140a2017-08-26 23:11:21 -04006714void Context::genSamplers(GLsizei count, GLuint *samplers)
6715{
6716 for (int i = 0; i < count; i++)
6717 {
6718 samplers[i] = mState.mSamplers->createSampler();
6719 }
6720}
6721
6722void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6723{
6724 for (int i = 0; i < count; i++)
6725 {
6726 GLuint sampler = samplers[i];
6727
6728 if (mState.mSamplers->getSampler(sampler))
6729 {
6730 detachSampler(sampler);
6731 }
6732
6733 mState.mSamplers->deleteObject(this, sampler);
6734 }
6735}
6736
6737void Context::getInternalformativ(GLenum target,
6738 GLenum internalformat,
6739 GLenum pname,
6740 GLsizei bufSize,
6741 GLint *params)
6742{
6743 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6744 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6745}
6746
Brandon Jones59770802018-04-02 13:18:42 -07006747void Context::getInternalformativRobust(GLenum target,
6748 GLenum internalformat,
6749 GLenum pname,
6750 GLsizei bufSize,
6751 GLsizei *length,
6752 GLint *params)
6753{
6754 getInternalformativ(target, internalformat, pname, bufSize, params);
6755}
6756
Jiajia Qin5451d532017-11-16 17:16:34 +08006757void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6758{
6759 programUniform1iv(program, location, 1, &v0);
6760}
6761
6762void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6763{
6764 GLint xy[2] = {v0, v1};
6765 programUniform2iv(program, location, 1, xy);
6766}
6767
6768void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6769{
6770 GLint xyz[3] = {v0, v1, v2};
6771 programUniform3iv(program, location, 1, xyz);
6772}
6773
6774void Context::programUniform4i(GLuint program,
6775 GLint location,
6776 GLint v0,
6777 GLint v1,
6778 GLint v2,
6779 GLint v3)
6780{
6781 GLint xyzw[4] = {v0, v1, v2, v3};
6782 programUniform4iv(program, location, 1, xyzw);
6783}
6784
6785void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6786{
6787 programUniform1uiv(program, location, 1, &v0);
6788}
6789
6790void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6791{
6792 GLuint xy[2] = {v0, v1};
6793 programUniform2uiv(program, location, 1, xy);
6794}
6795
6796void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6797{
6798 GLuint xyz[3] = {v0, v1, v2};
6799 programUniform3uiv(program, location, 1, xyz);
6800}
6801
6802void Context::programUniform4ui(GLuint program,
6803 GLint location,
6804 GLuint v0,
6805 GLuint v1,
6806 GLuint v2,
6807 GLuint v3)
6808{
6809 GLuint xyzw[4] = {v0, v1, v2, v3};
6810 programUniform4uiv(program, location, 1, xyzw);
6811}
6812
6813void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6814{
6815 programUniform1fv(program, location, 1, &v0);
6816}
6817
6818void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6819{
6820 GLfloat xy[2] = {v0, v1};
6821 programUniform2fv(program, location, 1, xy);
6822}
6823
6824void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6825{
6826 GLfloat xyz[3] = {v0, v1, v2};
6827 programUniform3fv(program, location, 1, xyz);
6828}
6829
6830void Context::programUniform4f(GLuint program,
6831 GLint location,
6832 GLfloat v0,
6833 GLfloat v1,
6834 GLfloat v2,
6835 GLfloat v3)
6836{
6837 GLfloat xyzw[4] = {v0, v1, v2, v3};
6838 programUniform4fv(program, location, 1, xyzw);
6839}
6840
Jamie Madill81c2e252017-09-09 23:32:46 -04006841void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6842{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006843 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006844 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006845 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006846}
6847
Jiajia Qin5451d532017-11-16 17:16:34 +08006848void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6849{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006850 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006851 ASSERT(programObject);
6852 programObject->setUniform2iv(location, count, value);
6853}
6854
6855void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6856{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006857 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006858 ASSERT(programObject);
6859 programObject->setUniform3iv(location, count, value);
6860}
6861
6862void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6863{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006864 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006865 ASSERT(programObject);
6866 programObject->setUniform4iv(location, count, value);
6867}
6868
6869void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6870{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006871 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006872 ASSERT(programObject);
6873 programObject->setUniform1uiv(location, count, value);
6874}
6875
6876void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6877{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006878 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006879 ASSERT(programObject);
6880 programObject->setUniform2uiv(location, count, value);
6881}
6882
6883void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *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->setUniform3uiv(location, count, value);
6888}
6889
6890void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6891{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006892 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006893 ASSERT(programObject);
6894 programObject->setUniform4uiv(location, count, value);
6895}
6896
6897void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6898{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006899 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006900 ASSERT(programObject);
6901 programObject->setUniform1fv(location, count, value);
6902}
6903
6904void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6905{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006906 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006907 ASSERT(programObject);
6908 programObject->setUniform2fv(location, count, value);
6909}
6910
6911void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6912{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006913 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006914 ASSERT(programObject);
6915 programObject->setUniform3fv(location, count, value);
6916}
6917
6918void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6919{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006920 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006921 ASSERT(programObject);
6922 programObject->setUniform4fv(location, count, value);
6923}
6924
6925void Context::programUniformMatrix2fv(GLuint program,
6926 GLint location,
6927 GLsizei count,
6928 GLboolean transpose,
6929 const GLfloat *value)
6930{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006931 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006932 ASSERT(programObject);
6933 programObject->setUniformMatrix2fv(location, count, transpose, value);
6934}
6935
6936void Context::programUniformMatrix3fv(GLuint program,
6937 GLint location,
6938 GLsizei count,
6939 GLboolean transpose,
6940 const GLfloat *value)
6941{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006942 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006943 ASSERT(programObject);
6944 programObject->setUniformMatrix3fv(location, count, transpose, value);
6945}
6946
6947void Context::programUniformMatrix4fv(GLuint program,
6948 GLint location,
6949 GLsizei count,
6950 GLboolean transpose,
6951 const GLfloat *value)
6952{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006953 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006954 ASSERT(programObject);
6955 programObject->setUniformMatrix4fv(location, count, transpose, value);
6956}
6957
6958void Context::programUniformMatrix2x3fv(GLuint program,
6959 GLint location,
6960 GLsizei count,
6961 GLboolean transpose,
6962 const GLfloat *value)
6963{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006964 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006965 ASSERT(programObject);
6966 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6967}
6968
6969void Context::programUniformMatrix3x2fv(GLuint program,
6970 GLint location,
6971 GLsizei count,
6972 GLboolean transpose,
6973 const GLfloat *value)
6974{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006975 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006976 ASSERT(programObject);
6977 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6978}
6979
6980void Context::programUniformMatrix2x4fv(GLuint program,
6981 GLint location,
6982 GLsizei count,
6983 GLboolean transpose,
6984 const GLfloat *value)
6985{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006986 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006987 ASSERT(programObject);
6988 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6989}
6990
6991void Context::programUniformMatrix4x2fv(GLuint program,
6992 GLint location,
6993 GLsizei count,
6994 GLboolean transpose,
6995 const GLfloat *value)
6996{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006997 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006998 ASSERT(programObject);
6999 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
7000}
7001
7002void Context::programUniformMatrix3x4fv(GLuint program,
7003 GLint location,
7004 GLsizei count,
7005 GLboolean transpose,
7006 const GLfloat *value)
7007{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007008 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007009 ASSERT(programObject);
7010 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
7011}
7012
7013void Context::programUniformMatrix4x3fv(GLuint program,
7014 GLint location,
7015 GLsizei count,
7016 GLboolean transpose,
7017 const GLfloat *value)
7018{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007019 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08007020 ASSERT(programObject);
7021 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
7022}
7023
Jamie Madill81c2e252017-09-09 23:32:46 -04007024void Context::onTextureChange(const Texture *texture)
7025{
7026 // Conservatively assume all textures are dirty.
7027 // TODO(jmadill): More fine-grained update.
7028 mGLState.setObjectDirty(GL_TEXTURE);
7029}
7030
James Darpiniane8a93c62018-01-04 18:02:24 -08007031bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
7032{
7033 return mGLState.isCurrentTransformFeedback(tf);
7034}
James Darpiniane8a93c62018-01-04 18:02:24 -08007035
Yunchao Hea336b902017-08-02 16:05:21 +08007036void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
7037{
7038 for (int i = 0; i < count; i++)
7039 {
7040 pipelines[i] = createProgramPipeline();
7041 }
7042}
7043
7044void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
7045{
7046 for (int i = 0; i < count; i++)
7047 {
7048 if (pipelines[i] != 0)
7049 {
7050 deleteProgramPipeline(pipelines[i]);
7051 }
7052 }
7053}
7054
7055GLboolean Context::isProgramPipeline(GLuint pipeline)
7056{
7057 if (pipeline == 0)
7058 {
7059 return GL_FALSE;
7060 }
7061
7062 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
7063}
7064
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007065void Context::finishFenceNV(GLuint fence)
7066{
7067 FenceNV *fenceObject = getFenceNV(fence);
7068
7069 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madilla0691b72018-07-25 10:41:22 -04007070 handleError(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007071}
7072
7073void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
7074{
7075 FenceNV *fenceObject = getFenceNV(fence);
7076
7077 ASSERT(fenceObject && fenceObject->isSet());
7078
7079 switch (pname)
7080 {
7081 case GL_FENCE_STATUS_NV:
7082 {
7083 // GL_NV_fence spec:
7084 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
7085 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
7086 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
7087 GLboolean status = GL_TRUE;
7088 if (fenceObject->getStatus() != GL_TRUE)
7089 {
Jamie Madilla0691b72018-07-25 10:41:22 -04007090 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007091 }
7092 *params = status;
7093 break;
7094 }
7095
7096 case GL_FENCE_CONDITION_NV:
7097 {
7098 *params = static_cast<GLint>(fenceObject->getCondition());
7099 break;
7100 }
7101
7102 default:
7103 UNREACHABLE();
7104 }
7105}
7106
7107void Context::getTranslatedShaderSource(GLuint shader,
7108 GLsizei bufsize,
7109 GLsizei *length,
7110 GLchar *source)
7111{
7112 Shader *shaderObject = getShader(shader);
7113 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08007114 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007115}
7116
7117void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
7118{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007119 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007120 ASSERT(programObject);
7121
7122 programObject->getUniformfv(this, location, params);
7123}
7124
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007125void Context::getnUniformfvRobust(GLuint program,
7126 GLint location,
7127 GLsizei bufSize,
7128 GLsizei *length,
7129 GLfloat *params)
7130{
7131 UNIMPLEMENTED();
7132}
7133
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007134void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7135{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007136 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007137 ASSERT(programObject);
7138
7139 programObject->getUniformiv(this, location, params);
7140}
7141
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007142void Context::getnUniformivRobust(GLuint program,
7143 GLint location,
7144 GLsizei bufSize,
7145 GLsizei *length,
7146 GLint *params)
7147{
7148 UNIMPLEMENTED();
7149}
7150
7151void Context::getnUniformuivRobust(GLuint program,
7152 GLint location,
7153 GLsizei bufSize,
7154 GLsizei *length,
7155 GLuint *params)
7156{
7157 UNIMPLEMENTED();
7158}
7159
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007160GLboolean Context::isFenceNV(GLuint fence)
7161{
7162 FenceNV *fenceObject = getFenceNV(fence);
7163
7164 if (fenceObject == nullptr)
7165 {
7166 return GL_FALSE;
7167 }
7168
7169 // GL_NV_fence spec:
7170 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7171 // existing fence.
7172 return fenceObject->isSet();
7173}
7174
7175void Context::readnPixels(GLint x,
7176 GLint y,
7177 GLsizei width,
7178 GLsizei height,
7179 GLenum format,
7180 GLenum type,
7181 GLsizei bufSize,
7182 void *data)
7183{
7184 return readPixels(x, y, width, height, format, type, data);
7185}
7186
Jamie Madill007530e2017-12-28 14:27:04 -05007187void Context::setFenceNV(GLuint fence, GLenum condition)
7188{
7189 ASSERT(condition == GL_ALL_COMPLETED_NV);
7190
7191 FenceNV *fenceObject = getFenceNV(fence);
7192 ASSERT(fenceObject != nullptr);
Jamie Madilla0691b72018-07-25 10:41:22 -04007193 handleError(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007194}
7195
7196GLboolean Context::testFenceNV(GLuint fence)
7197{
7198 FenceNV *fenceObject = getFenceNV(fence);
7199
7200 ASSERT(fenceObject != nullptr);
7201 ASSERT(fenceObject->isSet() == GL_TRUE);
7202
7203 GLboolean result = GL_TRUE;
Jamie Madilla0691b72018-07-25 10:41:22 -04007204 Error error = fenceObject->test(this, &result);
Jamie Madill007530e2017-12-28 14:27:04 -05007205 if (error.isError())
7206 {
7207 handleError(error);
7208 return GL_TRUE;
7209 }
7210
7211 return result;
7212}
7213
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007214void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007215{
7216 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007217 egl::Image *imageObject = static_cast<egl::Image *>(image);
Corentin Wallez99d492c2018-02-27 15:17:10 -05007218 handleError(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007219}
7220
Jamie Madillfa920eb2018-01-04 11:45:50 -05007221void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007222{
7223 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007224 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill007530e2017-12-28 14:27:04 -05007225 handleError(renderbuffer->setStorageEGLImageTarget(this, imageObject));
7226}
7227
Jamie Madillfa920eb2018-01-04 11:45:50 -05007228void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7229{
7230 UNIMPLEMENTED();
7231}
7232
Jamie Madill5b772312018-03-08 20:28:32 -05007233bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7234{
7235 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7236 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7237 // to the fact that it is stored internally as a float, and so would require conversion
7238 // if returned from Context::getIntegerv. Since this conversion is already implemented
7239 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7240 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7241 // application.
7242 switch (pname)
7243 {
7244 case GL_COMPRESSED_TEXTURE_FORMATS:
7245 {
7246 *type = GL_INT;
7247 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7248 return true;
7249 }
7250 case GL_SHADER_BINARY_FORMATS:
7251 {
7252 *type = GL_INT;
7253 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7254 return true;
7255 }
7256
7257 case GL_MAX_VERTEX_ATTRIBS:
7258 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7259 case GL_MAX_VARYING_VECTORS:
7260 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7261 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7262 case GL_MAX_TEXTURE_IMAGE_UNITS:
7263 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7264 case GL_MAX_RENDERBUFFER_SIZE:
7265 case GL_NUM_SHADER_BINARY_FORMATS:
7266 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7267 case GL_ARRAY_BUFFER_BINDING:
7268 case GL_FRAMEBUFFER_BINDING:
7269 case GL_RENDERBUFFER_BINDING:
7270 case GL_CURRENT_PROGRAM:
7271 case GL_PACK_ALIGNMENT:
7272 case GL_UNPACK_ALIGNMENT:
7273 case GL_GENERATE_MIPMAP_HINT:
7274 case GL_RED_BITS:
7275 case GL_GREEN_BITS:
7276 case GL_BLUE_BITS:
7277 case GL_ALPHA_BITS:
7278 case GL_DEPTH_BITS:
7279 case GL_STENCIL_BITS:
7280 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7281 case GL_CULL_FACE_MODE:
7282 case GL_FRONT_FACE:
7283 case GL_ACTIVE_TEXTURE:
7284 case GL_STENCIL_FUNC:
7285 case GL_STENCIL_VALUE_MASK:
7286 case GL_STENCIL_REF:
7287 case GL_STENCIL_FAIL:
7288 case GL_STENCIL_PASS_DEPTH_FAIL:
7289 case GL_STENCIL_PASS_DEPTH_PASS:
7290 case GL_STENCIL_BACK_FUNC:
7291 case GL_STENCIL_BACK_VALUE_MASK:
7292 case GL_STENCIL_BACK_REF:
7293 case GL_STENCIL_BACK_FAIL:
7294 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7295 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7296 case GL_DEPTH_FUNC:
7297 case GL_BLEND_SRC_RGB:
7298 case GL_BLEND_SRC_ALPHA:
7299 case GL_BLEND_DST_RGB:
7300 case GL_BLEND_DST_ALPHA:
7301 case GL_BLEND_EQUATION_RGB:
7302 case GL_BLEND_EQUATION_ALPHA:
7303 case GL_STENCIL_WRITEMASK:
7304 case GL_STENCIL_BACK_WRITEMASK:
7305 case GL_STENCIL_CLEAR_VALUE:
7306 case GL_SUBPIXEL_BITS:
7307 case GL_MAX_TEXTURE_SIZE:
7308 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7309 case GL_SAMPLE_BUFFERS:
7310 case GL_SAMPLES:
7311 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7312 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7313 case GL_TEXTURE_BINDING_2D:
7314 case GL_TEXTURE_BINDING_CUBE_MAP:
7315 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7316 {
7317 *type = GL_INT;
7318 *numParams = 1;
7319 return true;
7320 }
7321 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7322 {
7323 if (!getExtensions().packReverseRowOrder)
7324 {
7325 return false;
7326 }
7327 *type = GL_INT;
7328 *numParams = 1;
7329 return true;
7330 }
7331 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7332 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7333 {
7334 if (!getExtensions().textureRectangle)
7335 {
7336 return false;
7337 }
7338 *type = GL_INT;
7339 *numParams = 1;
7340 return true;
7341 }
7342 case GL_MAX_DRAW_BUFFERS_EXT:
7343 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7344 {
7345 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7346 {
7347 return false;
7348 }
7349 *type = GL_INT;
7350 *numParams = 1;
7351 return true;
7352 }
7353 case GL_MAX_VIEWPORT_DIMS:
7354 {
7355 *type = GL_INT;
7356 *numParams = 2;
7357 return true;
7358 }
7359 case GL_VIEWPORT:
7360 case GL_SCISSOR_BOX:
7361 {
7362 *type = GL_INT;
7363 *numParams = 4;
7364 return true;
7365 }
7366 case GL_SHADER_COMPILER:
7367 case GL_SAMPLE_COVERAGE_INVERT:
7368 case GL_DEPTH_WRITEMASK:
7369 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7370 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7371 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7372 // bool-natural
7373 case GL_SAMPLE_COVERAGE:
7374 case GL_SCISSOR_TEST:
7375 case GL_STENCIL_TEST:
7376 case GL_DEPTH_TEST:
7377 case GL_BLEND:
7378 case GL_DITHER:
7379 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7380 {
7381 *type = GL_BOOL;
7382 *numParams = 1;
7383 return true;
7384 }
7385 case GL_COLOR_WRITEMASK:
7386 {
7387 *type = GL_BOOL;
7388 *numParams = 4;
7389 return true;
7390 }
7391 case GL_POLYGON_OFFSET_FACTOR:
7392 case GL_POLYGON_OFFSET_UNITS:
7393 case GL_SAMPLE_COVERAGE_VALUE:
7394 case GL_DEPTH_CLEAR_VALUE:
7395 case GL_LINE_WIDTH:
7396 {
7397 *type = GL_FLOAT;
7398 *numParams = 1;
7399 return true;
7400 }
7401 case GL_ALIASED_LINE_WIDTH_RANGE:
7402 case GL_ALIASED_POINT_SIZE_RANGE:
7403 case GL_DEPTH_RANGE:
7404 {
7405 *type = GL_FLOAT;
7406 *numParams = 2;
7407 return true;
7408 }
7409 case GL_COLOR_CLEAR_VALUE:
7410 case GL_BLEND_COLOR:
7411 {
7412 *type = GL_FLOAT;
7413 *numParams = 4;
7414 return true;
7415 }
7416 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7417 if (!getExtensions().textureFilterAnisotropic)
7418 {
7419 return false;
7420 }
7421 *type = GL_FLOAT;
7422 *numParams = 1;
7423 return true;
7424 case GL_TIMESTAMP_EXT:
7425 if (!getExtensions().disjointTimerQuery)
7426 {
7427 return false;
7428 }
7429 *type = GL_INT_64_ANGLEX;
7430 *numParams = 1;
7431 return true;
7432 case GL_GPU_DISJOINT_EXT:
7433 if (!getExtensions().disjointTimerQuery)
7434 {
7435 return false;
7436 }
7437 *type = GL_INT;
7438 *numParams = 1;
7439 return true;
7440 case GL_COVERAGE_MODULATION_CHROMIUM:
7441 if (!getExtensions().framebufferMixedSamples)
7442 {
7443 return false;
7444 }
7445 *type = GL_INT;
7446 *numParams = 1;
7447 return true;
7448 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7449 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7450 {
7451 return false;
7452 }
7453 *type = GL_INT;
7454 *numParams = 1;
7455 return true;
7456 }
7457
7458 if (getExtensions().debug)
7459 {
7460 switch (pname)
7461 {
7462 case GL_DEBUG_LOGGED_MESSAGES:
7463 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7464 case GL_DEBUG_GROUP_STACK_DEPTH:
7465 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7466 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7467 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7468 case GL_MAX_LABEL_LENGTH:
7469 *type = GL_INT;
7470 *numParams = 1;
7471 return true;
7472
7473 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7474 case GL_DEBUG_OUTPUT:
7475 *type = GL_BOOL;
7476 *numParams = 1;
7477 return true;
7478 }
7479 }
7480
7481 if (getExtensions().multisampleCompatibility)
7482 {
7483 switch (pname)
7484 {
7485 case GL_MULTISAMPLE_EXT:
7486 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7487 *type = GL_BOOL;
7488 *numParams = 1;
7489 return true;
7490 }
7491 }
7492
7493 if (getExtensions().pathRendering)
7494 {
7495 switch (pname)
7496 {
7497 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7498 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7499 *type = GL_FLOAT;
7500 *numParams = 16;
7501 return true;
7502 }
7503 }
7504
7505 if (getExtensions().bindGeneratesResource)
7506 {
7507 switch (pname)
7508 {
7509 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7510 *type = GL_BOOL;
7511 *numParams = 1;
7512 return true;
7513 }
7514 }
7515
7516 if (getExtensions().clientArrays)
7517 {
7518 switch (pname)
7519 {
7520 case GL_CLIENT_ARRAYS_ANGLE:
7521 *type = GL_BOOL;
7522 *numParams = 1;
7523 return true;
7524 }
7525 }
7526
7527 if (getExtensions().sRGBWriteControl)
7528 {
7529 switch (pname)
7530 {
7531 case GL_FRAMEBUFFER_SRGB_EXT:
7532 *type = GL_BOOL;
7533 *numParams = 1;
7534 return true;
7535 }
7536 }
7537
7538 if (getExtensions().robustResourceInitialization &&
7539 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7540 {
7541 *type = GL_BOOL;
7542 *numParams = 1;
7543 return true;
7544 }
7545
7546 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7547 {
7548 *type = GL_BOOL;
7549 *numParams = 1;
7550 return true;
7551 }
7552
jchen1082af6202018-06-22 10:59:52 +08007553 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7554 {
7555 *type = GL_INT;
7556 *numParams = 1;
7557 return true;
7558 }
7559
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007560 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7561 {
7562 *type = GL_INT;
7563 *numParams = 1;
7564 return true;
7565 }
7566
Jamie Madill5b772312018-03-08 20:28:32 -05007567 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7568 switch (pname)
7569 {
7570 // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE // equivalent to FRAMEBUFFER_BINDING
7571 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7572 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7573 {
7574 return false;
7575 }
7576 *type = GL_INT;
7577 *numParams = 1;
7578 return true;
7579
7580 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7581 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7582 {
7583 return false;
7584 }
7585 *type = GL_INT;
7586 *numParams = 1;
7587 return true;
7588
7589 case GL_PROGRAM_BINARY_FORMATS_OES:
7590 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7591 {
7592 return false;
7593 }
7594 *type = GL_INT;
7595 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7596 return true;
7597
7598 case GL_PACK_ROW_LENGTH:
7599 case GL_PACK_SKIP_ROWS:
7600 case GL_PACK_SKIP_PIXELS:
7601 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7602 {
7603 return false;
7604 }
7605 *type = GL_INT;
7606 *numParams = 1;
7607 return true;
7608 case GL_UNPACK_ROW_LENGTH:
7609 case GL_UNPACK_SKIP_ROWS:
7610 case GL_UNPACK_SKIP_PIXELS:
7611 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7612 {
7613 return false;
7614 }
7615 *type = GL_INT;
7616 *numParams = 1;
7617 return true;
7618 case GL_VERTEX_ARRAY_BINDING:
7619 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7620 {
7621 return false;
7622 }
7623 *type = GL_INT;
7624 *numParams = 1;
7625 return true;
7626 case GL_PIXEL_PACK_BUFFER_BINDING:
7627 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7628 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7629 {
7630 return false;
7631 }
7632 *type = GL_INT;
7633 *numParams = 1;
7634 return true;
7635 case GL_MAX_SAMPLES:
7636 {
7637 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7638 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7639 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7640 {
7641 return false;
7642 }
7643 *type = GL_INT;
7644 *numParams = 1;
7645 return true;
7646
7647 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7648 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7649 {
7650 return false;
7651 }
7652 *type = GL_INT;
7653 *numParams = 1;
7654 return true;
7655 }
7656 }
7657
7658 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7659 {
7660 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7661 {
7662 return false;
7663 }
7664 *type = GL_INT;
7665 *numParams = 1;
7666 return true;
7667 }
7668
7669 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7670 {
7671 *type = GL_INT;
7672 *numParams = 1;
7673 return true;
7674 }
7675
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007676 if (getClientVersion() < Version(2, 0))
7677 {
7678 switch (pname)
7679 {
7680 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007681 case GL_CLIENT_ACTIVE_TEXTURE:
7682 case GL_MATRIX_MODE:
7683 case GL_MAX_TEXTURE_UNITS:
7684 case GL_MAX_MODELVIEW_STACK_DEPTH:
7685 case GL_MAX_PROJECTION_STACK_DEPTH:
7686 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007687 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007688 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007689 case GL_VERTEX_ARRAY_STRIDE:
7690 case GL_NORMAL_ARRAY_STRIDE:
7691 case GL_COLOR_ARRAY_STRIDE:
7692 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7693 case GL_VERTEX_ARRAY_SIZE:
7694 case GL_COLOR_ARRAY_SIZE:
7695 case GL_TEXTURE_COORD_ARRAY_SIZE:
7696 case GL_VERTEX_ARRAY_TYPE:
7697 case GL_NORMAL_ARRAY_TYPE:
7698 case GL_COLOR_ARRAY_TYPE:
7699 case GL_TEXTURE_COORD_ARRAY_TYPE:
7700 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7701 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7702 case GL_COLOR_ARRAY_BUFFER_BINDING:
7703 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7704 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7705 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7706 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007707 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007708 case GL_MODELVIEW_STACK_DEPTH:
7709 case GL_PROJECTION_STACK_DEPTH:
7710 case GL_TEXTURE_STACK_DEPTH:
7711 case GL_LOGIC_OP_MODE:
7712 case GL_BLEND_SRC:
7713 case GL_BLEND_DST:
7714 case GL_PERSPECTIVE_CORRECTION_HINT:
7715 case GL_POINT_SMOOTH_HINT:
7716 case GL_LINE_SMOOTH_HINT:
7717 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007718 *type = GL_INT;
7719 *numParams = 1;
7720 return true;
7721 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007722 case GL_FOG_DENSITY:
7723 case GL_FOG_START:
7724 case GL_FOG_END:
7725 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007726 case GL_POINT_SIZE:
7727 case GL_POINT_SIZE_MIN:
7728 case GL_POINT_SIZE_MAX:
7729 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007730 *type = GL_FLOAT;
7731 *numParams = 1;
7732 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007733 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007734 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007735 *type = GL_FLOAT;
7736 *numParams = 2;
7737 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007738 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007739 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007740 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007741 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007742 *type = GL_FLOAT;
7743 *numParams = 4;
7744 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007745 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007746 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007747 *type = GL_FLOAT;
7748 *numParams = 3;
7749 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007750 case GL_MODELVIEW_MATRIX:
7751 case GL_PROJECTION_MATRIX:
7752 case GL_TEXTURE_MATRIX:
7753 *type = GL_FLOAT;
7754 *numParams = 16;
7755 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007756 case GL_LIGHT_MODEL_TWO_SIDE:
7757 *type = GL_BOOL;
7758 *numParams = 1;
7759 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007760 }
7761 }
7762
Jamie Madill5b772312018-03-08 20:28:32 -05007763 if (getClientVersion() < Version(3, 0))
7764 {
7765 return false;
7766 }
7767
7768 // Check for ES3.0+ parameter names
7769 switch (pname)
7770 {
7771 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7772 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7773 case GL_UNIFORM_BUFFER_BINDING:
7774 case GL_TRANSFORM_FEEDBACK_BINDING:
7775 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7776 case GL_COPY_READ_BUFFER_BINDING:
7777 case GL_COPY_WRITE_BUFFER_BINDING:
7778 case GL_SAMPLER_BINDING:
7779 case GL_READ_BUFFER:
7780 case GL_TEXTURE_BINDING_3D:
7781 case GL_TEXTURE_BINDING_2D_ARRAY:
7782 case GL_MAX_3D_TEXTURE_SIZE:
7783 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7784 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7785 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7786 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7787 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7788 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7789 case GL_MAX_VARYING_COMPONENTS:
7790 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7791 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7792 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7793 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7794 case GL_NUM_EXTENSIONS:
7795 case GL_MAJOR_VERSION:
7796 case GL_MINOR_VERSION:
7797 case GL_MAX_ELEMENTS_INDICES:
7798 case GL_MAX_ELEMENTS_VERTICES:
7799 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7800 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7801 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7802 case GL_UNPACK_IMAGE_HEIGHT:
7803 case GL_UNPACK_SKIP_IMAGES:
7804 {
7805 *type = GL_INT;
7806 *numParams = 1;
7807 return true;
7808 }
7809
7810 case GL_MAX_ELEMENT_INDEX:
7811 case GL_MAX_UNIFORM_BLOCK_SIZE:
7812 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7813 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7814 case GL_MAX_SERVER_WAIT_TIMEOUT:
7815 {
7816 *type = GL_INT_64_ANGLEX;
7817 *numParams = 1;
7818 return true;
7819 }
7820
7821 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7822 case GL_TRANSFORM_FEEDBACK_PAUSED:
7823 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7824 case GL_RASTERIZER_DISCARD:
7825 {
7826 *type = GL_BOOL;
7827 *numParams = 1;
7828 return true;
7829 }
7830
7831 case GL_MAX_TEXTURE_LOD_BIAS:
7832 {
7833 *type = GL_FLOAT;
7834 *numParams = 1;
7835 return true;
7836 }
7837 }
7838
7839 if (getExtensions().requestExtension)
7840 {
7841 switch (pname)
7842 {
7843 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7844 *type = GL_INT;
7845 *numParams = 1;
7846 return true;
7847 }
7848 }
7849
Yizhou Jiang7818a852018-09-06 15:02:04 +08007850 if (getExtensions().textureMultisample)
7851 {
7852 switch (pname)
7853 {
7854 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7855 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7856 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7857 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
7858 *type = GL_INT;
7859 *numParams = 1;
7860 return true;
7861 }
7862 }
7863
Jamie Madill5b772312018-03-08 20:28:32 -05007864 if (getClientVersion() < Version(3, 1))
7865 {
7866 return false;
7867 }
7868
7869 switch (pname)
7870 {
7871 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7872 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7873 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7874 case GL_MAX_FRAMEBUFFER_WIDTH:
7875 case GL_MAX_FRAMEBUFFER_HEIGHT:
7876 case GL_MAX_FRAMEBUFFER_SAMPLES:
7877 case GL_MAX_SAMPLE_MASK_WORDS:
7878 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7879 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7880 case GL_MAX_INTEGER_SAMPLES:
7881 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7882 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7883 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7884 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7885 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7886 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7887 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7888 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7889 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7890 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7891 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7892 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7893 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7894 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7895 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7896 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7897 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7898 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7899 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7900 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7901 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7902 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7903 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7904 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7905 case GL_MAX_UNIFORM_LOCATIONS:
7906 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7907 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7908 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7909 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7910 case GL_MAX_IMAGE_UNITS:
7911 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7912 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7913 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7914 case GL_SHADER_STORAGE_BUFFER_BINDING:
7915 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7916 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007917 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007918 *type = GL_INT;
7919 *numParams = 1;
7920 return true;
7921 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7922 *type = GL_INT_64_ANGLEX;
7923 *numParams = 1;
7924 return true;
7925 case GL_SAMPLE_MASK:
7926 *type = GL_BOOL;
7927 *numParams = 1;
7928 return true;
7929 }
7930
7931 if (getExtensions().geometryShader)
7932 {
7933 switch (pname)
7934 {
7935 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7936 case GL_LAYER_PROVOKING_VERTEX_EXT:
7937 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7938 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7939 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7940 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7941 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7942 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7943 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7944 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7945 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7946 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7947 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7948 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7949 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7950 *type = GL_INT;
7951 *numParams = 1;
7952 return true;
7953 }
7954 }
7955
7956 return false;
7957}
7958
7959bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7960{
7961 if (getClientVersion() < Version(3, 0))
7962 {
7963 return false;
7964 }
7965
7966 switch (target)
7967 {
7968 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7969 case GL_UNIFORM_BUFFER_BINDING:
7970 {
7971 *type = GL_INT;
7972 *numParams = 1;
7973 return true;
7974 }
7975 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7976 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7977 case GL_UNIFORM_BUFFER_START:
7978 case GL_UNIFORM_BUFFER_SIZE:
7979 {
7980 *type = GL_INT_64_ANGLEX;
7981 *numParams = 1;
7982 return true;
7983 }
7984 }
7985
7986 if (getClientVersion() < Version(3, 1))
7987 {
7988 return false;
7989 }
7990
7991 switch (target)
7992 {
7993 case GL_IMAGE_BINDING_LAYERED:
7994 {
7995 *type = GL_BOOL;
7996 *numParams = 1;
7997 return true;
7998 }
7999 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
8000 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
8001 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
8002 case GL_SHADER_STORAGE_BUFFER_BINDING:
8003 case GL_VERTEX_BINDING_BUFFER:
8004 case GL_VERTEX_BINDING_DIVISOR:
8005 case GL_VERTEX_BINDING_OFFSET:
8006 case GL_VERTEX_BINDING_STRIDE:
8007 case GL_SAMPLE_MASK_VALUE:
8008 case GL_IMAGE_BINDING_NAME:
8009 case GL_IMAGE_BINDING_LEVEL:
8010 case GL_IMAGE_BINDING_LAYER:
8011 case GL_IMAGE_BINDING_ACCESS:
8012 case GL_IMAGE_BINDING_FORMAT:
8013 {
8014 *type = GL_INT;
8015 *numParams = 1;
8016 return true;
8017 }
8018 case GL_ATOMIC_COUNTER_BUFFER_START:
8019 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
8020 case GL_SHADER_STORAGE_BUFFER_START:
8021 case GL_SHADER_STORAGE_BUFFER_SIZE:
8022 {
8023 *type = GL_INT_64_ANGLEX;
8024 *numParams = 1;
8025 return true;
8026 }
8027 }
8028
8029 return false;
8030}
8031
Jamie Madill44a6fbf2018-10-02 13:38:56 -04008032Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05008033{
8034 return mState.mShaderPrograms->getProgram(handle);
8035}
8036
8037Shader *Context::getShader(GLuint handle) const
8038{
8039 return mState.mShaderPrograms->getShader(handle);
8040}
8041
Jamie Madill5b772312018-03-08 20:28:32 -05008042bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
8043{
8044 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
8045}
8046
8047bool Context::isFramebufferGenerated(GLuint framebuffer) const
8048{
8049 return mState.mFramebuffers->isHandleGenerated(framebuffer);
8050}
8051
8052bool Context::isProgramPipelineGenerated(GLuint pipeline) const
8053{
8054 return mState.mPipelines->isHandleGenerated(pipeline);
8055}
8056
8057bool Context::usingDisplayTextureShareGroup() const
8058{
8059 return mDisplayTextureShareGroup;
8060}
8061
8062GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
8063{
8064 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
8065 internalformat == GL_DEPTH_STENCIL
8066 ? GL_DEPTH24_STENCIL8
8067 : internalformat;
8068}
8069
jchen1082af6202018-06-22 10:59:52 +08008070void Context::maxShaderCompilerThreads(GLuint count)
8071{
jchen107ae70d82018-07-06 13:47:01 +08008072 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08008073 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08008074 // A count of zero specifies a request for no parallel compiling or linking.
8075 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
8076 {
8077 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
8078 }
8079 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08008080}
8081
Jamie Madill2eb65032018-07-30 10:25:57 -04008082bool Context::isGLES1() const
8083{
8084 return mState.getClientVersion() < Version(2, 0);
8085}
8086
Jamie Madilla11819d2018-07-30 10:26:01 -04008087void Context::onSubjectStateChange(const Context *context,
8088 angle::SubjectIndex index,
8089 angle::SubjectMessage message)
8090{
Jamie Madilla11819d2018-07-30 10:26:01 -04008091 switch (index)
8092 {
8093 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008094 switch (message)
8095 {
8096 case angle::SubjectMessage::CONTENTS_CHANGED:
8097 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
8098 mStateCache.onVertexArrayBufferContentsChange(this);
8099 break;
8100 case angle::SubjectMessage::RESOURCE_MAPPED:
8101 case angle::SubjectMessage::RESOURCE_UNMAPPED:
8102 case angle::SubjectMessage::BINDING_CHANGED:
8103 mStateCache.onVertexArrayBufferStateChange(this);
8104 break;
8105 default:
8106 break;
8107 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008108 break;
8109
8110 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008111 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8112 {
8113 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
8114 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008115 break;
8116
8117 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04008118 if (message == angle::SubjectMessage::STORAGE_CHANGED)
8119 {
8120 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
8121 }
8122 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008123 break;
8124
8125 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008126 if (index < kTextureMaxSubjectIndex)
8127 {
8128 mGLState.onActiveTextureStateChange(index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008129 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008130 }
Jamie Madille25b8002018-09-20 13:39:49 -04008131 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008132 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008133 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008134 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008135 }
Jamie Madille25b8002018-09-20 13:39:49 -04008136 else
8137 {
8138 ASSERT(index < kSamplerMaxSubjectIndex);
8139 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8140 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008141 break;
8142 }
8143}
8144
Jamie Madill6b873dd2018-07-12 23:56:30 -04008145// ErrorSet implementation.
Jamie Madillb980c562018-11-27 11:34:27 -05008146ErrorSet::ErrorSet(Context *context) : mContext(context) {}
Jamie Madill6b873dd2018-07-12 23:56:30 -04008147
8148ErrorSet::~ErrorSet() = default;
8149
Jamie Madill306b6c12018-07-27 08:12:49 -04008150void ErrorSet::handleError(const Error &error) const
Jamie Madill6b873dd2018-07-12 23:56:30 -04008151{
8152 // This internal enum is used to filter internal errors that are already handled.
8153 // TODO(jmadill): Remove this when refactor is done. http://anglebug.com/2491
8154 if (error.getCode() == GL_INTERNAL_ERROR_ANGLEX)
8155 {
8156 return;
8157 }
8158
8159 if (ANGLE_UNLIKELY(error.isError()))
8160 {
8161 GLenum code = error.getCode();
8162 mErrors.insert(code);
Jamie Madill785e8a02018-10-04 17:42:00 -04008163
Jamie Madill6b873dd2018-07-12 23:56:30 -04008164 if (code == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8165 {
8166 mContext->markContextLost();
8167 }
8168
8169 ASSERT(!error.getMessage().empty());
8170 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8171 error.getID(), GL_DEBUG_SEVERITY_HIGH,
8172 error.getMessage());
8173 }
8174}
8175
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008176void ErrorSet::handleError(GLenum errorCode,
8177 const char *message,
8178 const char *file,
8179 const char *function,
8180 unsigned int line)
8181{
8182 // TODO(jmadill): Handle error directly instead of creating object. http://anglebug.com/2491
8183 std::stringstream errorStream;
8184 errorStream << "Front-end Error: " << gl::FmtHex(errorCode) << ", in " << file << ", "
8185 << function << ":" << line << ". " << message;
8186
8187 handleError(gl::Error(errorCode, errorCode, errorStream.str()));
8188}
8189
Jamie Madilla139f012018-10-10 16:13:03 -04008190void ErrorSet::validationError(GLenum errorCode, const char *message)
8191{
8192 handleError(gl::Error(errorCode, message));
8193}
8194
Jamie Madill6b873dd2018-07-12 23:56:30 -04008195bool ErrorSet::empty() const
8196{
8197 return mErrors.empty();
8198}
8199
8200GLenum ErrorSet::popError()
8201{
8202 ASSERT(!empty());
8203 GLenum error = *mErrors.begin();
8204 mErrors.erase(mErrors.begin());
8205 return error;
8206}
Jamie Madilldc358af2018-07-31 11:22:13 -04008207
8208// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008209StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008210 : mCachedHasAnyEnabledClientAttrib(false),
8211 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008212 mCachedInstancedVertexElementLimit(0),
8213 mCachedBasicDrawStatesError(kInvalidPointer)
Jamie Madillb980c562018-11-27 11:34:27 -05008214{}
Jamie Madilldc358af2018-07-31 11:22:13 -04008215
8216StateCache::~StateCache() = default;
8217
Jamie Madillac66f982018-10-09 18:30:01 -04008218void StateCache::initialize(Context *context)
8219{
8220 updateValidDrawModes(context);
8221 updateValidBindTextureTypes(context);
8222}
8223
Jamie Madilldc358af2018-07-31 11:22:13 -04008224void StateCache::updateActiveAttribsMask(Context *context)
8225{
8226 bool isGLES1 = context->isGLES1();
8227 const State &glState = context->getGLState();
8228
8229 if (!isGLES1 && !glState.getProgram())
8230 {
8231 mCachedActiveBufferedAttribsMask = AttributesMask();
8232 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008233 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008234 return;
8235 }
8236
8237 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8238 : glState.getProgram()->getActiveAttribLocationsMask();
8239
8240 const VertexArray *vao = glState.getVertexArray();
8241 ASSERT(vao);
8242
8243 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8244 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008245 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008246
Jamie Madill0a17e482018-08-31 17:19:11 -04008247 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8248 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008249 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008250 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8251}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008252
8253void StateCache::updateVertexElementLimits(Context *context)
8254{
8255 const VertexArray *vao = context->getGLState().getVertexArray();
8256
8257 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8258 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8259
8260 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8261 // If there are no buffered attributes then we should not limit the draw call count.
8262 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8263 {
8264 return;
8265 }
8266
8267 const auto &vertexAttribs = vao->getVertexAttributes();
8268 const auto &vertexBindings = vao->getVertexBindings();
8269
8270 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8271 {
8272 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8273 ASSERT(attrib.enabled);
8274
8275 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8276 ASSERT(context->isGLES1() ||
8277 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8278
8279 GLint64 limit = attrib.getCachedElementLimit();
8280 if (binding.getDivisor() > 0)
8281 {
8282 mCachedInstancedVertexElementLimit =
8283 std::min(mCachedInstancedVertexElementLimit, limit);
8284 }
8285 else
8286 {
8287 mCachedNonInstancedVertexElementLimit =
8288 std::min(mCachedNonInstancedVertexElementLimit, limit);
8289 }
8290 }
8291}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008292
Jamie Madilld84b6732018-09-06 15:54:35 -04008293void StateCache::updateBasicDrawStatesError()
8294{
8295 mCachedBasicDrawStatesError = kInvalidPointer;
8296}
8297
8298intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8299{
8300 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8301 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8302 return mCachedBasicDrawStatesError;
8303}
8304
Jamie Madillc43cdad2018-08-08 15:49:25 -04008305void StateCache::onVertexArrayBindingChange(Context *context)
8306{
8307 updateActiveAttribsMask(context);
8308 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008309 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008310}
8311
8312void StateCache::onProgramExecutableChange(Context *context)
8313{
8314 updateActiveAttribsMask(context);
8315 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008316 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008317 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008318}
8319
Jamie Madilld84b6732018-09-06 15:54:35 -04008320void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008321{
8322 updateVertexElementLimits(context);
8323}
8324
Jamie Madilld84b6732018-09-06 15:54:35 -04008325void StateCache::onVertexArrayBufferContentsChange(Context *context)
8326{
8327 updateVertexElementLimits(context);
8328 updateBasicDrawStatesError();
8329}
8330
Jamie Madillc43cdad2018-08-08 15:49:25 -04008331void StateCache::onVertexArrayStateChange(Context *context)
8332{
8333 updateActiveAttribsMask(context);
8334 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008335 updateBasicDrawStatesError();
8336}
8337
8338void StateCache::onVertexArrayBufferStateChange(Context *context)
8339{
8340 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008341}
8342
8343void StateCache::onGLES1ClientStateChange(Context *context)
8344{
8345 updateActiveAttribsMask(context);
8346}
Jamie Madilld84b6732018-09-06 15:54:35 -04008347
8348void StateCache::onDrawFramebufferChange(Context *context)
8349{
8350 updateBasicDrawStatesError();
8351}
8352
8353void StateCache::onContextCapChange(Context *context)
8354{
8355 updateBasicDrawStatesError();
8356}
8357
8358void StateCache::onStencilStateChange(Context *context)
8359{
8360 updateBasicDrawStatesError();
8361}
8362
8363void StateCache::onDefaultVertexAttributeChange(Context *context)
8364{
8365 updateBasicDrawStatesError();
8366}
8367
8368void StateCache::onActiveTextureChange(Context *context)
8369{
8370 updateBasicDrawStatesError();
8371}
8372
8373void StateCache::onQueryChange(Context *context)
8374{
8375 updateBasicDrawStatesError();
8376}
8377
8378void StateCache::onTransformFeedbackChange(Context *context)
8379{
8380 updateBasicDrawStatesError();
8381}
8382
8383void StateCache::onUniformBufferStateChange(Context *context)
8384{
8385 updateBasicDrawStatesError();
8386}
8387
8388void StateCache::onBufferBindingChange(Context *context)
8389{
8390 updateBasicDrawStatesError();
8391}
Jamie Madill526a6f62018-09-12 11:03:05 -04008392
8393void StateCache::updateValidDrawModes(Context *context)
8394{
8395 Program *program = context->getGLState().getProgram();
8396 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8397 {
Jamie Madill752d2202018-11-27 13:29:48 -05008398 mCachedValidDrawModes = kValidBasicDrawModes;
Jamie Madill526a6f62018-09-12 11:03:05 -04008399 }
8400 else
8401 {
8402 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8403
8404 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
8405
8406 mCachedValidDrawModes = {{
Jamie Madill752d2202018-11-27 13:29:48 -05008407 {PrimitiveMode::Points, gsMode == PrimitiveMode::Points},
8408 {PrimitiveMode::Lines, gsMode == PrimitiveMode::Lines},
8409 {PrimitiveMode::LineLoop, gsMode == PrimitiveMode::Lines},
8410 {PrimitiveMode::LineStrip, gsMode == PrimitiveMode::Lines},
8411 {PrimitiveMode::Triangles, gsMode == PrimitiveMode::Triangles},
8412 {PrimitiveMode::TriangleStrip, gsMode == PrimitiveMode::Triangles},
8413 {PrimitiveMode::TriangleFan, gsMode == PrimitiveMode::Triangles},
8414 {PrimitiveMode::LinesAdjacency, gsMode == PrimitiveMode::LinesAdjacency},
8415 {PrimitiveMode::LineStripAdjacency, gsMode == PrimitiveMode::LinesAdjacency},
8416 {PrimitiveMode::TrianglesAdjacency, gsMode == PrimitiveMode::TrianglesAdjacency},
8417 {PrimitiveMode::TriangleStripAdjacency, gsMode == PrimitiveMode::TrianglesAdjacency},
Jamie Madill526a6f62018-09-12 11:03:05 -04008418 }};
8419 }
8420}
Jamie Madillac66f982018-10-09 18:30:01 -04008421
8422void StateCache::updateValidBindTextureTypes(Context *context)
8423{
8424 const Extensions &exts = context->getExtensions();
8425 bool isGLES3 = context->getClientMajorVersion() >= 3;
8426 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8427
8428 mCachedValidBindTextureTypes = {{
Jamie Madill752d2202018-11-27 13:29:48 -05008429 {TextureType::_2D, true},
8430 {TextureType::_2DArray, isGLES3},
8431 {TextureType::_2DMultisample, isGLES31 || exts.textureMultisample},
8432 {TextureType::_2DMultisampleArray, exts.textureStorageMultisample2DArray},
8433 {TextureType::_3D, isGLES3},
8434 {TextureType::External, exts.eglImageExternal || exts.eglStreamConsumerExternal},
8435 {TextureType::Rectangle, exts.textureRectangle},
8436 {TextureType::CubeMap, true},
Jamie Madillac66f982018-10-09 18:30:01 -04008437 }};
8438}
Jamie Madillc29968b2016-01-20 11:17:23 -05008439} // namespace gl