blob: afe51c810aaa063286cf93121a1fa3a79fcef78c [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),
285 &mGLState,
286 mCaps,
287 mTextureCaps,
288 mExtensions,
289 mLimitations),
290 mSkipValidation(GetNoError(attribs)),
291 mDisplayTextureShareGroup(shareTextures != nullptr),
Geoff Lang3cacf692018-06-20 16:49:57 -0400292 mImplementation(implFactory->createContext(mState, config, shareContext, attribs)),
Geoff Lang75359662018-04-11 01:42:27 -0400293 mLabel(nullptr),
Jamie Madill2f348d22017-06-05 10:50:59 -0400294 mCompiler(),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400295 mGLState(GetDebug(attribs),
296 GetBindGeneratesResource(attribs),
297 GetClientArraysEnabled(attribs),
298 GetRobustResourceInit(attribs),
299 memoryProgramCache != nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400300 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500301 mClientType(EGL_OPENGL_ES_API),
Jamie Madill6b873dd2018-07-12 23:56:30 -0400302 mErrors(this),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500303 mHasBeenCurrent(false),
304 mContextLost(false),
305 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700306 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500307 mResetStrategy(GetResetStrategy(attribs)),
308 mRobustAccess(GetRobustAccess(attribs)),
Geoff Lang33f11fb2018-05-07 13:42:47 -0400309 mSurfacelessSupported(displayExtensions.surfacelessContext),
310 mExplicitContextAvailable(clientExtensions.explicitContext),
Jamie Madill61e16b42017-06-19 11:13:23 -0400311 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
312 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madille14951e2017-03-09 18:55:16 -0500313 mWebGLContext(GetWebGLContext(attribs)),
Geoff Lang0ab41fa2018-03-14 11:03:30 -0400314 mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
Jamie Madill32447362017-06-28 14:53:52 -0400315 mMemoryProgramCache(memoryProgramCache),
Jamie Madilla11819d2018-07-30 10:26:01 -0400316 mVertexArrayObserverBinding(this, kVertexArraySubjectIndex),
317 mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex),
318 mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400319 mScratchBuffer(1000u),
jchen107ae70d82018-07-06 13:47:01 +0800320 mZeroFilledBuffer(1000u),
321 mThreadPool(nullptr)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000322{
Jamie Madill6d32cef2018-08-14 02:34:28 -0400323 for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
324 uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
325 {
326 mUniformBufferObserverBindings.emplace_back(this, uboIndex);
327 }
Jamie Madille25b8002018-09-20 13:39:49 -0400328
329 for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
330 samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
331 {
332 mSamplerObserverBindings.emplace_back(this, samplerIndex);
333 }
Geoff Lang33f11fb2018-05-07 13:42:47 -0400334}
Jamie Madill5b772312018-03-08 20:28:32 -0500335
Geoff Lang33f11fb2018-05-07 13:42:47 -0400336void Context::initialize()
337{
338 mImplementation->setMemoryProgramCache(mMemoryProgramCache);
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400339
Geoff Lang33f11fb2018-05-07 13:42:47 -0400340 initCaps();
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700341 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400342
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400343 mGLState.initialize(this);
Régis Fénéon83107972015-02-05 12:57:44 +0100344
Shannon Woods53a94a82014-06-24 15:20:36 -0400345 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400346
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000347 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400348 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000349 // and cube map texture state vectors respectively associated with them.
350 // In order that access to these initial textures not be lost, they are treated as texture
351 // objects all of whose names are 0.
352
Corentin Wallez99d492c2018-02-27 15:17:10 -0500353 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, TextureType::_2D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800354 mZeroTextures[TextureType::_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500355
Corentin Wallez99d492c2018-02-27 15:17:10 -0500356 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, TextureType::CubeMap);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800357 mZeroTextures[TextureType::CubeMap].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400358
Geoff Langeb66a6e2016-10-31 13:06:12 -0400359 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400360 {
361 // TODO: These could also be enabled via extension
Corentin Wallez99d492c2018-02-27 15:17:10 -0500362 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, TextureType::_3D);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800363 mZeroTextures[TextureType::_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400364
Corentin Wallez99d492c2018-02-27 15:17:10 -0500365 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, TextureType::_2DArray);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800366 mZeroTextures[TextureType::_2DArray].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400367 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800368 if (getClientVersion() >= Version(3, 1) || mSupportedExtensions.textureMultisample)
Geoff Lang3b573612016-10-31 14:08:10 -0400369 {
370 Texture *zeroTexture2DMultisample =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500371 new Texture(mImplementation.get(), 0, TextureType::_2DMultisample);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800372 mZeroTextures[TextureType::_2DMultisample].set(this, zeroTexture2DMultisample);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800373 }
374 if (getClientVersion() >= Version(3, 1))
375 {
Olli Etuahod310a432018-08-24 15:40:23 +0300376 Texture *zeroTexture2DMultisampleArray =
377 new Texture(mImplementation.get(), 0, TextureType::_2DMultisampleArray);
378 mZeroTextures[TextureType::_2DMultisampleArray].set(this, zeroTexture2DMultisampleArray);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800379
Jiajia Qin6eafb042016-12-27 17:04:07 +0800380 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
381 {
Qin Jiajia339f65b2018-02-27 12:52:48 +0800382 bindBufferRange(BufferBinding::AtomicCounter, i, 0, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800383 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800384
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800385 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
386 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400387 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800388 }
Geoff Lang3b573612016-10-31 14:08:10 -0400389 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000390
Geoff Langb0f917f2017-12-05 13:41:54 -0500391 if (mSupportedExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400392 {
393 Texture *zeroTextureRectangle =
Corentin Wallez99d492c2018-02-27 15:17:10 -0500394 new Texture(mImplementation.get(), 0, TextureType::Rectangle);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800395 mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400396 }
397
Geoff Langb0f917f2017-12-05 13:41:54 -0500398 if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400399 {
Corentin Wallez99d492c2018-02-27 15:17:10 -0500400 Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800401 mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400402 }
403
Jamie Madill4928b7c2017-06-20 12:57:39 -0400404 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500405
Jamie Madill57a89722013-07-02 11:57:03 -0400406 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000407
Geoff Langeb66a6e2016-10-31 13:06:12 -0400408 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400409 {
410 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
411 // In the initial state, a default transform feedback object is bound and treated as
412 // a transform feedback object with a name of zero. That object is bound any time
413 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400414 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400415 }
Geoff Langc8058452014-02-03 12:04:11 -0500416
Corentin Wallez336129f2017-10-17 15:55:40 -0400417 for (auto type : angle::AllEnums<BufferBinding>())
418 {
419 bindBuffer(type, 0);
420 }
421
422 bindRenderbuffer(GL_RENDERBUFFER, 0);
423
424 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
425 {
426 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
427 }
428
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700429 // Initialize GLES1 renderer if appropriate.
430 if (getClientVersion() < Version(2, 0))
431 {
432 mGLES1Renderer.reset(new GLES1Renderer());
433 }
434
Jamie Madillad9f24e2016-02-12 09:27:24 -0500435 // Initialize dirty bit masks
Jamie Madill9d0bb3d2018-10-09 20:29:13 -0400436 mAllDirtyBits.set();
437
Geoff Lang9bf86f02018-07-26 11:46:34 -0400438 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
439 mDrawDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madille3e680c2018-12-03 17:49:08 -0500440 mDrawDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400441 mDrawDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400442 mDrawDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400443
444 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
445 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madille3e680c2018-12-03 17:49:08 -0500446 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -0400447 mPathOperationDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Geoff Lang9bf86f02018-07-26 11:46:34 -0400448
Jamie Madillc67323a2017-11-02 23:11:41 -0400449 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500450 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500451 // No dirty objects.
452
453 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400454 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500455 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400456 mReadPixelsDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500457 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
458
459 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
460 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
461 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
462 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
463 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
464 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
465 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
466 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
467 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
468 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
469 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400470 mClearDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500471 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
472
473 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
474 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700475 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Luc Ferronaf7dc012018-06-26 07:56:49 -0400476 mBlitDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
477 mBlitDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500478 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
479 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400480
Xinghua Cao10a4d432017-11-28 14:46:26 +0800481 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
jchen1099118c12018-09-10 16:28:51 +0800482 mComputeDirtyBits.set(State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
483 mComputeDirtyBits.set(State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800484 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
485 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
486 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
487 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
jchen1099118c12018-09-10 16:28:51 +0800488 mComputeDirtyBits.set(State::DIRTY_BIT_IMAGE_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800489 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Jamie Madille3e680c2018-12-03 17:49:08 -0500490 mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -0400491 mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
Jamie Madille25b8002018-09-20 13:39:49 -0400492 mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800493
Jamie Madillb4927eb2018-07-16 11:39:46 -0400494 mImplementation->setErrorSet(&mErrors);
495
Jamie Madill4f6592f2018-11-27 16:37:45 -0500496 ANGLE_CONTEXT_TRY(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000497}
498
Jamie Madill4928b7c2017-06-20 12:57:39 -0400499egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000500{
Lingfeng Yang461b09a2018-04-23 09:02:09 -0700501 if (mGLES1Renderer)
502 {
503 mGLES1Renderer->onDestroy(this, &mGLState);
504 }
505
Jamie Madille7b3fe22018-04-05 09:42:46 -0400506 ANGLE_TRY(releaseSurface(display));
507
Corentin Wallez80b24112015-08-25 16:41:57 -0400508 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000509 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400510 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000511 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400512 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000513
Corentin Wallez80b24112015-08-25 16:41:57 -0400514 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000515 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400516 if (query.second != nullptr)
517 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400518 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400519 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000520 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400521 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000522
Corentin Wallez80b24112015-08-25 16:41:57 -0400523 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400524 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400525 if (vertexArray.second)
526 {
527 vertexArray.second->onDestroy(this);
528 }
Jamie Madill57a89722013-07-02 11:57:03 -0400529 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400530 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400531
Corentin Wallez80b24112015-08-25 16:41:57 -0400532 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500533 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500534 if (transformFeedback.second != nullptr)
535 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500536 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500537 }
Geoff Langc8058452014-02-03 12:04:11 -0500538 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400539 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500540
Jamie Madill5b772312018-03-08 20:28:32 -0500541 for (BindingPointer<Texture> &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400542 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800543 if (zeroTexture.get() != nullptr)
544 {
Jamie Madill1c7f08c2018-10-10 16:13:02 -0400545 zeroTexture->onDestroy(this);
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800546 zeroTexture.set(this, nullptr);
547 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400548 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549
Jamie Madill2f348d22017-06-05 10:50:59 -0400550 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500551
Jamie Madill4928b7c2017-06-20 12:57:39 -0400552 mGLState.reset(this);
553
Jamie Madill6c1f6712017-02-14 19:08:04 -0500554 mState.mBuffers->release(this);
555 mState.mShaderPrograms->release(this);
556 mState.mTextures->release(this);
557 mState.mRenderbuffers->release(this);
558 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400559 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500560 mState.mPaths->release(this);
561 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800562 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400563
jchen107ae70d82018-07-06 13:47:01 +0800564 mThreadPool.reset();
565
Jamie Madill76e471e2017-10-21 09:56:01 -0400566 mImplementation->onDestroy(this);
567
Jamie Madill4928b7c2017-06-20 12:57:39 -0400568 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000569}
570
Jamie Madillb980c562018-11-27 11:34:27 -0500571Context::~Context() {}
Jamie Madill70ee0f62017-02-06 16:04:20 -0500572
Geoff Lang75359662018-04-11 01:42:27 -0400573void Context::setLabel(EGLLabelKHR label)
574{
575 mLabel = label;
576}
577
578EGLLabelKHR Context::getLabel() const
579{
580 return mLabel;
581}
582
Jamie Madill4928b7c2017-06-20 12:57:39 -0400583egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000584{
Jamie Madill61e16b42017-06-19 11:13:23 -0400585 mCurrentDisplay = display;
586
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000587 if (!mHasBeenCurrent)
588 {
Geoff Lang33f11fb2018-05-07 13:42:47 -0400589 initialize();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000590 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500591 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400592 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000593
Corentin Wallezc295e512017-01-27 17:47:50 -0500594 int width = 0;
595 int height = 0;
596 if (surface != nullptr)
597 {
598 width = surface->getWidth();
599 height = surface->getHeight();
600 }
601
602 mGLState.setViewportParams(0, 0, width, height);
603 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000604
605 mHasBeenCurrent = true;
606 }
607
Jamie Madill1b94d432015-08-07 13:23:23 -0400608 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700609 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400610 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400611
Jamie Madill4928b7c2017-06-20 12:57:39 -0400612 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500613
614 Framebuffer *newDefault = nullptr;
615 if (surface != nullptr)
616 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400617 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500618 mCurrentSurface = surface;
Geoff Langbf7b95d2018-05-01 16:48:21 -0400619 newDefault = surface->createDefaultFramebuffer(this);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500620 }
621 else
622 {
Geoff Langbf7b95d2018-05-01 16:48:21 -0400623 newDefault = new Framebuffer(mImplementation.get());
Corentin Wallezccab69d2017-01-27 16:57:15 -0500624 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000625
Corentin Wallez37c39792015-08-20 14:19:46 -0400626 // Update default framebuffer, the binding of the previous default
627 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400628 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400629 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700630 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400631 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400632 bindReadFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400633 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700634 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400635 {
Jamie Madilla11819d2018-07-30 10:26:01 -0400636 bindDrawFramebuffer(0);
Corentin Wallez37c39792015-08-20 14:19:46 -0400637 }
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400638 }
Ian Ewell292f0052016-02-04 10:37:32 -0500639
Jamie Madill32643ce2018-10-19 11:38:03 -0400640 // Notify the renderer of a context switch.
Jamie Madill7c985f52018-11-29 18:16:17 -0500641 return angle::ResultToEGL(mImplementation->onMakeCurrent(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000642}
643
Jamie Madill4928b7c2017-06-20 12:57:39 -0400644egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400645{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400646 gl::Framebuffer *defaultFramebuffer = mState.mFramebuffers->getFramebuffer(0);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400647
Geoff Langbf7b95d2018-05-01 16:48:21 -0400648 // Remove the default framebuffer
649 if (mGLState.getReadFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500650 {
651 mGLState.setReadFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400652 mReadFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500653 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400654
655 if (mGLState.getDrawFramebuffer() == defaultFramebuffer)
Corentin Wallezc295e512017-01-27 17:47:50 -0500656 {
657 mGLState.setDrawFramebufferBinding(nullptr);
Jamie Madilla11819d2018-07-30 10:26:01 -0400658 mDrawFramebufferObserverBinding.bind(nullptr);
Corentin Wallezc295e512017-01-27 17:47:50 -0500659 }
Geoff Langbf7b95d2018-05-01 16:48:21 -0400660
661 if (defaultFramebuffer)
662 {
663 defaultFramebuffer->onDestroy(this);
664 delete defaultFramebuffer;
665 }
666
Corentin Wallezc295e512017-01-27 17:47:50 -0500667 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
668
669 if (mCurrentSurface)
670 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400671 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500672 mCurrentSurface = nullptr;
673 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400674
675 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400676}
677
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000678GLuint Context::createBuffer()
679{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500680 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000681}
682
683GLuint Context::createProgram()
684{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500685 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000686}
687
Jiawei Shao385b3e02018-03-21 09:43:28 +0800688GLuint Context::createShader(ShaderType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000689{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500690 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000691}
692
693GLuint Context::createTexture()
694{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500695 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000696}
697
698GLuint Context::createRenderbuffer()
699{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500700 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000701}
702
Jamie Madill13951342018-09-30 15:24:28 -0400703void Context::tryGenPaths(GLsizei range, GLuint *createdOut)
704{
Jamie Madill526392d2018-11-16 09:35:14 -0500705 ANGLE_CONTEXT_TRY(mState.mPaths->createPaths(this, range, createdOut));
Jamie Madill13951342018-09-30 15:24:28 -0400706}
707
Brandon Jones59770802018-04-02 13:18:42 -0700708GLuint Context::genPaths(GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300709{
Jamie Madill13951342018-09-30 15:24:28 -0400710 GLuint created = 0;
711 tryGenPaths(range, &created);
712 return created;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300713}
714
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000715// Returns an unused framebuffer name
716GLuint Context::createFramebuffer()
717{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500718 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000719}
720
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500721void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000722{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500723 for (int i = 0; i < n; i++)
724 {
725 GLuint handle = mFenceNVHandleAllocator.allocate();
726 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
727 fences[i] = handle;
728 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000729}
730
Yunchao Hea336b902017-08-02 16:05:21 +0800731GLuint Context::createProgramPipeline()
732{
733 return mState.mPipelines->createProgramPipeline();
734}
735
Jiawei Shao385b3e02018-03-21 09:43:28 +0800736GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings)
Jiajia Qin5451d532017-11-16 17:16:34 +0800737{
738 UNIMPLEMENTED();
739 return 0u;
740}
741
James Darpinian4d9d4832018-03-13 12:43:28 -0700742void Context::deleteBuffer(GLuint bufferName)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000743{
James Darpinian4d9d4832018-03-13 12:43:28 -0700744 Buffer *buffer = mState.mBuffers->getBuffer(bufferName);
745 if (buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000746 {
747 detachBuffer(buffer);
748 }
Jamie Madill893ab082014-05-16 16:56:10 -0400749
James Darpinian4d9d4832018-03-13 12:43:28 -0700750 mState.mBuffers->deleteObject(this, bufferName);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000751}
752
753void Context::deleteShader(GLuint shader)
754{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500755 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000756}
757
758void Context::deleteProgram(GLuint program)
759{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500760 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000761}
762
763void Context::deleteTexture(GLuint texture)
764{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500765 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000766 {
767 detachTexture(texture);
768 }
769
Jamie Madill6c1f6712017-02-14 19:08:04 -0500770 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000771}
772
773void Context::deleteRenderbuffer(GLuint renderbuffer)
774{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500775 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000776 {
777 detachRenderbuffer(renderbuffer);
778 }
Jamie Madill893ab082014-05-16 16:56:10 -0400779
Jamie Madill6c1f6712017-02-14 19:08:04 -0500780 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000781}
782
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400783void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400784{
785 // The spec specifies the underlying Fence object is not deleted until all current
786 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
787 // and since our API is currently designed for being called from a single thread, we can delete
788 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400789 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400790}
791
Yunchao Hea336b902017-08-02 16:05:21 +0800792void Context::deleteProgramPipeline(GLuint pipeline)
793{
794 if (mState.mPipelines->getProgramPipeline(pipeline))
795 {
796 detachProgramPipeline(pipeline);
797 }
798
799 mState.mPipelines->deleteObject(this, pipeline);
800}
801
Sami Väisänene45e53b2016-05-25 10:36:04 +0300802void Context::deletePaths(GLuint first, GLsizei range)
803{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500804 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300805}
806
Brandon Jones59770802018-04-02 13:18:42 -0700807bool Context::isPath(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300808{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500809 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300810 if (pathObj == nullptr)
811 return false;
812
813 return pathObj->hasPathData();
814}
815
Brandon Jones59770802018-04-02 13:18:42 -0700816bool Context::isPathGenerated(GLuint path) const
Sami Väisänene45e53b2016-05-25 10:36:04 +0300817{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500818 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300819}
820
Brandon Jones59770802018-04-02 13:18:42 -0700821void Context::pathCommands(GLuint path,
822 GLsizei numCommands,
823 const GLubyte *commands,
824 GLsizei numCoords,
825 GLenum coordType,
826 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300827{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500828 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300829
Jamie Madill4f6592f2018-11-27 16:37:45 -0500830 ANGLE_CONTEXT_TRY(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300831}
832
Jamie Madill007530e2017-12-28 14:27:04 -0500833void Context::pathParameterf(GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300834{
Jamie Madill007530e2017-12-28 14:27:04 -0500835 Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300836
837 switch (pname)
838 {
839 case GL_PATH_STROKE_WIDTH_CHROMIUM:
840 pathObj->setStrokeWidth(value);
841 break;
842 case GL_PATH_END_CAPS_CHROMIUM:
843 pathObj->setEndCaps(static_cast<GLenum>(value));
844 break;
845 case GL_PATH_JOIN_STYLE_CHROMIUM:
846 pathObj->setJoinStyle(static_cast<GLenum>(value));
847 break;
848 case GL_PATH_MITER_LIMIT_CHROMIUM:
849 pathObj->setMiterLimit(value);
850 break;
851 case GL_PATH_STROKE_BOUND_CHROMIUM:
852 pathObj->setStrokeBound(value);
853 break;
854 default:
855 UNREACHABLE();
856 break;
857 }
858}
859
Jamie Madill007530e2017-12-28 14:27:04 -0500860void Context::pathParameteri(GLuint path, GLenum pname, GLint value)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300861{
Jamie Madill007530e2017-12-28 14:27:04 -0500862 // TODO(jmadill): Should use proper clamping/casting.
863 pathParameterf(path, pname, static_cast<GLfloat>(value));
864}
865
866void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value)
867{
868 const Path *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300869
870 switch (pname)
871 {
872 case GL_PATH_STROKE_WIDTH_CHROMIUM:
873 *value = pathObj->getStrokeWidth();
874 break;
875 case GL_PATH_END_CAPS_CHROMIUM:
876 *value = static_cast<GLfloat>(pathObj->getEndCaps());
877 break;
878 case GL_PATH_JOIN_STYLE_CHROMIUM:
879 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
880 break;
881 case GL_PATH_MITER_LIMIT_CHROMIUM:
882 *value = pathObj->getMiterLimit();
883 break;
884 case GL_PATH_STROKE_BOUND_CHROMIUM:
885 *value = pathObj->getStrokeBound();
886 break;
887 default:
888 UNREACHABLE();
889 break;
890 }
891}
892
Jamie Madill007530e2017-12-28 14:27:04 -0500893void Context::getPathParameteriv(GLuint path, GLenum pname, GLint *value)
894{
895 GLfloat val = 0.0f;
896 getPathParameterfv(path, pname, value != nullptr ? &val : nullptr);
897 if (value)
898 *value = static_cast<GLint>(val);
899}
900
Brandon Jones59770802018-04-02 13:18:42 -0700901void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300902{
903 mGLState.setPathStencilFunc(func, ref, mask);
904}
905
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000906void Context::deleteFramebuffer(GLuint framebuffer)
907{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500908 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000909 {
910 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000911 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500912
Jamie Madill6c1f6712017-02-14 19:08:04 -0500913 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000914}
915
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500916void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000917{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500918 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000919 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500920 GLuint fence = fences[i];
921
922 FenceNV *fenceObject = nullptr;
923 if (mFenceNVMap.erase(fence, &fenceObject))
924 {
925 mFenceNVHandleAllocator.release(fence);
926 delete fenceObject;
927 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000928 }
929}
930
Geoff Lang70d0f492015-12-10 17:45:46 -0500931Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000932{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500933 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000934}
935
Geoff Lang70d0f492015-12-10 17:45:46 -0500936Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000937{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500938 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000939}
940
Jamie Madill70b5bb02017-08-28 13:32:37 -0400941Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400942{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400943 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400944}
945
Jamie Madill57a89722013-07-02 11:57:03 -0400946VertexArray *Context::getVertexArray(GLuint handle) const
947{
Jamie Madill96a483b2017-06-27 16:49:21 -0400948 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400949}
950
Jamie Madilldc356042013-07-19 16:36:57 -0400951Sampler *Context::getSampler(GLuint handle) const
952{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500953 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400954}
955
Geoff Langc8058452014-02-03 12:04:11 -0500956TransformFeedback *Context::getTransformFeedback(GLuint handle) const
957{
Jamie Madill96a483b2017-06-27 16:49:21 -0400958 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500959}
960
Yunchao Hea336b902017-08-02 16:05:21 +0800961ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
962{
963 return mState.mPipelines->getProgramPipeline(handle);
964}
965
Geoff Lang75359662018-04-11 01:42:27 -0400966gl::LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500967{
968 switch (identifier)
969 {
970 case GL_BUFFER:
971 return getBuffer(name);
972 case GL_SHADER:
973 return getShader(name);
974 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -0400975 return getProgramNoResolveLink(name);
Geoff Lang70d0f492015-12-10 17:45:46 -0500976 case GL_VERTEX_ARRAY:
977 return getVertexArray(name);
978 case GL_QUERY:
979 return getQuery(name);
980 case GL_TRANSFORM_FEEDBACK:
981 return getTransformFeedback(name);
982 case GL_SAMPLER:
983 return getSampler(name);
984 case GL_TEXTURE:
985 return getTexture(name);
986 case GL_RENDERBUFFER:
987 return getRenderbuffer(name);
988 case GL_FRAMEBUFFER:
989 return getFramebuffer(name);
990 default:
991 UNREACHABLE();
992 return nullptr;
993 }
994}
995
Geoff Lang75359662018-04-11 01:42:27 -0400996gl::LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
Geoff Lang70d0f492015-12-10 17:45:46 -0500997{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400998 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500999}
1000
Martin Radev9d901792016-07-15 15:58:58 +03001001void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
1002{
Geoff Lang75359662018-04-11 01:42:27 -04001003 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001004 ASSERT(object != nullptr);
1005
1006 std::string labelName = GetObjectLabelFromPointer(length, label);
Jamie Madille90d4ee2018-11-28 14:04:00 -05001007 object->setLabel(this, labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001008
1009 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
1010 // specified object is active until we do this.
1011 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +03001012}
1013
1014void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
1015{
Geoff Lang75359662018-04-11 01:42:27 -04001016 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001017 ASSERT(object != nullptr);
1018
1019 std::string labelName = GetObjectLabelFromPointer(length, label);
Jamie Madille90d4ee2018-11-28 14:04:00 -05001020 object->setLabel(this, labelName);
Martin Radev9d901792016-07-15 15:58:58 +03001021}
1022
1023void Context::getObjectLabel(GLenum identifier,
1024 GLuint name,
1025 GLsizei bufSize,
1026 GLsizei *length,
1027 GLchar *label) const
1028{
Geoff Lang75359662018-04-11 01:42:27 -04001029 gl::LabeledObject *object = getLabeledObject(identifier, name);
Martin Radev9d901792016-07-15 15:58:58 +03001030 ASSERT(object != nullptr);
1031
1032 const std::string &objectLabel = object->getLabel();
1033 GetObjectLabelBase(objectLabel, bufSize, length, label);
1034}
1035
1036void Context::getObjectPtrLabel(const void *ptr,
1037 GLsizei bufSize,
1038 GLsizei *length,
1039 GLchar *label) const
1040{
Geoff Lang75359662018-04-11 01:42:27 -04001041 gl::LabeledObject *object = getLabeledObjectFromPtr(ptr);
Martin Radev9d901792016-07-15 15:58:58 +03001042 ASSERT(object != nullptr);
1043
1044 const std::string &objectLabel = object->getLabel();
1045 GetObjectLabelBase(objectLabel, bufSize, length, label);
1046}
1047
Jamie Madilldc356042013-07-19 16:36:57 -04001048bool Context::isSampler(GLuint samplerName) const
1049{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001050 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -04001051}
1052
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001053void Context::bindTexture(TextureType target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001054{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001055 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001056
Jamie Madilldedd7b92014-11-05 16:30:36 -05001057 if (handle == 0)
1058 {
1059 texture = mZeroTextures[target].get();
1060 }
1061 else
1062 {
Corentin Wallez99d492c2018-02-27 15:17:10 -05001063 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001064 }
1065
1066 ASSERT(texture);
Jamie Madille3e680c2018-12-03 17:49:08 -05001067 mGLState.setSamplerTexture(this, target, texture);
Jamie Madilld84b6732018-09-06 15:54:35 -04001068 mStateCache.onActiveTextureChange(this);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001069}
1070
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001071void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001072{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001073 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1074 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001075 mGLState.setReadFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001076 mReadFramebufferObserverBinding.bind(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001077}
1078
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001079void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001080{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001081 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1082 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001083 mGLState.setDrawFramebufferBinding(framebuffer);
Jamie Madilla11819d2018-07-30 10:26:01 -04001084 mDrawFramebufferObserverBinding.bind(framebuffer);
Jamie Madilld84b6732018-09-06 15:54:35 -04001085 mStateCache.onDrawFramebufferChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001086}
1087
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001088void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001089{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001090 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madill7267aa62018-04-17 15:28:21 -04001091 mGLState.setVertexArrayBinding(this, vertexArray);
Jamie Madilla11819d2018-07-30 10:26:01 -04001092 mVertexArrayObserverBinding.bind(vertexArray);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001093 mStateCache.onVertexArrayBindingChange(this);
Jamie Madill57a89722013-07-02 11:57:03 -04001094}
1095
Shao80957d92017-02-20 21:25:59 +08001096void Context::bindVertexBuffer(GLuint bindingIndex,
1097 GLuint bufferHandle,
1098 GLintptr offset,
1099 GLsizei stride)
1100{
1101 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001102 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Jamie Madillc43cdad2018-08-08 15:49:25 -04001103 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08001104}
1105
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001106void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001107{
Geoff Lang76b10c92014-09-05 16:28:14 -04001108 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001109 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001110 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001111 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04001112 mSamplerObserverBindings[textureUnit].bind(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001113}
1114
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001115void Context::bindImageTexture(GLuint unit,
1116 GLuint texture,
1117 GLint level,
1118 GLboolean layered,
1119 GLint layer,
1120 GLenum access,
1121 GLenum format)
1122{
1123 Texture *tex = mState.mTextures->getTexture(texture);
1124 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1125}
1126
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001127void Context::useProgram(GLuint program)
1128{
Jamie Madille3bb6b72018-10-03 17:51:15 -04001129 ANGLE_CONTEXT_TRY(mGLState.setProgram(this, getProgramResolveLink(program)));
Jamie Madillc43cdad2018-08-08 15:49:25 -04001130 mStateCache.onProgramExecutableChange(this);
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001131}
1132
Jiajia Qin5451d532017-11-16 17:16:34 +08001133void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1134{
1135 UNIMPLEMENTED();
1136}
1137
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001138void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001139{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001140 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001141 TransformFeedback *transformFeedback =
1142 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001143 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001144}
1145
Yunchao Hea336b902017-08-02 16:05:21 +08001146void Context::bindProgramPipeline(GLuint pipelineHandle)
1147{
1148 ProgramPipeline *pipeline =
1149 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1150 mGLState.setProgramPipelineBinding(this, pipeline);
1151}
1152
Corentin Wallezad3ae902018-03-09 13:40:42 -05001153void Context::beginQuery(QueryType target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001154{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001155 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001156 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001157
Geoff Lang5aad9672014-09-08 11:10:42 -04001158 // begin query
Jamie Madill5188a272018-07-25 10:53:56 -04001159 ANGLE_CONTEXT_TRY(queryObject->begin(this));
Geoff Lang5aad9672014-09-08 11:10:42 -04001160
1161 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001162 mGLState.setActiveQuery(this, target, queryObject);
Jamie Madilld84b6732018-09-06 15:54:35 -04001163 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001164}
1165
Corentin Wallezad3ae902018-03-09 13:40:42 -05001166void Context::endQuery(QueryType target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001167{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001168 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001169 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001170
Jamie Madill4f6592f2018-11-27 16:37:45 -05001171 // Intentionally don't call try here. We don't want an early return.
1172 (void)(queryObject->end(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001173
Geoff Lang5aad9672014-09-08 11:10:42 -04001174 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001175 mGLState.setActiveQuery(this, target, nullptr);
Jamie Madilld84b6732018-09-06 15:54:35 -04001176 mStateCache.onQueryChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001177}
1178
Corentin Wallezad3ae902018-03-09 13:40:42 -05001179void Context::queryCounter(GLuint id, QueryType target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001180{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001181 ASSERT(target == QueryType::Timestamp);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001182
1183 Query *queryObject = getQuery(id, true, target);
1184 ASSERT(queryObject);
1185
Jamie Madill4f6592f2018-11-27 16:37:45 -05001186 ANGLE_CONTEXT_TRY(queryObject->queryCounter(this));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001187}
1188
Corentin Wallezad3ae902018-03-09 13:40:42 -05001189void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001190{
1191 switch (pname)
1192 {
1193 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001194 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001195 break;
1196 case GL_QUERY_COUNTER_BITS_EXT:
1197 switch (target)
1198 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001199 case QueryType::TimeElapsed:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001200 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1201 break;
Corentin Wallezad3ae902018-03-09 13:40:42 -05001202 case QueryType::Timestamp:
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001203 params[0] = getExtensions().queryCounterBitsTimestamp;
1204 break;
1205 default:
1206 UNREACHABLE();
1207 params[0] = 0;
1208 break;
1209 }
1210 break;
1211 default:
1212 UNREACHABLE();
1213 return;
1214 }
1215}
1216
Corentin Wallezad3ae902018-03-09 13:40:42 -05001217void Context::getQueryivRobust(QueryType target,
Brandon Jones59770802018-04-02 13:18:42 -07001218 GLenum pname,
1219 GLsizei bufSize,
1220 GLsizei *length,
1221 GLint *params)
1222{
1223 getQueryiv(target, pname, params);
1224}
1225
Geoff Lang2186c382016-10-14 10:54:54 -04001226void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001227{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001228 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001229}
1230
Brandon Jones59770802018-04-02 13:18:42 -07001231void Context::getQueryObjectivRobust(GLuint id,
1232 GLenum pname,
1233 GLsizei bufSize,
1234 GLsizei *length,
1235 GLint *params)
1236{
1237 getQueryObjectiv(id, pname, params);
1238}
1239
Geoff Lang2186c382016-10-14 10:54:54 -04001240void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001241{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001242 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001243}
1244
Brandon Jones59770802018-04-02 13:18:42 -07001245void Context::getQueryObjectuivRobust(GLuint id,
1246 GLenum pname,
1247 GLsizei bufSize,
1248 GLsizei *length,
1249 GLuint *params)
1250{
1251 getQueryObjectuiv(id, pname, params);
1252}
1253
Geoff Lang2186c382016-10-14 10:54:54 -04001254void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001255{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001256 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001257}
1258
Brandon Jones59770802018-04-02 13:18:42 -07001259void Context::getQueryObjecti64vRobust(GLuint id,
1260 GLenum pname,
1261 GLsizei bufSize,
1262 GLsizei *length,
1263 GLint64 *params)
1264{
1265 getQueryObjecti64v(id, pname, params);
1266}
1267
Geoff Lang2186c382016-10-14 10:54:54 -04001268void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001269{
Jamie Madill4f6592f2018-11-27 16:37:45 -05001270 ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001271}
1272
Brandon Jones59770802018-04-02 13:18:42 -07001273void Context::getQueryObjectui64vRobust(GLuint id,
1274 GLenum pname,
1275 GLsizei bufSize,
1276 GLsizei *length,
1277 GLuint64 *params)
1278{
1279 getQueryObjectui64v(id, pname, params);
1280}
1281
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001282Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001283{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001284 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001285}
1286
Jamie Madill2f348d22017-06-05 10:50:59 -04001287FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001288{
Jamie Madill96a483b2017-06-27 16:49:21 -04001289 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001290}
1291
Corentin Wallezad3ae902018-03-09 13:40:42 -05001292Query *Context::getQuery(GLuint handle, bool create, QueryType type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001293{
Jamie Madill96a483b2017-06-27 16:49:21 -04001294 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001295 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001296 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001297 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001298
1299 Query *query = mQueryMap.query(handle);
1300 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001301 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001302 ASSERT(type != QueryType::InvalidEnum);
Jamie Madill96a483b2017-06-27 16:49:21 -04001303 query = new Query(mImplementation->createQuery(type), handle);
1304 query->addRef();
1305 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001306 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001307 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001308}
1309
Geoff Lang70d0f492015-12-10 17:45:46 -05001310Query *Context::getQuery(GLuint handle) const
1311{
Jamie Madill96a483b2017-06-27 16:49:21 -04001312 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001313}
1314
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001315Texture *Context::getTargetTexture(TextureType type) const
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001316{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001317 ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
1318 return mGLState.getTargetTexture(type);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001319}
1320
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001321Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001322{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001323 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001324}
1325
Geoff Lang492a7e42014-11-05 13:27:06 -05001326Compiler *Context::getCompiler() const
1327{
Jamie Madill2f348d22017-06-05 10:50:59 -04001328 if (mCompiler.get() == nullptr)
1329 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001330 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001331 }
1332 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001333}
1334
Jamie Madillc1d770e2017-04-13 17:31:24 -04001335void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001336{
1337 switch (pname)
1338 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001339 case GL_SHADER_COMPILER:
1340 *params = GL_TRUE;
1341 break;
1342 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1343 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1344 break;
1345 default:
1346 mGLState.getBooleanv(pname, params);
1347 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001348 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001349}
1350
Jamie Madillc1d770e2017-04-13 17:31:24 -04001351void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001352{
Shannon Woods53a94a82014-06-24 15:20:36 -04001353 // Queries about context capabilities and maximums are answered by Context.
1354 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001355 switch (pname)
1356 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001357 case GL_ALIASED_LINE_WIDTH_RANGE:
1358 params[0] = mCaps.minAliasedLineWidth;
1359 params[1] = mCaps.maxAliasedLineWidth;
1360 break;
1361 case GL_ALIASED_POINT_SIZE_RANGE:
1362 params[0] = mCaps.minAliasedPointSize;
1363 params[1] = mCaps.maxAliasedPointSize;
1364 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001365 case GL_SMOOTH_POINT_SIZE_RANGE:
1366 params[0] = mCaps.minSmoothPointSize;
1367 params[1] = mCaps.maxSmoothPointSize;
1368 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001369 case GL_SMOOTH_LINE_WIDTH_RANGE:
1370 params[0] = mCaps.minSmoothLineWidth;
1371 params[1] = mCaps.maxSmoothLineWidth;
1372 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001373 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1374 ASSERT(mExtensions.textureFilterAnisotropic);
1375 *params = mExtensions.maxTextureAnisotropy;
1376 break;
1377 case GL_MAX_TEXTURE_LOD_BIAS:
1378 *params = mCaps.maxLODBias;
1379 break;
1380
1381 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1382 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1383 {
Lingfeng Yang3a41af62018-04-09 07:28:56 -07001384 // GLES1 emulation: // GL_PATH_(MODELVIEW|PROJECTION)_MATRIX_CHROMIUM collides with the
1385 // GLES1 constants for modelview/projection matrix.
1386 if (getClientVersion() < Version(2, 0))
1387 {
1388 mGLState.getFloatv(pname, params);
1389 }
1390 else
1391 {
1392 ASSERT(mExtensions.pathRendering);
1393 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1394 memcpy(params, m, 16 * sizeof(GLfloat));
1395 }
Jamie Madill231c7f52017-04-26 13:45:37 -04001396 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001397 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001398
Jamie Madill231c7f52017-04-26 13:45:37 -04001399 default:
1400 mGLState.getFloatv(pname, params);
1401 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001402 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001403}
1404
Jamie Madillc1d770e2017-04-13 17:31:24 -04001405void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001406{
Shannon Woods53a94a82014-06-24 15:20:36 -04001407 // Queries about context capabilities and maximums are answered by Context.
1408 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001409
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001410 switch (pname)
1411 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001412 case GL_MAX_VERTEX_ATTRIBS:
1413 *params = mCaps.maxVertexAttributes;
1414 break;
1415 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1416 *params = mCaps.maxVertexUniformVectors;
1417 break;
1418 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001419 *params = mCaps.maxShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001420 break;
1421 case GL_MAX_VARYING_VECTORS:
1422 *params = mCaps.maxVaryingVectors;
1423 break;
1424 case GL_MAX_VARYING_COMPONENTS:
1425 *params = mCaps.maxVertexOutputComponents;
1426 break;
1427 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1428 *params = mCaps.maxCombinedTextureImageUnits;
1429 break;
1430 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001431 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001432 break;
1433 case GL_MAX_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001434 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001435 break;
1436 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1437 *params = mCaps.maxFragmentUniformVectors;
1438 break;
1439 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001440 *params = mCaps.maxShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001441 break;
1442 case GL_MAX_RENDERBUFFER_SIZE:
1443 *params = mCaps.maxRenderbufferSize;
1444 break;
1445 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1446 *params = mCaps.maxColorAttachments;
1447 break;
1448 case GL_MAX_DRAW_BUFFERS_EXT:
1449 *params = mCaps.maxDrawBuffers;
1450 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001451 case GL_SUBPIXEL_BITS:
1452 *params = 4;
1453 break;
1454 case GL_MAX_TEXTURE_SIZE:
1455 *params = mCaps.max2DTextureSize;
1456 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001457 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1458 *params = mCaps.maxRectangleTextureSize;
1459 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001460 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1461 *params = mCaps.maxCubeMapTextureSize;
1462 break;
1463 case GL_MAX_3D_TEXTURE_SIZE:
1464 *params = mCaps.max3DTextureSize;
1465 break;
1466 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1467 *params = mCaps.maxArrayTextureLayers;
1468 break;
1469 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1470 *params = mCaps.uniformBufferOffsetAlignment;
1471 break;
1472 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1473 *params = mCaps.maxUniformBufferBindings;
1474 break;
1475 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001476 *params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001477 break;
1478 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001479 *params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001480 break;
1481 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1482 *params = mCaps.maxCombinedTextureImageUnits;
1483 break;
1484 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1485 *params = mCaps.maxVertexOutputComponents;
1486 break;
1487 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1488 *params = mCaps.maxFragmentInputComponents;
1489 break;
1490 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1491 *params = mCaps.minProgramTexelOffset;
1492 break;
1493 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1494 *params = mCaps.maxProgramTexelOffset;
1495 break;
1496 case GL_MAJOR_VERSION:
1497 *params = getClientVersion().major;
1498 break;
1499 case GL_MINOR_VERSION:
1500 *params = getClientVersion().minor;
1501 break;
1502 case GL_MAX_ELEMENTS_INDICES:
1503 *params = mCaps.maxElementsIndices;
1504 break;
1505 case GL_MAX_ELEMENTS_VERTICES:
1506 *params = mCaps.maxElementsVertices;
1507 break;
1508 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1509 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1510 break;
1511 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1512 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1513 break;
1514 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1515 *params = mCaps.maxTransformFeedbackSeparateComponents;
1516 break;
1517 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1518 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1519 break;
1520 case GL_MAX_SAMPLES_ANGLE:
1521 *params = mCaps.maxSamples;
1522 break;
1523 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001524 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001525 params[0] = mCaps.maxViewportWidth;
1526 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001527 }
1528 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001529 case GL_COMPRESSED_TEXTURE_FORMATS:
1530 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1531 params);
1532 break;
1533 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1534 *params = mResetStrategy;
1535 break;
1536 case GL_NUM_SHADER_BINARY_FORMATS:
1537 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1538 break;
1539 case GL_SHADER_BINARY_FORMATS:
1540 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1541 break;
1542 case GL_NUM_PROGRAM_BINARY_FORMATS:
1543 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1544 break;
1545 case GL_PROGRAM_BINARY_FORMATS:
1546 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1547 break;
1548 case GL_NUM_EXTENSIONS:
1549 *params = static_cast<GLint>(mExtensionStrings.size());
1550 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001551
Geoff Lang38f24ee2018-10-01 13:04:59 -04001552 // GL_ANGLE_request_extension
1553 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
1554 *params = static_cast<GLint>(mRequestableExtensionStrings.size());
1555 break;
1556
Jamie Madill231c7f52017-04-26 13:45:37 -04001557 // GL_KHR_debug
1558 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1559 *params = mExtensions.maxDebugMessageLength;
1560 break;
1561 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1562 *params = mExtensions.maxDebugLoggedMessages;
1563 break;
1564 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1565 *params = mExtensions.maxDebugGroupStackDepth;
1566 break;
1567 case GL_MAX_LABEL_LENGTH:
1568 *params = mExtensions.maxLabelLength;
1569 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001570
Martin Radeve5285d22017-07-14 16:23:53 +03001571 // GL_ANGLE_multiview
1572 case GL_MAX_VIEWS_ANGLE:
1573 *params = mExtensions.maxViews;
1574 break;
1575
Jamie Madill231c7f52017-04-26 13:45:37 -04001576 // GL_EXT_disjoint_timer_query
1577 case GL_GPU_DISJOINT_EXT:
1578 *params = mImplementation->getGPUDisjoint();
1579 break;
1580 case GL_MAX_FRAMEBUFFER_WIDTH:
1581 *params = mCaps.maxFramebufferWidth;
1582 break;
1583 case GL_MAX_FRAMEBUFFER_HEIGHT:
1584 *params = mCaps.maxFramebufferHeight;
1585 break;
1586 case GL_MAX_FRAMEBUFFER_SAMPLES:
1587 *params = mCaps.maxFramebufferSamples;
1588 break;
1589 case GL_MAX_SAMPLE_MASK_WORDS:
1590 *params = mCaps.maxSampleMaskWords;
1591 break;
1592 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1593 *params = mCaps.maxColorTextureSamples;
1594 break;
1595 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1596 *params = mCaps.maxDepthTextureSamples;
1597 break;
1598 case GL_MAX_INTEGER_SAMPLES:
1599 *params = mCaps.maxIntegerSamples;
1600 break;
1601 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1602 *params = mCaps.maxVertexAttribRelativeOffset;
1603 break;
1604 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1605 *params = mCaps.maxVertexAttribBindings;
1606 break;
1607 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1608 *params = mCaps.maxVertexAttribStride;
1609 break;
1610 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001611 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001612 break;
1613 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001614 *params = mCaps.maxShaderAtomicCounters[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001615 break;
1616 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001617 *params = mCaps.maxShaderImageUniforms[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001618 break;
1619 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001620 *params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001621 break;
1622 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001623 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001624 break;
1625 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001626 *params = mCaps.maxShaderAtomicCounters[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001627 break;
1628 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001629 *params = mCaps.maxShaderImageUniforms[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001630 break;
1631 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001632 *params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001633 break;
1634 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1635 *params = mCaps.minProgramTextureGatherOffset;
1636 break;
1637 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1638 *params = mCaps.maxProgramTextureGatherOffset;
1639 break;
1640 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1641 *params = mCaps.maxComputeWorkGroupInvocations;
1642 break;
1643 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001644 *params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001645 break;
1646 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001647 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001648 break;
1649 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1650 *params = mCaps.maxComputeSharedMemorySize;
1651 break;
1652 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001653 *params = mCaps.maxShaderUniformComponents[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001654 break;
1655 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001656 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001657 break;
1658 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001659 *params = mCaps.maxShaderAtomicCounters[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001660 break;
1661 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001662 *params = mCaps.maxShaderImageUniforms[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001663 break;
1664 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001665 *params =
1666 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Compute]);
Jamie Madill231c7f52017-04-26 13:45:37 -04001667 break;
1668 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001669 *params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
Jamie Madill231c7f52017-04-26 13:45:37 -04001670 break;
1671 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1672 *params = mCaps.maxCombinedShaderOutputResources;
1673 break;
1674 case GL_MAX_UNIFORM_LOCATIONS:
1675 *params = mCaps.maxUniformLocations;
1676 break;
1677 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1678 *params = mCaps.maxAtomicCounterBufferBindings;
1679 break;
1680 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1681 *params = mCaps.maxAtomicCounterBufferSize;
1682 break;
1683 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1684 *params = mCaps.maxCombinedAtomicCounterBuffers;
1685 break;
1686 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1687 *params = mCaps.maxCombinedAtomicCounters;
1688 break;
1689 case GL_MAX_IMAGE_UNITS:
1690 *params = mCaps.maxImageUnits;
1691 break;
1692 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1693 *params = mCaps.maxCombinedImageUniforms;
1694 break;
1695 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1696 *params = mCaps.maxShaderStorageBufferBindings;
1697 break;
1698 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1699 *params = mCaps.maxCombinedShaderStorageBlocks;
1700 break;
1701 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1702 *params = mCaps.shaderStorageBufferOffsetAlignment;
1703 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001704
1705 // GL_EXT_geometry_shader
1706 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1707 *params = mCaps.maxFramebufferLayers;
1708 break;
1709 case GL_LAYER_PROVOKING_VERTEX_EXT:
1710 *params = mCaps.layerProvokingVertex;
1711 break;
1712 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001713 *params = mCaps.maxShaderUniformComponents[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001714 break;
1715 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001716 *params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001717 break;
1718 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001719 *params =
1720 static_cast<GLint>(mCaps.maxCombinedShaderUniformComponents[ShaderType::Geometry]);
Jiawei Shao361df072017-11-22 09:33:59 +08001721 break;
1722 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1723 *params = mCaps.maxGeometryInputComponents;
1724 break;
1725 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1726 *params = mCaps.maxGeometryOutputComponents;
1727 break;
1728 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1729 *params = mCaps.maxGeometryOutputVertices;
1730 break;
1731 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1732 *params = mCaps.maxGeometryTotalOutputComponents;
1733 break;
1734 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1735 *params = mCaps.maxGeometryShaderInvocations;
1736 break;
1737 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001738 *params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001739 break;
1740 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001741 *params = mCaps.maxShaderAtomicCounterBuffers[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001742 break;
1743 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001744 *params = mCaps.maxShaderAtomicCounters[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001745 break;
1746 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001747 *params = mCaps.maxShaderImageUniforms[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001748 break;
1749 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
Jiawei Shao54aafe52018-04-27 14:54:57 +08001750 *params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
Jiawei Shao361df072017-11-22 09:33:59 +08001751 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07001752 // GLES1 emulation: Caps queries
1753 case GL_MAX_TEXTURE_UNITS:
1754 *params = mCaps.maxMultitextureUnits;
1755 break;
Lingfeng Yange547aac2018-04-05 09:39:20 -07001756 case GL_MAX_MODELVIEW_STACK_DEPTH:
1757 *params = mCaps.maxModelviewMatrixStackDepth;
1758 break;
1759 case GL_MAX_PROJECTION_STACK_DEPTH:
1760 *params = mCaps.maxProjectionMatrixStackDepth;
1761 break;
1762 case GL_MAX_TEXTURE_STACK_DEPTH:
1763 *params = mCaps.maxTextureMatrixStackDepth;
1764 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001765 case GL_MAX_LIGHTS:
1766 *params = mCaps.maxLights;
1767 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001768 case GL_MAX_CLIP_PLANES:
1769 *params = mCaps.maxClipPlanes;
1770 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001771 // GLES1 emulation: Vertex attribute queries
1772 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1773 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1774 case GL_COLOR_ARRAY_BUFFER_BINDING:
1775 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1776 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1777 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1778 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
1779 break;
1780 case GL_VERTEX_ARRAY_STRIDE:
1781 case GL_NORMAL_ARRAY_STRIDE:
1782 case GL_COLOR_ARRAY_STRIDE:
1783 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1784 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1785 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1786 GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
1787 break;
1788 case GL_VERTEX_ARRAY_SIZE:
1789 case GL_COLOR_ARRAY_SIZE:
1790 case GL_TEXTURE_COORD_ARRAY_SIZE:
1791 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1792 GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
1793 break;
1794 case GL_VERTEX_ARRAY_TYPE:
1795 case GL_COLOR_ARRAY_TYPE:
1796 case GL_NORMAL_ARRAY_TYPE:
1797 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1798 case GL_TEXTURE_COORD_ARRAY_TYPE:
1799 getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
1800 GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
1801 break;
1802
jchen1082af6202018-06-22 10:59:52 +08001803 // GL_KHR_parallel_shader_compile
1804 case GL_MAX_SHADER_COMPILER_THREADS_KHR:
1805 *params = mGLState.getMaxShaderCompilerThreads();
1806 break;
1807
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001808 // GL_EXT_blend_func_extended
1809 case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT:
1810 *params = mExtensions.maxDualSourceDrawBuffers;
1811 break;
1812
Jamie Madill231c7f52017-04-26 13:45:37 -04001813 default:
Jamie Madill4f6592f2018-11-27 16:37:45 -05001814 ANGLE_CONTEXT_TRY(mGLState.getIntegerv(this, pname, params));
Jamie Madill231c7f52017-04-26 13:45:37 -04001815 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001816 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001817}
1818
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001819void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001820{
Shannon Woods53a94a82014-06-24 15:20:36 -04001821 // Queries about context capabilities and maximums are answered by Context.
1822 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001823 switch (pname)
1824 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001825 case GL_MAX_ELEMENT_INDEX:
1826 *params = mCaps.maxElementIndex;
1827 break;
1828 case GL_MAX_UNIFORM_BLOCK_SIZE:
1829 *params = mCaps.maxUniformBlockSize;
1830 break;
1831 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001832 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Vertex];
Jamie Madill231c7f52017-04-26 13:45:37 -04001833 break;
1834 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Jiawei Shao0c4e08e2018-05-08 11:00:36 +08001835 *params = mCaps.maxCombinedShaderUniformComponents[ShaderType::Fragment];
Jamie Madill231c7f52017-04-26 13:45:37 -04001836 break;
1837 case GL_MAX_SERVER_WAIT_TIMEOUT:
1838 *params = mCaps.maxServerWaitTimeout;
1839 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001840
Jamie Madill231c7f52017-04-26 13:45:37 -04001841 // GL_EXT_disjoint_timer_query
1842 case GL_TIMESTAMP_EXT:
1843 *params = mImplementation->getTimestamp();
1844 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001845
Jamie Madill231c7f52017-04-26 13:45:37 -04001846 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1847 *params = mCaps.maxShaderStorageBlockSize;
1848 break;
1849 default:
1850 UNREACHABLE();
1851 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001852 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001853}
1854
Geoff Lang70d0f492015-12-10 17:45:46 -05001855void Context::getPointerv(GLenum pname, void **params) const
1856{
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001857 mGLState.getPointerv(this, pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001858}
1859
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07001860void Context::getPointervRobustANGLERobust(GLenum pname,
1861 GLsizei bufSize,
1862 GLsizei *length,
1863 void **params)
1864{
1865 UNIMPLEMENTED();
1866}
1867
Martin Radev66fb8202016-07-28 11:45:20 +03001868void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001869{
Shannon Woods53a94a82014-06-24 15:20:36 -04001870 // Queries about context capabilities and maximums are answered by Context.
1871 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001872
1873 GLenum nativeType;
1874 unsigned int numParams;
1875 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1876 ASSERT(queryStatus);
1877
1878 if (nativeType == GL_INT)
1879 {
1880 switch (target)
1881 {
1882 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1883 ASSERT(index < 3u);
1884 *data = mCaps.maxComputeWorkGroupCount[index];
1885 break;
1886 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1887 ASSERT(index < 3u);
1888 *data = mCaps.maxComputeWorkGroupSize[index];
1889 break;
1890 default:
1891 mGLState.getIntegeri_v(target, index, data);
1892 }
1893 }
1894 else
1895 {
1896 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1897 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001898}
1899
Brandon Jones59770802018-04-02 13:18:42 -07001900void Context::getIntegeri_vRobust(GLenum target,
1901 GLuint index,
1902 GLsizei bufSize,
1903 GLsizei *length,
1904 GLint *data)
1905{
1906 getIntegeri_v(target, index, data);
1907}
1908
Martin Radev66fb8202016-07-28 11:45:20 +03001909void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001910{
Shannon Woods53a94a82014-06-24 15:20:36 -04001911 // Queries about context capabilities and maximums are answered by Context.
1912 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001913
1914 GLenum nativeType;
1915 unsigned int numParams;
1916 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1917 ASSERT(queryStatus);
1918
1919 if (nativeType == GL_INT_64_ANGLEX)
1920 {
1921 mGLState.getInteger64i_v(target, index, data);
1922 }
1923 else
1924 {
1925 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1926 }
1927}
1928
Brandon Jones59770802018-04-02 13:18:42 -07001929void Context::getInteger64i_vRobust(GLenum target,
1930 GLuint index,
1931 GLsizei bufSize,
1932 GLsizei *length,
1933 GLint64 *data)
1934{
1935 getInteger64i_v(target, index, data);
1936}
1937
Martin Radev66fb8202016-07-28 11:45:20 +03001938void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1939{
1940 // Queries about context capabilities and maximums are answered by Context.
1941 // Queries about current GL state values are answered by State.
1942
1943 GLenum nativeType;
1944 unsigned int numParams;
1945 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1946 ASSERT(queryStatus);
1947
1948 if (nativeType == GL_BOOL)
1949 {
1950 mGLState.getBooleani_v(target, index, data);
1951 }
1952 else
1953 {
1954 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1955 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001956}
1957
Brandon Jones59770802018-04-02 13:18:42 -07001958void Context::getBooleani_vRobust(GLenum target,
1959 GLuint index,
1960 GLsizei bufSize,
1961 GLsizei *length,
1962 GLboolean *data)
1963{
1964 getBooleani_v(target, index, data);
1965}
1966
Corentin Wallez336129f2017-10-17 15:55:40 -04001967void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001968{
1969 Buffer *buffer = mGLState.getTargetBuffer(target);
1970 QueryBufferParameteriv(buffer, pname, params);
1971}
1972
Brandon Jones59770802018-04-02 13:18:42 -07001973void Context::getBufferParameterivRobust(BufferBinding target,
1974 GLenum pname,
1975 GLsizei bufSize,
1976 GLsizei *length,
1977 GLint *params)
1978{
1979 getBufferParameteriv(target, pname, params);
1980}
1981
He Yunchao010e4db2017-03-03 14:22:06 +08001982void Context::getFramebufferAttachmentParameteriv(GLenum target,
1983 GLenum attachment,
1984 GLenum pname,
1985 GLint *params)
1986{
1987 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001988 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001989}
1990
Brandon Jones59770802018-04-02 13:18:42 -07001991void Context::getFramebufferAttachmentParameterivRobust(GLenum target,
1992 GLenum attachment,
1993 GLenum pname,
1994 GLsizei bufSize,
1995 GLsizei *length,
1996 GLint *params)
1997{
1998 getFramebufferAttachmentParameteriv(target, attachment, pname, params);
1999}
2000
He Yunchao010e4db2017-03-03 14:22:06 +08002001void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
2002{
2003 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
2004 QueryRenderbufferiv(this, renderbuffer, pname, params);
2005}
2006
Brandon Jones59770802018-04-02 13:18:42 -07002007void Context::getRenderbufferParameterivRobust(GLenum target,
2008 GLenum pname,
2009 GLsizei bufSize,
2010 GLsizei *length,
2011 GLint *params)
2012{
2013 getRenderbufferParameteriv(target, pname, params);
2014}
2015
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002016void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002017{
Till Rathmannb8543632018-10-02 19:46:14 +02002018 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002019 QueryTexParameterfv(texture, pname, params);
2020}
2021
Brandon Jones59770802018-04-02 13:18:42 -07002022void Context::getTexParameterfvRobust(TextureType target,
2023 GLenum pname,
2024 GLsizei bufSize,
2025 GLsizei *length,
2026 GLfloat *params)
2027{
2028 getTexParameterfv(target, pname, params);
2029}
2030
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002031void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002032{
Till Rathmannb8543632018-10-02 19:46:14 +02002033 const Texture *const texture = getTargetTexture(target);
He Yunchao010e4db2017-03-03 14:22:06 +08002034 QueryTexParameteriv(texture, pname, params);
2035}
Jiajia Qin5451d532017-11-16 17:16:34 +08002036
Till Rathmannb8543632018-10-02 19:46:14 +02002037void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
2038{
2039 const Texture *const texture = getTargetTexture(target);
2040 QueryTexParameterIiv(texture, pname, params);
2041}
2042
2043void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
2044{
2045 const Texture *const texture = getTargetTexture(target);
2046 QueryTexParameterIuiv(texture, pname, params);
2047}
2048
Brandon Jones59770802018-04-02 13:18:42 -07002049void Context::getTexParameterivRobust(TextureType target,
2050 GLenum pname,
2051 GLsizei bufSize,
2052 GLsizei *length,
2053 GLint *params)
2054{
2055 getTexParameteriv(target, pname, params);
2056}
2057
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002058void Context::getTexParameterIivRobust(TextureType target,
2059 GLenum pname,
2060 GLsizei bufSize,
2061 GLsizei *length,
2062 GLint *params)
2063{
2064 UNIMPLEMENTED();
2065}
2066
2067void Context::getTexParameterIuivRobust(TextureType target,
2068 GLenum pname,
2069 GLsizei bufSize,
2070 GLsizei *length,
2071 GLuint *params)
2072{
2073 UNIMPLEMENTED();
2074}
2075
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002076void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002077{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002078 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002079 QueryTexLevelParameteriv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002080}
2081
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002082void Context::getTexLevelParameterivRobust(TextureTarget target,
2083 GLint level,
2084 GLenum pname,
2085 GLsizei bufSize,
2086 GLsizei *length,
2087 GLint *params)
2088{
2089 UNIMPLEMENTED();
2090}
2091
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002092void Context::getTexLevelParameterfv(TextureTarget target,
2093 GLint level,
2094 GLenum pname,
2095 GLfloat *params)
Jiajia Qin5451d532017-11-16 17:16:34 +08002096{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002097 Texture *texture = getTargetTexture(TextureTargetToType(target));
Corentin Wallez99d492c2018-02-27 15:17:10 -05002098 QueryTexLevelParameterfv(texture, target, level, pname, params);
Jiajia Qin5451d532017-11-16 17:16:34 +08002099}
2100
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002101void Context::getTexLevelParameterfvRobust(TextureTarget target,
2102 GLint level,
2103 GLenum pname,
2104 GLsizei bufSize,
2105 GLsizei *length,
2106 GLfloat *params)
2107{
2108 UNIMPLEMENTED();
2109}
2110
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002111void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
He Yunchao010e4db2017-03-03 14:22:06 +08002112{
Till Rathmannb8543632018-10-02 19:46:14 +02002113 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002114 SetTexParameterf(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08002115}
2116
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002117void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002118{
Till Rathmannb8543632018-10-02 19:46:14 +02002119 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002120 SetTexParameterfv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002121}
2122
Brandon Jones59770802018-04-02 13:18:42 -07002123void Context::texParameterfvRobust(TextureType target,
2124 GLenum pname,
2125 GLsizei bufSize,
2126 const GLfloat *params)
2127{
2128 texParameterfv(target, pname, params);
2129}
2130
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002131void Context::texParameteri(TextureType target, GLenum pname, GLint param)
He Yunchao010e4db2017-03-03 14:22:06 +08002132{
Till Rathmannb8543632018-10-02 19:46:14 +02002133 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002134 SetTexParameteri(this, texture, pname, param);
He Yunchao010e4db2017-03-03 14:22:06 +08002135}
2136
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002137void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08002138{
Till Rathmannb8543632018-10-02 19:46:14 +02002139 Texture *const texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04002140 SetTexParameteriv(this, texture, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08002141}
2142
Till Rathmannb8543632018-10-02 19:46:14 +02002143void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
2144{
2145 Texture *const texture = getTargetTexture(target);
2146 SetTexParameterIiv(this, texture, pname, params);
Till Rathmannb8543632018-10-02 19:46:14 +02002147}
2148
2149void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
2150{
2151 Texture *const texture = getTargetTexture(target);
2152 SetTexParameterIuiv(this, texture, pname, params);
Till Rathmannb8543632018-10-02 19:46:14 +02002153}
2154
Brandon Jones59770802018-04-02 13:18:42 -07002155void Context::texParameterivRobust(TextureType target,
2156 GLenum pname,
2157 GLsizei bufSize,
2158 const GLint *params)
2159{
2160 texParameteriv(target, pname, params);
2161}
2162
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002163void Context::texParameterIivRobust(TextureType target,
2164 GLenum pname,
2165 GLsizei bufSize,
2166 const GLint *params)
2167{
2168 UNIMPLEMENTED();
2169}
2170
2171void Context::texParameterIuivRobust(TextureType target,
2172 GLenum pname,
2173 GLsizei bufSize,
2174 const GLuint *params)
2175{
2176 UNIMPLEMENTED();
2177}
2178
Jamie Madill493f9572018-05-24 19:52:15 -04002179void Context::drawArraysInstanced(PrimitiveMode mode,
2180 GLint first,
2181 GLsizei count,
2182 GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04002183{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002184 // No-op if count draws no primitives for given mode
2185 if (noopDrawInstanced(mode, count, instanceCount))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002186 {
2187 return;
2188 }
2189
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002190 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002191 ANGLE_CONTEXT_TRY(
2192 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05002193 MarkTransformFeedbackBufferUsage(this, count, instanceCount);
Geoff Langf6db0982015-08-25 13:04:00 -04002194}
2195
Jamie Madill493f9572018-05-24 19:52:15 -04002196void Context::drawElementsInstanced(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002197 GLsizei count,
Jamie Madill8dc27f92018-11-29 11:45:44 -05002198 DrawElementsType type,
Jamie Madill876429b2017-04-20 15:46:24 -04002199 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04002200 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04002201{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002202 // No-op if count draws no primitives for given mode
2203 if (noopDrawInstanced(mode, count, instances))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002204 {
2205 return;
2206 }
2207
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002208 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002209 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08002210 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04002211}
2212
Jamie Madill493f9572018-05-24 19:52:15 -04002213void Context::drawRangeElements(PrimitiveMode mode,
Jamie Madill675fe712016-12-19 13:07:54 -05002214 GLuint start,
2215 GLuint end,
2216 GLsizei count,
Jamie Madill8dc27f92018-11-29 11:45:44 -05002217 DrawElementsType type,
Jamie Madill876429b2017-04-20 15:46:24 -04002218 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04002219{
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06002220 // No-op if count draws no primitives for given mode
2221 if (noopDraw(mode, count))
Jamie Madill9fdaa492018-02-16 10:52:11 -05002222 {
2223 return;
2224 }
2225
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002226 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002227 ANGLE_CONTEXT_TRY(
2228 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002229}
2230
Jamie Madill493f9572018-05-24 19:52:15 -04002231void Context::drawArraysIndirect(PrimitiveMode mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002232{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002233 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002234 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002235}
2236
Jamie Madill8dc27f92018-11-29 11:45:44 -05002237void Context::drawElementsIndirect(PrimitiveMode mode, DrawElementsType type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08002238{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002239 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
Jamie Madillb6664922017-07-25 12:55:04 -04002240 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08002241}
2242
Jamie Madill675fe712016-12-19 13:07:54 -05002243void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002244{
Jamie Madill4f6592f2018-11-27 16:37:45 -05002245 ANGLE_CONTEXT_TRY(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05002246}
2247
Jamie Madill675fe712016-12-19 13:07:54 -05002248void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05002249{
Jamie Madill4f6592f2018-11-27 16:37:45 -05002250 ANGLE_CONTEXT_TRY(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002251}
2252
Austin Kinross6ee1e782015-05-29 17:05:37 -07002253void Context::insertEventMarker(GLsizei length, const char *marker)
2254{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002255 ASSERT(mImplementation);
2256 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07002257}
2258
2259void Context::pushGroupMarker(GLsizei length, const char *marker)
2260{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002261 ASSERT(mImplementation);
Jamie Madill007530e2017-12-28 14:27:04 -05002262
2263 if (marker == nullptr)
2264 {
2265 // From the EXT_debug_marker spec,
2266 // "If <marker> is null then an empty string is pushed on the stack."
2267 mImplementation->pushGroupMarker(length, "");
2268 }
2269 else
2270 {
2271 mImplementation->pushGroupMarker(length, marker);
2272 }
Austin Kinross6ee1e782015-05-29 17:05:37 -07002273}
2274
2275void Context::popGroupMarker()
2276{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002277 ASSERT(mImplementation);
2278 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07002279}
2280
Geoff Langd8605522016-04-13 10:19:12 -04002281void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
2282{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002283 Program *programObject = getProgramResolveLink(program);
Geoff Langd8605522016-04-13 10:19:12 -04002284 ASSERT(programObject);
2285
2286 programObject->bindUniformLocation(location, name);
2287}
2288
Brandon Jones59770802018-04-02 13:18:42 -07002289void Context::coverageModulation(GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03002290{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002291 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03002292}
2293
Brandon Jones59770802018-04-02 13:18:42 -07002294void Context::matrixLoadf(GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002295{
2296 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
2297}
2298
Brandon Jones59770802018-04-02 13:18:42 -07002299void Context::matrixLoadIdentity(GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03002300{
2301 GLfloat I[16];
2302 angle::Matrix<GLfloat>::setToIdentity(I);
2303
2304 mGLState.loadPathRenderingMatrix(matrixMode, I);
2305}
2306
2307void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
2308{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002309 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002310 if (!pathObj)
2311 return;
2312
Geoff Lang9bf86f02018-07-26 11:46:34 -04002313 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002314
2315 mImplementation->stencilFillPath(pathObj, fillMode, mask);
2316}
2317
2318void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
2319{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002320 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002321 if (!pathObj)
2322 return;
2323
Geoff Lang9bf86f02018-07-26 11:46:34 -04002324 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002325
2326 mImplementation->stencilStrokePath(pathObj, reference, mask);
2327}
2328
2329void Context::coverFillPath(GLuint path, GLenum coverMode)
2330{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002331 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002332 if (!pathObj)
2333 return;
2334
Geoff Lang9bf86f02018-07-26 11:46:34 -04002335 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002336
2337 mImplementation->coverFillPath(pathObj, coverMode);
2338}
2339
2340void Context::coverStrokePath(GLuint path, GLenum coverMode)
2341{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002342 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002343 if (!pathObj)
2344 return;
2345
Geoff Lang9bf86f02018-07-26 11:46:34 -04002346 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002347
2348 mImplementation->coverStrokePath(pathObj, coverMode);
2349}
2350
2351void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
2352{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002353 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002354 if (!pathObj)
2355 return;
2356
Geoff Lang9bf86f02018-07-26 11:46:34 -04002357 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002358
2359 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
2360}
2361
2362void Context::stencilThenCoverStrokePath(GLuint path,
2363 GLint reference,
2364 GLuint mask,
2365 GLenum coverMode)
2366{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002367 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03002368 if (!pathObj)
2369 return;
2370
Geoff Lang9bf86f02018-07-26 11:46:34 -04002371 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänene45e53b2016-05-25 10:36:04 +03002372
2373 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
2374}
2375
Sami Väisänend59ca052016-06-21 16:10:00 +03002376void Context::coverFillPathInstanced(GLsizei numPaths,
2377 GLenum pathNameType,
2378 const void *paths,
2379 GLuint pathBase,
2380 GLenum coverMode,
2381 GLenum transformType,
2382 const GLfloat *transformValues)
2383{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002384 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002385
Geoff Lang9bf86f02018-07-26 11:46:34 -04002386 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002387
2388 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
2389}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002390
Sami Väisänend59ca052016-06-21 16:10:00 +03002391void Context::coverStrokePathInstanced(GLsizei numPaths,
2392 GLenum pathNameType,
2393 const void *paths,
2394 GLuint pathBase,
2395 GLenum coverMode,
2396 GLenum transformType,
2397 const GLfloat *transformValues)
2398{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002399 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002400
2401 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
Geoff Lang9bf86f02018-07-26 11:46:34 -04002402 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002403
2404 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
2405 transformValues);
2406}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002407
Sami Väisänend59ca052016-06-21 16:10:00 +03002408void Context::stencilFillPathInstanced(GLsizei numPaths,
2409 GLenum pathNameType,
2410 const void *paths,
2411 GLuint pathBase,
2412 GLenum fillMode,
2413 GLuint mask,
2414 GLenum transformType,
2415 const GLfloat *transformValues)
2416{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002417 const auto &pathObjects = GatherPaths(*mState.mPaths, 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{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002435 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002436
Geoff Lang9bf86f02018-07-26 11:46:34 -04002437 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002438
2439 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2440 transformValues);
2441}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002442
Sami Väisänend59ca052016-06-21 16:10:00 +03002443void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2444 GLenum pathNameType,
2445 const void *paths,
2446 GLuint pathBase,
2447 GLenum fillMode,
2448 GLuint mask,
2449 GLenum coverMode,
2450 GLenum transformType,
2451 const GLfloat *transformValues)
2452{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002453 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002454
Geoff Lang9bf86f02018-07-26 11:46:34 -04002455 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002456
2457 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2458 transformType, transformValues);
2459}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002460
Sami Väisänend59ca052016-06-21 16:10:00 +03002461void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2462 GLenum pathNameType,
2463 const void *paths,
2464 GLuint pathBase,
2465 GLint reference,
2466 GLuint mask,
2467 GLenum coverMode,
2468 GLenum transformType,
2469 const GLfloat *transformValues)
2470{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002471 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002472
Geoff Lang9bf86f02018-07-26 11:46:34 -04002473 ANGLE_CONTEXT_TRY(syncStateForPathOperation());
Sami Väisänend59ca052016-06-21 16:10:00 +03002474
2475 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2476 transformType, transformValues);
2477}
2478
Sami Väisänen46eaa942016-06-29 10:26:37 +03002479void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2480{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002481 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002482
2483 programObject->bindFragmentInputLocation(location, name);
2484}
2485
2486void Context::programPathFragmentInputGen(GLuint program,
2487 GLint location,
2488 GLenum genMode,
2489 GLint components,
2490 const GLfloat *coeffs)
2491{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002492 auto *programObject = getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002493
jchen103fd614d2018-08-13 12:21:58 +08002494 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002495}
2496
jchen1015015f72017-03-16 13:54:21 +08002497GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2498{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002499 const Program *programObject = getProgramResolveLink(program);
jchen1015015f72017-03-16 13:54:21 +08002500 return QueryProgramResourceIndex(programObject, programInterface, name);
2501}
2502
jchen10fd7c3b52017-03-21 15:36:03 +08002503void Context::getProgramResourceName(GLuint program,
2504 GLenum programInterface,
2505 GLuint index,
2506 GLsizei bufSize,
2507 GLsizei *length,
2508 GLchar *name)
2509{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002510 const Program *programObject = getProgramResolveLink(program);
jchen10fd7c3b52017-03-21 15:36:03 +08002511 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2512}
2513
jchen10191381f2017-04-11 13:59:04 +08002514GLint Context::getProgramResourceLocation(GLuint program,
2515 GLenum programInterface,
2516 const GLchar *name)
2517{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002518 const Program *programObject = getProgramResolveLink(program);
jchen10191381f2017-04-11 13:59:04 +08002519 return QueryProgramResourceLocation(programObject, programInterface, name);
2520}
2521
jchen10880683b2017-04-12 16:21:55 +08002522void Context::getProgramResourceiv(GLuint program,
2523 GLenum programInterface,
2524 GLuint index,
2525 GLsizei propCount,
2526 const GLenum *props,
2527 GLsizei bufSize,
2528 GLsizei *length,
2529 GLint *params)
2530{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002531 const Program *programObject = getProgramResolveLink(program);
jchen10880683b2017-04-12 16:21:55 +08002532 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2533 length, params);
2534}
2535
jchen10d9cd7b72017-08-30 15:04:25 +08002536void Context::getProgramInterfaceiv(GLuint program,
2537 GLenum programInterface,
2538 GLenum pname,
2539 GLint *params)
2540{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002541 const Program *programObject = getProgramResolveLink(program);
jchen10d9cd7b72017-08-30 15:04:25 +08002542 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2543}
2544
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002545void Context::getProgramInterfaceivRobust(GLuint program,
2546 GLenum programInterface,
2547 GLenum pname,
2548 GLsizei bufSize,
2549 GLsizei *length,
2550 GLint *params)
2551{
2552 UNIMPLEMENTED();
2553}
2554
Jamie Madillabfbc0f2018-10-09 12:48:52 -04002555void Context::handleError(GLenum errorCode,
2556 const char *message,
2557 const char *file,
2558 const char *function,
2559 unsigned int line)
2560{
2561 mErrors.handleError(errorCode, message, file, function, line);
2562}
2563
Jamie Madilla139f012018-10-10 16:13:03 -04002564void Context::validationError(GLenum errorCode, const char *message)
2565{
2566 mErrors.validationError(errorCode, message);
2567}
2568
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002569// Get one of the recorded errors and clear its flag, if any.
2570// [OpenGL ES 2.0.24] section 2.5 page 13.
2571GLenum Context::getError()
2572{
Geoff Langda5777c2014-07-11 09:52:58 -04002573 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002574 {
Geoff Langda5777c2014-07-11 09:52:58 -04002575 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002576 }
Geoff Langda5777c2014-07-11 09:52:58 -04002577 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002578 {
Jamie Madill6b873dd2018-07-12 23:56:30 -04002579 return mErrors.popError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002580 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002581}
2582
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002583// NOTE: this function should not assume that this context is current!
Jamie Madill6b873dd2018-07-12 23:56:30 -04002584void Context::markContextLost()
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002585{
2586 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002587 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002588 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002589 mContextLostForced = true;
2590 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002591 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002592}
2593
Jamie Madillfa920eb2018-01-04 11:45:50 -05002594GLenum Context::getGraphicsResetStatus()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002595{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002596 // Even if the application doesn't want to know about resets, we want to know
2597 // as it will allow us to skip all the calls.
2598 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002599 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002600 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002601 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002602 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002603 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002604
2605 // EXT_robustness, section 2.6: If the reset notification behavior is
2606 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2607 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2608 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002609 }
2610
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002611 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2612 // status should be returned at least once, and GL_NO_ERROR should be returned
2613 // once the device has finished resetting.
2614 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002615 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002616 ASSERT(mResetStatus == GL_NO_ERROR);
2617 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002618
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002619 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002620 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002621 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002622 }
2623 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002624 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002625 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002626 // If markContextLost was used to mark the context lost then
2627 // assume that is not recoverable, and continue to report the
2628 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002629 mResetStatus = mImplementation->getResetStatus();
2630 }
Jamie Madill893ab082014-05-16 16:56:10 -04002631
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002632 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002633}
2634
2635bool Context::isResetNotificationEnabled()
2636{
2637 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2638}
2639
Corentin Walleze3b10e82015-05-20 11:06:25 -04002640const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002641{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002642 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002643}
2644
2645EGLenum Context::getClientType() const
2646{
2647 return mClientType;
2648}
2649
2650EGLenum Context::getRenderBuffer() const
2651{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002652 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2653 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002654 {
2655 return EGL_NONE;
2656 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002657
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002658 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002659 ASSERT(backAttachment != nullptr);
2660 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002661}
2662
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002663VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002664{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002665 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002666 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2667 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002668 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002669 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2670 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002671
Jamie Madill96a483b2017-06-27 16:49:21 -04002672 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002673 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002674
2675 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002676}
2677
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002678TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002679{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002680 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002681 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2682 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002683 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002684 transformFeedback =
2685 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002686 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002687 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002688 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002689
2690 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002691}
2692
2693bool Context::isVertexArrayGenerated(GLuint vertexArray)
2694{
Jamie Madill96a483b2017-06-27 16:49:21 -04002695 ASSERT(mVertexArrayMap.contains(0));
2696 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002697}
2698
2699bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2700{
Jamie Madill96a483b2017-06-27 16:49:21 -04002701 ASSERT(mTransformFeedbackMap.contains(0));
2702 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002703}
2704
Shannon Woods53a94a82014-06-24 15:20:36 -04002705void Context::detachTexture(GLuint texture)
2706{
2707 // Simple pass-through to State's detachTexture method, as textures do not require
2708 // allocation map management either here or in the resource manager at detach time.
2709 // Zero textures are held by the Context, and we don't attempt to request them from
2710 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002711 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002712}
2713
James Darpinian4d9d4832018-03-13 12:43:28 -07002714void Context::detachBuffer(Buffer *buffer)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002715{
Yuly Novikov5807a532015-12-03 13:01:22 -05002716 // Simple pass-through to State's detachBuffer method, since
2717 // only buffer attachments to container objects that are bound to the current context
2718 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002719
Yuly Novikov5807a532015-12-03 13:01:22 -05002720 // [OpenGL ES 3.2] section 5.1.2 page 45:
2721 // Attachments to unbound container objects, such as
2722 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2723 // are not affected and continue to act as references on the deleted object
Geoff Lang91002262018-12-12 16:05:24 -05002724 ANGLE_CONTEXT_TRY(mGLState.detachBuffer(this, buffer));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002725}
2726
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002727void Context::detachFramebuffer(GLuint framebuffer)
2728{
Shannon Woods53a94a82014-06-24 15:20:36 -04002729 // Framebuffer detachment is handled by Context, because 0 is a valid
2730 // Framebuffer object, and a pointer to it must be passed from Context
2731 // to State at binding time.
2732
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002733 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002734 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2735 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2736 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002737
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002738 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002739 {
2740 bindReadFramebuffer(0);
2741 }
2742
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002743 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002744 {
2745 bindDrawFramebuffer(0);
2746 }
2747}
2748
2749void Context::detachRenderbuffer(GLuint renderbuffer)
2750{
Jamie Madilla02315b2017-02-23 14:14:47 -05002751 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002752}
2753
Jamie Madill57a89722013-07-02 11:57:03 -04002754void Context::detachVertexArray(GLuint vertexArray)
2755{
Jamie Madill77a72f62015-04-14 11:18:32 -04002756 // Vertex array detachment is handled by Context, because 0 is a valid
2757 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002758 // binding time.
2759
Jamie Madill57a89722013-07-02 11:57:03 -04002760 // [OpenGL ES 3.0.2] section 2.10 page 43:
2761 // If a vertex array object that is currently bound is deleted, the binding
2762 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madill7267aa62018-04-17 15:28:21 -04002763 if (mGLState.removeVertexArrayBinding(this, vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002764 {
2765 bindVertexArray(0);
2766 }
2767}
2768
Geoff Langc8058452014-02-03 12:04:11 -05002769void Context::detachTransformFeedback(GLuint transformFeedback)
2770{
Corentin Walleza2257da2016-04-19 16:43:12 -04002771 // Transform feedback detachment is handled by Context, because 0 is a valid
2772 // transform feedback, and a pointer to it must be passed from Context to State at
2773 // binding time.
2774
2775 // The OpenGL specification doesn't mention what should happen when the currently bound
2776 // transform feedback object is deleted. Since it is a container object, we treat it like
2777 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002778 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002779 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002780 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002781 }
Geoff Langc8058452014-02-03 12:04:11 -05002782}
2783
Jamie Madilldc356042013-07-19 16:36:57 -04002784void Context::detachSampler(GLuint sampler)
2785{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002786 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002787}
2788
Yunchao Hea336b902017-08-02 16:05:21 +08002789void Context::detachProgramPipeline(GLuint pipeline)
2790{
2791 mGLState.detachProgramPipeline(this, pipeline);
2792}
2793
Jamie Madill3ef140a2017-08-26 23:11:21 -04002794void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002795{
Shaodde78e82017-05-22 14:13:27 +08002796 mGLState.setVertexAttribDivisor(this, index, divisor);
Jamie Madillc43cdad2018-08-08 15:49:25 -04002797 mStateCache.onVertexArrayStateChange(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002798}
2799
Jamie Madille29d1672013-07-19 16:36:57 -04002800void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2801{
Till Rathmannb8543632018-10-02 19:46:14 +02002802 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002803 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002804 SetSamplerParameteri(this, samplerObject, pname, param);
Geoff Langc1984ed2016-10-07 12:41:00 -04002805}
Jamie Madille29d1672013-07-19 16:36:57 -04002806
Geoff Langc1984ed2016-10-07 12:41:00 -04002807void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2808{
Till Rathmannb8543632018-10-02 19:46:14 +02002809 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002810 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002811 SetSamplerParameteriv(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002812}
2813
Till Rathmannb8543632018-10-02 19:46:14 +02002814void Context::samplerParameterIiv(GLuint sampler, GLenum pname, const GLint *param)
2815{
2816 Sampler *const samplerObject =
2817 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2818 SetSamplerParameterIiv(this, samplerObject, pname, param);
2819}
2820
2821void Context::samplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *param)
2822{
2823 Sampler *const samplerObject =
2824 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2825 SetSamplerParameterIuiv(this, samplerObject, pname, param);
2826}
2827
Brandon Jones59770802018-04-02 13:18:42 -07002828void Context::samplerParameterivRobust(GLuint sampler,
2829 GLenum pname,
2830 GLsizei bufSize,
2831 const GLint *param)
2832{
2833 samplerParameteriv(sampler, pname, param);
2834}
2835
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002836void Context::samplerParameterIivRobust(GLuint sampler,
2837 GLenum pname,
2838 GLsizei bufSize,
2839 const GLint *param)
2840{
2841 UNIMPLEMENTED();
2842}
2843
2844void Context::samplerParameterIuivRobust(GLuint sampler,
2845 GLenum pname,
2846 GLsizei bufSize,
2847 const GLuint *param)
2848{
2849 UNIMPLEMENTED();
2850}
2851
Jamie Madille29d1672013-07-19 16:36:57 -04002852void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2853{
Till Rathmannb8543632018-10-02 19:46:14 +02002854 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002855 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002856 SetSamplerParameterf(this, samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002857}
2858
Geoff Langc1984ed2016-10-07 12:41:00 -04002859void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002860{
Till Rathmannb8543632018-10-02 19:46:14 +02002861 Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002862 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Jamie Madille25b8002018-09-20 13:39:49 -04002863 SetSamplerParameterfv(this, samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002864}
2865
Brandon Jones59770802018-04-02 13:18:42 -07002866void Context::samplerParameterfvRobust(GLuint sampler,
2867 GLenum pname,
2868 GLsizei bufSize,
2869 const GLfloat *param)
2870{
2871 samplerParameterfv(sampler, pname, param);
2872}
2873
Geoff Langc1984ed2016-10-07 12:41:00 -04002874void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002875{
Till Rathmannb8543632018-10-02 19:46:14 +02002876 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002877 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002878 QuerySamplerParameteriv(samplerObject, pname, params);
2879}
Jamie Madill9675b802013-07-19 16:36:59 -04002880
Till Rathmannb8543632018-10-02 19:46:14 +02002881void Context::getSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
2882{
2883 const Sampler *const samplerObject =
2884 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2885 QuerySamplerParameterIiv(samplerObject, pname, params);
2886}
2887
2888void Context::getSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
2889{
2890 const Sampler *const samplerObject =
2891 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
2892 QuerySamplerParameterIuiv(samplerObject, pname, params);
2893}
2894
Brandon Jones59770802018-04-02 13:18:42 -07002895void Context::getSamplerParameterivRobust(GLuint sampler,
2896 GLenum pname,
2897 GLsizei bufSize,
2898 GLsizei *length,
2899 GLint *params)
2900{
2901 getSamplerParameteriv(sampler, pname, params);
2902}
2903
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002904void Context::getSamplerParameterIivRobust(GLuint sampler,
2905 GLenum pname,
2906 GLsizei bufSize,
2907 GLsizei *length,
2908 GLint *params)
2909{
2910 UNIMPLEMENTED();
2911}
2912
2913void Context::getSamplerParameterIuivRobust(GLuint sampler,
2914 GLenum pname,
2915 GLsizei bufSize,
2916 GLsizei *length,
2917 GLuint *params)
2918{
2919 UNIMPLEMENTED();
2920}
2921
Geoff Langc1984ed2016-10-07 12:41:00 -04002922void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2923{
Till Rathmannb8543632018-10-02 19:46:14 +02002924 const Sampler *const samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002925 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002926 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002927}
2928
Brandon Jones59770802018-04-02 13:18:42 -07002929void Context::getSamplerParameterfvRobust(GLuint sampler,
2930 GLenum pname,
2931 GLsizei bufSize,
2932 GLsizei *length,
2933 GLfloat *params)
2934{
2935 getSamplerParameterfv(sampler, pname, params);
2936}
2937
Olli Etuahof0fee072016-03-30 15:11:58 +03002938void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2939{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002940 gl::Program *programObject = getProgramResolveLink(program);
Yunchao He61afff12017-03-14 15:34:03 +08002941 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002942}
2943
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002944void Context::initRendererString()
2945{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002946 std::ostringstream rendererString;
2947 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002948 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002949 rendererString << ")";
2950
Geoff Langcec35902014-04-16 10:52:36 -04002951 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002952}
2953
Geoff Langc339c4e2016-11-29 10:37:36 -05002954void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002955{
Geoff Langc339c4e2016-11-29 10:37:36 -05002956 const Version &clientVersion = getClientVersion();
2957
2958 std::ostringstream versionString;
2959 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2960 << ANGLE_VERSION_STRING << ")";
2961 mVersionString = MakeStaticString(versionString.str());
2962
2963 std::ostringstream shadingLanguageVersionString;
2964 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2965 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2966 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2967 << ")";
2968 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002969}
2970
Geoff Langcec35902014-04-16 10:52:36 -04002971void Context::initExtensionStrings()
2972{
Geoff Langc339c4e2016-11-29 10:37:36 -05002973 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2974 std::ostringstream combinedStringStream;
2975 std::copy(strings.begin(), strings.end(),
2976 std::ostream_iterator<const char *>(combinedStringStream, " "));
2977 return MakeStaticString(combinedStringStream.str());
2978 };
2979
2980 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002981 for (const auto &extensionString : mExtensions.getStrings())
2982 {
2983 mExtensionStrings.push_back(MakeStaticString(extensionString));
2984 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002985 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002986
Geoff Langc339c4e2016-11-29 10:37:36 -05002987 mRequestableExtensionStrings.clear();
2988 for (const auto &extensionInfo : GetExtensionInfoMap())
2989 {
2990 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002991 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
Geoff Langb0f917f2017-12-05 13:41:54 -05002992 mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002993 {
2994 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2995 }
2996 }
2997 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002998}
2999
Geoff Langc339c4e2016-11-29 10:37:36 -05003000const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04003001{
Geoff Langc339c4e2016-11-29 10:37:36 -05003002 switch (name)
3003 {
3004 case GL_VENDOR:
3005 return reinterpret_cast<const GLubyte *>("Google Inc.");
3006
3007 case GL_RENDERER:
3008 return reinterpret_cast<const GLubyte *>(mRendererString);
3009
3010 case GL_VERSION:
3011 return reinterpret_cast<const GLubyte *>(mVersionString);
3012
3013 case GL_SHADING_LANGUAGE_VERSION:
3014 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
3015
3016 case GL_EXTENSIONS:
3017 return reinterpret_cast<const GLubyte *>(mExtensionString);
3018
3019 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3020 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
3021
3022 default:
3023 UNREACHABLE();
3024 return nullptr;
3025 }
Geoff Langcec35902014-04-16 10:52:36 -04003026}
3027
Geoff Langc339c4e2016-11-29 10:37:36 -05003028const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04003029{
Geoff Langc339c4e2016-11-29 10:37:36 -05003030 switch (name)
3031 {
3032 case GL_EXTENSIONS:
3033 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
3034
3035 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3036 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
3037
3038 default:
3039 UNREACHABLE();
3040 return nullptr;
3041 }
Geoff Langcec35902014-04-16 10:52:36 -04003042}
3043
3044size_t Context::getExtensionStringCount() const
3045{
3046 return mExtensionStrings.size();
3047}
3048
Geoff Lang111a99e2017-10-17 10:58:41 -04003049bool Context::isExtensionRequestable(const char *name)
3050{
3051 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3052 auto extension = extensionInfos.find(name);
3053
Geoff Lang111a99e2017-10-17 10:58:41 -04003054 return extension != extensionInfos.end() && extension->second.Requestable &&
Geoff Langb0f917f2017-12-05 13:41:54 -05003055 mSupportedExtensions.*(extension->second.ExtensionsMember);
Geoff Lang111a99e2017-10-17 10:58:41 -04003056}
3057
Geoff Langc339c4e2016-11-29 10:37:36 -05003058void Context::requestExtension(const char *name)
3059{
3060 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
3061 ASSERT(extensionInfos.find(name) != extensionInfos.end());
3062 const auto &extension = extensionInfos.at(name);
3063 ASSERT(extension.Requestable);
Geoff Langb0f917f2017-12-05 13:41:54 -05003064 ASSERT(isExtensionRequestable(name));
Geoff Langc339c4e2016-11-29 10:37:36 -05003065
3066 if (mExtensions.*(extension.ExtensionsMember))
3067 {
3068 // Extension already enabled
3069 return;
3070 }
3071
3072 mExtensions.*(extension.ExtensionsMember) = true;
3073 updateCaps();
3074 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08003075
Jamie Madill2f348d22017-06-05 10:50:59 -04003076 // Release the shader compiler so it will be re-created with the requested extensions enabled.
3077 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04003078
Jamie Madill81c2e252017-09-09 23:32:46 -04003079 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
3080 // sampleable.
Jamie Madilld4442552018-02-27 22:03:47 -05003081 mState.mTextures->signalAllTexturesDirty(this);
Geoff Lang9aded172017-04-05 11:07:56 -04003082 for (auto &zeroTexture : mZeroTextures)
3083 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003084 if (zeroTexture.get() != nullptr)
3085 {
Jamie Madille3e680c2018-12-03 17:49:08 -05003086 zeroTexture->signalDirtyStorage(this, InitState::Initialized);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003087 }
Geoff Lang9aded172017-04-05 11:07:56 -04003088 }
3089
Jamie Madillb983a4b2018-08-01 11:34:51 -04003090 mState.mFramebuffers->invalidateFramebufferComplenessCache(this);
Geoff Langc339c4e2016-11-29 10:37:36 -05003091}
3092
3093size_t Context::getRequestableExtensionStringCount() const
3094{
3095 return mRequestableExtensionStrings.size();
3096}
3097
Jamie Madill493f9572018-05-24 19:52:15 -04003098void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003099{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003100 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003101 ASSERT(transformFeedback != nullptr);
3102 ASSERT(!transformFeedback->isPaused());
3103
Geoff Lang91002262018-12-12 16:05:24 -05003104 ANGLE_CONTEXT_TRY(transformFeedback->begin(this, primitiveMode, mGLState.getProgram()));
Jamie Madill3a256222018-12-08 09:56:39 -05003105 mStateCache.onActiveTransformFeedbackChange(this);
Olli Etuahoc3e55a42016-03-09 16:29:18 +02003106}
3107
3108bool Context::hasActiveTransformFeedback(GLuint program) const
3109{
3110 for (auto pair : mTransformFeedbackMap)
3111 {
3112 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
3113 {
3114 return true;
3115 }
3116 }
3117 return false;
3118}
3119
Geoff Lang33f11fb2018-05-07 13:42:47 -04003120Extensions Context::generateSupportedExtensions() const
Geoff Langb0f917f2017-12-05 13:41:54 -05003121{
3122 Extensions supportedExtensions = mImplementation->getNativeExtensions();
3123
jchen1082af6202018-06-22 10:59:52 +08003124 // Explicitly enable GL_KHR_parallel_shader_compile
3125 supportedExtensions.parallelShaderCompile = true;
3126
Geoff Langb0f917f2017-12-05 13:41:54 -05003127 if (getClientVersion() < ES_2_0)
3128 {
3129 // Default extensions for GLES1
Lingfeng Yang0df813c2018-07-12 12:52:06 -07003130 supportedExtensions.pointSizeArray = true;
3131 supportedExtensions.textureCubeMap = true;
3132 supportedExtensions.pointSprite = true;
3133 supportedExtensions.drawTexture = true;
jchen1082af6202018-06-22 10:59:52 +08003134 supportedExtensions.parallelShaderCompile = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003135 }
3136
3137 if (getClientVersion() < ES_3_0)
3138 {
3139 // Disable ES3+ extensions
3140 supportedExtensions.colorBufferFloat = false;
3141 supportedExtensions.eglImageExternalEssl3 = false;
3142 supportedExtensions.textureNorm16 = false;
3143 supportedExtensions.multiview = false;
3144 supportedExtensions.maxViews = 1u;
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07003145 supportedExtensions.copyTexture3d = false;
Yizhou Jiang7818a852018-09-06 15:02:04 +08003146 supportedExtensions.textureMultisample = false;
Geoff Lang7198ebc2018-11-22 14:36:06 -05003147
3148 // Don't expose GL_EXT_texture_sRGB_decode without sRGB texture support
3149 if (!supportedExtensions.sRGB)
3150 {
3151 supportedExtensions.textureSRGBDecode = false;
3152 }
Geoff Langb0f917f2017-12-05 13:41:54 -05003153 }
3154
3155 if (getClientVersion() < ES_3_1)
3156 {
3157 // Disable ES3.1+ extensions
3158 supportedExtensions.geometryShader = false;
Olli Etuahod310a432018-08-24 15:40:23 +03003159
3160 // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well
3161 // once 2D multisample texture extension is exposed there.
Olli Etuaho064458a2018-08-30 14:02:02 +03003162 supportedExtensions.textureStorageMultisample2DArray = false;
Geoff Langb0f917f2017-12-05 13:41:54 -05003163 }
3164
3165 if (getClientVersion() > ES_2_0)
3166 {
3167 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
3168 // supportedExtensions.sRGB = false;
3169 }
3170
3171 // Some extensions are always available because they are implemented in the GL layer.
3172 supportedExtensions.bindUniformLocation = true;
3173 supportedExtensions.vertexArrayObject = true;
3174 supportedExtensions.bindGeneratesResource = true;
3175 supportedExtensions.clientArrays = true;
3176 supportedExtensions.requestExtension = true;
Austin Eng7cf9cd22018-10-09 15:27:32 -07003177 supportedExtensions.multiDraw = true;
Geoff Langb0f917f2017-12-05 13:41:54 -05003178
3179 // Enable the no error extension if the context was created with the flag.
3180 supportedExtensions.noError = mSkipValidation;
3181
3182 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Geoff Lang33f11fb2018-05-07 13:42:47 -04003183 supportedExtensions.surfacelessContext = mSurfacelessSupported;
Geoff Langb0f917f2017-12-05 13:41:54 -05003184
3185 // Explicitly enable GL_KHR_debug
3186 supportedExtensions.debug = true;
3187 supportedExtensions.maxDebugMessageLength = 1024;
3188 supportedExtensions.maxDebugLoggedMessages = 1024;
3189 supportedExtensions.maxDebugGroupStackDepth = 1024;
3190 supportedExtensions.maxLabelLength = 1024;
3191
3192 // Explicitly enable GL_ANGLE_robust_client_memory
3193 supportedExtensions.robustClientMemory = true;
3194
3195 // Determine robust resource init availability from EGL.
Geoff Lang33f11fb2018-05-07 13:42:47 -04003196 supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
Geoff Langb0f917f2017-12-05 13:41:54 -05003197
3198 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
3199 // supports it.
3200 supportedExtensions.robustBufferAccessBehavior =
3201 mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
3202
3203 // Enable the cache control query unconditionally.
3204 supportedExtensions.programCacheControl = true;
3205
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003206 // Enable EGL_ANGLE_explicit_context subextensions
Geoff Lang33f11fb2018-05-07 13:42:47 -04003207 if (mExplicitContextAvailable)
Brandon Jones2b0cdcc2018-05-02 08:02:50 -07003208 {
3209 // GL_ANGLE_explicit_context_gles1
3210 supportedExtensions.explicitContextGles1 = true;
3211 // GL_ANGLE_explicit_context
3212 supportedExtensions.explicitContext = true;
3213 }
3214
Geoff Lang79b91402018-10-04 15:11:30 -04003215 supportedExtensions.memorySize = true;
3216
Geoff Langb0f917f2017-12-05 13:41:54 -05003217 return supportedExtensions;
3218}
3219
Geoff Lang33f11fb2018-05-07 13:42:47 -04003220void Context::initCaps()
Geoff Lang493daf52014-07-03 13:38:44 -04003221{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04003222 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04003223
Geoff Lang33f11fb2018-05-07 13:42:47 -04003224 mSupportedExtensions = generateSupportedExtensions();
3225 mExtensions = mSupportedExtensions;
Lingfeng Yang01074432018-04-16 10:19:51 -07003226
3227 mLimitations = mImplementation->getNativeLimitations();
3228
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003229 // GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
3230 if (getClientVersion() < Version(2, 0))
3231 {
3232 mCaps.maxMultitextureUnits = 4;
3233 mCaps.maxClipPlanes = 6;
3234 mCaps.maxLights = 8;
Lingfeng Yange547aac2018-04-05 09:39:20 -07003235 mCaps.maxModelviewMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3236 mCaps.maxProjectionMatrixStackDepth = Caps::GlobalMatrixStackDepth;
3237 mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07003238 mCaps.minSmoothPointSize = 1.0f;
3239 mCaps.maxSmoothPointSize = 1.0f;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07003240 mCaps.minSmoothLineWidth = 1.0f;
3241 mCaps.maxSmoothLineWidth = 1.0f;
Lingfeng Yangb27b03a2018-02-19 13:38:48 -08003242 }
3243
Luc Ferronad2ae932018-06-11 15:31:17 -04003244 // Apply/Verify implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04003245 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003246
Luc Ferronad2ae932018-06-11 15:31:17 -04003247 ASSERT(mCaps.minAliasedPointSize >= 1.0f);
3248
Jamie Madill0f80ed82017-09-19 00:24:56 -04003249 if (getClientVersion() < ES_3_1)
3250 {
3251 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
3252 }
3253 else
3254 {
3255 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
3256 }
Geoff Lang301d1612014-07-09 10:34:37 -04003257
Jiawei Shao54aafe52018-04-27 14:54:57 +08003258 LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
3259 IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
Jamie Madill6d32cef2018-08-14 02:34:28 -04003260 LimitCap(&mCaps.maxUniformBufferBindings, IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS);
3261
Jamie Madill0f80ed82017-09-19 00:24:56 -04003262 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3263 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
3264
3265 // Limit textures as well, so we can use fast bitsets with texture bindings.
3266 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
Jiawei Shao54aafe52018-04-27 14:54:57 +08003267 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
3268 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
3269 LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
3270 IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04003271
Jamie Madille3e680c2018-12-03 17:49:08 -05003272 LimitCap(&mCaps.maxImageUnits, IMPLEMENTATION_MAX_IMAGE_UNITS);
3273
Jiawei Shaodb342272017-09-27 10:21:45 +08003274 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
3275
Geoff Langc287ea62016-09-16 14:46:51 -04003276 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003277 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04003278 for (const auto &extensionInfo : GetExtensionInfoMap())
3279 {
Geoff Lang0ab41fa2018-03-14 11:03:30 -04003280 // If the user has requested that extensions start disabled and they are requestable,
3281 // disable them.
3282 if (!mExtensionsEnabled && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04003283 {
3284 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
3285 }
3286 }
3287
3288 // Generate texture caps
3289 updateCaps();
3290}
3291
3292void Context::updateCaps()
3293{
Geoff Lang900013c2014-07-07 11:32:19 -04003294 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04003295 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04003296
Jamie Madill7b62cf92017-11-02 15:20:49 -04003297 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04003298 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04003299 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04003300 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003301
Geoff Lang0d8b7242015-09-09 14:56:53 -04003302 // Update the format caps based on the client version and extensions.
3303 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
3304 // ES3.
3305 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003306 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04003307 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04003308 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Yuly Novikovf15f8862018-06-04 18:59:41 -04003309 formatCaps.textureAttachment =
3310 formatCaps.textureAttachment &&
3311 formatInfo.textureAttachmentSupport(getClientVersion(), mExtensions);
3312 formatCaps.renderbuffer = formatCaps.renderbuffer &&
3313 formatInfo.renderbufferSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04003314
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003315 // OpenGL ES does not support multisampling with non-rendererable formats
3316 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Yuly Novikovf15f8862018-06-04 18:59:41 -04003317 if (!formatCaps.renderbuffer ||
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003318 (getClientVersion() < ES_3_1 && !mSupportedExtensions.textureMultisample &&
He Yunchaoccd8c9b2017-01-18 17:36:14 +08003319 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04003320 {
Geoff Langd87878e2014-09-19 15:42:59 -04003321 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04003322 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03003323 else
3324 {
3325 // We may have limited the max samples for some required renderbuffer formats due to
3326 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
3327 GLuint formatMaxSamples = formatCaps.getMaxSamples();
3328
3329 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
3330 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
3331 // exception of signed and unsigned integer formats."
3332 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
3333 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
3334 {
3335 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
3336 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
3337 }
3338
3339 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
Yizhou Jiang2fa21472018-11-06 15:52:33 +08003340 if (getClientVersion() >= ES_3_1 || mSupportedExtensions.textureMultisample)
Olli Etuaho50c562d2017-06-06 14:43:30 +03003341 {
3342 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
3343 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
3344 // the exception that the signed and unsigned integer formats are required only to
3345 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
3346 // multisamples, which must be at least one."
3347 if (formatInfo.componentType == GL_INT ||
3348 formatInfo.componentType == GL_UNSIGNED_INT)
3349 {
3350 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
3351 }
3352
3353 // GLES 3.1 section 19.3.1.
3354 if (formatCaps.texturable)
3355 {
3356 if (formatInfo.depthBits > 0)
3357 {
3358 mCaps.maxDepthTextureSamples =
3359 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
3360 }
3361 else if (formatInfo.redBits > 0)
3362 {
3363 mCaps.maxColorTextureSamples =
3364 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
3365 }
3366 }
3367 }
3368 }
Geoff Langd87878e2014-09-19 15:42:59 -04003369
3370 if (formatCaps.texturable && formatInfo.compressed)
3371 {
Geoff Langca271392017-04-05 12:30:00 -04003372 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04003373 }
3374
Geoff Langca271392017-04-05 12:30:00 -04003375 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04003376 }
Jamie Madill32447362017-06-28 14:53:52 -04003377
3378 // If program binary is disabled, blank out the memory cache pointer.
Geoff Langb0f917f2017-12-05 13:41:54 -05003379 if (!mSupportedExtensions.getProgramBinary)
Jamie Madill32447362017-06-28 14:53:52 -04003380 {
3381 mMemoryProgramCache = nullptr;
3382 }
Corentin Walleze4477002017-12-01 14:39:58 -05003383
3384 // Compute which buffer types are allowed
3385 mValidBufferBindings.reset();
3386 mValidBufferBindings.set(BufferBinding::ElementArray);
3387 mValidBufferBindings.set(BufferBinding::Array);
3388
3389 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
3390 {
3391 mValidBufferBindings.set(BufferBinding::PixelPack);
3392 mValidBufferBindings.set(BufferBinding::PixelUnpack);
3393 }
3394
3395 if (getClientVersion() >= ES_3_0)
3396 {
3397 mValidBufferBindings.set(BufferBinding::CopyRead);
3398 mValidBufferBindings.set(BufferBinding::CopyWrite);
3399 mValidBufferBindings.set(BufferBinding::TransformFeedback);
3400 mValidBufferBindings.set(BufferBinding::Uniform);
3401 }
3402
3403 if (getClientVersion() >= ES_3_1)
3404 {
3405 mValidBufferBindings.set(BufferBinding::AtomicCounter);
3406 mValidBufferBindings.set(BufferBinding::ShaderStorage);
3407 mValidBufferBindings.set(BufferBinding::DrawIndirect);
3408 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
3409 }
jchen107ae70d82018-07-06 13:47:01 +08003410
3411 mThreadPool = angle::WorkerThreadPool::Create(mExtensions.parallelShaderCompile);
Jamie Madillac66f982018-10-09 18:30:01 -04003412
Jamie Madillef9fcd92018-11-28 14:03:59 -05003413 // Reinitialize some dirty bits that depend on extensions.
Jamie Madill132d15c2018-11-30 15:25:38 -05003414 bool robustInit = mGLState.isRobustResourceInitEnabled();
3415 mDrawDirtyObjects.set(State::DIRTY_OBJECT_DRAW_ATTACHMENTS, robustInit);
3416 mDrawDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT, robustInit);
3417 mDrawDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT, robustInit);
3418 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_ATTACHMENTS, robustInit);
3419 mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT, robustInit);
3420 mComputeDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT, robustInit);
Jamie Madillef9fcd92018-11-28 14:03:59 -05003421
Jamie Madillac66f982018-10-09 18:30:01 -04003422 // Reinitialize state cache after extension changes.
3423 mStateCache.initialize(this);
Geoff Lang493daf52014-07-03 13:38:44 -04003424}
3425
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003426void Context::initWorkarounds()
3427{
Jamie Madill761b02c2017-06-23 16:27:06 -04003428 // Apply back-end workarounds.
3429 mImplementation->applyNativeWorkarounds(&mWorkarounds);
3430
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003431 // Lose the context upon out of memory error if the application is
3432 // expecting to watch for those events.
3433 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
Jamie Madilld4f07762018-10-19 19:24:07 -04003434
3435 if (mWorkarounds.syncFramebufferBindingsOnTexImage)
3436 {
3437 // Update the Framebuffer bindings on TexImage to work around an Intel bug.
3438 mTexImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
3439 mTexImageDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
3440 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003441}
3442
Tobin Ehlisd7890bc2018-06-29 11:57:22 -06003443bool Context::noopDrawInstanced(PrimitiveMode mode, GLsizei count, GLsizei instanceCount)
3444{
3445 return (instanceCount == 0) || noopDraw(mode, count);
3446}
3447
Jamie Madill526392d2018-11-16 09:35:14 -05003448angle::Result Context::prepareForClear(GLbitfield mask)
Geoff Langd4fff502017-09-22 11:28:28 -04003449{
Geoff Langa8cb2872018-03-09 16:09:40 -05003450 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003451 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearAttachmentsInitialized(this, mask));
Geoff Langa8cb2872018-03-09 16:09:40 -05003452 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill7c985f52018-11-29 18:16:17 -05003453 return angle::Result::Continue;
Geoff Langd4fff502017-09-22 11:28:28 -04003454}
3455
Jamie Madill526392d2018-11-16 09:35:14 -05003456angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
Geoff Langd4fff502017-09-22 11:28:28 -04003457{
Geoff Langa8cb2872018-03-09 16:09:40 -05003458 ANGLE_TRY(syncDirtyObjects(mClearDirtyObjects));
Geoff Langd4fff502017-09-22 11:28:28 -04003459 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureClearBufferAttachmentsInitialized(this, buffer,
3460 drawbuffer));
Geoff Langa8cb2872018-03-09 16:09:40 -05003461 ANGLE_TRY(syncDirtyBits(mClearDirtyBits));
Jamie Madill7c985f52018-11-29 18:16:17 -05003462 return angle::Result::Continue;
Jamie Madill05b35b22017-10-03 09:01:44 -04003463}
3464
Jamie Madill132d15c2018-11-30 15:25:38 -05003465ANGLE_INLINE angle::Result Context::prepareForDispatch()
3466{
3467 ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
3468 return syncDirtyBits(mComputeDirtyBits);
3469}
3470
Jamie Madill526392d2018-11-16 09:35:14 -05003471angle::Result Context::syncState(const State::DirtyBits &bitMask,
3472 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04003473{
Geoff Langa8cb2872018-03-09 16:09:40 -05003474 ANGLE_TRY(syncDirtyObjects(objectMask));
3475 ANGLE_TRY(syncDirtyBits(bitMask));
Jamie Madill7c985f52018-11-29 18:16:17 -05003476 return angle::Result::Continue;
Geoff Langd4fff502017-09-22 11:28:28 -04003477}
3478
Jamie Madillc29968b2016-01-20 11:17:23 -05003479void Context::blitFramebuffer(GLint srcX0,
3480 GLint srcY0,
3481 GLint srcX1,
3482 GLint srcY1,
3483 GLint dstX0,
3484 GLint dstY0,
3485 GLint dstX1,
3486 GLint dstY1,
3487 GLbitfield mask,
3488 GLenum filter)
3489{
Qin Jiajiaaef92162018-02-27 13:51:44 +08003490 if (mask == 0)
3491 {
3492 // ES3.0 spec, section 4.3.2 specifies that a mask of zero is valid and no
3493 // buffers are copied.
3494 return;
3495 }
3496
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003497 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003498 ASSERT(drawFramebuffer);
3499
3500 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
3501 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
3502
Jamie Madillbc918e72018-03-08 09:47:21 -05003503 ANGLE_CONTEXT_TRY(syncStateForBlit());
Jamie Madillc29968b2016-01-20 11:17:23 -05003504
Jamie Madill4f6592f2018-11-27 16:37:45 -05003505 ANGLE_CONTEXT_TRY(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003506}
Jamie Madillc29968b2016-01-20 11:17:23 -05003507
3508void Context::clear(GLbitfield mask)
3509{
Geoff Langd4fff502017-09-22 11:28:28 -04003510 ANGLE_CONTEXT_TRY(prepareForClear(mask));
3511 ANGLE_CONTEXT_TRY(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05003512}
3513
3514void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
3515{
Olli Etuaho78df3362018-10-05 16:43:27 +03003516 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3517 const FramebufferAttachment *attachment = nullptr;
3518 if (buffer == GL_DEPTH)
3519 {
3520 attachment = framebufferObject->getDepthbuffer();
3521 }
3522 if (buffer == GL_COLOR &&
3523 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3524 {
3525 attachment = framebufferObject->getColorbuffer(drawbuffer);
3526 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003527 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3528 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003529 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003530 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003531 return;
3532 }
Geoff Langd4fff502017-09-22 11:28:28 -04003533 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003534 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003535}
3536
3537void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
3538{
Olli Etuaho78df3362018-10-05 16:43:27 +03003539 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3540 const FramebufferAttachment *attachment = nullptr;
3541 if (buffer == GL_COLOR &&
3542 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3543 {
3544 attachment = framebufferObject->getColorbuffer(drawbuffer);
3545 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003546 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3547 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003548 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003549 {
3550 return;
3551 }
Geoff Langd4fff502017-09-22 11:28:28 -04003552 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003553 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003554}
3555
3556void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
3557{
Olli Etuaho78df3362018-10-05 16:43:27 +03003558 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
3559 const FramebufferAttachment *attachment = nullptr;
3560 if (buffer == GL_STENCIL)
3561 {
3562 attachment = framebufferObject->getStencilbuffer();
3563 }
3564 if (buffer == GL_COLOR &&
3565 static_cast<size_t>(drawbuffer) < framebufferObject->getNumColorBuffers())
3566 {
3567 attachment = framebufferObject->getColorbuffer(drawbuffer);
3568 }
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003569 // It's not an error to try to clear a non-existent buffer, but it's a no-op. We early out so
3570 // that the backend doesn't need to take this case into account.
Olli Etuaho78df3362018-10-05 16:43:27 +03003571 if (!attachment)
Olli Etuaho4ebd8f32018-09-20 11:12:46 +03003572 {
Olli Etuahodbce1f82018-09-19 15:32:17 +03003573 return;
3574 }
Geoff Langd4fff502017-09-22 11:28:28 -04003575 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
Olli Etuaho78df3362018-10-05 16:43:27 +03003576 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05003577}
3578
3579void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
3580{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003581 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003582 ASSERT(framebufferObject);
3583
3584 // If a buffer is not present, the clear has no effect
3585 if (framebufferObject->getDepthbuffer() == nullptr &&
3586 framebufferObject->getStencilbuffer() == nullptr)
3587 {
3588 return;
3589 }
3590
Geoff Langd4fff502017-09-22 11:28:28 -04003591 ANGLE_CONTEXT_TRY(prepareForClearBuffer(buffer, drawbuffer));
3592 ANGLE_CONTEXT_TRY(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05003593}
3594
3595void Context::readPixels(GLint x,
3596 GLint y,
3597 GLsizei width,
3598 GLsizei height,
3599 GLenum format,
3600 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003601 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05003602{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003603 if (width == 0 || height == 0)
3604 {
3605 return;
3606 }
3607
Jamie Madillbc918e72018-03-08 09:47:21 -05003608 ANGLE_CONTEXT_TRY(syncStateForReadPixels());
Jamie Madillc29968b2016-01-20 11:17:23 -05003609
Jamie Madillb6664922017-07-25 12:55:04 -04003610 Framebuffer *readFBO = mGLState.getReadFramebuffer();
3611 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05003612
3613 Rectangle area(x, y, width, height);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003614 ANGLE_CONTEXT_TRY(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05003615}
3616
Brandon Jones59770802018-04-02 13:18:42 -07003617void Context::readPixelsRobust(GLint x,
3618 GLint y,
3619 GLsizei width,
3620 GLsizei height,
3621 GLenum format,
3622 GLenum type,
3623 GLsizei bufSize,
3624 GLsizei *length,
3625 GLsizei *columns,
3626 GLsizei *rows,
3627 void *pixels)
3628{
3629 readPixels(x, y, width, height, format, type, pixels);
3630}
3631
3632void Context::readnPixelsRobust(GLint x,
3633 GLint y,
3634 GLsizei width,
3635 GLsizei height,
3636 GLenum format,
3637 GLenum type,
3638 GLsizei bufSize,
3639 GLsizei *length,
3640 GLsizei *columns,
3641 GLsizei *rows,
3642 void *data)
3643{
3644 readPixels(x, y, width, height, format, type, data);
3645}
3646
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003647void Context::copyTexImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003648 GLint level,
3649 GLenum internalformat,
3650 GLint x,
3651 GLint y,
3652 GLsizei width,
3653 GLsizei height,
3654 GLint border)
3655{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003656 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003657 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003658
Jamie Madillc29968b2016-01-20 11:17:23 -05003659 Rectangle sourceArea(x, y, width, height);
3660
Jamie Madill05b35b22017-10-03 09:01:44 -04003661 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003662 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05003663 ANGLE_CONTEXT_TRY(
3664 texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003665}
3666
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003667void Context::copyTexSubImage2D(TextureTarget target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003668 GLint level,
3669 GLint xoffset,
3670 GLint yoffset,
3671 GLint x,
3672 GLint y,
3673 GLsizei width,
3674 GLsizei height)
3675{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003676 if (width == 0 || height == 0)
3677 {
3678 return;
3679 }
3680
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003681 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003682 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003683
Jamie Madillc29968b2016-01-20 11:17:23 -05003684 Offset destOffset(xoffset, yoffset, 0);
3685 Rectangle sourceArea(x, y, width, height);
3686
Jamie Madill05b35b22017-10-03 09:01:44 -04003687 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003688 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05003689 ANGLE_CONTEXT_TRY(
3690 texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003691}
3692
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003693void Context::copyTexSubImage3D(TextureType target,
Jamie Madillc29968b2016-01-20 11:17:23 -05003694 GLint level,
3695 GLint xoffset,
3696 GLint yoffset,
3697 GLint zoffset,
3698 GLint x,
3699 GLint y,
3700 GLsizei width,
3701 GLsizei height)
3702{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003703 if (width == 0 || height == 0)
3704 {
3705 return;
3706 }
3707
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003708 // Only sync the read FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003709 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003710
Jamie Madillc29968b2016-01-20 11:17:23 -05003711 Offset destOffset(xoffset, yoffset, zoffset);
3712 Rectangle sourceArea(x, y, width, height);
3713
Jamie Madill05b35b22017-10-03 09:01:44 -04003714 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3715 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003716 ANGLE_CONTEXT_TRY(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level,
3717 destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003718}
3719
3720void Context::framebufferTexture2D(GLenum target,
3721 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003722 TextureTarget textarget,
Jamie Madillc29968b2016-01-20 11:17:23 -05003723 GLuint texture,
3724 GLint level)
3725{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003726 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003727 ASSERT(framebuffer);
3728
3729 if (texture != 0)
3730 {
3731 Texture *textureObj = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003732 ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
Jamie Madilla02315b2017-02-23 14:14:47 -05003733 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003734 }
3735 else
3736 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003737 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003738 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003739
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003740 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003741}
3742
3743void Context::framebufferRenderbuffer(GLenum target,
3744 GLenum attachment,
3745 GLenum renderbuffertarget,
3746 GLuint renderbuffer)
3747{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003748 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003749 ASSERT(framebuffer);
3750
3751 if (renderbuffer != 0)
3752 {
3753 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003754
Jamie Madillcc129372018-04-12 09:13:18 -04003755 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003756 renderbufferObject);
3757 }
3758 else
3759 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003760 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003761 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003762
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003763 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003764}
3765
3766void Context::framebufferTextureLayer(GLenum target,
3767 GLenum attachment,
3768 GLuint texture,
3769 GLint level,
3770 GLint layer)
3771{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003772 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003773 ASSERT(framebuffer);
3774
3775 if (texture != 0)
3776 {
3777 Texture *textureObject = getTexture(texture);
Jamie Madillcc129372018-04-12 09:13:18 -04003778 ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003779 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003780 }
3781 else
3782 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003783 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003784 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003785
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003786 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003787}
3788
Brandon Jones59770802018-04-02 13:18:42 -07003789void Context::framebufferTextureMultiviewLayered(GLenum target,
3790 GLenum attachment,
3791 GLuint texture,
3792 GLint level,
3793 GLint baseViewIndex,
3794 GLsizei numViews)
Martin Radev137032d2017-07-13 10:11:12 +03003795{
Martin Radev82ef7742017-08-08 17:44:58 +03003796 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3797 ASSERT(framebuffer);
3798
3799 if (texture != 0)
3800 {
3801 Texture *textureObj = getTexture(texture);
3802
Olli Etuaho2c8f0842018-09-12 14:44:55 +03003803 ImageIndex index;
3804 if (textureObj->getType() == TextureType::_2DArray)
3805 {
3806 index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
3807 }
3808 else
3809 {
3810 ASSERT(textureObj->getType() == TextureType::_2DMultisampleArray);
3811 ASSERT(level == 0);
3812 index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
3813 }
Martin Radev82ef7742017-08-08 17:44:58 +03003814 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3815 numViews, baseViewIndex);
3816 }
3817 else
3818 {
3819 framebuffer->resetAttachment(this, attachment);
3820 }
3821
3822 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003823}
3824
Brandon Jones59770802018-04-02 13:18:42 -07003825void Context::framebufferTextureMultiviewSideBySide(GLenum target,
3826 GLenum attachment,
3827 GLuint texture,
3828 GLint level,
3829 GLsizei numViews,
3830 const GLint *viewportOffsets)
Martin Radev137032d2017-07-13 10:11:12 +03003831{
Martin Radev5dae57b2017-07-14 16:15:55 +03003832 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3833 ASSERT(framebuffer);
3834
3835 if (texture != 0)
3836 {
3837 Texture *textureObj = getTexture(texture);
3838
3839 ImageIndex index = ImageIndex::Make2D(level);
3840 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3841 textureObj, numViews, viewportOffsets);
3842 }
3843 else
3844 {
3845 framebuffer->resetAttachment(this, attachment);
3846 }
3847
3848 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003849}
3850
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003851void Context::framebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
3852{
Jiawei Shaoa8802472018-05-28 11:17:47 +08003853 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3854 ASSERT(framebuffer);
3855
3856 if (texture != 0)
3857 {
3858 Texture *textureObj = getTexture(texture);
3859
3860 ImageIndex index = ImageIndex::MakeFromType(
3861 textureObj->getType(), level, ImageIndex::kEntireLevel, ImageIndex::kEntireLevel);
3862 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
3863 }
3864 else
3865 {
3866 framebuffer->resetAttachment(this, attachment);
3867 }
3868
3869 mGLState.setObjectDirty(target);
Jiawei Shao5f9482f2018-05-18 09:00:09 +08003870}
3871
Jamie Madillc29968b2016-01-20 11:17:23 -05003872void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3873{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003874 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003875 ASSERT(framebuffer);
3876 framebuffer->setDrawBuffers(n, bufs);
Jamie Madillef9fcd92018-11-28 14:03:59 -05003877 mGLState.setDrawFramebufferDirty();
Jamie Madilld84b6732018-09-06 15:54:35 -04003878 mStateCache.onDrawFramebufferChange(this);
Jamie Madillc29968b2016-01-20 11:17:23 -05003879}
3880
3881void Context::readBuffer(GLenum mode)
3882{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003883 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003884 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003885 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003886}
3887
3888void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3889{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003890 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003891 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003892
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003893 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003894 ASSERT(framebuffer);
3895
3896 // The specification isn't clear what should be done when the framebuffer isn't complete.
3897 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4f6592f2018-11-27 16:37:45 -05003898 ANGLE_CONTEXT_TRY(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003899}
3900
3901void Context::invalidateFramebuffer(GLenum target,
3902 GLsizei numAttachments,
3903 const GLenum *attachments)
3904{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003905 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003906 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003907
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003908 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003909 ASSERT(framebuffer);
3910
Jamie Madill427064d2018-04-13 16:20:34 -04003911 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003912 {
Jamie Madill437fa652016-05-03 15:13:24 -04003913 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003914 }
Jamie Madill437fa652016-05-03 15:13:24 -04003915
Jamie Madill4f6592f2018-11-27 16:37:45 -05003916 ANGLE_CONTEXT_TRY(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003917}
3918
3919void Context::invalidateSubFramebuffer(GLenum target,
3920 GLsizei numAttachments,
3921 const GLenum *attachments,
3922 GLint x,
3923 GLint y,
3924 GLsizei width,
3925 GLsizei height)
3926{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003927 // Only sync the FBO
Jamie Madillbc918e72018-03-08 09:47:21 -05003928 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, target));
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003929
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003930 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003931 ASSERT(framebuffer);
3932
Jamie Madill427064d2018-04-13 16:20:34 -04003933 if (!framebuffer->isComplete(this))
Jamie Madillc29968b2016-01-20 11:17:23 -05003934 {
Jamie Madill437fa652016-05-03 15:13:24 -04003935 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003936 }
Jamie Madill437fa652016-05-03 15:13:24 -04003937
3938 Rectangle area(x, y, width, height);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003939 ANGLE_CONTEXT_TRY(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003940}
3941
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003942void Context::texImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003943 GLint level,
3944 GLint internalformat,
3945 GLsizei width,
3946 GLsizei height,
3947 GLint border,
3948 GLenum format,
3949 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003950 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003951{
Jamie Madillbc918e72018-03-08 09:47:21 -05003952 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003953
3954 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003955 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05003956 ANGLE_CONTEXT_TRY(texture->setImage(this, mGLState.getUnpackState(), target, level,
3957 internalformat, size, format, type,
3958 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003959}
3960
Brandon Jones59770802018-04-02 13:18:42 -07003961void Context::texImage2DRobust(TextureTarget target,
3962 GLint level,
3963 GLint internalformat,
3964 GLsizei width,
3965 GLsizei height,
3966 GLint border,
3967 GLenum format,
3968 GLenum type,
3969 GLsizei bufSize,
3970 const void *pixels)
3971{
3972 texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
3973}
3974
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003975void Context::texImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05003976 GLint level,
3977 GLint internalformat,
3978 GLsizei width,
3979 GLsizei height,
3980 GLsizei depth,
3981 GLint border,
3982 GLenum format,
3983 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003984 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003985{
Jamie Madillbc918e72018-03-08 09:47:21 -05003986 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05003987
3988 Extents size(width, height, depth);
3989 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05003990 ANGLE_CONTEXT_TRY(texture->setImage(this, mGLState.getUnpackState(),
3991 NonCubeTextureTypeToTarget(target), level, internalformat,
3992 size, format, type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003993}
3994
Brandon Jones59770802018-04-02 13:18:42 -07003995void Context::texImage3DRobust(TextureType target,
3996 GLint level,
3997 GLint internalformat,
3998 GLsizei width,
3999 GLsizei height,
4000 GLsizei depth,
4001 GLint border,
4002 GLenum format,
4003 GLenum type,
4004 GLsizei bufSize,
4005 const void *pixels)
4006{
4007 texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
4008}
4009
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004010void Context::texSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004011 GLint level,
4012 GLint xoffset,
4013 GLint yoffset,
4014 GLsizei width,
4015 GLsizei height,
4016 GLenum format,
4017 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004018 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004019{
4020 // Zero sized uploads are valid but no-ops
4021 if (width == 0 || height == 0)
4022 {
4023 return;
4024 }
4025
Jamie Madillbc918e72018-03-08 09:47:21 -05004026 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004027
4028 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004029 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill0d0fb432018-09-07 17:43:32 -04004030
4031 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4032
Jamie Madill4f6592f2018-11-27 16:37:45 -05004033 ANGLE_CONTEXT_TRY(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer, target,
4034 level, area, format, type,
4035 static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004036}
4037
Brandon Jones59770802018-04-02 13:18:42 -07004038void Context::texSubImage2DRobust(TextureTarget target,
4039 GLint level,
4040 GLint xoffset,
4041 GLint yoffset,
4042 GLsizei width,
4043 GLsizei height,
4044 GLenum format,
4045 GLenum type,
4046 GLsizei bufSize,
4047 const void *pixels)
4048{
4049 texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
4050}
4051
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004052void Context::texSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004053 GLint level,
4054 GLint xoffset,
4055 GLint yoffset,
4056 GLint zoffset,
4057 GLsizei width,
4058 GLsizei height,
4059 GLsizei depth,
4060 GLenum format,
4061 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04004062 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05004063{
4064 // Zero sized uploads are valid but no-ops
4065 if (width == 0 || height == 0 || depth == 0)
4066 {
4067 return;
4068 }
4069
Jamie Madillbc918e72018-03-08 09:47:21 -05004070 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004071
4072 Box area(xoffset, yoffset, zoffset, width, height, depth);
4073 Texture *texture = getTargetTexture(target);
Jamie Madill0d0fb432018-09-07 17:43:32 -04004074
4075 gl::Buffer *unpackBuffer = mGLState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
4076
Jamie Madill4f6592f2018-11-27 16:37:45 -05004077 ANGLE_CONTEXT_TRY(texture->setSubImage(this, mGLState.getUnpackState(), unpackBuffer,
4078 NonCubeTextureTypeToTarget(target), level, area, format,
4079 type, static_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05004080}
4081
Brandon Jones59770802018-04-02 13:18:42 -07004082void Context::texSubImage3DRobust(TextureType target,
4083 GLint level,
4084 GLint xoffset,
4085 GLint yoffset,
4086 GLint zoffset,
4087 GLsizei width,
4088 GLsizei height,
4089 GLsizei depth,
4090 GLenum format,
4091 GLenum type,
4092 GLsizei bufSize,
4093 const void *pixels)
4094{
4095 texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
4096 pixels);
4097}
4098
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004099void Context::compressedTexImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004100 GLint level,
4101 GLenum internalformat,
4102 GLsizei width,
4103 GLsizei height,
4104 GLint border,
4105 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004106 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004107{
Jamie Madillbc918e72018-03-08 09:47:21 -05004108 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004109
4110 Extents size(width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004111 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05004112 ANGLE_CONTEXT_TRY(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
4113 internalformat, size, imageSize,
4114 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004115}
4116
Brandon Jones59770802018-04-02 13:18:42 -07004117void Context::compressedTexImage2DRobust(TextureTarget target,
4118 GLint level,
4119 GLenum internalformat,
4120 GLsizei width,
4121 GLsizei height,
4122 GLint border,
4123 GLsizei imageSize,
4124 GLsizei dataSize,
4125 const GLvoid *data)
4126{
4127 compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
4128}
4129
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004130void Context::compressedTexImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004131 GLint level,
4132 GLenum internalformat,
4133 GLsizei width,
4134 GLsizei height,
4135 GLsizei depth,
4136 GLint border,
4137 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004138 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004139{
Jamie Madillbc918e72018-03-08 09:47:21 -05004140 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004141
4142 Extents size(width, height, depth);
4143 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004144 ANGLE_CONTEXT_TRY(texture->setCompressedImage(
Corentin Wallez99d492c2018-02-27 15:17:10 -05004145 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004146 size, imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004147}
4148
Brandon Jones59770802018-04-02 13:18:42 -07004149void Context::compressedTexImage3DRobust(TextureType target,
4150 GLint level,
4151 GLenum internalformat,
4152 GLsizei width,
4153 GLsizei height,
4154 GLsizei depth,
4155 GLint border,
4156 GLsizei imageSize,
4157 GLsizei dataSize,
4158 const GLvoid *data)
4159{
4160 compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize,
4161 data);
4162}
4163
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004164void Context::compressedTexSubImage2D(TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05004165 GLint level,
4166 GLint xoffset,
4167 GLint yoffset,
4168 GLsizei width,
4169 GLsizei height,
4170 GLenum format,
4171 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004172 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004173{
Jamie Madillbc918e72018-03-08 09:47:21 -05004174 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004175
4176 Box area(xoffset, yoffset, 0, width, height, 1);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004177 Texture *texture = getTargetTexture(TextureTargetToType(target));
Jamie Madill4f6592f2018-11-27 16:37:45 -05004178 ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level,
4179 area, format, imageSize,
4180 static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004181}
4182
Brandon Jones59770802018-04-02 13:18:42 -07004183void Context::compressedTexSubImage2DRobust(TextureTarget target,
4184 GLint level,
4185 GLint xoffset,
4186 GLint yoffset,
4187 GLsizei width,
4188 GLsizei height,
4189 GLenum format,
4190 GLsizei imageSize,
4191 GLsizei dataSize,
4192 const GLvoid *data)
4193{
4194 compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize,
4195 data);
4196}
4197
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004198void Context::compressedTexSubImage3D(TextureType target,
Jamie Madill73a84962016-02-12 09:27:23 -05004199 GLint level,
4200 GLint xoffset,
4201 GLint yoffset,
4202 GLint zoffset,
4203 GLsizei width,
4204 GLsizei height,
4205 GLsizei depth,
4206 GLenum format,
4207 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04004208 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05004209{
4210 // Zero sized uploads are valid but no-ops
4211 if (width == 0 || height == 0)
4212 {
4213 return;
4214 }
4215
Jamie Madillbc918e72018-03-08 09:47:21 -05004216 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Jamie Madill73a84962016-02-12 09:27:23 -05004217
4218 Box area(xoffset, yoffset, zoffset, width, height, depth);
4219 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004220 ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(
Corentin Wallez99d492c2018-02-27 15:17:10 -05004221 this, mGLState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
Rafael Cintron05a449a2018-06-20 18:08:04 -07004222 imageSize, static_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05004223}
4224
Brandon Jones59770802018-04-02 13:18:42 -07004225void Context::compressedTexSubImage3DRobust(TextureType target,
4226 GLint level,
4227 GLint xoffset,
4228 GLint yoffset,
4229 GLint zoffset,
4230 GLsizei width,
4231 GLsizei height,
4232 GLsizei depth,
4233 GLenum format,
4234 GLsizei imageSize,
4235 GLsizei dataSize,
4236 const GLvoid *data)
4237{
4238 compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format,
4239 imageSize, data);
4240}
4241
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004242void Context::generateMipmap(TextureType target)
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004243{
4244 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004245 ANGLE_CONTEXT_TRY(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03004246}
4247
Jamie Madill007530e2017-12-28 14:27:04 -05004248void Context::copyTexture(GLuint sourceId,
4249 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004250 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004251 GLuint destId,
4252 GLint destLevel,
4253 GLint internalFormat,
4254 GLenum destType,
4255 GLboolean unpackFlipY,
4256 GLboolean unpackPremultiplyAlpha,
4257 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004258{
Jamie Madillbc918e72018-03-08 09:47:21 -05004259 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004260
4261 gl::Texture *sourceTexture = getTexture(sourceId);
4262 gl::Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004263 ANGLE_CONTEXT_TRY(
4264 destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType, sourceLevel,
4265 ConvertToBool(unpackFlipY), ConvertToBool(unpackPremultiplyAlpha),
4266 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004267}
4268
Jamie Madill007530e2017-12-28 14:27:04 -05004269void Context::copySubTexture(GLuint sourceId,
4270 GLint sourceLevel,
Corentin Wallez99d492c2018-02-27 15:17:10 -05004271 TextureTarget destTarget,
Jamie Madill007530e2017-12-28 14:27:04 -05004272 GLuint destId,
4273 GLint destLevel,
4274 GLint xoffset,
4275 GLint yoffset,
4276 GLint x,
4277 GLint y,
4278 GLsizei width,
4279 GLsizei height,
4280 GLboolean unpackFlipY,
4281 GLboolean unpackPremultiplyAlpha,
4282 GLboolean unpackUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -07004283{
4284 // Zero sized copies are valid but no-ops
4285 if (width == 0 || height == 0)
4286 {
4287 return;
4288 }
4289
Jamie Madillbc918e72018-03-08 09:47:21 -05004290 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang97073d12016-04-20 10:42:34 -07004291
4292 gl::Texture *sourceTexture = getTexture(sourceId);
4293 gl::Texture *destTexture = getTexture(destId);
4294 Offset offset(xoffset, yoffset, 0);
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004295 Box box(x, y, 0, width, height, 1);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004296 ANGLE_CONTEXT_TRY(destTexture->copySubTexture(
4297 this, destTarget, destLevel, offset, sourceLevel, box, ConvertToBool(unpackFlipY),
4298 ConvertToBool(unpackPremultiplyAlpha), ConvertToBool(unpackUnmultiplyAlpha),
4299 sourceTexture));
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004300}
4301
4302void Context::copyTexture3D(GLuint sourceId,
4303 GLint sourceLevel,
4304 TextureTarget destTarget,
4305 GLuint destId,
4306 GLint destLevel,
4307 GLint internalFormat,
4308 GLenum destType,
4309 GLboolean unpackFlipY,
4310 GLboolean unpackPremultiplyAlpha,
4311 GLboolean unpackUnmultiplyAlpha)
4312{
4313 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4314
4315 Texture *sourceTexture = getTexture(sourceId);
4316 Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004317 ANGLE_CONTEXT_TRY(
4318 destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType, sourceLevel,
4319 ConvertToBool(unpackFlipY), ConvertToBool(unpackPremultiplyAlpha),
4320 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Brandon Jones4e6f2ae2018-09-19 11:09:51 -07004321}
4322
4323void Context::copySubTexture3D(GLuint sourceId,
4324 GLint sourceLevel,
4325 TextureTarget destTarget,
4326 GLuint destId,
4327 GLint destLevel,
4328 GLint xoffset,
4329 GLint yoffset,
4330 GLint zoffset,
4331 GLint x,
4332 GLint y,
4333 GLint z,
4334 GLsizei width,
4335 GLsizei height,
4336 GLsizei depth,
4337 GLboolean unpackFlipY,
4338 GLboolean unpackPremultiplyAlpha,
4339 GLboolean unpackUnmultiplyAlpha)
4340{
4341 // Zero sized copies are valid but no-ops
4342 if (width == 0 || height == 0 || depth == 0)
4343 {
4344 return;
4345 }
4346
4347 ANGLE_CONTEXT_TRY(syncStateForTexImage());
4348
4349 Texture *sourceTexture = getTexture(sourceId);
4350 Texture *destTexture = getTexture(destId);
4351 Offset offset(xoffset, yoffset, zoffset);
4352 Box box(x, y, z, width, height, depth);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004353 ANGLE_CONTEXT_TRY(destTexture->copySubTexture(
4354 this, destTarget, destLevel, offset, sourceLevel, box, ConvertToBool(unpackFlipY),
4355 ConvertToBool(unpackPremultiplyAlpha), ConvertToBool(unpackUnmultiplyAlpha),
4356 sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07004357}
4358
Jamie Madill007530e2017-12-28 14:27:04 -05004359void Context::compressedCopyTexture(GLuint sourceId, GLuint destId)
Geoff Lang47110bf2016-04-20 11:13:22 -07004360{
Jamie Madillbc918e72018-03-08 09:47:21 -05004361 ANGLE_CONTEXT_TRY(syncStateForTexImage());
Geoff Lang47110bf2016-04-20 11:13:22 -07004362
4363 gl::Texture *sourceTexture = getTexture(sourceId);
4364 gl::Texture *destTexture = getTexture(destId);
Jamie Madill4f6592f2018-11-27 16:37:45 -05004365 ANGLE_CONTEXT_TRY(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07004366}
4367
Corentin Wallez336129f2017-10-17 15:55:40 -04004368void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03004369{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004370 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004371 ASSERT(buffer);
4372
Geoff Lang496c02d2016-10-20 11:38:11 -07004373 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03004374}
4375
Brandon Jones59770802018-04-02 13:18:42 -07004376void Context::getBufferPointervRobust(BufferBinding target,
4377 GLenum pname,
4378 GLsizei bufSize,
4379 GLsizei *length,
4380 void **params)
4381{
4382 getBufferPointerv(target, pname, params);
4383}
4384
Corentin Wallez336129f2017-10-17 15:55:40 -04004385void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004386{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004387 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004388 ASSERT(buffer);
4389
Jamie Madill7c985f52018-11-29 18:16:17 -05004390 if (buffer->map(this, access) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004391 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004392 return nullptr;
4393 }
4394
4395 return buffer->getMapPointer();
4396}
4397
Corentin Wallez336129f2017-10-17 15:55:40 -04004398GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03004399{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004400 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004401 ASSERT(buffer);
4402
4403 GLboolean result;
Jamie Madill7c985f52018-11-29 18:16:17 -05004404 if (buffer->unmap(this, &result) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004405 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004406 return GL_FALSE;
4407 }
4408
4409 return result;
4410}
4411
Corentin Wallez336129f2017-10-17 15:55:40 -04004412void *Context::mapBufferRange(BufferBinding target,
4413 GLintptr offset,
4414 GLsizeiptr length,
4415 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03004416{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004417 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03004418 ASSERT(buffer);
4419
Jamie Madill7c985f52018-11-29 18:16:17 -05004420 if (buffer->mapRange(this, offset, length, access) == angle::Result::Stop)
Olli Etuaho4f667482016-03-30 15:56:35 +03004421 {
Olli Etuaho4f667482016-03-30 15:56:35 +03004422 return nullptr;
4423 }
4424
4425 return buffer->getMapPointer();
4426}
4427
Corentin Wallez336129f2017-10-17 15:55:40 -04004428void Context::flushMappedBufferRange(BufferBinding /*target*/,
4429 GLintptr /*offset*/,
4430 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03004431{
4432 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
4433}
4434
Jamie Madill526392d2018-11-16 09:35:14 -05004435angle::Result Context::syncStateForReadPixels()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004436{
Geoff Langa8cb2872018-03-09 16:09:40 -05004437 return syncState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004438}
4439
Jamie Madill526392d2018-11-16 09:35:14 -05004440angle::Result Context::syncStateForTexImage()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004441{
Geoff Langa8cb2872018-03-09 16:09:40 -05004442 return syncState(mTexImageDirtyBits, mTexImageDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004443}
4444
Jamie Madill526392d2018-11-16 09:35:14 -05004445angle::Result Context::syncStateForBlit()
Jamie Madillad9f24e2016-02-12 09:27:24 -05004446{
Geoff Langa8cb2872018-03-09 16:09:40 -05004447 return syncState(mBlitDirtyBits, mBlitDirtyObjects);
Jamie Madillad9f24e2016-02-12 09:27:24 -05004448}
4449
Jamie Madill526392d2018-11-16 09:35:14 -05004450angle::Result Context::syncStateForPathOperation()
Geoff Lang9bf86f02018-07-26 11:46:34 -04004451{
4452 ANGLE_TRY(syncDirtyObjects(mPathOperationDirtyObjects));
4453
4454 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
4455 ANGLE_TRY(syncDirtyBits());
4456
Jamie Madill7c985f52018-11-29 18:16:17 -05004457 return angle::Result::Continue;
Geoff Lang9bf86f02018-07-26 11:46:34 -04004458}
4459
Jiajia Qin5451d532017-11-16 17:16:34 +08004460void Context::activeShaderProgram(GLuint pipeline, GLuint program)
4461{
4462 UNIMPLEMENTED();
4463}
4464
Jamie Madillc20ab272016-06-09 07:20:46 -07004465void Context::activeTexture(GLenum texture)
4466{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004467 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004468}
4469
Jamie Madill876429b2017-04-20 15:46:24 -04004470void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004471{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004472 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004473}
4474
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004475void Context::blendEquation(GLenum mode)
4476{
4477 mGLState.setBlendEquation(mode, mode);
4478}
4479
Jamie Madillc20ab272016-06-09 07:20:46 -07004480void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
4481{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004482 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004483}
4484
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004485void Context::blendFunc(GLenum sfactor, GLenum dfactor)
4486{
4487 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
4488}
4489
Jamie Madillc20ab272016-06-09 07:20:46 -07004490void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
4491{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004492 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004493}
4494
Jamie Madill876429b2017-04-20 15:46:24 -04004495void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07004496{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004497 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07004498}
4499
Jamie Madill876429b2017-04-20 15:46:24 -04004500void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07004501{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004502 mGLState.setDepthClearValue(clamp01(depth));
Jamie Madillc20ab272016-06-09 07:20:46 -07004503}
4504
4505void Context::clearStencil(GLint s)
4506{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004507 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07004508}
4509
4510void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
4511{
Geoff Lang92019432017-11-20 13:09:34 -05004512 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
4513 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07004514}
4515
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004516void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07004517{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004518 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004519}
4520
4521void Context::depthFunc(GLenum func)
4522{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004523 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07004524}
4525
4526void Context::depthMask(GLboolean flag)
4527{
Geoff Lang92019432017-11-20 13:09:34 -05004528 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07004529}
4530
Jamie Madill876429b2017-04-20 15:46:24 -04004531void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07004532{
Joonatan Saarhelo945dea32018-10-17 20:49:06 +03004533 mGLState.setDepthRange(clamp01(zNear), clamp01(zFar));
Jamie Madillc20ab272016-06-09 07:20:46 -07004534}
4535
4536void Context::disable(GLenum cap)
4537{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004538 mGLState.setEnableFeature(cap, false);
Jamie Madilld84b6732018-09-06 15:54:35 -04004539 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004540}
4541
4542void Context::disableVertexAttribArray(GLuint index)
4543{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004544 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004545 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004546}
4547
4548void Context::enable(GLenum cap)
4549{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004550 mGLState.setEnableFeature(cap, true);
Jamie Madilld84b6732018-09-06 15:54:35 -04004551 mStateCache.onContextCapChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004552}
4553
4554void Context::enableVertexAttribArray(GLuint index)
4555{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004556 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004557 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004558}
4559
4560void Context::frontFace(GLenum mode)
4561{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004562 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004563}
4564
4565void Context::hint(GLenum target, GLenum mode)
4566{
4567 switch (target)
4568 {
4569 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004570 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004571 break;
4572
4573 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004574 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07004575 break;
4576
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07004577 case GL_PERSPECTIVE_CORRECTION_HINT:
4578 case GL_POINT_SMOOTH_HINT:
4579 case GL_LINE_SMOOTH_HINT:
4580 case GL_FOG_HINT:
4581 mGLState.gles1().setHint(target, mode);
4582 break;
Jamie Madillc20ab272016-06-09 07:20:46 -07004583 default:
4584 UNREACHABLE();
4585 return;
4586 }
4587}
4588
4589void Context::lineWidth(GLfloat width)
4590{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004591 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07004592}
4593
4594void Context::pixelStorei(GLenum pname, GLint param)
4595{
4596 switch (pname)
4597 {
4598 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004599 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004600 break;
4601
4602 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004603 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004604 break;
4605
4606 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004607 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07004608 break;
4609
4610 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004611 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004612 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004613 break;
4614
4615 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03004616 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004617 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004618 break;
4619
4620 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03004621 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004622 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004623 break;
4624
4625 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004626 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004627 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004628 break;
4629
4630 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004631 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004632 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004633 break;
4634
4635 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03004636 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004637 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004638 break;
4639
4640 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03004641 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004642 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004643 break;
4644
4645 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03004646 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004647 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07004648 break;
4649
4650 default:
4651 UNREACHABLE();
4652 return;
4653 }
4654}
4655
4656void Context::polygonOffset(GLfloat factor, GLfloat units)
4657{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004658 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07004659}
4660
Jamie Madill876429b2017-04-20 15:46:24 -04004661void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07004662{
Geoff Lang92019432017-11-20 13:09:34 -05004663 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07004664}
4665
Jiawei Shaodb342272017-09-27 10:21:45 +08004666void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
4667{
4668 mGLState.setSampleMaskParams(maskNumber, mask);
4669}
4670
Jamie Madillc20ab272016-06-09 07:20:46 -07004671void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4672{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004673 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004674}
4675
4676void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4677{
4678 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4679 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004680 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004681 }
4682
4683 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4684 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004685 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004686 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004687
4688 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004689}
4690
4691void Context::stencilMaskSeparate(GLenum face, GLuint mask)
4692{
4693 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4694 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004695 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004696 }
4697
4698 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4699 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004700 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07004701 }
Jamie Madilld84b6732018-09-06 15:54:35 -04004702
4703 mStateCache.onStencilStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004704}
4705
4706void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4707{
4708 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4709 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004710 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004711 }
4712
4713 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4714 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004715 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07004716 }
4717}
4718
4719void Context::vertexAttrib1f(GLuint index, GLfloat x)
4720{
4721 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004722 mGLState.setVertexAttribf(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004723 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004724}
4725
4726void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
4727{
4728 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004729 mGLState.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::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4734{
4735 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004736 mGLState.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::vertexAttrib2fv(GLuint index, const GLfloat *values)
4741{
4742 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004743 mGLState.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::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4748{
4749 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004750 mGLState.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::vertexAttrib3fv(GLuint index, const GLfloat *values)
4755{
4756 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004757 mGLState.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::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4762{
4763 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004764 mGLState.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::vertexAttrib4fv(GLuint index, const GLfloat *values)
4769{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004770 mGLState.setVertexAttribf(index, values);
Jamie Madilld84b6732018-09-06 15:54:35 -04004771 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004772}
4773
4774void Context::vertexAttribPointer(GLuint index,
4775 GLint size,
4776 GLenum type,
4777 GLboolean normalized,
4778 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004779 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07004780{
Corentin Wallez336129f2017-10-17 15:55:40 -04004781 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05004782 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004783 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004784}
4785
Shao80957d92017-02-20 21:25:59 +08004786void Context::vertexAttribFormat(GLuint attribIndex,
4787 GLint size,
4788 GLenum type,
4789 GLboolean normalized,
4790 GLuint relativeOffset)
4791{
Geoff Lang92019432017-11-20 13:09:34 -05004792 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08004793 relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004794 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004795}
4796
4797void Context::vertexAttribIFormat(GLuint attribIndex,
4798 GLint size,
4799 GLenum type,
4800 GLuint relativeOffset)
4801{
4802 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
Jamie Madilld84b6732018-09-06 15:54:35 -04004803 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004804}
4805
4806void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
4807{
Shaodde78e82017-05-22 14:13:27 +08004808 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004809 mStateCache.onVertexArrayStateChange(this);
Shao80957d92017-02-20 21:25:59 +08004810}
4811
Jiajia Qin5451d532017-11-16 17:16:34 +08004812void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08004813{
4814 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
Jamie Madilld84b6732018-09-06 15:54:35 -04004815 mStateCache.onVertexArrayFormatChange(this);
Shao80957d92017-02-20 21:25:59 +08004816}
4817
Jamie Madillc20ab272016-06-09 07:20:46 -07004818void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4819{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004820 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07004821}
4822
4823void Context::vertexAttribIPointer(GLuint index,
4824 GLint size,
4825 GLenum type,
4826 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04004827 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07004828{
Corentin Wallez336129f2017-10-17 15:55:40 -04004829 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
4830 size, type, false, true, stride, pointer);
Jamie Madillc43cdad2018-08-08 15:49:25 -04004831 mStateCache.onVertexArrayStateChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004832}
4833
4834void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
4835{
4836 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004837 mGLState.setVertexAttribi(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004838 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004839}
4840
4841void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
4842{
4843 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004844 mGLState.setVertexAttribu(index, vals);
Jamie Madilld84b6732018-09-06 15:54:35 -04004845 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004846}
4847
4848void Context::vertexAttribI4iv(GLuint index, const GLint *v)
4849{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004850 mGLState.setVertexAttribi(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004851 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004852}
4853
4854void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
4855{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004856 mGLState.setVertexAttribu(index, v);
Jamie Madilld84b6732018-09-06 15:54:35 -04004857 mStateCache.onDefaultVertexAttributeChange(this);
Jamie Madillc20ab272016-06-09 07:20:46 -07004858}
4859
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004860void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
4861{
4862 const VertexAttribCurrentValueData &currentValues =
4863 getGLState().getVertexAttribCurrentValue(index);
4864 const VertexArray *vao = getGLState().getVertexArray();
4865 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4866 currentValues, pname, params);
4867}
4868
Brandon Jones59770802018-04-02 13:18:42 -07004869void Context::getVertexAttribivRobust(GLuint index,
4870 GLenum pname,
4871 GLsizei bufSize,
4872 GLsizei *length,
4873 GLint *params)
4874{
4875 getVertexAttribiv(index, pname, params);
4876}
4877
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004878void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
4879{
4880 const VertexAttribCurrentValueData &currentValues =
4881 getGLState().getVertexAttribCurrentValue(index);
4882 const VertexArray *vao = getGLState().getVertexArray();
4883 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4884 currentValues, pname, params);
4885}
4886
Brandon Jones59770802018-04-02 13:18:42 -07004887void Context::getVertexAttribfvRobust(GLuint index,
4888 GLenum pname,
4889 GLsizei bufSize,
4890 GLsizei *length,
4891 GLfloat *params)
4892{
4893 getVertexAttribfv(index, pname, params);
4894}
4895
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004896void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
4897{
4898 const VertexAttribCurrentValueData &currentValues =
4899 getGLState().getVertexAttribCurrentValue(index);
4900 const VertexArray *vao = getGLState().getVertexArray();
4901 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4902 currentValues, pname, params);
4903}
4904
Brandon Jones59770802018-04-02 13:18:42 -07004905void Context::getVertexAttribIivRobust(GLuint index,
4906 GLenum pname,
4907 GLsizei bufSize,
4908 GLsizei *length,
4909 GLint *params)
4910{
4911 getVertexAttribIiv(index, pname, params);
4912}
4913
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004914void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
4915{
4916 const VertexAttribCurrentValueData &currentValues =
4917 getGLState().getVertexAttribCurrentValue(index);
4918 const VertexArray *vao = getGLState().getVertexArray();
4919 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
4920 currentValues, pname, params);
4921}
4922
Brandon Jones59770802018-04-02 13:18:42 -07004923void Context::getVertexAttribIuivRobust(GLuint index,
4924 GLenum pname,
4925 GLsizei bufSize,
4926 GLsizei *length,
4927 GLuint *params)
4928{
4929 getVertexAttribIuiv(index, pname, params);
4930}
4931
Jamie Madill876429b2017-04-20 15:46:24 -04004932void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08004933{
4934 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
4935 QueryVertexAttribPointerv(attrib, pname, pointer);
4936}
4937
Brandon Jones59770802018-04-02 13:18:42 -07004938void Context::getVertexAttribPointervRobust(GLuint index,
4939 GLenum pname,
4940 GLsizei bufSize,
4941 GLsizei *length,
4942 void **pointer)
4943{
4944 getVertexAttribPointerv(index, pname, pointer);
4945}
4946
Jamie Madillc20ab272016-06-09 07:20:46 -07004947void Context::debugMessageControl(GLenum source,
4948 GLenum type,
4949 GLenum severity,
4950 GLsizei count,
4951 const GLuint *ids,
4952 GLboolean enabled)
4953{
4954 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004955 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05004956 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07004957}
4958
4959void Context::debugMessageInsert(GLenum source,
4960 GLenum type,
4961 GLuint id,
4962 GLenum severity,
4963 GLsizei length,
4964 const GLchar *buf)
4965{
4966 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004967 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004968}
4969
4970void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4971{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004972 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004973}
4974
4975GLuint Context::getDebugMessageLog(GLuint count,
4976 GLsizei bufSize,
4977 GLenum *sources,
4978 GLenum *types,
4979 GLuint *ids,
4980 GLenum *severities,
4981 GLsizei *lengths,
4982 GLchar *messageLog)
4983{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004984 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4985 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004986}
4987
4988void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4989{
4990 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004991 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004992 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004993}
4994
4995void Context::popDebugGroup()
4996{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004997 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004998 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004999}
5000
Corentin Wallez336129f2017-10-17 15:55:40 -04005001void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04005002{
5003 Buffer *buffer = mGLState.getTargetBuffer(target);
5004 ASSERT(buffer);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005005 ANGLE_CONTEXT_TRY(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04005006}
5007
Corentin Wallez336129f2017-10-17 15:55:40 -04005008void Context::bufferSubData(BufferBinding target,
5009 GLintptr offset,
5010 GLsizeiptr size,
5011 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04005012{
Courtney Goeltzenleuchter62114aa2018-08-28 09:36:46 -06005013 if (data == nullptr || size == 0)
Jamie Madill29639852016-09-02 15:00:09 -04005014 {
5015 return;
5016 }
5017
5018 Buffer *buffer = mGLState.getTargetBuffer(target);
5019 ASSERT(buffer);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005020 ANGLE_CONTEXT_TRY(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04005021}
5022
Jamie Madillef300b12016-10-07 15:12:09 -04005023void Context::attachShader(GLuint program, GLuint shader)
5024{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05005025 Program *programObject = mState.mShaderPrograms->getProgram(program);
5026 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04005027 ASSERT(programObject && shaderObject);
5028 programObject->attachShader(shaderObject);
5029}
5030
Kenneth Russellf2f6f652016-10-05 19:53:23 -07005031const Workarounds &Context::getWorkarounds() const
5032{
5033 return mWorkarounds;
5034}
5035
Corentin Wallez336129f2017-10-17 15:55:40 -04005036void Context::copyBufferSubData(BufferBinding readTarget,
5037 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04005038 GLintptr readOffset,
5039 GLintptr writeOffset,
5040 GLsizeiptr size)
5041{
5042 // if size is zero, the copy is a successful no-op
5043 if (size == 0)
5044 {
5045 return;
5046 }
5047
5048 // TODO(jmadill): cache these.
5049 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
5050 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
5051
Jamie Madill4f6592f2018-11-27 16:37:45 -05005052 ANGLE_CONTEXT_TRY(
5053 writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04005054}
5055
Jamie Madill01a80ee2016-11-07 12:06:18 -05005056void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
5057{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005058 // Ideally we could share the program query with the validation layer if possible.
5059 Program *programObject = getProgramResolveLink(program);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005060 ASSERT(programObject);
5061 programObject->bindAttributeLocation(index, name);
5062}
5063
Corentin Wallez336129f2017-10-17 15:55:40 -04005064void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08005065{
5066 bindBufferRange(target, index, buffer, 0, 0);
5067}
5068
Corentin Wallez336129f2017-10-17 15:55:40 -04005069void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08005070 GLuint index,
5071 GLuint buffer,
5072 GLintptr offset,
5073 GLsizeiptr size)
5074{
Jamie Madill6d32cef2018-08-14 02:34:28 -04005075 Buffer *object = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
Geoff Lang91002262018-12-12 16:05:24 -05005076 ANGLE_CONTEXT_TRY(mGLState.setIndexedBufferBinding(this, target, index, object, offset, size));
Jamie Madill6d32cef2018-08-14 02:34:28 -04005077 if (target == BufferBinding::Uniform)
5078 {
Jamie Madill472ddc82018-10-18 18:41:56 -04005079 mUniformBufferObserverBindings[index].bind(object);
Jamie Madilld84b6732018-09-06 15:54:35 -04005080 mStateCache.onUniformBufferStateChange(this);
5081 }
5082 else
5083 {
5084 mStateCache.onBufferBindingChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04005085 }
Jiajia Qin6eafb042016-12-27 17:04:07 +08005086}
5087
Jamie Madill01a80ee2016-11-07 12:06:18 -05005088void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
5089{
5090 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5091 {
5092 bindReadFramebuffer(framebuffer);
5093 }
5094
5095 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
5096 {
5097 bindDrawFramebuffer(framebuffer);
5098 }
5099}
5100
5101void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
5102{
5103 ASSERT(target == GL_RENDERBUFFER);
5104 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05005105 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04005106 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05005107}
5108
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005109void Context::texStorage2DMultisample(TextureType target,
JiangYizhoubddc46b2016-12-09 09:50:51 +08005110 GLsizei samples,
5111 GLenum internalformat,
5112 GLsizei width,
5113 GLsizei height,
5114 GLboolean fixedsamplelocations)
5115{
5116 Extents size(width, height, 1);
5117 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005118 ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
5119 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005120}
5121
Olli Etuaho89664842018-08-24 14:45:36 +03005122void Context::texStorage3DMultisample(TextureType target,
5123 GLsizei samples,
5124 GLenum internalformat,
5125 GLsizei width,
5126 GLsizei height,
5127 GLsizei depth,
5128 GLboolean fixedsamplelocations)
5129{
Olli Etuaho0c5a9e22018-08-27 14:36:23 +03005130 Extents size(width, height, depth);
5131 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005132 ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
5133 ConvertToBool(fixedsamplelocations)));
Olli Etuaho89664842018-08-24 14:45:36 +03005134}
5135
JiangYizhoubddc46b2016-12-09 09:50:51 +08005136void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
5137{
JiangYizhou5b03f472017-01-09 10:22:53 +08005138 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
5139 // the sample position should be queried by DRAW_FRAMEBUFFER.
Jamie Madillbc918e72018-03-08 09:47:21 -05005140 ANGLE_CONTEXT_TRY(mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER));
JiangYizhou5b03f472017-01-09 10:22:53 +08005141 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08005142
5143 switch (pname)
5144 {
5145 case GL_SAMPLE_POSITION:
Jamie Madill4f6592f2018-11-27 16:37:45 -05005146 ANGLE_CONTEXT_TRY(framebuffer->getSamplePosition(this, index, val));
JiangYizhoubddc46b2016-12-09 09:50:51 +08005147 break;
5148 default:
5149 UNREACHABLE();
5150 }
5151}
5152
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005153void Context::getMultisamplefvRobust(GLenum pname,
5154 GLuint index,
5155 GLsizei bufSize,
5156 GLsizei *length,
5157 GLfloat *val)
5158{
5159 UNIMPLEMENTED();
5160}
5161
Jamie Madille8fb6402017-02-14 17:56:40 -05005162void Context::renderbufferStorage(GLenum target,
5163 GLenum internalformat,
5164 GLsizei width,
5165 GLsizei height)
5166{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005167 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5168 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
5169
Jamie Madille8fb6402017-02-14 17:56:40 -05005170 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4f6592f2018-11-27 16:37:45 -05005171 ANGLE_CONTEXT_TRY(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005172}
5173
5174void Context::renderbufferStorageMultisample(GLenum target,
5175 GLsizei samples,
5176 GLenum internalformat,
5177 GLsizei width,
5178 GLsizei height)
5179{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05005180 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
5181 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05005182
5183 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4f6592f2018-11-27 16:37:45 -05005184 ANGLE_CONTEXT_TRY(
Jamie Madill4928b7c2017-06-20 12:57:39 -04005185 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05005186}
5187
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005188void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
5189{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005190 const Sync *syncObject = getSync(sync);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005191 ANGLE_CONTEXT_TRY(QuerySynciv(this, syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04005192}
5193
JiangYizhoue18e6392017-02-20 10:32:23 +08005194void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
5195{
5196 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5197 QueryFramebufferParameteriv(framebuffer, pname, params);
5198}
5199
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07005200void Context::getFramebufferParameterivRobust(GLenum target,
5201 GLenum pname,
5202 GLsizei bufSize,
5203 GLsizei *length,
5204 GLint *params)
5205{
5206 UNIMPLEMENTED();
5207}
5208
Jiajia Qin5451d532017-11-16 17:16:34 +08005209void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08005210{
5211 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillb983a4b2018-08-01 11:34:51 -04005212 SetFramebufferParameteri(this, framebuffer, pname, param);
JiangYizhoue18e6392017-02-20 10:32:23 +08005213}
5214
Jamie Madilldec86232018-07-11 09:01:18 -04005215bool Context::getScratchBuffer(size_t requstedSizeBytes,
5216 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05005217{
Jamie Madilldec86232018-07-11 09:01:18 -04005218 return mScratchBuffer.get(requstedSizeBytes, scratchBufferOut);
Jamie Madillb3f26b92017-07-19 15:07:41 -04005219}
5220
Jamie Madilldec86232018-07-11 09:01:18 -04005221bool Context::getZeroFilledBuffer(size_t requstedSizeBytes,
5222 angle::MemoryBuffer **zeroBufferOut) const
Jamie Madillb3f26b92017-07-19 15:07:41 -04005223{
Jamie Madilldec86232018-07-11 09:01:18 -04005224 return mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0);
Jamie Madille14951e2017-03-09 18:55:16 -05005225}
5226
Xinghua Cao2b396592017-03-29 15:36:04 +08005227void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
5228{
5229 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
5230 {
5231 return;
5232 }
5233
Xinghua Cao10a4d432017-11-28 14:46:26 +08005234 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill4f6592f2018-11-27 16:37:45 -05005235 ANGLE_CONTEXT_TRY(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08005236}
5237
Jiajia Qin5451d532017-11-16 17:16:34 +08005238void Context::dispatchComputeIndirect(GLintptr indirect)
5239{
Qin Jiajia62fcf622017-11-30 16:16:12 +08005240 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill4f6592f2018-11-27 16:37:45 -05005241 ANGLE_CONTEXT_TRY(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08005242}
5243
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005244void Context::texStorage2D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005245 GLsizei levels,
5246 GLenum internalFormat,
5247 GLsizei width,
5248 GLsizei height)
5249{
5250 Extents size(width, height, 1);
5251 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005252 ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005253}
5254
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005255void Context::texStorage3D(TextureType target,
JiangYizhou165361c2017-06-07 14:56:57 +08005256 GLsizei levels,
5257 GLenum internalFormat,
5258 GLsizei width,
5259 GLsizei height,
5260 GLsizei depth)
5261{
5262 Extents size(width, height, depth);
5263 Texture *texture = getTargetTexture(target);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005264 ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
JiangYizhou165361c2017-06-07 14:56:57 +08005265}
5266
Jiajia Qin5451d532017-11-16 17:16:34 +08005267void Context::memoryBarrier(GLbitfield barriers)
5268{
Jamie Madill4f6592f2018-11-27 16:37:45 -05005269 ANGLE_CONTEXT_TRY(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005270}
5271
5272void Context::memoryBarrierByRegion(GLbitfield barriers)
5273{
Jamie Madill4f6592f2018-11-27 16:37:45 -05005274 ANGLE_CONTEXT_TRY(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08005275}
5276
Austin Eng1bf18ce2018-10-19 15:34:02 -07005277void Context::multiDrawArrays(PrimitiveMode mode,
5278 const GLint *firsts,
5279 const GLsizei *counts,
5280 GLsizei drawcount)
5281{
5282 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5283 Program *programObject = mGLState.getLinkedProgram(this);
5284 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5285 if (hasDrawID)
5286 {
5287 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5288 {
5289 if (noopDraw(mode, counts[drawID]))
5290 {
5291 continue;
5292 }
5293 programObject->setDrawIDUniform(drawID);
5294 ANGLE_CONTEXT_TRY(
5295 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005296 MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005297 }
5298 }
5299 else
5300 {
5301 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5302 {
5303 if (noopDraw(mode, counts[drawID]))
5304 {
5305 continue;
5306 }
5307 ANGLE_CONTEXT_TRY(
5308 mImplementation->drawArrays(this, mode, firsts[drawID], counts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005309 MarkTransformFeedbackBufferUsage(this, counts[drawID], 1);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005310 }
5311 }
5312}
5313
5314void Context::multiDrawArraysInstanced(PrimitiveMode mode,
5315 const GLint *firsts,
5316 const GLsizei *counts,
5317 const GLsizei *instanceCounts,
5318 GLsizei drawcount)
5319{
5320 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5321 Program *programObject = mGLState.getLinkedProgram(this);
5322 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5323 if (hasDrawID)
5324 {
5325 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5326 {
5327 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5328 {
5329 continue;
5330 }
5331 programObject->setDrawIDUniform(drawID);
5332 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5333 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005334 MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005335 }
5336 }
5337 else
5338 {
5339 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5340 {
5341 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5342 {
5343 continue;
5344 }
5345 ANGLE_CONTEXT_TRY(mImplementation->drawArraysInstanced(
5346 this, mode, firsts[drawID], counts[drawID], instanceCounts[drawID]));
Jamie Madillae6ba9f2018-12-21 23:00:04 -05005347 MarkTransformFeedbackBufferUsage(this, counts[drawID], instanceCounts[drawID]);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005348 }
5349 }
5350}
5351
5352void Context::multiDrawElements(PrimitiveMode mode,
5353 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05005354 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08005355 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07005356 GLsizei drawcount)
5357{
5358 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5359 Program *programObject = mGLState.getLinkedProgram(this);
5360 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5361 if (hasDrawID)
5362 {
5363 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5364 {
5365 if (noopDraw(mode, counts[drawID]))
5366 {
5367 continue;
5368 }
5369 programObject->setDrawIDUniform(drawID);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005370 ANGLE_CONTEXT_TRY(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005371 mImplementation->drawElements(this, mode, counts[drawID], type, indices[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005372 }
5373 }
5374 else
5375 {
5376 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5377 {
5378 if (noopDraw(mode, counts[drawID]))
5379 {
5380 continue;
5381 }
Austin Eng1bf18ce2018-10-19 15:34:02 -07005382 ANGLE_CONTEXT_TRY(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005383 mImplementation->drawElements(this, mode, counts[drawID], type, indices[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005384 }
5385 }
5386}
5387
5388void Context::multiDrawElementsInstanced(PrimitiveMode mode,
5389 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05005390 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08005391 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07005392 const GLsizei *instanceCounts,
5393 GLsizei drawcount)
5394{
5395 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
5396 Program *programObject = mGLState.getLinkedProgram(this);
5397 const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
5398 if (hasDrawID)
5399 {
5400 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5401 {
5402 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5403 {
5404 continue;
5405 }
5406 programObject->setDrawIDUniform(drawID);
Austin Eng1bf18ce2018-10-19 15:34:02 -07005407 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005408 this, mode, counts[drawID], type, indices[drawID], instanceCounts[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005409 }
5410 }
5411 else
5412 {
5413 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
5414 {
5415 if (noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID]))
5416 {
5417 continue;
5418 }
Austin Eng1bf18ce2018-10-19 15:34:02 -07005419 ANGLE_CONTEXT_TRY(mImplementation->drawElementsInstanced(
Austin Eng3b7c9d02018-11-21 18:09:05 -08005420 this, mode, counts[drawID], type, indices[drawID], instanceCounts[drawID]));
Austin Eng1bf18ce2018-10-19 15:34:02 -07005421 }
5422 }
5423}
5424
Jamie Madillc1d770e2017-04-13 17:31:24 -04005425GLenum Context::checkFramebufferStatus(GLenum target)
5426{
5427 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
5428 ASSERT(framebuffer);
Jamie Madill427064d2018-04-13 16:20:34 -04005429 return framebuffer->checkStatus(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005430}
5431
5432void Context::compileShader(GLuint shader)
5433{
5434 Shader *shaderObject = GetValidShader(this, shader);
5435 if (!shaderObject)
5436 {
5437 return;
5438 }
5439 shaderObject->compile(this);
5440}
5441
5442void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
5443{
5444 for (int i = 0; i < n; i++)
5445 {
5446 deleteBuffer(buffers[i]);
5447 }
5448}
5449
5450void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
5451{
5452 for (int i = 0; i < n; i++)
5453 {
5454 if (framebuffers[i] != 0)
5455 {
5456 deleteFramebuffer(framebuffers[i]);
5457 }
5458 }
5459}
5460
5461void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
5462{
5463 for (int i = 0; i < n; i++)
5464 {
5465 deleteRenderbuffer(renderbuffers[i]);
5466 }
5467}
5468
5469void Context::deleteTextures(GLsizei n, const GLuint *textures)
5470{
5471 for (int i = 0; i < n; i++)
5472 {
5473 if (textures[i] != 0)
5474 {
5475 deleteTexture(textures[i]);
5476 }
5477 }
5478}
5479
5480void Context::detachShader(GLuint program, GLuint shader)
5481{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005482 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005483 ASSERT(programObject);
5484
5485 Shader *shaderObject = getShader(shader);
5486 ASSERT(shaderObject);
5487
5488 programObject->detachShader(this, shaderObject);
5489}
5490
5491void Context::genBuffers(GLsizei n, GLuint *buffers)
5492{
5493 for (int i = 0; i < n; i++)
5494 {
5495 buffers[i] = createBuffer();
5496 }
5497}
5498
5499void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
5500{
5501 for (int i = 0; i < n; i++)
5502 {
5503 framebuffers[i] = createFramebuffer();
5504 }
5505}
5506
5507void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
5508{
5509 for (int i = 0; i < n; i++)
5510 {
5511 renderbuffers[i] = createRenderbuffer();
5512 }
5513}
5514
5515void Context::genTextures(GLsizei n, GLuint *textures)
5516{
5517 for (int i = 0; i < n; i++)
5518 {
5519 textures[i] = createTexture();
5520 }
5521}
5522
5523void Context::getActiveAttrib(GLuint program,
5524 GLuint index,
5525 GLsizei bufsize,
5526 GLsizei *length,
5527 GLint *size,
5528 GLenum *type,
5529 GLchar *name)
5530{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005531 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005532 ASSERT(programObject);
5533 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
5534}
5535
5536void Context::getActiveUniform(GLuint program,
5537 GLuint index,
5538 GLsizei bufsize,
5539 GLsizei *length,
5540 GLint *size,
5541 GLenum *type,
5542 GLchar *name)
5543{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005544 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005545 ASSERT(programObject);
5546 programObject->getActiveUniform(index, bufsize, length, size, type, name);
5547}
5548
5549void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
5550{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005551 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005552 ASSERT(programObject);
5553 programObject->getAttachedShaders(maxcount, count, shaders);
5554}
5555
5556GLint Context::getAttribLocation(GLuint program, const GLchar *name)
5557{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005558 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005559 ASSERT(programObject);
5560 return programObject->getAttributeLocation(name);
5561}
5562
5563void Context::getBooleanv(GLenum pname, GLboolean *params)
5564{
5565 GLenum nativeType;
5566 unsigned int numParams = 0;
5567 getQueryParameterInfo(pname, &nativeType, &numParams);
5568
5569 if (nativeType == GL_BOOL)
5570 {
5571 getBooleanvImpl(pname, params);
5572 }
5573 else
5574 {
5575 CastStateValues(this, nativeType, pname, numParams, params);
5576 }
5577}
5578
Brandon Jones59770802018-04-02 13:18:42 -07005579void Context::getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params)
5580{
5581 getBooleanv(pname, params);
5582}
5583
Jamie Madillc1d770e2017-04-13 17:31:24 -04005584void Context::getFloatv(GLenum pname, GLfloat *params)
5585{
5586 GLenum nativeType;
5587 unsigned int numParams = 0;
5588 getQueryParameterInfo(pname, &nativeType, &numParams);
5589
5590 if (nativeType == GL_FLOAT)
5591 {
5592 getFloatvImpl(pname, params);
5593 }
5594 else
5595 {
5596 CastStateValues(this, nativeType, pname, numParams, params);
5597 }
5598}
5599
Brandon Jones59770802018-04-02 13:18:42 -07005600void Context::getFloatvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params)
5601{
5602 getFloatv(pname, params);
5603}
5604
Jamie Madillc1d770e2017-04-13 17:31:24 -04005605void Context::getIntegerv(GLenum pname, GLint *params)
5606{
5607 GLenum nativeType;
5608 unsigned int numParams = 0;
5609 getQueryParameterInfo(pname, &nativeType, &numParams);
5610
5611 if (nativeType == GL_INT)
5612 {
5613 getIntegervImpl(pname, params);
5614 }
5615 else
5616 {
5617 CastStateValues(this, nativeType, pname, numParams, params);
5618 }
5619}
5620
Brandon Jones59770802018-04-02 13:18:42 -07005621void Context::getIntegervRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint *data)
5622{
5623 getIntegerv(pname, data);
5624}
5625
Jamie Madillc1d770e2017-04-13 17:31:24 -04005626void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
5627{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005628 // Don't resolve link if checking the link completion status.
5629 Program *programObject = (pname == GL_COMPLETION_STATUS_KHR ? getProgramNoResolveLink(program)
5630 : getProgramResolveLink(program));
Jamie Madillc1d770e2017-04-13 17:31:24 -04005631 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04005632 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005633}
5634
Brandon Jones59770802018-04-02 13:18:42 -07005635void Context::getProgramivRobust(GLuint program,
5636 GLenum pname,
5637 GLsizei bufSize,
5638 GLsizei *length,
5639 GLint *params)
5640{
5641 getProgramiv(program, pname, params);
5642}
5643
Jiajia Qin5451d532017-11-16 17:16:34 +08005644void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
5645{
5646 UNIMPLEMENTED();
5647}
5648
Jamie Madillbe849e42017-05-02 15:49:00 -04005649void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005650{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005651 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005652 ASSERT(programObject);
5653 programObject->getInfoLog(bufsize, length, infolog);
5654}
5655
Jiajia Qin5451d532017-11-16 17:16:34 +08005656void Context::getProgramPipelineInfoLog(GLuint pipeline,
5657 GLsizei bufSize,
5658 GLsizei *length,
5659 GLchar *infoLog)
5660{
5661 UNIMPLEMENTED();
5662}
5663
Jamie Madillc1d770e2017-04-13 17:31:24 -04005664void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
5665{
5666 Shader *shaderObject = getShader(shader);
5667 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005668 QueryShaderiv(shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005669}
5670
Brandon Jones59770802018-04-02 13:18:42 -07005671void Context::getShaderivRobust(GLuint shader,
5672 GLenum pname,
5673 GLsizei bufSize,
5674 GLsizei *length,
5675 GLint *params)
5676{
5677 getShaderiv(shader, pname, params);
5678}
5679
Jamie Madillc1d770e2017-04-13 17:31:24 -04005680void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
5681{
5682 Shader *shaderObject = getShader(shader);
5683 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08005684 shaderObject->getInfoLog(bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005685}
5686
5687void Context::getShaderPrecisionFormat(GLenum shadertype,
5688 GLenum precisiontype,
5689 GLint *range,
5690 GLint *precision)
5691{
5692 // TODO(jmadill): Compute shaders.
5693
5694 switch (shadertype)
5695 {
5696 case GL_VERTEX_SHADER:
5697 switch (precisiontype)
5698 {
5699 case GL_LOW_FLOAT:
5700 mCaps.vertexLowpFloat.get(range, precision);
5701 break;
5702 case GL_MEDIUM_FLOAT:
5703 mCaps.vertexMediumpFloat.get(range, precision);
5704 break;
5705 case GL_HIGH_FLOAT:
5706 mCaps.vertexHighpFloat.get(range, precision);
5707 break;
5708
5709 case GL_LOW_INT:
5710 mCaps.vertexLowpInt.get(range, precision);
5711 break;
5712 case GL_MEDIUM_INT:
5713 mCaps.vertexMediumpInt.get(range, precision);
5714 break;
5715 case GL_HIGH_INT:
5716 mCaps.vertexHighpInt.get(range, precision);
5717 break;
5718
5719 default:
5720 UNREACHABLE();
5721 return;
5722 }
5723 break;
5724
5725 case GL_FRAGMENT_SHADER:
5726 switch (precisiontype)
5727 {
5728 case GL_LOW_FLOAT:
5729 mCaps.fragmentLowpFloat.get(range, precision);
5730 break;
5731 case GL_MEDIUM_FLOAT:
5732 mCaps.fragmentMediumpFloat.get(range, precision);
5733 break;
5734 case GL_HIGH_FLOAT:
5735 mCaps.fragmentHighpFloat.get(range, precision);
5736 break;
5737
5738 case GL_LOW_INT:
5739 mCaps.fragmentLowpInt.get(range, precision);
5740 break;
5741 case GL_MEDIUM_INT:
5742 mCaps.fragmentMediumpInt.get(range, precision);
5743 break;
5744 case GL_HIGH_INT:
5745 mCaps.fragmentHighpInt.get(range, precision);
5746 break;
5747
5748 default:
5749 UNREACHABLE();
5750 return;
5751 }
5752 break;
5753
5754 default:
5755 UNREACHABLE();
5756 return;
5757 }
5758}
5759
5760void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
5761{
5762 Shader *shaderObject = getShader(shader);
5763 ASSERT(shaderObject);
5764 shaderObject->getSource(bufsize, length, source);
5765}
5766
5767void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
5768{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005769 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005770 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005771 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005772}
5773
Brandon Jones59770802018-04-02 13:18:42 -07005774void Context::getUniformfvRobust(GLuint program,
5775 GLint location,
5776 GLsizei bufSize,
5777 GLsizei *length,
5778 GLfloat *params)
5779{
5780 getUniformfv(program, location, params);
5781}
5782
Jamie Madillc1d770e2017-04-13 17:31:24 -04005783void Context::getUniformiv(GLuint program, GLint location, GLint *params)
5784{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005785 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005786 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04005787 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005788}
5789
Brandon Jones59770802018-04-02 13:18:42 -07005790void Context::getUniformivRobust(GLuint program,
5791 GLint location,
5792 GLsizei bufSize,
5793 GLsizei *length,
5794 GLint *params)
5795{
5796 getUniformiv(program, location, params);
5797}
5798
Jamie Madillc1d770e2017-04-13 17:31:24 -04005799GLint Context::getUniformLocation(GLuint program, const GLchar *name)
5800{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005801 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005802 ASSERT(programObject);
5803 return programObject->getUniformLocation(name);
5804}
5805
5806GLboolean Context::isBuffer(GLuint buffer)
5807{
5808 if (buffer == 0)
5809 {
5810 return GL_FALSE;
5811 }
5812
5813 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
5814}
5815
5816GLboolean Context::isEnabled(GLenum cap)
5817{
5818 return mGLState.getEnableFeature(cap);
5819}
5820
5821GLboolean Context::isFramebuffer(GLuint framebuffer)
5822{
5823 if (framebuffer == 0)
5824 {
5825 return GL_FALSE;
5826 }
5827
5828 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
5829}
5830
5831GLboolean Context::isProgram(GLuint program)
5832{
5833 if (program == 0)
5834 {
5835 return GL_FALSE;
5836 }
5837
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005838 return (getProgramNoResolveLink(program) ? GL_TRUE : GL_FALSE);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005839}
5840
5841GLboolean Context::isRenderbuffer(GLuint renderbuffer)
5842{
5843 if (renderbuffer == 0)
5844 {
5845 return GL_FALSE;
5846 }
5847
5848 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
5849}
5850
5851GLboolean Context::isShader(GLuint shader)
5852{
5853 if (shader == 0)
5854 {
5855 return GL_FALSE;
5856 }
5857
5858 return (getShader(shader) ? GL_TRUE : GL_FALSE);
5859}
5860
5861GLboolean Context::isTexture(GLuint texture)
5862{
5863 if (texture == 0)
5864 {
5865 return GL_FALSE;
5866 }
5867
5868 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
5869}
5870
5871void Context::linkProgram(GLuint program)
5872{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005873 Program *programObject = getProgramNoResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005874 ASSERT(programObject);
Jamie Madill4f6592f2018-11-27 16:37:45 -05005875 ANGLE_CONTEXT_TRY(programObject->link(this));
jchen107ae70d82018-07-06 13:47:01 +08005876
5877 // Don't parallel link a program which is active in any GL contexts. With this assumption, we
5878 // don't need to worry that:
5879 // 1. Draw calls after link use the new executable code or the old one depending on the link
5880 // result.
5881 // 2. When a backend program, e.g., ProgramD3D is linking, other backend classes like
5882 // StateManager11, Renderer11, etc., may have a chance to make unexpected calls to
5883 // ProgramD3D.
5884 if (programObject->isInUse())
5885 {
Jamie Madill785e8a02018-10-04 17:42:00 -04005886 programObject->resolveLink(this);
Jamie Madilldf836ff2018-10-01 10:36:24 -04005887 if (programObject->isLinked())
5888 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04005889 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04005890 }
jchen107ae70d82018-07-06 13:47:01 +08005891 mStateCache.onProgramExecutableChange(this);
5892 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04005893}
5894
5895void Context::releaseShaderCompiler()
5896{
Jamie Madill4928b7c2017-06-20 12:57:39 -04005897 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005898}
5899
5900void Context::shaderBinary(GLsizei n,
5901 const GLuint *shaders,
5902 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005903 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005904 GLsizei length)
5905{
5906 // No binary shader formats are supported.
5907 UNIMPLEMENTED();
5908}
5909
Olli Etuaho0ca09752018-09-24 11:00:50 +03005910void Context::bindFragDataLocationIndexed(GLuint program,
5911 GLuint colorNumber,
5912 GLuint index,
5913 const char *name)
5914{
5915 Program *programObject = getProgramNoResolveLink(program);
5916 programObject->bindFragmentOutputLocation(colorNumber, name);
5917 programObject->bindFragmentOutputIndex(index, name);
5918}
5919
5920void Context::bindFragDataLocation(GLuint program, GLuint colorNumber, const char *name)
5921{
5922 bindFragDataLocationIndexed(program, colorNumber, 0u, name);
5923}
5924
5925int Context::getFragDataIndex(GLuint program, const char *name)
5926{
5927 Program *programObject = getProgramResolveLink(program);
5928 return programObject->getFragDataIndex(name);
5929}
5930
5931int Context::getProgramResourceLocationIndex(GLuint program,
5932 GLenum programInterface,
5933 const char *name)
5934{
5935 Program *programObject = getProgramResolveLink(program);
5936 ASSERT(programInterface == GL_PROGRAM_OUTPUT);
5937 return programObject->getFragDataIndex(name);
5938}
5939
Jamie Madillc1d770e2017-04-13 17:31:24 -04005940void Context::shaderSource(GLuint shader,
5941 GLsizei count,
5942 const GLchar *const *string,
5943 const GLint *length)
5944{
5945 Shader *shaderObject = getShader(shader);
5946 ASSERT(shaderObject);
5947 shaderObject->setSource(count, string, length);
5948}
5949
5950void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
5951{
5952 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
5953}
5954
5955void Context::stencilMask(GLuint mask)
5956{
5957 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5958}
5959
5960void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5961{
5962 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5963}
5964
5965void Context::uniform1f(GLint location, GLfloat x)
5966{
5967 Program *program = mGLState.getProgram();
5968 program->setUniform1fv(location, 1, &x);
5969}
5970
5971void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
5972{
5973 Program *program = mGLState.getProgram();
5974 program->setUniform1fv(location, count, v);
5975}
5976
Jamie Madill7e4eff12018-08-08 15:49:26 -04005977void Context::setUniform1iImpl(Program *program, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005978{
Jamie Madille3e680c2018-12-03 17:49:08 -05005979 program->setUniform1iv(this, location, count, v);
5980}
5981
5982void Context::onSamplerUniformChange(size_t textureUnitIndex)
5983{
5984 mGLState.onActiveTextureChange(this, textureUnitIndex);
5985 mStateCache.onActiveTextureChange(this);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005986}
5987
Jamie Madill7e4eff12018-08-08 15:49:26 -04005988void Context::uniform1i(GLint location, GLint x)
5989{
5990 setUniform1iImpl(mGLState.getProgram(), location, 1, &x);
5991}
5992
Jamie Madillc1d770e2017-04-13 17:31:24 -04005993void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
5994{
Jamie Madill7e4eff12018-08-08 15:49:26 -04005995 setUniform1iImpl(mGLState.getProgram(), location, count, v);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005996}
5997
5998void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
5999{
6000 GLfloat xy[2] = {x, y};
6001 Program *program = mGLState.getProgram();
6002 program->setUniform2fv(location, 1, xy);
6003}
6004
6005void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6006{
6007 Program *program = mGLState.getProgram();
6008 program->setUniform2fv(location, count, v);
6009}
6010
6011void Context::uniform2i(GLint location, GLint x, GLint y)
6012{
6013 GLint xy[2] = {x, y};
6014 Program *program = mGLState.getProgram();
6015 program->setUniform2iv(location, 1, xy);
6016}
6017
6018void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
6019{
6020 Program *program = mGLState.getProgram();
6021 program->setUniform2iv(location, count, v);
6022}
6023
6024void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6025{
6026 GLfloat xyz[3] = {x, y, z};
6027 Program *program = mGLState.getProgram();
6028 program->setUniform3fv(location, 1, xyz);
6029}
6030
6031void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6032{
6033 Program *program = mGLState.getProgram();
6034 program->setUniform3fv(location, count, v);
6035}
6036
6037void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
6038{
6039 GLint xyz[3] = {x, y, z};
6040 Program *program = mGLState.getProgram();
6041 program->setUniform3iv(location, 1, xyz);
6042}
6043
6044void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
6045{
6046 Program *program = mGLState.getProgram();
6047 program->setUniform3iv(location, count, v);
6048}
6049
6050void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6051{
6052 GLfloat xyzw[4] = {x, y, z, w};
6053 Program *program = mGLState.getProgram();
6054 program->setUniform4fv(location, 1, xyzw);
6055}
6056
6057void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6058{
6059 Program *program = mGLState.getProgram();
6060 program->setUniform4fv(location, count, v);
6061}
6062
6063void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6064{
6065 GLint xyzw[4] = {x, y, z, w};
6066 Program *program = mGLState.getProgram();
6067 program->setUniform4iv(location, 1, xyzw);
6068}
6069
6070void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
6071{
6072 Program *program = mGLState.getProgram();
6073 program->setUniform4iv(location, count, v);
6074}
6075
6076void Context::uniformMatrix2fv(GLint location,
6077 GLsizei count,
6078 GLboolean transpose,
6079 const GLfloat *value)
6080{
6081 Program *program = mGLState.getProgram();
6082 program->setUniformMatrix2fv(location, count, transpose, value);
6083}
6084
6085void Context::uniformMatrix3fv(GLint location,
6086 GLsizei count,
6087 GLboolean transpose,
6088 const GLfloat *value)
6089{
6090 Program *program = mGLState.getProgram();
6091 program->setUniformMatrix3fv(location, count, transpose, value);
6092}
6093
6094void Context::uniformMatrix4fv(GLint location,
6095 GLsizei count,
6096 GLboolean transpose,
6097 const GLfloat *value)
6098{
6099 Program *program = mGLState.getProgram();
6100 program->setUniformMatrix4fv(location, count, transpose, value);
6101}
6102
6103void Context::validateProgram(GLuint program)
6104{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006105 Program *programObject = getProgramResolveLink(program);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006106 ASSERT(programObject);
6107 programObject->validate(mCaps);
6108}
6109
Jiajia Qin5451d532017-11-16 17:16:34 +08006110void Context::validateProgramPipeline(GLuint pipeline)
6111{
6112 UNIMPLEMENTED();
6113}
6114
Jamie Madilld04908b2017-06-09 14:15:35 -04006115void Context::getProgramBinary(GLuint program,
6116 GLsizei bufSize,
6117 GLsizei *length,
6118 GLenum *binaryFormat,
6119 void *binary)
6120{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006121 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006122 ASSERT(programObject != nullptr);
6123
Jamie Madill4f6592f2018-11-27 16:37:45 -05006124 ANGLE_CONTEXT_TRY(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
Jamie Madilld04908b2017-06-09 14:15:35 -04006125}
6126
6127void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
6128{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006129 Program *programObject = getProgramResolveLink(program);
Jamie Madilld04908b2017-06-09 14:15:35 -04006130 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04006131
Jamie Madill4f6592f2018-11-27 16:37:45 -05006132 ANGLE_CONTEXT_TRY(programObject->loadBinary(this, binaryFormat, binary, length));
Jamie Madill70aeda42018-08-20 12:17:40 -04006133 if (programObject->isInUse())
6134 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04006135 ANGLE_CONTEXT_TRY(mGLState.onProgramExecutableChange(this, programObject));
Jamie Madilldf836ff2018-10-01 10:36:24 -04006136 mStateCache.onProgramExecutableChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006137 }
Jamie Madilld04908b2017-06-09 14:15:35 -04006138}
6139
Jamie Madillff325f12017-08-26 15:06:05 -04006140void Context::uniform1ui(GLint location, GLuint v0)
6141{
6142 Program *program = mGLState.getProgram();
6143 program->setUniform1uiv(location, 1, &v0);
6144}
6145
6146void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
6147{
6148 Program *program = mGLState.getProgram();
6149 const GLuint xy[] = {v0, v1};
6150 program->setUniform2uiv(location, 1, xy);
6151}
6152
6153void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
6154{
6155 Program *program = mGLState.getProgram();
6156 const GLuint xyz[] = {v0, v1, v2};
6157 program->setUniform3uiv(location, 1, xyz);
6158}
6159
6160void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
6161{
6162 Program *program = mGLState.getProgram();
6163 const GLuint xyzw[] = {v0, v1, v2, v3};
6164 program->setUniform4uiv(location, 1, xyzw);
6165}
6166
6167void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
6168{
6169 Program *program = mGLState.getProgram();
6170 program->setUniform1uiv(location, count, value);
6171}
6172void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
6173{
6174 Program *program = mGLState.getProgram();
6175 program->setUniform2uiv(location, count, value);
6176}
6177
6178void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
6179{
6180 Program *program = mGLState.getProgram();
6181 program->setUniform3uiv(location, count, value);
6182}
6183
6184void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
6185{
6186 Program *program = mGLState.getProgram();
6187 program->setUniform4uiv(location, count, value);
6188}
6189
Jamie Madillf0e04492017-08-26 15:28:42 -04006190void Context::genQueries(GLsizei n, GLuint *ids)
6191{
6192 for (GLsizei i = 0; i < n; i++)
6193 {
6194 GLuint handle = mQueryHandleAllocator.allocate();
6195 mQueryMap.assign(handle, nullptr);
6196 ids[i] = handle;
6197 }
6198}
6199
6200void Context::deleteQueries(GLsizei n, const GLuint *ids)
6201{
6202 for (int i = 0; i < n; i++)
6203 {
6204 GLuint query = ids[i];
6205
6206 Query *queryObject = nullptr;
6207 if (mQueryMap.erase(query, &queryObject))
6208 {
6209 mQueryHandleAllocator.release(query);
6210 if (queryObject)
6211 {
6212 queryObject->release(this);
6213 }
6214 }
6215 }
6216}
6217
6218GLboolean Context::isQuery(GLuint id)
6219{
Corentin Wallezad3ae902018-03-09 13:40:42 -05006220 return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
Jamie Madillf0e04492017-08-26 15:28:42 -04006221}
6222
Jamie Madillc8c95812017-08-26 18:40:09 -04006223void Context::uniformMatrix2x3fv(GLint location,
6224 GLsizei count,
6225 GLboolean transpose,
6226 const GLfloat *value)
6227{
6228 Program *program = mGLState.getProgram();
6229 program->setUniformMatrix2x3fv(location, count, transpose, value);
6230}
6231
6232void Context::uniformMatrix3x2fv(GLint location,
6233 GLsizei count,
6234 GLboolean transpose,
6235 const GLfloat *value)
6236{
6237 Program *program = mGLState.getProgram();
6238 program->setUniformMatrix3x2fv(location, count, transpose, value);
6239}
6240
6241void Context::uniformMatrix2x4fv(GLint location,
6242 GLsizei count,
6243 GLboolean transpose,
6244 const GLfloat *value)
6245{
6246 Program *program = mGLState.getProgram();
6247 program->setUniformMatrix2x4fv(location, count, transpose, value);
6248}
6249
6250void Context::uniformMatrix4x2fv(GLint location,
6251 GLsizei count,
6252 GLboolean transpose,
6253 const GLfloat *value)
6254{
6255 Program *program = mGLState.getProgram();
6256 program->setUniformMatrix4x2fv(location, count, transpose, value);
6257}
6258
6259void Context::uniformMatrix3x4fv(GLint location,
6260 GLsizei count,
6261 GLboolean transpose,
6262 const GLfloat *value)
6263{
6264 Program *program = mGLState.getProgram();
6265 program->setUniformMatrix3x4fv(location, count, transpose, value);
6266}
6267
6268void Context::uniformMatrix4x3fv(GLint location,
6269 GLsizei count,
6270 GLboolean transpose,
6271 const GLfloat *value)
6272{
6273 Program *program = mGLState.getProgram();
6274 program->setUniformMatrix4x3fv(location, count, transpose, value);
6275}
6276
Jamie Madilld7576732017-08-26 18:49:50 -04006277void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
6278{
6279 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6280 {
6281 GLuint vertexArray = arrays[arrayIndex];
6282
6283 if (arrays[arrayIndex] != 0)
6284 {
6285 VertexArray *vertexArrayObject = nullptr;
6286 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
6287 {
6288 if (vertexArrayObject != nullptr)
6289 {
6290 detachVertexArray(vertexArray);
6291 vertexArrayObject->onDestroy(this);
6292 }
6293
6294 mVertexArrayHandleAllocator.release(vertexArray);
6295 }
6296 }
6297 }
6298}
6299
6300void Context::genVertexArrays(GLsizei n, GLuint *arrays)
6301{
6302 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6303 {
6304 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
6305 mVertexArrayMap.assign(vertexArray, nullptr);
6306 arrays[arrayIndex] = vertexArray;
6307 }
6308}
6309
6310bool Context::isVertexArray(GLuint array)
6311{
6312 if (array == 0)
6313 {
6314 return GL_FALSE;
6315 }
6316
6317 VertexArray *vao = getVertexArray(array);
6318 return (vao != nullptr ? GL_TRUE : GL_FALSE);
6319}
6320
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006321void Context::endTransformFeedback()
6322{
6323 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006324 ANGLE_CONTEXT_TRY(transformFeedback->end(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006325 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006326}
6327
6328void Context::transformFeedbackVaryings(GLuint program,
6329 GLsizei count,
6330 const GLchar *const *varyings,
6331 GLenum bufferMode)
6332{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006333 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006334 ASSERT(programObject);
6335 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
6336}
6337
6338void Context::getTransformFeedbackVarying(GLuint program,
6339 GLuint index,
6340 GLsizei bufSize,
6341 GLsizei *length,
6342 GLsizei *size,
6343 GLenum *type,
6344 GLchar *name)
6345{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006346 Program *programObject = getProgramResolveLink(program);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006347 ASSERT(programObject);
6348 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
6349}
6350
6351void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
6352{
6353 for (int i = 0; i < n; i++)
6354 {
6355 GLuint transformFeedback = ids[i];
6356 if (transformFeedback == 0)
6357 {
6358 continue;
6359 }
6360
6361 TransformFeedback *transformFeedbackObject = nullptr;
6362 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
6363 {
6364 if (transformFeedbackObject != nullptr)
6365 {
6366 detachTransformFeedback(transformFeedback);
6367 transformFeedbackObject->release(this);
6368 }
6369
6370 mTransformFeedbackHandleAllocator.release(transformFeedback);
6371 }
6372 }
6373}
6374
6375void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
6376{
6377 for (int i = 0; i < n; i++)
6378 {
6379 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
6380 mTransformFeedbackMap.assign(transformFeedback, nullptr);
6381 ids[i] = transformFeedback;
6382 }
6383}
6384
6385bool Context::isTransformFeedback(GLuint id)
6386{
6387 if (id == 0)
6388 {
6389 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
6390 // returns FALSE
6391 return GL_FALSE;
6392 }
6393
6394 const TransformFeedback *transformFeedback = getTransformFeedback(id);
6395 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
6396}
6397
6398void Context::pauseTransformFeedback()
6399{
6400 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006401 ANGLE_CONTEXT_TRY(transformFeedback->pause(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006402 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006403}
6404
6405void Context::resumeTransformFeedback()
6406{
6407 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Geoff Lang91002262018-12-12 16:05:24 -05006408 ANGLE_CONTEXT_TRY(transformFeedback->resume(this));
Jamie Madill3a256222018-12-08 09:56:39 -05006409 mStateCache.onActiveTransformFeedbackChange(this);
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04006410}
6411
Jamie Madill12e957f2017-08-26 21:42:26 -04006412void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
6413{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006414 const Program *programObject = getProgramResolveLink(program);
Jamie Madill54164b02017-08-28 15:17:37 -04006415 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04006416}
6417
Brandon Jones59770802018-04-02 13:18:42 -07006418void Context::getUniformuivRobust(GLuint program,
6419 GLint location,
6420 GLsizei bufSize,
6421 GLsizei *length,
6422 GLuint *params)
6423{
6424 getUniformuiv(program, location, params);
6425}
6426
Jamie Madill12e957f2017-08-26 21:42:26 -04006427GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
6428{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006429 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006430 return programObject->getFragDataLocation(name);
6431}
6432
6433void Context::getUniformIndices(GLuint program,
6434 GLsizei uniformCount,
6435 const GLchar *const *uniformNames,
6436 GLuint *uniformIndices)
6437{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006438 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006439 if (!programObject->isLinked())
6440 {
6441 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6442 {
6443 uniformIndices[uniformId] = GL_INVALID_INDEX;
6444 }
6445 }
6446 else
6447 {
6448 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6449 {
6450 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
6451 }
6452 }
6453}
6454
6455void Context::getActiveUniformsiv(GLuint program,
6456 GLsizei uniformCount,
6457 const GLuint *uniformIndices,
6458 GLenum pname,
6459 GLint *params)
6460{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006461 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006462 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
6463 {
6464 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08006465 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04006466 }
6467}
6468
6469GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
6470{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006471 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006472 return programObject->getUniformBlockIndex(uniformBlockName);
6473}
6474
6475void Context::getActiveUniformBlockiv(GLuint program,
6476 GLuint uniformBlockIndex,
6477 GLenum pname,
6478 GLint *params)
6479{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006480 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006481 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
6482}
6483
Brandon Jones59770802018-04-02 13:18:42 -07006484void Context::getActiveUniformBlockivRobust(GLuint program,
6485 GLuint uniformBlockIndex,
6486 GLenum pname,
6487 GLsizei bufSize,
6488 GLsizei *length,
6489 GLint *params)
6490{
6491 getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
6492}
6493
Jamie Madill12e957f2017-08-26 21:42:26 -04006494void Context::getActiveUniformBlockName(GLuint program,
6495 GLuint uniformBlockIndex,
6496 GLsizei bufSize,
6497 GLsizei *length,
6498 GLchar *uniformBlockName)
6499{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006500 const Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006501 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
6502}
6503
6504void Context::uniformBlockBinding(GLuint program,
6505 GLuint uniformBlockIndex,
6506 GLuint uniformBlockBinding)
6507{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006508 Program *programObject = getProgramResolveLink(program);
Jamie Madill12e957f2017-08-26 21:42:26 -04006509 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
Jamie Madill70aeda42018-08-20 12:17:40 -04006510
Jamie Madill956ab4d2018-10-10 16:13:03 -04006511 // Note: If the Program is shared between Contexts we would be better using Observer/Subject.
Jamie Madill70aeda42018-08-20 12:17:40 -04006512 if (programObject->isInUse())
6513 {
6514 mGLState.setObjectDirty(GL_PROGRAM);
Jamie Madilld84b6732018-09-06 15:54:35 -04006515 mStateCache.onUniformBufferStateChange(this);
Jamie Madill70aeda42018-08-20 12:17:40 -04006516 }
Jamie Madill12e957f2017-08-26 21:42:26 -04006517}
6518
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006519GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
6520{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006521 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
6522 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006523
Jamie Madill70b5bb02017-08-28 13:32:37 -04006524 Sync *syncObject = getSync(syncHandle);
Jamie Madill7c985f52018-11-29 18:16:17 -05006525 if (syncObject->set(this, condition, flags) == angle::Result::Stop)
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006526 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04006527 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006528 return nullptr;
6529 }
6530
Jamie Madill70b5bb02017-08-28 13:32:37 -04006531 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006532}
6533
6534GLboolean Context::isSync(GLsync sync)
6535{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006536 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006537}
6538
6539GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6540{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006541 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006542
6543 GLenum result = GL_WAIT_FAILED;
Jamie Madill7c985f52018-11-29 18:16:17 -05006544 if (syncObject->clientWait(this, flags, timeout, &result) == angle::Result::Stop)
Jamie Madill4f6592f2018-11-27 16:37:45 -05006545 {
6546 return GL_WAIT_FAILED;
6547 }
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006548 return result;
6549}
6550
6551void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
6552{
Jamie Madill70b5bb02017-08-28 13:32:37 -04006553 Sync *syncObject = getSync(sync);
Jamie Madill4f6592f2018-11-27 16:37:45 -05006554 ANGLE_CONTEXT_TRY(syncObject->serverWait(this, flags, timeout));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04006555}
6556
6557void Context::getInteger64v(GLenum pname, GLint64 *params)
6558{
6559 GLenum nativeType = GL_NONE;
6560 unsigned int numParams = 0;
6561 getQueryParameterInfo(pname, &nativeType, &numParams);
6562
6563 if (nativeType == GL_INT_64_ANGLEX)
6564 {
6565 getInteger64vImpl(pname, params);
6566 }
6567 else
6568 {
6569 CastStateValues(this, nativeType, pname, numParams, params);
6570 }
6571}
6572
Brandon Jones59770802018-04-02 13:18:42 -07006573void Context::getInteger64vRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLint64 *data)
6574{
6575 getInteger64v(pname, data);
6576}
6577
Corentin Wallez336129f2017-10-17 15:55:40 -04006578void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04006579{
6580 Buffer *buffer = mGLState.getTargetBuffer(target);
6581 QueryBufferParameteri64v(buffer, pname, params);
6582}
6583
Brandon Jones59770802018-04-02 13:18:42 -07006584void Context::getBufferParameteri64vRobust(BufferBinding target,
6585 GLenum pname,
6586 GLsizei bufSize,
6587 GLsizei *length,
6588 GLint64 *params)
6589{
6590 getBufferParameteri64v(target, pname, params);
6591}
6592
Jamie Madill3ef140a2017-08-26 23:11:21 -04006593void Context::genSamplers(GLsizei count, GLuint *samplers)
6594{
6595 for (int i = 0; i < count; i++)
6596 {
6597 samplers[i] = mState.mSamplers->createSampler();
6598 }
6599}
6600
6601void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
6602{
6603 for (int i = 0; i < count; i++)
6604 {
6605 GLuint sampler = samplers[i];
6606
6607 if (mState.mSamplers->getSampler(sampler))
6608 {
6609 detachSampler(sampler);
6610 }
6611
6612 mState.mSamplers->deleteObject(this, sampler);
6613 }
6614}
6615
6616void Context::getInternalformativ(GLenum target,
6617 GLenum internalformat,
6618 GLenum pname,
6619 GLsizei bufSize,
6620 GLint *params)
6621{
6622 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
6623 QueryInternalFormativ(formatCaps, pname, bufSize, params);
6624}
6625
Brandon Jones59770802018-04-02 13:18:42 -07006626void Context::getInternalformativRobust(GLenum target,
6627 GLenum internalformat,
6628 GLenum pname,
6629 GLsizei bufSize,
6630 GLsizei *length,
6631 GLint *params)
6632{
6633 getInternalformativ(target, internalformat, pname, bufSize, params);
6634}
6635
Jiajia Qin5451d532017-11-16 17:16:34 +08006636void Context::programUniform1i(GLuint program, GLint location, GLint v0)
6637{
6638 programUniform1iv(program, location, 1, &v0);
6639}
6640
6641void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
6642{
6643 GLint xy[2] = {v0, v1};
6644 programUniform2iv(program, location, 1, xy);
6645}
6646
6647void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
6648{
6649 GLint xyz[3] = {v0, v1, v2};
6650 programUniform3iv(program, location, 1, xyz);
6651}
6652
6653void Context::programUniform4i(GLuint program,
6654 GLint location,
6655 GLint v0,
6656 GLint v1,
6657 GLint v2,
6658 GLint v3)
6659{
6660 GLint xyzw[4] = {v0, v1, v2, v3};
6661 programUniform4iv(program, location, 1, xyzw);
6662}
6663
6664void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
6665{
6666 programUniform1uiv(program, location, 1, &v0);
6667}
6668
6669void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
6670{
6671 GLuint xy[2] = {v0, v1};
6672 programUniform2uiv(program, location, 1, xy);
6673}
6674
6675void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
6676{
6677 GLuint xyz[3] = {v0, v1, v2};
6678 programUniform3uiv(program, location, 1, xyz);
6679}
6680
6681void Context::programUniform4ui(GLuint program,
6682 GLint location,
6683 GLuint v0,
6684 GLuint v1,
6685 GLuint v2,
6686 GLuint v3)
6687{
6688 GLuint xyzw[4] = {v0, v1, v2, v3};
6689 programUniform4uiv(program, location, 1, xyzw);
6690}
6691
6692void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
6693{
6694 programUniform1fv(program, location, 1, &v0);
6695}
6696
6697void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
6698{
6699 GLfloat xy[2] = {v0, v1};
6700 programUniform2fv(program, location, 1, xy);
6701}
6702
6703void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
6704{
6705 GLfloat xyz[3] = {v0, v1, v2};
6706 programUniform3fv(program, location, 1, xyz);
6707}
6708
6709void Context::programUniform4f(GLuint program,
6710 GLint location,
6711 GLfloat v0,
6712 GLfloat v1,
6713 GLfloat v2,
6714 GLfloat v3)
6715{
6716 GLfloat xyzw[4] = {v0, v1, v2, v3};
6717 programUniform4fv(program, location, 1, xyzw);
6718}
6719
Jamie Madill81c2e252017-09-09 23:32:46 -04006720void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6721{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006722 Program *programObject = getProgramResolveLink(program);
Jamie Madill81c2e252017-09-09 23:32:46 -04006723 ASSERT(programObject);
Jamie Madill7e4eff12018-08-08 15:49:26 -04006724 setUniform1iImpl(programObject, location, count, value);
Jamie Madill81c2e252017-09-09 23:32:46 -04006725}
6726
Jiajia Qin5451d532017-11-16 17:16:34 +08006727void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
6728{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006729 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006730 ASSERT(programObject);
6731 programObject->setUniform2iv(location, count, value);
6732}
6733
6734void Context::programUniform3iv(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->setUniform3iv(location, count, value);
6739}
6740
6741void Context::programUniform4iv(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->setUniform4iv(location, count, value);
6746}
6747
6748void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *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->setUniform1uiv(location, count, value);
6753}
6754
6755void Context::programUniform2uiv(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->setUniform2uiv(location, count, value);
6760}
6761
6762void Context::programUniform3uiv(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->setUniform3uiv(location, count, value);
6767}
6768
6769void Context::programUniform4uiv(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->setUniform4uiv(location, count, value);
6774}
6775
6776void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *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->setUniform1fv(location, count, value);
6781}
6782
6783void Context::programUniform2fv(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->setUniform2fv(location, count, value);
6788}
6789
6790void Context::programUniform3fv(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->setUniform3fv(location, count, value);
6795}
6796
6797void Context::programUniform4fv(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->setUniform4fv(location, count, value);
6802}
6803
6804void Context::programUniformMatrix2fv(GLuint program,
6805 GLint location,
6806 GLsizei count,
6807 GLboolean transpose,
6808 const GLfloat *value)
6809{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006810 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006811 ASSERT(programObject);
6812 programObject->setUniformMatrix2fv(location, count, transpose, value);
6813}
6814
6815void Context::programUniformMatrix3fv(GLuint program,
6816 GLint location,
6817 GLsizei count,
6818 GLboolean transpose,
6819 const GLfloat *value)
6820{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006821 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006822 ASSERT(programObject);
6823 programObject->setUniformMatrix3fv(location, count, transpose, value);
6824}
6825
6826void Context::programUniformMatrix4fv(GLuint program,
6827 GLint location,
6828 GLsizei count,
6829 GLboolean transpose,
6830 const GLfloat *value)
6831{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006832 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006833 ASSERT(programObject);
6834 programObject->setUniformMatrix4fv(location, count, transpose, value);
6835}
6836
6837void Context::programUniformMatrix2x3fv(GLuint program,
6838 GLint location,
6839 GLsizei count,
6840 GLboolean transpose,
6841 const GLfloat *value)
6842{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006843 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006844 ASSERT(programObject);
6845 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
6846}
6847
6848void Context::programUniformMatrix3x2fv(GLuint program,
6849 GLint location,
6850 GLsizei count,
6851 GLboolean transpose,
6852 const GLfloat *value)
6853{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006854 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006855 ASSERT(programObject);
6856 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
6857}
6858
6859void Context::programUniformMatrix2x4fv(GLuint program,
6860 GLint location,
6861 GLsizei count,
6862 GLboolean transpose,
6863 const GLfloat *value)
6864{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006865 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006866 ASSERT(programObject);
6867 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
6868}
6869
6870void Context::programUniformMatrix4x2fv(GLuint program,
6871 GLint location,
6872 GLsizei count,
6873 GLboolean transpose,
6874 const GLfloat *value)
6875{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006876 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006877 ASSERT(programObject);
6878 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
6879}
6880
6881void Context::programUniformMatrix3x4fv(GLuint program,
6882 GLint location,
6883 GLsizei count,
6884 GLboolean transpose,
6885 const GLfloat *value)
6886{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006887 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006888 ASSERT(programObject);
6889 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
6890}
6891
6892void Context::programUniformMatrix4x3fv(GLuint program,
6893 GLint location,
6894 GLsizei count,
6895 GLboolean transpose,
6896 const GLfloat *value)
6897{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006898 Program *programObject = getProgramResolveLink(program);
Jiajia Qin5451d532017-11-16 17:16:34 +08006899 ASSERT(programObject);
6900 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
6901}
6902
James Darpiniane8a93c62018-01-04 18:02:24 -08006903bool Context::isCurrentTransformFeedback(const TransformFeedback *tf) const
6904{
6905 return mGLState.isCurrentTransformFeedback(tf);
6906}
James Darpiniane8a93c62018-01-04 18:02:24 -08006907
Yunchao Hea336b902017-08-02 16:05:21 +08006908void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
6909{
6910 for (int i = 0; i < count; i++)
6911 {
6912 pipelines[i] = createProgramPipeline();
6913 }
6914}
6915
6916void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
6917{
6918 for (int i = 0; i < count; i++)
6919 {
6920 if (pipelines[i] != 0)
6921 {
6922 deleteProgramPipeline(pipelines[i]);
6923 }
6924 }
6925}
6926
6927GLboolean Context::isProgramPipeline(GLuint pipeline)
6928{
6929 if (pipeline == 0)
6930 {
6931 return GL_FALSE;
6932 }
6933
6934 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
6935}
6936
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006937void Context::finishFenceNV(GLuint fence)
6938{
6939 FenceNV *fenceObject = getFenceNV(fence);
6940
6941 ASSERT(fenceObject && fenceObject->isSet());
Jamie Madill4f6592f2018-11-27 16:37:45 -05006942 ANGLE_CONTEXT_TRY(fenceObject->finish(this));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006943}
6944
6945void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
6946{
6947 FenceNV *fenceObject = getFenceNV(fence);
6948
6949 ASSERT(fenceObject && fenceObject->isSet());
6950
6951 switch (pname)
6952 {
6953 case GL_FENCE_STATUS_NV:
6954 {
6955 // GL_NV_fence spec:
6956 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
6957 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
6958 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
6959 GLboolean status = GL_TRUE;
6960 if (fenceObject->getStatus() != GL_TRUE)
6961 {
Jamie Madilla0691b72018-07-25 10:41:22 -04006962 ANGLE_CONTEXT_TRY(fenceObject->test(this, &status));
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006963 }
6964 *params = status;
6965 break;
6966 }
6967
6968 case GL_FENCE_CONDITION_NV:
6969 {
6970 *params = static_cast<GLint>(fenceObject->getCondition());
6971 break;
6972 }
6973
6974 default:
6975 UNREACHABLE();
6976 }
6977}
6978
6979void Context::getTranslatedShaderSource(GLuint shader,
6980 GLsizei bufsize,
6981 GLsizei *length,
6982 GLchar *source)
6983{
6984 Shader *shaderObject = getShader(shader);
6985 ASSERT(shaderObject);
jchen103fd614d2018-08-13 12:21:58 +08006986 shaderObject->getTranslatedSourceWithDebugInfo(bufsize, length, source);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006987}
6988
6989void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
6990{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006991 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006992 ASSERT(programObject);
6993
6994 programObject->getUniformfv(this, location, params);
6995}
6996
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07006997void Context::getnUniformfvRobust(GLuint program,
6998 GLint location,
6999 GLsizei bufSize,
7000 GLsizei *length,
7001 GLfloat *params)
7002{
7003 UNIMPLEMENTED();
7004}
7005
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007006void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
7007{
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007008 Program *programObject = getProgramResolveLink(program);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007009 ASSERT(programObject);
7010
7011 programObject->getUniformiv(this, location, params);
7012}
7013
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07007014void Context::getnUniformivRobust(GLuint program,
7015 GLint location,
7016 GLsizei bufSize,
7017 GLsizei *length,
7018 GLint *params)
7019{
7020 UNIMPLEMENTED();
7021}
7022
7023void Context::getnUniformuivRobust(GLuint program,
7024 GLint location,
7025 GLsizei bufSize,
7026 GLsizei *length,
7027 GLuint *params)
7028{
7029 UNIMPLEMENTED();
7030}
7031
Jamie Madill2b7bbc22017-12-21 17:30:38 -05007032GLboolean Context::isFenceNV(GLuint fence)
7033{
7034 FenceNV *fenceObject = getFenceNV(fence);
7035
7036 if (fenceObject == nullptr)
7037 {
7038 return GL_FALSE;
7039 }
7040
7041 // GL_NV_fence spec:
7042 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
7043 // existing fence.
7044 return fenceObject->isSet();
7045}
7046
7047void Context::readnPixels(GLint x,
7048 GLint y,
7049 GLsizei width,
7050 GLsizei height,
7051 GLenum format,
7052 GLenum type,
7053 GLsizei bufSize,
7054 void *data)
7055{
7056 return readPixels(x, y, width, height, format, type, data);
7057}
7058
Jamie Madill007530e2017-12-28 14:27:04 -05007059void Context::setFenceNV(GLuint fence, GLenum condition)
7060{
7061 ASSERT(condition == GL_ALL_COMPLETED_NV);
7062
7063 FenceNV *fenceObject = getFenceNV(fence);
7064 ASSERT(fenceObject != nullptr);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007065 ANGLE_CONTEXT_TRY(fenceObject->set(this, condition));
Jamie Madill007530e2017-12-28 14:27:04 -05007066}
7067
7068GLboolean Context::testFenceNV(GLuint fence)
7069{
7070 FenceNV *fenceObject = getFenceNV(fence);
7071
7072 ASSERT(fenceObject != nullptr);
7073 ASSERT(fenceObject->isSet() == GL_TRUE);
7074
7075 GLboolean result = GL_TRUE;
Jamie Madill7c985f52018-11-29 18:16:17 -05007076 if (fenceObject->test(this, &result) == angle::Result::Stop)
Jamie Madill007530e2017-12-28 14:27:04 -05007077 {
Jamie Madill007530e2017-12-28 14:27:04 -05007078 return GL_TRUE;
7079 }
7080
7081 return result;
7082}
7083
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007084void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007085{
7086 Texture *texture = getTargetTexture(target);
Rafael Cintron05a449a2018-06-20 18:08:04 -07007087 egl::Image *imageObject = static_cast<egl::Image *>(image);
Jamie Madill4f6592f2018-11-27 16:37:45 -05007088 ANGLE_CONTEXT_TRY(texture->setEGLImageTarget(this, target, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007089}
7090
Jamie Madillfa920eb2018-01-04 11:45:50 -05007091void Context::eGLImageTargetRenderbufferStorage(GLenum target, GLeglImageOES image)
Jamie Madill007530e2017-12-28 14:27:04 -05007092{
7093 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
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(renderbuffer->setStorageEGLImageTarget(this, imageObject));
Jamie Madill007530e2017-12-28 14:27:04 -05007096}
7097
Jamie Madillfa920eb2018-01-04 11:45:50 -05007098void Context::texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width)
7099{
7100 UNIMPLEMENTED();
7101}
7102
Jamie Madill5b772312018-03-08 20:28:32 -05007103bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
7104{
7105 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
7106 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
7107 // to the fact that it is stored internally as a float, and so would require conversion
7108 // if returned from Context::getIntegerv. Since this conversion is already implemented
7109 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
7110 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
7111 // application.
7112 switch (pname)
7113 {
7114 case GL_COMPRESSED_TEXTURE_FORMATS:
7115 {
7116 *type = GL_INT;
7117 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
7118 return true;
7119 }
7120 case GL_SHADER_BINARY_FORMATS:
7121 {
7122 *type = GL_INT;
7123 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
7124 return true;
7125 }
7126
7127 case GL_MAX_VERTEX_ATTRIBS:
7128 case GL_MAX_VERTEX_UNIFORM_VECTORS:
7129 case GL_MAX_VARYING_VECTORS:
7130 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
7131 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
7132 case GL_MAX_TEXTURE_IMAGE_UNITS:
7133 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
7134 case GL_MAX_RENDERBUFFER_SIZE:
7135 case GL_NUM_SHADER_BINARY_FORMATS:
7136 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
7137 case GL_ARRAY_BUFFER_BINDING:
Jamie Madillef9fcd92018-11-28 14:03:59 -05007138 case GL_FRAMEBUFFER_BINDING: // GL_FRAMEBUFFER_BINDING now equivalent to
7139 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
Jamie Madill5b772312018-03-08 20:28:32 -05007140 case GL_RENDERBUFFER_BINDING:
7141 case GL_CURRENT_PROGRAM:
7142 case GL_PACK_ALIGNMENT:
7143 case GL_UNPACK_ALIGNMENT:
7144 case GL_GENERATE_MIPMAP_HINT:
7145 case GL_RED_BITS:
7146 case GL_GREEN_BITS:
7147 case GL_BLUE_BITS:
7148 case GL_ALPHA_BITS:
7149 case GL_DEPTH_BITS:
7150 case GL_STENCIL_BITS:
7151 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
7152 case GL_CULL_FACE_MODE:
7153 case GL_FRONT_FACE:
7154 case GL_ACTIVE_TEXTURE:
7155 case GL_STENCIL_FUNC:
7156 case GL_STENCIL_VALUE_MASK:
7157 case GL_STENCIL_REF:
7158 case GL_STENCIL_FAIL:
7159 case GL_STENCIL_PASS_DEPTH_FAIL:
7160 case GL_STENCIL_PASS_DEPTH_PASS:
7161 case GL_STENCIL_BACK_FUNC:
7162 case GL_STENCIL_BACK_VALUE_MASK:
7163 case GL_STENCIL_BACK_REF:
7164 case GL_STENCIL_BACK_FAIL:
7165 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
7166 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
7167 case GL_DEPTH_FUNC:
7168 case GL_BLEND_SRC_RGB:
7169 case GL_BLEND_SRC_ALPHA:
7170 case GL_BLEND_DST_RGB:
7171 case GL_BLEND_DST_ALPHA:
7172 case GL_BLEND_EQUATION_RGB:
7173 case GL_BLEND_EQUATION_ALPHA:
7174 case GL_STENCIL_WRITEMASK:
7175 case GL_STENCIL_BACK_WRITEMASK:
7176 case GL_STENCIL_CLEAR_VALUE:
7177 case GL_SUBPIXEL_BITS:
7178 case GL_MAX_TEXTURE_SIZE:
7179 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
7180 case GL_SAMPLE_BUFFERS:
7181 case GL_SAMPLES:
7182 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
7183 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
7184 case GL_TEXTURE_BINDING_2D:
7185 case GL_TEXTURE_BINDING_CUBE_MAP:
7186 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
7187 {
7188 *type = GL_INT;
7189 *numParams = 1;
7190 return true;
7191 }
7192 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
7193 {
7194 if (!getExtensions().packReverseRowOrder)
7195 {
7196 return false;
7197 }
7198 *type = GL_INT;
7199 *numParams = 1;
7200 return true;
7201 }
7202 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
7203 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
7204 {
7205 if (!getExtensions().textureRectangle)
7206 {
7207 return false;
7208 }
7209 *type = GL_INT;
7210 *numParams = 1;
7211 return true;
7212 }
7213 case GL_MAX_DRAW_BUFFERS_EXT:
7214 case GL_MAX_COLOR_ATTACHMENTS_EXT:
7215 {
7216 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
7217 {
7218 return false;
7219 }
7220 *type = GL_INT;
7221 *numParams = 1;
7222 return true;
7223 }
7224 case GL_MAX_VIEWPORT_DIMS:
7225 {
7226 *type = GL_INT;
7227 *numParams = 2;
7228 return true;
7229 }
7230 case GL_VIEWPORT:
7231 case GL_SCISSOR_BOX:
7232 {
7233 *type = GL_INT;
7234 *numParams = 4;
7235 return true;
7236 }
7237 case GL_SHADER_COMPILER:
7238 case GL_SAMPLE_COVERAGE_INVERT:
7239 case GL_DEPTH_WRITEMASK:
7240 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
7241 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
7242 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
7243 // bool-natural
7244 case GL_SAMPLE_COVERAGE:
7245 case GL_SCISSOR_TEST:
7246 case GL_STENCIL_TEST:
7247 case GL_DEPTH_TEST:
7248 case GL_BLEND:
7249 case GL_DITHER:
7250 case GL_CONTEXT_ROBUST_ACCESS_EXT:
7251 {
7252 *type = GL_BOOL;
7253 *numParams = 1;
7254 return true;
7255 }
7256 case GL_COLOR_WRITEMASK:
7257 {
7258 *type = GL_BOOL;
7259 *numParams = 4;
7260 return true;
7261 }
7262 case GL_POLYGON_OFFSET_FACTOR:
7263 case GL_POLYGON_OFFSET_UNITS:
7264 case GL_SAMPLE_COVERAGE_VALUE:
7265 case GL_DEPTH_CLEAR_VALUE:
7266 case GL_LINE_WIDTH:
7267 {
7268 *type = GL_FLOAT;
7269 *numParams = 1;
7270 return true;
7271 }
7272 case GL_ALIASED_LINE_WIDTH_RANGE:
7273 case GL_ALIASED_POINT_SIZE_RANGE:
7274 case GL_DEPTH_RANGE:
7275 {
7276 *type = GL_FLOAT;
7277 *numParams = 2;
7278 return true;
7279 }
7280 case GL_COLOR_CLEAR_VALUE:
7281 case GL_BLEND_COLOR:
7282 {
7283 *type = GL_FLOAT;
7284 *numParams = 4;
7285 return true;
7286 }
7287 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
7288 if (!getExtensions().textureFilterAnisotropic)
7289 {
7290 return false;
7291 }
7292 *type = GL_FLOAT;
7293 *numParams = 1;
7294 return true;
7295 case GL_TIMESTAMP_EXT:
7296 if (!getExtensions().disjointTimerQuery)
7297 {
7298 return false;
7299 }
7300 *type = GL_INT_64_ANGLEX;
7301 *numParams = 1;
7302 return true;
7303 case GL_GPU_DISJOINT_EXT:
7304 if (!getExtensions().disjointTimerQuery)
7305 {
7306 return false;
7307 }
7308 *type = GL_INT;
7309 *numParams = 1;
7310 return true;
7311 case GL_COVERAGE_MODULATION_CHROMIUM:
7312 if (!getExtensions().framebufferMixedSamples)
7313 {
7314 return false;
7315 }
7316 *type = GL_INT;
7317 *numParams = 1;
7318 return true;
7319 case GL_TEXTURE_BINDING_EXTERNAL_OES:
7320 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
7321 {
7322 return false;
7323 }
7324 *type = GL_INT;
7325 *numParams = 1;
7326 return true;
7327 }
7328
7329 if (getExtensions().debug)
7330 {
7331 switch (pname)
7332 {
7333 case GL_DEBUG_LOGGED_MESSAGES:
7334 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
7335 case GL_DEBUG_GROUP_STACK_DEPTH:
7336 case GL_MAX_DEBUG_MESSAGE_LENGTH:
7337 case GL_MAX_DEBUG_LOGGED_MESSAGES:
7338 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
7339 case GL_MAX_LABEL_LENGTH:
7340 *type = GL_INT;
7341 *numParams = 1;
7342 return true;
7343
7344 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
7345 case GL_DEBUG_OUTPUT:
7346 *type = GL_BOOL;
7347 *numParams = 1;
7348 return true;
7349 }
7350 }
7351
7352 if (getExtensions().multisampleCompatibility)
7353 {
7354 switch (pname)
7355 {
7356 case GL_MULTISAMPLE_EXT:
7357 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
7358 *type = GL_BOOL;
7359 *numParams = 1;
7360 return true;
7361 }
7362 }
7363
7364 if (getExtensions().pathRendering)
7365 {
7366 switch (pname)
7367 {
7368 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
7369 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
7370 *type = GL_FLOAT;
7371 *numParams = 16;
7372 return true;
7373 }
7374 }
7375
7376 if (getExtensions().bindGeneratesResource)
7377 {
7378 switch (pname)
7379 {
7380 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
7381 *type = GL_BOOL;
7382 *numParams = 1;
7383 return true;
7384 }
7385 }
7386
7387 if (getExtensions().clientArrays)
7388 {
7389 switch (pname)
7390 {
7391 case GL_CLIENT_ARRAYS_ANGLE:
7392 *type = GL_BOOL;
7393 *numParams = 1;
7394 return true;
7395 }
7396 }
7397
7398 if (getExtensions().sRGBWriteControl)
7399 {
7400 switch (pname)
7401 {
7402 case GL_FRAMEBUFFER_SRGB_EXT:
7403 *type = GL_BOOL;
7404 *numParams = 1;
7405 return true;
7406 }
7407 }
7408
7409 if (getExtensions().robustResourceInitialization &&
7410 pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
7411 {
7412 *type = GL_BOOL;
7413 *numParams = 1;
7414 return true;
7415 }
7416
7417 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
7418 {
7419 *type = GL_BOOL;
7420 *numParams = 1;
7421 return true;
7422 }
7423
jchen1082af6202018-06-22 10:59:52 +08007424 if (getExtensions().parallelShaderCompile && pname == GL_MAX_SHADER_COMPILER_THREADS_KHR)
7425 {
7426 *type = GL_INT;
7427 *numParams = 1;
7428 return true;
7429 }
7430
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03007431 if (getExtensions().blendFuncExtended && pname == GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT)
7432 {
7433 *type = GL_INT;
7434 *numParams = 1;
7435 return true;
7436 }
7437
Jamie Madill5b772312018-03-08 20:28:32 -05007438 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
7439 switch (pname)
7440 {
Jamie Madillef9fcd92018-11-28 14:03:59 -05007441 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE equivalent to FRAMEBUFFER_BINDING
Jamie Madill5b772312018-03-08 20:28:32 -05007442 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
7443 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
7444 {
7445 return false;
7446 }
7447 *type = GL_INT;
7448 *numParams = 1;
7449 return true;
7450
7451 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
7452 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7453 {
7454 return false;
7455 }
7456 *type = GL_INT;
7457 *numParams = 1;
7458 return true;
7459
7460 case GL_PROGRAM_BINARY_FORMATS_OES:
7461 if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
7462 {
7463 return false;
7464 }
7465 *type = GL_INT;
7466 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
7467 return true;
7468
7469 case GL_PACK_ROW_LENGTH:
7470 case GL_PACK_SKIP_ROWS:
7471 case GL_PACK_SKIP_PIXELS:
7472 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
7473 {
7474 return false;
7475 }
7476 *type = GL_INT;
7477 *numParams = 1;
7478 return true;
7479 case GL_UNPACK_ROW_LENGTH:
7480 case GL_UNPACK_SKIP_ROWS:
7481 case GL_UNPACK_SKIP_PIXELS:
7482 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
7483 {
7484 return false;
7485 }
7486 *type = GL_INT;
7487 *numParams = 1;
7488 return true;
7489 case GL_VERTEX_ARRAY_BINDING:
7490 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
7491 {
7492 return false;
7493 }
7494 *type = GL_INT;
7495 *numParams = 1;
7496 return true;
7497 case GL_PIXEL_PACK_BUFFER_BINDING:
7498 case GL_PIXEL_UNPACK_BUFFER_BINDING:
7499 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
7500 {
7501 return false;
7502 }
7503 *type = GL_INT;
7504 *numParams = 1;
7505 return true;
7506 case GL_MAX_SAMPLES:
7507 {
7508 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
7509 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
7510 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
7511 {
7512 return false;
7513 }
7514 *type = GL_INT;
7515 *numParams = 1;
7516 return true;
7517
7518 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
7519 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
7520 {
7521 return false;
7522 }
7523 *type = GL_INT;
7524 *numParams = 1;
7525 return true;
7526 }
7527 }
7528
7529 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
7530 {
7531 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
7532 {
7533 return false;
7534 }
7535 *type = GL_INT;
7536 *numParams = 1;
7537 return true;
7538 }
7539
7540 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
7541 {
7542 *type = GL_INT;
7543 *numParams = 1;
7544 return true;
7545 }
7546
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007547 if (getClientVersion() < Version(2, 0))
7548 {
7549 switch (pname)
7550 {
7551 case GL_ALPHA_TEST_FUNC:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007552 case GL_CLIENT_ACTIVE_TEXTURE:
7553 case GL_MATRIX_MODE:
7554 case GL_MAX_TEXTURE_UNITS:
7555 case GL_MAX_MODELVIEW_STACK_DEPTH:
7556 case GL_MAX_PROJECTION_STACK_DEPTH:
7557 case GL_MAX_TEXTURE_STACK_DEPTH:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007558 case GL_MAX_LIGHTS:
Lingfeng Yang060088a2018-05-30 20:40:57 -07007559 case GL_MAX_CLIP_PLANES:
Lingfeng Yangabb09f12018-04-16 10:43:53 -07007560 case GL_VERTEX_ARRAY_STRIDE:
7561 case GL_NORMAL_ARRAY_STRIDE:
7562 case GL_COLOR_ARRAY_STRIDE:
7563 case GL_TEXTURE_COORD_ARRAY_STRIDE:
7564 case GL_VERTEX_ARRAY_SIZE:
7565 case GL_COLOR_ARRAY_SIZE:
7566 case GL_TEXTURE_COORD_ARRAY_SIZE:
7567 case GL_VERTEX_ARRAY_TYPE:
7568 case GL_NORMAL_ARRAY_TYPE:
7569 case GL_COLOR_ARRAY_TYPE:
7570 case GL_TEXTURE_COORD_ARRAY_TYPE:
7571 case GL_VERTEX_ARRAY_BUFFER_BINDING:
7572 case GL_NORMAL_ARRAY_BUFFER_BINDING:
7573 case GL_COLOR_ARRAY_BUFFER_BINDING:
7574 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
7575 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
7576 case GL_POINT_SIZE_ARRAY_TYPE_OES:
7577 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07007578 case GL_SHADE_MODEL:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007579 case GL_MODELVIEW_STACK_DEPTH:
7580 case GL_PROJECTION_STACK_DEPTH:
7581 case GL_TEXTURE_STACK_DEPTH:
7582 case GL_LOGIC_OP_MODE:
7583 case GL_BLEND_SRC:
7584 case GL_BLEND_DST:
7585 case GL_PERSPECTIVE_CORRECTION_HINT:
7586 case GL_POINT_SMOOTH_HINT:
7587 case GL_LINE_SMOOTH_HINT:
7588 case GL_FOG_HINT:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007589 *type = GL_INT;
7590 *numParams = 1;
7591 return true;
7592 case GL_ALPHA_TEST_REF:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007593 case GL_FOG_DENSITY:
7594 case GL_FOG_START:
7595 case GL_FOG_END:
7596 case GL_FOG_MODE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007597 case GL_POINT_SIZE:
7598 case GL_POINT_SIZE_MIN:
7599 case GL_POINT_SIZE_MAX:
7600 case GL_POINT_FADE_THRESHOLD_SIZE:
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007601 *type = GL_FLOAT;
7602 *numParams = 1;
7603 return true;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007604 case GL_SMOOTH_POINT_SIZE_RANGE:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07007605 case GL_SMOOTH_LINE_WIDTH_RANGE:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007606 *type = GL_FLOAT;
7607 *numParams = 2;
7608 return true;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007609 case GL_CURRENT_COLOR:
Lingfeng Yange547aac2018-04-05 09:39:20 -07007610 case GL_CURRENT_TEXTURE_COORDS:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007611 case GL_LIGHT_MODEL_AMBIENT:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07007612 case GL_FOG_COLOR:
Lingfeng Yanga43994c2018-03-29 07:21:41 -07007613 *type = GL_FLOAT;
7614 *numParams = 4;
7615 return true;
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007616 case GL_CURRENT_NORMAL:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07007617 case GL_POINT_DISTANCE_ATTENUATION:
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07007618 *type = GL_FLOAT;
7619 *numParams = 3;
7620 return true;
Lingfeng Yang3a41af62018-04-09 07:28:56 -07007621 case GL_MODELVIEW_MATRIX:
7622 case GL_PROJECTION_MATRIX:
7623 case GL_TEXTURE_MATRIX:
7624 *type = GL_FLOAT;
7625 *numParams = 16;
7626 return true;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07007627 case GL_LIGHT_MODEL_TWO_SIDE:
7628 *type = GL_BOOL;
7629 *numParams = 1;
7630 return true;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07007631 }
7632 }
7633
Jamie Madill5b772312018-03-08 20:28:32 -05007634 if (getClientVersion() < Version(3, 0))
7635 {
7636 return false;
7637 }
7638
7639 // Check for ES3.0+ parameter names
7640 switch (pname)
7641 {
7642 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
7643 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
7644 case GL_UNIFORM_BUFFER_BINDING:
7645 case GL_TRANSFORM_FEEDBACK_BINDING:
7646 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7647 case GL_COPY_READ_BUFFER_BINDING:
7648 case GL_COPY_WRITE_BUFFER_BINDING:
7649 case GL_SAMPLER_BINDING:
7650 case GL_READ_BUFFER:
7651 case GL_TEXTURE_BINDING_3D:
7652 case GL_TEXTURE_BINDING_2D_ARRAY:
7653 case GL_MAX_3D_TEXTURE_SIZE:
7654 case GL_MAX_ARRAY_TEXTURE_LAYERS:
7655 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
7656 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
7657 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
7658 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
7659 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
7660 case GL_MAX_VARYING_COMPONENTS:
7661 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
7662 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
7663 case GL_MIN_PROGRAM_TEXEL_OFFSET:
7664 case GL_MAX_PROGRAM_TEXEL_OFFSET:
7665 case GL_NUM_EXTENSIONS:
7666 case GL_MAJOR_VERSION:
7667 case GL_MINOR_VERSION:
7668 case GL_MAX_ELEMENTS_INDICES:
7669 case GL_MAX_ELEMENTS_VERTICES:
7670 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
7671 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
7672 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
7673 case GL_UNPACK_IMAGE_HEIGHT:
7674 case GL_UNPACK_SKIP_IMAGES:
7675 {
7676 *type = GL_INT;
7677 *numParams = 1;
7678 return true;
7679 }
7680
7681 case GL_MAX_ELEMENT_INDEX:
7682 case GL_MAX_UNIFORM_BLOCK_SIZE:
7683 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
7684 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
7685 case GL_MAX_SERVER_WAIT_TIMEOUT:
7686 {
7687 *type = GL_INT_64_ANGLEX;
7688 *numParams = 1;
7689 return true;
7690 }
7691
7692 case GL_TRANSFORM_FEEDBACK_ACTIVE:
7693 case GL_TRANSFORM_FEEDBACK_PAUSED:
7694 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
7695 case GL_RASTERIZER_DISCARD:
7696 {
7697 *type = GL_BOOL;
7698 *numParams = 1;
7699 return true;
7700 }
7701
7702 case GL_MAX_TEXTURE_LOD_BIAS:
7703 {
7704 *type = GL_FLOAT;
7705 *numParams = 1;
7706 return true;
7707 }
7708 }
7709
7710 if (getExtensions().requestExtension)
7711 {
7712 switch (pname)
7713 {
7714 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
7715 *type = GL_INT;
7716 *numParams = 1;
7717 return true;
7718 }
7719 }
7720
Yizhou Jiang7818a852018-09-06 15:02:04 +08007721 if (getExtensions().textureMultisample)
7722 {
7723 switch (pname)
7724 {
7725 case GL_MAX_COLOR_TEXTURE_SAMPLES_ANGLE:
7726 case GL_MAX_INTEGER_SAMPLES_ANGLE:
7727 case GL_MAX_DEPTH_TEXTURE_SAMPLES_ANGLE:
7728 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE:
Yizhou Jiang7310da32018-11-05 14:40:01 +08007729 case GL_MAX_SAMPLE_MASK_WORDS:
Yizhou Jiang7818a852018-09-06 15:02:04 +08007730 *type = GL_INT;
7731 *numParams = 1;
7732 return true;
7733 }
7734 }
7735
Jamie Madill5b772312018-03-08 20:28:32 -05007736 if (getClientVersion() < Version(3, 1))
7737 {
7738 return false;
7739 }
7740
7741 switch (pname)
7742 {
7743 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7744 case GL_DRAW_INDIRECT_BUFFER_BINDING:
7745 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
7746 case GL_MAX_FRAMEBUFFER_WIDTH:
7747 case GL_MAX_FRAMEBUFFER_HEIGHT:
7748 case GL_MAX_FRAMEBUFFER_SAMPLES:
7749 case GL_MAX_SAMPLE_MASK_WORDS:
7750 case GL_MAX_COLOR_TEXTURE_SAMPLES:
7751 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
7752 case GL_MAX_INTEGER_SAMPLES:
7753 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
7754 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
7755 case GL_MAX_VERTEX_ATTRIB_STRIDE:
7756 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
7757 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
7758 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
7759 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
7760 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
7761 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
7762 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
7763 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
7764 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
7765 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
7766 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
7767 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
7768 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
7769 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
7770 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
7771 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
7772 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
7773 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
7774 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
7775 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
7776 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
7777 case GL_MAX_UNIFORM_LOCATIONS:
7778 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
7779 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
7780 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
7781 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
7782 case GL_MAX_IMAGE_UNITS:
7783 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
7784 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
7785 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
7786 case GL_SHADER_STORAGE_BUFFER_BINDING:
7787 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
7788 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Olli Etuahodff32a02018-08-28 14:35:50 +03007789 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
Jamie Madill5b772312018-03-08 20:28:32 -05007790 *type = GL_INT;
7791 *numParams = 1;
7792 return true;
7793 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
7794 *type = GL_INT_64_ANGLEX;
7795 *numParams = 1;
7796 return true;
7797 case GL_SAMPLE_MASK:
7798 *type = GL_BOOL;
7799 *numParams = 1;
7800 return true;
7801 }
7802
7803 if (getExtensions().geometryShader)
7804 {
7805 switch (pname)
7806 {
7807 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
7808 case GL_LAYER_PROVOKING_VERTEX_EXT:
7809 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7810 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
7811 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
7812 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
7813 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
7814 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
7815 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
7816 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
7817 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
7818 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
7819 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
7820 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
7821 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
7822 *type = GL_INT;
7823 *numParams = 1;
7824 return true;
7825 }
7826 }
7827
7828 return false;
7829}
7830
7831bool Context::getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams)
7832{
7833 if (getClientVersion() < Version(3, 0))
7834 {
7835 return false;
7836 }
7837
7838 switch (target)
7839 {
7840 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7841 case GL_UNIFORM_BUFFER_BINDING:
7842 {
7843 *type = GL_INT;
7844 *numParams = 1;
7845 return true;
7846 }
7847 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7848 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7849 case GL_UNIFORM_BUFFER_START:
7850 case GL_UNIFORM_BUFFER_SIZE:
7851 {
7852 *type = GL_INT_64_ANGLEX;
7853 *numParams = 1;
7854 return true;
7855 }
7856 }
7857
7858 if (getClientVersion() < Version(3, 1))
7859 {
7860 return false;
7861 }
7862
7863 switch (target)
7864 {
7865 case GL_IMAGE_BINDING_LAYERED:
7866 {
7867 *type = GL_BOOL;
7868 *numParams = 1;
7869 return true;
7870 }
7871 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
7872 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
7873 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
7874 case GL_SHADER_STORAGE_BUFFER_BINDING:
7875 case GL_VERTEX_BINDING_BUFFER:
7876 case GL_VERTEX_BINDING_DIVISOR:
7877 case GL_VERTEX_BINDING_OFFSET:
7878 case GL_VERTEX_BINDING_STRIDE:
7879 case GL_SAMPLE_MASK_VALUE:
7880 case GL_IMAGE_BINDING_NAME:
7881 case GL_IMAGE_BINDING_LEVEL:
7882 case GL_IMAGE_BINDING_LAYER:
7883 case GL_IMAGE_BINDING_ACCESS:
7884 case GL_IMAGE_BINDING_FORMAT:
7885 {
7886 *type = GL_INT;
7887 *numParams = 1;
7888 return true;
7889 }
7890 case GL_ATOMIC_COUNTER_BUFFER_START:
7891 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
7892 case GL_SHADER_STORAGE_BUFFER_START:
7893 case GL_SHADER_STORAGE_BUFFER_SIZE:
7894 {
7895 *type = GL_INT_64_ANGLEX;
7896 *numParams = 1;
7897 return true;
7898 }
7899 }
7900
7901 return false;
7902}
7903
Jamie Madill44a6fbf2018-10-02 13:38:56 -04007904Program *Context::getProgramNoResolveLink(GLuint handle) const
Jamie Madill5b772312018-03-08 20:28:32 -05007905{
7906 return mState.mShaderPrograms->getProgram(handle);
7907}
7908
7909Shader *Context::getShader(GLuint handle) const
7910{
7911 return mState.mShaderPrograms->getShader(handle);
7912}
7913
Jamie Madill5b772312018-03-08 20:28:32 -05007914bool Context::isRenderbufferGenerated(GLuint renderbuffer) const
7915{
7916 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
7917}
7918
7919bool Context::isFramebufferGenerated(GLuint framebuffer) const
7920{
7921 return mState.mFramebuffers->isHandleGenerated(framebuffer);
7922}
7923
7924bool Context::isProgramPipelineGenerated(GLuint pipeline) const
7925{
7926 return mState.mPipelines->isHandleGenerated(pipeline);
7927}
7928
7929bool Context::usingDisplayTextureShareGroup() const
7930{
7931 return mDisplayTextureShareGroup;
7932}
7933
7934GLenum Context::getConvertedRenderbufferFormat(GLenum internalformat) const
7935{
7936 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
7937 internalformat == GL_DEPTH_STENCIL
7938 ? GL_DEPTH24_STENCIL8
7939 : internalformat;
7940}
7941
jchen1082af6202018-06-22 10:59:52 +08007942void Context::maxShaderCompilerThreads(GLuint count)
7943{
jchen107ae70d82018-07-06 13:47:01 +08007944 GLuint oldCount = mGLState.getMaxShaderCompilerThreads();
jchen1082af6202018-06-22 10:59:52 +08007945 mGLState.setMaxShaderCompilerThreads(count);
jchen107ae70d82018-07-06 13:47:01 +08007946 // A count of zero specifies a request for no parallel compiling or linking.
7947 if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0))
7948 {
7949 mThreadPool = angle::WorkerThreadPool::Create(count > 0);
7950 }
7951 mThreadPool->setMaxThreads(count);
jchen1082af6202018-06-22 10:59:52 +08007952}
7953
Jamie Madill2eb65032018-07-30 10:25:57 -04007954bool Context::isGLES1() const
7955{
7956 return mState.getClientVersion() < Version(2, 0);
7957}
7958
Jamie Madilla11819d2018-07-30 10:26:01 -04007959void Context::onSubjectStateChange(const Context *context,
7960 angle::SubjectIndex index,
7961 angle::SubjectMessage message)
7962{
Jamie Madilla11819d2018-07-30 10:26:01 -04007963 switch (index)
7964 {
7965 case kVertexArraySubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007966 switch (message)
7967 {
7968 case angle::SubjectMessage::CONTENTS_CHANGED:
7969 mGLState.setObjectDirty(GL_VERTEX_ARRAY);
7970 mStateCache.onVertexArrayBufferContentsChange(this);
7971 break;
7972 case angle::SubjectMessage::RESOURCE_MAPPED:
7973 case angle::SubjectMessage::RESOURCE_UNMAPPED:
7974 case angle::SubjectMessage::BINDING_CHANGED:
7975 mStateCache.onVertexArrayBufferStateChange(this);
7976 break;
7977 default:
7978 break;
7979 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007980 break;
7981
7982 case kReadFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007983 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7984 {
7985 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
7986 }
Jamie Madilla11819d2018-07-30 10:26:01 -04007987 break;
7988
7989 case kDrawFramebufferSubjectIndex:
Jamie Madilld84b6732018-09-06 15:54:35 -04007990 if (message == angle::SubjectMessage::STORAGE_CHANGED)
7991 {
Jamie Madillef9fcd92018-11-28 14:03:59 -05007992 mGLState.setDrawFramebufferDirty();
Jamie Madilld84b6732018-09-06 15:54:35 -04007993 }
7994 mStateCache.onDrawFramebufferChange(this);
Jamie Madilla11819d2018-07-30 10:26:01 -04007995 break;
7996
7997 default:
Jamie Madill6d32cef2018-08-14 02:34:28 -04007998 if (index < kTextureMaxSubjectIndex)
7999 {
Jamie Madille3e680c2018-12-03 17:49:08 -05008000 mGLState.onActiveTextureStateChange(this, index);
Jamie Madilld84b6732018-09-06 15:54:35 -04008001 mStateCache.onActiveTextureChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008002 }
Jamie Madille25b8002018-09-20 13:39:49 -04008003 else if (index < kUniformBufferMaxSubjectIndex)
Jamie Madill6d32cef2018-08-14 02:34:28 -04008004 {
Jamie Madill6d32cef2018-08-14 02:34:28 -04008005 mGLState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
Jamie Madilld84b6732018-09-06 15:54:35 -04008006 mStateCache.onUniformBufferStateChange(this);
Jamie Madill6d32cef2018-08-14 02:34:28 -04008007 }
Jamie Madille25b8002018-09-20 13:39:49 -04008008 else
8009 {
8010 ASSERT(index < kSamplerMaxSubjectIndex);
8011 mGLState.setSamplerDirty(index - kSampler0SubjectIndex);
8012 }
Jamie Madilla11819d2018-07-30 10:26:01 -04008013 break;
8014 }
8015}
8016
Jamie Madill6b873dd2018-07-12 23:56:30 -04008017// ErrorSet implementation.
Jamie Madillb980c562018-11-27 11:34:27 -05008018ErrorSet::ErrorSet(Context *context) : mContext(context) {}
Jamie Madill6b873dd2018-07-12 23:56:30 -04008019
8020ErrorSet::~ErrorSet() = default;
8021
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008022void ErrorSet::handleError(GLenum errorCode,
8023 const char *message,
8024 const char *file,
8025 const char *function,
8026 unsigned int line)
8027{
Jamie Madill4f6592f2018-11-27 16:37:45 -05008028 if (errorCode == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
8029 {
8030 mContext->markContextLost();
8031 }
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008032
Jamie Madill4f6592f2018-11-27 16:37:45 -05008033 std::stringstream errorStream;
8034 errorStream << "Error: " << gl::FmtHex(errorCode) << ", in " << file << ", " << function << ":"
8035 << line << ". " << message;
8036
Geoff Lang7139b432018-12-14 16:57:28 -05008037 std::string formattedMessage = errorStream.str();
8038
8039 // Always log a warning, this function is only called on unexpected internal errors.
8040 WARN() << formattedMessage;
8041
Jamie Madill4f6592f2018-11-27 16:37:45 -05008042 // validationError does the necessary work to process the error.
Geoff Lang7139b432018-12-14 16:57:28 -05008043 validationError(errorCode, formattedMessage.c_str());
Jamie Madillabfbc0f2018-10-09 12:48:52 -04008044}
8045
Jamie Madilla139f012018-10-10 16:13:03 -04008046void ErrorSet::validationError(GLenum errorCode, const char *message)
8047{
Jamie Madill4f6592f2018-11-27 16:37:45 -05008048 ASSERT(errorCode != GL_NO_ERROR);
8049 mErrors.insert(errorCode);
8050
8051 mContext->getGLState().getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR,
8052 errorCode, GL_DEBUG_SEVERITY_HIGH, message);
Jamie Madilla139f012018-10-10 16:13:03 -04008053}
8054
Jamie Madill6b873dd2018-07-12 23:56:30 -04008055bool ErrorSet::empty() const
8056{
8057 return mErrors.empty();
8058}
8059
8060GLenum ErrorSet::popError()
8061{
8062 ASSERT(!empty());
8063 GLenum error = *mErrors.begin();
8064 mErrors.erase(mErrors.begin());
8065 return error;
8066}
Jamie Madilldc358af2018-07-31 11:22:13 -04008067
8068// StateCache implementation.
Jamie Madillac66f982018-10-09 18:30:01 -04008069StateCache::StateCache()
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008070 : mCachedHasAnyEnabledClientAttrib(false),
8071 mCachedNonInstancedVertexElementLimit(0),
Jamie Madilld84b6732018-09-06 15:54:35 -04008072 mCachedInstancedVertexElementLimit(0),
Jamie Madill1e853262018-12-21 09:07:38 -05008073 mCachedBasicDrawStatesError(kInvalidPointer),
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008074 mCachedBasicDrawElementsError(kInvalidPointer),
8075 mCachedTransformFeedbackActiveUnpaused(false)
Jamie Madillb980c562018-11-27 11:34:27 -05008076{}
Jamie Madilldc358af2018-07-31 11:22:13 -04008077
8078StateCache::~StateCache() = default;
8079
Jamie Madillac66f982018-10-09 18:30:01 -04008080void StateCache::initialize(Context *context)
8081{
8082 updateValidDrawModes(context);
8083 updateValidBindTextureTypes(context);
Jamie Madill8dc27f92018-11-29 11:45:44 -05008084 updateValidDrawElementsTypes(context);
Jamie Madill1e853262018-12-21 09:07:38 -05008085 updateBasicDrawStatesError();
8086 updateBasicDrawElementsError();
Jamie Madillac66f982018-10-09 18:30:01 -04008087}
8088
Jamie Madilldc358af2018-07-31 11:22:13 -04008089void StateCache::updateActiveAttribsMask(Context *context)
8090{
8091 bool isGLES1 = context->isGLES1();
8092 const State &glState = context->getGLState();
8093
8094 if (!isGLES1 && !glState.getProgram())
8095 {
8096 mCachedActiveBufferedAttribsMask = AttributesMask();
8097 mCachedActiveClientAttribsMask = AttributesMask();
Jamie Madill86792f42018-08-30 16:18:34 -04008098 mCachedActiveDefaultAttribsMask = AttributesMask();
Jamie Madilldc358af2018-07-31 11:22:13 -04008099 return;
8100 }
8101
8102 AttributesMask activeAttribs = isGLES1 ? glState.gles1().getVertexArraysAttributeMask()
8103 : glState.getProgram()->getActiveAttribLocationsMask();
8104
8105 const VertexArray *vao = glState.getVertexArray();
8106 ASSERT(vao);
8107
8108 const AttributesMask &clientAttribs = vao->getClientAttribsMask();
8109 const AttributesMask &enabledAttribs = vao->getEnabledAttributesMask();
Jamie Madill0a17e482018-08-31 17:19:11 -04008110 const AttributesMask &activeEnabled = activeAttribs & enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008111
Jamie Madill0a17e482018-08-31 17:19:11 -04008112 mCachedActiveClientAttribsMask = activeEnabled & clientAttribs;
8113 mCachedActiveBufferedAttribsMask = activeEnabled & ~clientAttribs;
Jamie Madill86792f42018-08-30 16:18:34 -04008114 mCachedActiveDefaultAttribsMask = activeAttribs & ~enabledAttribs;
Jamie Madilldc358af2018-07-31 11:22:13 -04008115 mCachedHasAnyEnabledClientAttrib = (clientAttribs & enabledAttribs).any();
8116}
Jamie Madilla2d1d2d2018-08-01 11:34:46 -04008117
8118void StateCache::updateVertexElementLimits(Context *context)
8119{
8120 const VertexArray *vao = context->getGLState().getVertexArray();
8121
8122 mCachedNonInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8123 mCachedInstancedVertexElementLimit = std::numeric_limits<GLint64>::max();
8124
8125 // VAO can be null on Context startup. If we make this computation lazier we could ASSERT.
8126 // If there are no buffered attributes then we should not limit the draw call count.
8127 if (!vao || !mCachedActiveBufferedAttribsMask.any())
8128 {
8129 return;
8130 }
8131
8132 const auto &vertexAttribs = vao->getVertexAttributes();
8133 const auto &vertexBindings = vao->getVertexBindings();
8134
8135 for (size_t attributeIndex : mCachedActiveBufferedAttribsMask)
8136 {
8137 const VertexAttribute &attrib = vertexAttribs[attributeIndex];
8138 ASSERT(attrib.enabled);
8139
8140 const VertexBinding &binding = vertexBindings[attrib.bindingIndex];
8141 ASSERT(context->isGLES1() ||
8142 context->getGLState().getProgram()->isAttribLocationActive(attributeIndex));
8143
8144 GLint64 limit = attrib.getCachedElementLimit();
8145 if (binding.getDivisor() > 0)
8146 {
8147 mCachedInstancedVertexElementLimit =
8148 std::min(mCachedInstancedVertexElementLimit, limit);
8149 }
8150 else
8151 {
8152 mCachedNonInstancedVertexElementLimit =
8153 std::min(mCachedNonInstancedVertexElementLimit, limit);
8154 }
8155 }
8156}
Jamie Madillc43cdad2018-08-08 15:49:25 -04008157
Jamie Madilld84b6732018-09-06 15:54:35 -04008158void StateCache::updateBasicDrawStatesError()
8159{
8160 mCachedBasicDrawStatesError = kInvalidPointer;
8161}
8162
Jamie Madill1e853262018-12-21 09:07:38 -05008163void StateCache::updateBasicDrawElementsError()
8164{
8165 mCachedBasicDrawElementsError = kInvalidPointer;
8166}
8167
Jamie Madilld84b6732018-09-06 15:54:35 -04008168intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
8169{
8170 ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
8171 mCachedBasicDrawStatesError = reinterpret_cast<intptr_t>(ValidateDrawStates(context));
8172 return mCachedBasicDrawStatesError;
8173}
8174
Jamie Madill1e853262018-12-21 09:07:38 -05008175intptr_t StateCache::getBasicDrawElementsErrorImpl(Context *context) const
8176{
8177 ASSERT(mCachedBasicDrawElementsError == kInvalidPointer);
8178 mCachedBasicDrawElementsError = reinterpret_cast<intptr_t>(ValidateDrawElementsStates(context));
8179 return mCachedBasicDrawElementsError;
8180}
8181
Jamie Madillc43cdad2018-08-08 15:49:25 -04008182void StateCache::onVertexArrayBindingChange(Context *context)
8183{
8184 updateActiveAttribsMask(context);
8185 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008186 updateBasicDrawStatesError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008187}
8188
8189void StateCache::onProgramExecutableChange(Context *context)
8190{
8191 updateActiveAttribsMask(context);
8192 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008193 updateBasicDrawStatesError();
Jamie Madill526a6f62018-09-12 11:03:05 -04008194 updateValidDrawModes(context);
Jamie Madillc43cdad2018-08-08 15:49:25 -04008195}
8196
Jamie Madilld84b6732018-09-06 15:54:35 -04008197void StateCache::onVertexArrayFormatChange(Context *context)
Jamie Madillc43cdad2018-08-08 15:49:25 -04008198{
8199 updateVertexElementLimits(context);
8200}
8201
Jamie Madilld84b6732018-09-06 15:54:35 -04008202void StateCache::onVertexArrayBufferContentsChange(Context *context)
8203{
8204 updateVertexElementLimits(context);
8205 updateBasicDrawStatesError();
8206}
8207
Jamie Madillc43cdad2018-08-08 15:49:25 -04008208void StateCache::onVertexArrayStateChange(Context *context)
8209{
8210 updateActiveAttribsMask(context);
8211 updateVertexElementLimits(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008212 updateBasicDrawStatesError();
8213}
8214
8215void StateCache::onVertexArrayBufferStateChange(Context *context)
8216{
8217 updateBasicDrawStatesError();
Jamie Madill1e853262018-12-21 09:07:38 -05008218 updateBasicDrawElementsError();
Jamie Madillc43cdad2018-08-08 15:49:25 -04008219}
8220
8221void StateCache::onGLES1ClientStateChange(Context *context)
8222{
8223 updateActiveAttribsMask(context);
8224}
Jamie Madilld84b6732018-09-06 15:54:35 -04008225
8226void StateCache::onDrawFramebufferChange(Context *context)
8227{
8228 updateBasicDrawStatesError();
8229}
8230
8231void StateCache::onContextCapChange(Context *context)
8232{
8233 updateBasicDrawStatesError();
8234}
8235
8236void StateCache::onStencilStateChange(Context *context)
8237{
8238 updateBasicDrawStatesError();
8239}
8240
8241void StateCache::onDefaultVertexAttributeChange(Context *context)
8242{
8243 updateBasicDrawStatesError();
8244}
8245
8246void StateCache::onActiveTextureChange(Context *context)
8247{
8248 updateBasicDrawStatesError();
8249}
8250
8251void StateCache::onQueryChange(Context *context)
8252{
8253 updateBasicDrawStatesError();
8254}
8255
Jamie Madill3a256222018-12-08 09:56:39 -05008256void StateCache::onActiveTransformFeedbackChange(Context *context)
Jamie Madilld84b6732018-09-06 15:54:35 -04008257{
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008258 updateTransformFeedbackActiveUnpaused(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008259 updateBasicDrawStatesError();
Jamie Madill1e853262018-12-21 09:07:38 -05008260 updateBasicDrawElementsError();
Jamie Madill9b025062018-12-12 15:44:12 -05008261 updateValidDrawModes(context);
Jamie Madilld84b6732018-09-06 15:54:35 -04008262}
8263
8264void StateCache::onUniformBufferStateChange(Context *context)
8265{
8266 updateBasicDrawStatesError();
8267}
8268
Jamie Madill9b025062018-12-12 15:44:12 -05008269void StateCache::setValidDrawModes(bool pointsOK,
8270 bool linesOK,
8271 bool trisOK,
8272 bool lineAdjOK,
8273 bool triAdjOK)
8274{
8275 mCachedValidDrawModes[PrimitiveMode::Points] = pointsOK;
8276 mCachedValidDrawModes[PrimitiveMode::Lines] = linesOK;
8277 mCachedValidDrawModes[PrimitiveMode::LineStrip] = linesOK;
8278 mCachedValidDrawModes[PrimitiveMode::LineLoop] = linesOK;
8279 mCachedValidDrawModes[PrimitiveMode::Triangles] = trisOK;
8280 mCachedValidDrawModes[PrimitiveMode::TriangleFan] = trisOK;
8281 mCachedValidDrawModes[PrimitiveMode::TriangleStrip] = trisOK;
8282 mCachedValidDrawModes[PrimitiveMode::LinesAdjacency] = lineAdjOK;
8283 mCachedValidDrawModes[PrimitiveMode::LineStripAdjacency] = lineAdjOK;
8284 mCachedValidDrawModes[PrimitiveMode::TrianglesAdjacency] = triAdjOK;
8285 mCachedValidDrawModes[PrimitiveMode::TriangleStripAdjacency] = triAdjOK;
8286}
8287
Jamie Madill526a6f62018-09-12 11:03:05 -04008288void StateCache::updateValidDrawModes(Context *context)
8289{
Jamie Madill9b025062018-12-12 15:44:12 -05008290 const State &state = context->getGLState();
8291 Program *program = state.getProgram();
8292
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008293 if (mCachedTransformFeedbackActiveUnpaused)
Jamie Madill9b025062018-12-12 15:44:12 -05008294 {
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008295 TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
8296
Jamie Madill9b025062018-12-12 15:44:12 -05008297 // ES Spec 3.0 validation text:
8298 // When transform feedback is active and not paused, all geometric primitives generated must
8299 // match the value of primitiveMode passed to BeginTransformFeedback. The error
8300 // INVALID_OPERATION is generated by DrawArrays and DrawArraysInstanced if mode is not
8301 // identical to primitiveMode. The error INVALID_OPERATION is also generated by
8302 // DrawElements, DrawElementsInstanced, and DrawRangeElements while transform feedback is
8303 // active and not paused, regardless of mode. Any primitive type may be used while transform
8304 // feedback is paused.
8305 if (!context->getExtensions().geometryShader)
8306 {
8307 mCachedValidDrawModes.fill(false);
8308 mCachedValidDrawModes[curTransformFeedback->getPrimitiveMode()] = true;
8309 return;
8310 }
8311
8312 // EXT_geometry_shader validation text:
8313 // When transform feedback is active and not paused, all geometric primitives generated must
8314 // be compatible with the value of <primitiveMode> passed to BeginTransformFeedback. If a
8315 // geometry shader is active, the type of primitive emitted by that shader is used instead
8316 // of the <mode> parameter passed to drawing commands for the purposes of this error check.
8317 // Any primitive type may be used while transform feedback is paused.
8318 bool pointsOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Points;
8319 bool linesOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Lines;
8320 bool trisOK = curTransformFeedback->getPrimitiveMode() == PrimitiveMode::Triangles;
8321
8322 setValidDrawModes(pointsOK, linesOK, trisOK, false, false);
8323 return;
8324 }
8325
Jamie Madill526a6f62018-09-12 11:03:05 -04008326 if (!program || !program->hasLinkedShaderStage(ShaderType::Geometry))
8327 {
Jamie Madill752d2202018-11-27 13:29:48 -05008328 mCachedValidDrawModes = kValidBasicDrawModes;
Jamie Madill9b025062018-12-12 15:44:12 -05008329 return;
Jamie Madill526a6f62018-09-12 11:03:05 -04008330 }
Jamie Madill526a6f62018-09-12 11:03:05 -04008331
Jamie Madill9b025062018-12-12 15:44:12 -05008332 ASSERT(program && program->hasLinkedShaderStage(ShaderType::Geometry));
8333 PrimitiveMode gsMode = program->getGeometryShaderInputPrimitiveType();
Jamie Madill526a6f62018-09-12 11:03:05 -04008334
Jamie Madill9b025062018-12-12 15:44:12 -05008335 bool pointsOK = gsMode == PrimitiveMode::Points;
8336 bool linesOK = gsMode == PrimitiveMode::Lines;
8337 bool trisOK = gsMode == PrimitiveMode::Triangles;
8338 bool lineAdjOK = gsMode == PrimitiveMode::LinesAdjacency;
8339 bool triAdjOK = gsMode == PrimitiveMode::TrianglesAdjacency;
8340
8341 setValidDrawModes(pointsOK, linesOK, trisOK, lineAdjOK, triAdjOK);
Jamie Madill526a6f62018-09-12 11:03:05 -04008342}
Jamie Madillac66f982018-10-09 18:30:01 -04008343
8344void StateCache::updateValidBindTextureTypes(Context *context)
8345{
8346 const Extensions &exts = context->getExtensions();
8347 bool isGLES3 = context->getClientMajorVersion() >= 3;
8348 bool isGLES31 = context->getClientVersion() >= Version(3, 1);
8349
8350 mCachedValidBindTextureTypes = {{
Jamie Madill752d2202018-11-27 13:29:48 -05008351 {TextureType::_2D, true},
8352 {TextureType::_2DArray, isGLES3},
8353 {TextureType::_2DMultisample, isGLES31 || exts.textureMultisample},
8354 {TextureType::_2DMultisampleArray, exts.textureStorageMultisample2DArray},
8355 {TextureType::_3D, isGLES3},
8356 {TextureType::External, exts.eglImageExternal || exts.eglStreamConsumerExternal},
8357 {TextureType::Rectangle, exts.textureRectangle},
8358 {TextureType::CubeMap, true},
Jamie Madillac66f982018-10-09 18:30:01 -04008359 }};
8360}
Jamie Madill8dc27f92018-11-29 11:45:44 -05008361
8362void StateCache::updateValidDrawElementsTypes(Context *context)
8363{
8364 bool supportsUint =
8365 (context->getClientMajorVersion() >= 3 || context->getExtensions().elementIndexUint);
8366
8367 mCachedValidDrawElementsTypes = {{
8368 {DrawElementsType::UnsignedByte, true},
8369 {DrawElementsType::UnsignedShort, true},
8370 {DrawElementsType::UnsignedInt, supportsUint},
8371 }};
8372}
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008373
8374void StateCache::updateTransformFeedbackActiveUnpaused(Context *context)
8375{
Markus Tavenrathcb9609f2018-12-26 00:52:44 +09008376 TransformFeedback *xfb = context->getGLState().getCurrentTransformFeedback();
Jamie Madillae6ba9f2018-12-21 23:00:04 -05008377 mCachedTransformFeedbackActiveUnpaused = xfb && xfb->isActive() && !xfb->isPaused();
8378}
Jamie Madillc29968b2016-01-20 11:17:23 -05008379} // namespace gl