blob: 552bb8912e01c7522a3b13d15ee502ff3cdcdd1d [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090011#include "libANGLE/Context.inl.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000012
Jamie Madill231c7f52017-04-26 13:45:37 -040013#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050014#include <iterator>
15#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030016#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050017
Tobin Ehlisd7890bc2018-06-29 11:57:22 -060018#include "common/PackedEnums.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030019#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040020#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050021#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050022#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050023#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050024#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040025#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050026#include "libANGLE/Fence.h"
27#include "libANGLE/Framebuffer.h"
28#include "libANGLE/FramebufferAttachment.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030029#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080031#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050033#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/ResourceManager.h"
35#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050036#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050037#include "libANGLE/Texture.h"
38#include "libANGLE/TransformFeedback.h"
39#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070040#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040041#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
Jamie Madill6d32cef2018-08-14 02:34:28 -040044#include "libANGLE/renderer/BufferImpl.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040046#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040047#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000048
Jamie Madill752d2202018-11-27 13:29:48 -050049namespace gl
50{
Geoff Langf6db0982015-08-25 13:04:00 -040051namespace
52{
53
Jamie Madillb6664922017-07-25 12:55:04 -040054#define ANGLE_HANDLE_ERR(X) \
Jamie Madill4f6592f2018-11-27 16:37:45 -050055 (void)(X); \
Jamie Madillb6664922017-07-25 12:55:04 -040056 return;
57#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
58
Ian Ewell3ffd78b2016-01-22 16:09:42 -050059template <typename T>
Jamie Madill752d2202018-11-27 13:29:48 -050060std::vector<Path *> GatherPaths(PathManager &resourceManager,
61 GLsizei numPaths,
62 const void *paths,
63 GLuint pathBase)
Sami Väisänend59ca052016-06-21 16:10:00 +030064{
Jamie Madill752d2202018-11-27 13:29:48 -050065 std::vector<Path *> ret;
Sami Väisänend59ca052016-06-21 16:10:00 +030066 ret.reserve(numPaths);
67
68 const auto *nameArray = static_cast<const T *>(paths);
69
70 for (GLsizei i = 0; i < numPaths; ++i)
71 {
72 const GLuint pathName = nameArray[i] + pathBase;
73
74 ret.push_back(resourceManager.getPath(pathName));
75 }
76
77 return ret;
78}
79
Jamie Madill752d2202018-11-27 13:29:48 -050080std::vector<Path *> GatherPaths(PathManager &resourceManager,
81 GLsizei numPaths,
82 GLenum pathNameType,
83 const void *paths,
84 GLuint pathBase)
Sami Väisänend59ca052016-06-21 16:10:00 +030085{
86 switch (pathNameType)
87 {
88 case GL_UNSIGNED_BYTE:
89 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
90
91 case GL_BYTE:
92 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
93
94 case GL_UNSIGNED_SHORT:
95 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
96
97 case GL_SHORT:
98 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
99
100 case GL_UNSIGNED_INT:
101 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
102
103 case GL_INT:
104 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
105 }
106
107 UNREACHABLE();
Jamie Madill752d2202018-11-27 13:29:48 -0500108 return std::vector<Path *>();
Sami Väisänend59ca052016-06-21 16:10:00 +0300109}
110
111template <typename T>
Jamie Madill752d2202018-11-27 13:29:48 -0500112angle::Result GetQueryObjectParameter(const Context *context, Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500113{
Geoff Lang2186c382016-10-14 10:54:54 -0400114 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500115
116 switch (pname)
117 {
118 case GL_QUERY_RESULT_EXT:
Jamie Madill5188a272018-07-25 10:53:56 -0400119 return query->getResult(context, params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500120 case GL_QUERY_RESULT_AVAILABLE_EXT:
121 {
122 bool available;
Jamie Madill666818e2018-11-14 09:54:33 -0500123 ANGLE_TRY(query->isResultAvailable(context, &available));
Jamie Madill752d2202018-11-27 13:29:48 -0500124 *params = CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Jamie Madill7c985f52018-11-29 18:16:17 -0500125 return angle::Result::Continue;
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500126 }
127 default:
128 UNREACHABLE();
Jamie Madill7c985f52018-11-29 18:16:17 -0500129 return angle::Result::Stop;
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500130 }
131}
132
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500133// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300134EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500135{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400136 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500137}
138
Martin Radev1be913c2016-07-11 17:59:16 +0300139EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
140{
141 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
142}
143
Jamie Madill752d2202018-11-27 13:29:48 -0500144Version GetClientVersion(const egl::AttributeMap &attribs)
Geoff Langeb66a6e2016-10-31 13:06:12 -0400145{
Jamie Madill752d2202018-11-27 13:29:48 -0500146 return Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
Geoff Langeb66a6e2016-10-31 13:06:12 -0400147}
148
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500149GLenum GetResetStrategy(const egl::AttributeMap &attribs)
150{
Lingfeng Yangb27b03a2018-02-19 13:38:48 -0800151 EGLAttrib attrib =
152 attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153 switch (attrib)
154 {
155 case EGL_NO_RESET_NOTIFICATION:
156 return GL_NO_RESET_NOTIFICATION_EXT;
157 case EGL_LOSE_CONTEXT_ON_RESET:
158 return GL_LOSE_CONTEXT_ON_RESET_EXT;
159 default:
160 UNREACHABLE();
161 return GL_NONE;
162 }
163}
164
165bool GetRobustAccess(const egl::AttributeMap &attribs)
166{
Geoff Lang077f20a2016-11-01 10:08:02 -0400167 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
168 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
169 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500170}
171
172bool GetDebug(const egl::AttributeMap &attribs)
173{
Geoff Lang077f20a2016-11-01 10:08:02 -0400174 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
175 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500176}
177
178bool GetNoError(const egl::AttributeMap &attribs)
179{
180 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
181}
182
Geoff Langc287ea62016-09-16 14:46:51 -0400183bool GetWebGLContext(const egl::AttributeMap &attribs)
184{
Jamie Madill4230d482018-09-14 10:14:45 -0400185 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
Geoff Langc287ea62016-09-16 14:46:51 -0400186}
187
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400188bool GetExtensionsEnabled(const egl::AttributeMap &attribs, bool webGLContext)
189{
190 // If the context is WebGL, extensions are disabled by default
191 EGLAttrib defaultValue = webGLContext ? EGL_FALSE : EGL_TRUE;
192 return (attribs.get(EGL_EXTENSIONS_ENABLED_ANGLE, defaultValue) == EGL_TRUE);
193}
194
Geoff Langf41a7152016-09-19 15:11:17 -0400195bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
196{
Jamie Madill4230d482018-09-14 10:14:45 -0400197 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
Geoff Langf41a7152016-09-19 15:11:17 -0400198}
199
Geoff Langfeb8c682017-02-13 16:07:35 -0500200bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
201{
202 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
203}
204
Geoff Langb433e872017-10-05 14:01:47 -0400205bool GetRobustResourceInit(const egl::AttributeMap &attribs)
206{
207 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
208}
209
Martin Radev9d901792016-07-15 15:58:58 +0300210std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
211{
212 std::string labelName;
213 if (label != nullptr)
214 {
215 size_t labelLength = length < 0 ? strlen(label) : length;
216 labelName = std::string(label, labelLength);
217 }
218 return labelName;
219}
220
221void GetObjectLabelBase(const std::string &objectLabel,
222 GLsizei bufSize,
223 GLsizei *length,
224 GLchar *label)
225{
226 size_t writeLength = objectLabel.length();
227 if (label != nullptr && bufSize > 0)
228 {
229 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
230 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
231 label[writeLength] = '\0';
232 }
233
234 if (length != nullptr)
235 {
236 *length = static_cast<GLsizei>(writeLength);
237 }
238}
239
Jamie Madill0f80ed82017-09-19 00:24:56 -0400240template <typename CapT, typename MaxT>
241void LimitCap(CapT *cap, MaxT maximum)
242{
243 *cap = std::min(*cap, static_cast<CapT>(maximum));
244}
245
Jamie Madill752d2202018-11-27 13:29:48 -0500246// The rest default to false.
247constexpr angle::PackedEnumMap<PrimitiveMode, bool, angle::EnumSize<PrimitiveMode>() + 1>
248 kValidBasicDrawModes = {{
249 {PrimitiveMode::Points, true},
250 {PrimitiveMode::Lines, true},
251 {PrimitiveMode::LineLoop, true},
252 {PrimitiveMode::LineStrip, true},
253 {PrimitiveMode::Triangles, true},
254 {PrimitiveMode::TriangleStrip, true},
255 {PrimitiveMode::TriangleFan, true},
256 }};
Tobin Ehlisd7890bc2018-06-29 11:57:22 -0600257
Jamie Madill6d32cef2018-08-14 02:34:28 -0400258enum SubjectIndexes : angle::SubjectIndex
259{
260 kTexture0SubjectIndex = 0,
Jamie Madille3e680c2018-12-03 17:49:08 -0500261 kTextureMaxSubjectIndex = kTexture0SubjectIndex + IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
Qin Jiajia3f01f532018-12-11 15:13:51 +0800262 kUniformBuffer0SubjectIndex = kTextureMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400263 kUniformBufferMaxSubjectIndex =
Jamie Madille3e680c2018-12-03 17:49:08 -0500264 kUniformBuffer0SubjectIndex + IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
Jamie Madille25b8002018-09-20 13:39:49 -0400265 kSampler0SubjectIndex = kUniformBufferMaxSubjectIndex,
Jamie Madille3e680c2018-12-03 17:49:08 -0500266 kSamplerMaxSubjectIndex = kSampler0SubjectIndex + IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
Jamie Madille25b8002018-09-20 13:39:49 -0400267 kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
Jamie Madill6d32cef2018-08-14 02:34:28 -0400268 kReadFramebufferSubjectIndex,
269 kDrawFramebufferSubjectIndex
270};
Geoff Langf6db0982015-08-25 13:04:00 -0400271} // anonymous namespace
272
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400273Context::Context(rx::EGLImplFactory *implFactory,
274 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400275 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500276 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400277 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500278 const egl::AttributeMap &attribs,
Brandon Jones2b0cdcc2018-05-02 08:02:50 -0700279 const egl::DisplayExtensions &displayExtensions,
280 const egl::ClientExtensions &clientExtensions)
Jamie Madill5b772312018-03-08 20:28:32 -0500281 : mState(reinterpret_cast<ContextID>(this),
282 shareContext ? &shareContext->mState : nullptr,
283 shareTextures,
284 GetClientVersion(attribs),
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500285 GetDebug(attribs),
286 GetBindGeneratesResource(attribs),
287 GetClientArraysEnabled(attribs),
288 GetRobustResourceInit(attribs),
289 memoryProgramCache != nullptr),
Jamie Madill5b772312018-03-08 20:28:32 -0500290 mSkipValidation(GetNoError(attribs)),
291 mDisplayTextureShareGroup(shareTextures != nullptr),
Jamie Madill0c667212019-01-01 14:40:36 -0500292 mErrors(this),
293 mImplementation(implFactory->createContext(mState, &mErrors, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400294 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400295 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400296 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500297 mClientType(EGL_OPENGL_ES_API),
298 mHasBeenCurrent(false),
299 mContextLost(false),
300 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700301 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500302 mResetStrategy(GetResetStrategy(attribs)),
303 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400304 mSurfacelessSupported(displayExtensions.surfacelessContext),
305 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400306 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
307 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500308 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400309 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400310 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400311 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
312 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
313 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400314 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800315 mZeroFilledBuffer(1000u),
316 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000317{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400318 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
319 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
320 {
321 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
322 }
Jamie Madille25b8002018-09-20 13:39:49 -0400323
324 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
325 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
326 {
327 mSamplerObserverBindings.emplace_back(this, samplerIndex);
328 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400329}
Jamie Madill5b772312018-03-08 20:28:32 -0500330
Geoff Lang33f11fb2018-05-07 13:42:47 -0400331void Context::initialize()
332{
333 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400334
Geoff Lang33f11fb2018-05-07 13:42:47 -0400335 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700336 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400337
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500338 mState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100339
Shannon Woods53a94a82014-06-24 15:20:36 -0400340 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400341
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000342 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400343 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000344 // and cube map texture state vectors respectively associated with them.
345 // In order that access to these initial textures not be lost, they are treated as texture
346 // objects all of whose names are 0.
347
Corentin Wallez99d492c2018-02-27 15:17:10 -0500348 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800349 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500350
Corentin Wallez99d492c2018-02-27 15:17:10 -0500351 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800352 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400353
Geoff Langeb66a6e2016-10-31 13:06:12 -0400354 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400355 {
356 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500357 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800358 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400359
Corentin Wallez99d492c2018-02-27 15:17:10 -0500360 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800361 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400362 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800363 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400364 {
365 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500366 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800367 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800368 }
369 if (getClientVersion() >= Version(3, 1))
370 {
Olli Etuahod310a432018-08-24 15:40:23 +0300371 Texture *zeroTexture2DMultisampleArray =
372 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
373 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800374
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500375 for (unsigned int i = 0; i < mState.mCaps.maxAtomicCounterBufferBindings; i++)
Jiajia Qin6eafb042016-12-27 17:04:07 +0800376 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800377 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800378 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800379
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500380 for (unsigned int i = 0; i < mState.mCaps.maxShaderStorageBufferBindings; i++)
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800381 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400382 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800383 }
Geoff Lang3b573612016-10-31 14:08:10 -0400384 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000385
Geoff Langb0f917f2017-12-05 13:41:54 -0500386 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400387 {
388 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500389 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800390 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400391 }
392
Geoff Langb0f917f2017-12-05 13:41:54 -0500393 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400394 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500395 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800396 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400397 }
398
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500399 mState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500400
Jamie Madill57a89722013-07-02 11:57:03 -0400401 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000402
Geoff Langeb66a6e2016-10-31 13:06:12 -0400403 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400404 {
405 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
406 // In the initial state, a default transform feedback object is bound and treated as
407 // a transform feedback object with a name of zero. That object is bound any time
408 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400409 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400410 }
Geoff Langc8058452014-02-03 12:04:11 -0500411
Corentin Wallez336129f2017-10-17 15:55:40 -0400412 for (auto type : angle::AllEnums<BufferBinding>())
413 {
414 bindBuffer(type, 0);
415 }
416
417 bindRenderbuffer(GL_RENDERBUFFER, 0);
418
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500419 for (unsigned int i = 0; i < mState.mCaps.maxUniformBufferBindings; i++)
Corentin Wallez336129f2017-10-17 15:55:40 -0400420 {
421 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
422 }
423
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700424 // Initialize GLES1 renderer if appropriate.
425 if (getClientVersion() < Version(2, 0))
426 {
427 mGLES1Renderer.reset(new GLES1Renderer());
428 }
429
Jamie Madillad9f24e2016-02-12 09:27:24 -0500430 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400431 mAllDirtyBits.set();
432
Geoff Lang9bf86f02018-07-26 11:46:34 -0400433 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
434 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madille3e680c2018-12-03 17:49:08 -0500435 mDrawDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400436 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400437 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400438
439 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
440 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madille3e680c2018-12-03 17:49:08 -0500441 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400442 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400443
Jamie Madillc67323a2017-11-02 23:11:41 -0400444 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500445 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500446 // No dirty objects.
447
448 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400449 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500450 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400451 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500452 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
453
454 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
455 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
456 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
457 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
458 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
459 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
460 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
461 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
462 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
463 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
464 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400465 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500466 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
467
468 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
469 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700470 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400471 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
472 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500473 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
474 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400475
Xinghua Cao10a4d432017-11-28 14:46:26 +0800476 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800477 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
478 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800479 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
480 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
481 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
482 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800483 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800484 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jamie Madille3e680c2018-12-03 17:49:08 -0500485 mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400486 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400487 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800488
Jamie Madill4f6592f2018-11-27 16:37:45 -0500489 ANGLE_CONTEXT_TRY(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000490}
491
Jamie Madill4928b7c2017-06-20 12:57:39 -0400492egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000493{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700494 if (mGLES1Renderer)
495 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500496 mGLES1Renderer->onDestroy(this, &mState);
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700497 }
498
Jamie Madille7b3fe22018-04-05 09:42:46 -0400499 ANGLE_TRY(releaseSurface(display));
500
Corentin Wallez80b24112015-08-25 16:41:57 -0400501 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000502 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400503 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000504 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400505 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000506
Corentin Wallez80b24112015-08-25 16:41:57 -0400507 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000508 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400509 if (query.second != nullptr)
510 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400511 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400512 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000513 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400514 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000515
Corentin Wallez80b24112015-08-25 16:41:57 -0400516 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400517 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400518 if (vertexArray.second)
519 {
520 vertexArray.second->onDestroy(this);
521 }
Jamie Madill57a89722013-07-02 11:57:03 -0400522 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400523 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400524
Corentin Wallez80b24112015-08-25 16:41:57 -0400525 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500526 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500527 if (transformFeedback.second != nullptr)
528 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500529 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500530 }
Geoff Langc8058452014-02-03 12:04:11 -0500531 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400532 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500533
Jamie Madill5b772312018-03-08 20:28:32 -0500534 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400535 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800536 if (zeroTexture.get() != nullptr)
537 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800538 zeroTexture.set(this, nullptr);
539 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400540 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000541
Jamie Madill2f348d22017-06-05 10:50:59 -0400542 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500543
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500544 mState.reset(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400545
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500546 mState.mBufferManager->release(this);
547 mState.mShaderProgramManager->release(this);
548 mState.mTextureManager->release(this);
549 mState.mRenderbufferManager->release(this);
550 mState.mSamplerManager->release(this);
551 mState.mSyncManager->release(this);
552 mState.mPathManager->release(this);
553 mState.mFramebufferManager->release(this);
554 mState.mProgramPipelineManager->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400555
jchen107ae70d82018-07-06 13:47:01 +0800556 mThreadPool.reset();
557
Jamie Madill76e471e2017-10-21 09:56:01 -0400558 mImplementation->onDestroy(this);
559
Jamie Madill4928b7c2017-06-20 12:57:39 -0400560 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000561}
562
Jamie Madillb980c562018-11-27 11:34:27 -0500563Context::~Context() {}
Jamie Madill70ee0f62017-02-06 16:04:20 -0500564
Geoff Lang75359662018-04-11 01:42:27 -0400565void Context::setLabel(EGLLabelKHR label)
566{
567 mLabel = label;
568}
569
570EGLLabelKHR Context::getLabel() const
571{
572 return mLabel;
573}
574
Jamie Madill4928b7c2017-06-20 12:57:39 -0400575egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000576{
Jamie Madill61e16b42017-06-19 11:13:23 -0400577 mCurrentDisplay = display;
578
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000579 if (!mHasBeenCurrent)
580 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400581 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000582 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500583 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400584 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000585
Corentin Wallezc295e512017-01-27 17:47:50 -0500586 int width = 0;
587 int height = 0;
588 if (surface != nullptr)
589 {
590 width = surface->getWidth();
591 height = surface->getHeight();
592 }
593
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500594 mState.setViewportParams(0, 0, width, height);
595 mState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000596
597 mHasBeenCurrent = true;
598 }
599
Jamie Madill1b94d432015-08-07 13:23:23 -0400600 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500601 mState.setAllDirtyBits();
602 mState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400603
Jamie Madill4928b7c2017-06-20 12:57:39 -0400604 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500605
606 Framebuffer *newDefault = nullptr;
607 if (surface != nullptr)
608 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400609 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500610 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400611 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500612 }
613 else
614 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400615 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500616 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000617
Corentin Wallez37c39792015-08-20 14:19:46 -0400618 // Update default framebuffer, the binding of the previous default
619 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400620 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500621 mState.mFramebufferManager->setDefaultFramebuffer(newDefault);
622 if (mState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400623 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400624 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400625 }
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500626 if (mState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400627 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400628 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400629 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400630 }
Ian Ewell292f0052016-02-04 10:37:32 -0500631
Jamie Madill32643ce2018-10-19 11:38:03 -0400632 // Notify the renderer of a context switch.
Jamie Madill7c985f52018-11-29 18:16:17 -0500633 return angle::ResultToEGL(mImplementation->onMakeCurrent(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000634}
635
Jamie Madill4928b7c2017-06-20 12:57:39 -0400636egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400637{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500638 gl::Framebuffer *defaultFramebuffer = mState.mFramebufferManager->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400639
Geoff Langbf7b95d2018-05-01 16:48:21 -0400640 // Remove the default framebuffer
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500641 if (mState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500642 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500643 mState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400644 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500645 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400646
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500647 if (mState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500648 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500649 mState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400650 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500651 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400652
653 if (defaultFramebuffer)
654 {
655 defaultFramebuffer->onDestroy(this);
656 delete defaultFramebuffer;
657 }
658
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500659 mState.mFramebufferManager->setDefaultFramebuffer(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500660
661 if (mCurrentSurface)
662 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400663 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500664 mCurrentSurface = nullptr;
665 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400666
667 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400668}
669
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000670GLuint Context::createBuffer()
671{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500672 return mState.mBufferManager->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000673}
674
675GLuint Context::createProgram()
676{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500677 return mState.mShaderProgramManager->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000678}
679
Jiawei Shao385b3e02018-03-21 09:43:28 +0800680GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000681{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500682 return mState.mShaderProgramManager->createShader(mImplementation.get(), mState.mLimitations,
683 type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000684}
685
686GLuint Context::createTexture()
687{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500688 return mState.mTextureManager->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000689}
690
691GLuint Context::createRenderbuffer()
692{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500693 return mState.mRenderbufferManager->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000694}
695
Jamie Madill13951342018-09-30 15:24:28 -0400696void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
697{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500698 ANGLE_CONTEXT_TRY(mState.mPathManager->createPaths(this, range, createdOut));
Jamie Madill13951342018-09-30 15:24:28 -0400699}
700
Brandon Jones59770802018-04-02 13:18:42 -0700701GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300702{
Jamie Madill13951342018-09-30 15:24:28 -0400703 GLuint created = 0;
704 tryGenPaths(range, &created);
705 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300706}
707
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000708// Returns an unused framebuffer name
709GLuint Context::createFramebuffer()
710{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500711 return mState.mFramebufferManager->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000712}
713
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500714void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000715{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500716 for (int i = 0; i < n; i++)
717 {
718 GLuint handle = mFenceNVHandleAllocator.allocate();
719 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
720 fences[i] = handle;
721 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000722}
723
Yunchao Hea336b902017-08-02 16:05:21 +0800724GLuint Context::createProgramPipeline()
725{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500726 return mState.mProgramPipelineManager->createProgramPipeline();
Yunchao Hea336b902017-08-02 16:05:21 +0800727}
728
Jiawei Shao385b3e02018-03-21 09:43:28 +0800729GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800730{
731 UNIMPLEMENTED();
732 return 0u;
733}
734
James Darpinian4d9d4832018-03-13 12:43:28 -0700735void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000736{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500737 Buffer *buffer = mState.mBufferManager->getBuffer(bufferName);
James Darpinian4d9d4832018-03-13 12:43:28 -0700738 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000739 {
740 detachBuffer(buffer);
741 }
Jamie Madill893ab082014-05-16 16:56:10 -0400742
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500743 mState.mBufferManager->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000744}
745
746void Context::deleteShader(GLuint shader)
747{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500748 mState.mShaderProgramManager->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000749}
750
751void Context::deleteProgram(GLuint program)
752{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500753 mState.mShaderProgramManager->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000754}
755
756void Context::deleteTexture(GLuint texture)
757{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500758 if (mState.mTextureManager->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000759 {
760 detachTexture(texture);
761 }
762
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500763 mState.mTextureManager->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000764}
765
766void Context::deleteRenderbuffer(GLuint renderbuffer)
767{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500768 if (mState.mRenderbufferManager->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000769 {
770 detachRenderbuffer(renderbuffer);
771 }
Jamie Madill893ab082014-05-16 16:56:10 -0400772
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500773 mState.mRenderbufferManager->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000774}
775
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400776void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400777{
778 // The spec specifies the underlying Fence object is not deleted until all current
779 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
780 // and since our API is currently designed for being called from a single thread, we can delete
781 // the fence immediately.
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500782 mState.mSyncManager->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400783}
784
Yunchao Hea336b902017-08-02 16:05:21 +0800785void Context::deleteProgramPipeline(GLuint pipeline)
786{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500787 if (mState.mProgramPipelineManager->getProgramPipeline(pipeline))
Yunchao Hea336b902017-08-02 16:05:21 +0800788 {
789 detachProgramPipeline(pipeline);
790 }
791
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500792 mState.mProgramPipelineManager->deleteObject(this, pipeline);
Yunchao Hea336b902017-08-02 16:05:21 +0800793}
794
Sami Väisänene45e53b2016-05-25 10:36:04 +0300795void Context::deletePaths(GLuint first, GLsizei range)
796{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500797 mState.mPathManager->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300798}
799
Brandon Jones59770802018-04-02 13:18:42 -0700800bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300801{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500802 const auto *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300803 if (pathObj == nullptr)
804 return false;
805
806 return pathObj->hasPathData();
807}
808
Brandon Jones59770802018-04-02 13:18:42 -0700809bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300810{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500811 return mState.mPathManager->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300812}
813
Brandon Jones59770802018-04-02 13:18:42 -0700814void Context::pathCommands(GLuint path,
815 GLsizei numCommands,
816 const GLubyte *commands,
817 GLsizei numCoords,
818 GLenum coordType,
819 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300820{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500821 auto *pathObject = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300822
Jamie Madill4f6592f2018-11-27 16:37:45 -0500823 ANGLE_CONTEXT_TRY(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300824}
825
Jamie Madill007530e2017-12-28 14:27:04 -0500826void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300827{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500828 Path *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300829
830 switch (pname)
831 {
832 case GL_PATH_STROKE_WIDTH_CHROMIUM:
833 pathObj->setStrokeWidth(value);
834 break;
835 case GL_PATH_END_CAPS_CHROMIUM:
836 pathObj->setEndCaps(static_cast<GLenum>(value));
837 break;
838 case GL_PATH_JOIN_STYLE_CHROMIUM:
839 pathObj->setJoinStyle(static_cast<GLenum>(value));
840 break;
841 case GL_PATH_MITER_LIMIT_CHROMIUM:
842 pathObj->setMiterLimit(value);
843 break;
844 case GL_PATH_STROKE_BOUND_CHROMIUM:
845 pathObj->setStrokeBound(value);
846 break;
847 default:
848 UNREACHABLE();
849 break;
850 }
851}
852
Jamie Madill007530e2017-12-28 14:27:04 -0500853void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300854{
Jamie Madill007530e2017-12-28 14:27:04 -0500855 // TODO(jmadill): Should use proper clamping/casting.
856 pathParameterf(path, pname, static_cast<GLfloat>(value));
857}
858
859void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
860{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500861 const Path *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300862
863 switch (pname)
864 {
865 case GL_PATH_STROKE_WIDTH_CHROMIUM:
866 *value = pathObj->getStrokeWidth();
867 break;
868 case GL_PATH_END_CAPS_CHROMIUM:
869 *value = static_cast<GLfloat>(pathObj->getEndCaps());
870 break;
871 case GL_PATH_JOIN_STYLE_CHROMIUM:
872 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
873 break;
874 case GL_PATH_MITER_LIMIT_CHROMIUM:
875 *value = pathObj->getMiterLimit();
876 break;
877 case GL_PATH_STROKE_BOUND_CHROMIUM:
878 *value = pathObj->getStrokeBound();
879 break;
880 default:
881 UNREACHABLE();
882 break;
883 }
884}
885
Jamie Madill007530e2017-12-28 14:27:04 -0500886void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
887{
888 GLfloat val = 0.0f;
889 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
890 if (value)
891 *value = static_cast<GLint>(val);
892}
893
Brandon Jones59770802018-04-02 13:18:42 -0700894void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300895{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500896 mState.setPathStencilFunc(func, ref, mask);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300897}
898
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000899void Context::deleteFramebuffer(GLuint framebuffer)
900{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500901 if (mState.mFramebufferManager->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000902 {
903 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000904 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500905
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500906 mState.mFramebufferManager->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000907}
908
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500909void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000910{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500911 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000912 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500913 GLuint fence = fences[i];
914
915 FenceNV *fenceObject = nullptr;
916 if (mFenceNVMap.erase(fence, &fenceObject))
917 {
918 mFenceNVHandleAllocator.release(fence);
919 delete fenceObject;
920 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000921 }
922}
923
Geoff Lang70d0f492015-12-10 17:45:46 -0500924Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000925{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500926 return mState.mBufferManager->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000927}
928
Geoff Lang70d0f492015-12-10 17:45:46 -0500929Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000930{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500931 return mState.mRenderbufferManager->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000932}
933
Jamie Madill70b5bb02017-08-28 13:32:37 -0400934Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400935{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500936 return mState.mSyncManager->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400937}
938
Jamie Madill57a89722013-07-02 11:57:03 -0400939VertexArray *Context::getVertexArray(GLuint handle) const
940{
Jamie Madill96a483b2017-06-27 16:49:21 -0400941 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400942}
943
Jamie Madilldc356042013-07-19 16:36:57 -0400944Sampler *Context::getSampler(GLuint handle) const
945{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500946 return mState.mSamplerManager->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400947}
948
Geoff Langc8058452014-02-03 12:04:11 -0500949TransformFeedback *Context::getTransformFeedback(GLuint handle) const
950{
Jamie Madill96a483b2017-06-27 16:49:21 -0400951 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500952}
953
Yunchao Hea336b902017-08-02 16:05:21 +0800954ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
955{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500956 return mState.mProgramPipelineManager->getProgramPipeline(handle);
Yunchao Hea336b902017-08-02 16:05:21 +0800957}
958
Geoff Lang75359662018-04-11 01:42:27 -0400959gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500960{
961 switch (identifier)
962 {
963 case GL_BUFFER:
964 return getBuffer(name);
965 case GL_SHADER:
966 return getShader(name);
967 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -0400968 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -0500969 case GL_VERTEX_ARRAY:
970 return getVertexArray(name);
971 case GL_QUERY:
972 return getQuery(name);
973 case GL_TRANSFORM_FEEDBACK:
974 return getTransformFeedback(name);
975 case GL_SAMPLER:
976 return getSampler(name);
977 case GL_TEXTURE:
978 return getTexture(name);
979 case GL_RENDERBUFFER:
980 return getRenderbuffer(name);
981 case GL_FRAMEBUFFER:
982 return getFramebuffer(name);
983 default:
984 UNREACHABLE();
985 return nullptr;
986 }
987}
988
Geoff Lang75359662018-04-11 01:42:27 -0400989gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500990{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400991 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500992}
993
Martin Radev9d901792016-07-15 15:58:58 +0300994void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
995{
Geoff Lang75359662018-04-11 01:42:27 -0400996 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +0300997 ASSERT(object != nullptr);
998
999 std::string labelName = GetObjectLabelFromPointer(length, label);
Jamie Madille90d4ee2018-11-28 14:04:00 -05001000 object->setLabel(this, labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001001
1002 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1003 // specified object is active until we do this.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001004 mState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001005}
1006
1007void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1008{
Geoff Lang75359662018-04-11 01:42:27 -04001009 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001010 ASSERT(object != nullptr);
1011
1012 std::string labelName = GetObjectLabelFromPointer(length, label);
Jamie Madille90d4ee2018-11-28 14:04:00 -05001013 object->setLabel(this, labelName);
Martin Radev9d901792016-07-15 15:58:58 +03001014}
1015
1016void Context::getObjectLabel(GLenum identifier,
1017 GLuint name,
1018 GLsizei bufSize,
1019 GLsizei *length,
1020 GLchar *label) const
1021{
Geoff Lang75359662018-04-11 01:42:27 -04001022 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001023 ASSERT(object != nullptr);
1024
1025 const std::string &objectLabel = object->getLabel();
1026 GetObjectLabelBase(objectLabel, bufSize, length, label);
1027}
1028
1029void Context::getObjectPtrLabel(const void *ptr,
1030 GLsizei bufSize,
1031 GLsizei *length,
1032 GLchar *label) const
1033{
Geoff Lang75359662018-04-11 01:42:27 -04001034 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001035 ASSERT(object != nullptr);
1036
1037 const std::string &objectLabel = object->getLabel();
1038 GetObjectLabelBase(objectLabel, bufSize, length, label);
1039}
1040
Jamie Madilldc356042013-07-19 16:36:57 -04001041bool Context::isSampler(GLuint samplerName) const
1042{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001043 return mState.mSamplerManager->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001044}
1045
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001046void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001047{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001048 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001049
Jamie Madilldedd7b92014-11-05 16:30:36 -05001050 if (handle == 0)
1051 {
1052 texture = mZeroTextures[target].get();
1053 }
1054 else
1055 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001056 texture =
1057 mState.mTextureManager->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001058 }
1059
1060 ASSERT(texture);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001061 mState.setSamplerTexture(this, target, texture);
Jamie Madilld84b6732018-09-06 15:54:35 -04001062 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001063}
1064
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001065void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001066{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001067 Framebuffer *framebuffer = mState.mFramebufferManager->checkFramebufferAllocation(
1068 mImplementation.get(), mState.mCaps, framebufferHandle);
1069 mState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001070 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001071}
1072
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001073void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001074{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001075 Framebuffer *framebuffer = mState.mFramebufferManager->checkFramebufferAllocation(
1076 mImplementation.get(), mState.mCaps, framebufferHandle);
1077 mState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001078 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001079 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001080}
1081
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001082void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001083{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001084 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001085 mState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001086 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001087 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001088}
1089
Shao80957d92017-02-20 21:25:59 +08001090void Context::bindVertexBuffer(GLuint bindingIndex,
1091 GLuint bufferHandle,
1092 GLintptr offset,
1093 GLsizei stride)
1094{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001095 Buffer *buffer =
1096 mState.mBufferManager->checkBufferAllocation(mImplementation.get(), bufferHandle);
1097 mState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001098 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001099}
1100
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001101void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001102{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001103 ASSERT(textureUnit < mState.mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001104 Sampler *sampler =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001105 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), samplerHandle);
1106 mState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001107 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001108}
1109
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001110void Context::bindImageTexture(GLuint unit,
1111 GLuint texture,
1112 GLint level,
1113 GLboolean layered,
1114 GLint layer,
1115 GLenum access,
1116 GLenum format)
1117{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001118 Texture *tex = mState.mTextureManager->getTexture(texture);
1119 mState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001120}
1121
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001122void Context::useProgram(GLuint program)
1123{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001124 ANGLE_CONTEXT_TRY(mState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001125 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001126}
1127
Jiajia Qin5451d532017-11-16 17:16:34 +08001128void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1129{
1130 UNIMPLEMENTED();
1131}
1132
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001133void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001134{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001135 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001136 TransformFeedback *transformFeedback =
1137 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001138 mState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001139}
1140
Yunchao Hea336b902017-08-02 16:05:21 +08001141void Context::bindProgramPipeline(GLuint pipelineHandle)
1142{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001143 ProgramPipeline *pipeline = mState.mProgramPipelineManager->checkProgramPipelineAllocation(
1144 mImplementation.get(), pipelineHandle);
1145 mState.setProgramPipelineBinding(this, pipeline);
Yunchao Hea336b902017-08-02 16:05:21 +08001146}
1147
Corentin Wallezad3ae902018-03-09 13:40:42 -05001148void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001149{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001150 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001151 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001152
Geoff Lang5aad9672014-09-08 11:10:42 -04001153 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001154 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001155
1156 // set query as active for specified target only if begin succeeded
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001157 mState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001158 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001159}
1160
Corentin Wallezad3ae902018-03-09 13:40:42 -05001161void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001162{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001163 Query *queryObject = mState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001164 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001165
Jamie Madill4f6592f2018-11-27 16:37:45 -05001166 // Intentionally don't call try here. We don't want an early return.
1167 (void)(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001168
Geoff Lang5aad9672014-09-08 11:10:42 -04001169 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001170 mState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001171 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001172}
1173
Corentin Wallezad3ae902018-03-09 13:40:42 -05001174void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001175{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001176 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001177
1178 Query *queryObject = getQuery(id, true, target);
1179 ASSERT(queryObject);
1180
Jamie Madill4f6592f2018-11-27 16:37:45 -05001181 ANGLE_CONTEXT_TRY(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001182}
1183
Corentin Wallezad3ae902018-03-09 13:40:42 -05001184void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001185{
1186 switch (pname)
1187 {
1188 case GL_CURRENT_QUERY_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001189 params[0] = mState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001190 break;
1191 case GL_QUERY_COUNTER_BITS_EXT:
1192 switch (target)
1193 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001194 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001195 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1196 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001197 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001198 params[0] = getExtensions().queryCounterBitsTimestamp;
1199 break;
1200 default:
1201 UNREACHABLE();
1202 params[0] = 0;
1203 break;
1204 }
1205 break;
1206 default:
1207 UNREACHABLE();
1208 return;
1209 }
1210}
1211
Corentin Wallezad3ae902018-03-09 13:40:42 -05001212void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001213 GLenum pname,
1214 GLsizei bufSize,
1215 GLsizei *length,
1216 GLint *params)
1217{
1218 getQueryiv(target, pname, params);
1219}
1220
Geoff Lang2186c382016-10-14 10:54:54 -04001221void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001222{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001223 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001224}
1225
Brandon Jones59770802018-04-02 13:18:42 -07001226void Context::getQueryObjectivRobust(GLuint id,
1227 GLenum pname,
1228 GLsizei bufSize,
1229 GLsizei *length,
1230 GLint *params)
1231{
1232 getQueryObjectiv(id, pname, params);
1233}
1234
Geoff Lang2186c382016-10-14 10:54:54 -04001235void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001236{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001237 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001238}
1239
Brandon Jones59770802018-04-02 13:18:42 -07001240void Context::getQueryObjectuivRobust(GLuint id,
1241 GLenum pname,
1242 GLsizei bufSize,
1243 GLsizei *length,
1244 GLuint *params)
1245{
1246 getQueryObjectuiv(id, pname, params);
1247}
1248
Geoff Lang2186c382016-10-14 10:54:54 -04001249void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001250{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001251 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001252}
1253
Brandon Jones59770802018-04-02 13:18:42 -07001254void Context::getQueryObjecti64vRobust(GLuint id,
1255 GLenum pname,
1256 GLsizei bufSize,
1257 GLsizei *length,
1258 GLint64 *params)
1259{
1260 getQueryObjecti64v(id, pname, params);
1261}
1262
Geoff Lang2186c382016-10-14 10:54:54 -04001263void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001264{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001265 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001266}
1267
Brandon Jones59770802018-04-02 13:18:42 -07001268void Context::getQueryObjectui64vRobust(GLuint id,
1269 GLenum pname,
1270 GLsizei bufSize,
1271 GLsizei *length,
1272 GLuint64 *params)
1273{
1274 getQueryObjectui64v(id, pname, params);
1275}
1276
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001277Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001278{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001279 return mState.mFramebufferManager->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001280}
1281
Jamie Madill2f348d22017-06-05 10:50:59 -04001282FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001283{
Jamie Madill96a483b2017-06-27 16:49:21 -04001284 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001285}
1286
Corentin Wallezad3ae902018-03-09 13:40:42 -05001287Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001288{
Jamie Madill96a483b2017-06-27 16:49:21 -04001289 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001290 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001291 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001292 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001293
1294 Query *query = mQueryMap.query(handle);
1295 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001296 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001297 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001298 query = new Query(mImplementation->createQuery(type), handle);
1299 query->addRef();
1300 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001301 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001302 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001303}
1304
Geoff Lang70d0f492015-12-10 17:45:46 -05001305Query *Context::getQuery(GLuint handle) const
1306{
Jamie Madill96a483b2017-06-27 16:49:21 -04001307 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001308}
1309
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001310Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001311{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001312 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001313 return mState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001314}
1315
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001316Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001317{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001318 return mState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001319}
1320
Geoff Lang492a7e42014-11-05 13:27:06 -05001321Compiler *Context::getCompiler() const
1322{
Jamie Madill2f348d22017-06-05 10:50:59 -04001323 if (mCompiler.get() == nullptr)
1324 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001325 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001326 }
1327 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001328}
1329
Jamie Madillc1d770e2017-04-13 17:31:24 -04001330void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331{
1332 switch (pname)
1333 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001334 case GL_SHADER_COMPILER:
1335 *params = GL_TRUE;
1336 break;
1337 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1338 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1339 break;
1340 default:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001341 mState.getBooleanv(pname, params);
Jamie Madill231c7f52017-04-26 13:45:37 -04001342 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001343 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001344}
1345
Jamie Madillc1d770e2017-04-13 17:31:24 -04001346void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001347{
Shannon Woods53a94a82014-06-24 15:20:36 -04001348 // Queries about context capabilities and maximums are answered by Context.
1349 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001350 switch (pname)
1351 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001352 case GL_ALIASED_LINE_WIDTH_RANGE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001353 params[0] = mState.mCaps.minAliasedLineWidth;
1354 params[1] = mState.mCaps.maxAliasedLineWidth;
Jamie Madill231c7f52017-04-26 13:45:37 -04001355 break;
1356 case GL_ALIASED_POINT_SIZE_RANGE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001357 params[0] = mState.mCaps.minAliasedPointSize;
1358 params[1] = mState.mCaps.maxAliasedPointSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001359 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001360 case GL_SMOOTH_POINT_SIZE_RANGE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001361 params[0] = mState.mCaps.minSmoothPointSize;
1362 params[1] = mState.mCaps.maxSmoothPointSize;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001363 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001364 case GL_SMOOTH_LINE_WIDTH_RANGE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001365 params[0] = mState.mCaps.minSmoothLineWidth;
1366 params[1] = mState.mCaps.maxSmoothLineWidth;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001367 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001368 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001369 ASSERT(mState.mExtensions.textureFilterAnisotropic);
1370 *params = mState.mExtensions.maxTextureAnisotropy;
Jamie Madill231c7f52017-04-26 13:45:37 -04001371 break;
1372 case GL_MAX_TEXTURE_LOD_BIAS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001373 *params = mState.mCaps.maxLODBias;
Jamie Madill231c7f52017-04-26 13:45:37 -04001374 break;
1375
1376 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1377 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1378 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001379 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1380 // GLES1 constants for modelview/projection matrix.
1381 if (getClientVersion() < Version(2, 0))
1382 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001383 mState.getFloatv(pname, params);
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001384 }
1385 else
1386 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001387 ASSERT(mState.mExtensions.pathRendering);
1388 const GLfloat *m = mState.getPathRenderingMatrix(pname);
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001389 memcpy(params, m, 16 * sizeof(GLfloat));
1390 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001391 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001392 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001393
Jamie Madill231c7f52017-04-26 13:45:37 -04001394 default:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001395 mState.getFloatv(pname, params);
Jamie Madill231c7f52017-04-26 13:45:37 -04001396 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001397 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001398}
1399
Jamie Madillc1d770e2017-04-13 17:31:24 -04001400void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001401{
Shannon Woods53a94a82014-06-24 15:20:36 -04001402 // Queries about context capabilities and maximums are answered by Context.
1403 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001404
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001405 switch (pname)
1406 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001407 case GL_MAX_VERTEX_ATTRIBS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001408 *params = mState.mCaps.maxVertexAttributes;
Jamie Madill231c7f52017-04-26 13:45:37 -04001409 break;
1410 case GL_MAX_VERTEX_UNIFORM_VECTORS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001411 *params = mState.mCaps.maxVertexUniformVectors;
Jamie Madill231c7f52017-04-26 13:45:37 -04001412 break;
1413 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001414 *params = mState.mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001415 break;
1416 case GL_MAX_VARYING_VECTORS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001417 *params = mState.mCaps.maxVaryingVectors;
Jamie Madill231c7f52017-04-26 13:45:37 -04001418 break;
1419 case GL_MAX_VARYING_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001420 *params = mState.mCaps.maxVertexOutputComponents;
Jamie Madill231c7f52017-04-26 13:45:37 -04001421 break;
1422 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001423 *params = mState.mCaps.maxCombinedTextureImageUnits;
Jamie Madill231c7f52017-04-26 13:45:37 -04001424 break;
1425 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001426 *params = mState.mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001427 break;
1428 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001429 *params = mState.mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001430 break;
1431 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001432 *params = mState.mCaps.maxFragmentUniformVectors;
Jamie Madill231c7f52017-04-26 13:45:37 -04001433 break;
1434 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001435 *params = mState.mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001436 break;
1437 case GL_MAX_RENDERBUFFER_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001438 *params = mState.mCaps.maxRenderbufferSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001439 break;
1440 case GL_MAX_COLOR_ATTACHMENTS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001441 *params = mState.mCaps.maxColorAttachments;
Jamie Madill231c7f52017-04-26 13:45:37 -04001442 break;
1443 case GL_MAX_DRAW_BUFFERS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001444 *params = mState.mCaps.maxDrawBuffers;
Jamie Madill231c7f52017-04-26 13:45:37 -04001445 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001446 case GL_SUBPIXEL_BITS:
1447 *params = 4;
1448 break;
1449 case GL_MAX_TEXTURE_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001450 *params = mState.mCaps.max2DTextureSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001452 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001453 *params = mState.mCaps.maxRectangleTextureSize;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001454 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001455 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001456 *params = mState.mCaps.maxCubeMapTextureSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001457 break;
1458 case GL_MAX_3D_TEXTURE_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001459 *params = mState.mCaps.max3DTextureSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001460 break;
1461 case GL_MAX_ARRAY_TEXTURE_LAYERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001462 *params = mState.mCaps.maxArrayTextureLayers;
Jamie Madill231c7f52017-04-26 13:45:37 -04001463 break;
1464 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001465 *params = mState.mCaps.uniformBufferOffsetAlignment;
Jamie Madill231c7f52017-04-26 13:45:37 -04001466 break;
1467 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001468 *params = mState.mCaps.maxUniformBufferBindings;
Jamie Madill231c7f52017-04-26 13:45:37 -04001469 break;
1470 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001471 *params = mState.mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001472 break;
1473 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001474 *params = mState.mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001475 break;
1476 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001477 *params = mState.mCaps.maxCombinedTextureImageUnits;
Jamie Madill231c7f52017-04-26 13:45:37 -04001478 break;
1479 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001480 *params = mState.mCaps.maxVertexOutputComponents;
Jamie Madill231c7f52017-04-26 13:45:37 -04001481 break;
1482 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001483 *params = mState.mCaps.maxFragmentInputComponents;
Jamie Madill231c7f52017-04-26 13:45:37 -04001484 break;
1485 case GL_MIN_PROGRAM_TEXEL_OFFSET:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001486 *params = mState.mCaps.minProgramTexelOffset;
Jamie Madill231c7f52017-04-26 13:45:37 -04001487 break;
1488 case GL_MAX_PROGRAM_TEXEL_OFFSET:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001489 *params = mState.mCaps.maxProgramTexelOffset;
Jamie Madill231c7f52017-04-26 13:45:37 -04001490 break;
1491 case GL_MAJOR_VERSION:
1492 *params = getClientVersion().major;
1493 break;
1494 case GL_MINOR_VERSION:
1495 *params = getClientVersion().minor;
1496 break;
1497 case GL_MAX_ELEMENTS_INDICES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001498 *params = mState.mCaps.maxElementsIndices;
Jamie Madill231c7f52017-04-26 13:45:37 -04001499 break;
1500 case GL_MAX_ELEMENTS_VERTICES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001501 *params = mState.mCaps.maxElementsVertices;
Jamie Madill231c7f52017-04-26 13:45:37 -04001502 break;
1503 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001504 *params = mState.mCaps.maxTransformFeedbackInterleavedComponents;
Jamie Madill231c7f52017-04-26 13:45:37 -04001505 break;
1506 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001507 *params = mState.mCaps.maxTransformFeedbackSeparateAttributes;
Jamie Madill231c7f52017-04-26 13:45:37 -04001508 break;
1509 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001510 *params = mState.mCaps.maxTransformFeedbackSeparateComponents;
Jamie Madill231c7f52017-04-26 13:45:37 -04001511 break;
1512 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001513 *params = static_cast<GLint>(mState.mCaps.compressedTextureFormats.size());
Jamie Madill231c7f52017-04-26 13:45:37 -04001514 break;
1515 case GL_MAX_SAMPLES_ANGLE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001516 *params = mState.mCaps.maxSamples;
Jamie Madill231c7f52017-04-26 13:45:37 -04001517 break;
1518 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001519 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001520 params[0] = mState.mCaps.maxViewportWidth;
1521 params[1] = mState.mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001522 }
1523 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001524 case GL_COMPRESSED_TEXTURE_FORMATS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001525 std::copy(mState.mCaps.compressedTextureFormats.begin(),
1526 mState.mCaps.compressedTextureFormats.end(), params);
Jamie Madill231c7f52017-04-26 13:45:37 -04001527 break;
1528 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1529 *params = mResetStrategy;
1530 break;
1531 case GL_NUM_SHADER_BINARY_FORMATS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001532 *params = static_cast<GLint>(mState.mCaps.shaderBinaryFormats.size());
Jamie Madill231c7f52017-04-26 13:45:37 -04001533 break;
1534 case GL_SHADER_BINARY_FORMATS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001535 std::copy(mState.mCaps.shaderBinaryFormats.begin(),
1536 mState.mCaps.shaderBinaryFormats.end(), params);
Jamie Madill231c7f52017-04-26 13:45:37 -04001537 break;
1538 case GL_NUM_PROGRAM_BINARY_FORMATS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001539 *params = static_cast<GLint>(mState.mCaps.programBinaryFormats.size());
Jamie Madill231c7f52017-04-26 13:45:37 -04001540 break;
1541 case GL_PROGRAM_BINARY_FORMATS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001542 std::copy(mState.mCaps.programBinaryFormats.begin(),
1543 mState.mCaps.programBinaryFormats.end(), params);
Jamie Madill231c7f52017-04-26 13:45:37 -04001544 break;
1545 case GL_NUM_EXTENSIONS:
1546 *params = static_cast<GLint>(mExtensionStrings.size());
1547 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001548
Geoff Lang38f24ee2018-10-01 13:04:59 -04001549 // GL_ANGLE_request_extension
1550 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1551 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1552 break;
1553
Jamie Madill231c7f52017-04-26 13:45:37 -04001554 // GL_KHR_debug
1555 case GL_MAX_DEBUG_MESSAGE_LENGTH:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001556 *params = mState.mExtensions.maxDebugMessageLength;
Jamie Madill231c7f52017-04-26 13:45:37 -04001557 break;
1558 case GL_MAX_DEBUG_LOGGED_MESSAGES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001559 *params = mState.mExtensions.maxDebugLoggedMessages;
Jamie Madill231c7f52017-04-26 13:45:37 -04001560 break;
1561 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001562 *params = mState.mExtensions.maxDebugGroupStackDepth;
Jamie Madill231c7f52017-04-26 13:45:37 -04001563 break;
1564 case GL_MAX_LABEL_LENGTH:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001565 *params = mState.mExtensions.maxLabelLength;
Jamie Madill231c7f52017-04-26 13:45:37 -04001566 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001567
Martin Radeve5285d22017-07-14 16:23:53 +03001568 // GL_ANGLE_multiview
1569 case GL_MAX_VIEWS_ANGLE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001570 *params = mState.mExtensions.maxViews;
Martin Radeve5285d22017-07-14 16:23:53 +03001571 break;
1572
Jamie Madill231c7f52017-04-26 13:45:37 -04001573 // GL_EXT_disjoint_timer_query
1574 case GL_GPU_DISJOINT_EXT:
1575 *params = mImplementation->getGPUDisjoint();
1576 break;
1577 case GL_MAX_FRAMEBUFFER_WIDTH:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001578 *params = mState.mCaps.maxFramebufferWidth;
Jamie Madill231c7f52017-04-26 13:45:37 -04001579 break;
1580 case GL_MAX_FRAMEBUFFER_HEIGHT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001581 *params = mState.mCaps.maxFramebufferHeight;
Jamie Madill231c7f52017-04-26 13:45:37 -04001582 break;
1583 case GL_MAX_FRAMEBUFFER_SAMPLES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001584 *params = mState.mCaps.maxFramebufferSamples;
Jamie Madill231c7f52017-04-26 13:45:37 -04001585 break;
1586 case GL_MAX_SAMPLE_MASK_WORDS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001587 *params = mState.mCaps.maxSampleMaskWords;
Jamie Madill231c7f52017-04-26 13:45:37 -04001588 break;
1589 case GL_MAX_COLOR_TEXTURE_SAMPLES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001590 *params = mState.mCaps.maxColorTextureSamples;
Jamie Madill231c7f52017-04-26 13:45:37 -04001591 break;
1592 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001593 *params = mState.mCaps.maxDepthTextureSamples;
Jamie Madill231c7f52017-04-26 13:45:37 -04001594 break;
1595 case GL_MAX_INTEGER_SAMPLES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001596 *params = mState.mCaps.maxIntegerSamples;
Jamie Madill231c7f52017-04-26 13:45:37 -04001597 break;
1598 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001599 *params = mState.mCaps.maxVertexAttribRelativeOffset;
Jamie Madill231c7f52017-04-26 13:45:37 -04001600 break;
1601 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001602 *params = mState.mCaps.maxVertexAttribBindings;
Jamie Madill231c7f52017-04-26 13:45:37 -04001603 break;
1604 case GL_MAX_VERTEX_ATTRIB_STRIDE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001605 *params = mState.mCaps.maxVertexAttribStride;
Jamie Madill231c7f52017-04-26 13:45:37 -04001606 break;
1607 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001608 *params = mState.mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001609 break;
1610 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001611 *params = mState.mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001612 break;
1613 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001614 *params = mState.mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001615 break;
1616 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001617 *params = mState.mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001618 break;
1619 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001620 *params = mState.mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001621 break;
1622 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001623 *params = mState.mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001624 break;
1625 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001626 *params = mState.mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001627 break;
1628 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001629 *params = mState.mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001630 break;
1631 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001632 *params = mState.mCaps.minProgramTextureGatherOffset;
Jamie Madill231c7f52017-04-26 13:45:37 -04001633 break;
1634 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001635 *params = mState.mCaps.maxProgramTextureGatherOffset;
Jamie Madill231c7f52017-04-26 13:45:37 -04001636 break;
1637 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001638 *params = mState.mCaps.maxComputeWorkGroupInvocations;
Jamie Madill231c7f52017-04-26 13:45:37 -04001639 break;
1640 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001641 *params = mState.mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001642 break;
1643 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001644 *params = mState.mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001645 break;
1646 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001647 *params = mState.mCaps.maxComputeSharedMemorySize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001648 break;
1649 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001650 *params = mState.mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001651 break;
1652 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001653 *params = mState.mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001654 break;
1655 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001656 *params = mState.mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001657 break;
1658 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001659 *params = mState.mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001660 break;
1661 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001662 *params = static_cast<GLint>(
1663 mState.mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001664 break;
1665 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001666 *params = mState.mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001667 break;
1668 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001669 *params = mState.mCaps.maxCombinedShaderOutputResources;
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
1671 case GL_MAX_UNIFORM_LOCATIONS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001672 *params = mState.mCaps.maxUniformLocations;
Jamie Madill231c7f52017-04-26 13:45:37 -04001673 break;
1674 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001675 *params = mState.mCaps.maxAtomicCounterBufferBindings;
Jamie Madill231c7f52017-04-26 13:45:37 -04001676 break;
1677 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001678 *params = mState.mCaps.maxAtomicCounterBufferSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001679 break;
1680 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001681 *params = mState.mCaps.maxCombinedAtomicCounterBuffers;
Jamie Madill231c7f52017-04-26 13:45:37 -04001682 break;
1683 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001684 *params = mState.mCaps.maxCombinedAtomicCounters;
Jamie Madill231c7f52017-04-26 13:45:37 -04001685 break;
1686 case GL_MAX_IMAGE_UNITS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001687 *params = mState.mCaps.maxImageUnits;
Jamie Madill231c7f52017-04-26 13:45:37 -04001688 break;
1689 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001690 *params = mState.mCaps.maxCombinedImageUniforms;
Jamie Madill231c7f52017-04-26 13:45:37 -04001691 break;
1692 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001693 *params = mState.mCaps.maxShaderStorageBufferBindings;
Jamie Madill231c7f52017-04-26 13:45:37 -04001694 break;
1695 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001696 *params = mState.mCaps.maxCombinedShaderStorageBlocks;
Jamie Madill231c7f52017-04-26 13:45:37 -04001697 break;
1698 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001699 *params = mState.mCaps.shaderStorageBufferOffsetAlignment;
Jamie Madill231c7f52017-04-26 13:45:37 -04001700 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001701
1702 // GL_EXT_geometry_shader
1703 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001704 *params = mState.mCaps.maxFramebufferLayers;
Jiawei Shao361df072017-11-22 09:33:59 +08001705 break;
1706 case GL_LAYER_PROVOKING_VERTEX_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001707 *params = mState.mCaps.layerProvokingVertex;
Jiawei Shao361df072017-11-22 09:33:59 +08001708 break;
1709 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001710 *params = mState.mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001711 break;
1712 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001713 *params = mState.mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001714 break;
1715 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001716 *params = static_cast<GLint>(
1717 mState.mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001718 break;
1719 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001720 *params = mState.mCaps.maxGeometryInputComponents;
Jiawei Shao361df072017-11-22 09:33:59 +08001721 break;
1722 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001723 *params = mState.mCaps.maxGeometryOutputComponents;
Jiawei Shao361df072017-11-22 09:33:59 +08001724 break;
1725 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001726 *params = mState.mCaps.maxGeometryOutputVertices;
Jiawei Shao361df072017-11-22 09:33:59 +08001727 break;
1728 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001729 *params = mState.mCaps.maxGeometryTotalOutputComponents;
Jiawei Shao361df072017-11-22 09:33:59 +08001730 break;
1731 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001732 *params = mState.mCaps.maxGeometryShaderInvocations;
Jiawei Shao361df072017-11-22 09:33:59 +08001733 break;
1734 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001735 *params = mState.mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001736 break;
1737 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001738 *params = mState.mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001739 break;
1740 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001741 *params = mState.mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001742 break;
1743 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001744 *params = mState.mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001745 break;
1746 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001747 *params = mState.mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001748 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001749 // GLES1 emulation: Caps queries
1750 case GL_MAX_TEXTURE_UNITS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001751 *params = mState.mCaps.maxMultitextureUnits;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001752 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001753 case GL_MAX_MODELVIEW_STACK_DEPTH:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001754 *params = mState.mCaps.maxModelviewMatrixStackDepth;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001755 break;
1756 case GL_MAX_PROJECTION_STACK_DEPTH:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001757 *params = mState.mCaps.maxProjectionMatrixStackDepth;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001758 break;
1759 case GL_MAX_TEXTURE_STACK_DEPTH:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001760 *params = mState.mCaps.maxTextureMatrixStackDepth;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001761 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001762 case GL_MAX_LIGHTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001763 *params = mState.mCaps.maxLights;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001764 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001765 case GL_MAX_CLIP_PLANES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001766 *params = mState.mCaps.maxClipPlanes;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001767 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001768 // GLES1 emulation: Vertex attribute queries
1769 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1770 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1771 case GL_COLOR_ARRAY_BUFFER_BINDING:
1772 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1773 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1774 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1775 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1776 break;
1777 case GL_VERTEX_ARRAY_STRIDE:
1778 case GL_NORMAL_ARRAY_STRIDE:
1779 case GL_COLOR_ARRAY_STRIDE:
1780 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1781 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1782 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1783 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1784 break;
1785 case GL_VERTEX_ARRAY_SIZE:
1786 case GL_COLOR_ARRAY_SIZE:
1787 case GL_TEXTURE_COORD_ARRAY_SIZE:
1788 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1789 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1790 break;
1791 case GL_VERTEX_ARRAY_TYPE:
1792 case GL_COLOR_ARRAY_TYPE:
1793 case GL_NORMAL_ARRAY_TYPE:
1794 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1795 case GL_TEXTURE_COORD_ARRAY_TYPE:
1796 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1797 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1798 break;
1799
jchen1082af6202018-06-22 10:59:52 +08001800 // GL_KHR_parallel_shader_compile
1801 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001802 *params = mState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08001803 break;
1804
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001805 // GL_EXT_blend_func_extended
1806 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001807 *params = mState.mExtensions.maxDualSourceDrawBuffers;
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001808 break;
1809
Jamie Madill231c7f52017-04-26 13:45:37 -04001810 default:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001811 ANGLE_CONTEXT_TRY(mState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001812 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001813 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001814}
1815
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001816void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001817{
Shannon Woods53a94a82014-06-24 15:20:36 -04001818 // Queries about context capabilities and maximums are answered by Context.
1819 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001820 switch (pname)
1821 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001822 case GL_MAX_ELEMENT_INDEX:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001823 *params = mState.mCaps.maxElementIndex;
Jamie Madill231c7f52017-04-26 13:45:37 -04001824 break;
1825 case GL_MAX_UNIFORM_BLOCK_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001826 *params = mState.mCaps.maxUniformBlockSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001827 break;
1828 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001829 *params = mState.mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001830 break;
1831 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001832 *params = mState.mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001833 break;
1834 case GL_MAX_SERVER_WAIT_TIMEOUT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001835 *params = mState.mCaps.maxServerWaitTimeout;
Jamie Madill231c7f52017-04-26 13:45:37 -04001836 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001837
Jamie Madill231c7f52017-04-26 13:45:37 -04001838 // GL_EXT_disjoint_timer_query
1839 case GL_TIMESTAMP_EXT:
1840 *params = mImplementation->getTimestamp();
1841 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001842
Jamie Madill231c7f52017-04-26 13:45:37 -04001843 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001844 *params = mState.mCaps.maxShaderStorageBlockSize;
Jamie Madill231c7f52017-04-26 13:45:37 -04001845 break;
1846 default:
1847 UNREACHABLE();
1848 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001849 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001850}
1851
Geoff Lang70d0f492015-12-10 17:45:46 -05001852void Context::getPointerv(GLenum pname, void **params) const
1853{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001854 mState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001855}
1856
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001857void Context::getPointervRobustANGLERobust(GLenum pname,
1858 GLsizei bufSize,
1859 GLsizei *length,
1860 void **params)
1861{
1862 UNIMPLEMENTED();
1863}
1864
Martin Radev66fb8202016-07-28 11:45:20 +03001865void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001866{
Shannon Woods53a94a82014-06-24 15:20:36 -04001867 // Queries about context capabilities and maximums are answered by Context.
1868 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001869
1870 GLenum nativeType;
1871 unsigned int numParams;
1872 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1873 ASSERT(queryStatus);
1874
1875 if (nativeType == GL_INT)
1876 {
1877 switch (target)
1878 {
1879 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1880 ASSERT(index < 3u);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001881 *data = mState.mCaps.maxComputeWorkGroupCount[index];
Martin Radev66fb8202016-07-28 11:45:20 +03001882 break;
1883 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1884 ASSERT(index < 3u);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001885 *data = mState.mCaps.maxComputeWorkGroupSize[index];
Martin Radev66fb8202016-07-28 11:45:20 +03001886 break;
1887 default:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001888 mState.getIntegeri_v(target, index, data);
Martin Radev66fb8202016-07-28 11:45:20 +03001889 }
1890 }
1891 else
1892 {
1893 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1894 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001895}
1896
Brandon Jones59770802018-04-02 13:18:42 -07001897void Context::getIntegeri_vRobust(GLenum target,
1898 GLuint index,
1899 GLsizei bufSize,
1900 GLsizei *length,
1901 GLint *data)
1902{
1903 getIntegeri_v(target, index, data);
1904}
1905
Martin Radev66fb8202016-07-28 11:45:20 +03001906void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001907{
Shannon Woods53a94a82014-06-24 15:20:36 -04001908 // Queries about context capabilities and maximums are answered by Context.
1909 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001910
1911 GLenum nativeType;
1912 unsigned int numParams;
1913 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1914 ASSERT(queryStatus);
1915
1916 if (nativeType == GL_INT_64_ANGLEX)
1917 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001918 mState.getInteger64i_v(target, index, data);
Martin Radev66fb8202016-07-28 11:45:20 +03001919 }
1920 else
1921 {
1922 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1923 }
1924}
1925
Brandon Jones59770802018-04-02 13:18:42 -07001926void Context::getInteger64i_vRobust(GLenum target,
1927 GLuint index,
1928 GLsizei bufSize,
1929 GLsizei *length,
1930 GLint64 *data)
1931{
1932 getInteger64i_v(target, index, data);
1933}
1934
Martin Radev66fb8202016-07-28 11:45:20 +03001935void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1936{
1937 // Queries about context capabilities and maximums are answered by Context.
1938 // Queries about current GL state values are answered by State.
1939
1940 GLenum nativeType;
1941 unsigned int numParams;
1942 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1943 ASSERT(queryStatus);
1944
1945 if (nativeType == GL_BOOL)
1946 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001947 mState.getBooleani_v(target, index, data);
Martin Radev66fb8202016-07-28 11:45:20 +03001948 }
1949 else
1950 {
1951 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1952 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001953}
1954
Brandon Jones59770802018-04-02 13:18:42 -07001955void Context::getBooleani_vRobust(GLenum target,
1956 GLuint index,
1957 GLsizei bufSize,
1958 GLsizei *length,
1959 GLboolean *data)
1960{
1961 getBooleani_v(target, index, data);
1962}
1963
Corentin Wallez336129f2017-10-17 15:55:40 -04001964void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001965{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001966 Buffer *buffer = mState.getTargetBuffer(target);
He Yunchao010e4db2017-03-03 14:22:06 +08001967 QueryBufferParameteriv(buffer, pname, params);
1968}
1969
Brandon Jones59770802018-04-02 13:18:42 -07001970void Context::getBufferParameterivRobust(BufferBinding target,
1971 GLenum pname,
1972 GLsizei bufSize,
1973 GLsizei *length,
1974 GLint *params)
1975{
1976 getBufferParameteriv(target, pname, params);
1977}
1978
He Yunchao010e4db2017-03-03 14:22:06 +08001979void Context::getFramebufferAttachmentParameteriv(GLenum target,
1980 GLenum attachment,
1981 GLenum pname,
1982 GLint *params)
1983{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001984 const Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001985 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001986}
1987
Brandon Jones59770802018-04-02 13:18:42 -07001988void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
1989 GLenum attachment,
1990 GLenum pname,
1991 GLsizei bufSize,
1992 GLsizei *length,
1993 GLint *params)
1994{
1995 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
1996}
1997
He Yunchao010e4db2017-03-03 14:22:06 +08001998void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1999{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002000 Renderbuffer *renderbuffer = mState.getCurrentRenderbuffer();
He Yunchao010e4db2017-03-03 14:22:06 +08002001 QueryRenderbufferiv(this, renderbuffer, pname, params);
2002}
2003
Brandon Jones59770802018-04-02 13:18:42 -07002004void Context::getRenderbufferParameterivRobust(GLenum target,
2005 GLenum pname,
2006 GLsizei bufSize,
2007 GLsizei *length,
2008 GLint *params)
2009{
2010 getRenderbufferParameteriv(target, pname, params);
2011}
2012
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002013void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002014{
Till Rathmannb8543632018-10-02 19:46:14 +02002015 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002016 QueryTexParameterfv(texture, pname, params);
2017}
2018
Brandon Jones59770802018-04-02 13:18:42 -07002019void Context::getTexParameterfvRobust(TextureType target,
2020 GLenum pname,
2021 GLsizei bufSize,
2022 GLsizei *length,
2023 GLfloat *params)
2024{
2025 getTexParameterfv(target, pname, params);
2026}
2027
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002028void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002029{
Till Rathmannb8543632018-10-02 19:46:14 +02002030 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002031 QueryTexParameteriv(texture, pname, params);
2032}
Jiajia Qin5451d532017-11-16 17:16:34 +08002033
Till Rathmannb8543632018-10-02 19:46:14 +02002034void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2035{
2036 const Texture *const texture = getTargetTexture(target);
2037 QueryTexParameterIiv(texture, pname, params);
2038}
2039
2040void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2041{
2042 const Texture *const texture = getTargetTexture(target);
2043 QueryTexParameterIuiv(texture, pname, params);
2044}
2045
Brandon Jones59770802018-04-02 13:18:42 -07002046void Context::getTexParameterivRobust(TextureType target,
2047 GLenum pname,
2048 GLsizei bufSize,
2049 GLsizei *length,
2050 GLint *params)
2051{
2052 getTexParameteriv(target, pname, params);
2053}
2054
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002055void Context::getTexParameterIivRobust(TextureType target,
2056 GLenum pname,
2057 GLsizei bufSize,
2058 GLsizei *length,
2059 GLint *params)
2060{
2061 UNIMPLEMENTED();
2062}
2063
2064void Context::getTexParameterIuivRobust(TextureType target,
2065 GLenum pname,
2066 GLsizei bufSize,
2067 GLsizei *length,
2068 GLuint *params)
2069{
2070 UNIMPLEMENTED();
2071}
2072
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002073void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002074{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002075 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002076 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002077}
2078
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002079void Context::getTexLevelParameterivRobust(TextureTarget target,
2080 GLint level,
2081 GLenum pname,
2082 GLsizei bufSize,
2083 GLsizei *length,
2084 GLint *params)
2085{
2086 UNIMPLEMENTED();
2087}
2088
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002089void Context::getTexLevelParameterfv(TextureTarget target,
2090 GLint level,
2091 GLenum pname,
2092 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002093{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002094 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002095 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002096}
2097
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002098void Context::getTexLevelParameterfvRobust(TextureTarget target,
2099 GLint level,
2100 GLenum pname,
2101 GLsizei bufSize,
2102 GLsizei *length,
2103 GLfloat *params)
2104{
2105 UNIMPLEMENTED();
2106}
2107
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002108void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002109{
Till Rathmannb8543632018-10-02 19:46:14 +02002110 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002111 SetTexParameterf(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08002112}
2113
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002114void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002115{
Till Rathmannb8543632018-10-02 19:46:14 +02002116 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002117 SetTexParameterfv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002118}
2119
Brandon Jones59770802018-04-02 13:18:42 -07002120void Context::texParameterfvRobust(TextureType target,
2121 GLenum pname,
2122 GLsizei bufSize,
2123 const GLfloat *params)
2124{
2125 texParameterfv(target, pname, params);
2126}
2127
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002128void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002129{
Till Rathmannb8543632018-10-02 19:46:14 +02002130 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002131 SetTexParameteri(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08002132}
2133
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002134void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002135{
Till Rathmannb8543632018-10-02 19:46:14 +02002136 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002137 SetTexParameteriv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002138}
2139
Till Rathmannb8543632018-10-02 19:46:14 +02002140void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2141{
2142 Texture *const texture = getTargetTexture(target);
2143 SetTexParameterIiv(this, texture, pname, params);
Till Rathmannb8543632018-10-02 19:46:14 +02002144}
2145
2146void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2147{
2148 Texture *const texture = getTargetTexture(target);
2149 SetTexParameterIuiv(this, texture, pname, params);
Till Rathmannb8543632018-10-02 19:46:14 +02002150}
2151
Brandon Jones59770802018-04-02 13:18:42 -07002152void Context::texParameterivRobust(TextureType target,
2153 GLenum pname,
2154 GLsizei bufSize,
2155 const GLint *params)
2156{
2157 texParameteriv(target, pname, params);
2158}
2159
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002160void Context::texParameterIivRobust(TextureType target,
2161 GLenum pname,
2162 GLsizei bufSize,
2163 const GLint *params)
2164{
2165 UNIMPLEMENTED();
2166}
2167
2168void Context::texParameterIuivRobust(TextureType target,
2169 GLenum pname,
2170 GLsizei bufSize,
2171 const GLuint *params)
2172{
2173 UNIMPLEMENTED();
2174}
2175
Jamie Madill493f9572018-05-24 19:52:15 -04002176void Context::drawArraysInstanced(PrimitiveMode mode,
2177 GLint first,
2178 GLsizei count,
2179 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002180{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002181 // No-op if count draws no primitives for given mode
2182 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002183 {
2184 return;
2185 }
2186
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002187 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002188 ANGLE_CONTEXT_TRY(
2189 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05002190 MarkTransformFeedbackBufferUsage(this, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002191}
2192
Jamie Madill493f9572018-05-24 19:52:15 -04002193void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002194 GLsizei count,
Jamie Madill8dc27f92018-11-29 11:45:44 -05002195 DrawElementsType type,
Jamie Madill876429b2017-04-20 15:46:24 -04002196 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002197 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002198{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002199 // No-op if count draws no primitives for given mode
2200 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002201 {
2202 return;
2203 }
2204
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002205 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002206 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002207 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002208}
2209
Jamie Madill493f9572018-05-24 19:52:15 -04002210void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002211 GLuint start,
2212 GLuint end,
2213 GLsizei count,
Jamie Madill8dc27f92018-11-29 11:45:44 -05002214 DrawElementsType type,
Jamie Madill876429b2017-04-20 15:46:24 -04002215 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002216{
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(
2225 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002226}
2227
Jamie Madill493f9572018-05-24 19:52:15 -04002228void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002229{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002230 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002231 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002232}
2233
Jamie Madill8dc27f92018-11-29 11:45:44 -05002234void Context::drawElementsIndirect(PrimitiveMode mode, DrawElementsType type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002235{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002236 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002237 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002238}
2239
Jamie Madill675fe712016-12-19 13:07:54 -05002240void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002241{
Jamie Madill4f6592f2018-11-27 16:37:45 -05002242 ANGLE_CONTEXT_TRY(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002243}
2244
Jamie Madill675fe712016-12-19 13:07:54 -05002245void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002246{
Jamie Madill4f6592f2018-11-27 16:37:45 -05002247 ANGLE_CONTEXT_TRY(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002248}
2249
Austin Kinross6ee1e782015-05-29 17:05:37 -07002250void Context::insertEventMarker(GLsizei length, const char *marker)
2251{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002252 ASSERT(mImplementation);
2253 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002254}
2255
2256void Context::pushGroupMarker(GLsizei length, const char *marker)
2257{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002258 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002259
2260 if (marker == nullptr)
2261 {
2262 // From the EXT_debug_marker spec,
2263 // "If <marker> is null then an empty string is pushed on the stack."
2264 mImplementation->pushGroupMarker(length, "");
2265 }
2266 else
2267 {
2268 mImplementation->pushGroupMarker(length, marker);
2269 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002270}
2271
2272void Context::popGroupMarker()
2273{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002274 ASSERT(mImplementation);
2275 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002276}
2277
Geoff Langd8605522016-04-13 10:19:12 -04002278void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2279{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002280 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002281 ASSERT(programObject);
2282
2283 programObject->bindUniformLocation(location, name);
2284}
2285
Brandon Jones59770802018-04-02 13:18:42 -07002286void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002287{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002288 mState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002289}
2290
Brandon Jones59770802018-04-02 13:18:42 -07002291void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002292{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002293 mState.loadPathRenderingMatrix(matrixMode, matrix);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002294}
2295
Brandon Jones59770802018-04-02 13:18:42 -07002296void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002297{
2298 GLfloat I[16];
2299 angle::Matrix<GLfloat>::setToIdentity(I);
2300
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002301 mState.loadPathRenderingMatrix(matrixMode, I);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002302}
2303
2304void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2305{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002306 const auto *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002307 if (!pathObj)
2308 return;
2309
Geoff Lang9bf86f02018-07-26 11:46:34 -04002310 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002311
2312 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2313}
2314
2315void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2316{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002317 const auto *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002318 if (!pathObj)
2319 return;
2320
Geoff Lang9bf86f02018-07-26 11:46:34 -04002321 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002322
2323 mImplementation->stencilStrokePath(pathObj, reference, mask);
2324}
2325
2326void Context::coverFillPath(GLuint path, GLenum coverMode)
2327{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002328 const auto *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002329 if (!pathObj)
2330 return;
2331
Geoff Lang9bf86f02018-07-26 11:46:34 -04002332 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002333
2334 mImplementation->coverFillPath(pathObj, coverMode);
2335}
2336
2337void Context::coverStrokePath(GLuint path, GLenum coverMode)
2338{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002339 const auto *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002340 if (!pathObj)
2341 return;
2342
Geoff Lang9bf86f02018-07-26 11:46:34 -04002343 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002344
2345 mImplementation->coverStrokePath(pathObj, coverMode);
2346}
2347
2348void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2349{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002350 const auto *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002351 if (!pathObj)
2352 return;
2353
Geoff Lang9bf86f02018-07-26 11:46:34 -04002354 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002355
2356 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2357}
2358
2359void Context::stencilThenCoverStrokePath(GLuint path,
2360 GLint reference,
2361 GLuint mask,
2362 GLenum coverMode)
2363{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002364 const auto *pathObj = mState.mPathManager->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002365 if (!pathObj)
2366 return;
2367
Geoff Lang9bf86f02018-07-26 11:46:34 -04002368 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002369
2370 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2371}
2372
Sami Väisänend59ca052016-06-21 16:10:00 +03002373void Context::coverFillPathInstanced(GLsizei numPaths,
2374 GLenum pathNameType,
2375 const void *paths,
2376 GLuint pathBase,
2377 GLenum coverMode,
2378 GLenum transformType,
2379 const GLfloat *transformValues)
2380{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002381 const auto &pathObjects =
2382 GatherPaths(*mState.mPathManager, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002383
Geoff Lang9bf86f02018-07-26 11:46:34 -04002384 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002385
2386 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2387}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002388
Sami Väisänend59ca052016-06-21 16:10:00 +03002389void Context::coverStrokePathInstanced(GLsizei numPaths,
2390 GLenum pathNameType,
2391 const void *paths,
2392 GLuint pathBase,
2393 GLenum coverMode,
2394 GLenum transformType,
2395 const GLfloat *transformValues)
2396{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002397 const auto &pathObjects =
2398 GatherPaths(*mState.mPathManager, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002399
2400 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002401 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002402
2403 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2404 transformValues);
2405}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002406
Sami Väisänend59ca052016-06-21 16:10:00 +03002407void Context::stencilFillPathInstanced(GLsizei numPaths,
2408 GLenum pathNameType,
2409 const void *paths,
2410 GLuint pathBase,
2411 GLenum fillMode,
2412 GLuint mask,
2413 GLenum transformType,
2414 const GLfloat *transformValues)
2415{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002416 const auto &pathObjects =
2417 GatherPaths(*mState.mPathManager, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002418
2419 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002420 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002421
2422 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2423 transformValues);
2424}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002425
Sami Väisänend59ca052016-06-21 16:10:00 +03002426void Context::stencilStrokePathInstanced(GLsizei numPaths,
2427 GLenum pathNameType,
2428 const void *paths,
2429 GLuint pathBase,
2430 GLint reference,
2431 GLuint mask,
2432 GLenum transformType,
2433 const GLfloat *transformValues)
2434{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002435 const auto &pathObjects =
2436 GatherPaths(*mState.mPathManager, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002437
Geoff Lang9bf86f02018-07-26 11:46:34 -04002438 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002439
2440 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2441 transformValues);
2442}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002443
Sami Väisänend59ca052016-06-21 16:10:00 +03002444void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2445 GLenum pathNameType,
2446 const void *paths,
2447 GLuint pathBase,
2448 GLenum fillMode,
2449 GLuint mask,
2450 GLenum coverMode,
2451 GLenum transformType,
2452 const GLfloat *transformValues)
2453{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002454 const auto &pathObjects =
2455 GatherPaths(*mState.mPathManager, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002456
Geoff Lang9bf86f02018-07-26 11:46:34 -04002457 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002458
2459 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2460 transformType, transformValues);
2461}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002462
Sami Väisänend59ca052016-06-21 16:10:00 +03002463void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2464 GLenum pathNameType,
2465 const void *paths,
2466 GLuint pathBase,
2467 GLint reference,
2468 GLuint mask,
2469 GLenum coverMode,
2470 GLenum transformType,
2471 const GLfloat *transformValues)
2472{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002473 const auto &pathObjects =
2474 GatherPaths(*mState.mPathManager, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002475
Geoff Lang9bf86f02018-07-26 11:46:34 -04002476 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002477
2478 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2479 transformType, transformValues);
2480}
2481
Sami Väisänen46eaa942016-06-29 10:26:37 +03002482void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2483{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002484 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002485
2486 programObject->bindFragmentInputLocation(location, name);
2487}
2488
2489void Context::programPathFragmentInputGen(GLuint program,
2490 GLint location,
2491 GLenum genMode,
2492 GLint components,
2493 const GLfloat *coeffs)
2494{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002495 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002496
jchen103fd614d2018-08-13 12:21:58 +08002497 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002498}
2499
jchen1015015f72017-03-16 13:54:21 +08002500GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2501{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002502 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002503 return QueryProgramResourceIndex(programObject, programInterface, name);
2504}
2505
jchen10fd7c3b52017-03-21 15:36:03 +08002506void Context::getProgramResourceName(GLuint program,
2507 GLenum programInterface,
2508 GLuint index,
2509 GLsizei bufSize,
2510 GLsizei *length,
2511 GLchar *name)
2512{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002513 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002514 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2515}
2516
jchen10191381f2017-04-11 13:59:04 +08002517GLint Context::getProgramResourceLocation(GLuint program,
2518 GLenum programInterface,
2519 const GLchar *name)
2520{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002521 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002522 return QueryProgramResourceLocation(programObject, programInterface, name);
2523}
2524
jchen10880683b2017-04-12 16:21:55 +08002525void Context::getProgramResourceiv(GLuint program,
2526 GLenum programInterface,
2527 GLuint index,
2528 GLsizei propCount,
2529 const GLenum *props,
2530 GLsizei bufSize,
2531 GLsizei *length,
2532 GLint *params)
2533{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002534 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002535 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2536 length, params);
2537}
2538
jchen10d9cd7b72017-08-30 15:04:25 +08002539void Context::getProgramInterfaceiv(GLuint program,
2540 GLenum programInterface,
2541 GLenum pname,
2542 GLint *params)
2543{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002544 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002545 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2546}
2547
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002548void Context::getProgramInterfaceivRobust(GLuint program,
2549 GLenum programInterface,
2550 GLenum pname,
2551 GLsizei bufSize,
2552 GLsizei *length,
2553 GLint *params)
2554{
2555 UNIMPLEMENTED();
2556}
2557
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002558void Context::handleError(GLenum errorCode,
2559 const char *message,
2560 const char *file,
2561 const char *function,
2562 unsigned int line)
2563{
2564 mErrors.handleError(errorCode, message, file, function, line);
2565}
2566
Jamie Madilla139f012018-10-10 16:13:03 -04002567void Context::validationError(GLenum errorCode, const char *message)
2568{
2569 mErrors.validationError(errorCode, message);
2570}
2571
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002572// Get one of the recorded errors and clear its flag, if any.
2573// [OpenGL ES 2.0.24] section 2.5 page 13.
2574GLenum Context::getError()
2575{
Geoff Langda5777c2014-07-11 09:52:58 -04002576 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002577 {
Geoff Langda5777c2014-07-11 09:52:58 -04002578 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002579 }
Geoff Langda5777c2014-07-11 09:52:58 -04002580 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002581 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002582 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002583 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002584}
2585
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002586// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002587void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002588{
2589 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002590 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002591 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002592 mContextLostForced = true;
2593 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002594 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002595}
2596
Jamie Madillfa920eb2018-01-04 11:45:50 -05002597GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002598{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002599 // Even if the application doesn't want to know about resets, we want to know
2600 // as it will allow us to skip all the calls.
2601 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002602 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002603 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002604 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002605 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002606 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002607
2608 // EXT_robustness, section 2.6: If the reset notification behavior is
2609 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2610 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2611 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002612 }
2613
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002614 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2615 // status should be returned at least once, and GL_NO_ERROR should be returned
2616 // once the device has finished resetting.
2617 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002618 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002619 ASSERT(mResetStatus == GL_NO_ERROR);
2620 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002621
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002622 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002623 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002624 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002625 }
2626 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002627 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002628 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002629 // If markContextLost was used to mark the context lost then
2630 // assume that is not recoverable, and continue to report the
2631 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002632 mResetStatus = mImplementation->getResetStatus();
2633 }
Jamie Madill893ab082014-05-16 16:56:10 -04002634
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002635 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002636}
2637
2638bool Context::isResetNotificationEnabled()
2639{
2640 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2641}
2642
Corentin Walleze3b10e82015-05-20 11:06:25 -04002643const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002644{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002645 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002646}
2647
2648EGLenum Context::getClientType() const
2649{
2650 return mClientType;
2651}
2652
2653EGLenum Context::getRenderBuffer() const
2654{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002655 const Framebuffer *framebuffer = mState.mFramebufferManager->getFramebuffer(0);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002656 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002657 {
2658 return EGL_NONE;
2659 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002660
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002661 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002662 ASSERT(backAttachment != nullptr);
2663 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002664}
2665
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002666VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002667{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002668 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002669 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2670 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002671 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002672 vertexArray =
2673 new VertexArray(mImplementation.get(), vertexArrayHandle,
2674 mState.mCaps.maxVertexAttributes, mState.mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002675
Jamie Madill96a483b2017-06-27 16:49:21 -04002676 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002677 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002678
2679 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002680}
2681
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002682TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002683{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002684 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002685 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2686 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002687 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002688 transformFeedback =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002689 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mState.mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002690 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002691 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002692 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002693
2694 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002695}
2696
2697bool Context::isVertexArrayGenerated(GLuint vertexArray)
2698{
Jamie Madill96a483b2017-06-27 16:49:21 -04002699 ASSERT(mVertexArrayMap.contains(0));
2700 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002701}
2702
2703bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2704{
Jamie Madill96a483b2017-06-27 16:49:21 -04002705 ASSERT(mTransformFeedbackMap.contains(0));
2706 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002707}
2708
Shannon Woods53a94a82014-06-24 15:20:36 -04002709void Context::detachTexture(GLuint texture)
2710{
2711 // Simple pass-through to State's detachTexture method, as textures do not require
2712 // allocation map management either here or in the resource manager at detach time.
2713 // Zero textures are held by the Context, and we don't attempt to request them from
2714 // the State.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002715 mState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002716}
2717
James Darpinian4d9d4832018-03-13 12:43:28 -07002718void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002719{
Yuly Novikov5807a532015-12-03 13:01:22 -05002720 // Simple pass-through to State's detachBuffer method, since
2721 // only buffer attachments to container objects that are bound to the current context
2722 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002723
Yuly Novikov5807a532015-12-03 13:01:22 -05002724 // [OpenGL ES 3.2] section 5.1.2 page 45:
2725 // Attachments to unbound container objects, such as
2726 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2727 // are not affected and continue to act as references on the deleted object
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002728 ANGLE_CONTEXT_TRY(mState.detachBuffer(this, buffer));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002729}
2730
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002731void Context::detachFramebuffer(GLuint framebuffer)
2732{
Shannon Woods53a94a82014-06-24 15:20:36 -04002733 // Framebuffer detachment is handled by Context, because 0 is a valid
2734 // Framebuffer object, and a pointer to it must be passed from Context
2735 // to State at binding time.
2736
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002737 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002738 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2739 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2740 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002741
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002742 if (mState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002743 {
2744 bindReadFramebuffer(0);
2745 }
2746
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002747 if (mState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002748 {
2749 bindDrawFramebuffer(0);
2750 }
2751}
2752
2753void Context::detachRenderbuffer(GLuint renderbuffer)
2754{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002755 mState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002756}
2757
Jamie Madill57a89722013-07-02 11:57:03 -04002758void Context::detachVertexArray(GLuint vertexArray)
2759{
Jamie Madill77a72f62015-04-14 11:18:32 -04002760 // Vertex array detachment is handled by Context, because 0 is a valid
2761 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002762 // binding time.
2763
Jamie Madill57a89722013-07-02 11:57:03 -04002764 // [OpenGL ES 3.0.2] section 2.10 page 43:
2765 // If a vertex array object that is currently bound is deleted, the binding
2766 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002767 if (mState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002768 {
2769 bindVertexArray(0);
2770 }
2771}
2772
Geoff Langc8058452014-02-03 12:04:11 -05002773void Context::detachTransformFeedback(GLuint transformFeedback)
2774{
Corentin Walleza2257da2016-04-19 16:43:12 -04002775 // Transform feedback detachment is handled by Context, because 0 is a valid
2776 // transform feedback, and a pointer to it must be passed from Context to State at
2777 // binding time.
2778
2779 // The OpenGL specification doesn't mention what should happen when the currently bound
2780 // transform feedback object is deleted. Since it is a container object, we treat it like
2781 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002782 if (mState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002783 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002784 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002785 }
Geoff Langc8058452014-02-03 12:04:11 -05002786}
2787
Jamie Madilldc356042013-07-19 16:36:57 -04002788void Context::detachSampler(GLuint sampler)
2789{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002790 mState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002791}
2792
Yunchao Hea336b902017-08-02 16:05:21 +08002793void Context::detachProgramPipeline(GLuint pipeline)
2794{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002795 mState.detachProgramPipeline(this, pipeline);
Yunchao Hea336b902017-08-02 16:05:21 +08002796}
2797
Jamie Madill3ef140a2017-08-26 23:11:21 -04002798void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002799{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002800 mState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002801 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002802}
2803
Jamie Madille29d1672013-07-19 16:36:57 -04002804void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2805{
Till Rathmannb8543632018-10-02 19:46:14 +02002806 Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002807 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002808 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002809}
Jamie Madille29d1672013-07-19 16:36:57 -04002810
Geoff Langc1984ed2016-10-07 12:41:00 -04002811void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2812{
Till Rathmannb8543632018-10-02 19:46:14 +02002813 Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002814 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002815 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002816}
2817
Till Rathmannb8543632018-10-02 19:46:14 +02002818void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2819{
2820 Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002821 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Till Rathmannb8543632018-10-02 19:46:14 +02002822 SetSamplerParameterIiv(this, samplerObject, pname, param);
2823}
2824
2825void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2826{
2827 Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002828 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Till Rathmannb8543632018-10-02 19:46:14 +02002829 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2830}
2831
Brandon Jones59770802018-04-02 13:18:42 -07002832void Context::samplerParameterivRobust(GLuint sampler,
2833 GLenum pname,
2834 GLsizei bufSize,
2835 const GLint *param)
2836{
2837 samplerParameteriv(sampler, pname, param);
2838}
2839
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002840void Context::samplerParameterIivRobust(GLuint sampler,
2841 GLenum pname,
2842 GLsizei bufSize,
2843 const GLint *param)
2844{
2845 UNIMPLEMENTED();
2846}
2847
2848void Context::samplerParameterIuivRobust(GLuint sampler,
2849 GLenum pname,
2850 GLsizei bufSize,
2851 const GLuint *param)
2852{
2853 UNIMPLEMENTED();
2854}
2855
Jamie Madille29d1672013-07-19 16:36:57 -04002856void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2857{
Till Rathmannb8543632018-10-02 19:46:14 +02002858 Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002859 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002860 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002861}
2862
Geoff Langc1984ed2016-10-07 12:41:00 -04002863void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002864{
Till Rathmannb8543632018-10-02 19:46:14 +02002865 Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002866 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002867 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002868}
2869
Brandon Jones59770802018-04-02 13:18:42 -07002870void Context::samplerParameterfvRobust(GLuint sampler,
2871 GLenum pname,
2872 GLsizei bufSize,
2873 const GLfloat *param)
2874{
2875 samplerParameterfv(sampler, pname, param);
2876}
2877
Geoff Langc1984ed2016-10-07 12:41:00 -04002878void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002879{
Till Rathmannb8543632018-10-02 19:46:14 +02002880 const Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002881 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002882 QuerySamplerParameteriv(samplerObject, pname, params);
2883}
Jamie Madill9675b802013-07-19 16:36:59 -04002884
Till Rathmannb8543632018-10-02 19:46:14 +02002885void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2886{
2887 const Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002888 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Till Rathmannb8543632018-10-02 19:46:14 +02002889 QuerySamplerParameterIiv(samplerObject, pname, params);
2890}
2891
2892void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2893{
2894 const Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002895 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Till Rathmannb8543632018-10-02 19:46:14 +02002896 QuerySamplerParameterIuiv(samplerObject, pname, params);
2897}
2898
Brandon Jones59770802018-04-02 13:18:42 -07002899void Context::getSamplerParameterivRobust(GLuint sampler,
2900 GLenum pname,
2901 GLsizei bufSize,
2902 GLsizei *length,
2903 GLint *params)
2904{
2905 getSamplerParameteriv(sampler, pname, params);
2906}
2907
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002908void Context::getSamplerParameterIivRobust(GLuint sampler,
2909 GLenum pname,
2910 GLsizei bufSize,
2911 GLsizei *length,
2912 GLint *params)
2913{
2914 UNIMPLEMENTED();
2915}
2916
2917void Context::getSamplerParameterIuivRobust(GLuint sampler,
2918 GLenum pname,
2919 GLsizei bufSize,
2920 GLsizei *length,
2921 GLuint *params)
2922{
2923 UNIMPLEMENTED();
2924}
2925
Geoff Langc1984ed2016-10-07 12:41:00 -04002926void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2927{
Till Rathmannb8543632018-10-02 19:46:14 +02002928 const Sampler *const samplerObject =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002929 mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002930 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002931}
2932
Brandon Jones59770802018-04-02 13:18:42 -07002933void Context::getSamplerParameterfvRobust(GLuint sampler,
2934 GLenum pname,
2935 GLsizei bufSize,
2936 GLsizei *length,
2937 GLfloat *params)
2938{
2939 getSamplerParameterfv(sampler, pname, params);
2940}
2941
Olli Etuahof0fee072016-03-30 15:11:58 +03002942void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2943{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002944 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002945 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002946}
2947
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002948void Context::initRendererString()
2949{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002950 std::ostringstream rendererString;
2951 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002952 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002953 rendererString << ")";
2954
Geoff Langcec35902014-04-16 10:52:36 -04002955 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002956}
2957
Geoff Langc339c4e2016-11-29 10:37:36 -05002958void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002959{
Geoff Langc339c4e2016-11-29 10:37:36 -05002960 const Version &clientVersion = getClientVersion();
2961
2962 std::ostringstream versionString;
2963 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2964 << ANGLE_VERSION_STRING << ")";
2965 mVersionString = MakeStaticString(versionString.str());
2966
2967 std::ostringstream shadingLanguageVersionString;
2968 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2969 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2970 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2971 << ")";
2972 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002973}
2974
Geoff Langcec35902014-04-16 10:52:36 -04002975void Context::initExtensionStrings()
2976{
Geoff Langc339c4e2016-11-29 10:37:36 -05002977 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2978 std::ostringstream combinedStringStream;
2979 std::copy(strings.begin(), strings.end(),
2980 std::ostream_iterator<const char *>(combinedStringStream, " "));
2981 return MakeStaticString(combinedStringStream.str());
2982 };
2983
2984 mExtensionStrings.clear();
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002985 for (const auto &extensionString : mState.mExtensions.getStrings())
Geoff Langc287ea62016-09-16 14:46:51 -04002986 {
2987 mExtensionStrings.push_back(MakeStaticString(extensionString));
2988 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002989 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002990
Geoff Langc339c4e2016-11-29 10:37:36 -05002991 mRequestableExtensionStrings.clear();
2992 for (const auto &extensionInfo : GetExtensionInfoMap())
2993 {
2994 if (extensionInfo.second.Requestable &&
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002995 !(mState.mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05002996 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002997 {
2998 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2999 }
3000 }
3001 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04003002}
3003
Geoff Langc339c4e2016-11-29 10:37:36 -05003004const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003005{
Geoff Langc339c4e2016-11-29 10:37:36 -05003006 switch (name)
3007 {
3008 case GL_VENDOR:
3009 return reinterpret_cast<const GLubyte *>("Google Inc.");
3010
3011 case GL_RENDERER:
3012 return reinterpret_cast<const GLubyte *>(mRendererString);
3013
3014 case GL_VERSION:
3015 return reinterpret_cast<const GLubyte *>(mVersionString);
3016
3017 case GL_SHADING_LANGUAGE_VERSION:
3018 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3019
3020 case GL_EXTENSIONS:
3021 return reinterpret_cast<const GLubyte *>(mExtensionString);
3022
3023 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3024 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3025
3026 default:
3027 UNREACHABLE();
3028 return nullptr;
3029 }
Geoff Langcec35902014-04-16 10:52:36 -04003030}
3031
Geoff Langc339c4e2016-11-29 10:37:36 -05003032const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003033{
Geoff Langc339c4e2016-11-29 10:37:36 -05003034 switch (name)
3035 {
3036 case GL_EXTENSIONS:
3037 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3038
3039 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3040 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3041
3042 default:
3043 UNREACHABLE();
3044 return nullptr;
3045 }
Geoff Langcec35902014-04-16 10:52:36 -04003046}
3047
3048size_t Context::getExtensionStringCount() const
3049{
3050 return mExtensionStrings.size();
3051}
3052
Geoff Lang111a99e2017-10-17 10:58:41 -04003053bool Context::isExtensionRequestable(const char *name)
3054{
3055 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3056 auto extension = extensionInfos.find(name);
3057
Geoff Lang111a99e2017-10-17 10:58:41 -04003058 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003059 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003060}
3061
Geoff Langc339c4e2016-11-29 10:37:36 -05003062void Context::requestExtension(const char *name)
3063{
3064 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3065 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3066 const auto &extension = extensionInfos.at(name);
3067 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003068 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003069
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003070 if (mState.mExtensions.*(extension.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05003071 {
3072 // Extension already enabled
3073 return;
3074 }
3075
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003076 mState.mExtensions.*(extension.ExtensionsMember) = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05003077 updateCaps();
3078 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003079
Jamie Madill2f348d22017-06-05 10:50:59 -04003080 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3081 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003082
Jamie Madill81c2e252017-09-09 23:32:46 -04003083 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3084 // sampleable.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003085 mState.mTextureManager->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003086 for (auto &zeroTexture : mZeroTextures)
3087 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003088 if (zeroTexture.get() != nullptr)
3089 {
Jamie Madille3e680c2018-12-03 17:49:08 -05003090 zeroTexture->signalDirtyStorage(this, InitState::Initialized);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003091 }
Geoff Lang9aded172017-04-05 11:07:56 -04003092 }
3093
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003094 mState.mFramebufferManager->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003095}
3096
3097size_t Context::getRequestableExtensionStringCount() const
3098{
3099 return mRequestableExtensionStrings.size();
3100}
3101
Jamie Madill493f9572018-05-24 19:52:15 -04003102void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003103{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003104 TransformFeedback *transformFeedback = mState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003105 ASSERT(transformFeedback != nullptr);
3106 ASSERT(!transformFeedback->isPaused());
3107
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003108 ANGLE_CONTEXT_TRY(transformFeedback->begin(this, primitiveMode, mState.getProgram()));
Jamie Madill3a256222018-12-08 09:56:39 -05003109 mStateCache.onActiveTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003110}
3111
3112bool Context::hasActiveTransformFeedback(GLuint program) const
3113{
3114 for (auto pair : mTransformFeedbackMap)
3115 {
3116 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3117 {
3118 return true;
3119 }
3120 }
3121 return false;
3122}
3123
Geoff Lang33f11fb2018-05-07 13:42:47 -04003124Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003125{
3126 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3127
jchen1082af6202018-06-22 10:59:52 +08003128 // Explicitly enable GL_KHR_parallel_shader_compile
3129 supportedExtensions.parallelShaderCompile = true;
3130
Geoff Langb0f917f2017-12-05 13:41:54 -05003131 if (getClientVersion() < ES_2_0)
3132 {
3133 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003134 supportedExtensions.pointSizeArray = true;
3135 supportedExtensions.textureCubeMap = true;
3136 supportedExtensions.pointSprite = true;
3137 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003138 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003139 }
3140
3141 if (getClientVersion() < ES_3_0)
3142 {
3143 // Disable ES3+ extensions
3144 supportedExtensions.colorBufferFloat = false;
3145 supportedExtensions.eglImageExternalEssl3 = false;
3146 supportedExtensions.textureNorm16 = false;
3147 supportedExtensions.multiview = false;
3148 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003149 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003150 supportedExtensions.textureMultisample = false;
Geoff Lang7198ebc2018-11-22 14:36:06 -05003151
3152 // Don't expose GL_EXT_texture_sRGB_decode without sRGB texture support
3153 if (!supportedExtensions.sRGB)
3154 {
3155 supportedExtensions.textureSRGBDecode = false;
3156 }
Geoff Langb0f917f2017-12-05 13:41:54 -05003157 }
3158
3159 if (getClientVersion() < ES_3_1)
3160 {
3161 // Disable ES3.1+ extensions
3162 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003163
3164 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3165 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003166 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003167 }
3168
3169 if (getClientVersion() > ES_2_0)
3170 {
3171 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3172 // supportedExtensions.sRGB = false;
3173 }
3174
3175 // Some extensions are always available because they are implemented in the GL layer.
3176 supportedExtensions.bindUniformLocation = true;
3177 supportedExtensions.vertexArrayObject = true;
3178 supportedExtensions.bindGeneratesResource = true;
3179 supportedExtensions.clientArrays = true;
3180 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003181 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003182
3183 // Enable the no error extension if the context was created with the flag.
3184 supportedExtensions.noError = mSkipValidation;
3185
3186 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003187 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003188
3189 // Explicitly enable GL_KHR_debug
3190 supportedExtensions.debug = true;
3191 supportedExtensions.maxDebugMessageLength = 1024;
3192 supportedExtensions.maxDebugLoggedMessages = 1024;
3193 supportedExtensions.maxDebugGroupStackDepth = 1024;
3194 supportedExtensions.maxLabelLength = 1024;
3195
3196 // Explicitly enable GL_ANGLE_robust_client_memory
3197 supportedExtensions.robustClientMemory = true;
3198
3199 // Determine robust resource init availability from EGL.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003200 supportedExtensions.robustResourceInitialization = mState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003201
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003202 // mState.mExtensions.robustBufferAccessBehavior is true only if robust access is true and the
3203 // backend supports it.
Geoff Langb0f917f2017-12-05 13:41:54 -05003204 supportedExtensions.robustBufferAccessBehavior =
3205 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3206
3207 // Enable the cache control query unconditionally.
3208 supportedExtensions.programCacheControl = true;
3209
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003210 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003211 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003212 {
3213 // GL_ANGLE_explicit_context_gles1
3214 supportedExtensions.explicitContextGles1 = true;
3215 // GL_ANGLE_explicit_context
3216 supportedExtensions.explicitContext = true;
3217 }
3218
Geoff Lang79b91402018-10-04 15:11:30 -04003219 supportedExtensions.memorySize = true;
3220
Geoff Langb0f917f2017-12-05 13:41:54 -05003221 return supportedExtensions;
3222}
3223
Geoff Lang33f11fb2018-05-07 13:42:47 -04003224void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003225{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003226 mState.mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003227
Geoff Lang33f11fb2018-05-07 13:42:47 -04003228 mSupportedExtensions = generateSupportedExtensions();
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003229 mState.mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003230
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003231 mState.mLimitations = mImplementation->getNativeLimitations();
Lingfeng Yang01074432018-04-16 10:19:51 -07003232
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003233 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3234 if (getClientVersion() < Version(2, 0))
3235 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003236 mState.mCaps.maxMultitextureUnits = 4;
3237 mState.mCaps.maxClipPlanes = 6;
3238 mState.mCaps.maxLights = 8;
3239 mState.mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3240 mState.mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3241 mState.mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3242 mState.mCaps.minSmoothPointSize = 1.0f;
3243 mState.mCaps.maxSmoothPointSize = 1.0f;
3244 mState.mCaps.minSmoothLineWidth = 1.0f;
3245 mState.mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003246 }
3247
Luc Ferronad2ae932018-06-11 15:31:17 -04003248 // Apply/Verify implementation limits
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003249 LimitCap(&mState.mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003250
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003251 ASSERT(mState.mCaps.minAliasedPointSize >= 1.0f);
Luc Ferronad2ae932018-06-11 15:31:17 -04003252
Jamie Madill0f80ed82017-09-19 00:24:56 -04003253 if (getClientVersion() < ES_3_1)
3254 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003255 mState.mCaps.maxVertexAttribBindings = mState.mCaps.maxVertexAttributes;
Jamie Madill0f80ed82017-09-19 00:24:56 -04003256 }
3257 else
3258 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003259 LimitCap(&mState.mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
Jamie Madill0f80ed82017-09-19 00:24:56 -04003260 }
Geoff Lang301d1612014-07-09 10:34:37 -04003261
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003262 LimitCap(&mState.mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
Jiawei Shao54aafe52018-04-27 14:54:57 +08003263 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003264 LimitCap(&mState.mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003265
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003266 LimitCap(&mState.mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3267 LimitCap(&mState.mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Jamie Madill0f80ed82017-09-19 00:24:56 -04003268
3269 // Limit textures as well, so we can use fast bitsets with texture bindings.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003270 LimitCap(&mState.mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
3271 LimitCap(&mState.mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
Jiawei Shao54aafe52018-04-27 14:54:57 +08003272 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003273 LimitCap(&mState.mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
Jiawei Shao54aafe52018-04-27 14:54:57 +08003274 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003275
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003276 LimitCap(&mState.mCaps.maxImageUnits, IMPLEMENTATION_MAX_IMAGE_UNITS);
Jamie Madille3e680c2018-12-03 17:49:08 -05003277
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003278 mState.mCaps.maxSampleMaskWords =
3279 std::min<GLuint>(mState.mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
Jiawei Shaodb342272017-09-27 10:21:45 +08003280
Geoff Langc287ea62016-09-16 14:46:51 -04003281 // WebGL compatibility
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003282 mState.mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003283 for (const auto &extensionInfo : GetExtensionInfoMap())
3284 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003285 // If the user has requested that extensions start disabled and they are requestable,
3286 // disable them.
3287 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003288 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003289 mState.mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
Geoff Langc287ea62016-09-16 14:46:51 -04003290 }
3291 }
3292
3293 // Generate texture caps
3294 updateCaps();
3295}
3296
3297void Context::updateCaps()
3298{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003299 mState.mCaps.compressedTextureFormats.clear();
3300 mState.mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003301
Jamie Madill7b62cf92017-11-02 15:20:49 -04003302 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003303 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003304 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003305 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003306
Geoff Lang0d8b7242015-09-09 14:56:53 -04003307 // Update the format caps based on the client version and extensions.
3308 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3309 // ES3.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003310 formatCaps.texturable = formatCaps.texturable &&
3311 formatInfo.textureSupport(getClientVersion(), mState.mExtensions);
3312 formatCaps.filterable = formatCaps.filterable &&
3313 formatInfo.filterSupport(getClientVersion(), mState.mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003314 formatCaps.textureAttachment =
3315 formatCaps.textureAttachment &&
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003316 formatInfo.textureAttachmentSupport(getClientVersion(), mState.mExtensions);
3317 formatCaps.renderbuffer =
3318 formatCaps.renderbuffer &&
3319 formatInfo.renderbufferSupport(getClientVersion(), mState.mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003320
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003321 // OpenGL ES does not support multisampling with non-rendererable formats
3322 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003323 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003324 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003325 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003326 {
Geoff Langd87878e2014-09-19 15:42:59 -04003327 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003328 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003329 else
3330 {
3331 // We may have limited the max samples for some required renderbuffer formats due to
3332 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3333 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3334
3335 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3336 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3337 // exception of signed and unsigned integer formats."
3338 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3339 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3340 {
3341 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003342 mState.mCaps.maxSamples = std::min(mState.mCaps.maxSamples, formatMaxSamples);
Olli Etuaho50c562d2017-06-06 14:43:30 +03003343 }
3344
3345 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003346 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003347 {
3348 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3349 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3350 // the exception that the signed and unsigned integer formats are required only to
3351 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3352 // multisamples, which must be at least one."
3353 if (formatInfo.componentType == GL_INT ||
3354 formatInfo.componentType == GL_UNSIGNED_INT)
3355 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003356 mState.mCaps.maxIntegerSamples =
3357 std::min(mState.mCaps.maxIntegerSamples, formatMaxSamples);
Olli Etuaho50c562d2017-06-06 14:43:30 +03003358 }
3359
3360 // GLES 3.1 section 19.3.1.
3361 if (formatCaps.texturable)
3362 {
3363 if (formatInfo.depthBits > 0)
3364 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003365 mState.mCaps.maxDepthTextureSamples =
3366 std::min(mState.mCaps.maxDepthTextureSamples, formatMaxSamples);
Olli Etuaho50c562d2017-06-06 14:43:30 +03003367 }
3368 else if (formatInfo.redBits > 0)
3369 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003370 mState.mCaps.maxColorTextureSamples =
3371 std::min(mState.mCaps.maxColorTextureSamples, formatMaxSamples);
Olli Etuaho50c562d2017-06-06 14:43:30 +03003372 }
3373 }
3374 }
3375 }
Geoff Langd87878e2014-09-19 15:42:59 -04003376
3377 if (formatCaps.texturable && formatInfo.compressed)
3378 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003379 mState.mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003380 }
3381
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003382 mState.mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003383 }
Jamie Madill32447362017-06-28 14:53:52 -04003384
3385 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003386 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003387 {
3388 mMemoryProgramCache = nullptr;
3389 }
Corentin Walleze4477002017-12-01 14:39:58 -05003390
3391 // Compute which buffer types are allowed
3392 mValidBufferBindings.reset();
3393 mValidBufferBindings.set(BufferBinding::ElementArray);
3394 mValidBufferBindings.set(BufferBinding::Array);
3395
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003396 if (mState.mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
Corentin Walleze4477002017-12-01 14:39:58 -05003397 {
3398 mValidBufferBindings.set(BufferBinding::PixelPack);
3399 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3400 }
3401
3402 if (getClientVersion() >= ES_3_0)
3403 {
3404 mValidBufferBindings.set(BufferBinding::CopyRead);
3405 mValidBufferBindings.set(BufferBinding::CopyWrite);
3406 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3407 mValidBufferBindings.set(BufferBinding::Uniform);
3408 }
3409
3410 if (getClientVersion() >= ES_3_1)
3411 {
3412 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3413 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3414 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3415 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3416 }
jchen107ae70d82018-07-06 13:47:01 +08003417
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003418 mThreadPool = angle::WorkerThreadPool::Create(mState.mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003419
Jamie Madillef9fcd92018-11-28 14:03:59 -05003420 // Reinitialize some dirty bits that depend on extensions.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003421 bool robustInit = mState.isRobustResourceInitEnabled();
Jamie Madill132d15c2018-11-30 15:25:38 -05003422 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_ATTACHMENTS, robustInit);
3423 mDrawDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT, robustInit);
3424 mDrawDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT, robustInit);
3425 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_ATTACHMENTS, robustInit);
3426 mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT, robustInit);
3427 mComputeDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT, robustInit);
Jamie Madillef9fcd92018-11-28 14:03:59 -05003428
Jamie Madillac66f982018-10-09 18:30:01 -04003429 // Reinitialize state cache after extension changes.
3430 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003431}
3432
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003433void Context::initWorkarounds()
3434{
Jamie Madill761b02c2017-06-23 16:27:06 -04003435 // Apply back-end workarounds.
3436 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3437
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003438 // Lose the context upon out of memory error if the application is
3439 // expecting to watch for those events.
3440 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003441
3442 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3443 {
3444 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3445 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3446 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3447 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003448}
3449
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003450bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3451{
3452 return (instanceCount == 0) || noopDraw(mode, count);
3453}
3454
Jamie Madill526392d2018-11-16 09:35:14 -05003455angle::Result Context::prepareForClear(GLbitfield mask)
Geoff Langd4fff502017-09-22 11:28:28 -04003456{
Geoff Langa8cb2872018-03-09 16:09:40 -05003457 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003458 ANGLE_TRY(mState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003459 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill7c985f52018-11-29 18:16:17 -05003460 return angle::Result::Continue;
Geoff Langd4fff502017-09-22 11:28:28 -04003461}
3462
Jamie Madill526392d2018-11-16 09:35:14 -05003463angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
Geoff Langd4fff502017-09-22 11:28:28 -04003464{
Geoff Langa8cb2872018-03-09 16:09:40 -05003465 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003466 ANGLE_TRY(mState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3467 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003468 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill7c985f52018-11-29 18:16:17 -05003469 return angle::Result::Continue;
Jamie Madill05b35b22017-10-03 09:01:44 -04003470}
3471
Jamie Madill132d15c2018-11-30 15:25:38 -05003472ANGLE_INLINE angle::Result Context::prepareForDispatch()
3473{
3474 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
3475 return syncDirtyBits(mComputeDirtyBits);
3476}
3477
Jamie Madill526392d2018-11-16 09:35:14 -05003478angle::Result Context::syncState(const State::DirtyBits &bitMask,
3479 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003480{
Geoff Langa8cb2872018-03-09 16:09:40 -05003481 ANGLE_TRY(syncDirtyObjects(objectMask));
3482 ANGLE_TRY(syncDirtyBits(bitMask));
Jamie Madill7c985f52018-11-29 18:16:17 -05003483 return angle::Result::Continue;
Geoff Langd4fff502017-09-22 11:28:28 -04003484}
3485
Jamie Madillc29968b2016-01-20 11:17:23 -05003486void Context::blitFramebuffer(GLint srcX0,
3487 GLint srcY0,
3488 GLint srcX1,
3489 GLint srcY1,
3490 GLint dstX0,
3491 GLint dstY0,
3492 GLint dstX1,
3493 GLint dstY1,
3494 GLbitfield mask,
3495 GLenum filter)
3496{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003497 if (mask == 0)
3498 {
3499 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3500 // buffers are copied.
3501 return;
3502 }
3503
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003504 Framebuffer *drawFramebuffer = mState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003505 ASSERT(drawFramebuffer);
3506
3507 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3508 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3509
Jamie Madillbc918e72018-03-08 09:47:21 -05003510 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003511
Jamie Madill4f6592f2018-11-27 16:37:45 -05003512 ANGLE_CONTEXT_TRY(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003513}
Jamie Madillc29968b2016-01-20 11:17:23 -05003514
3515void Context::clear(GLbitfield mask)
3516{
Geoff Langd4fff502017-09-22 11:28:28 -04003517 ANGLE_CONTEXT_TRY(prepareForClear(mask));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003518 ANGLE_CONTEXT_TRY(mState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003519}
3520
3521void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3522{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003523 Framebuffer *framebufferObject = mState.getDrawFramebuffer();
Olli Etuaho78df3362018-10-05 16:43:27 +03003524 const FramebufferAttachment *attachment = nullptr;
3525 if (buffer == GL_DEPTH)
3526 {
3527 attachment = framebufferObject->getDepthbuffer();
3528 }
3529 if (buffer == GL_COLOR &&
3530 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3531 {
3532 attachment = framebufferObject->getColorbuffer(drawbuffer);
3533 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003534 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3535 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003536 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003537 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003538 return;
3539 }
Geoff Langd4fff502017-09-22 11:28:28 -04003540 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003541 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003542}
3543
3544void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3545{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003546 Framebuffer *framebufferObject = mState.getDrawFramebuffer();
Olli Etuaho78df3362018-10-05 16:43:27 +03003547 const FramebufferAttachment *attachment = nullptr;
3548 if (buffer == GL_COLOR &&
3549 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3550 {
3551 attachment = framebufferObject->getColorbuffer(drawbuffer);
3552 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003553 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3554 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003555 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003556 {
3557 return;
3558 }
Geoff Langd4fff502017-09-22 11:28:28 -04003559 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003560 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003561}
3562
3563void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3564{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003565 Framebuffer *framebufferObject = mState.getDrawFramebuffer();
Olli Etuaho78df3362018-10-05 16:43:27 +03003566 const FramebufferAttachment *attachment = nullptr;
3567 if (buffer == GL_STENCIL)
3568 {
3569 attachment = framebufferObject->getStencilbuffer();
3570 }
3571 if (buffer == GL_COLOR &&
3572 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3573 {
3574 attachment = framebufferObject->getColorbuffer(drawbuffer);
3575 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003576 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3577 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003578 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003579 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003580 return;
3581 }
Geoff Langd4fff502017-09-22 11:28:28 -04003582 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003583 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003584}
3585
3586void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3587{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003588 Framebuffer *framebufferObject = mState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003589 ASSERT(framebufferObject);
3590
3591 // If a buffer is not present, the clear has no effect
3592 if (framebufferObject->getDepthbuffer() == nullptr &&
3593 framebufferObject->getStencilbuffer() == nullptr)
3594 {
3595 return;
3596 }
3597
Geoff Langd4fff502017-09-22 11:28:28 -04003598 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3599 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003600}
3601
3602void Context::readPixels(GLint x,
3603 GLint y,
3604 GLsizei width,
3605 GLsizei height,
3606 GLenum format,
3607 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003608 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003609{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003610 if (width == 0 || height == 0)
3611 {
3612 return;
3613 }
3614
Jamie Madillbc918e72018-03-08 09:47:21 -05003615 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003616
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003617 Framebuffer *readFBO = mState.getReadFramebuffer();
Jamie Madillb6664922017-07-25 12:55:04 -04003618 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003619
3620 Rectangle area(x, y, width, height);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003621 ANGLE_CONTEXT_TRY(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003622}
3623
Brandon Jones59770802018-04-02 13:18:42 -07003624void Context::readPixelsRobust(GLint x,
3625 GLint y,
3626 GLsizei width,
3627 GLsizei height,
3628 GLenum format,
3629 GLenum type,
3630 GLsizei bufSize,
3631 GLsizei *length,
3632 GLsizei *columns,
3633 GLsizei *rows,
3634 void *pixels)
3635{
3636 readPixels(x, y, width, height, format, type, pixels);
3637}
3638
3639void Context::readnPixelsRobust(GLint x,
3640 GLint y,
3641 GLsizei width,
3642 GLsizei height,
3643 GLenum format,
3644 GLenum type,
3645 GLsizei bufSize,
3646 GLsizei *length,
3647 GLsizei *columns,
3648 GLsizei *rows,
3649 void *data)
3650{
3651 readPixels(x, y, width, height, format, type, data);
3652}
3653
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003654void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003655 GLint level,
3656 GLenum internalformat,
3657 GLint x,
3658 GLint y,
3659 GLsizei width,
3660 GLsizei height,
3661 GLint border)
3662{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003663 // Only sync the read FBO
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003664 ANGLE_CONTEXT_TRY(mState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003665
Jamie Madillc29968b2016-01-20 11:17:23 -05003666 Rectangle sourceArea(x, y, width, height);
3667
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003668 Framebuffer *framebuffer = mState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003669 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05003670 ANGLE_CONTEXT_TRY(
3671 texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003672}
3673
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003674void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003675 GLint level,
3676 GLint xoffset,
3677 GLint yoffset,
3678 GLint x,
3679 GLint y,
3680 GLsizei width,
3681 GLsizei height)
3682{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003683 if (width == 0 || height == 0)
3684 {
3685 return;
3686 }
3687
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003688 // Only sync the read FBO
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003689 ANGLE_CONTEXT_TRY(mState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003690
Jamie Madillc29968b2016-01-20 11:17:23 -05003691 Offset destOffset(xoffset, yoffset, 0);
3692 Rectangle sourceArea(x, y, width, height);
3693
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003694 Framebuffer *framebuffer = mState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003695 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05003696 ANGLE_CONTEXT_TRY(
3697 texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003698}
3699
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003700void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003701 GLint level,
3702 GLint xoffset,
3703 GLint yoffset,
3704 GLint zoffset,
3705 GLint x,
3706 GLint y,
3707 GLsizei width,
3708 GLsizei height)
3709{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003710 if (width == 0 || height == 0)
3711 {
3712 return;
3713 }
3714
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003715 // Only sync the read FBO
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003716 ANGLE_CONTEXT_TRY(mState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003717
Jamie Madillc29968b2016-01-20 11:17:23 -05003718 Offset destOffset(xoffset, yoffset, zoffset);
3719 Rectangle sourceArea(x, y, width, height);
3720
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003721 Framebuffer *framebuffer = mState.getReadFramebuffer();
Jamie Madill05b35b22017-10-03 09:01:44 -04003722 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003723 ANGLE_CONTEXT_TRY(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level,
3724 destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003725}
3726
3727void Context::framebufferTexture2D(GLenum target,
3728 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003729 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003730 GLuint texture,
3731 GLint level)
3732{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003733 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003734 ASSERT(framebuffer);
3735
3736 if (texture != 0)
3737 {
3738 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003739 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003740 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003741 }
3742 else
3743 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003744 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003745 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003746
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003747 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003748}
3749
3750void Context::framebufferRenderbuffer(GLenum target,
3751 GLenum attachment,
3752 GLenum renderbuffertarget,
3753 GLuint renderbuffer)
3754{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003755 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003756 ASSERT(framebuffer);
3757
3758 if (renderbuffer != 0)
3759 {
3760 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003761
Jamie Madillcc129372018-04-12 09:13:18 -04003762 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003763 renderbufferObject);
3764 }
3765 else
3766 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003767 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003768 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003769
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003770 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003771}
3772
3773void Context::framebufferTextureLayer(GLenum target,
3774 GLenum attachment,
3775 GLuint texture,
3776 GLint level,
3777 GLint layer)
3778{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003779 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003780 ASSERT(framebuffer);
3781
3782 if (texture != 0)
3783 {
3784 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003785 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003786 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003787 }
3788 else
3789 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003790 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003791 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003792
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003793 mState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003794}
3795
Brandon Jones59770802018-04-02 13:18:42 -07003796void Context::framebufferTextureMultiviewLayered(GLenum target,
3797 GLenum attachment,
3798 GLuint texture,
3799 GLint level,
3800 GLint baseViewIndex,
3801 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003802{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003803 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Martin Radev82ef7742017-08-08 17:44:58 +03003804 ASSERT(framebuffer);
3805
3806 if (texture != 0)
3807 {
3808 Texture *textureObj = getTexture(texture);
3809
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003810 ImageIndex index;
3811 if (textureObj->getType() == TextureType::_2DArray)
3812 {
3813 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3814 }
3815 else
3816 {
3817 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3818 ASSERT(level == 0);
3819 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3820 }
Martin Radev82ef7742017-08-08 17:44:58 +03003821 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3822 numViews, baseViewIndex);
3823 }
3824 else
3825 {
3826 framebuffer->resetAttachment(this, attachment);
3827 }
3828
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003829 mState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003830}
3831
Brandon Jones59770802018-04-02 13:18:42 -07003832void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3833 GLenum attachment,
3834 GLuint texture,
3835 GLint level,
3836 GLsizei numViews,
3837 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003838{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003839 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Martin Radev5dae57b2017-07-14 16:15:55 +03003840 ASSERT(framebuffer);
3841
3842 if (texture != 0)
3843 {
3844 Texture *textureObj = getTexture(texture);
3845
3846 ImageIndex index = ImageIndex::Make2D(level);
3847 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3848 textureObj, numViews, viewportOffsets);
3849 }
3850 else
3851 {
3852 framebuffer->resetAttachment(this, attachment);
3853 }
3854
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003855 mState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003856}
3857
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003858void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3859{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003860 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jiawei Shaoa8802472018-05-28 11:17:47 +08003861 ASSERT(framebuffer);
3862
3863 if (texture != 0)
3864 {
3865 Texture *textureObj = getTexture(texture);
3866
3867 ImageIndex index = ImageIndex::MakeFromType(
3868 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3869 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3870 }
3871 else
3872 {
3873 framebuffer->resetAttachment(this, attachment);
3874 }
3875
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003876 mState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003877}
3878
Jamie Madillc29968b2016-01-20 11:17:23 -05003879void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3880{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003881 Framebuffer *framebuffer = mState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003882 ASSERT(framebuffer);
3883 framebuffer->setDrawBuffers(n, bufs);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003884 mState.setDrawFramebufferDirty();
Jamie Madilld84b6732018-09-06 15:54:35 -04003885 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003886}
3887
3888void Context::readBuffer(GLenum mode)
3889{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003890 Framebuffer *readFBO = mState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003891 readFBO->setReadBuffer(mode);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003892 mState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003893}
3894
3895void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3896{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003897 // Only sync the FBO
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003898 ANGLE_CONTEXT_TRY(mState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003899
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003900 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003901 ASSERT(framebuffer);
3902
3903 // The specification isn't clear what should be done when the framebuffer isn't complete.
3904 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4f6592f2018-11-27 16:37:45 -05003905 ANGLE_CONTEXT_TRY(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003906}
3907
3908void Context::invalidateFramebuffer(GLenum target,
3909 GLsizei numAttachments,
3910 const GLenum *attachments)
3911{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003912 // Only sync the FBO
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003913 ANGLE_CONTEXT_TRY(mState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003914
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003915 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003916 ASSERT(framebuffer);
3917
Jamie Madill427064d2018-04-13 16:20:34 -04003918 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003919 {
Jamie Madill437fa652016-05-03 15:13:24 -04003920 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003921 }
Jamie Madill437fa652016-05-03 15:13:24 -04003922
Jamie Madill4f6592f2018-11-27 16:37:45 -05003923 ANGLE_CONTEXT_TRY(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003924}
3925
3926void Context::invalidateSubFramebuffer(GLenum target,
3927 GLsizei numAttachments,
3928 const GLenum *attachments,
3929 GLint x,
3930 GLint y,
3931 GLsizei width,
3932 GLsizei height)
3933{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003934 // Only sync the FBO
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003935 ANGLE_CONTEXT_TRY(mState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003936
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003937 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003938 ASSERT(framebuffer);
3939
Jamie Madill427064d2018-04-13 16:20:34 -04003940 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003941 {
Jamie Madill437fa652016-05-03 15:13:24 -04003942 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003943 }
Jamie Madill437fa652016-05-03 15:13:24 -04003944
3945 Rectangle area(x, y, width, height);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003946 ANGLE_CONTEXT_TRY(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003947}
3948
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003949void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003950 GLint level,
3951 GLint internalformat,
3952 GLsizei width,
3953 GLsizei height,
3954 GLint border,
3955 GLenum format,
3956 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003957 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003958{
Jamie Madillbc918e72018-03-08 09:47:21 -05003959 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003960
3961 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003962 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003963 ANGLE_CONTEXT_TRY(texture->setImage(this, mState.getUnpackState(), target, level,
Jamie Madill4f6592f2018-11-27 16:37:45 -05003964 internalformat, size, format, type,
3965 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003966}
3967
Brandon Jones59770802018-04-02 13:18:42 -07003968void Context::texImage2DRobust(TextureTarget target,
3969 GLint level,
3970 GLint internalformat,
3971 GLsizei width,
3972 GLsizei height,
3973 GLint border,
3974 GLenum format,
3975 GLenum type,
3976 GLsizei bufSize,
3977 const void *pixels)
3978{
3979 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3980}
3981
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003982void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003983 GLint level,
3984 GLint internalformat,
3985 GLsizei width,
3986 GLsizei height,
3987 GLsizei depth,
3988 GLint border,
3989 GLenum format,
3990 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003991 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003992{
Jamie Madillbc918e72018-03-08 09:47:21 -05003993 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003994
3995 Extents size(width, height, depth);
3996 Texture *texture = getTargetTexture(target);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003997 ANGLE_CONTEXT_TRY(texture->setImage(this, mState.getUnpackState(),
Jamie Madill4f6592f2018-11-27 16:37:45 -05003998 NonCubeTextureTypeToTarget(target), level, internalformat,
3999 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004000}
4001
Brandon Jones59770802018-04-02 13:18:42 -07004002void Context::texImage3DRobust(TextureType target,
4003 GLint level,
4004 GLint internalformat,
4005 GLsizei width,
4006 GLsizei height,
4007 GLsizei depth,
4008 GLint border,
4009 GLenum format,
4010 GLenum type,
4011 GLsizei bufSize,
4012 const void *pixels)
4013{
4014 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4015}
4016
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004017void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004018 GLint level,
4019 GLint xoffset,
4020 GLint yoffset,
4021 GLsizei width,
4022 GLsizei height,
4023 GLenum format,
4024 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004025 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004026{
4027 // Zero sized uploads are valid but no-ops
4028 if (width == 0 || height == 0)
4029 {
4030 return;
4031 }
4032
Jamie Madillbc918e72018-03-08 09:47:21 -05004033 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004034
4035 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004036 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004037
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004038 gl::Buffer *unpackBuffer = mState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004039
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004040 ANGLE_CONTEXT_TRY(texture->setSubImage(this, mState.getUnpackState(), unpackBuffer, target,
Jamie Madill4f6592f2018-11-27 16:37:45 -05004041 level, area, format, type,
4042 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004043}
4044
Brandon Jones59770802018-04-02 13:18:42 -07004045void Context::texSubImage2DRobust(TextureTarget target,
4046 GLint level,
4047 GLint xoffset,
4048 GLint yoffset,
4049 GLsizei width,
4050 GLsizei height,
4051 GLenum format,
4052 GLenum type,
4053 GLsizei bufSize,
4054 const void *pixels)
4055{
4056 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4057}
4058
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004059void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004060 GLint level,
4061 GLint xoffset,
4062 GLint yoffset,
4063 GLint zoffset,
4064 GLsizei width,
4065 GLsizei height,
4066 GLsizei depth,
4067 GLenum format,
4068 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004069 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004070{
4071 // Zero sized uploads are valid but no-ops
4072 if (width == 0 || height == 0 || depth == 0)
4073 {
4074 return;
4075 }
4076
Jamie Madillbc918e72018-03-08 09:47:21 -05004077 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004078
4079 Box area(xoffset, yoffset, zoffset, width, height, depth);
4080 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004081
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004082 gl::Buffer *unpackBuffer = mState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004083
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004084 ANGLE_CONTEXT_TRY(texture->setSubImage(this, mState.getUnpackState(), unpackBuffer,
Jamie Madill4f6592f2018-11-27 16:37:45 -05004085 NonCubeTextureTypeToTarget(target), level, area, format,
4086 type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004087}
4088
Brandon Jones59770802018-04-02 13:18:42 -07004089void Context::texSubImage3DRobust(TextureType target,
4090 GLint level,
4091 GLint xoffset,
4092 GLint yoffset,
4093 GLint zoffset,
4094 GLsizei width,
4095 GLsizei height,
4096 GLsizei depth,
4097 GLenum format,
4098 GLenum type,
4099 GLsizei bufSize,
4100 const void *pixels)
4101{
4102 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4103 pixels);
4104}
4105
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004106void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004107 GLint level,
4108 GLenum internalformat,
4109 GLsizei width,
4110 GLsizei height,
4111 GLint border,
4112 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004113 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004114{
Jamie Madillbc918e72018-03-08 09:47:21 -05004115 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004116
4117 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004118 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004119 ANGLE_CONTEXT_TRY(texture->setCompressedImage(this, mState.getUnpackState(), target, level,
Jamie Madill4f6592f2018-11-27 16:37:45 -05004120 internalformat, size, imageSize,
4121 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004122}
4123
Brandon Jones59770802018-04-02 13:18:42 -07004124void Context::compressedTexImage2DRobust(TextureTarget target,
4125 GLint level,
4126 GLenum internalformat,
4127 GLsizei width,
4128 GLsizei height,
4129 GLint border,
4130 GLsizei imageSize,
4131 GLsizei dataSize,
4132 const GLvoid *data)
4133{
4134 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4135}
4136
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004137void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004138 GLint level,
4139 GLenum internalformat,
4140 GLsizei width,
4141 GLsizei height,
4142 GLsizei depth,
4143 GLint border,
4144 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004145 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004146{
Jamie Madillbc918e72018-03-08 09:47:21 -05004147 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004148
4149 Extents size(width, height, depth);
4150 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004151 ANGLE_CONTEXT_TRY(texture->setCompressedImage(
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004152 this, mState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004153 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004154}
4155
Brandon Jones59770802018-04-02 13:18:42 -07004156void Context::compressedTexImage3DRobust(TextureType target,
4157 GLint level,
4158 GLenum internalformat,
4159 GLsizei width,
4160 GLsizei height,
4161 GLsizei depth,
4162 GLint border,
4163 GLsizei imageSize,
4164 GLsizei dataSize,
4165 const GLvoid *data)
4166{
4167 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4168 data);
4169}
4170
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004171void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004172 GLint level,
4173 GLint xoffset,
4174 GLint yoffset,
4175 GLsizei width,
4176 GLsizei height,
4177 GLenum format,
4178 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004179 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004180{
Jamie Madillbc918e72018-03-08 09:47:21 -05004181 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004182
4183 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004184 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004185 ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(this, mState.getUnpackState(), target, level,
Jamie Madill4f6592f2018-11-27 16:37:45 -05004186 area, format, imageSize,
4187 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004188}
4189
Brandon Jones59770802018-04-02 13:18:42 -07004190void Context::compressedTexSubImage2DRobust(TextureTarget target,
4191 GLint level,
4192 GLint xoffset,
4193 GLint yoffset,
4194 GLsizei width,
4195 GLsizei height,
4196 GLenum format,
4197 GLsizei imageSize,
4198 GLsizei dataSize,
4199 const GLvoid *data)
4200{
4201 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4202 data);
4203}
4204
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004205void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004206 GLint level,
4207 GLint xoffset,
4208 GLint yoffset,
4209 GLint zoffset,
4210 GLsizei width,
4211 GLsizei height,
4212 GLsizei depth,
4213 GLenum format,
4214 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004215 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004216{
4217 // Zero sized uploads are valid but no-ops
4218 if (width == 0 || height == 0)
4219 {
4220 return;
4221 }
4222
Jamie Madillbc918e72018-03-08 09:47:21 -05004223 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004224
4225 Box area(xoffset, yoffset, zoffset, width, height, depth);
4226 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004227 ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004228 this, mState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004229 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004230}
4231
Brandon Jones59770802018-04-02 13:18:42 -07004232void Context::compressedTexSubImage3DRobust(TextureType target,
4233 GLint level,
4234 GLint xoffset,
4235 GLint yoffset,
4236 GLint zoffset,
4237 GLsizei width,
4238 GLsizei height,
4239 GLsizei depth,
4240 GLenum format,
4241 GLsizei imageSize,
4242 GLsizei dataSize,
4243 const GLvoid *data)
4244{
4245 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4246 imageSize, data);
4247}
4248
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004249void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004250{
4251 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004252 ANGLE_CONTEXT_TRY(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004253}
4254
Jamie Madill007530e2017-12-28 14:27:04 -05004255void Context::copyTexture(GLuint sourceId,
4256 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004257 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004258 GLuint destId,
4259 GLint destLevel,
4260 GLint internalFormat,
4261 GLenum destType,
4262 GLboolean unpackFlipY,
4263 GLboolean unpackPremultiplyAlpha,
4264 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004265{
Jamie Madillbc918e72018-03-08 09:47:21 -05004266 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004267
4268 gl::Texture *sourceTexture = getTexture(sourceId);
4269 gl::Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004270 ANGLE_CONTEXT_TRY(
4271 destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType, sourceLevel,
4272 ConvertToBool(unpackFlipY), ConvertToBool(unpackPremultiplyAlpha),
4273 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004274}
4275
Jamie Madill007530e2017-12-28 14:27:04 -05004276void Context::copySubTexture(GLuint sourceId,
4277 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004278 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004279 GLuint destId,
4280 GLint destLevel,
4281 GLint xoffset,
4282 GLint yoffset,
4283 GLint x,
4284 GLint y,
4285 GLsizei width,
4286 GLsizei height,
4287 GLboolean unpackFlipY,
4288 GLboolean unpackPremultiplyAlpha,
4289 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004290{
4291 // Zero sized copies are valid but no-ops
4292 if (width == 0 || height == 0)
4293 {
4294 return;
4295 }
4296
Jamie Madillbc918e72018-03-08 09:47:21 -05004297 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004298
4299 gl::Texture *sourceTexture = getTexture(sourceId);
4300 gl::Texture *destTexture = getTexture(destId);
4301 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004302 Box box(x, y, 0, width, height, 1);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004303 ANGLE_CONTEXT_TRY(destTexture->copySubTexture(
4304 this, destTarget, destLevel, offset, sourceLevel, box, ConvertToBool(unpackFlipY),
4305 ConvertToBool(unpackPremultiplyAlpha), ConvertToBool(unpackUnmultiplyAlpha),
4306 sourceTexture));
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004307}
4308
4309void Context::copyTexture3D(GLuint sourceId,
4310 GLint sourceLevel,
4311 TextureTarget destTarget,
4312 GLuint destId,
4313 GLint destLevel,
4314 GLint internalFormat,
4315 GLenum destType,
4316 GLboolean unpackFlipY,
4317 GLboolean unpackPremultiplyAlpha,
4318 GLboolean unpackUnmultiplyAlpha)
4319{
4320 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4321
4322 Texture *sourceTexture = getTexture(sourceId);
4323 Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004324 ANGLE_CONTEXT_TRY(
4325 destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType, sourceLevel,
4326 ConvertToBool(unpackFlipY), ConvertToBool(unpackPremultiplyAlpha),
4327 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004328}
4329
4330void Context::copySubTexture3D(GLuint sourceId,
4331 GLint sourceLevel,
4332 TextureTarget destTarget,
4333 GLuint destId,
4334 GLint destLevel,
4335 GLint xoffset,
4336 GLint yoffset,
4337 GLint zoffset,
4338 GLint x,
4339 GLint y,
4340 GLint z,
4341 GLsizei width,
4342 GLsizei height,
4343 GLsizei depth,
4344 GLboolean unpackFlipY,
4345 GLboolean unpackPremultiplyAlpha,
4346 GLboolean unpackUnmultiplyAlpha)
4347{
4348 // Zero sized copies are valid but no-ops
4349 if (width == 0 || height == 0 || depth == 0)
4350 {
4351 return;
4352 }
4353
4354 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4355
4356 Texture *sourceTexture = getTexture(sourceId);
4357 Texture *destTexture = getTexture(destId);
4358 Offset offset(xoffset, yoffset, zoffset);
4359 Box box(x, y, z, width, height, depth);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004360 ANGLE_CONTEXT_TRY(destTexture->copySubTexture(
4361 this, destTarget, destLevel, offset, sourceLevel, box, ConvertToBool(unpackFlipY),
4362 ConvertToBool(unpackPremultiplyAlpha), ConvertToBool(unpackUnmultiplyAlpha),
4363 sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004364}
4365
Jamie Madill007530e2017-12-28 14:27:04 -05004366void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004367{
Jamie Madillbc918e72018-03-08 09:47:21 -05004368 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004369
4370 gl::Texture *sourceTexture = getTexture(sourceId);
4371 gl::Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004372 ANGLE_CONTEXT_TRY(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004373}
4374
Corentin Wallez336129f2017-10-17 15:55:40 -04004375void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004376{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004377 Buffer *buffer = mState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004378 ASSERT(buffer);
4379
Geoff Lang496c02d2016-10-20 11:38:11 -07004380 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004381}
4382
Brandon Jones59770802018-04-02 13:18:42 -07004383void Context::getBufferPointervRobust(BufferBinding target,
4384 GLenum pname,
4385 GLsizei bufSize,
4386 GLsizei *length,
4387 void **params)
4388{
4389 getBufferPointerv(target, pname, params);
4390}
4391
Corentin Wallez336129f2017-10-17 15:55:40 -04004392void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004393{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004394 Buffer *buffer = mState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004395 ASSERT(buffer);
4396
Jamie Madill7c985f52018-11-29 18:16:17 -05004397 if (buffer->map(this, access) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004398 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004399 return nullptr;
4400 }
4401
4402 return buffer->getMapPointer();
4403}
4404
Corentin Wallez336129f2017-10-17 15:55:40 -04004405GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004406{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004407 Buffer *buffer = mState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004408 ASSERT(buffer);
4409
4410 GLboolean result;
Jamie Madill7c985f52018-11-29 18:16:17 -05004411 if (buffer->unmap(this, &result) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004412 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004413 return GL_FALSE;
4414 }
4415
4416 return result;
4417}
4418
Corentin Wallez336129f2017-10-17 15:55:40 -04004419void *Context::mapBufferRange(BufferBinding target,
4420 GLintptr offset,
4421 GLsizeiptr length,
4422 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004423{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004424 Buffer *buffer = mState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004425 ASSERT(buffer);
4426
Jamie Madill7c985f52018-11-29 18:16:17 -05004427 if (buffer->mapRange(this, offset, length, access) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004428 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004429 return nullptr;
4430 }
4431
4432 return buffer->getMapPointer();
4433}
4434
Corentin Wallez336129f2017-10-17 15:55:40 -04004435void Context::flushMappedBufferRange(BufferBinding /*target*/,
4436 GLintptr /*offset*/,
4437 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004438{
4439 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4440}
4441
Jamie Madill526392d2018-11-16 09:35:14 -05004442angle::Result Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004443{
Geoff Langa8cb2872018-03-09 16:09:40 -05004444 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004445}
4446
Jamie Madill526392d2018-11-16 09:35:14 -05004447angle::Result Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004448{
Geoff Langa8cb2872018-03-09 16:09:40 -05004449 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004450}
4451
Jamie Madill526392d2018-11-16 09:35:14 -05004452angle::Result Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004453{
Geoff Langa8cb2872018-03-09 16:09:40 -05004454 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004455}
4456
Jamie Madill526392d2018-11-16 09:35:14 -05004457angle::Result Context::syncStateForPathOperation()
Geoff Lang9bf86f02018-07-26 11:46:34 -04004458{
4459 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4460
4461 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4462 ANGLE_TRY(syncDirtyBits());
4463
Jamie Madill7c985f52018-11-29 18:16:17 -05004464 return angle::Result::Continue;
Geoff Lang9bf86f02018-07-26 11:46:34 -04004465}
4466
Jiajia Qin5451d532017-11-16 17:16:34 +08004467void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4468{
4469 UNIMPLEMENTED();
4470}
4471
Jamie Madillc20ab272016-06-09 07:20:46 -07004472void Context::activeTexture(GLenum texture)
4473{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004474 mState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004475}
4476
Jamie Madill876429b2017-04-20 15:46:24 -04004477void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004478{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004479 mState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004480}
4481
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004482void Context::blendEquation(GLenum mode)
4483{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004484 mState.setBlendEquation(mode, mode);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004485}
4486
Jamie Madillc20ab272016-06-09 07:20:46 -07004487void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4488{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004489 mState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004490}
4491
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004492void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4493{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004494 mState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004495}
4496
Jamie Madillc20ab272016-06-09 07:20:46 -07004497void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4498{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004499 mState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004500}
4501
Jamie Madill876429b2017-04-20 15:46:24 -04004502void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004503{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004504 mState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004505}
4506
Jamie Madill876429b2017-04-20 15:46:24 -04004507void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004508{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004509 mState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004510}
4511
4512void Context::clearStencil(GLint s)
4513{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004514 mState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004515}
4516
4517void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4518{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004519 mState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4520 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004521}
4522
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004523void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004524{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004525 mState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004526}
4527
4528void Context::depthFunc(GLenum func)
4529{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004530 mState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004531}
4532
4533void Context::depthMask(GLboolean flag)
4534{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004535 mState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004536}
4537
Jamie Madill876429b2017-04-20 15:46:24 -04004538void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004539{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004540 mState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004541}
4542
4543void Context::disable(GLenum cap)
4544{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004545 mState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004546 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004547}
4548
4549void Context::disableVertexAttribArray(GLuint index)
4550{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004551 mState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004552 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004553}
4554
4555void Context::enable(GLenum cap)
4556{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004557 mState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004558 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004559}
4560
4561void Context::enableVertexAttribArray(GLuint index)
4562{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004563 mState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004564 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004565}
4566
4567void Context::frontFace(GLenum mode)
4568{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004569 mState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004570}
4571
4572void Context::hint(GLenum target, GLenum mode)
4573{
4574 switch (target)
4575 {
4576 case GL_GENERATE_MIPMAP_HINT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004577 mState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004578 break;
4579
4580 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004581 mState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004582 break;
4583
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004584 case GL_PERSPECTIVE_CORRECTION_HINT:
4585 case GL_POINT_SMOOTH_HINT:
4586 case GL_LINE_SMOOTH_HINT:
4587 case GL_FOG_HINT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004588 mState.gles1().setHint(target, mode);
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004589 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004590 default:
4591 UNREACHABLE();
4592 return;
4593 }
4594}
4595
4596void Context::lineWidth(GLfloat width)
4597{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004598 mState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004599}
4600
4601void Context::pixelStorei(GLenum pname, GLint param)
4602{
4603 switch (pname)
4604 {
4605 case GL_UNPACK_ALIGNMENT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004606 mState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004607 break;
4608
4609 case GL_PACK_ALIGNMENT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004610 mState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004611 break;
4612
4613 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004614 mState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004615 break;
4616
4617 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004618 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004619 mState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004620 break;
4621
4622 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004623 ASSERT(getClientMajorVersion() >= 3);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004624 mState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004625 break;
4626
4627 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004628 ASSERT(getClientMajorVersion() >= 3);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004629 mState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004630 break;
4631
4632 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004633 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004634 mState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004635 break;
4636
4637 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004638 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004639 mState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004640 break;
4641
4642 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004643 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004644 mState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004645 break;
4646
4647 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004648 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004649 mState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004650 break;
4651
4652 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004653 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004654 mState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004655 break;
4656
4657 default:
4658 UNREACHABLE();
4659 return;
4660 }
4661}
4662
4663void Context::polygonOffset(GLfloat factor, GLfloat units)
4664{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004665 mState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004666}
4667
Jamie Madill876429b2017-04-20 15:46:24 -04004668void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004669{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004670 mState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004671}
4672
Jiawei Shaodb342272017-09-27 10:21:45 +08004673void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4674{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004675 mState.setSampleMaskParams(maskNumber, mask);
Jiawei Shaodb342272017-09-27 10:21:45 +08004676}
4677
Jamie Madillc20ab272016-06-09 07:20:46 -07004678void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4679{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004680 mState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004681}
4682
4683void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4684{
4685 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4686 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004687 mState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004688 }
4689
4690 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4691 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004692 mState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004693 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004694
4695 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004696}
4697
4698void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4699{
4700 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4701 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004702 mState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004703 }
4704
4705 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4706 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004707 mState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004708 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004709
4710 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004711}
4712
4713void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4714{
4715 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4716 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004717 mState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004718 }
4719
4720 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4721 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004722 mState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004723 }
4724}
4725
4726void Context::vertexAttrib1f(GLuint index, GLfloat x)
4727{
4728 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004729 mState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004730 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004731}
4732
4733void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4734{
4735 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004736 mState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004737 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004738}
4739
4740void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4741{
4742 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004743 mState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004744 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004745}
4746
4747void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
4748{
4749 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004750 mState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004751 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004752}
4753
4754void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4755{
4756 GLfloat vals[4] = {x, y, z, 1};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004757 mState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004758 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004759}
4760
4761void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
4762{
4763 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004764 mState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004765 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004766}
4767
4768void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4769{
4770 GLfloat vals[4] = {x, y, z, w};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004771 mState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004772 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004773}
4774
4775void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
4776{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004777 mState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004778 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004779}
4780
4781void Context::vertexAttribPointer(GLuint index,
4782 GLint size,
4783 GLenum type,
4784 GLboolean normalized,
4785 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004786 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004787{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004788 mState.setVertexAttribPointer(this, index, mState.getTargetBuffer(BufferBinding::Array), size,
4789 type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004790 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004791}
4792
Shao80957d92017-02-20 21:25:59 +08004793void Context::vertexAttribFormat(GLuint attribIndex,
4794 GLint size,
4795 GLenum type,
4796 GLboolean normalized,
4797 GLuint relativeOffset)
4798{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004799 mState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
4800 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004801 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004802}
4803
4804void Context::vertexAttribIFormat(GLuint attribIndex,
4805 GLint size,
4806 GLenum type,
4807 GLuint relativeOffset)
4808{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004809 mState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004810 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004811}
4812
4813void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4814{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004815 mState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004816 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004817}
4818
Jiajia Qin5451d532017-11-16 17:16:34 +08004819void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004820{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004821 mState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004822 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004823}
4824
Jamie Madillc20ab272016-06-09 07:20:46 -07004825void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4826{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004827 mState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004828}
4829
4830void Context::vertexAttribIPointer(GLuint index,
4831 GLint size,
4832 GLenum type,
4833 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004834 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004835{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004836 mState.setVertexAttribPointer(this, index, mState.getTargetBuffer(BufferBinding::Array), size,
4837 type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004838 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004839}
4840
4841void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4842{
4843 GLint vals[4] = {x, y, z, w};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004844 mState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004845 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004846}
4847
4848void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4849{
4850 GLuint vals[4] = {x, y, z, w};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004851 mState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004852 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004853}
4854
4855void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4856{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004857 mState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004858 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004859}
4860
4861void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4862{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004863 mState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004864 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004865}
4866
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004867void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4868{
4869 const VertexAttribCurrentValueData &currentValues =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004870 getState().getVertexAttribCurrentValue(index);
4871 const VertexArray *vao = getState().getVertexArray();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004872 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4873 currentValues, pname, params);
4874}
4875
Brandon Jones59770802018-04-02 13:18:42 -07004876void Context::getVertexAttribivRobust(GLuint index,
4877 GLenum pname,
4878 GLsizei bufSize,
4879 GLsizei *length,
4880 GLint *params)
4881{
4882 getVertexAttribiv(index, pname, params);
4883}
4884
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004885void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4886{
4887 const VertexAttribCurrentValueData &currentValues =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004888 getState().getVertexAttribCurrentValue(index);
4889 const VertexArray *vao = getState().getVertexArray();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004890 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4891 currentValues, pname, params);
4892}
4893
Brandon Jones59770802018-04-02 13:18:42 -07004894void Context::getVertexAttribfvRobust(GLuint index,
4895 GLenum pname,
4896 GLsizei bufSize,
4897 GLsizei *length,
4898 GLfloat *params)
4899{
4900 getVertexAttribfv(index, pname, params);
4901}
4902
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004903void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4904{
4905 const VertexAttribCurrentValueData &currentValues =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004906 getState().getVertexAttribCurrentValue(index);
4907 const VertexArray *vao = getState().getVertexArray();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004908 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4909 currentValues, pname, params);
4910}
4911
Brandon Jones59770802018-04-02 13:18:42 -07004912void Context::getVertexAttribIivRobust(GLuint index,
4913 GLenum pname,
4914 GLsizei bufSize,
4915 GLsizei *length,
4916 GLint *params)
4917{
4918 getVertexAttribIiv(index, pname, params);
4919}
4920
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004921void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4922{
4923 const VertexAttribCurrentValueData &currentValues =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004924 getState().getVertexAttribCurrentValue(index);
4925 const VertexArray *vao = getState().getVertexArray();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004926 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4927 currentValues, pname, params);
4928}
4929
Brandon Jones59770802018-04-02 13:18:42 -07004930void Context::getVertexAttribIuivRobust(GLuint index,
4931 GLenum pname,
4932 GLsizei bufSize,
4933 GLsizei *length,
4934 GLuint *params)
4935{
4936 getVertexAttribIuiv(index, pname, params);
4937}
4938
Jamie Madill876429b2017-04-20 15:46:24 -04004939void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004940{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004941 const VertexAttribute &attrib = getState().getVertexArray()->getVertexAttribute(index);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004942 QueryVertexAttribPointerv(attrib, pname, pointer);
4943}
4944
Brandon Jones59770802018-04-02 13:18:42 -07004945void Context::getVertexAttribPointervRobust(GLuint index,
4946 GLenum pname,
4947 GLsizei bufSize,
4948 GLsizei *length,
4949 void **pointer)
4950{
4951 getVertexAttribPointerv(index, pname, pointer);
4952}
4953
Jamie Madillc20ab272016-06-09 07:20:46 -07004954void Context::debugMessageControl(GLenum source,
4955 GLenum type,
4956 GLenum severity,
4957 GLsizei count,
4958 const GLuint *ids,
4959 GLboolean enabled)
4960{
4961 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004962 mState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
4963 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004964}
4965
4966void Context::debugMessageInsert(GLenum source,
4967 GLenum type,
4968 GLuint id,
4969 GLenum severity,
4970 GLsizei length,
4971 const GLchar *buf)
4972{
4973 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004974 mState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004975}
4976
4977void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4978{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004979 mState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004980}
4981
4982GLuint Context::getDebugMessageLog(GLuint count,
4983 GLsizei bufSize,
4984 GLenum *sources,
4985 GLenum *types,
4986 GLuint *ids,
4987 GLenum *severities,
4988 GLsizei *lengths,
4989 GLchar *messageLog)
4990{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004991 return static_cast<GLuint>(mState.getDebug().getMessages(count, bufSize, sources, types, ids,
4992 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004993}
4994
4995void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4996{
4997 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004998 mState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004999 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07005000}
5001
5002void Context::popDebugGroup()
5003{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005004 mState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05005005 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07005006}
5007
Corentin Wallez336129f2017-10-17 15:55:40 -04005008void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005009{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005010 Buffer *buffer = mState.getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04005011 ASSERT(buffer);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005012 ANGLE_CONTEXT_TRY(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005013}
5014
Corentin Wallez336129f2017-10-17 15:55:40 -04005015void Context::bufferSubData(BufferBinding target,
5016 GLintptr offset,
5017 GLsizeiptr size,
5018 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005019{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005020 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005021 {
5022 return;
5023 }
5024
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005025 Buffer *buffer = mState.getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04005026 ASSERT(buffer);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005027 ANGLE_CONTEXT_TRY(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005028}
5029
Jamie Madillef300b12016-10-07 15:12:09 -04005030void Context::attachShader(GLuint program, GLuint shader)
5031{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005032 Program *programObject = mState.mShaderProgramManager->getProgram(program);
5033 Shader *shaderObject = mState.mShaderProgramManager->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005034 ASSERT(programObject && shaderObject);
5035 programObject->attachShader(shaderObject);
5036}
5037
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005038const Workarounds &Context::getWorkarounds() const
5039{
5040 return mWorkarounds;
5041}
5042
Corentin Wallez336129f2017-10-17 15:55:40 -04005043void Context::copyBufferSubData(BufferBinding readTarget,
5044 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005045 GLintptr readOffset,
5046 GLintptr writeOffset,
5047 GLsizeiptr size)
5048{
5049 // if size is zero, the copy is a successful no-op
5050 if (size == 0)
5051 {
5052 return;
5053 }
5054
5055 // TODO(jmadill): cache these.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005056 Buffer *readBuffer = mState.getTargetBuffer(readTarget);
5057 Buffer *writeBuffer = mState.getTargetBuffer(writeTarget);
Jamie Madillb0817d12016-11-01 15:48:31 -04005058
Jamie Madill4f6592f2018-11-27 16:37:45 -05005059 ANGLE_CONTEXT_TRY(
5060 writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005061}
5062
Jamie Madill01a80ee2016-11-07 12:06:18 -05005063void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5064{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005065 // Ideally we could share the program query with the validation layer if possible.
5066 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005067 ASSERT(programObject);
5068 programObject->bindAttributeLocation(index, name);
5069}
5070
Corentin Wallez336129f2017-10-17 15:55:40 -04005071void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005072{
5073 bindBufferRange(target, index, buffer, 0, 0);
5074}
5075
Corentin Wallez336129f2017-10-17 15:55:40 -04005076void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005077 GLuint index,
5078 GLuint buffer,
5079 GLintptr offset,
5080 GLsizeiptr size)
5081{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005082 Buffer *object = mState.mBufferManager->checkBufferAllocation(mImplementation.get(), buffer);
5083 ANGLE_CONTEXT_TRY(mState.setIndexedBufferBinding(this, target, index, object, offset, size));
Jamie Madill6d32cef2018-08-14 02:34:28 -04005084 if (target == BufferBinding::Uniform)
5085 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005086 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005087 mStateCache.onUniformBufferStateChange(this);
5088 }
5089 else
5090 {
5091 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005092 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005093}
5094
Jamie Madill01a80ee2016-11-07 12:06:18 -05005095void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5096{
5097 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5098 {
5099 bindReadFramebuffer(framebuffer);
5100 }
5101
5102 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5103 {
5104 bindDrawFramebuffer(framebuffer);
5105 }
5106}
5107
5108void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5109{
5110 ASSERT(target == GL_RENDERBUFFER);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005111 Renderbuffer *object = mState.mRenderbufferManager->checkRenderbufferAllocation(
5112 mImplementation.get(), renderbuffer);
5113 mState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005114}
5115
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005116void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005117 GLsizei samples,
5118 GLenum internalformat,
5119 GLsizei width,
5120 GLsizei height,
5121 GLboolean fixedsamplelocations)
5122{
5123 Extents size(width, height, 1);
5124 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005125 ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
5126 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005127}
5128
Olli Etuaho89664842018-08-24 14:45:36 +03005129void Context::texStorage3DMultisample(TextureType target,
5130 GLsizei samples,
5131 GLenum internalformat,
5132 GLsizei width,
5133 GLsizei height,
5134 GLsizei depth,
5135 GLboolean fixedsamplelocations)
5136{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005137 Extents size(width, height, depth);
5138 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005139 ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
5140 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005141}
5142
JiangYizhoubddc46b2016-12-09 09:50:51 +08005143void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5144{
JiangYizhou5b03f472017-01-09 10:22:53 +08005145 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5146 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005147 ANGLE_CONTEXT_TRY(mState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
5148 const Framebuffer *framebuffer = mState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005149
5150 switch (pname)
5151 {
5152 case GL_SAMPLE_POSITION:
Jamie Madill4f6592f2018-11-27 16:37:45 -05005153 ANGLE_CONTEXT_TRY(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005154 break;
5155 default:
5156 UNREACHABLE();
5157 }
5158}
5159
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005160void Context::getMultisamplefvRobust(GLenum pname,
5161 GLuint index,
5162 GLsizei bufSize,
5163 GLsizei *length,
5164 GLfloat *val)
5165{
5166 UNIMPLEMENTED();
5167}
5168
Jamie Madille8fb6402017-02-14 17:56:40 -05005169void Context::renderbufferStorage(GLenum target,
5170 GLenum internalformat,
5171 GLsizei width,
5172 GLsizei height)
5173{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005174 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5175 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5176
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005177 Renderbuffer *renderbuffer = mState.getCurrentRenderbuffer();
Jamie Madill4f6592f2018-11-27 16:37:45 -05005178 ANGLE_CONTEXT_TRY(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005179}
5180
5181void Context::renderbufferStorageMultisample(GLenum target,
5182 GLsizei samples,
5183 GLenum internalformat,
5184 GLsizei width,
5185 GLsizei height)
5186{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005187 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5188 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005189
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005190 Renderbuffer *renderbuffer = mState.getCurrentRenderbuffer();
Jamie Madill4f6592f2018-11-27 16:37:45 -05005191 ANGLE_CONTEXT_TRY(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005192 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005193}
5194
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005195void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5196{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005197 const Sync *syncObject = getSync(sync);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005198 ANGLE_CONTEXT_TRY(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005199}
5200
JiangYizhoue18e6392017-02-20 10:32:23 +08005201void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5202{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005203 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
JiangYizhoue18e6392017-02-20 10:32:23 +08005204 QueryFramebufferParameteriv(framebuffer, pname, params);
5205}
5206
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005207void Context::getFramebufferParameterivRobust(GLenum target,
5208 GLenum pname,
5209 GLsizei bufSize,
5210 GLsizei *length,
5211 GLint *params)
5212{
5213 UNIMPLEMENTED();
5214}
5215
Jiajia Qin5451d532017-11-16 17:16:34 +08005216void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005217{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005218 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005219 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005220}
5221
Jamie Madilldec86232018-07-11 09:01:18 -04005222bool Context::getScratchBuffer(size_t requstedSizeBytes,
5223 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005224{
Jamie Madilldec86232018-07-11 09:01:18 -04005225 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005226}
5227
Jamie Madilldec86232018-07-11 09:01:18 -04005228bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5229 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005230{
Jamie Madilldec86232018-07-11 09:01:18 -04005231 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005232}
5233
Xinghua Cao2b396592017-03-29 15:36:04 +08005234void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5235{
5236 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5237 {
5238 return;
5239 }
5240
Xinghua Cao10a4d432017-11-28 14:46:26 +08005241 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill4f6592f2018-11-27 16:37:45 -05005242 ANGLE_CONTEXT_TRY(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005243}
5244
Jiajia Qin5451d532017-11-16 17:16:34 +08005245void Context::dispatchComputeIndirect(GLintptr indirect)
5246{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005247 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill4f6592f2018-11-27 16:37:45 -05005248 ANGLE_CONTEXT_TRY(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005249}
5250
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005251void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005252 GLsizei levels,
5253 GLenum internalFormat,
5254 GLsizei width,
5255 GLsizei height)
5256{
5257 Extents size(width, height, 1);
5258 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005259 ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005260}
5261
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005262void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005263 GLsizei levels,
5264 GLenum internalFormat,
5265 GLsizei width,
5266 GLsizei height,
5267 GLsizei depth)
5268{
5269 Extents size(width, height, depth);
5270 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005271 ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005272}
5273
Jiajia Qin5451d532017-11-16 17:16:34 +08005274void Context::memoryBarrier(GLbitfield barriers)
5275{
Jamie Madill4f6592f2018-11-27 16:37:45 -05005276 ANGLE_CONTEXT_TRY(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005277}
5278
5279void Context::memoryBarrierByRegion(GLbitfield barriers)
5280{
Jamie Madill4f6592f2018-11-27 16:37:45 -05005281 ANGLE_CONTEXT_TRY(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005282}
5283
Austin Eng1bf18ce2018-10-19 15:34:02 -07005284void Context::multiDrawArrays(PrimitiveMode mode,
5285 const GLint *firsts,
5286 const GLsizei *counts,
5287 GLsizei drawcount)
5288{
5289 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005290 Program *programObject = mState.getLinkedProgram(this);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005291 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5292 if (hasDrawID)
5293 {
5294 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5295 {
5296 if (noopDraw(mode, counts[drawID]))
5297 {
5298 continue;
5299 }
5300 programObject->setDrawIDUniform(drawID);
5301 ANGLE_CONTEXT_TRY(
5302 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005303 MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005304 }
5305 }
5306 else
5307 {
5308 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5309 {
5310 if (noopDraw(mode, counts[drawID]))
5311 {
5312 continue;
5313 }
5314 ANGLE_CONTEXT_TRY(
5315 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005316 MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005317 }
5318 }
5319}
5320
5321void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5322 const GLint *firsts,
5323 const GLsizei *counts,
5324 const GLsizei *instanceCounts,
5325 GLsizei drawcount)
5326{
5327 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005328 Program *programObject = mState.getLinkedProgram(this);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005329 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5330 if (hasDrawID)
5331 {
5332 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5333 {
5334 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5335 {
5336 continue;
5337 }
5338 programObject->setDrawIDUniform(drawID);
5339 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5340 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005341 MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005342 }
5343 }
5344 else
5345 {
5346 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5347 {
5348 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5349 {
5350 continue;
5351 }
5352 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5353 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005354 MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005355 }
5356 }
5357}
5358
5359void Context::multiDrawElements(PrimitiveMode mode,
5360 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05005361 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08005362 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07005363 GLsizei drawcount)
5364{
5365 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005366 Program *programObject = mState.getLinkedProgram(this);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005367 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5368 if (hasDrawID)
5369 {
5370 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5371 {
5372 if (noopDraw(mode, counts[drawID]))
5373 {
5374 continue;
5375 }
5376 programObject->setDrawIDUniform(drawID);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005377 ANGLE_CONTEXT_TRY(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005378 mImplementation->drawElements(this, mode, counts[drawID], type, indices[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005379 }
5380 }
5381 else
5382 {
5383 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5384 {
5385 if (noopDraw(mode, counts[drawID]))
5386 {
5387 continue;
5388 }
Austin Eng1bf18ce2018-10-19 15:34:02 -07005389 ANGLE_CONTEXT_TRY(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005390 mImplementation->drawElements(this, mode, counts[drawID], type, indices[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005391 }
5392 }
5393}
5394
5395void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5396 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05005397 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08005398 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07005399 const GLsizei *instanceCounts,
5400 GLsizei drawcount)
5401{
5402 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005403 Program *programObject = mState.getLinkedProgram(this);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005404 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5405 if (hasDrawID)
5406 {
5407 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5408 {
5409 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5410 {
5411 continue;
5412 }
5413 programObject->setDrawIDUniform(drawID);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005414 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005415 this, mode, counts[drawID], type, indices[drawID], instanceCounts[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005416 }
5417 }
5418 else
5419 {
5420 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5421 {
5422 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5423 {
5424 continue;
5425 }
Austin Eng1bf18ce2018-10-19 15:34:02 -07005426 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005427 this, mode, counts[drawID], type, indices[drawID], instanceCounts[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005428 }
5429 }
5430}
5431
Jamie Madillc1d770e2017-04-13 17:31:24 -04005432GLenum Context::checkFramebufferStatus(GLenum target)
5433{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005434 Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005435 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005436 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005437}
5438
5439void Context::compileShader(GLuint shader)
5440{
5441 Shader *shaderObject = GetValidShader(this, shader);
5442 if (!shaderObject)
5443 {
5444 return;
5445 }
5446 shaderObject->compile(this);
5447}
5448
5449void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5450{
5451 for (int i = 0; i < n; i++)
5452 {
5453 deleteBuffer(buffers[i]);
5454 }
5455}
5456
5457void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5458{
5459 for (int i = 0; i < n; i++)
5460 {
5461 if (framebuffers[i] != 0)
5462 {
5463 deleteFramebuffer(framebuffers[i]);
5464 }
5465 }
5466}
5467
5468void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5469{
5470 for (int i = 0; i < n; i++)
5471 {
5472 deleteRenderbuffer(renderbuffers[i]);
5473 }
5474}
5475
5476void Context::deleteTextures(GLsizei n, const GLuint *textures)
5477{
5478 for (int i = 0; i < n; i++)
5479 {
5480 if (textures[i] != 0)
5481 {
5482 deleteTexture(textures[i]);
5483 }
5484 }
5485}
5486
5487void Context::detachShader(GLuint program, GLuint shader)
5488{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005489 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005490 ASSERT(programObject);
5491
5492 Shader *shaderObject = getShader(shader);
5493 ASSERT(shaderObject);
5494
5495 programObject->detachShader(this, shaderObject);
5496}
5497
5498void Context::genBuffers(GLsizei n, GLuint *buffers)
5499{
5500 for (int i = 0; i < n; i++)
5501 {
5502 buffers[i] = createBuffer();
5503 }
5504}
5505
5506void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5507{
5508 for (int i = 0; i < n; i++)
5509 {
5510 framebuffers[i] = createFramebuffer();
5511 }
5512}
5513
5514void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5515{
5516 for (int i = 0; i < n; i++)
5517 {
5518 renderbuffers[i] = createRenderbuffer();
5519 }
5520}
5521
5522void Context::genTextures(GLsizei n, GLuint *textures)
5523{
5524 for (int i = 0; i < n; i++)
5525 {
5526 textures[i] = createTexture();
5527 }
5528}
5529
5530void Context::getActiveAttrib(GLuint program,
5531 GLuint index,
5532 GLsizei bufsize,
5533 GLsizei *length,
5534 GLint *size,
5535 GLenum *type,
5536 GLchar *name)
5537{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005538 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005539 ASSERT(programObject);
5540 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5541}
5542
5543void Context::getActiveUniform(GLuint program,
5544 GLuint index,
5545 GLsizei bufsize,
5546 GLsizei *length,
5547 GLint *size,
5548 GLenum *type,
5549 GLchar *name)
5550{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005551 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005552 ASSERT(programObject);
5553 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5554}
5555
5556void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5557{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005558 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005559 ASSERT(programObject);
5560 programObject->getAttachedShaders(maxcount, count, shaders);
5561}
5562
5563GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5564{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005565 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005566 ASSERT(programObject);
5567 return programObject->getAttributeLocation(name);
5568}
5569
5570void Context::getBooleanv(GLenum pname, GLboolean *params)
5571{
5572 GLenum nativeType;
5573 unsigned int numParams = 0;
5574 getQueryParameterInfo(pname, &nativeType, &numParams);
5575
5576 if (nativeType == GL_BOOL)
5577 {
5578 getBooleanvImpl(pname, params);
5579 }
5580 else
5581 {
5582 CastStateValues(this, nativeType, pname, numParams, params);
5583 }
5584}
5585
Brandon Jones59770802018-04-02 13:18:42 -07005586void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5587{
5588 getBooleanv(pname, params);
5589}
5590
Jamie Madillc1d770e2017-04-13 17:31:24 -04005591void Context::getFloatv(GLenum pname, GLfloat *params)
5592{
5593 GLenum nativeType;
5594 unsigned int numParams = 0;
5595 getQueryParameterInfo(pname, &nativeType, &numParams);
5596
5597 if (nativeType == GL_FLOAT)
5598 {
5599 getFloatvImpl(pname, params);
5600 }
5601 else
5602 {
5603 CastStateValues(this, nativeType, pname, numParams, params);
5604 }
5605}
5606
Brandon Jones59770802018-04-02 13:18:42 -07005607void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5608{
5609 getFloatv(pname, params);
5610}
5611
Jamie Madillc1d770e2017-04-13 17:31:24 -04005612void Context::getIntegerv(GLenum pname, GLint *params)
5613{
5614 GLenum nativeType;
5615 unsigned int numParams = 0;
5616 getQueryParameterInfo(pname, &nativeType, &numParams);
5617
5618 if (nativeType == GL_INT)
5619 {
5620 getIntegervImpl(pname, params);
5621 }
5622 else
5623 {
5624 CastStateValues(this, nativeType, pname, numParams, params);
5625 }
5626}
5627
Brandon Jones59770802018-04-02 13:18:42 -07005628void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5629{
5630 getIntegerv(pname, data);
5631}
5632
Jamie Madillc1d770e2017-04-13 17:31:24 -04005633void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5634{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005635 // Don't resolve link if checking the link completion status.
5636 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5637 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005638 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005639 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005640}
5641
Brandon Jones59770802018-04-02 13:18:42 -07005642void Context::getProgramivRobust(GLuint program,
5643 GLenum pname,
5644 GLsizei bufSize,
5645 GLsizei *length,
5646 GLint *params)
5647{
5648 getProgramiv(program, pname, params);
5649}
5650
Jiajia Qin5451d532017-11-16 17:16:34 +08005651void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5652{
5653 UNIMPLEMENTED();
5654}
5655
Jamie Madillbe849e42017-05-02 15:49:00 -04005656void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005657{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005658 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005659 ASSERT(programObject);
5660 programObject->getInfoLog(bufsize, length, infolog);
5661}
5662
Jiajia Qin5451d532017-11-16 17:16:34 +08005663void Context::getProgramPipelineInfoLog(GLuint pipeline,
5664 GLsizei bufSize,
5665 GLsizei *length,
5666 GLchar *infoLog)
5667{
5668 UNIMPLEMENTED();
5669}
5670
Jamie Madillc1d770e2017-04-13 17:31:24 -04005671void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5672{
5673 Shader *shaderObject = getShader(shader);
5674 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005675 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005676}
5677
Brandon Jones59770802018-04-02 13:18:42 -07005678void Context::getShaderivRobust(GLuint shader,
5679 GLenum pname,
5680 GLsizei bufSize,
5681 GLsizei *length,
5682 GLint *params)
5683{
5684 getShaderiv(shader, pname, params);
5685}
5686
Jamie Madillc1d770e2017-04-13 17:31:24 -04005687void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5688{
5689 Shader *shaderObject = getShader(shader);
5690 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005691 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005692}
5693
5694void Context::getShaderPrecisionFormat(GLenum shadertype,
5695 GLenum precisiontype,
5696 GLint *range,
5697 GLint *precision)
5698{
5699 // TODO(jmadill): Compute shaders.
5700
5701 switch (shadertype)
5702 {
5703 case GL_VERTEX_SHADER:
5704 switch (precisiontype)
5705 {
5706 case GL_LOW_FLOAT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005707 mState.mCaps.vertexLowpFloat.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005708 break;
5709 case GL_MEDIUM_FLOAT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005710 mState.mCaps.vertexMediumpFloat.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005711 break;
5712 case GL_HIGH_FLOAT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005713 mState.mCaps.vertexHighpFloat.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005714 break;
5715
5716 case GL_LOW_INT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005717 mState.mCaps.vertexLowpInt.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005718 break;
5719 case GL_MEDIUM_INT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005720 mState.mCaps.vertexMediumpInt.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005721 break;
5722 case GL_HIGH_INT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005723 mState.mCaps.vertexHighpInt.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005724 break;
5725
5726 default:
5727 UNREACHABLE();
5728 return;
5729 }
5730 break;
5731
5732 case GL_FRAGMENT_SHADER:
5733 switch (precisiontype)
5734 {
5735 case GL_LOW_FLOAT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005736 mState.mCaps.fragmentLowpFloat.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005737 break;
5738 case GL_MEDIUM_FLOAT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005739 mState.mCaps.fragmentMediumpFloat.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005740 break;
5741 case GL_HIGH_FLOAT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005742 mState.mCaps.fragmentHighpFloat.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005743 break;
5744
5745 case GL_LOW_INT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005746 mState.mCaps.fragmentLowpInt.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005747 break;
5748 case GL_MEDIUM_INT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005749 mState.mCaps.fragmentMediumpInt.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005750 break;
5751 case GL_HIGH_INT:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005752 mState.mCaps.fragmentHighpInt.get(range, precision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005753 break;
5754
5755 default:
5756 UNREACHABLE();
5757 return;
5758 }
5759 break;
5760
5761 default:
5762 UNREACHABLE();
5763 return;
5764 }
5765}
5766
5767void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5768{
5769 Shader *shaderObject = getShader(shader);
5770 ASSERT(shaderObject);
5771 shaderObject->getSource(bufsize, length, source);
5772}
5773
5774void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5775{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005776 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005777 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005778 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005779}
5780
Brandon Jones59770802018-04-02 13:18:42 -07005781void Context::getUniformfvRobust(GLuint program,
5782 GLint location,
5783 GLsizei bufSize,
5784 GLsizei *length,
5785 GLfloat *params)
5786{
5787 getUniformfv(program, location, params);
5788}
5789
Jamie Madillc1d770e2017-04-13 17:31:24 -04005790void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5791{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005792 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005793 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005794 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005795}
5796
Brandon Jones59770802018-04-02 13:18:42 -07005797void Context::getUniformivRobust(GLuint program,
5798 GLint location,
5799 GLsizei bufSize,
5800 GLsizei *length,
5801 GLint *params)
5802{
5803 getUniformiv(program, location, params);
5804}
5805
Jamie Madillc1d770e2017-04-13 17:31:24 -04005806GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5807{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005808 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005809 ASSERT(programObject);
5810 return programObject->getUniformLocation(name);
5811}
5812
5813GLboolean Context::isBuffer(GLuint buffer)
5814{
5815 if (buffer == 0)
5816 {
5817 return GL_FALSE;
5818 }
5819
5820 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5821}
5822
5823GLboolean Context::isEnabled(GLenum cap)
5824{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005825 return mState.getEnableFeature(cap);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005826}
5827
5828GLboolean Context::isFramebuffer(GLuint framebuffer)
5829{
5830 if (framebuffer == 0)
5831 {
5832 return GL_FALSE;
5833 }
5834
5835 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5836}
5837
5838GLboolean Context::isProgram(GLuint program)
5839{
5840 if (program == 0)
5841 {
5842 return GL_FALSE;
5843 }
5844
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005845 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005846}
5847
5848GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5849{
5850 if (renderbuffer == 0)
5851 {
5852 return GL_FALSE;
5853 }
5854
5855 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5856}
5857
5858GLboolean Context::isShader(GLuint shader)
5859{
5860 if (shader == 0)
5861 {
5862 return GL_FALSE;
5863 }
5864
5865 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5866}
5867
5868GLboolean Context::isTexture(GLuint texture)
5869{
5870 if (texture == 0)
5871 {
5872 return GL_FALSE;
5873 }
5874
5875 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5876}
5877
5878void Context::linkProgram(GLuint program)
5879{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005880 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005881 ASSERT(programObject);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005882 ANGLE_CONTEXT_TRY(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005883
5884 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5885 // don't need to worry that:
5886 // 1. Draw calls after link use the new executable code or the old one depending on the link
5887 // result.
5888 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5889 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5890 // ProgramD3D.
5891 if (programObject->isInUse())
5892 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005893 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005894 if (programObject->isLinked())
5895 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005896 ANGLE_CONTEXT_TRY(mState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005897 }
jchen107ae70d82018-07-06 13:47:01 +08005898 mStateCache.onProgramExecutableChange(this);
5899 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005900}
5901
5902void Context::releaseShaderCompiler()
5903{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005904 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005905}
5906
5907void Context::shaderBinary(GLsizei n,
5908 const GLuint *shaders,
5909 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005910 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005911 GLsizei length)
5912{
5913 // No binary shader formats are supported.
5914 UNIMPLEMENTED();
5915}
5916
Olli Etuaho0ca09752018-09-24 11:00:50 +03005917void Context::bindFragDataLocationIndexed(GLuint program,
5918 GLuint colorNumber,
5919 GLuint index,
5920 const char *name)
5921{
5922 Program *programObject = getProgramNoResolveLink(program);
5923 programObject->bindFragmentOutputLocation(colorNumber, name);
5924 programObject->bindFragmentOutputIndex(index, name);
5925}
5926
5927void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5928{
5929 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5930}
5931
5932int Context::getFragDataIndex(GLuint program, const char *name)
5933{
5934 Program *programObject = getProgramResolveLink(program);
5935 return programObject->getFragDataIndex(name);
5936}
5937
5938int Context::getProgramResourceLocationIndex(GLuint program,
5939 GLenum programInterface,
5940 const char *name)
5941{
5942 Program *programObject = getProgramResolveLink(program);
5943 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5944 return programObject->getFragDataIndex(name);
5945}
5946
Jamie Madillc1d770e2017-04-13 17:31:24 -04005947void Context::shaderSource(GLuint shader,
5948 GLsizei count,
5949 const GLchar *const *string,
5950 const GLint *length)
5951{
5952 Shader *shaderObject = getShader(shader);
5953 ASSERT(shaderObject);
5954 shaderObject->setSource(count, string, length);
5955}
5956
5957void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5958{
5959 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5960}
5961
5962void Context::stencilMask(GLuint mask)
5963{
5964 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5965}
5966
5967void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5968{
5969 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5970}
5971
5972void Context::uniform1f(GLint location, GLfloat x)
5973{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005974 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04005975 program->setUniform1fv(location, 1, &x);
5976}
5977
5978void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5979{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005980 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04005981 program->setUniform1fv(location, count, v);
5982}
5983
Jamie Madill7e4eff12018-08-08 15:49:26 -04005984void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005985{
Jamie Madille3e680c2018-12-03 17:49:08 -05005986 program->setUniform1iv(this, location, count, v);
5987}
5988
5989void Context::onSamplerUniformChange(size_t textureUnitIndex)
5990{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005991 mState.onActiveTextureChange(this, textureUnitIndex);
Jamie Madille3e680c2018-12-03 17:49:08 -05005992 mStateCache.onActiveTextureChange(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005993}
5994
Jamie Madill7e4eff12018-08-08 15:49:26 -04005995void Context::uniform1i(GLint location, GLint x)
5996{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05005997 setUniform1iImpl(mState.getProgram(), location, 1, &x);
Jamie Madill7e4eff12018-08-08 15:49:26 -04005998}
5999
Jamie Madillc1d770e2017-04-13 17:31:24 -04006000void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
6001{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006002 setUniform1iImpl(mState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006003}
6004
6005void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
6006{
6007 GLfloat xy[2] = {x, y};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006008 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006009 program->setUniform2fv(location, 1, xy);
6010}
6011
6012void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6013{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006014 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006015 program->setUniform2fv(location, count, v);
6016}
6017
6018void Context::uniform2i(GLint location, GLint x, GLint y)
6019{
6020 GLint xy[2] = {x, y};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006021 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006022 program->setUniform2iv(location, 1, xy);
6023}
6024
6025void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6026{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006027 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006028 program->setUniform2iv(location, count, v);
6029}
6030
6031void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6032{
6033 GLfloat xyz[3] = {x, y, z};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006034 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006035 program->setUniform3fv(location, 1, xyz);
6036}
6037
6038void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6039{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006040 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006041 program->setUniform3fv(location, count, v);
6042}
6043
6044void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6045{
6046 GLint xyz[3] = {x, y, z};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006047 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006048 program->setUniform3iv(location, 1, xyz);
6049}
6050
6051void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6052{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006053 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006054 program->setUniform3iv(location, count, v);
6055}
6056
6057void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6058{
6059 GLfloat xyzw[4] = {x, y, z, w};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006060 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006061 program->setUniform4fv(location, 1, xyzw);
6062}
6063
6064void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6065{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006066 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006067 program->setUniform4fv(location, count, v);
6068}
6069
6070void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6071{
6072 GLint xyzw[4] = {x, y, z, w};
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006073 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006074 program->setUniform4iv(location, 1, xyzw);
6075}
6076
6077void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6078{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006079 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006080 program->setUniform4iv(location, count, v);
6081}
6082
6083void Context::uniformMatrix2fv(GLint location,
6084 GLsizei count,
6085 GLboolean transpose,
6086 const GLfloat *value)
6087{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006088 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006089 program->setUniformMatrix2fv(location, count, transpose, value);
6090}
6091
6092void Context::uniformMatrix3fv(GLint location,
6093 GLsizei count,
6094 GLboolean transpose,
6095 const GLfloat *value)
6096{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006097 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006098 program->setUniformMatrix3fv(location, count, transpose, value);
6099}
6100
6101void Context::uniformMatrix4fv(GLint location,
6102 GLsizei count,
6103 GLboolean transpose,
6104 const GLfloat *value)
6105{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006106 Program *program = mState.getProgram();
Jamie Madillc1d770e2017-04-13 17:31:24 -04006107 program->setUniformMatrix4fv(location, count, transpose, value);
6108}
6109
6110void Context::validateProgram(GLuint program)
6111{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006112 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006113 ASSERT(programObject);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006114 programObject->validate(mState.mCaps);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006115}
6116
Jiajia Qin5451d532017-11-16 17:16:34 +08006117void Context::validateProgramPipeline(GLuint pipeline)
6118{
6119 UNIMPLEMENTED();
6120}
6121
Jamie Madilld04908b2017-06-09 14:15:35 -04006122void Context::getProgramBinary(GLuint program,
6123 GLsizei bufSize,
6124 GLsizei *length,
6125 GLenum *binaryFormat,
6126 void *binary)
6127{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006128 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006129 ASSERT(programObject != nullptr);
6130
Jamie Madill4f6592f2018-11-27 16:37:45 -05006131 ANGLE_CONTEXT_TRY(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
Jamie Madilld04908b2017-06-09 14:15:35 -04006132}
6133
6134void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6135{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006136 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006137 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006138
Jamie Madill4f6592f2018-11-27 16:37:45 -05006139 ANGLE_CONTEXT_TRY(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006140 if (programObject->isInUse())
6141 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006142 ANGLE_CONTEXT_TRY(mState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006143 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006144 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006145}
6146
Jamie Madillff325f12017-08-26 15:06:05 -04006147void Context::uniform1ui(GLint location, GLuint v0)
6148{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006149 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006150 program->setUniform1uiv(location, 1, &v0);
6151}
6152
6153void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6154{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006155 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006156 const GLuint xy[] = {v0, v1};
6157 program->setUniform2uiv(location, 1, xy);
6158}
6159
6160void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6161{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006162 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006163 const GLuint xyz[] = {v0, v1, v2};
6164 program->setUniform3uiv(location, 1, xyz);
6165}
6166
6167void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6168{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006169 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006170 const GLuint xyzw[] = {v0, v1, v2, v3};
6171 program->setUniform4uiv(location, 1, xyzw);
6172}
6173
6174void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6175{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006176 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006177 program->setUniform1uiv(location, count, value);
6178}
6179void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6180{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006181 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006182 program->setUniform2uiv(location, count, value);
6183}
6184
6185void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6186{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006187 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006188 program->setUniform3uiv(location, count, value);
6189}
6190
6191void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6192{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006193 Program *program = mState.getProgram();
Jamie Madillff325f12017-08-26 15:06:05 -04006194 program->setUniform4uiv(location, count, value);
6195}
6196
Jamie Madillf0e04492017-08-26 15:28:42 -04006197void Context::genQueries(GLsizei n, GLuint *ids)
6198{
6199 for (GLsizei i = 0; i < n; i++)
6200 {
6201 GLuint handle = mQueryHandleAllocator.allocate();
6202 mQueryMap.assign(handle, nullptr);
6203 ids[i] = handle;
6204 }
6205}
6206
6207void Context::deleteQueries(GLsizei n, const GLuint *ids)
6208{
6209 for (int i = 0; i < n; i++)
6210 {
6211 GLuint query = ids[i];
6212
6213 Query *queryObject = nullptr;
6214 if (mQueryMap.erase(query, &queryObject))
6215 {
6216 mQueryHandleAllocator.release(query);
6217 if (queryObject)
6218 {
6219 queryObject->release(this);
6220 }
6221 }
6222 }
6223}
6224
6225GLboolean Context::isQuery(GLuint id)
6226{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006227 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006228}
6229
Jamie Madillc8c95812017-08-26 18:40:09 -04006230void Context::uniformMatrix2x3fv(GLint location,
6231 GLsizei count,
6232 GLboolean transpose,
6233 const GLfloat *value)
6234{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006235 Program *program = mState.getProgram();
Jamie Madillc8c95812017-08-26 18:40:09 -04006236 program->setUniformMatrix2x3fv(location, count, transpose, value);
6237}
6238
6239void Context::uniformMatrix3x2fv(GLint location,
6240 GLsizei count,
6241 GLboolean transpose,
6242 const GLfloat *value)
6243{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006244 Program *program = mState.getProgram();
Jamie Madillc8c95812017-08-26 18:40:09 -04006245 program->setUniformMatrix3x2fv(location, count, transpose, value);
6246}
6247
6248void Context::uniformMatrix2x4fv(GLint location,
6249 GLsizei count,
6250 GLboolean transpose,
6251 const GLfloat *value)
6252{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006253 Program *program = mState.getProgram();
Jamie Madillc8c95812017-08-26 18:40:09 -04006254 program->setUniformMatrix2x4fv(location, count, transpose, value);
6255}
6256
6257void Context::uniformMatrix4x2fv(GLint location,
6258 GLsizei count,
6259 GLboolean transpose,
6260 const GLfloat *value)
6261{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006262 Program *program = mState.getProgram();
Jamie Madillc8c95812017-08-26 18:40:09 -04006263 program->setUniformMatrix4x2fv(location, count, transpose, value);
6264}
6265
6266void Context::uniformMatrix3x4fv(GLint location,
6267 GLsizei count,
6268 GLboolean transpose,
6269 const GLfloat *value)
6270{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006271 Program *program = mState.getProgram();
Jamie Madillc8c95812017-08-26 18:40:09 -04006272 program->setUniformMatrix3x4fv(location, count, transpose, value);
6273}
6274
6275void Context::uniformMatrix4x3fv(GLint location,
6276 GLsizei count,
6277 GLboolean transpose,
6278 const GLfloat *value)
6279{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006280 Program *program = mState.getProgram();
Jamie Madillc8c95812017-08-26 18:40:09 -04006281 program->setUniformMatrix4x3fv(location, count, transpose, value);
6282}
6283
Jamie Madilld7576732017-08-26 18:49:50 -04006284void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6285{
6286 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6287 {
6288 GLuint vertexArray = arrays[arrayIndex];
6289
6290 if (arrays[arrayIndex] != 0)
6291 {
6292 VertexArray *vertexArrayObject = nullptr;
6293 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6294 {
6295 if (vertexArrayObject != nullptr)
6296 {
6297 detachVertexArray(vertexArray);
6298 vertexArrayObject->onDestroy(this);
6299 }
6300
6301 mVertexArrayHandleAllocator.release(vertexArray);
6302 }
6303 }
6304 }
6305}
6306
6307void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6308{
6309 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6310 {
6311 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6312 mVertexArrayMap.assign(vertexArray, nullptr);
6313 arrays[arrayIndex] = vertexArray;
6314 }
6315}
6316
6317bool Context::isVertexArray(GLuint array)
6318{
6319 if (array == 0)
6320 {
6321 return GL_FALSE;
6322 }
6323
6324 VertexArray *vao = getVertexArray(array);
6325 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6326}
6327
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006328void Context::endTransformFeedback()
6329{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006330 TransformFeedback *transformFeedback = mState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006331 ANGLE_CONTEXT_TRY(transformFeedback->end(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006332 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006333}
6334
6335void Context::transformFeedbackVaryings(GLuint program,
6336 GLsizei count,
6337 const GLchar *const *varyings,
6338 GLenum bufferMode)
6339{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006340 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006341 ASSERT(programObject);
6342 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6343}
6344
6345void Context::getTransformFeedbackVarying(GLuint program,
6346 GLuint index,
6347 GLsizei bufSize,
6348 GLsizei *length,
6349 GLsizei *size,
6350 GLenum *type,
6351 GLchar *name)
6352{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006353 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006354 ASSERT(programObject);
6355 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6356}
6357
6358void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6359{
6360 for (int i = 0; i < n; i++)
6361 {
6362 GLuint transformFeedback = ids[i];
6363 if (transformFeedback == 0)
6364 {
6365 continue;
6366 }
6367
6368 TransformFeedback *transformFeedbackObject = nullptr;
6369 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6370 {
6371 if (transformFeedbackObject != nullptr)
6372 {
6373 detachTransformFeedback(transformFeedback);
6374 transformFeedbackObject->release(this);
6375 }
6376
6377 mTransformFeedbackHandleAllocator.release(transformFeedback);
6378 }
6379 }
6380}
6381
6382void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6383{
6384 for (int i = 0; i < n; i++)
6385 {
6386 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6387 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6388 ids[i] = transformFeedback;
6389 }
6390}
6391
6392bool Context::isTransformFeedback(GLuint id)
6393{
6394 if (id == 0)
6395 {
6396 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6397 // returns FALSE
6398 return GL_FALSE;
6399 }
6400
6401 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6402 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6403}
6404
6405void Context::pauseTransformFeedback()
6406{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006407 TransformFeedback *transformFeedback = mState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006408 ANGLE_CONTEXT_TRY(transformFeedback->pause(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006409 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006410}
6411
6412void Context::resumeTransformFeedback()
6413{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006414 TransformFeedback *transformFeedback = mState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006415 ANGLE_CONTEXT_TRY(transformFeedback->resume(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006416 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006417}
6418
Jamie Madill12e957f2017-08-26 21:42:26 -04006419void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6420{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006421 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006422 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006423}
6424
Brandon Jones59770802018-04-02 13:18:42 -07006425void Context::getUniformuivRobust(GLuint program,
6426 GLint location,
6427 GLsizei bufSize,
6428 GLsizei *length,
6429 GLuint *params)
6430{
6431 getUniformuiv(program, location, params);
6432}
6433
Jamie Madill12e957f2017-08-26 21:42:26 -04006434GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6435{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006436 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006437 return programObject->getFragDataLocation(name);
6438}
6439
6440void Context::getUniformIndices(GLuint program,
6441 GLsizei uniformCount,
6442 const GLchar *const *uniformNames,
6443 GLuint *uniformIndices)
6444{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006445 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006446 if (!programObject->isLinked())
6447 {
6448 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6449 {
6450 uniformIndices[uniformId] = GL_INVALID_INDEX;
6451 }
6452 }
6453 else
6454 {
6455 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6456 {
6457 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6458 }
6459 }
6460}
6461
6462void Context::getActiveUniformsiv(GLuint program,
6463 GLsizei uniformCount,
6464 const GLuint *uniformIndices,
6465 GLenum pname,
6466 GLint *params)
6467{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006468 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006469 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6470 {
6471 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006472 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006473 }
6474}
6475
6476GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6477{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006478 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006479 return programObject->getUniformBlockIndex(uniformBlockName);
6480}
6481
6482void Context::getActiveUniformBlockiv(GLuint program,
6483 GLuint uniformBlockIndex,
6484 GLenum pname,
6485 GLint *params)
6486{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006487 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006488 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6489}
6490
Brandon Jones59770802018-04-02 13:18:42 -07006491void Context::getActiveUniformBlockivRobust(GLuint program,
6492 GLuint uniformBlockIndex,
6493 GLenum pname,
6494 GLsizei bufSize,
6495 GLsizei *length,
6496 GLint *params)
6497{
6498 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6499}
6500
Jamie Madill12e957f2017-08-26 21:42:26 -04006501void Context::getActiveUniformBlockName(GLuint program,
6502 GLuint uniformBlockIndex,
6503 GLsizei bufSize,
6504 GLsizei *length,
6505 GLchar *uniformBlockName)
6506{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006507 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006508 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6509}
6510
6511void Context::uniformBlockBinding(GLuint program,
6512 GLuint uniformBlockIndex,
6513 GLuint uniformBlockBinding)
6514{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006515 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006516 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006517
Jamie Madill956ab4d2018-10-10 16:13:03 -04006518 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006519 if (programObject->isInUse())
6520 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006521 mState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006522 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006523 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006524}
6525
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006526GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6527{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006528 GLuint handle = mState.mSyncManager->createSync(mImplementation.get());
Jamie Madill70b5bb02017-08-28 13:32:37 -04006529 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006530
Jamie Madill70b5bb02017-08-28 13:32:37 -04006531 Sync *syncObject = getSync(syncHandle);
Jamie Madill7c985f52018-11-29 18:16:17 -05006532 if (syncObject->set(this, condition, flags) == angle::Result::Stop)
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006533 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006534 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006535 return nullptr;
6536 }
6537
Jamie Madill70b5bb02017-08-28 13:32:37 -04006538 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006539}
6540
6541GLboolean Context::isSync(GLsync sync)
6542{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006543 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006544}
6545
6546GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6547{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006548 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006549
6550 GLenum result = GL_WAIT_FAILED;
Jamie Madill7c985f52018-11-29 18:16:17 -05006551 if (syncObject->clientWait(this, flags, timeout, &result) == angle::Result::Stop)
Jamie Madill4f6592f2018-11-27 16:37:45 -05006552 {
6553 return GL_WAIT_FAILED;
6554 }
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006555 return result;
6556}
6557
6558void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6559{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006560 Sync *syncObject = getSync(sync);
Jamie Madill4f6592f2018-11-27 16:37:45 -05006561 ANGLE_CONTEXT_TRY(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006562}
6563
6564void Context::getInteger64v(GLenum pname, GLint64 *params)
6565{
6566 GLenum nativeType = GL_NONE;
6567 unsigned int numParams = 0;
6568 getQueryParameterInfo(pname, &nativeType, &numParams);
6569
6570 if (nativeType == GL_INT_64_ANGLEX)
6571 {
6572 getInteger64vImpl(pname, params);
6573 }
6574 else
6575 {
6576 CastStateValues(this, nativeType, pname, numParams, params);
6577 }
6578}
6579
Brandon Jones59770802018-04-02 13:18:42 -07006580void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6581{
6582 getInteger64v(pname, data);
6583}
6584
Corentin Wallez336129f2017-10-17 15:55:40 -04006585void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006586{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006587 Buffer *buffer = mState.getTargetBuffer(target);
Jamie Madill3ef140a2017-08-26 23:11:21 -04006588 QueryBufferParameteri64v(buffer, pname, params);
6589}
6590
Brandon Jones59770802018-04-02 13:18:42 -07006591void Context::getBufferParameteri64vRobust(BufferBinding target,
6592 GLenum pname,
6593 GLsizei bufSize,
6594 GLsizei *length,
6595 GLint64 *params)
6596{
6597 getBufferParameteri64v(target, pname, params);
6598}
6599
Jamie Madill3ef140a2017-08-26 23:11:21 -04006600void Context::genSamplers(GLsizei count, GLuint *samplers)
6601{
6602 for (int i = 0; i < count; i++)
6603 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006604 samplers[i] = mState.mSamplerManager->createSampler();
Jamie Madill3ef140a2017-08-26 23:11:21 -04006605 }
6606}
6607
6608void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6609{
6610 for (int i = 0; i < count; i++)
6611 {
6612 GLuint sampler = samplers[i];
6613
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006614 if (mState.mSamplerManager->getSampler(sampler))
Jamie Madill3ef140a2017-08-26 23:11:21 -04006615 {
6616 detachSampler(sampler);
6617 }
6618
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006619 mState.mSamplerManager->deleteObject(this, sampler);
Jamie Madill3ef140a2017-08-26 23:11:21 -04006620 }
6621}
6622
6623void Context::getInternalformativ(GLenum target,
6624 GLenum internalformat,
6625 GLenum pname,
6626 GLsizei bufSize,
6627 GLint *params)
6628{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006629 const TextureCaps &formatCaps = mState.mTextureCaps.get(internalformat);
Jamie Madill3ef140a2017-08-26 23:11:21 -04006630 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6631}
6632
Brandon Jones59770802018-04-02 13:18:42 -07006633void Context::getInternalformativRobust(GLenum target,
6634 GLenum internalformat,
6635 GLenum pname,
6636 GLsizei bufSize,
6637 GLsizei *length,
6638 GLint *params)
6639{
6640 getInternalformativ(target, internalformat, pname, bufSize, params);
6641}
6642
Jiajia Qin5451d532017-11-16 17:16:34 +08006643void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6644{
6645 programUniform1iv(program, location, 1, &v0);
6646}
6647
6648void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6649{
6650 GLint xy[2] = {v0, v1};
6651 programUniform2iv(program, location, 1, xy);
6652}
6653
6654void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6655{
6656 GLint xyz[3] = {v0, v1, v2};
6657 programUniform3iv(program, location, 1, xyz);
6658}
6659
6660void Context::programUniform4i(GLuint program,
6661 GLint location,
6662 GLint v0,
6663 GLint v1,
6664 GLint v2,
6665 GLint v3)
6666{
6667 GLint xyzw[4] = {v0, v1, v2, v3};
6668 programUniform4iv(program, location, 1, xyzw);
6669}
6670
6671void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6672{
6673 programUniform1uiv(program, location, 1, &v0);
6674}
6675
6676void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6677{
6678 GLuint xy[2] = {v0, v1};
6679 programUniform2uiv(program, location, 1, xy);
6680}
6681
6682void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6683{
6684 GLuint xyz[3] = {v0, v1, v2};
6685 programUniform3uiv(program, location, 1, xyz);
6686}
6687
6688void Context::programUniform4ui(GLuint program,
6689 GLint location,
6690 GLuint v0,
6691 GLuint v1,
6692 GLuint v2,
6693 GLuint v3)
6694{
6695 GLuint xyzw[4] = {v0, v1, v2, v3};
6696 programUniform4uiv(program, location, 1, xyzw);
6697}
6698
6699void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6700{
6701 programUniform1fv(program, location, 1, &v0);
6702}
6703
6704void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6705{
6706 GLfloat xy[2] = {v0, v1};
6707 programUniform2fv(program, location, 1, xy);
6708}
6709
6710void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6711{
6712 GLfloat xyz[3] = {v0, v1, v2};
6713 programUniform3fv(program, location, 1, xyz);
6714}
6715
6716void Context::programUniform4f(GLuint program,
6717 GLint location,
6718 GLfloat v0,
6719 GLfloat v1,
6720 GLfloat v2,
6721 GLfloat v3)
6722{
6723 GLfloat xyzw[4] = {v0, v1, v2, v3};
6724 programUniform4fv(program, location, 1, xyzw);
6725}
6726
Jamie Madill81c2e252017-09-09 23:32:46 -04006727void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6728{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006729 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006730 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006731 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006732}
6733
Jiajia Qin5451d532017-11-16 17:16:34 +08006734void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6735{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006736 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006737 ASSERT(programObject);
6738 programObject->setUniform2iv(location, count, value);
6739}
6740
6741void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6742{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006743 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006744 ASSERT(programObject);
6745 programObject->setUniform3iv(location, count, value);
6746}
6747
6748void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6749{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006750 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006751 ASSERT(programObject);
6752 programObject->setUniform4iv(location, count, value);
6753}
6754
6755void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6756{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006757 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006758 ASSERT(programObject);
6759 programObject->setUniform1uiv(location, count, value);
6760}
6761
6762void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6763{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006764 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006765 ASSERT(programObject);
6766 programObject->setUniform2uiv(location, count, value);
6767}
6768
6769void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6770{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006771 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006772 ASSERT(programObject);
6773 programObject->setUniform3uiv(location, count, value);
6774}
6775
6776void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
6777{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006778 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006779 ASSERT(programObject);
6780 programObject->setUniform4uiv(location, count, value);
6781}
6782
6783void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6784{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006785 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006786 ASSERT(programObject);
6787 programObject->setUniform1fv(location, count, value);
6788}
6789
6790void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6791{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006792 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006793 ASSERT(programObject);
6794 programObject->setUniform2fv(location, count, value);
6795}
6796
6797void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6798{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006799 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006800 ASSERT(programObject);
6801 programObject->setUniform3fv(location, count, value);
6802}
6803
6804void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
6805{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006806 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006807 ASSERT(programObject);
6808 programObject->setUniform4fv(location, count, value);
6809}
6810
6811void Context::programUniformMatrix2fv(GLuint program,
6812 GLint location,
6813 GLsizei count,
6814 GLboolean transpose,
6815 const GLfloat *value)
6816{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006817 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006818 ASSERT(programObject);
6819 programObject->setUniformMatrix2fv(location, count, transpose, value);
6820}
6821
6822void Context::programUniformMatrix3fv(GLuint program,
6823 GLint location,
6824 GLsizei count,
6825 GLboolean transpose,
6826 const GLfloat *value)
6827{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006828 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006829 ASSERT(programObject);
6830 programObject->setUniformMatrix3fv(location, count, transpose, value);
6831}
6832
6833void Context::programUniformMatrix4fv(GLuint program,
6834 GLint location,
6835 GLsizei count,
6836 GLboolean transpose,
6837 const GLfloat *value)
6838{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006839 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006840 ASSERT(programObject);
6841 programObject->setUniformMatrix4fv(location, count, transpose, value);
6842}
6843
6844void Context::programUniformMatrix2x3fv(GLuint program,
6845 GLint location,
6846 GLsizei count,
6847 GLboolean transpose,
6848 const GLfloat *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->setUniformMatrix2x3fv(location, count, transpose, value);
6853}
6854
6855void Context::programUniformMatrix3x2fv(GLuint program,
6856 GLint location,
6857 GLsizei count,
6858 GLboolean transpose,
6859 const GLfloat *value)
6860{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006861 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006862 ASSERT(programObject);
6863 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6864}
6865
6866void Context::programUniformMatrix2x4fv(GLuint program,
6867 GLint location,
6868 GLsizei count,
6869 GLboolean transpose,
6870 const GLfloat *value)
6871{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006872 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006873 ASSERT(programObject);
6874 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6875}
6876
6877void Context::programUniformMatrix4x2fv(GLuint program,
6878 GLint location,
6879 GLsizei count,
6880 GLboolean transpose,
6881 const GLfloat *value)
6882{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006883 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006884 ASSERT(programObject);
6885 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6886}
6887
6888void Context::programUniformMatrix3x4fv(GLuint program,
6889 GLint location,
6890 GLsizei count,
6891 GLboolean transpose,
6892 const GLfloat *value)
6893{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006894 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006895 ASSERT(programObject);
6896 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6897}
6898
6899void Context::programUniformMatrix4x3fv(GLuint program,
6900 GLint location,
6901 GLsizei count,
6902 GLboolean transpose,
6903 const GLfloat *value)
6904{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006905 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006906 ASSERT(programObject);
6907 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6908}
6909
James Darpiniane8a93c62018-01-04 18:02:24 -08006910bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6911{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006912 return mState.isCurrentTransformFeedback(tf);
James Darpiniane8a93c62018-01-04 18:02:24 -08006913}
James Darpiniane8a93c62018-01-04 18:02:24 -08006914
Yunchao Hea336b902017-08-02 16:05:21 +08006915void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6916{
6917 for (int i = 0; i < count; i++)
6918 {
6919 pipelines[i] = createProgramPipeline();
6920 }
6921}
6922
6923void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6924{
6925 for (int i = 0; i < count; i++)
6926 {
6927 if (pipelines[i] != 0)
6928 {
6929 deleteProgramPipeline(pipelines[i]);
6930 }
6931 }
6932}
6933
6934GLboolean Context::isProgramPipeline(GLuint pipeline)
6935{
6936 if (pipeline == 0)
6937 {
6938 return GL_FALSE;
6939 }
6940
6941 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6942}
6943
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006944void Context::finishFenceNV(GLuint fence)
6945{
6946 FenceNV *fenceObject = getFenceNV(fence);
6947
6948 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madill4f6592f2018-11-27 16:37:45 -05006949 ANGLE_CONTEXT_TRY(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006950}
6951
6952void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6953{
6954 FenceNV *fenceObject = getFenceNV(fence);
6955
6956 ASSERT(fenceObject && fenceObject->isSet());
6957
6958 switch (pname)
6959 {
6960 case GL_FENCE_STATUS_NV:
6961 {
6962 // GL_NV_fence spec:
6963 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6964 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6965 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6966 GLboolean status = GL_TRUE;
6967 if (fenceObject->getStatus() != GL_TRUE)
6968 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006969 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006970 }
6971 *params = status;
6972 break;
6973 }
6974
6975 case GL_FENCE_CONDITION_NV:
6976 {
6977 *params = static_cast<GLint>(fenceObject->getCondition());
6978 break;
6979 }
6980
6981 default:
6982 UNREACHABLE();
6983 }
6984}
6985
6986void Context::getTranslatedShaderSource(GLuint shader,
6987 GLsizei bufsize,
6988 GLsizei *length,
6989 GLchar *source)
6990{
6991 Shader *shaderObject = getShader(shader);
6992 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006993 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006994}
6995
6996void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6997{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006998 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006999 ASSERT(programObject);
7000
7001 programObject->getUniformfv(this, location, params);
7002}
7003
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007004void Context::getnUniformfvRobust(GLuint program,
7005 GLint location,
7006 GLsizei bufSize,
7007 GLsizei *length,
7008 GLfloat *params)
7009{
7010 UNIMPLEMENTED();
7011}
7012
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007013void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7014{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007015 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007016 ASSERT(programObject);
7017
7018 programObject->getUniformiv(this, location, params);
7019}
7020
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007021void Context::getnUniformivRobust(GLuint program,
7022 GLint location,
7023 GLsizei bufSize,
7024 GLsizei *length,
7025 GLint *params)
7026{
7027 UNIMPLEMENTED();
7028}
7029
7030void Context::getnUniformuivRobust(GLuint program,
7031 GLint location,
7032 GLsizei bufSize,
7033 GLsizei *length,
7034 GLuint *params)
7035{
7036 UNIMPLEMENTED();
7037}
7038
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007039GLboolean Context::isFenceNV(GLuint fence)
7040{
7041 FenceNV *fenceObject = getFenceNV(fence);
7042
7043 if (fenceObject == nullptr)
7044 {
7045 return GL_FALSE;
7046 }
7047
7048 // GL_NV_fence spec:
7049 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7050 // existing fence.
7051 return fenceObject->isSet();
7052}
7053
7054void Context::readnPixels(GLint x,
7055 GLint y,
7056 GLsizei width,
7057 GLsizei height,
7058 GLenum format,
7059 GLenum type,
7060 GLsizei bufSize,
7061 void *data)
7062{
7063 return readPixels(x, y, width, height, format, type, data);
7064}
7065
Jamie Madill007530e2017-12-28 14:27:04 -05007066void Context::setFenceNV(GLuint fence, GLenum condition)
7067{
7068 ASSERT(condition == GL_ALL_COMPLETED_NV);
7069
7070 FenceNV *fenceObject = getFenceNV(fence);
7071 ASSERT(fenceObject != nullptr);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007072 ANGLE_CONTEXT_TRY(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007073}
7074
7075GLboolean Context::testFenceNV(GLuint fence)
7076{
7077 FenceNV *fenceObject = getFenceNV(fence);
7078
7079 ASSERT(fenceObject != nullptr);
7080 ASSERT(fenceObject->isSet() == GL_TRUE);
7081
7082 GLboolean result = GL_TRUE;
Jamie Madill7c985f52018-11-29 18:16:17 -05007083 if (fenceObject->test(this, &result) == angle::Result::Stop)
Jamie Madill007530e2017-12-28 14:27:04 -05007084 {
Jamie Madill007530e2017-12-28 14:27:04 -05007085 return GL_TRUE;
7086 }
7087
7088 return result;
7089}
7090
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007091void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007092{
7093 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007094 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007095 ANGLE_CONTEXT_TRY(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007096}
7097
Jamie Madillfa920eb2018-01-04 11:45:50 -05007098void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007099{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007100 Renderbuffer *renderbuffer = mState.getCurrentRenderbuffer();
Rafael Cintron05a449a2018-06-20 18:08:04 -07007101 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007102 ANGLE_CONTEXT_TRY(renderbuffer->setStorageEGLImageTarget(this, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007103}
7104
Jamie Madillfa920eb2018-01-04 11:45:50 -05007105void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7106{
7107 UNIMPLEMENTED();
7108}
7109
Jamie Madill5b772312018-03-08 20:28:32 -05007110bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7111{
7112 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7113 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7114 // to the fact that it is stored internally as a float, and so would require conversion
7115 // if returned from Context::getIntegerv. Since this conversion is already implemented
7116 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7117 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7118 // application.
7119 switch (pname)
7120 {
7121 case GL_COMPRESSED_TEXTURE_FORMATS:
7122 {
7123 *type = GL_INT;
7124 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7125 return true;
7126 }
7127 case GL_SHADER_BINARY_FORMATS:
7128 {
7129 *type = GL_INT;
7130 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7131 return true;
7132 }
7133
7134 case GL_MAX_VERTEX_ATTRIBS:
7135 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7136 case GL_MAX_VARYING_VECTORS:
7137 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7138 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7139 case GL_MAX_TEXTURE_IMAGE_UNITS:
7140 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7141 case GL_MAX_RENDERBUFFER_SIZE:
7142 case GL_NUM_SHADER_BINARY_FORMATS:
7143 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7144 case GL_ARRAY_BUFFER_BINDING:
Jamie Madillef9fcd92018-11-28 14:03:59 -05007145 case GL_FRAMEBUFFER_BINDING: // GL_FRAMEBUFFER_BINDING now equivalent to
7146 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
Jamie Madill5b772312018-03-08 20:28:32 -05007147 case GL_RENDERBUFFER_BINDING:
7148 case GL_CURRENT_PROGRAM:
7149 case GL_PACK_ALIGNMENT:
7150 case GL_UNPACK_ALIGNMENT:
7151 case GL_GENERATE_MIPMAP_HINT:
7152 case GL_RED_BITS:
7153 case GL_GREEN_BITS:
7154 case GL_BLUE_BITS:
7155 case GL_ALPHA_BITS:
7156 case GL_DEPTH_BITS:
7157 case GL_STENCIL_BITS:
7158 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7159 case GL_CULL_FACE_MODE:
7160 case GL_FRONT_FACE:
7161 case GL_ACTIVE_TEXTURE:
7162 case GL_STENCIL_FUNC:
7163 case GL_STENCIL_VALUE_MASK:
7164 case GL_STENCIL_REF:
7165 case GL_STENCIL_FAIL:
7166 case GL_STENCIL_PASS_DEPTH_FAIL:
7167 case GL_STENCIL_PASS_DEPTH_PASS:
7168 case GL_STENCIL_BACK_FUNC:
7169 case GL_STENCIL_BACK_VALUE_MASK:
7170 case GL_STENCIL_BACK_REF:
7171 case GL_STENCIL_BACK_FAIL:
7172 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7173 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7174 case GL_DEPTH_FUNC:
7175 case GL_BLEND_SRC_RGB:
7176 case GL_BLEND_SRC_ALPHA:
7177 case GL_BLEND_DST_RGB:
7178 case GL_BLEND_DST_ALPHA:
7179 case GL_BLEND_EQUATION_RGB:
7180 case GL_BLEND_EQUATION_ALPHA:
7181 case GL_STENCIL_WRITEMASK:
7182 case GL_STENCIL_BACK_WRITEMASK:
7183 case GL_STENCIL_CLEAR_VALUE:
7184 case GL_SUBPIXEL_BITS:
7185 case GL_MAX_TEXTURE_SIZE:
7186 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7187 case GL_SAMPLE_BUFFERS:
7188 case GL_SAMPLES:
7189 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7190 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7191 case GL_TEXTURE_BINDING_2D:
7192 case GL_TEXTURE_BINDING_CUBE_MAP:
7193 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7194 {
7195 *type = GL_INT;
7196 *numParams = 1;
7197 return true;
7198 }
7199 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7200 {
7201 if (!getExtensions().packReverseRowOrder)
7202 {
7203 return false;
7204 }
7205 *type = GL_INT;
7206 *numParams = 1;
7207 return true;
7208 }
7209 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7210 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7211 {
7212 if (!getExtensions().textureRectangle)
7213 {
7214 return false;
7215 }
7216 *type = GL_INT;
7217 *numParams = 1;
7218 return true;
7219 }
7220 case GL_MAX_DRAW_BUFFERS_EXT:
7221 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7222 {
7223 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7224 {
7225 return false;
7226 }
7227 *type = GL_INT;
7228 *numParams = 1;
7229 return true;
7230 }
7231 case GL_MAX_VIEWPORT_DIMS:
7232 {
7233 *type = GL_INT;
7234 *numParams = 2;
7235 return true;
7236 }
7237 case GL_VIEWPORT:
7238 case GL_SCISSOR_BOX:
7239 {
7240 *type = GL_INT;
7241 *numParams = 4;
7242 return true;
7243 }
7244 case GL_SHADER_COMPILER:
7245 case GL_SAMPLE_COVERAGE_INVERT:
7246 case GL_DEPTH_WRITEMASK:
7247 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7248 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7249 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7250 // bool-natural
7251 case GL_SAMPLE_COVERAGE:
7252 case GL_SCISSOR_TEST:
7253 case GL_STENCIL_TEST:
7254 case GL_DEPTH_TEST:
7255 case GL_BLEND:
7256 case GL_DITHER:
7257 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7258 {
7259 *type = GL_BOOL;
7260 *numParams = 1;
7261 return true;
7262 }
7263 case GL_COLOR_WRITEMASK:
7264 {
7265 *type = GL_BOOL;
7266 *numParams = 4;
7267 return true;
7268 }
7269 case GL_POLYGON_OFFSET_FACTOR:
7270 case GL_POLYGON_OFFSET_UNITS:
7271 case GL_SAMPLE_COVERAGE_VALUE:
7272 case GL_DEPTH_CLEAR_VALUE:
7273 case GL_LINE_WIDTH:
7274 {
7275 *type = GL_FLOAT;
7276 *numParams = 1;
7277 return true;
7278 }
7279 case GL_ALIASED_LINE_WIDTH_RANGE:
7280 case GL_ALIASED_POINT_SIZE_RANGE:
7281 case GL_DEPTH_RANGE:
7282 {
7283 *type = GL_FLOAT;
7284 *numParams = 2;
7285 return true;
7286 }
7287 case GL_COLOR_CLEAR_VALUE:
7288 case GL_BLEND_COLOR:
7289 {
7290 *type = GL_FLOAT;
7291 *numParams = 4;
7292 return true;
7293 }
7294 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7295 if (!getExtensions().textureFilterAnisotropic)
7296 {
7297 return false;
7298 }
7299 *type = GL_FLOAT;
7300 *numParams = 1;
7301 return true;
7302 case GL_TIMESTAMP_EXT:
7303 if (!getExtensions().disjointTimerQuery)
7304 {
7305 return false;
7306 }
7307 *type = GL_INT_64_ANGLEX;
7308 *numParams = 1;
7309 return true;
7310 case GL_GPU_DISJOINT_EXT:
7311 if (!getExtensions().disjointTimerQuery)
7312 {
7313 return false;
7314 }
7315 *type = GL_INT;
7316 *numParams = 1;
7317 return true;
7318 case GL_COVERAGE_MODULATION_CHROMIUM:
7319 if (!getExtensions().framebufferMixedSamples)
7320 {
7321 return false;
7322 }
7323 *type = GL_INT;
7324 *numParams = 1;
7325 return true;
7326 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7327 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7328 {
7329 return false;
7330 }
7331 *type = GL_INT;
7332 *numParams = 1;
7333 return true;
7334 }
7335
7336 if (getExtensions().debug)
7337 {
7338 switch (pname)
7339 {
7340 case GL_DEBUG_LOGGED_MESSAGES:
7341 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7342 case GL_DEBUG_GROUP_STACK_DEPTH:
7343 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7344 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7345 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7346 case GL_MAX_LABEL_LENGTH:
7347 *type = GL_INT;
7348 *numParams = 1;
7349 return true;
7350
7351 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7352 case GL_DEBUG_OUTPUT:
7353 *type = GL_BOOL;
7354 *numParams = 1;
7355 return true;
7356 }
7357 }
7358
7359 if (getExtensions().multisampleCompatibility)
7360 {
7361 switch (pname)
7362 {
7363 case GL_MULTISAMPLE_EXT:
7364 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7365 *type = GL_BOOL;
7366 *numParams = 1;
7367 return true;
7368 }
7369 }
7370
7371 if (getExtensions().pathRendering)
7372 {
7373 switch (pname)
7374 {
7375 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7376 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7377 *type = GL_FLOAT;
7378 *numParams = 16;
7379 return true;
7380 }
7381 }
7382
7383 if (getExtensions().bindGeneratesResource)
7384 {
7385 switch (pname)
7386 {
7387 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7388 *type = GL_BOOL;
7389 *numParams = 1;
7390 return true;
7391 }
7392 }
7393
7394 if (getExtensions().clientArrays)
7395 {
7396 switch (pname)
7397 {
7398 case GL_CLIENT_ARRAYS_ANGLE:
7399 *type = GL_BOOL;
7400 *numParams = 1;
7401 return true;
7402 }
7403 }
7404
7405 if (getExtensions().sRGBWriteControl)
7406 {
7407 switch (pname)
7408 {
7409 case GL_FRAMEBUFFER_SRGB_EXT:
7410 *type = GL_BOOL;
7411 *numParams = 1;
7412 return true;
7413 }
7414 }
7415
7416 if (getExtensions().robustResourceInitialization &&
7417 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7418 {
7419 *type = GL_BOOL;
7420 *numParams = 1;
7421 return true;
7422 }
7423
7424 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7425 {
7426 *type = GL_BOOL;
7427 *numParams = 1;
7428 return true;
7429 }
7430
jchen1082af6202018-06-22 10:59:52 +08007431 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7432 {
7433 *type = GL_INT;
7434 *numParams = 1;
7435 return true;
7436 }
7437
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007438 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7439 {
7440 *type = GL_INT;
7441 *numParams = 1;
7442 return true;
7443 }
7444
Jamie Madill5b772312018-03-08 20:28:32 -05007445 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7446 switch (pname)
7447 {
Jamie Madillef9fcd92018-11-28 14:03:59 -05007448 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE equivalent to FRAMEBUFFER_BINDING
Jamie Madill5b772312018-03-08 20:28:32 -05007449 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7450 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7451 {
7452 return false;
7453 }
7454 *type = GL_INT;
7455 *numParams = 1;
7456 return true;
7457
7458 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7459 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7460 {
7461 return false;
7462 }
7463 *type = GL_INT;
7464 *numParams = 1;
7465 return true;
7466
7467 case GL_PROGRAM_BINARY_FORMATS_OES:
7468 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7469 {
7470 return false;
7471 }
7472 *type = GL_INT;
7473 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7474 return true;
7475
7476 case GL_PACK_ROW_LENGTH:
7477 case GL_PACK_SKIP_ROWS:
7478 case GL_PACK_SKIP_PIXELS:
7479 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7480 {
7481 return false;
7482 }
7483 *type = GL_INT;
7484 *numParams = 1;
7485 return true;
7486 case GL_UNPACK_ROW_LENGTH:
7487 case GL_UNPACK_SKIP_ROWS:
7488 case GL_UNPACK_SKIP_PIXELS:
7489 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7490 {
7491 return false;
7492 }
7493 *type = GL_INT;
7494 *numParams = 1;
7495 return true;
7496 case GL_VERTEX_ARRAY_BINDING:
7497 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7498 {
7499 return false;
7500 }
7501 *type = GL_INT;
7502 *numParams = 1;
7503 return true;
7504 case GL_PIXEL_PACK_BUFFER_BINDING:
7505 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7506 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7507 {
7508 return false;
7509 }
7510 *type = GL_INT;
7511 *numParams = 1;
7512 return true;
7513 case GL_MAX_SAMPLES:
7514 {
7515 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7516 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7517 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7518 {
7519 return false;
7520 }
7521 *type = GL_INT;
7522 *numParams = 1;
7523 return true;
7524
7525 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7526 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7527 {
7528 return false;
7529 }
7530 *type = GL_INT;
7531 *numParams = 1;
7532 return true;
7533 }
7534 }
7535
7536 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7537 {
7538 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7539 {
7540 return false;
7541 }
7542 *type = GL_INT;
7543 *numParams = 1;
7544 return true;
7545 }
7546
7547 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7548 {
7549 *type = GL_INT;
7550 *numParams = 1;
7551 return true;
7552 }
7553
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007554 if (getClientVersion() < Version(2, 0))
7555 {
7556 switch (pname)
7557 {
7558 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007559 case GL_CLIENT_ACTIVE_TEXTURE:
7560 case GL_MATRIX_MODE:
7561 case GL_MAX_TEXTURE_UNITS:
7562 case GL_MAX_MODELVIEW_STACK_DEPTH:
7563 case GL_MAX_PROJECTION_STACK_DEPTH:
7564 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007565 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007566 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007567 case GL_VERTEX_ARRAY_STRIDE:
7568 case GL_NORMAL_ARRAY_STRIDE:
7569 case GL_COLOR_ARRAY_STRIDE:
7570 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7571 case GL_VERTEX_ARRAY_SIZE:
7572 case GL_COLOR_ARRAY_SIZE:
7573 case GL_TEXTURE_COORD_ARRAY_SIZE:
7574 case GL_VERTEX_ARRAY_TYPE:
7575 case GL_NORMAL_ARRAY_TYPE:
7576 case GL_COLOR_ARRAY_TYPE:
7577 case GL_TEXTURE_COORD_ARRAY_TYPE:
7578 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7579 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7580 case GL_COLOR_ARRAY_BUFFER_BINDING:
7581 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7582 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7583 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7584 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007585 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007586 case GL_MODELVIEW_STACK_DEPTH:
7587 case GL_PROJECTION_STACK_DEPTH:
7588 case GL_TEXTURE_STACK_DEPTH:
7589 case GL_LOGIC_OP_MODE:
7590 case GL_BLEND_SRC:
7591 case GL_BLEND_DST:
7592 case GL_PERSPECTIVE_CORRECTION_HINT:
7593 case GL_POINT_SMOOTH_HINT:
7594 case GL_LINE_SMOOTH_HINT:
7595 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007596 *type = GL_INT;
7597 *numParams = 1;
7598 return true;
7599 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007600 case GL_FOG_DENSITY:
7601 case GL_FOG_START:
7602 case GL_FOG_END:
7603 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007604 case GL_POINT_SIZE:
7605 case GL_POINT_SIZE_MIN:
7606 case GL_POINT_SIZE_MAX:
7607 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007608 *type = GL_FLOAT;
7609 *numParams = 1;
7610 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007611 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007612 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007613 *type = GL_FLOAT;
7614 *numParams = 2;
7615 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007616 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007617 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007618 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007619 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007620 *type = GL_FLOAT;
7621 *numParams = 4;
7622 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007623 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007624 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007625 *type = GL_FLOAT;
7626 *numParams = 3;
7627 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007628 case GL_MODELVIEW_MATRIX:
7629 case GL_PROJECTION_MATRIX:
7630 case GL_TEXTURE_MATRIX:
7631 *type = GL_FLOAT;
7632 *numParams = 16;
7633 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007634 case GL_LIGHT_MODEL_TWO_SIDE:
7635 *type = GL_BOOL;
7636 *numParams = 1;
7637 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007638 }
7639 }
7640
Jamie Madill5b772312018-03-08 20:28:32 -05007641 if (getClientVersion() < Version(3, 0))
7642 {
7643 return false;
7644 }
7645
7646 // Check for ES3.0+ parameter names
7647 switch (pname)
7648 {
7649 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7650 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7651 case GL_UNIFORM_BUFFER_BINDING:
7652 case GL_TRANSFORM_FEEDBACK_BINDING:
7653 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7654 case GL_COPY_READ_BUFFER_BINDING:
7655 case GL_COPY_WRITE_BUFFER_BINDING:
7656 case GL_SAMPLER_BINDING:
7657 case GL_READ_BUFFER:
7658 case GL_TEXTURE_BINDING_3D:
7659 case GL_TEXTURE_BINDING_2D_ARRAY:
7660 case GL_MAX_3D_TEXTURE_SIZE:
7661 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7662 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7663 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7664 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7665 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7666 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7667 case GL_MAX_VARYING_COMPONENTS:
7668 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7669 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7670 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7671 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7672 case GL_NUM_EXTENSIONS:
7673 case GL_MAJOR_VERSION:
7674 case GL_MINOR_VERSION:
7675 case GL_MAX_ELEMENTS_INDICES:
7676 case GL_MAX_ELEMENTS_VERTICES:
7677 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7678 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7679 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7680 case GL_UNPACK_IMAGE_HEIGHT:
7681 case GL_UNPACK_SKIP_IMAGES:
7682 {
7683 *type = GL_INT;
7684 *numParams = 1;
7685 return true;
7686 }
7687
7688 case GL_MAX_ELEMENT_INDEX:
7689 case GL_MAX_UNIFORM_BLOCK_SIZE:
7690 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7691 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7692 case GL_MAX_SERVER_WAIT_TIMEOUT:
7693 {
7694 *type = GL_INT_64_ANGLEX;
7695 *numParams = 1;
7696 return true;
7697 }
7698
7699 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7700 case GL_TRANSFORM_FEEDBACK_PAUSED:
7701 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7702 case GL_RASTERIZER_DISCARD:
7703 {
7704 *type = GL_BOOL;
7705 *numParams = 1;
7706 return true;
7707 }
7708
7709 case GL_MAX_TEXTURE_LOD_BIAS:
7710 {
7711 *type = GL_FLOAT;
7712 *numParams = 1;
7713 return true;
7714 }
7715 }
7716
7717 if (getExtensions().requestExtension)
7718 {
7719 switch (pname)
7720 {
7721 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7722 *type = GL_INT;
7723 *numParams = 1;
7724 return true;
7725 }
7726 }
7727
Yizhou Jiang7818a852018-09-06 15:02:04 +08007728 if (getExtensions().textureMultisample)
7729 {
7730 switch (pname)
7731 {
7732 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7733 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7734 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7735 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
Yizhou Jiang7310da32018-11-05 14:40:01 +08007736 case GL_MAX_SAMPLE_MASK_WORDS:
Yizhou Jiang7818a852018-09-06 15:02:04 +08007737 *type = GL_INT;
7738 *numParams = 1;
7739 return true;
7740 }
7741 }
7742
Jamie Madill5b772312018-03-08 20:28:32 -05007743 if (getClientVersion() < Version(3, 1))
7744 {
7745 return false;
7746 }
7747
7748 switch (pname)
7749 {
7750 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7751 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7752 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7753 case GL_MAX_FRAMEBUFFER_WIDTH:
7754 case GL_MAX_FRAMEBUFFER_HEIGHT:
7755 case GL_MAX_FRAMEBUFFER_SAMPLES:
7756 case GL_MAX_SAMPLE_MASK_WORDS:
7757 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7758 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7759 case GL_MAX_INTEGER_SAMPLES:
7760 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7761 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7762 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7763 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7764 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7765 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7766 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7767 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7768 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7769 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7770 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7771 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7772 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7773 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7774 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7775 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7776 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7777 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7778 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7779 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7780 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7781 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7782 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7783 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7784 case GL_MAX_UNIFORM_LOCATIONS:
7785 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7786 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7787 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7788 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7789 case GL_MAX_IMAGE_UNITS:
7790 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7791 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7792 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7793 case GL_SHADER_STORAGE_BUFFER_BINDING:
7794 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7795 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007796 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007797 *type = GL_INT;
7798 *numParams = 1;
7799 return true;
7800 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7801 *type = GL_INT_64_ANGLEX;
7802 *numParams = 1;
7803 return true;
7804 case GL_SAMPLE_MASK:
7805 *type = GL_BOOL;
7806 *numParams = 1;
7807 return true;
7808 }
7809
7810 if (getExtensions().geometryShader)
7811 {
7812 switch (pname)
7813 {
7814 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7815 case GL_LAYER_PROVOKING_VERTEX_EXT:
7816 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7817 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7818 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7819 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7820 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7821 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7822 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7823 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7824 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7825 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7826 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7827 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7828 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7829 *type = GL_INT;
7830 *numParams = 1;
7831 return true;
7832 }
7833 }
7834
7835 return false;
7836}
7837
7838bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7839{
7840 if (getClientVersion() < Version(3, 0))
7841 {
7842 return false;
7843 }
7844
7845 switch (target)
7846 {
7847 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7848 case GL_UNIFORM_BUFFER_BINDING:
7849 {
7850 *type = GL_INT;
7851 *numParams = 1;
7852 return true;
7853 }
7854 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7855 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7856 case GL_UNIFORM_BUFFER_START:
7857 case GL_UNIFORM_BUFFER_SIZE:
7858 {
7859 *type = GL_INT_64_ANGLEX;
7860 *numParams = 1;
7861 return true;
7862 }
7863 }
7864
7865 if (getClientVersion() < Version(3, 1))
7866 {
7867 return false;
7868 }
7869
7870 switch (target)
7871 {
7872 case GL_IMAGE_BINDING_LAYERED:
7873 {
7874 *type = GL_BOOL;
7875 *numParams = 1;
7876 return true;
7877 }
7878 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7879 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7880 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7881 case GL_SHADER_STORAGE_BUFFER_BINDING:
7882 case GL_VERTEX_BINDING_BUFFER:
7883 case GL_VERTEX_BINDING_DIVISOR:
7884 case GL_VERTEX_BINDING_OFFSET:
7885 case GL_VERTEX_BINDING_STRIDE:
7886 case GL_SAMPLE_MASK_VALUE:
7887 case GL_IMAGE_BINDING_NAME:
7888 case GL_IMAGE_BINDING_LEVEL:
7889 case GL_IMAGE_BINDING_LAYER:
7890 case GL_IMAGE_BINDING_ACCESS:
7891 case GL_IMAGE_BINDING_FORMAT:
7892 {
7893 *type = GL_INT;
7894 *numParams = 1;
7895 return true;
7896 }
7897 case GL_ATOMIC_COUNTER_BUFFER_START:
7898 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7899 case GL_SHADER_STORAGE_BUFFER_START:
7900 case GL_SHADER_STORAGE_BUFFER_SIZE:
7901 {
7902 *type = GL_INT_64_ANGLEX;
7903 *numParams = 1;
7904 return true;
7905 }
7906 }
7907
7908 return false;
7909}
7910
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007911Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007912{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007913 return mState.mShaderProgramManager->getProgram(handle);
Jamie Madill5b772312018-03-08 20:28:32 -05007914}
7915
7916Shader *Context::getShader(GLuint handle) const
7917{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007918 return mState.mShaderProgramManager->getShader(handle);
Jamie Madill5b772312018-03-08 20:28:32 -05007919}
7920
Jamie Madill5b772312018-03-08 20:28:32 -05007921bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7922{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007923 return mState.mRenderbufferManager->isHandleGenerated(renderbuffer);
Jamie Madill5b772312018-03-08 20:28:32 -05007924}
7925
7926bool Context::isFramebufferGenerated(GLuint framebuffer) const
7927{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007928 return mState.mFramebufferManager->isHandleGenerated(framebuffer);
Jamie Madill5b772312018-03-08 20:28:32 -05007929}
7930
7931bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7932{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007933 return mState.mProgramPipelineManager->isHandleGenerated(pipeline);
Jamie Madill5b772312018-03-08 20:28:32 -05007934}
7935
7936bool Context::usingDisplayTextureShareGroup() const
7937{
7938 return mDisplayTextureShareGroup;
7939}
7940
7941GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7942{
7943 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7944 internalformat == GL_DEPTH_STENCIL
7945 ? GL_DEPTH24_STENCIL8
7946 : internalformat;
7947}
7948
jchen1082af6202018-06-22 10:59:52 +08007949void Context::maxShaderCompilerThreads(GLuint count)
7950{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007951 GLuint oldCount = mState.getMaxShaderCompilerThreads();
7952 mState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007953 // A count of zero specifies a request for no parallel compiling or linking.
7954 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7955 {
7956 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7957 }
7958 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007959}
7960
Jamie Madill2eb65032018-07-30 10:25:57 -04007961bool Context::isGLES1() const
7962{
7963 return mState.getClientVersion() < Version(2, 0);
7964}
7965
Jamie Madilla11819d2018-07-30 10:26:01 -04007966void Context::onSubjectStateChange(const Context *context,
7967 angle::SubjectIndex index,
7968 angle::SubjectMessage message)
7969{
Jamie Madilla11819d2018-07-30 10:26:01 -04007970 switch (index)
7971 {
7972 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007973 switch (message)
7974 {
7975 case angle::SubjectMessage::CONTENTS_CHANGED:
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007976 mState.setObjectDirty(GL_VERTEX_ARRAY);
Jamie Madilld84b6732018-09-06 15:54:35 -04007977 mStateCache.onVertexArrayBufferContentsChange(this);
7978 break;
7979 case angle::SubjectMessage::RESOURCE_MAPPED:
7980 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7981 case angle::SubjectMessage::BINDING_CHANGED:
7982 mStateCache.onVertexArrayBufferStateChange(this);
7983 break;
7984 default:
7985 break;
7986 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007987 break;
7988
7989 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007990 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7991 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007992 mState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madilld84b6732018-09-06 15:54:35 -04007993 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007994 break;
7995
7996 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007997 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7998 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05007999 mState.setDrawFramebufferDirty();
Jamie Madilld84b6732018-09-06 15:54:35 -04008000 }
8001 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04008002 break;
8003
8004 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04008005 if (index < kTextureMaxSubjectIndex)
8006 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008007 mState.onActiveTextureStateChange(this, index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008008 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008009 }
Jamie Madille25b8002018-09-20 13:39:49 -04008010 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008011 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008012 mState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008013 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008014 }
Jamie Madille25b8002018-09-20 13:39:49 -04008015 else
8016 {
8017 ASSERT(index < kSamplerMaxSubjectIndex);
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008018 mState.setSamplerDirty(index - kSampler0SubjectIndex);
Jamie Madille25b8002018-09-20 13:39:49 -04008019 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008020 break;
8021 }
8022}
8023
Jamie Madill6b873dd2018-07-12 23:56:30 -04008024// ErrorSet implementation.
Jamie Madillb980c562018-11-27 11:34:27 -05008025ErrorSet::ErrorSet(Context *context) : mContext(context) {}
Jamie Madill6b873dd2018-07-12 23:56:30 -04008026
8027ErrorSet::~ErrorSet() = default;
8028
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008029void ErrorSet::handleError(GLenum errorCode,
8030 const char *message,
8031 const char *file,
8032 const char *function,
8033 unsigned int line)
8034{
Jamie Madill4f6592f2018-11-27 16:37:45 -05008035 if (errorCode == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8036 {
8037 mContext->markContextLost();
8038 }
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008039
Jamie Madill4f6592f2018-11-27 16:37:45 -05008040 std::stringstream errorStream;
8041 errorStream << "Error: " << gl::FmtHex(errorCode) << ", in " << file << ", " << function << ":"
8042 << line << ". " << message;
8043
Geoff Lang7139b432018-12-14 16:57:28 -05008044 std::string formattedMessage = errorStream.str();
8045
8046 // Always log a warning, this function is only called on unexpected internal errors.
8047 WARN() << formattedMessage;
8048
Jamie Madill4f6592f2018-11-27 16:37:45 -05008049 // validationError does the necessary work to process the error.
Geoff Lang7139b432018-12-14 16:57:28 -05008050 validationError(errorCode, formattedMessage.c_str());
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008051}
8052
Jamie Madilla139f012018-10-10 16:13:03 -04008053void ErrorSet::validationError(GLenum errorCode, const char *message)
8054{
Jamie Madill4f6592f2018-11-27 16:37:45 -05008055 ASSERT(errorCode != GL_NO_ERROR);
8056 mErrors.insert(errorCode);
8057
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008058 mContext->getState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8059 errorCode, GL_DEBUG_SEVERITY_HIGH, message);
Jamie Madilla139f012018-10-10 16:13:03 -04008060}
8061
Jamie Madill6b873dd2018-07-12 23:56:30 -04008062bool ErrorSet::empty() const
8063{
8064 return mErrors.empty();
8065}
8066
8067GLenum ErrorSet::popError()
8068{
8069 ASSERT(!empty());
8070 GLenum error = *mErrors.begin();
8071 mErrors.erase(mErrors.begin());
8072 return error;
8073}
Jamie Madilldc358af2018-07-31 11:22:13 -04008074
8075// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008076StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008077 : mCachedHasAnyEnabledClientAttrib(false),
8078 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008079 mCachedInstancedVertexElementLimit(0),
Jamie Madill1e853262018-12-21 09:07:38 -05008080 mCachedBasicDrawStatesError(kInvalidPointer),
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008081 mCachedBasicDrawElementsError(kInvalidPointer),
8082 mCachedTransformFeedbackActiveUnpaused(false)
Jamie Madillb980c562018-11-27 11:34:27 -05008083{}
Jamie Madilldc358af2018-07-31 11:22:13 -04008084
8085StateCache::~StateCache() = default;
8086
Jamie Madillac66f982018-10-09 18:30:01 -04008087void StateCache::initialize(Context *context)
8088{
8089 updateValidDrawModes(context);
8090 updateValidBindTextureTypes(context);
Jamie Madill8dc27f92018-11-29 11:45:44 -05008091 updateValidDrawElementsTypes(context);
Jamie Madill1e853262018-12-21 09:07:38 -05008092 updateBasicDrawStatesError();
8093 updateBasicDrawElementsError();
Jamie Madillac66f982018-10-09 18:30:01 -04008094}
8095
Jamie Madilldc358af2018-07-31 11:22:13 -04008096void StateCache::updateActiveAttribsMask(Context *context)
8097{
8098 bool isGLES1 = context->isGLES1();
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008099 const State &glState = context->getState();
Jamie Madilldc358af2018-07-31 11:22:13 -04008100
8101 if (!isGLES1 && !glState.getProgram())
8102 {
8103 mCachedActiveBufferedAttribsMask = AttributesMask();
8104 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008105 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008106 return;
8107 }
8108
8109 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8110 : glState.getProgram()->getActiveAttribLocationsMask();
8111
8112 const VertexArray *vao = glState.getVertexArray();
8113 ASSERT(vao);
8114
8115 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8116 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008117 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008118
Jamie Madill0a17e482018-08-31 17:19:11 -04008119 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8120 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008121 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008122 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8123}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008124
8125void StateCache::updateVertexElementLimits(Context *context)
8126{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008127 const VertexArray *vao = context->getState().getVertexArray();
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008128
8129 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8130 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8131
8132 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8133 // If there are no buffered attributes then we should not limit the draw call count.
8134 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8135 {
8136 return;
8137 }
8138
8139 const auto &vertexAttribs = vao->getVertexAttributes();
8140 const auto &vertexBindings = vao->getVertexBindings();
8141
8142 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8143 {
8144 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008145
8146 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8147 ASSERT(context->isGLES1() ||
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008148 context->getState().getProgram()->isAttribLocationActive(attributeIndex));
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008149
8150 GLint64 limit = attrib.getCachedElementLimit();
8151 if (binding.getDivisor() > 0)
8152 {
8153 mCachedInstancedVertexElementLimit =
8154 std::min(mCachedInstancedVertexElementLimit, limit);
8155 }
8156 else
8157 {
8158 mCachedNonInstancedVertexElementLimit =
8159 std::min(mCachedNonInstancedVertexElementLimit, limit);
8160 }
8161 }
8162}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008163
Jamie Madilld84b6732018-09-06 15:54:35 -04008164void StateCache::updateBasicDrawStatesError()
8165{
8166 mCachedBasicDrawStatesError = kInvalidPointer;
8167}
8168
Jamie Madill1e853262018-12-21 09:07:38 -05008169void StateCache::updateBasicDrawElementsError()
8170{
8171 mCachedBasicDrawElementsError = kInvalidPointer;
8172}
8173
Jamie Madilld84b6732018-09-06 15:54:35 -04008174intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8175{
8176 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8177 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8178 return mCachedBasicDrawStatesError;
8179}
8180
Jamie Madill1e853262018-12-21 09:07:38 -05008181intptr_t StateCache::getBasicDrawElementsErrorImpl(Context *context) const
8182{
8183 ASSERT(mCachedBasicDrawElementsError == kInvalidPointer);
8184 mCachedBasicDrawElementsError = reinterpret_cast<intptr_t>(ValidateDrawElementsStates(context));
8185 return mCachedBasicDrawElementsError;
8186}
8187
Jamie Madillc43cdad2018-08-08 15:49:25 -04008188void StateCache::onVertexArrayBindingChange(Context *context)
8189{
8190 updateActiveAttribsMask(context);
8191 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008192 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008193}
8194
8195void StateCache::onProgramExecutableChange(Context *context)
8196{
8197 updateActiveAttribsMask(context);
8198 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008199 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008200 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008201}
8202
Jamie Madilld84b6732018-09-06 15:54:35 -04008203void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008204{
8205 updateVertexElementLimits(context);
8206}
8207
Jamie Madilld84b6732018-09-06 15:54:35 -04008208void StateCache::onVertexArrayBufferContentsChange(Context *context)
8209{
8210 updateVertexElementLimits(context);
8211 updateBasicDrawStatesError();
8212}
8213
Jamie Madillc43cdad2018-08-08 15:49:25 -04008214void StateCache::onVertexArrayStateChange(Context *context)
8215{
8216 updateActiveAttribsMask(context);
8217 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008218 updateBasicDrawStatesError();
8219}
8220
8221void StateCache::onVertexArrayBufferStateChange(Context *context)
8222{
8223 updateBasicDrawStatesError();
Jamie Madill1e853262018-12-21 09:07:38 -05008224 updateBasicDrawElementsError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008225}
8226
8227void StateCache::onGLES1ClientStateChange(Context *context)
8228{
8229 updateActiveAttribsMask(context);
8230}
Jamie Madilld84b6732018-09-06 15:54:35 -04008231
8232void StateCache::onDrawFramebufferChange(Context *context)
8233{
8234 updateBasicDrawStatesError();
8235}
8236
8237void StateCache::onContextCapChange(Context *context)
8238{
8239 updateBasicDrawStatesError();
8240}
8241
8242void StateCache::onStencilStateChange(Context *context)
8243{
8244 updateBasicDrawStatesError();
8245}
8246
8247void StateCache::onDefaultVertexAttributeChange(Context *context)
8248{
8249 updateBasicDrawStatesError();
8250}
8251
8252void StateCache::onActiveTextureChange(Context *context)
8253{
8254 updateBasicDrawStatesError();
8255}
8256
8257void StateCache::onQueryChange(Context *context)
8258{
8259 updateBasicDrawStatesError();
8260}
8261
Jamie Madill3a256222018-12-08 09:56:39 -05008262void StateCache::onActiveTransformFeedbackChange(Context *context)
Jamie Madilld84b6732018-09-06 15:54:35 -04008263{
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008264 updateTransformFeedbackActiveUnpaused(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008265 updateBasicDrawStatesError();
Jamie Madill1e853262018-12-21 09:07:38 -05008266 updateBasicDrawElementsError();
Jamie Madill9b025062018-12-12 15:44:12 -05008267 updateValidDrawModes(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008268}
8269
8270void StateCache::onUniformBufferStateChange(Context *context)
8271{
8272 updateBasicDrawStatesError();
8273}
8274
Jamie Madill9b025062018-12-12 15:44:12 -05008275void StateCache::setValidDrawModes(bool pointsOK,
8276 bool linesOK,
8277 bool trisOK,
8278 bool lineAdjOK,
8279 bool triAdjOK)
8280{
8281 mCachedValidDrawModes[PrimitiveMode::Points] = pointsOK;
8282 mCachedValidDrawModes[PrimitiveMode::Lines] = linesOK;
8283 mCachedValidDrawModes[PrimitiveMode::LineStrip] = linesOK;
8284 mCachedValidDrawModes[PrimitiveMode::LineLoop] = linesOK;
8285 mCachedValidDrawModes[PrimitiveMode::Triangles] = trisOK;
8286 mCachedValidDrawModes[PrimitiveMode::TriangleFan] = trisOK;
8287 mCachedValidDrawModes[PrimitiveMode::TriangleStrip] = trisOK;
8288 mCachedValidDrawModes[PrimitiveMode::LinesAdjacency] = lineAdjOK;
8289 mCachedValidDrawModes[PrimitiveMode::LineStripAdjacency] = lineAdjOK;
8290 mCachedValidDrawModes[PrimitiveMode::TrianglesAdjacency] = triAdjOK;
8291 mCachedValidDrawModes[PrimitiveMode::TriangleStripAdjacency] = triAdjOK;
8292}
8293
Jamie Madill526a6f62018-09-12 11:03:05 -04008294void StateCache::updateValidDrawModes(Context *context)
8295{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008296 const State &state = context->getState();
Jamie Madill9b025062018-12-12 15:44:12 -05008297 Program *program = state.getProgram();
8298
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008299 if (mCachedTransformFeedbackActiveUnpaused)
Jamie Madill9b025062018-12-12 15:44:12 -05008300 {
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008301 TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
8302
Jamie Madill9b025062018-12-12 15:44:12 -05008303 // ES Spec 3.0 validation text:
8304 // When transform feedback is active and not paused, all geometric primitives generated must
8305 // match the value of primitiveMode passed to BeginTransformFeedback. The error
8306 // INVALID_OPERATION is generated by DrawArrays and DrawArraysInstanced if mode is not
8307 // identical to primitiveMode. The error INVALID_OPERATION is also generated by
8308 // DrawElements, DrawElementsInstanced, and DrawRangeElements while transform feedback is
8309 // active and not paused, regardless of mode. Any primitive type may be used while transform
8310 // feedback is paused.
8311 if (!context->getExtensions().geometryShader)
8312 {
8313 mCachedValidDrawModes.fill(false);
8314 mCachedValidDrawModes[curTransformFeedback->getPrimitiveMode()] = true;
8315 return;
8316 }
8317
8318 // EXT_geometry_shader validation text:
8319 // When transform feedback is active and not paused, all geometric primitives generated must
8320 // be compatible with the value of <primitiveMode> passed to BeginTransformFeedback. If a
8321 // geometry shader is active, the type of primitive emitted by that shader is used instead
8322 // of the <mode> parameter passed to drawing commands for the purposes of this error check.
8323 // Any primitive type may be used while transform feedback is paused.
8324 bool pointsOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Points;
8325 bool linesOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Lines;
8326 bool trisOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Triangles;
8327
8328 setValidDrawModes(pointsOK, linesOK, trisOK, false, false);
8329 return;
8330 }
8331
Jamie Madill526a6f62018-09-12 11:03:05 -04008332 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8333 {
Jamie Madill752d2202018-11-27 13:29:48 -05008334 mCachedValidDrawModes = kValidBasicDrawModes;
Jamie Madill9b025062018-12-12 15:44:12 -05008335 return;
Jamie Madill526a6f62018-09-12 11:03:05 -04008336 }
Jamie Madill526a6f62018-09-12 11:03:05 -04008337
Jamie Madill9b025062018-12-12 15:44:12 -05008338 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8339 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
Jamie Madill526a6f62018-09-12 11:03:05 -04008340
Jamie Madill9b025062018-12-12 15:44:12 -05008341 bool pointsOK = gsMode == PrimitiveMode::Points;
8342 bool linesOK = gsMode == PrimitiveMode::Lines;
8343 bool trisOK = gsMode == PrimitiveMode::Triangles;
8344 bool lineAdjOK = gsMode == PrimitiveMode::LinesAdjacency;
8345 bool triAdjOK = gsMode == PrimitiveMode::TrianglesAdjacency;
8346
8347 setValidDrawModes(pointsOK, linesOK, trisOK, lineAdjOK, triAdjOK);
Jamie Madill526a6f62018-09-12 11:03:05 -04008348}
Jamie Madillac66f982018-10-09 18:30:01 -04008349
8350void StateCache::updateValidBindTextureTypes(Context *context)
8351{
8352 const Extensions &exts = context->getExtensions();
8353 bool isGLES3 = context->getClientMajorVersion() >= 3;
8354 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8355
8356 mCachedValidBindTextureTypes = {{
Jamie Madill752d2202018-11-27 13:29:48 -05008357 {TextureType::_2D, true},
8358 {TextureType::_2DArray, isGLES3},
8359 {TextureType::_2DMultisample, isGLES31 || exts.textureMultisample},
8360 {TextureType::_2DMultisampleArray, exts.textureStorageMultisample2DArray},
8361 {TextureType::_3D, isGLES3},
8362 {TextureType::External, exts.eglImageExternal || exts.eglStreamConsumerExternal},
8363 {TextureType::Rectangle, exts.textureRectangle},
8364 {TextureType::CubeMap, true},
Jamie Madillac66f982018-10-09 18:30:01 -04008365 }};
8366}
Jamie Madill8dc27f92018-11-29 11:45:44 -05008367
8368void StateCache::updateValidDrawElementsTypes(Context *context)
8369{
8370 bool supportsUint =
8371 (context->getClientMajorVersion() >= 3 || context->getExtensions().elementIndexUint);
8372
8373 mCachedValidDrawElementsTypes = {{
8374 {DrawElementsType::UnsignedByte, true},
8375 {DrawElementsType::UnsignedShort, true},
8376 {DrawElementsType::UnsignedInt, supportsUint},
8377 }};
8378}
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008379
8380void StateCache::updateTransformFeedbackActiveUnpaused(Context *context)
8381{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05008382 TransformFeedback *xfb = context->getState().getCurrentTransformFeedback();
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008383 mCachedTransformFeedbackActiveUnpaused = xfb && xfb->isActive() && !xfb->isPaused();
8384}
Jamie Madillc29968b2016-01-20 11:17:23 -05008385} // namespace gl