blob: b22dabe524435ed422bd691539dab110916eb12b [file] [log] [blame]
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001//
Geoff Langeeba6e12014-02-03 13:12:30 -05002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.cpp: Implements the gl::Context class, managing all GL state and performing
8// rendering operations. It is the GLES2 specific implementation of EGLContext.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/Context.h"
apatrick@chromium.org144f2802012-07-12 01:42:34 +000011
Jamie Madill231c7f52017-04-26 13:45:37 -040012#include <string.h>
Jamie Madillb9293972015-02-19 11:07:54 -050013#include <iterator>
14#include <sstream>
Sami Väisänend59ca052016-06-21 16:10:00 +030015#include <vector>
Jamie Madillb9293972015-02-19 11:07:54 -050016
Sami Väisänene45e53b2016-05-25 10:36:04 +030017#include "common/matrix_utils.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040018#include "common/platform.h"
Jamie Madillb9293972015-02-19 11:07:54 -050019#include "common/utilities.h"
Geoff Langc339c4e2016-11-29 10:37:36 -050020#include "common/version.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050021#include "libANGLE/Buffer.h"
Jamie Madillb9293972015-02-19 11:07:54 -050022#include "libANGLE/Compiler.h"
Jamie Madill948bbe52017-06-01 13:10:42 -040023#include "libANGLE/Display.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050024#include "libANGLE/Fence.h"
25#include "libANGLE/Framebuffer.h"
26#include "libANGLE/FramebufferAttachment.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030027#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050028#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080029#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050030#include "libANGLE/Query.h"
Jamie Madillb9293972015-02-19 11:07:54 -050031#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050032#include "libANGLE/ResourceManager.h"
33#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050034#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050035#include "libANGLE/Texture.h"
36#include "libANGLE/TransformFeedback.h"
37#include "libANGLE/VertexArray.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070038#include "libANGLE/Workarounds.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040039#include "libANGLE/formatutils.h"
Martin Radev66fb8202016-07-28 11:45:20 +030040#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040041#include "libANGLE/queryutils.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040042#include "libANGLE/renderer/ContextImpl.h"
43#include "libANGLE/renderer/EGLImplFactory.h"
Jamie Madill7b62cf92017-11-02 15:20:49 -040044#include "libANGLE/renderer/Format.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040045#include "libANGLE/validationES.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000046
Geoff Langf6db0982015-08-25 13:04:00 -040047namespace
48{
49
Jamie Madillb6664922017-07-25 12:55:04 -040050#define ANGLE_HANDLE_ERR(X) \
51 handleError(X); \
52 return;
53#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
54
Ian Ewell3ffd78b2016-01-22 16:09:42 -050055template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050056std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030057 GLsizei numPaths,
58 const void *paths,
59 GLuint pathBase)
60{
61 std::vector<gl::Path *> ret;
62 ret.reserve(numPaths);
63
64 const auto *nameArray = static_cast<const T *>(paths);
65
66 for (GLsizei i = 0; i < numPaths; ++i)
67 {
68 const GLuint pathName = nameArray[i] + pathBase;
69
70 ret.push_back(resourceManager.getPath(pathName));
71 }
72
73 return ret;
74}
75
Geoff Lang4ddf5af2016-12-01 14:30:44 -050076std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030077 GLsizei numPaths,
78 GLenum pathNameType,
79 const void *paths,
80 GLuint pathBase)
81{
82 switch (pathNameType)
83 {
84 case GL_UNSIGNED_BYTE:
85 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
86
87 case GL_BYTE:
88 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
89
90 case GL_UNSIGNED_SHORT:
91 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
92
93 case GL_SHORT:
94 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
95
96 case GL_UNSIGNED_INT:
97 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
98
99 case GL_INT:
100 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
101 }
102
103 UNREACHABLE();
104 return std::vector<gl::Path *>();
105}
106
107template <typename T>
Geoff Lang2186c382016-10-14 10:54:54 -0400108gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500109{
Geoff Lang2186c382016-10-14 10:54:54 -0400110 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500111
112 switch (pname)
113 {
114 case GL_QUERY_RESULT_EXT:
Geoff Lang2186c382016-10-14 10:54:54 -0400115 return query->getResult(params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500116 case GL_QUERY_RESULT_AVAILABLE_EXT:
117 {
118 bool available;
Geoff Lang2186c382016-10-14 10:54:54 -0400119 gl::Error error = query->isResultAvailable(&available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500120 if (!error.isError())
121 {
jchen10a99ed552017-09-22 08:10:32 +0800122 *params = gl::CastFromStateValue<T>(pname, static_cast<GLuint>(available));
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500123 }
124 return error;
125 }
126 default:
127 UNREACHABLE();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500128 return gl::InternalError() << "Unreachable Error";
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500129 }
130}
131
Geoff Langf6db0982015-08-25 13:04:00 -0400132void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
133{
Geoff Lang1a683462015-09-29 15:09:59 -0400134 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400135 {
136 for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
137 tfBufferIndex++)
138 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400139 const gl::OffsetBindingPointer<gl::Buffer> &buffer =
Geoff Langf6db0982015-08-25 13:04:00 -0400140 transformFeedback->getIndexedBuffer(tfBufferIndex);
141 if (buffer.get() != nullptr)
142 {
143 buffer->onTransformFeedback();
144 }
145 }
146 }
147}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500148
149// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300150EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500151{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400152 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500153}
154
Martin Radev1be913c2016-07-11 17:59:16 +0300155EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
156{
157 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
158}
159
Geoff Langeb66a6e2016-10-31 13:06:12 -0400160gl::Version GetClientVersion(const egl::AttributeMap &attribs)
161{
162 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
163}
164
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500165GLenum GetResetStrategy(const egl::AttributeMap &attribs)
166{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400167 EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
Jeff Gilbertc5de4d22017-10-31 15:07:53 -0700168 EGL_NO_RESET_NOTIFICATION);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500169 switch (attrib)
170 {
171 case EGL_NO_RESET_NOTIFICATION:
172 return GL_NO_RESET_NOTIFICATION_EXT;
173 case EGL_LOSE_CONTEXT_ON_RESET:
174 return GL_LOSE_CONTEXT_ON_RESET_EXT;
175 default:
176 UNREACHABLE();
177 return GL_NONE;
178 }
179}
180
181bool GetRobustAccess(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
185 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500186}
187
188bool GetDebug(const egl::AttributeMap &attribs)
189{
Geoff Lang077f20a2016-11-01 10:08:02 -0400190 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
191 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500192}
193
194bool GetNoError(const egl::AttributeMap &attribs)
195{
196 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
197}
198
Geoff Langc287ea62016-09-16 14:46:51 -0400199bool GetWebGLContext(const egl::AttributeMap &attribs)
200{
201 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
202}
203
Geoff Langf41a7152016-09-19 15:11:17 -0400204bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
205{
206 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
207}
208
Geoff Langfeb8c682017-02-13 16:07:35 -0500209bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
210{
211 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
212}
213
Geoff Langb433e872017-10-05 14:01:47 -0400214bool GetRobustResourceInit(const egl::AttributeMap &attribs)
215{
216 return (attribs.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
217}
218
Martin Radev9d901792016-07-15 15:58:58 +0300219std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
220{
221 std::string labelName;
222 if (label != nullptr)
223 {
224 size_t labelLength = length < 0 ? strlen(label) : length;
225 labelName = std::string(label, labelLength);
226 }
227 return labelName;
228}
229
230void GetObjectLabelBase(const std::string &objectLabel,
231 GLsizei bufSize,
232 GLsizei *length,
233 GLchar *label)
234{
235 size_t writeLength = objectLabel.length();
236 if (label != nullptr && bufSize > 0)
237 {
238 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
239 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
240 label[writeLength] = '\0';
241 }
242
243 if (length != nullptr)
244 {
245 *length = static_cast<GLsizei>(writeLength);
246 }
247}
248
Jamie Madill0f80ed82017-09-19 00:24:56 -0400249template <typename CapT, typename MaxT>
250void LimitCap(CapT *cap, MaxT maximum)
251{
252 *cap = std::min(*cap, static_cast<CapT>(maximum));
253}
254
Geoff Langf6db0982015-08-25 13:04:00 -0400255} // anonymous namespace
256
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000257namespace gl
258{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000259
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400260Context::Context(rx::EGLImplFactory *implFactory,
261 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400262 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500263 TextureManager *shareTextures,
Jamie Madill32447362017-06-28 14:53:52 -0400264 MemoryProgramCache *memoryProgramCache,
Corentin Wallezc295e512017-01-27 17:47:50 -0500265 const egl::AttributeMap &attribs,
Geoff Langb433e872017-10-05 14:01:47 -0400266 const egl::DisplayExtensions &displayExtensions)
Martin Radev1be913c2016-07-11 17:59:16 +0300267
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500268 : ValidationContext(shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500269 shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500270 GetClientVersion(attribs),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700271 &mGLState,
Jamie Madillf25855c2015-11-03 11:06:18 -0500272 mCaps,
273 mTextureCaps,
274 mExtensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500275 mLimitations,
276 GetNoError(attribs)),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700277 mImplementation(implFactory->createContext(mState)),
Jamie Madill2f348d22017-06-05 10:50:59 -0400278 mCompiler(),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400279 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500280 mClientType(EGL_OPENGL_ES_API),
281 mHasBeenCurrent(false),
282 mContextLost(false),
283 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700284 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500285 mResetStrategy(GetResetStrategy(attribs)),
286 mRobustAccess(GetRobustAccess(attribs)),
Jamie Madill61e16b42017-06-19 11:13:23 -0400287 mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
288 mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500289 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500290 mWebGLContext(GetWebGLContext(attribs)),
Jamie Madill32447362017-06-28 14:53:52 -0400291 mMemoryProgramCache(memoryProgramCache),
Jamie Madillb3f26b92017-07-19 15:07:41 -0400292 mScratchBuffer(1000u),
293 mZeroFilledBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000294{
Jamie Madill14bbb3f2017-09-12 15:23:01 -0400295 mImplementation->setMemoryProgramCache(memoryProgramCache);
296
Geoff Langb433e872017-10-05 14:01:47 -0400297 bool robustResourceInit = GetRobustResourceInit(attribs);
298 initCaps(displayExtensions, robustResourceInit);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700299 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400300
Jamie Madill4928b7c2017-06-20 12:57:39 -0400301 mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
Jamie Madillc43be722017-07-13 16:22:14 -0400302 GetClientArraysEnabled(attribs), robustResourceInit,
303 mMemoryProgramCache != nullptr);
Régis Fénéon83107972015-02-05 12:57:44 +0100304
Shannon Woods53a94a82014-06-24 15:20:36 -0400305 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400306
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000307 // [OpenGL ES 2.0.24] section 3.7 page 83:
Corentin Wallez336129f2017-10-17 15:55:40 -0400308 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have two-dimensional
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000309 // and cube map texture state vectors respectively associated with them.
310 // In order that access to these initial textures not be lost, they are treated as texture
311 // objects all of whose names are 0.
312
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400313 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400314 mZeroTextures[GL_TEXTURE_2D].set(this, zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500315
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400316 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400317 mZeroTextures[GL_TEXTURE_CUBE_MAP].set(this, zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400318
Geoff Langeb66a6e2016-10-31 13:06:12 -0400319 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400320 {
321 // TODO: These could also be enabled via extension
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400322 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400323 mZeroTextures[GL_TEXTURE_3D].set(this, zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400324
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400325 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400326 mZeroTextures[GL_TEXTURE_2D_ARRAY].set(this, zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400327 }
Geoff Lang3b573612016-10-31 14:08:10 -0400328 if (getClientVersion() >= Version(3, 1))
329 {
330 Texture *zeroTexture2DMultisample =
331 new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_MULTISAMPLE);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400332 mZeroTextures[GL_TEXTURE_2D_MULTISAMPLE].set(this, zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800333
Jiajia Qin6eafb042016-12-27 17:04:07 +0800334 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
335 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400336 bindBufferRange(BufferBinding::AtomicCounter, 0, i, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800337 }
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800338
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800339 for (unsigned int i = 0; i < mCaps.maxShaderStorageBufferBindings; i++)
340 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400341 bindBufferRange(BufferBinding::ShaderStorage, i, 0, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800342 }
Geoff Lang3b573612016-10-31 14:08:10 -0400343 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000344
Geoff Lang4751aab2017-10-30 15:14:52 -0400345 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
346 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400347 {
348 Texture *zeroTextureRectangle =
349 new Texture(mImplementation.get(), 0, GL_TEXTURE_RECTANGLE_ANGLE);
350 mZeroTextures[GL_TEXTURE_RECTANGLE_ANGLE].set(this, zeroTextureRectangle);
351 }
352
Geoff Lang4751aab2017-10-30 15:14:52 -0400353 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400354 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400355 Texture *zeroTextureExternal =
356 new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400357 mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(this, zeroTextureExternal);
Ian Ewellbda75592016-04-18 17:25:54 -0400358 }
359
Jamie Madill4928b7c2017-06-20 12:57:39 -0400360 mGLState.initializeZeroTextures(this, mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500361
Jamie Madill57a89722013-07-02 11:57:03 -0400362 bindVertexArray(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000363
Geoff Langeb66a6e2016-10-31 13:06:12 -0400364 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400365 {
366 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
367 // In the initial state, a default transform feedback object is bound and treated as
368 // a transform feedback object with a name of zero. That object is bound any time
369 // BindTransformFeedback is called with id of zero
Jamie Madillf0dcb8b2017-08-26 19:05:13 -0400370 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Geoff Lang1a683462015-09-29 15:09:59 -0400371 }
Geoff Langc8058452014-02-03 12:04:11 -0500372
Corentin Wallez336129f2017-10-17 15:55:40 -0400373 for (auto type : angle::AllEnums<BufferBinding>())
374 {
375 bindBuffer(type, 0);
376 }
377
378 bindRenderbuffer(GL_RENDERBUFFER, 0);
379
380 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
381 {
382 bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
383 }
384
Jamie Madillad9f24e2016-02-12 09:27:24 -0500385 // Initialize dirty bit masks
Jamie Madillc67323a2017-11-02 23:11:41 -0400386 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500387 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500388 // No dirty objects.
389
390 // Readpixels uses the pack state and read FBO
Jamie Madillc67323a2017-11-02 23:11:41 -0400391 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_STATE);
Corentin Wallez29a20992017-11-06 18:23:16 -0500392 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500393 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
394
395 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
396 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
397 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
398 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
399 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
400 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
401 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
402 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
403 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
404 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
405 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
406 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
407
408 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
409 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700410 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500411 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
412 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400413
Xinghua Cao10a4d432017-11-28 14:46:26 +0800414 // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
415 mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
416 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
417 mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
418 mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
419 mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
Qin Jiajia62fcf622017-11-30 16:16:12 +0800420 mComputeDirtyBits.set(State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
Xinghua Cao10a4d432017-11-28 14:46:26 +0800421
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400422 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000423}
424
Jamie Madill4928b7c2017-06-20 12:57:39 -0400425egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000426{
Corentin Wallez80b24112015-08-25 16:41:57 -0400427 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000428 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400429 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000430 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400431 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000432
Corentin Wallez80b24112015-08-25 16:41:57 -0400433 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000434 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400435 if (query.second != nullptr)
436 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400437 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400438 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000439 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400440 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441
Corentin Wallez80b24112015-08-25 16:41:57 -0400442 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400443 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400444 if (vertexArray.second)
445 {
446 vertexArray.second->onDestroy(this);
447 }
Jamie Madill57a89722013-07-02 11:57:03 -0400448 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400449 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400450
Corentin Wallez80b24112015-08-25 16:41:57 -0400451 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500452 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500453 if (transformFeedback.second != nullptr)
454 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500455 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500456 }
Geoff Langc8058452014-02-03 12:04:11 -0500457 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400458 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500459
Jamie Madilldedd7b92014-11-05 16:30:36 -0500460 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400461 {
Jamie Madill71c88b32017-09-14 22:20:29 -0400462 ANGLE_TRY(zeroTexture.second->onDestroy(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400463 zeroTexture.second.set(this, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400464 }
465 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000466
Corentin Wallezccab69d2017-01-27 16:57:15 -0500467 SafeDelete(mSurfacelessFramebuffer);
468
Jamie Madill4928b7c2017-06-20 12:57:39 -0400469 ANGLE_TRY(releaseSurface(display));
Jamie Madill2f348d22017-06-05 10:50:59 -0400470 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500471
Jamie Madill4928b7c2017-06-20 12:57:39 -0400472 mGLState.reset(this);
473
Jamie Madill6c1f6712017-02-14 19:08:04 -0500474 mState.mBuffers->release(this);
475 mState.mShaderPrograms->release(this);
476 mState.mTextures->release(this);
477 mState.mRenderbuffers->release(this);
478 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400479 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500480 mState.mPaths->release(this);
481 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800482 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400483
Jamie Madill76e471e2017-10-21 09:56:01 -0400484 mImplementation->onDestroy(this);
485
Jamie Madill4928b7c2017-06-20 12:57:39 -0400486 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000487}
488
Jamie Madill70ee0f62017-02-06 16:04:20 -0500489Context::~Context()
490{
491}
492
Jamie Madill4928b7c2017-06-20 12:57:39 -0400493egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000494{
Jamie Madill61e16b42017-06-19 11:13:23 -0400495 mCurrentDisplay = display;
496
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000497 if (!mHasBeenCurrent)
498 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000499 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500500 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400501 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000502
Corentin Wallezc295e512017-01-27 17:47:50 -0500503 int width = 0;
504 int height = 0;
505 if (surface != nullptr)
506 {
507 width = surface->getWidth();
508 height = surface->getHeight();
509 }
510
511 mGLState.setViewportParams(0, 0, width, height);
512 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000513
514 mHasBeenCurrent = true;
515 }
516
Jamie Madill1b94d432015-08-07 13:23:23 -0400517 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700518 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400519 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400520
Jamie Madill4928b7c2017-06-20 12:57:39 -0400521 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500522
523 Framebuffer *newDefault = nullptr;
524 if (surface != nullptr)
525 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400526 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500527 mCurrentSurface = surface;
528 newDefault = surface->getDefaultFramebuffer();
529 }
530 else
531 {
532 if (mSurfacelessFramebuffer == nullptr)
533 {
534 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
535 }
536
537 newDefault = mSurfacelessFramebuffer;
538 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000539
Corentin Wallez37c39792015-08-20 14:19:46 -0400540 // Update default framebuffer, the binding of the previous default
541 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400542 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700543 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400544 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700545 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400546 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700547 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400548 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700549 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400550 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500551 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400552 }
Ian Ewell292f0052016-02-04 10:37:32 -0500553
554 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400555 mImplementation->onMakeCurrent(this);
556 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000557}
558
Jamie Madill4928b7c2017-06-20 12:57:39 -0400559egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400560{
Corentin Wallez37c39792015-08-20 14:19:46 -0400561 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500562 Framebuffer *currentDefault = nullptr;
563 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400564 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500565 currentDefault = mCurrentSurface->getDefaultFramebuffer();
566 }
567 else if (mSurfacelessFramebuffer != nullptr)
568 {
569 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400570 }
571
Corentin Wallezc295e512017-01-27 17:47:50 -0500572 if (mGLState.getReadFramebuffer() == currentDefault)
573 {
574 mGLState.setReadFramebufferBinding(nullptr);
575 }
576 if (mGLState.getDrawFramebuffer() == currentDefault)
577 {
578 mGLState.setDrawFramebufferBinding(nullptr);
579 }
580 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
581
582 if (mCurrentSurface)
583 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400584 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500585 mCurrentSurface = nullptr;
586 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400587
588 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400589}
590
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000591GLuint Context::createBuffer()
592{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500593 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000594}
595
596GLuint Context::createProgram()
597{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500598 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000599}
600
601GLuint Context::createShader(GLenum type)
602{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500603 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000604}
605
606GLuint Context::createTexture()
607{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500608 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000609}
610
611GLuint Context::createRenderbuffer()
612{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500613 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000614}
615
Sami Väisänene45e53b2016-05-25 10:36:04 +0300616GLuint Context::createPaths(GLsizei range)
617{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500618 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300619 if (resultOrError.isError())
620 {
621 handleError(resultOrError.getError());
622 return 0;
623 }
624 return resultOrError.getResult();
625}
626
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000627// Returns an unused framebuffer name
628GLuint Context::createFramebuffer()
629{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500630 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000631}
632
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500633void Context::genFencesNV(GLsizei n, GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000634{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500635 for (int i = 0; i < n; i++)
636 {
637 GLuint handle = mFenceNVHandleAllocator.allocate();
638 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
639 fences[i] = handle;
640 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000641}
642
Yunchao Hea336b902017-08-02 16:05:21 +0800643GLuint Context::createProgramPipeline()
644{
645 return mState.mPipelines->createProgramPipeline();
646}
647
Jiajia Qin5451d532017-11-16 17:16:34 +0800648GLuint Context::createShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
649{
650 UNIMPLEMENTED();
651 return 0u;
652}
653
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000654void Context::deleteBuffer(GLuint buffer)
655{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500656 if (mState.mBuffers->getBuffer(buffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000657 {
658 detachBuffer(buffer);
659 }
Jamie Madill893ab082014-05-16 16:56:10 -0400660
Jamie Madill6c1f6712017-02-14 19:08:04 -0500661 mState.mBuffers->deleteObject(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000662}
663
664void Context::deleteShader(GLuint shader)
665{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500666 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000667}
668
669void Context::deleteProgram(GLuint program)
670{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500671 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000672}
673
674void Context::deleteTexture(GLuint texture)
675{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500676 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000677 {
678 detachTexture(texture);
679 }
680
Jamie Madill6c1f6712017-02-14 19:08:04 -0500681 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000682}
683
684void Context::deleteRenderbuffer(GLuint renderbuffer)
685{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500686 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000687 {
688 detachRenderbuffer(renderbuffer);
689 }
Jamie Madill893ab082014-05-16 16:56:10 -0400690
Jamie Madill6c1f6712017-02-14 19:08:04 -0500691 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000692}
693
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400694void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400695{
696 // The spec specifies the underlying Fence object is not deleted until all current
697 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
698 // and since our API is currently designed for being called from a single thread, we can delete
699 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400700 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400701}
702
Yunchao Hea336b902017-08-02 16:05:21 +0800703void Context::deleteProgramPipeline(GLuint pipeline)
704{
705 if (mState.mPipelines->getProgramPipeline(pipeline))
706 {
707 detachProgramPipeline(pipeline);
708 }
709
710 mState.mPipelines->deleteObject(this, pipeline);
711}
712
Sami Väisänene45e53b2016-05-25 10:36:04 +0300713void Context::deletePaths(GLuint first, GLsizei range)
714{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500715 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300716}
717
718bool Context::hasPathData(GLuint path) const
719{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500720 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300721 if (pathObj == nullptr)
722 return false;
723
724 return pathObj->hasPathData();
725}
726
727bool Context::hasPath(GLuint path) const
728{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500729 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300730}
731
732void Context::setPathCommands(GLuint path,
733 GLsizei numCommands,
734 const GLubyte *commands,
735 GLsizei numCoords,
736 GLenum coordType,
737 const void *coords)
738{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500739 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300740
741 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
742}
743
744void Context::setPathParameterf(GLuint path, GLenum pname, GLfloat value)
745{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500746 auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300747
748 switch (pname)
749 {
750 case GL_PATH_STROKE_WIDTH_CHROMIUM:
751 pathObj->setStrokeWidth(value);
752 break;
753 case GL_PATH_END_CAPS_CHROMIUM:
754 pathObj->setEndCaps(static_cast<GLenum>(value));
755 break;
756 case GL_PATH_JOIN_STYLE_CHROMIUM:
757 pathObj->setJoinStyle(static_cast<GLenum>(value));
758 break;
759 case GL_PATH_MITER_LIMIT_CHROMIUM:
760 pathObj->setMiterLimit(value);
761 break;
762 case GL_PATH_STROKE_BOUND_CHROMIUM:
763 pathObj->setStrokeBound(value);
764 break;
765 default:
766 UNREACHABLE();
767 break;
768 }
769}
770
771void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const
772{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500773 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300774
775 switch (pname)
776 {
777 case GL_PATH_STROKE_WIDTH_CHROMIUM:
778 *value = pathObj->getStrokeWidth();
779 break;
780 case GL_PATH_END_CAPS_CHROMIUM:
781 *value = static_cast<GLfloat>(pathObj->getEndCaps());
782 break;
783 case GL_PATH_JOIN_STYLE_CHROMIUM:
784 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
785 break;
786 case GL_PATH_MITER_LIMIT_CHROMIUM:
787 *value = pathObj->getMiterLimit();
788 break;
789 case GL_PATH_STROKE_BOUND_CHROMIUM:
790 *value = pathObj->getStrokeBound();
791 break;
792 default:
793 UNREACHABLE();
794 break;
795 }
796}
797
798void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
799{
800 mGLState.setPathStencilFunc(func, ref, mask);
801}
802
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803void Context::deleteFramebuffer(GLuint framebuffer)
804{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500805 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806 {
807 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000808 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500809
Jamie Madill6c1f6712017-02-14 19:08:04 -0500810 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000811}
812
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500813void Context::deleteFencesNV(GLsizei n, const GLuint *fences)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000814{
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500815 for (int i = 0; i < n; i++)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000816 {
Jamie Madill2b7bbc22017-12-21 17:30:38 -0500817 GLuint fence = fences[i];
818
819 FenceNV *fenceObject = nullptr;
820 if (mFenceNVMap.erase(fence, &fenceObject))
821 {
822 mFenceNVHandleAllocator.release(fence);
823 delete fenceObject;
824 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000825 }
826}
827
Geoff Lang70d0f492015-12-10 17:45:46 -0500828Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000829{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500830 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000831}
832
Jamie Madill570f7c82014-07-03 10:38:54 -0400833Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000834{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500835 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000836}
837
Geoff Lang70d0f492015-12-10 17:45:46 -0500838Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000839{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500840 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000841}
842
Jamie Madill70b5bb02017-08-28 13:32:37 -0400843Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400844{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400845 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400846}
847
Jamie Madill57a89722013-07-02 11:57:03 -0400848VertexArray *Context::getVertexArray(GLuint handle) const
849{
Jamie Madill96a483b2017-06-27 16:49:21 -0400850 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400851}
852
Jamie Madilldc356042013-07-19 16:36:57 -0400853Sampler *Context::getSampler(GLuint handle) const
854{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500855 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400856}
857
Geoff Langc8058452014-02-03 12:04:11 -0500858TransformFeedback *Context::getTransformFeedback(GLuint handle) const
859{
Jamie Madill96a483b2017-06-27 16:49:21 -0400860 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500861}
862
Yunchao Hea336b902017-08-02 16:05:21 +0800863ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
864{
865 return mState.mPipelines->getProgramPipeline(handle);
866}
867
Geoff Lang70d0f492015-12-10 17:45:46 -0500868LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
869{
870 switch (identifier)
871 {
872 case GL_BUFFER:
873 return getBuffer(name);
874 case GL_SHADER:
875 return getShader(name);
876 case GL_PROGRAM:
877 return getProgram(name);
878 case GL_VERTEX_ARRAY:
879 return getVertexArray(name);
880 case GL_QUERY:
881 return getQuery(name);
882 case GL_TRANSFORM_FEEDBACK:
883 return getTransformFeedback(name);
884 case GL_SAMPLER:
885 return getSampler(name);
886 case GL_TEXTURE:
887 return getTexture(name);
888 case GL_RENDERBUFFER:
889 return getRenderbuffer(name);
890 case GL_FRAMEBUFFER:
891 return getFramebuffer(name);
892 default:
893 UNREACHABLE();
894 return nullptr;
895 }
896}
897
898LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
899{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400900 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500901}
902
Martin Radev9d901792016-07-15 15:58:58 +0300903void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
904{
905 LabeledObject *object = getLabeledObject(identifier, name);
906 ASSERT(object != nullptr);
907
908 std::string labelName = GetObjectLabelFromPointer(length, label);
909 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400910
911 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
912 // specified object is active until we do this.
913 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300914}
915
916void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
917{
918 LabeledObject *object = getLabeledObjectFromPtr(ptr);
919 ASSERT(object != nullptr);
920
921 std::string labelName = GetObjectLabelFromPointer(length, label);
922 object->setLabel(labelName);
923}
924
925void Context::getObjectLabel(GLenum identifier,
926 GLuint name,
927 GLsizei bufSize,
928 GLsizei *length,
929 GLchar *label) const
930{
931 LabeledObject *object = getLabeledObject(identifier, name);
932 ASSERT(object != nullptr);
933
934 const std::string &objectLabel = object->getLabel();
935 GetObjectLabelBase(objectLabel, bufSize, length, label);
936}
937
938void Context::getObjectPtrLabel(const void *ptr,
939 GLsizei bufSize,
940 GLsizei *length,
941 GLchar *label) const
942{
943 LabeledObject *object = getLabeledObjectFromPtr(ptr);
944 ASSERT(object != nullptr);
945
946 const std::string &objectLabel = object->getLabel();
947 GetObjectLabelBase(objectLabel, bufSize, length, label);
948}
949
Jamie Madilldc356042013-07-19 16:36:57 -0400950bool Context::isSampler(GLuint samplerName) const
951{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500952 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400953}
954
Jamie Madilldedd7b92014-11-05 16:30:36 -0500955void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000956{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500957 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000958
Jamie Madilldedd7b92014-11-05 16:30:36 -0500959 if (handle == 0)
960 {
961 texture = mZeroTextures[target].get();
962 }
963 else
964 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500965 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500966 }
967
968 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400969 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000970}
971
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500972void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000973{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500974 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
975 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700976 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000977}
978
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500979void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000980{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500981 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
982 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700983 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000984}
985
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500986void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -0400987{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500988 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700989 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400990}
991
Shao80957d92017-02-20 21:25:59 +0800992void Context::bindVertexBuffer(GLuint bindingIndex,
993 GLuint bufferHandle,
994 GLintptr offset,
995 GLsizei stride)
996{
997 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400998 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +0800999}
1000
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001001void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001002{
Geoff Lang76b10c92014-09-05 16:28:14 -04001003 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001004 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001005 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001006 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001007}
1008
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001009void Context::bindImageTexture(GLuint unit,
1010 GLuint texture,
1011 GLint level,
1012 GLboolean layered,
1013 GLint layer,
1014 GLenum access,
1015 GLenum format)
1016{
1017 Texture *tex = mState.mTextures->getTexture(texture);
1018 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1019}
1020
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001021void Context::useProgram(GLuint program)
1022{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001023 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001024}
1025
Jiajia Qin5451d532017-11-16 17:16:34 +08001026void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1027{
1028 UNIMPLEMENTED();
1029}
1030
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001031void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001032{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001033 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001034 TransformFeedback *transformFeedback =
1035 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001036 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001037}
1038
Yunchao Hea336b902017-08-02 16:05:21 +08001039void Context::bindProgramPipeline(GLuint pipelineHandle)
1040{
1041 ProgramPipeline *pipeline =
1042 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1043 mGLState.setProgramPipelineBinding(this, pipeline);
1044}
1045
Jamie Madillf0e04492017-08-26 15:28:42 -04001046void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001047{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001048 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001049 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001050
Geoff Lang5aad9672014-09-08 11:10:42 -04001051 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001052 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001053
1054 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001055 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001056}
1057
Jamie Madillf0e04492017-08-26 15:28:42 -04001058void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001059{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001060 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001061 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001062
Jamie Madillf0e04492017-08-26 15:28:42 -04001063 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001064
Geoff Lang5aad9672014-09-08 11:10:42 -04001065 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001066 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001067}
1068
Jamie Madillf0e04492017-08-26 15:28:42 -04001069void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001070{
1071 ASSERT(target == GL_TIMESTAMP_EXT);
1072
1073 Query *queryObject = getQuery(id, true, target);
1074 ASSERT(queryObject);
1075
Jamie Madillf0e04492017-08-26 15:28:42 -04001076 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001077}
1078
1079void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1080{
1081 switch (pname)
1082 {
1083 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001084 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001085 break;
1086 case GL_QUERY_COUNTER_BITS_EXT:
1087 switch (target)
1088 {
1089 case GL_TIME_ELAPSED_EXT:
1090 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1091 break;
1092 case GL_TIMESTAMP_EXT:
1093 params[0] = getExtensions().queryCounterBitsTimestamp;
1094 break;
1095 default:
1096 UNREACHABLE();
1097 params[0] = 0;
1098 break;
1099 }
1100 break;
1101 default:
1102 UNREACHABLE();
1103 return;
1104 }
1105}
1106
Geoff Lang2186c382016-10-14 10:54:54 -04001107void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001108{
Geoff Lang2186c382016-10-14 10:54:54 -04001109 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001110}
1111
Geoff Lang2186c382016-10-14 10:54:54 -04001112void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001113{
Geoff Lang2186c382016-10-14 10:54:54 -04001114 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001115}
1116
Geoff Lang2186c382016-10-14 10:54:54 -04001117void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001118{
Geoff Lang2186c382016-10-14 10:54:54 -04001119 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001120}
1121
Geoff Lang2186c382016-10-14 10:54:54 -04001122void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001123{
Geoff Lang2186c382016-10-14 10:54:54 -04001124 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001125}
1126
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001127Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001128{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001129 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001130}
1131
Jamie Madill2f348d22017-06-05 10:50:59 -04001132FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001133{
Jamie Madill96a483b2017-06-27 16:49:21 -04001134 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001135}
1136
Jamie Madill2f348d22017-06-05 10:50:59 -04001137Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001138{
Jamie Madill96a483b2017-06-27 16:49:21 -04001139 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001140 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001141 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001142 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001143
1144 Query *query = mQueryMap.query(handle);
1145 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001146 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001147 query = new Query(mImplementation->createQuery(type), handle);
1148 query->addRef();
1149 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001150 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001151 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001152}
1153
Geoff Lang70d0f492015-12-10 17:45:46 -05001154Query *Context::getQuery(GLuint handle) const
1155{
Jamie Madill96a483b2017-06-27 16:49:21 -04001156 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001157}
1158
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001159Texture *Context::getTargetTexture(GLenum target) const
1160{
Ian Ewellbda75592016-04-18 17:25:54 -04001161 ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001162 return mGLState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001163}
1164
Geoff Lang76b10c92014-09-05 16:28:14 -04001165Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001166{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001167 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001168}
1169
Geoff Lang492a7e42014-11-05 13:27:06 -05001170Compiler *Context::getCompiler() const
1171{
Jamie Madill2f348d22017-06-05 10:50:59 -04001172 if (mCompiler.get() == nullptr)
1173 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001174 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001175 }
1176 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001177}
1178
Jamie Madillc1d770e2017-04-13 17:31:24 -04001179void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180{
1181 switch (pname)
1182 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001183 case GL_SHADER_COMPILER:
1184 *params = GL_TRUE;
1185 break;
1186 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1187 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1188 break;
1189 default:
1190 mGLState.getBooleanv(pname, params);
1191 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001192 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001193}
1194
Jamie Madillc1d770e2017-04-13 17:31:24 -04001195void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001196{
Shannon Woods53a94a82014-06-24 15:20:36 -04001197 // Queries about context capabilities and maximums are answered by Context.
1198 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001199 switch (pname)
1200 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001201 case GL_ALIASED_LINE_WIDTH_RANGE:
1202 params[0] = mCaps.minAliasedLineWidth;
1203 params[1] = mCaps.maxAliasedLineWidth;
1204 break;
1205 case GL_ALIASED_POINT_SIZE_RANGE:
1206 params[0] = mCaps.minAliasedPointSize;
1207 params[1] = mCaps.maxAliasedPointSize;
1208 break;
1209 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1210 ASSERT(mExtensions.textureFilterAnisotropic);
1211 *params = mExtensions.maxTextureAnisotropy;
1212 break;
1213 case GL_MAX_TEXTURE_LOD_BIAS:
1214 *params = mCaps.maxLODBias;
1215 break;
1216
1217 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1218 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1219 {
1220 ASSERT(mExtensions.pathRendering);
1221 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1222 memcpy(params, m, 16 * sizeof(GLfloat));
1223 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001224 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001225
Jamie Madill231c7f52017-04-26 13:45:37 -04001226 default:
1227 mGLState.getFloatv(pname, params);
1228 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001229 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001230}
1231
Jamie Madillc1d770e2017-04-13 17:31:24 -04001232void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001233{
Shannon Woods53a94a82014-06-24 15:20:36 -04001234 // Queries about context capabilities and maximums are answered by Context.
1235 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001236
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001237 switch (pname)
1238 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001239 case GL_MAX_VERTEX_ATTRIBS:
1240 *params = mCaps.maxVertexAttributes;
1241 break;
1242 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1243 *params = mCaps.maxVertexUniformVectors;
1244 break;
1245 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1246 *params = mCaps.maxVertexUniformComponents;
1247 break;
1248 case GL_MAX_VARYING_VECTORS:
1249 *params = mCaps.maxVaryingVectors;
1250 break;
1251 case GL_MAX_VARYING_COMPONENTS:
1252 *params = mCaps.maxVertexOutputComponents;
1253 break;
1254 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1255 *params = mCaps.maxCombinedTextureImageUnits;
1256 break;
1257 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1258 *params = mCaps.maxVertexTextureImageUnits;
1259 break;
1260 case GL_MAX_TEXTURE_IMAGE_UNITS:
1261 *params = mCaps.maxTextureImageUnits;
1262 break;
1263 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1264 *params = mCaps.maxFragmentUniformVectors;
1265 break;
1266 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1267 *params = mCaps.maxFragmentUniformComponents;
1268 break;
1269 case GL_MAX_RENDERBUFFER_SIZE:
1270 *params = mCaps.maxRenderbufferSize;
1271 break;
1272 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1273 *params = mCaps.maxColorAttachments;
1274 break;
1275 case GL_MAX_DRAW_BUFFERS_EXT:
1276 *params = mCaps.maxDrawBuffers;
1277 break;
1278 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1279 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1280 case GL_SUBPIXEL_BITS:
1281 *params = 4;
1282 break;
1283 case GL_MAX_TEXTURE_SIZE:
1284 *params = mCaps.max2DTextureSize;
1285 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001286 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1287 *params = mCaps.maxRectangleTextureSize;
1288 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001289 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1290 *params = mCaps.maxCubeMapTextureSize;
1291 break;
1292 case GL_MAX_3D_TEXTURE_SIZE:
1293 *params = mCaps.max3DTextureSize;
1294 break;
1295 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1296 *params = mCaps.maxArrayTextureLayers;
1297 break;
1298 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1299 *params = mCaps.uniformBufferOffsetAlignment;
1300 break;
1301 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1302 *params = mCaps.maxUniformBufferBindings;
1303 break;
1304 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1305 *params = mCaps.maxVertexUniformBlocks;
1306 break;
1307 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1308 *params = mCaps.maxFragmentUniformBlocks;
1309 break;
1310 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1311 *params = mCaps.maxCombinedTextureImageUnits;
1312 break;
1313 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1314 *params = mCaps.maxVertexOutputComponents;
1315 break;
1316 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1317 *params = mCaps.maxFragmentInputComponents;
1318 break;
1319 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1320 *params = mCaps.minProgramTexelOffset;
1321 break;
1322 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1323 *params = mCaps.maxProgramTexelOffset;
1324 break;
1325 case GL_MAJOR_VERSION:
1326 *params = getClientVersion().major;
1327 break;
1328 case GL_MINOR_VERSION:
1329 *params = getClientVersion().minor;
1330 break;
1331 case GL_MAX_ELEMENTS_INDICES:
1332 *params = mCaps.maxElementsIndices;
1333 break;
1334 case GL_MAX_ELEMENTS_VERTICES:
1335 *params = mCaps.maxElementsVertices;
1336 break;
1337 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1338 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1339 break;
1340 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1341 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1342 break;
1343 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1344 *params = mCaps.maxTransformFeedbackSeparateComponents;
1345 break;
1346 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1347 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1348 break;
1349 case GL_MAX_SAMPLES_ANGLE:
1350 *params = mCaps.maxSamples;
1351 break;
1352 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001353 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001354 params[0] = mCaps.maxViewportWidth;
1355 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001356 }
1357 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001358 case GL_COMPRESSED_TEXTURE_FORMATS:
1359 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1360 params);
1361 break;
1362 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1363 *params = mResetStrategy;
1364 break;
1365 case GL_NUM_SHADER_BINARY_FORMATS:
1366 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1367 break;
1368 case GL_SHADER_BINARY_FORMATS:
1369 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1370 break;
1371 case GL_NUM_PROGRAM_BINARY_FORMATS:
1372 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1373 break;
1374 case GL_PROGRAM_BINARY_FORMATS:
1375 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1376 break;
1377 case GL_NUM_EXTENSIONS:
1378 *params = static_cast<GLint>(mExtensionStrings.size());
1379 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001380
Jamie Madill231c7f52017-04-26 13:45:37 -04001381 // GL_KHR_debug
1382 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1383 *params = mExtensions.maxDebugMessageLength;
1384 break;
1385 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1386 *params = mExtensions.maxDebugLoggedMessages;
1387 break;
1388 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1389 *params = mExtensions.maxDebugGroupStackDepth;
1390 break;
1391 case GL_MAX_LABEL_LENGTH:
1392 *params = mExtensions.maxLabelLength;
1393 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001394
Martin Radeve5285d22017-07-14 16:23:53 +03001395 // GL_ANGLE_multiview
1396 case GL_MAX_VIEWS_ANGLE:
1397 *params = mExtensions.maxViews;
1398 break;
1399
Jamie Madill231c7f52017-04-26 13:45:37 -04001400 // GL_EXT_disjoint_timer_query
1401 case GL_GPU_DISJOINT_EXT:
1402 *params = mImplementation->getGPUDisjoint();
1403 break;
1404 case GL_MAX_FRAMEBUFFER_WIDTH:
1405 *params = mCaps.maxFramebufferWidth;
1406 break;
1407 case GL_MAX_FRAMEBUFFER_HEIGHT:
1408 *params = mCaps.maxFramebufferHeight;
1409 break;
1410 case GL_MAX_FRAMEBUFFER_SAMPLES:
1411 *params = mCaps.maxFramebufferSamples;
1412 break;
1413 case GL_MAX_SAMPLE_MASK_WORDS:
1414 *params = mCaps.maxSampleMaskWords;
1415 break;
1416 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1417 *params = mCaps.maxColorTextureSamples;
1418 break;
1419 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1420 *params = mCaps.maxDepthTextureSamples;
1421 break;
1422 case GL_MAX_INTEGER_SAMPLES:
1423 *params = mCaps.maxIntegerSamples;
1424 break;
1425 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1426 *params = mCaps.maxVertexAttribRelativeOffset;
1427 break;
1428 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1429 *params = mCaps.maxVertexAttribBindings;
1430 break;
1431 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1432 *params = mCaps.maxVertexAttribStride;
1433 break;
1434 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1435 *params = mCaps.maxVertexAtomicCounterBuffers;
1436 break;
1437 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1438 *params = mCaps.maxVertexAtomicCounters;
1439 break;
1440 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1441 *params = mCaps.maxVertexImageUniforms;
1442 break;
1443 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1444 *params = mCaps.maxVertexShaderStorageBlocks;
1445 break;
1446 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1447 *params = mCaps.maxFragmentAtomicCounterBuffers;
1448 break;
1449 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1450 *params = mCaps.maxFragmentAtomicCounters;
1451 break;
1452 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1453 *params = mCaps.maxFragmentImageUniforms;
1454 break;
1455 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1456 *params = mCaps.maxFragmentShaderStorageBlocks;
1457 break;
1458 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1459 *params = mCaps.minProgramTextureGatherOffset;
1460 break;
1461 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1462 *params = mCaps.maxProgramTextureGatherOffset;
1463 break;
1464 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1465 *params = mCaps.maxComputeWorkGroupInvocations;
1466 break;
1467 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1468 *params = mCaps.maxComputeUniformBlocks;
1469 break;
1470 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1471 *params = mCaps.maxComputeTextureImageUnits;
1472 break;
1473 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1474 *params = mCaps.maxComputeSharedMemorySize;
1475 break;
1476 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1477 *params = mCaps.maxComputeUniformComponents;
1478 break;
1479 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1480 *params = mCaps.maxComputeAtomicCounterBuffers;
1481 break;
1482 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1483 *params = mCaps.maxComputeAtomicCounters;
1484 break;
1485 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1486 *params = mCaps.maxComputeImageUniforms;
1487 break;
1488 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1489 *params = mCaps.maxCombinedComputeUniformComponents;
1490 break;
1491 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1492 *params = mCaps.maxComputeShaderStorageBlocks;
1493 break;
1494 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1495 *params = mCaps.maxCombinedShaderOutputResources;
1496 break;
1497 case GL_MAX_UNIFORM_LOCATIONS:
1498 *params = mCaps.maxUniformLocations;
1499 break;
1500 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1501 *params = mCaps.maxAtomicCounterBufferBindings;
1502 break;
1503 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1504 *params = mCaps.maxAtomicCounterBufferSize;
1505 break;
1506 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1507 *params = mCaps.maxCombinedAtomicCounterBuffers;
1508 break;
1509 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1510 *params = mCaps.maxCombinedAtomicCounters;
1511 break;
1512 case GL_MAX_IMAGE_UNITS:
1513 *params = mCaps.maxImageUnits;
1514 break;
1515 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1516 *params = mCaps.maxCombinedImageUniforms;
1517 break;
1518 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1519 *params = mCaps.maxShaderStorageBufferBindings;
1520 break;
1521 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1522 *params = mCaps.maxCombinedShaderStorageBlocks;
1523 break;
1524 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1525 *params = mCaps.shaderStorageBufferOffsetAlignment;
1526 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001527
1528 // GL_EXT_geometry_shader
1529 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1530 *params = mCaps.maxFramebufferLayers;
1531 break;
1532 case GL_LAYER_PROVOKING_VERTEX_EXT:
1533 *params = mCaps.layerProvokingVertex;
1534 break;
1535 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1536 *params = mCaps.maxGeometryUniformComponents;
1537 break;
1538 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
1539 *params = mCaps.maxGeometryUniformBlocks;
1540 break;
1541 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1542 *params = mCaps.maxCombinedGeometryUniformComponents;
1543 break;
1544 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1545 *params = mCaps.maxGeometryInputComponents;
1546 break;
1547 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1548 *params = mCaps.maxGeometryOutputComponents;
1549 break;
1550 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1551 *params = mCaps.maxGeometryOutputVertices;
1552 break;
1553 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1554 *params = mCaps.maxGeometryTotalOutputComponents;
1555 break;
1556 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1557 *params = mCaps.maxGeometryShaderInvocations;
1558 break;
1559 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
1560 *params = mCaps.maxGeometryTextureImageUnits;
1561 break;
1562 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
1563 *params = mCaps.maxGeometryAtomicCounterBuffers;
1564 break;
1565 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
1566 *params = mCaps.maxGeometryAtomicCounters;
1567 break;
1568 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
1569 *params = mCaps.maxGeometryImageUniforms;
1570 break;
1571 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
1572 *params = mCaps.maxGeometryShaderStorageBlocks;
1573 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001574 default:
1575 mGLState.getIntegerv(this, pname, params);
1576 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001577 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001578}
1579
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001580void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001581{
Shannon Woods53a94a82014-06-24 15:20:36 -04001582 // Queries about context capabilities and maximums are answered by Context.
1583 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001584 switch (pname)
1585 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001586 case GL_MAX_ELEMENT_INDEX:
1587 *params = mCaps.maxElementIndex;
1588 break;
1589 case GL_MAX_UNIFORM_BLOCK_SIZE:
1590 *params = mCaps.maxUniformBlockSize;
1591 break;
1592 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1593 *params = mCaps.maxCombinedVertexUniformComponents;
1594 break;
1595 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1596 *params = mCaps.maxCombinedFragmentUniformComponents;
1597 break;
1598 case GL_MAX_SERVER_WAIT_TIMEOUT:
1599 *params = mCaps.maxServerWaitTimeout;
1600 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001601
Jamie Madill231c7f52017-04-26 13:45:37 -04001602 // GL_EXT_disjoint_timer_query
1603 case GL_TIMESTAMP_EXT:
1604 *params = mImplementation->getTimestamp();
1605 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001606
Jamie Madill231c7f52017-04-26 13:45:37 -04001607 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1608 *params = mCaps.maxShaderStorageBlockSize;
1609 break;
1610 default:
1611 UNREACHABLE();
1612 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001613 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001614}
1615
Geoff Lang70d0f492015-12-10 17:45:46 -05001616void Context::getPointerv(GLenum pname, void **params) const
1617{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001618 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001619}
1620
Martin Radev66fb8202016-07-28 11:45:20 +03001621void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001622{
Shannon Woods53a94a82014-06-24 15:20:36 -04001623 // Queries about context capabilities and maximums are answered by Context.
1624 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001625
1626 GLenum nativeType;
1627 unsigned int numParams;
1628 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1629 ASSERT(queryStatus);
1630
1631 if (nativeType == GL_INT)
1632 {
1633 switch (target)
1634 {
1635 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1636 ASSERT(index < 3u);
1637 *data = mCaps.maxComputeWorkGroupCount[index];
1638 break;
1639 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1640 ASSERT(index < 3u);
1641 *data = mCaps.maxComputeWorkGroupSize[index];
1642 break;
1643 default:
1644 mGLState.getIntegeri_v(target, index, data);
1645 }
1646 }
1647 else
1648 {
1649 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1650 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001651}
1652
Martin Radev66fb8202016-07-28 11:45:20 +03001653void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001654{
Shannon Woods53a94a82014-06-24 15:20:36 -04001655 // Queries about context capabilities and maximums are answered by Context.
1656 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001657
1658 GLenum nativeType;
1659 unsigned int numParams;
1660 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1661 ASSERT(queryStatus);
1662
1663 if (nativeType == GL_INT_64_ANGLEX)
1664 {
1665 mGLState.getInteger64i_v(target, index, data);
1666 }
1667 else
1668 {
1669 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1670 }
1671}
1672
1673void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1674{
1675 // Queries about context capabilities and maximums are answered by Context.
1676 // Queries about current GL state values are answered by State.
1677
1678 GLenum nativeType;
1679 unsigned int numParams;
1680 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1681 ASSERT(queryStatus);
1682
1683 if (nativeType == GL_BOOL)
1684 {
1685 mGLState.getBooleani_v(target, index, data);
1686 }
1687 else
1688 {
1689 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1690 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001691}
1692
Corentin Wallez336129f2017-10-17 15:55:40 -04001693void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001694{
1695 Buffer *buffer = mGLState.getTargetBuffer(target);
1696 QueryBufferParameteriv(buffer, pname, params);
1697}
1698
1699void Context::getFramebufferAttachmentParameteriv(GLenum target,
1700 GLenum attachment,
1701 GLenum pname,
1702 GLint *params)
1703{
1704 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001705 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001706}
1707
1708void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1709{
1710 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1711 QueryRenderbufferiv(this, renderbuffer, pname, params);
1712}
1713
1714void Context::getTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
1715{
1716 Texture *texture = getTargetTexture(target);
1717 QueryTexParameterfv(texture, pname, params);
1718}
1719
1720void Context::getTexParameteriv(GLenum target, GLenum pname, GLint *params)
1721{
1722 Texture *texture = getTargetTexture(target);
1723 QueryTexParameteriv(texture, pname, params);
1724}
Jiajia Qin5451d532017-11-16 17:16:34 +08001725
1726void Context::getTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
1727{
1728 Texture *texture =
1729 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
1730 QueryTexLevelParameteriv(texture, target, level, pname, params);
1731}
1732
1733void Context::getTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
1734{
1735 Texture *texture =
1736 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
1737 QueryTexLevelParameterfv(texture, target, level, pname, params);
1738}
1739
He Yunchao010e4db2017-03-03 14:22:06 +08001740void Context::texParameterf(GLenum target, GLenum pname, GLfloat param)
1741{
1742 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001743 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001744 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001745}
1746
1747void Context::texParameterfv(GLenum target, GLenum pname, const GLfloat *params)
1748{
1749 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001750 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001751 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001752}
1753
1754void Context::texParameteri(GLenum target, GLenum pname, GLint param)
1755{
1756 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001757 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001758 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001759}
1760
1761void Context::texParameteriv(GLenum target, GLenum pname, const GLint *params)
1762{
1763 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001764 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001765 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001766}
1767
Jamie Madill675fe712016-12-19 13:07:54 -05001768void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001769{
Jamie Madill05b35b22017-10-03 09:01:44 -04001770 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001771 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
1772 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001773}
1774
Jamie Madill675fe712016-12-19 13:07:54 -05001775void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04001776{
Jamie Madill05b35b22017-10-03 09:01:44 -04001777 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001778 ANGLE_CONTEXT_TRY(
1779 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
1780 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Langf6db0982015-08-25 13:04:00 -04001781}
1782
Jamie Madill876429b2017-04-20 15:46:24 -04001783void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001784{
Jamie Madill05b35b22017-10-03 09:01:44 -04001785 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001786 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04001787}
1788
Jamie Madill675fe712016-12-19 13:07:54 -05001789void Context::drawElementsInstanced(GLenum mode,
1790 GLsizei count,
1791 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001792 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04001793 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04001794{
Jamie Madill05b35b22017-10-03 09:01:44 -04001795 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001796 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08001797 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04001798}
1799
Jamie Madill675fe712016-12-19 13:07:54 -05001800void Context::drawRangeElements(GLenum mode,
1801 GLuint start,
1802 GLuint end,
1803 GLsizei count,
1804 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001805 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04001806{
Jamie Madill05b35b22017-10-03 09:01:44 -04001807 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001808 ANGLE_CONTEXT_TRY(
1809 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001810}
1811
Jamie Madill876429b2017-04-20 15:46:24 -04001812void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001813{
Jamie Madill05b35b22017-10-03 09:01:44 -04001814 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001815 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001816}
1817
Jamie Madill876429b2017-04-20 15:46:24 -04001818void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001819{
Jamie Madill05b35b22017-10-03 09:01:44 -04001820 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001821 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001822}
1823
Jamie Madill675fe712016-12-19 13:07:54 -05001824void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001825{
Jamie Madillafa02a22017-11-23 12:57:38 -05001826 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05001827}
1828
Jamie Madill675fe712016-12-19 13:07:54 -05001829void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05001830{
Jamie Madillafa02a22017-11-23 12:57:38 -05001831 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001832}
1833
Austin Kinross6ee1e782015-05-29 17:05:37 -07001834void Context::insertEventMarker(GLsizei length, const char *marker)
1835{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001836 ASSERT(mImplementation);
1837 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001838}
1839
1840void Context::pushGroupMarker(GLsizei length, const char *marker)
1841{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001842 ASSERT(mImplementation);
1843 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001844}
1845
1846void Context::popGroupMarker()
1847{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001848 ASSERT(mImplementation);
1849 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001850}
1851
Geoff Langd8605522016-04-13 10:19:12 -04001852void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1853{
1854 Program *programObject = getProgram(program);
1855 ASSERT(programObject);
1856
1857 programObject->bindUniformLocation(location, name);
1858}
1859
Sami Väisänena797e062016-05-12 15:23:40 +03001860void Context::setCoverageModulation(GLenum components)
1861{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001862 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001863}
1864
Sami Väisänene45e53b2016-05-25 10:36:04 +03001865void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1866{
1867 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1868}
1869
1870void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1871{
1872 GLfloat I[16];
1873 angle::Matrix<GLfloat>::setToIdentity(I);
1874
1875 mGLState.loadPathRenderingMatrix(matrixMode, I);
1876}
1877
1878void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1879{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001880 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001881 if (!pathObj)
1882 return;
1883
1884 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1885 syncRendererState();
1886
1887 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1888}
1889
1890void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1891{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001892 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001893 if (!pathObj)
1894 return;
1895
1896 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1897 syncRendererState();
1898
1899 mImplementation->stencilStrokePath(pathObj, reference, mask);
1900}
1901
1902void Context::coverFillPath(GLuint path, GLenum coverMode)
1903{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001904 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001905 if (!pathObj)
1906 return;
1907
1908 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1909 syncRendererState();
1910
1911 mImplementation->coverFillPath(pathObj, coverMode);
1912}
1913
1914void Context::coverStrokePath(GLuint path, GLenum coverMode)
1915{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001916 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001917 if (!pathObj)
1918 return;
1919
1920 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1921 syncRendererState();
1922
1923 mImplementation->coverStrokePath(pathObj, coverMode);
1924}
1925
1926void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
1927{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001928 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001929 if (!pathObj)
1930 return;
1931
1932 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1933 syncRendererState();
1934
1935 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
1936}
1937
1938void Context::stencilThenCoverStrokePath(GLuint path,
1939 GLint reference,
1940 GLuint mask,
1941 GLenum coverMode)
1942{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001943 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001944 if (!pathObj)
1945 return;
1946
1947 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1948 syncRendererState();
1949
1950 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
1951}
1952
Sami Väisänend59ca052016-06-21 16:10:00 +03001953void Context::coverFillPathInstanced(GLsizei numPaths,
1954 GLenum pathNameType,
1955 const void *paths,
1956 GLuint pathBase,
1957 GLenum coverMode,
1958 GLenum transformType,
1959 const GLfloat *transformValues)
1960{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001961 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001962
1963 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1964 syncRendererState();
1965
1966 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
1967}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001968
Sami Väisänend59ca052016-06-21 16:10:00 +03001969void Context::coverStrokePathInstanced(GLsizei numPaths,
1970 GLenum pathNameType,
1971 const void *paths,
1972 GLuint pathBase,
1973 GLenum coverMode,
1974 GLenum transformType,
1975 const GLfloat *transformValues)
1976{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001977 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001978
1979 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1980 syncRendererState();
1981
1982 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
1983 transformValues);
1984}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001985
Sami Väisänend59ca052016-06-21 16:10:00 +03001986void Context::stencilFillPathInstanced(GLsizei numPaths,
1987 GLenum pathNameType,
1988 const void *paths,
1989 GLuint pathBase,
1990 GLenum fillMode,
1991 GLuint mask,
1992 GLenum transformType,
1993 const GLfloat *transformValues)
1994{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001995 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001996
1997 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1998 syncRendererState();
1999
2000 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
2001 transformValues);
2002}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002003
Sami Väisänend59ca052016-06-21 16:10:00 +03002004void Context::stencilStrokePathInstanced(GLsizei numPaths,
2005 GLenum pathNameType,
2006 const void *paths,
2007 GLuint pathBase,
2008 GLint reference,
2009 GLuint mask,
2010 GLenum transformType,
2011 const GLfloat *transformValues)
2012{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002013 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002014
2015 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2016 syncRendererState();
2017
2018 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2019 transformValues);
2020}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002021
Sami Väisänend59ca052016-06-21 16:10:00 +03002022void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2023 GLenum pathNameType,
2024 const void *paths,
2025 GLuint pathBase,
2026 GLenum fillMode,
2027 GLuint mask,
2028 GLenum coverMode,
2029 GLenum transformType,
2030 const GLfloat *transformValues)
2031{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002032 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002033
2034 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2035 syncRendererState();
2036
2037 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2038 transformType, transformValues);
2039}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002040
Sami Väisänend59ca052016-06-21 16:10:00 +03002041void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2042 GLenum pathNameType,
2043 const void *paths,
2044 GLuint pathBase,
2045 GLint reference,
2046 GLuint mask,
2047 GLenum coverMode,
2048 GLenum transformType,
2049 const GLfloat *transformValues)
2050{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002051 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002052
2053 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2054 syncRendererState();
2055
2056 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2057 transformType, transformValues);
2058}
2059
Sami Väisänen46eaa942016-06-29 10:26:37 +03002060void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2061{
2062 auto *programObject = getProgram(program);
2063
2064 programObject->bindFragmentInputLocation(location, name);
2065}
2066
2067void Context::programPathFragmentInputGen(GLuint program,
2068 GLint location,
2069 GLenum genMode,
2070 GLint components,
2071 const GLfloat *coeffs)
2072{
2073 auto *programObject = getProgram(program);
2074
Jamie Madillbd044ed2017-06-05 12:59:21 -04002075 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002076}
2077
jchen1015015f72017-03-16 13:54:21 +08002078GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2079{
jchen10fd7c3b52017-03-21 15:36:03 +08002080 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002081 return QueryProgramResourceIndex(programObject, programInterface, name);
2082}
2083
jchen10fd7c3b52017-03-21 15:36:03 +08002084void Context::getProgramResourceName(GLuint program,
2085 GLenum programInterface,
2086 GLuint index,
2087 GLsizei bufSize,
2088 GLsizei *length,
2089 GLchar *name)
2090{
2091 const auto *programObject = getProgram(program);
2092 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2093}
2094
jchen10191381f2017-04-11 13:59:04 +08002095GLint Context::getProgramResourceLocation(GLuint program,
2096 GLenum programInterface,
2097 const GLchar *name)
2098{
2099 const auto *programObject = getProgram(program);
2100 return QueryProgramResourceLocation(programObject, programInterface, name);
2101}
2102
jchen10880683b2017-04-12 16:21:55 +08002103void Context::getProgramResourceiv(GLuint program,
2104 GLenum programInterface,
2105 GLuint index,
2106 GLsizei propCount,
2107 const GLenum *props,
2108 GLsizei bufSize,
2109 GLsizei *length,
2110 GLint *params)
2111{
2112 const auto *programObject = getProgram(program);
2113 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2114 length, params);
2115}
2116
jchen10d9cd7b72017-08-30 15:04:25 +08002117void Context::getProgramInterfaceiv(GLuint program,
2118 GLenum programInterface,
2119 GLenum pname,
2120 GLint *params)
2121{
2122 const auto *programObject = getProgram(program);
2123 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2124}
2125
Jamie Madill71c88b32017-09-14 22:20:29 -04002126void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002127{
Geoff Langda5777c2014-07-11 09:52:58 -04002128 if (error.isError())
2129 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002130 GLenum code = error.getCode();
2131 mErrors.insert(code);
2132 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2133 {
2134 markContextLost();
2135 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002136
Geoff Langee6884e2017-11-09 16:51:11 -05002137 ASSERT(!error.getMessage().empty());
2138 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2139 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002140 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002141}
2142
2143// Get one of the recorded errors and clear its flag, if any.
2144// [OpenGL ES 2.0.24] section 2.5 page 13.
2145GLenum Context::getError()
2146{
Geoff Langda5777c2014-07-11 09:52:58 -04002147 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002148 {
Geoff Langda5777c2014-07-11 09:52:58 -04002149 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002150 }
Geoff Langda5777c2014-07-11 09:52:58 -04002151 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002152 {
Geoff Langda5777c2014-07-11 09:52:58 -04002153 GLenum error = *mErrors.begin();
2154 mErrors.erase(mErrors.begin());
2155 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002156 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002157}
2158
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002159// NOTE: this function should not assume that this context is current!
2160void Context::markContextLost()
2161{
2162 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002163 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002164 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002165 mContextLostForced = true;
2166 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002167 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002168}
2169
2170bool Context::isContextLost()
2171{
2172 return mContextLost;
2173}
2174
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002175GLenum Context::getResetStatus()
2176{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002177 // Even if the application doesn't want to know about resets, we want to know
2178 // as it will allow us to skip all the calls.
2179 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002180 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002181 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002182 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002183 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002184 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002185
2186 // EXT_robustness, section 2.6: If the reset notification behavior is
2187 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2188 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2189 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002190 }
2191
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002192 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2193 // status should be returned at least once, and GL_NO_ERROR should be returned
2194 // once the device has finished resetting.
2195 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002196 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002197 ASSERT(mResetStatus == GL_NO_ERROR);
2198 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002199
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002200 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002201 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002202 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002203 }
2204 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002205 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002206 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002207 // If markContextLost was used to mark the context lost then
2208 // assume that is not recoverable, and continue to report the
2209 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002210 mResetStatus = mImplementation->getResetStatus();
2211 }
Jamie Madill893ab082014-05-16 16:56:10 -04002212
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002213 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002214}
2215
2216bool Context::isResetNotificationEnabled()
2217{
2218 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2219}
2220
Corentin Walleze3b10e82015-05-20 11:06:25 -04002221const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002222{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002223 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002224}
2225
2226EGLenum Context::getClientType() const
2227{
2228 return mClientType;
2229}
2230
2231EGLenum Context::getRenderBuffer() const
2232{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002233 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2234 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002235 {
2236 return EGL_NONE;
2237 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002238
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002239 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002240 ASSERT(backAttachment != nullptr);
2241 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002242}
2243
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002244VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002245{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002246 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002247 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2248 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002249 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002250 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2251 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002252
Jamie Madill96a483b2017-06-27 16:49:21 -04002253 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002254 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002255
2256 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002257}
2258
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002259TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002260{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002261 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002262 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2263 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002264 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002265 transformFeedback =
2266 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002267 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002268 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002269 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002270
2271 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002272}
2273
2274bool Context::isVertexArrayGenerated(GLuint vertexArray)
2275{
Jamie Madill96a483b2017-06-27 16:49:21 -04002276 ASSERT(mVertexArrayMap.contains(0));
2277 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002278}
2279
2280bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2281{
Jamie Madill96a483b2017-06-27 16:49:21 -04002282 ASSERT(mTransformFeedbackMap.contains(0));
2283 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002284}
2285
Shannon Woods53a94a82014-06-24 15:20:36 -04002286void Context::detachTexture(GLuint texture)
2287{
2288 // Simple pass-through to State's detachTexture method, as textures do not require
2289 // allocation map management either here or in the resource manager at detach time.
2290 // Zero textures are held by the Context, and we don't attempt to request them from
2291 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002292 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002293}
2294
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002295void Context::detachBuffer(GLuint buffer)
2296{
Yuly Novikov5807a532015-12-03 13:01:22 -05002297 // Simple pass-through to State's detachBuffer method, since
2298 // only buffer attachments to container objects that are bound to the current context
2299 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002300
Yuly Novikov5807a532015-12-03 13:01:22 -05002301 // [OpenGL ES 3.2] section 5.1.2 page 45:
2302 // Attachments to unbound container objects, such as
2303 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2304 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002305 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002306}
2307
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002308void Context::detachFramebuffer(GLuint framebuffer)
2309{
Shannon Woods53a94a82014-06-24 15:20:36 -04002310 // Framebuffer detachment is handled by Context, because 0 is a valid
2311 // Framebuffer object, and a pointer to it must be passed from Context
2312 // to State at binding time.
2313
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002314 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002315 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2316 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2317 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002318
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002319 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002320 {
2321 bindReadFramebuffer(0);
2322 }
2323
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002324 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002325 {
2326 bindDrawFramebuffer(0);
2327 }
2328}
2329
2330void Context::detachRenderbuffer(GLuint renderbuffer)
2331{
Jamie Madilla02315b2017-02-23 14:14:47 -05002332 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002333}
2334
Jamie Madill57a89722013-07-02 11:57:03 -04002335void Context::detachVertexArray(GLuint vertexArray)
2336{
Jamie Madill77a72f62015-04-14 11:18:32 -04002337 // Vertex array detachment is handled by Context, because 0 is a valid
2338 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002339 // binding time.
2340
Jamie Madill57a89722013-07-02 11:57:03 -04002341 // [OpenGL ES 3.0.2] section 2.10 page 43:
2342 // If a vertex array object that is currently bound is deleted, the binding
2343 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002344 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002345 {
2346 bindVertexArray(0);
2347 }
2348}
2349
Geoff Langc8058452014-02-03 12:04:11 -05002350void Context::detachTransformFeedback(GLuint transformFeedback)
2351{
Corentin Walleza2257da2016-04-19 16:43:12 -04002352 // Transform feedback detachment is handled by Context, because 0 is a valid
2353 // transform feedback, and a pointer to it must be passed from Context to State at
2354 // binding time.
2355
2356 // The OpenGL specification doesn't mention what should happen when the currently bound
2357 // transform feedback object is deleted. Since it is a container object, we treat it like
2358 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002359 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002360 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002361 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002362 }
Geoff Langc8058452014-02-03 12:04:11 -05002363}
2364
Jamie Madilldc356042013-07-19 16:36:57 -04002365void Context::detachSampler(GLuint sampler)
2366{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002367 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002368}
2369
Yunchao Hea336b902017-08-02 16:05:21 +08002370void Context::detachProgramPipeline(GLuint pipeline)
2371{
2372 mGLState.detachProgramPipeline(this, pipeline);
2373}
2374
Jamie Madill3ef140a2017-08-26 23:11:21 -04002375void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002376{
Shaodde78e82017-05-22 14:13:27 +08002377 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002378}
2379
Jamie Madille29d1672013-07-19 16:36:57 -04002380void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2381{
Geoff Langc1984ed2016-10-07 12:41:00 -04002382 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002383 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002384 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002385 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002386}
Jamie Madille29d1672013-07-19 16:36:57 -04002387
Geoff Langc1984ed2016-10-07 12:41:00 -04002388void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2389{
2390 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002392 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002393 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002394}
2395
2396void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2397{
Geoff Langc1984ed2016-10-07 12:41:00 -04002398 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002399 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002400 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002401 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002402}
2403
Geoff Langc1984ed2016-10-07 12:41:00 -04002404void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002405{
Geoff Langc1984ed2016-10-07 12:41:00 -04002406 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002407 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002408 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002409 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002410}
2411
Geoff Langc1984ed2016-10-07 12:41:00 -04002412void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002413{
Geoff Langc1984ed2016-10-07 12:41:00 -04002414 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002415 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002416 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002417 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002418}
Jamie Madill9675b802013-07-19 16:36:59 -04002419
Geoff Langc1984ed2016-10-07 12:41:00 -04002420void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2421{
2422 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002423 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002424 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002425 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002426}
2427
Olli Etuahof0fee072016-03-30 15:11:58 +03002428void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2429{
2430 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002431 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002432}
2433
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002434void Context::initRendererString()
2435{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002436 std::ostringstream rendererString;
2437 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002438 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002439 rendererString << ")";
2440
Geoff Langcec35902014-04-16 10:52:36 -04002441 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002442}
2443
Geoff Langc339c4e2016-11-29 10:37:36 -05002444void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002445{
Geoff Langc339c4e2016-11-29 10:37:36 -05002446 const Version &clientVersion = getClientVersion();
2447
2448 std::ostringstream versionString;
2449 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2450 << ANGLE_VERSION_STRING << ")";
2451 mVersionString = MakeStaticString(versionString.str());
2452
2453 std::ostringstream shadingLanguageVersionString;
2454 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2455 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2456 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2457 << ")";
2458 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002459}
2460
Geoff Langcec35902014-04-16 10:52:36 -04002461void Context::initExtensionStrings()
2462{
Geoff Langc339c4e2016-11-29 10:37:36 -05002463 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2464 std::ostringstream combinedStringStream;
2465 std::copy(strings.begin(), strings.end(),
2466 std::ostream_iterator<const char *>(combinedStringStream, " "));
2467 return MakeStaticString(combinedStringStream.str());
2468 };
2469
2470 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002471 for (const auto &extensionString : mExtensions.getStrings())
2472 {
2473 mExtensionStrings.push_back(MakeStaticString(extensionString));
2474 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002475 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002476
Bryan Bernhart58806562017-01-05 13:09:31 -08002477 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2478
Geoff Langc339c4e2016-11-29 10:37:36 -05002479 mRequestableExtensionStrings.clear();
2480 for (const auto &extensionInfo : GetExtensionInfoMap())
2481 {
2482 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002483 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2484 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002485 {
2486 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2487 }
2488 }
2489 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002490}
2491
Geoff Langc339c4e2016-11-29 10:37:36 -05002492const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002493{
Geoff Langc339c4e2016-11-29 10:37:36 -05002494 switch (name)
2495 {
2496 case GL_VENDOR:
2497 return reinterpret_cast<const GLubyte *>("Google Inc.");
2498
2499 case GL_RENDERER:
2500 return reinterpret_cast<const GLubyte *>(mRendererString);
2501
2502 case GL_VERSION:
2503 return reinterpret_cast<const GLubyte *>(mVersionString);
2504
2505 case GL_SHADING_LANGUAGE_VERSION:
2506 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2507
2508 case GL_EXTENSIONS:
2509 return reinterpret_cast<const GLubyte *>(mExtensionString);
2510
2511 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2512 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2513
2514 default:
2515 UNREACHABLE();
2516 return nullptr;
2517 }
Geoff Langcec35902014-04-16 10:52:36 -04002518}
2519
Geoff Langc339c4e2016-11-29 10:37:36 -05002520const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002521{
Geoff Langc339c4e2016-11-29 10:37:36 -05002522 switch (name)
2523 {
2524 case GL_EXTENSIONS:
2525 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2526
2527 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2528 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2529
2530 default:
2531 UNREACHABLE();
2532 return nullptr;
2533 }
Geoff Langcec35902014-04-16 10:52:36 -04002534}
2535
2536size_t Context::getExtensionStringCount() const
2537{
2538 return mExtensionStrings.size();
2539}
2540
Geoff Lang111a99e2017-10-17 10:58:41 -04002541bool Context::isExtensionRequestable(const char *name)
2542{
2543 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2544 auto extension = extensionInfos.find(name);
2545
2546 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2547 return extension != extensionInfos.end() && extension->second.Requestable &&
2548 nativeExtensions.*(extension->second.ExtensionsMember);
2549}
2550
Geoff Langc339c4e2016-11-29 10:37:36 -05002551void Context::requestExtension(const char *name)
2552{
2553 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2554 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2555 const auto &extension = extensionInfos.at(name);
2556 ASSERT(extension.Requestable);
Geoff Lang111a99e2017-10-17 10:58:41 -04002557 ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
Geoff Langc339c4e2016-11-29 10:37:36 -05002558
2559 if (mExtensions.*(extension.ExtensionsMember))
2560 {
2561 // Extension already enabled
2562 return;
2563 }
2564
2565 mExtensions.*(extension.ExtensionsMember) = true;
2566 updateCaps();
2567 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002568
Jamie Madill2f348d22017-06-05 10:50:59 -04002569 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2570 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002571
Jamie Madill81c2e252017-09-09 23:32:46 -04002572 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2573 // sampleable.
2574 mState.mTextures->signalAllTexturesDirty();
Geoff Lang9aded172017-04-05 11:07:56 -04002575 for (auto &zeroTexture : mZeroTextures)
2576 {
Jamie Madill05b35b22017-10-03 09:01:44 -04002577 zeroTexture.second->signalDirty(InitState::Initialized);
Geoff Lang9aded172017-04-05 11:07:56 -04002578 }
2579
2580 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002581}
2582
2583size_t Context::getRequestableExtensionStringCount() const
2584{
2585 return mRequestableExtensionStrings.size();
2586}
2587
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002588void Context::beginTransformFeedback(GLenum primitiveMode)
2589{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002590 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002591 ASSERT(transformFeedback != nullptr);
2592 ASSERT(!transformFeedback->isPaused());
2593
Jamie Madill6c1f6712017-02-14 19:08:04 -05002594 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002595}
2596
2597bool Context::hasActiveTransformFeedback(GLuint program) const
2598{
2599 for (auto pair : mTransformFeedbackMap)
2600 {
2601 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2602 {
2603 return true;
2604 }
2605 }
2606 return false;
2607}
2608
Geoff Langb433e872017-10-05 14:01:47 -04002609void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04002610{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002611 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002612
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002613 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002614
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002615 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002616
Geoff Langeb66a6e2016-10-31 13:06:12 -04002617 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002618 {
2619 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04002620 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002621 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002622 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03002623 mExtensions.multiview = false;
2624 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04002625 }
2626
Jiawei Shao89be29a2017-11-06 14:36:45 +08002627 if (getClientVersion() < ES_3_1)
2628 {
2629 // Disable ES3.1+ extensions
2630 mExtensions.geometryShader = false;
2631 }
2632
Geoff Langeb66a6e2016-10-31 13:06:12 -04002633 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002634 {
2635 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04002636 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002637 }
2638
Jamie Madill00ed7a12016-05-19 13:13:38 -04002639 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04002640 mExtensions.bindUniformLocation = true;
2641 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04002642 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05002643 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05002644 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04002645
2646 // Enable the no error extension if the context was created with the flag.
2647 mExtensions.noError = mSkipValidation;
2648
Corentin Wallezccab69d2017-01-27 16:57:15 -05002649 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05002650 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05002651
Geoff Lang70d0f492015-12-10 17:45:46 -05002652 // Explicitly enable GL_KHR_debug
2653 mExtensions.debug = true;
2654 mExtensions.maxDebugMessageLength = 1024;
2655 mExtensions.maxDebugLoggedMessages = 1024;
2656 mExtensions.maxDebugGroupStackDepth = 1024;
2657 mExtensions.maxLabelLength = 1024;
2658
Geoff Langff5b2d52016-09-07 11:32:23 -04002659 // Explicitly enable GL_ANGLE_robust_client_memory
2660 mExtensions.robustClientMemory = true;
2661
Jamie Madille08a1d32017-03-07 17:24:06 -05002662 // Determine robust resource init availability from EGL.
Geoff Langb433e872017-10-05 14:01:47 -04002663 mExtensions.robustResourceInitialization = robustResourceInit;
Jamie Madille08a1d32017-03-07 17:24:06 -05002664
Jiajia Qin8a7b3a02017-08-25 16:05:48 +08002665 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
2666 // supports it.
2667 mExtensions.robustBufferAccessBehavior =
2668 mRobustAccess && mExtensions.robustBufferAccessBehavior;
2669
Jamie Madillc43be722017-07-13 16:22:14 -04002670 // Enable the cache control query unconditionally.
2671 mExtensions.programCacheControl = true;
2672
Geoff Lang301d1612014-07-09 10:34:37 -04002673 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04002674 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002675
Jamie Madill0f80ed82017-09-19 00:24:56 -04002676 if (getClientVersion() < ES_3_1)
2677 {
2678 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
2679 }
2680 else
2681 {
2682 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
2683 }
Geoff Lang301d1612014-07-09 10:34:37 -04002684
Jamie Madill0f80ed82017-09-19 00:24:56 -04002685 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2686 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2687 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2688
2689 // Limit textures as well, so we can use fast bitsets with texture bindings.
2690 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
2691 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
2692 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04002693
Jiawei Shaodb342272017-09-27 10:21:45 +08002694 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
2695
Geoff Langc287ea62016-09-16 14:46:51 -04002696 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002697 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04002698 for (const auto &extensionInfo : GetExtensionInfoMap())
2699 {
2700 // If this context is for WebGL, disable all enableable extensions
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002701 if (mWebGLContext && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04002702 {
2703 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
2704 }
2705 }
2706
2707 // Generate texture caps
2708 updateCaps();
2709}
2710
2711void Context::updateCaps()
2712{
Geoff Lang900013c2014-07-07 11:32:19 -04002713 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002714 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04002715
Jamie Madill7b62cf92017-11-02 15:20:49 -04002716 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04002717 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04002718 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04002719 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002720
Geoff Lang0d8b7242015-09-09 14:56:53 -04002721 // Update the format caps based on the client version and extensions.
2722 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2723 // ES3.
2724 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002725 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002726 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002727 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002728 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002729 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002730
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002731 // OpenGL ES does not support multisampling with non-rendererable formats
2732 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03002733 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002734 (getClientVersion() < ES_3_1 &&
2735 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04002736 {
Geoff Langd87878e2014-09-19 15:42:59 -04002737 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002738 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03002739 else
2740 {
2741 // We may have limited the max samples for some required renderbuffer formats due to
2742 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
2743 GLuint formatMaxSamples = formatCaps.getMaxSamples();
2744
2745 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
2746 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
2747 // exception of signed and unsigned integer formats."
2748 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
2749 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
2750 {
2751 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
2752 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
2753 }
2754
2755 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
2756 if (getClientVersion() >= ES_3_1)
2757 {
2758 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
2759 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
2760 // the exception that the signed and unsigned integer formats are required only to
2761 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
2762 // multisamples, which must be at least one."
2763 if (formatInfo.componentType == GL_INT ||
2764 formatInfo.componentType == GL_UNSIGNED_INT)
2765 {
2766 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
2767 }
2768
2769 // GLES 3.1 section 19.3.1.
2770 if (formatCaps.texturable)
2771 {
2772 if (formatInfo.depthBits > 0)
2773 {
2774 mCaps.maxDepthTextureSamples =
2775 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
2776 }
2777 else if (formatInfo.redBits > 0)
2778 {
2779 mCaps.maxColorTextureSamples =
2780 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
2781 }
2782 }
2783 }
2784 }
Geoff Langd87878e2014-09-19 15:42:59 -04002785
2786 if (formatCaps.texturable && formatInfo.compressed)
2787 {
Geoff Langca271392017-04-05 12:30:00 -04002788 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002789 }
2790
Geoff Langca271392017-04-05 12:30:00 -04002791 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002792 }
Jamie Madill32447362017-06-28 14:53:52 -04002793
2794 // If program binary is disabled, blank out the memory cache pointer.
2795 if (!mImplementation->getNativeExtensions().getProgramBinary)
2796 {
2797 mMemoryProgramCache = nullptr;
2798 }
Corentin Walleze4477002017-12-01 14:39:58 -05002799
2800 // Compute which buffer types are allowed
2801 mValidBufferBindings.reset();
2802 mValidBufferBindings.set(BufferBinding::ElementArray);
2803 mValidBufferBindings.set(BufferBinding::Array);
2804
2805 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
2806 {
2807 mValidBufferBindings.set(BufferBinding::PixelPack);
2808 mValidBufferBindings.set(BufferBinding::PixelUnpack);
2809 }
2810
2811 if (getClientVersion() >= ES_3_0)
2812 {
2813 mValidBufferBindings.set(BufferBinding::CopyRead);
2814 mValidBufferBindings.set(BufferBinding::CopyWrite);
2815 mValidBufferBindings.set(BufferBinding::TransformFeedback);
2816 mValidBufferBindings.set(BufferBinding::Uniform);
2817 }
2818
2819 if (getClientVersion() >= ES_3_1)
2820 {
2821 mValidBufferBindings.set(BufferBinding::AtomicCounter);
2822 mValidBufferBindings.set(BufferBinding::ShaderStorage);
2823 mValidBufferBindings.set(BufferBinding::DrawIndirect);
2824 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
2825 }
Geoff Lang493daf52014-07-03 13:38:44 -04002826}
2827
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002828void Context::initWorkarounds()
2829{
Jamie Madill761b02c2017-06-23 16:27:06 -04002830 // Apply back-end workarounds.
2831 mImplementation->applyNativeWorkarounds(&mWorkarounds);
2832
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002833 // Lose the context upon out of memory error if the application is
2834 // expecting to watch for those events.
2835 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2836}
2837
Jamie Madill05b35b22017-10-03 09:01:44 -04002838Error Context::prepareForDraw()
2839{
2840 syncRendererState();
Jamie Madilla59fc192017-11-02 12:57:58 -04002841
2842 if (isRobustResourceInitEnabled())
2843 {
2844 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
2845 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
2846 }
2847
Jamie Madill05b35b22017-10-03 09:01:44 -04002848 return NoError();
2849}
2850
Jamie Madill1b94d432015-08-07 13:23:23 -04002851void Context::syncRendererState()
2852{
Jamie Madill7d1f5c62017-09-02 15:32:15 -04002853 mGLState.syncDirtyObjects(this);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002854 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madillfe548342017-06-19 11:13:24 -04002855 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002856 mGLState.clearDirtyBits();
Jamie Madill1b94d432015-08-07 13:23:23 -04002857}
2858
Jamie Madillad9f24e2016-02-12 09:27:24 -05002859void Context::syncRendererState(const State::DirtyBits &bitMask,
2860 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002861{
Jamie Madill7d1f5c62017-09-02 15:32:15 -04002862 mGLState.syncDirtyObjects(this, objectMask);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002863 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04002864 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002865 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill1b94d432015-08-07 13:23:23 -04002866}
Jamie Madillc29968b2016-01-20 11:17:23 -05002867
2868void Context::blitFramebuffer(GLint srcX0,
2869 GLint srcY0,
2870 GLint srcX1,
2871 GLint srcY1,
2872 GLint dstX0,
2873 GLint dstY0,
2874 GLint dstX1,
2875 GLint dstY1,
2876 GLbitfield mask,
2877 GLenum filter)
2878{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002879 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002880 ASSERT(drawFramebuffer);
2881
2882 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2883 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2884
Jamie Madillad9f24e2016-02-12 09:27:24 -05002885 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002886
Jamie Madillc564c072017-06-01 12:45:42 -04002887 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002888}
Jamie Madillc29968b2016-01-20 11:17:23 -05002889
2890void Context::clear(GLbitfield mask)
2891{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002892 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002893 handleError(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05002894}
2895
2896void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2897{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002898 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002899 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002900}
2901
2902void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2903{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002904 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002905 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002906}
2907
2908void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2909{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002910 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002911 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002912}
2913
2914void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2915{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002916 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002917 ASSERT(framebufferObject);
2918
2919 // If a buffer is not present, the clear has no effect
2920 if (framebufferObject->getDepthbuffer() == nullptr &&
2921 framebufferObject->getStencilbuffer() == nullptr)
2922 {
2923 return;
2924 }
2925
Jamie Madillad9f24e2016-02-12 09:27:24 -05002926 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002927 handleError(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05002928}
2929
2930void Context::readPixels(GLint x,
2931 GLint y,
2932 GLsizei width,
2933 GLsizei height,
2934 GLenum format,
2935 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002936 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05002937{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002938 if (width == 0 || height == 0)
2939 {
2940 return;
2941 }
2942
Jamie Madillad9f24e2016-02-12 09:27:24 -05002943 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002944
Jamie Madillb6664922017-07-25 12:55:04 -04002945 Framebuffer *readFBO = mGLState.getReadFramebuffer();
2946 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05002947
2948 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04002949 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05002950}
2951
2952void Context::copyTexImage2D(GLenum target,
2953 GLint level,
2954 GLenum internalformat,
2955 GLint x,
2956 GLint y,
2957 GLsizei width,
2958 GLsizei height,
2959 GLint border)
2960{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002961 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002962 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002963
Jamie Madillc29968b2016-01-20 11:17:23 -05002964 Rectangle sourceArea(x, y, width, height);
2965
Jamie Madill05b35b22017-10-03 09:01:44 -04002966 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002967 Texture *texture =
2968 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002969 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002970}
2971
2972void Context::copyTexSubImage2D(GLenum target,
2973 GLint level,
2974 GLint xoffset,
2975 GLint yoffset,
2976 GLint x,
2977 GLint y,
2978 GLsizei width,
2979 GLsizei height)
2980{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002981 if (width == 0 || height == 0)
2982 {
2983 return;
2984 }
2985
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002986 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002987 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002988
Jamie Madillc29968b2016-01-20 11:17:23 -05002989 Offset destOffset(xoffset, yoffset, 0);
2990 Rectangle sourceArea(x, y, width, height);
2991
Jamie Madill05b35b22017-10-03 09:01:44 -04002992 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002993 Texture *texture =
2994 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002995 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002996}
2997
2998void Context::copyTexSubImage3D(GLenum target,
2999 GLint level,
3000 GLint xoffset,
3001 GLint yoffset,
3002 GLint zoffset,
3003 GLint x,
3004 GLint y,
3005 GLsizei width,
3006 GLsizei height)
3007{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04003008 if (width == 0 || height == 0)
3009 {
3010 return;
3011 }
3012
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003013 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003014 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003015
Jamie Madillc29968b2016-01-20 11:17:23 -05003016 Offset destOffset(xoffset, yoffset, zoffset);
3017 Rectangle sourceArea(x, y, width, height);
3018
Jamie Madill05b35b22017-10-03 09:01:44 -04003019 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3020 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003021 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003022}
3023
3024void Context::framebufferTexture2D(GLenum target,
3025 GLenum attachment,
3026 GLenum textarget,
3027 GLuint texture,
3028 GLint level)
3029{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003030 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003031 ASSERT(framebuffer);
3032
3033 if (texture != 0)
3034 {
3035 Texture *textureObj = getTexture(texture);
3036
3037 ImageIndex index = ImageIndex::MakeInvalid();
3038
3039 if (textarget == GL_TEXTURE_2D)
3040 {
3041 index = ImageIndex::Make2D(level);
3042 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -04003043 else if (textarget == GL_TEXTURE_RECTANGLE_ANGLE)
3044 {
3045 index = ImageIndex::MakeRectangle(level);
3046 }
JiangYizhoubddc46b2016-12-09 09:50:51 +08003047 else if (textarget == GL_TEXTURE_2D_MULTISAMPLE)
3048 {
3049 ASSERT(level == 0);
3050 index = ImageIndex::Make2DMultisample();
3051 }
Jamie Madillc29968b2016-01-20 11:17:23 -05003052 else
3053 {
3054 ASSERT(IsCubeMapTextureTarget(textarget));
3055 index = ImageIndex::MakeCube(textarget, level);
3056 }
3057
Jamie Madilla02315b2017-02-23 14:14:47 -05003058 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003059 }
3060 else
3061 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003062 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003063 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003064
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003065 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003066}
3067
3068void Context::framebufferRenderbuffer(GLenum target,
3069 GLenum attachment,
3070 GLenum renderbuffertarget,
3071 GLuint renderbuffer)
3072{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003073 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003074 ASSERT(framebuffer);
3075
3076 if (renderbuffer != 0)
3077 {
3078 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003079
3080 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003081 renderbufferObject);
3082 }
3083 else
3084 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003085 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003086 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003087
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003088 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003089}
3090
3091void Context::framebufferTextureLayer(GLenum target,
3092 GLenum attachment,
3093 GLuint texture,
3094 GLint level,
3095 GLint layer)
3096{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003097 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003098 ASSERT(framebuffer);
3099
3100 if (texture != 0)
3101 {
3102 Texture *textureObject = getTexture(texture);
3103
3104 ImageIndex index = ImageIndex::MakeInvalid();
3105
3106 if (textureObject->getTarget() == GL_TEXTURE_3D)
3107 {
3108 index = ImageIndex::Make3D(level, layer);
3109 }
3110 else
3111 {
3112 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
3113 index = ImageIndex::Make2DArray(level, layer);
3114 }
3115
Jamie Madilla02315b2017-02-23 14:14:47 -05003116 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003117 }
3118 else
3119 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003120 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003121 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003122
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003123 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003124}
3125
Martin Radev137032d2017-07-13 10:11:12 +03003126void Context::framebufferTextureMultiviewLayeredANGLE(GLenum target,
3127 GLenum attachment,
3128 GLuint texture,
3129 GLint level,
3130 GLint baseViewIndex,
3131 GLsizei numViews)
3132{
Martin Radev82ef7742017-08-08 17:44:58 +03003133 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3134 ASSERT(framebuffer);
3135
3136 if (texture != 0)
3137 {
3138 Texture *textureObj = getTexture(texture);
3139
Martin Radev18b75ba2017-08-15 15:50:40 +03003140 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003141 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3142 numViews, baseViewIndex);
3143 }
3144 else
3145 {
3146 framebuffer->resetAttachment(this, attachment);
3147 }
3148
3149 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003150}
3151
3152void Context::framebufferTextureMultiviewSideBySideANGLE(GLenum target,
3153 GLenum attachment,
3154 GLuint texture,
3155 GLint level,
3156 GLsizei numViews,
3157 const GLint *viewportOffsets)
3158{
Martin Radev5dae57b2017-07-14 16:15:55 +03003159 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3160 ASSERT(framebuffer);
3161
3162 if (texture != 0)
3163 {
3164 Texture *textureObj = getTexture(texture);
3165
3166 ImageIndex index = ImageIndex::Make2D(level);
3167 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3168 textureObj, numViews, viewportOffsets);
3169 }
3170 else
3171 {
3172 framebuffer->resetAttachment(this, attachment);
3173 }
3174
3175 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003176}
3177
Jamie Madillc29968b2016-01-20 11:17:23 -05003178void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3179{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003180 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003181 ASSERT(framebuffer);
3182 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003183 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003184}
3185
3186void Context::readBuffer(GLenum mode)
3187{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003188 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003189 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003190 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003191}
3192
3193void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3194{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003195 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003196 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003197
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003198 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003199 ASSERT(framebuffer);
3200
3201 // The specification isn't clear what should be done when the framebuffer isn't complete.
3202 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003203 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003204}
3205
3206void Context::invalidateFramebuffer(GLenum target,
3207 GLsizei numAttachments,
3208 const GLenum *attachments)
3209{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003210 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003211 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003212
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003213 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003214 ASSERT(framebuffer);
3215
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003216 if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05003217 {
Jamie Madill437fa652016-05-03 15:13:24 -04003218 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003219 }
Jamie Madill437fa652016-05-03 15:13:24 -04003220
Jamie Madill4928b7c2017-06-20 12:57:39 -04003221 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003222}
3223
3224void Context::invalidateSubFramebuffer(GLenum target,
3225 GLsizei numAttachments,
3226 const GLenum *attachments,
3227 GLint x,
3228 GLint y,
3229 GLsizei width,
3230 GLsizei height)
3231{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003232 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003233 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003234
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003235 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003236 ASSERT(framebuffer);
3237
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003238 if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05003239 {
Jamie Madill437fa652016-05-03 15:13:24 -04003240 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003241 }
Jamie Madill437fa652016-05-03 15:13:24 -04003242
3243 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003244 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003245}
3246
Jamie Madill73a84962016-02-12 09:27:23 -05003247void Context::texImage2D(GLenum target,
3248 GLint level,
3249 GLint internalformat,
3250 GLsizei width,
3251 GLsizei height,
3252 GLint border,
3253 GLenum format,
3254 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003255 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003256{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003257 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003258
3259 Extents size(width, height, 1);
3260 Texture *texture =
3261 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003262 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3263 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003264}
3265
3266void Context::texImage3D(GLenum target,
3267 GLint level,
3268 GLint internalformat,
3269 GLsizei width,
3270 GLsizei height,
3271 GLsizei depth,
3272 GLint border,
3273 GLenum format,
3274 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003275 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003276{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003277 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003278
3279 Extents size(width, height, depth);
3280 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003281 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3282 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003283}
3284
3285void Context::texSubImage2D(GLenum target,
3286 GLint level,
3287 GLint xoffset,
3288 GLint yoffset,
3289 GLsizei width,
3290 GLsizei height,
3291 GLenum format,
3292 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003293 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003294{
3295 // Zero sized uploads are valid but no-ops
3296 if (width == 0 || height == 0)
3297 {
3298 return;
3299 }
3300
Jamie Madillad9f24e2016-02-12 09:27:24 -05003301 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003302
3303 Box area(xoffset, yoffset, 0, width, height, 1);
3304 Texture *texture =
3305 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003306 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3307 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003308}
3309
3310void Context::texSubImage3D(GLenum target,
3311 GLint level,
3312 GLint xoffset,
3313 GLint yoffset,
3314 GLint zoffset,
3315 GLsizei width,
3316 GLsizei height,
3317 GLsizei depth,
3318 GLenum format,
3319 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003320 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003321{
3322 // Zero sized uploads are valid but no-ops
3323 if (width == 0 || height == 0 || depth == 0)
3324 {
3325 return;
3326 }
3327
Jamie Madillad9f24e2016-02-12 09:27:24 -05003328 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003329
3330 Box area(xoffset, yoffset, zoffset, width, height, depth);
3331 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003332 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3333 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003334}
3335
3336void Context::compressedTexImage2D(GLenum target,
3337 GLint level,
3338 GLenum internalformat,
3339 GLsizei width,
3340 GLsizei height,
3341 GLint border,
3342 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003343 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003344{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003345 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003346
3347 Extents size(width, height, 1);
3348 Texture *texture =
3349 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003350 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003351 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003352 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003353}
3354
3355void Context::compressedTexImage3D(GLenum target,
3356 GLint level,
3357 GLenum internalformat,
3358 GLsizei width,
3359 GLsizei height,
3360 GLsizei depth,
3361 GLint border,
3362 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003363 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003364{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003365 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003366
3367 Extents size(width, height, depth);
3368 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003369 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003370 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003371 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003372}
3373
3374void Context::compressedTexSubImage2D(GLenum target,
3375 GLint level,
3376 GLint xoffset,
3377 GLint yoffset,
3378 GLsizei width,
3379 GLsizei height,
3380 GLenum format,
3381 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003382 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003383{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003384 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003385
3386 Box area(xoffset, yoffset, 0, width, height, 1);
3387 Texture *texture =
3388 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003389 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003390 format, imageSize,
3391 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003392}
3393
3394void Context::compressedTexSubImage3D(GLenum target,
3395 GLint level,
3396 GLint xoffset,
3397 GLint yoffset,
3398 GLint zoffset,
3399 GLsizei width,
3400 GLsizei height,
3401 GLsizei depth,
3402 GLenum format,
3403 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003404 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003405{
3406 // Zero sized uploads are valid but no-ops
3407 if (width == 0 || height == 0)
3408 {
3409 return;
3410 }
3411
Jamie Madillad9f24e2016-02-12 09:27:24 -05003412 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003413
3414 Box area(xoffset, yoffset, zoffset, width, height, depth);
3415 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003416 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003417 format, imageSize,
3418 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003419}
3420
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003421void Context::generateMipmap(GLenum target)
3422{
3423 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003424 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003425}
3426
Geoff Lang97073d12016-04-20 10:42:34 -07003427void Context::copyTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003428 GLint sourceLevel,
3429 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003430 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003431 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003432 GLint internalFormat,
3433 GLenum destType,
3434 GLboolean unpackFlipY,
3435 GLboolean unpackPremultiplyAlpha,
3436 GLboolean unpackUnmultiplyAlpha)
3437{
3438 syncStateForTexImage();
3439
3440 gl::Texture *sourceTexture = getTexture(sourceId);
3441 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05003442 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
3443 sourceLevel, ConvertToBool(unpackFlipY),
3444 ConvertToBool(unpackPremultiplyAlpha),
3445 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003446}
3447
3448void Context::copySubTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003449 GLint sourceLevel,
3450 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003451 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003452 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003453 GLint xoffset,
3454 GLint yoffset,
3455 GLint x,
3456 GLint y,
3457 GLsizei width,
3458 GLsizei height,
3459 GLboolean unpackFlipY,
3460 GLboolean unpackPremultiplyAlpha,
3461 GLboolean unpackUnmultiplyAlpha)
3462{
3463 // Zero sized copies are valid but no-ops
3464 if (width == 0 || height == 0)
3465 {
3466 return;
3467 }
3468
3469 syncStateForTexImage();
3470
3471 gl::Texture *sourceTexture = getTexture(sourceId);
3472 gl::Texture *destTexture = getTexture(destId);
3473 Offset offset(xoffset, yoffset, 0);
3474 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05003475 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
3476 ConvertToBool(unpackFlipY),
3477 ConvertToBool(unpackPremultiplyAlpha),
3478 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003479}
3480
Geoff Lang47110bf2016-04-20 11:13:22 -07003481void Context::compressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId)
3482{
3483 syncStateForTexImage();
3484
3485 gl::Texture *sourceTexture = getTexture(sourceId);
3486 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05003487 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07003488}
3489
Corentin Wallez336129f2017-10-17 15:55:40 -04003490void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003491{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003492 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003493 ASSERT(buffer);
3494
Geoff Lang496c02d2016-10-20 11:38:11 -07003495 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003496}
3497
Corentin Wallez336129f2017-10-17 15:55:40 -04003498void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003499{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003500 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003501 ASSERT(buffer);
3502
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003503 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003504 if (error.isError())
3505 {
Jamie Madill437fa652016-05-03 15:13:24 -04003506 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003507 return nullptr;
3508 }
3509
3510 return buffer->getMapPointer();
3511}
3512
Corentin Wallez336129f2017-10-17 15:55:40 -04003513GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003514{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003515 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003516 ASSERT(buffer);
3517
3518 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003519 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03003520 if (error.isError())
3521 {
Jamie Madill437fa652016-05-03 15:13:24 -04003522 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003523 return GL_FALSE;
3524 }
3525
3526 return result;
3527}
3528
Corentin Wallez336129f2017-10-17 15:55:40 -04003529void *Context::mapBufferRange(BufferBinding target,
3530 GLintptr offset,
3531 GLsizeiptr length,
3532 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003533{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003534 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003535 ASSERT(buffer);
3536
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003537 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003538 if (error.isError())
3539 {
Jamie Madill437fa652016-05-03 15:13:24 -04003540 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003541 return nullptr;
3542 }
3543
3544 return buffer->getMapPointer();
3545}
3546
Corentin Wallez336129f2017-10-17 15:55:40 -04003547void Context::flushMappedBufferRange(BufferBinding /*target*/,
3548 GLintptr /*offset*/,
3549 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03003550{
3551 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3552}
3553
Jamie Madillad9f24e2016-02-12 09:27:24 -05003554void Context::syncStateForReadPixels()
3555{
3556 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
3557}
3558
3559void Context::syncStateForTexImage()
3560{
3561 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
3562}
3563
3564void Context::syncStateForClear()
3565{
3566 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
3567}
3568
3569void Context::syncStateForBlit()
3570{
3571 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
3572}
3573
Jiajia Qin5451d532017-11-16 17:16:34 +08003574void Context::activeShaderProgram(GLuint pipeline, GLuint program)
3575{
3576 UNIMPLEMENTED();
3577}
3578
Jamie Madillc20ab272016-06-09 07:20:46 -07003579void Context::activeTexture(GLenum texture)
3580{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003581 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003582}
3583
Jamie Madill876429b2017-04-20 15:46:24 -04003584void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003585{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003586 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003587}
3588
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003589void Context::blendEquation(GLenum mode)
3590{
3591 mGLState.setBlendEquation(mode, mode);
3592}
3593
Jamie Madillc20ab272016-06-09 07:20:46 -07003594void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3595{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003596 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003597}
3598
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003599void Context::blendFunc(GLenum sfactor, GLenum dfactor)
3600{
3601 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
3602}
3603
Jamie Madillc20ab272016-06-09 07:20:46 -07003604void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3605{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003606 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003607}
3608
Jamie Madill876429b2017-04-20 15:46:24 -04003609void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003610{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003611 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003612}
3613
Jamie Madill876429b2017-04-20 15:46:24 -04003614void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07003615{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003616 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003617}
3618
3619void Context::clearStencil(GLint s)
3620{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003621 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003622}
3623
3624void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3625{
Geoff Lang92019432017-11-20 13:09:34 -05003626 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
3627 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003628}
3629
Corentin Wallez2e568cf2017-09-18 17:05:22 -04003630void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07003631{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003632 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003633}
3634
3635void Context::depthFunc(GLenum func)
3636{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003637 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003638}
3639
3640void Context::depthMask(GLboolean flag)
3641{
Geoff Lang92019432017-11-20 13:09:34 -05003642 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07003643}
3644
Jamie Madill876429b2017-04-20 15:46:24 -04003645void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07003646{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003647 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003648}
3649
3650void Context::disable(GLenum cap)
3651{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003652 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003653}
3654
3655void Context::disableVertexAttribArray(GLuint index)
3656{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003657 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003658}
3659
3660void Context::enable(GLenum cap)
3661{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003662 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003663}
3664
3665void Context::enableVertexAttribArray(GLuint index)
3666{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003667 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003668}
3669
3670void Context::frontFace(GLenum mode)
3671{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003672 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003673}
3674
3675void Context::hint(GLenum target, GLenum mode)
3676{
3677 switch (target)
3678 {
3679 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003680 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003681 break;
3682
3683 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003684 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003685 break;
3686
3687 default:
3688 UNREACHABLE();
3689 return;
3690 }
3691}
3692
3693void Context::lineWidth(GLfloat width)
3694{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003695 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003696}
3697
3698void Context::pixelStorei(GLenum pname, GLint param)
3699{
3700 switch (pname)
3701 {
3702 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003703 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003704 break;
3705
3706 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003707 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003708 break;
3709
3710 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003711 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003712 break;
3713
3714 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003715 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003716 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003717 break;
3718
3719 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003720 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003721 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003722 break;
3723
3724 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003725 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003726 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003727 break;
3728
3729 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003730 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003731 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003732 break;
3733
3734 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003735 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003736 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003737 break;
3738
3739 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003740 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003741 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003742 break;
3743
3744 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003745 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003746 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003747 break;
3748
3749 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003750 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003751 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003752 break;
3753
3754 default:
3755 UNREACHABLE();
3756 return;
3757 }
3758}
3759
3760void Context::polygonOffset(GLfloat factor, GLfloat units)
3761{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003762 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003763}
3764
Jamie Madill876429b2017-04-20 15:46:24 -04003765void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07003766{
Geoff Lang92019432017-11-20 13:09:34 -05003767 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07003768}
3769
Jiawei Shaodb342272017-09-27 10:21:45 +08003770void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
3771{
3772 mGLState.setSampleMaskParams(maskNumber, mask);
3773}
3774
Jamie Madillc20ab272016-06-09 07:20:46 -07003775void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3776{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003777 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003778}
3779
3780void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3781{
3782 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3783 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003784 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003785 }
3786
3787 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3788 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003789 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003790 }
3791}
3792
3793void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3794{
3795 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3796 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003797 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003798 }
3799
3800 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3801 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003802 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003803 }
3804}
3805
3806void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3807{
3808 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3809 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003810 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003811 }
3812
3813 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3814 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003815 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003816 }
3817}
3818
3819void Context::vertexAttrib1f(GLuint index, GLfloat x)
3820{
3821 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003822 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003823}
3824
3825void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3826{
3827 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003828 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003829}
3830
3831void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3832{
3833 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003834 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003835}
3836
3837void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3838{
3839 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003840 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003841}
3842
3843void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3844{
3845 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003846 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003847}
3848
3849void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3850{
3851 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003852 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003853}
3854
3855void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3856{
3857 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003858 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003859}
3860
3861void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3862{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003863 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003864}
3865
3866void Context::vertexAttribPointer(GLuint index,
3867 GLint size,
3868 GLenum type,
3869 GLboolean normalized,
3870 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003871 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07003872{
Corentin Wallez336129f2017-10-17 15:55:40 -04003873 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05003874 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07003875}
3876
Shao80957d92017-02-20 21:25:59 +08003877void Context::vertexAttribFormat(GLuint attribIndex,
3878 GLint size,
3879 GLenum type,
3880 GLboolean normalized,
3881 GLuint relativeOffset)
3882{
Geoff Lang92019432017-11-20 13:09:34 -05003883 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08003884 relativeOffset);
3885}
3886
3887void Context::vertexAttribIFormat(GLuint attribIndex,
3888 GLint size,
3889 GLenum type,
3890 GLuint relativeOffset)
3891{
3892 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
3893}
3894
3895void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
3896{
Shaodde78e82017-05-22 14:13:27 +08003897 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08003898}
3899
Jiajia Qin5451d532017-11-16 17:16:34 +08003900void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08003901{
3902 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
3903}
3904
Jamie Madillc20ab272016-06-09 07:20:46 -07003905void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
3906{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003907 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003908}
3909
3910void Context::vertexAttribIPointer(GLuint index,
3911 GLint size,
3912 GLenum type,
3913 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003914 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07003915{
Corentin Wallez336129f2017-10-17 15:55:40 -04003916 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
3917 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07003918}
3919
3920void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
3921{
3922 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003923 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003924}
3925
3926void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
3927{
3928 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003929 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003930}
3931
3932void Context::vertexAttribI4iv(GLuint index, const GLint *v)
3933{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003934 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003935}
3936
3937void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
3938{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003939 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003940}
3941
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003942void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
3943{
3944 const VertexAttribCurrentValueData &currentValues =
3945 getGLState().getVertexAttribCurrentValue(index);
3946 const VertexArray *vao = getGLState().getVertexArray();
3947 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3948 currentValues, pname, params);
3949}
3950
3951void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
3952{
3953 const VertexAttribCurrentValueData &currentValues =
3954 getGLState().getVertexAttribCurrentValue(index);
3955 const VertexArray *vao = getGLState().getVertexArray();
3956 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3957 currentValues, pname, params);
3958}
3959
3960void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
3961{
3962 const VertexAttribCurrentValueData &currentValues =
3963 getGLState().getVertexAttribCurrentValue(index);
3964 const VertexArray *vao = getGLState().getVertexArray();
3965 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3966 currentValues, pname, params);
3967}
3968
3969void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
3970{
3971 const VertexAttribCurrentValueData &currentValues =
3972 getGLState().getVertexAttribCurrentValue(index);
3973 const VertexArray *vao = getGLState().getVertexArray();
3974 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3975 currentValues, pname, params);
3976}
3977
Jamie Madill876429b2017-04-20 15:46:24 -04003978void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003979{
3980 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
3981 QueryVertexAttribPointerv(attrib, pname, pointer);
3982}
3983
Jamie Madillc20ab272016-06-09 07:20:46 -07003984void Context::debugMessageControl(GLenum source,
3985 GLenum type,
3986 GLenum severity,
3987 GLsizei count,
3988 const GLuint *ids,
3989 GLboolean enabled)
3990{
3991 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003992 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05003993 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07003994}
3995
3996void Context::debugMessageInsert(GLenum source,
3997 GLenum type,
3998 GLuint id,
3999 GLenum severity,
4000 GLsizei length,
4001 const GLchar *buf)
4002{
4003 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004004 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07004005}
4006
4007void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
4008{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004009 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07004010}
4011
4012GLuint Context::getDebugMessageLog(GLuint count,
4013 GLsizei bufSize,
4014 GLenum *sources,
4015 GLenum *types,
4016 GLuint *ids,
4017 GLenum *severities,
4018 GLsizei *lengths,
4019 GLchar *messageLog)
4020{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004021 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4022 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004023}
4024
4025void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4026{
4027 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004028 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004029 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004030}
4031
4032void Context::popDebugGroup()
4033{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004034 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004035 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004036}
4037
Corentin Wallez336129f2017-10-17 15:55:40 -04004038void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004039{
4040 Buffer *buffer = mGLState.getTargetBuffer(target);
4041 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004042 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004043}
4044
Corentin Wallez336129f2017-10-17 15:55:40 -04004045void Context::bufferSubData(BufferBinding target,
4046 GLintptr offset,
4047 GLsizeiptr size,
4048 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004049{
4050 if (data == nullptr)
4051 {
4052 return;
4053 }
4054
4055 Buffer *buffer = mGLState.getTargetBuffer(target);
4056 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004057 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004058}
4059
Jamie Madillef300b12016-10-07 15:12:09 -04004060void Context::attachShader(GLuint program, GLuint shader)
4061{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004062 Program *programObject = mState.mShaderPrograms->getProgram(program);
4063 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004064 ASSERT(programObject && shaderObject);
4065 programObject->attachShader(shaderObject);
4066}
4067
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004068const Workarounds &Context::getWorkarounds() const
4069{
4070 return mWorkarounds;
4071}
4072
Corentin Wallez336129f2017-10-17 15:55:40 -04004073void Context::copyBufferSubData(BufferBinding readTarget,
4074 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004075 GLintptr readOffset,
4076 GLintptr writeOffset,
4077 GLsizeiptr size)
4078{
4079 // if size is zero, the copy is a successful no-op
4080 if (size == 0)
4081 {
4082 return;
4083 }
4084
4085 // TODO(jmadill): cache these.
4086 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4087 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4088
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004089 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004090}
4091
Jamie Madill01a80ee2016-11-07 12:06:18 -05004092void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4093{
4094 Program *programObject = getProgram(program);
4095 // TODO(jmadill): Re-use this from the validation if possible.
4096 ASSERT(programObject);
4097 programObject->bindAttributeLocation(index, name);
4098}
4099
Corentin Wallez336129f2017-10-17 15:55:40 -04004100void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004101{
Corentin Wallez336129f2017-10-17 15:55:40 -04004102 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4103 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004104}
4105
Corentin Wallez336129f2017-10-17 15:55:40 -04004106void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004107{
4108 bindBufferRange(target, index, buffer, 0, 0);
4109}
4110
Corentin Wallez336129f2017-10-17 15:55:40 -04004111void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004112 GLuint index,
4113 GLuint buffer,
4114 GLintptr offset,
4115 GLsizeiptr size)
4116{
Corentin Wallez336129f2017-10-17 15:55:40 -04004117 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4118 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004119}
4120
Jamie Madill01a80ee2016-11-07 12:06:18 -05004121void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4122{
4123 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4124 {
4125 bindReadFramebuffer(framebuffer);
4126 }
4127
4128 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4129 {
4130 bindDrawFramebuffer(framebuffer);
4131 }
4132}
4133
4134void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4135{
4136 ASSERT(target == GL_RENDERBUFFER);
4137 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004138 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004139 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004140}
4141
JiangYizhoubddc46b2016-12-09 09:50:51 +08004142void Context::texStorage2DMultisample(GLenum target,
4143 GLsizei samples,
4144 GLenum internalformat,
4145 GLsizei width,
4146 GLsizei height,
4147 GLboolean fixedsamplelocations)
4148{
4149 Extents size(width, height, 1);
4150 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004151 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
Geoff Lang92019432017-11-20 13:09:34 -05004152 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004153}
4154
4155void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4156{
JiangYizhou5b03f472017-01-09 10:22:53 +08004157 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4158 // the sample position should be queried by DRAW_FRAMEBUFFER.
4159 mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER);
4160 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004161
4162 switch (pname)
4163 {
4164 case GL_SAMPLE_POSITION:
4165 handleError(framebuffer->getSamplePosition(index, val));
4166 break;
4167 default:
4168 UNREACHABLE();
4169 }
4170}
4171
Jamie Madille8fb6402017-02-14 17:56:40 -05004172void Context::renderbufferStorage(GLenum target,
4173 GLenum internalformat,
4174 GLsizei width,
4175 GLsizei height)
4176{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004177 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4178 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4179
Jamie Madille8fb6402017-02-14 17:56:40 -05004180 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004181 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004182}
4183
4184void Context::renderbufferStorageMultisample(GLenum target,
4185 GLsizei samples,
4186 GLenum internalformat,
4187 GLsizei width,
4188 GLsizei height)
4189{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004190 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4191 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004192
4193 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004194 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004195 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004196}
4197
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004198void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4199{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004200 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004201 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004202}
4203
JiangYizhoue18e6392017-02-20 10:32:23 +08004204void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4205{
4206 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4207 QueryFramebufferParameteriv(framebuffer, pname, params);
4208}
4209
Jiajia Qin5451d532017-11-16 17:16:34 +08004210void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004211{
4212 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4213 SetFramebufferParameteri(framebuffer, pname, param);
4214}
4215
Jamie Madillb3f26b92017-07-19 15:07:41 -04004216Error Context::getScratchBuffer(size_t requstedSizeBytes,
4217 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004218{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004219 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4220 {
4221 return OutOfMemory() << "Failed to allocate internal buffer.";
4222 }
4223 return NoError();
4224}
4225
4226Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4227 angle::MemoryBuffer **zeroBufferOut) const
4228{
4229 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004230 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004231 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004232 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004233 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004234}
4235
Xinghua Cao10a4d432017-11-28 14:46:26 +08004236Error Context::prepareForDispatch()
4237{
4238 syncRendererState(mComputeDirtyBits, mComputeDirtyObjects);
4239
4240 if (isRobustResourceInitEnabled())
4241 {
4242 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
4243 }
4244
4245 return NoError();
4246}
4247
Xinghua Cao2b396592017-03-29 15:36:04 +08004248void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4249{
4250 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4251 {
4252 return;
4253 }
4254
Xinghua Cao10a4d432017-11-28 14:46:26 +08004255 ANGLE_CONTEXT_TRY(prepareForDispatch());
Jamie Madill71c88b32017-09-14 22:20:29 -04004256 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004257}
4258
Jiajia Qin5451d532017-11-16 17:16:34 +08004259void Context::dispatchComputeIndirect(GLintptr indirect)
4260{
Qin Jiajia62fcf622017-11-30 16:16:12 +08004261 ANGLE_CONTEXT_TRY(prepareForDispatch());
4262 handleError(mImplementation->dispatchComputeIndirect(this, indirect));
Jiajia Qin5451d532017-11-16 17:16:34 +08004263}
4264
JiangYizhou165361c2017-06-07 14:56:57 +08004265void Context::texStorage2D(GLenum target,
4266 GLsizei levels,
4267 GLenum internalFormat,
4268 GLsizei width,
4269 GLsizei height)
4270{
4271 Extents size(width, height, 1);
4272 Texture *texture = getTargetTexture(target);
4273 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4274}
4275
4276void Context::texStorage3D(GLenum target,
4277 GLsizei levels,
4278 GLenum internalFormat,
4279 GLsizei width,
4280 GLsizei height,
4281 GLsizei depth)
4282{
4283 Extents size(width, height, depth);
4284 Texture *texture = getTargetTexture(target);
4285 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4286}
4287
Jiajia Qin5451d532017-11-16 17:16:34 +08004288void Context::memoryBarrier(GLbitfield barriers)
4289{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004290 handleError(mImplementation->memoryBarrier(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004291}
4292
4293void Context::memoryBarrierByRegion(GLbitfield barriers)
4294{
Xinghua Cao89c422a2017-11-29 18:24:20 +08004295 handleError(mImplementation->memoryBarrierByRegion(this, barriers));
Jiajia Qin5451d532017-11-16 17:16:34 +08004296}
4297
Jamie Madillc1d770e2017-04-13 17:31:24 -04004298GLenum Context::checkFramebufferStatus(GLenum target)
4299{
4300 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4301 ASSERT(framebuffer);
4302
4303 return framebuffer->checkStatus(this);
4304}
4305
4306void Context::compileShader(GLuint shader)
4307{
4308 Shader *shaderObject = GetValidShader(this, shader);
4309 if (!shaderObject)
4310 {
4311 return;
4312 }
4313 shaderObject->compile(this);
4314}
4315
4316void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4317{
4318 for (int i = 0; i < n; i++)
4319 {
4320 deleteBuffer(buffers[i]);
4321 }
4322}
4323
4324void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4325{
4326 for (int i = 0; i < n; i++)
4327 {
4328 if (framebuffers[i] != 0)
4329 {
4330 deleteFramebuffer(framebuffers[i]);
4331 }
4332 }
4333}
4334
4335void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4336{
4337 for (int i = 0; i < n; i++)
4338 {
4339 deleteRenderbuffer(renderbuffers[i]);
4340 }
4341}
4342
4343void Context::deleteTextures(GLsizei n, const GLuint *textures)
4344{
4345 for (int i = 0; i < n; i++)
4346 {
4347 if (textures[i] != 0)
4348 {
4349 deleteTexture(textures[i]);
4350 }
4351 }
4352}
4353
4354void Context::detachShader(GLuint program, GLuint shader)
4355{
4356 Program *programObject = getProgram(program);
4357 ASSERT(programObject);
4358
4359 Shader *shaderObject = getShader(shader);
4360 ASSERT(shaderObject);
4361
4362 programObject->detachShader(this, shaderObject);
4363}
4364
4365void Context::genBuffers(GLsizei n, GLuint *buffers)
4366{
4367 for (int i = 0; i < n; i++)
4368 {
4369 buffers[i] = createBuffer();
4370 }
4371}
4372
4373void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
4374{
4375 for (int i = 0; i < n; i++)
4376 {
4377 framebuffers[i] = createFramebuffer();
4378 }
4379}
4380
4381void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
4382{
4383 for (int i = 0; i < n; i++)
4384 {
4385 renderbuffers[i] = createRenderbuffer();
4386 }
4387}
4388
4389void Context::genTextures(GLsizei n, GLuint *textures)
4390{
4391 for (int i = 0; i < n; i++)
4392 {
4393 textures[i] = createTexture();
4394 }
4395}
4396
4397void Context::getActiveAttrib(GLuint program,
4398 GLuint index,
4399 GLsizei bufsize,
4400 GLsizei *length,
4401 GLint *size,
4402 GLenum *type,
4403 GLchar *name)
4404{
4405 Program *programObject = getProgram(program);
4406 ASSERT(programObject);
4407 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
4408}
4409
4410void Context::getActiveUniform(GLuint program,
4411 GLuint index,
4412 GLsizei bufsize,
4413 GLsizei *length,
4414 GLint *size,
4415 GLenum *type,
4416 GLchar *name)
4417{
4418 Program *programObject = getProgram(program);
4419 ASSERT(programObject);
4420 programObject->getActiveUniform(index, bufsize, length, size, type, name);
4421}
4422
4423void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
4424{
4425 Program *programObject = getProgram(program);
4426 ASSERT(programObject);
4427 programObject->getAttachedShaders(maxcount, count, shaders);
4428}
4429
4430GLint Context::getAttribLocation(GLuint program, const GLchar *name)
4431{
4432 Program *programObject = getProgram(program);
4433 ASSERT(programObject);
4434 return programObject->getAttributeLocation(name);
4435}
4436
4437void Context::getBooleanv(GLenum pname, GLboolean *params)
4438{
4439 GLenum nativeType;
4440 unsigned int numParams = 0;
4441 getQueryParameterInfo(pname, &nativeType, &numParams);
4442
4443 if (nativeType == GL_BOOL)
4444 {
4445 getBooleanvImpl(pname, params);
4446 }
4447 else
4448 {
4449 CastStateValues(this, nativeType, pname, numParams, params);
4450 }
4451}
4452
4453void Context::getFloatv(GLenum pname, GLfloat *params)
4454{
4455 GLenum nativeType;
4456 unsigned int numParams = 0;
4457 getQueryParameterInfo(pname, &nativeType, &numParams);
4458
4459 if (nativeType == GL_FLOAT)
4460 {
4461 getFloatvImpl(pname, params);
4462 }
4463 else
4464 {
4465 CastStateValues(this, nativeType, pname, numParams, params);
4466 }
4467}
4468
4469void Context::getIntegerv(GLenum pname, GLint *params)
4470{
4471 GLenum nativeType;
4472 unsigned int numParams = 0;
4473 getQueryParameterInfo(pname, &nativeType, &numParams);
4474
4475 if (nativeType == GL_INT)
4476 {
4477 getIntegervImpl(pname, params);
4478 }
4479 else
4480 {
4481 CastStateValues(this, nativeType, pname, numParams, params);
4482 }
4483}
4484
4485void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
4486{
4487 Program *programObject = getProgram(program);
4488 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04004489 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004490}
4491
Jiajia Qin5451d532017-11-16 17:16:34 +08004492void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
4493{
4494 UNIMPLEMENTED();
4495}
4496
Jamie Madillbe849e42017-05-02 15:49:00 -04004497void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004498{
4499 Program *programObject = getProgram(program);
4500 ASSERT(programObject);
4501 programObject->getInfoLog(bufsize, length, infolog);
4502}
4503
Jiajia Qin5451d532017-11-16 17:16:34 +08004504void Context::getProgramPipelineInfoLog(GLuint pipeline,
4505 GLsizei bufSize,
4506 GLsizei *length,
4507 GLchar *infoLog)
4508{
4509 UNIMPLEMENTED();
4510}
4511
Jamie Madillc1d770e2017-04-13 17:31:24 -04004512void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
4513{
4514 Shader *shaderObject = getShader(shader);
4515 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004516 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004517}
4518
4519void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
4520{
4521 Shader *shaderObject = getShader(shader);
4522 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004523 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004524}
4525
4526void Context::getShaderPrecisionFormat(GLenum shadertype,
4527 GLenum precisiontype,
4528 GLint *range,
4529 GLint *precision)
4530{
4531 // TODO(jmadill): Compute shaders.
4532
4533 switch (shadertype)
4534 {
4535 case GL_VERTEX_SHADER:
4536 switch (precisiontype)
4537 {
4538 case GL_LOW_FLOAT:
4539 mCaps.vertexLowpFloat.get(range, precision);
4540 break;
4541 case GL_MEDIUM_FLOAT:
4542 mCaps.vertexMediumpFloat.get(range, precision);
4543 break;
4544 case GL_HIGH_FLOAT:
4545 mCaps.vertexHighpFloat.get(range, precision);
4546 break;
4547
4548 case GL_LOW_INT:
4549 mCaps.vertexLowpInt.get(range, precision);
4550 break;
4551 case GL_MEDIUM_INT:
4552 mCaps.vertexMediumpInt.get(range, precision);
4553 break;
4554 case GL_HIGH_INT:
4555 mCaps.vertexHighpInt.get(range, precision);
4556 break;
4557
4558 default:
4559 UNREACHABLE();
4560 return;
4561 }
4562 break;
4563
4564 case GL_FRAGMENT_SHADER:
4565 switch (precisiontype)
4566 {
4567 case GL_LOW_FLOAT:
4568 mCaps.fragmentLowpFloat.get(range, precision);
4569 break;
4570 case GL_MEDIUM_FLOAT:
4571 mCaps.fragmentMediumpFloat.get(range, precision);
4572 break;
4573 case GL_HIGH_FLOAT:
4574 mCaps.fragmentHighpFloat.get(range, precision);
4575 break;
4576
4577 case GL_LOW_INT:
4578 mCaps.fragmentLowpInt.get(range, precision);
4579 break;
4580 case GL_MEDIUM_INT:
4581 mCaps.fragmentMediumpInt.get(range, precision);
4582 break;
4583 case GL_HIGH_INT:
4584 mCaps.fragmentHighpInt.get(range, precision);
4585 break;
4586
4587 default:
4588 UNREACHABLE();
4589 return;
4590 }
4591 break;
4592
4593 default:
4594 UNREACHABLE();
4595 return;
4596 }
4597}
4598
4599void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
4600{
4601 Shader *shaderObject = getShader(shader);
4602 ASSERT(shaderObject);
4603 shaderObject->getSource(bufsize, length, source);
4604}
4605
4606void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
4607{
4608 Program *programObject = getProgram(program);
4609 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004610 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004611}
4612
4613void Context::getUniformiv(GLuint program, GLint location, GLint *params)
4614{
4615 Program *programObject = getProgram(program);
4616 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004617 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004618}
4619
4620GLint Context::getUniformLocation(GLuint program, const GLchar *name)
4621{
4622 Program *programObject = getProgram(program);
4623 ASSERT(programObject);
4624 return programObject->getUniformLocation(name);
4625}
4626
4627GLboolean Context::isBuffer(GLuint buffer)
4628{
4629 if (buffer == 0)
4630 {
4631 return GL_FALSE;
4632 }
4633
4634 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
4635}
4636
4637GLboolean Context::isEnabled(GLenum cap)
4638{
4639 return mGLState.getEnableFeature(cap);
4640}
4641
4642GLboolean Context::isFramebuffer(GLuint framebuffer)
4643{
4644 if (framebuffer == 0)
4645 {
4646 return GL_FALSE;
4647 }
4648
4649 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
4650}
4651
4652GLboolean Context::isProgram(GLuint program)
4653{
4654 if (program == 0)
4655 {
4656 return GL_FALSE;
4657 }
4658
4659 return (getProgram(program) ? GL_TRUE : GL_FALSE);
4660}
4661
4662GLboolean Context::isRenderbuffer(GLuint renderbuffer)
4663{
4664 if (renderbuffer == 0)
4665 {
4666 return GL_FALSE;
4667 }
4668
4669 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
4670}
4671
4672GLboolean Context::isShader(GLuint shader)
4673{
4674 if (shader == 0)
4675 {
4676 return GL_FALSE;
4677 }
4678
4679 return (getShader(shader) ? GL_TRUE : GL_FALSE);
4680}
4681
4682GLboolean Context::isTexture(GLuint texture)
4683{
4684 if (texture == 0)
4685 {
4686 return GL_FALSE;
4687 }
4688
4689 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
4690}
4691
4692void Context::linkProgram(GLuint program)
4693{
4694 Program *programObject = getProgram(program);
4695 ASSERT(programObject);
4696 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03004697 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004698}
4699
4700void Context::releaseShaderCompiler()
4701{
Jamie Madill4928b7c2017-06-20 12:57:39 -04004702 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004703}
4704
4705void Context::shaderBinary(GLsizei n,
4706 const GLuint *shaders,
4707 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04004708 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04004709 GLsizei length)
4710{
4711 // No binary shader formats are supported.
4712 UNIMPLEMENTED();
4713}
4714
4715void Context::shaderSource(GLuint shader,
4716 GLsizei count,
4717 const GLchar *const *string,
4718 const GLint *length)
4719{
4720 Shader *shaderObject = getShader(shader);
4721 ASSERT(shaderObject);
4722 shaderObject->setSource(count, string, length);
4723}
4724
4725void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
4726{
4727 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4728}
4729
4730void Context::stencilMask(GLuint mask)
4731{
4732 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4733}
4734
4735void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4736{
4737 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4738}
4739
4740void Context::uniform1f(GLint location, GLfloat x)
4741{
4742 Program *program = mGLState.getProgram();
4743 program->setUniform1fv(location, 1, &x);
4744}
4745
4746void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
4747{
4748 Program *program = mGLState.getProgram();
4749 program->setUniform1fv(location, count, v);
4750}
4751
4752void Context::uniform1i(GLint location, GLint x)
4753{
4754 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004755 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
4756 {
4757 mGLState.setObjectDirty(GL_PROGRAM);
4758 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004759}
4760
4761void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
4762{
4763 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004764 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
4765 {
4766 mGLState.setObjectDirty(GL_PROGRAM);
4767 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004768}
4769
4770void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
4771{
4772 GLfloat xy[2] = {x, y};
4773 Program *program = mGLState.getProgram();
4774 program->setUniform2fv(location, 1, xy);
4775}
4776
4777void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
4778{
4779 Program *program = mGLState.getProgram();
4780 program->setUniform2fv(location, count, v);
4781}
4782
4783void Context::uniform2i(GLint location, GLint x, GLint y)
4784{
4785 GLint xy[2] = {x, y};
4786 Program *program = mGLState.getProgram();
4787 program->setUniform2iv(location, 1, xy);
4788}
4789
4790void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
4791{
4792 Program *program = mGLState.getProgram();
4793 program->setUniform2iv(location, count, v);
4794}
4795
4796void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4797{
4798 GLfloat xyz[3] = {x, y, z};
4799 Program *program = mGLState.getProgram();
4800 program->setUniform3fv(location, 1, xyz);
4801}
4802
4803void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
4804{
4805 Program *program = mGLState.getProgram();
4806 program->setUniform3fv(location, count, v);
4807}
4808
4809void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
4810{
4811 GLint xyz[3] = {x, y, z};
4812 Program *program = mGLState.getProgram();
4813 program->setUniform3iv(location, 1, xyz);
4814}
4815
4816void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
4817{
4818 Program *program = mGLState.getProgram();
4819 program->setUniform3iv(location, count, v);
4820}
4821
4822void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4823{
4824 GLfloat xyzw[4] = {x, y, z, w};
4825 Program *program = mGLState.getProgram();
4826 program->setUniform4fv(location, 1, xyzw);
4827}
4828
4829void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
4830{
4831 Program *program = mGLState.getProgram();
4832 program->setUniform4fv(location, count, v);
4833}
4834
4835void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4836{
4837 GLint xyzw[4] = {x, y, z, w};
4838 Program *program = mGLState.getProgram();
4839 program->setUniform4iv(location, 1, xyzw);
4840}
4841
4842void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
4843{
4844 Program *program = mGLState.getProgram();
4845 program->setUniform4iv(location, count, v);
4846}
4847
4848void Context::uniformMatrix2fv(GLint location,
4849 GLsizei count,
4850 GLboolean transpose,
4851 const GLfloat *value)
4852{
4853 Program *program = mGLState.getProgram();
4854 program->setUniformMatrix2fv(location, count, transpose, value);
4855}
4856
4857void Context::uniformMatrix3fv(GLint location,
4858 GLsizei count,
4859 GLboolean transpose,
4860 const GLfloat *value)
4861{
4862 Program *program = mGLState.getProgram();
4863 program->setUniformMatrix3fv(location, count, transpose, value);
4864}
4865
4866void Context::uniformMatrix4fv(GLint location,
4867 GLsizei count,
4868 GLboolean transpose,
4869 const GLfloat *value)
4870{
4871 Program *program = mGLState.getProgram();
4872 program->setUniformMatrix4fv(location, count, transpose, value);
4873}
4874
4875void Context::validateProgram(GLuint program)
4876{
4877 Program *programObject = getProgram(program);
4878 ASSERT(programObject);
4879 programObject->validate(mCaps);
4880}
4881
Jiajia Qin5451d532017-11-16 17:16:34 +08004882void Context::validateProgramPipeline(GLuint pipeline)
4883{
4884 UNIMPLEMENTED();
4885}
4886
Jamie Madilld04908b2017-06-09 14:15:35 -04004887void Context::getProgramBinary(GLuint program,
4888 GLsizei bufSize,
4889 GLsizei *length,
4890 GLenum *binaryFormat,
4891 void *binary)
4892{
4893 Program *programObject = getProgram(program);
4894 ASSERT(programObject != nullptr);
4895
4896 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
4897}
4898
4899void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
4900{
4901 Program *programObject = getProgram(program);
4902 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04004903
Jamie Madilld04908b2017-06-09 14:15:35 -04004904 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
4905}
4906
Jamie Madillff325f12017-08-26 15:06:05 -04004907void Context::uniform1ui(GLint location, GLuint v0)
4908{
4909 Program *program = mGLState.getProgram();
4910 program->setUniform1uiv(location, 1, &v0);
4911}
4912
4913void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
4914{
4915 Program *program = mGLState.getProgram();
4916 const GLuint xy[] = {v0, v1};
4917 program->setUniform2uiv(location, 1, xy);
4918}
4919
4920void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
4921{
4922 Program *program = mGLState.getProgram();
4923 const GLuint xyz[] = {v0, v1, v2};
4924 program->setUniform3uiv(location, 1, xyz);
4925}
4926
4927void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
4928{
4929 Program *program = mGLState.getProgram();
4930 const GLuint xyzw[] = {v0, v1, v2, v3};
4931 program->setUniform4uiv(location, 1, xyzw);
4932}
4933
4934void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
4935{
4936 Program *program = mGLState.getProgram();
4937 program->setUniform1uiv(location, count, value);
4938}
4939void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
4940{
4941 Program *program = mGLState.getProgram();
4942 program->setUniform2uiv(location, count, value);
4943}
4944
4945void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
4946{
4947 Program *program = mGLState.getProgram();
4948 program->setUniform3uiv(location, count, value);
4949}
4950
4951void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
4952{
4953 Program *program = mGLState.getProgram();
4954 program->setUniform4uiv(location, count, value);
4955}
4956
Jamie Madillf0e04492017-08-26 15:28:42 -04004957void Context::genQueries(GLsizei n, GLuint *ids)
4958{
4959 for (GLsizei i = 0; i < n; i++)
4960 {
4961 GLuint handle = mQueryHandleAllocator.allocate();
4962 mQueryMap.assign(handle, nullptr);
4963 ids[i] = handle;
4964 }
4965}
4966
4967void Context::deleteQueries(GLsizei n, const GLuint *ids)
4968{
4969 for (int i = 0; i < n; i++)
4970 {
4971 GLuint query = ids[i];
4972
4973 Query *queryObject = nullptr;
4974 if (mQueryMap.erase(query, &queryObject))
4975 {
4976 mQueryHandleAllocator.release(query);
4977 if (queryObject)
4978 {
4979 queryObject->release(this);
4980 }
4981 }
4982 }
4983}
4984
4985GLboolean Context::isQuery(GLuint id)
4986{
4987 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
4988}
4989
Jamie Madillc8c95812017-08-26 18:40:09 -04004990void Context::uniformMatrix2x3fv(GLint location,
4991 GLsizei count,
4992 GLboolean transpose,
4993 const GLfloat *value)
4994{
4995 Program *program = mGLState.getProgram();
4996 program->setUniformMatrix2x3fv(location, count, transpose, value);
4997}
4998
4999void Context::uniformMatrix3x2fv(GLint location,
5000 GLsizei count,
5001 GLboolean transpose,
5002 const GLfloat *value)
5003{
5004 Program *program = mGLState.getProgram();
5005 program->setUniformMatrix3x2fv(location, count, transpose, value);
5006}
5007
5008void Context::uniformMatrix2x4fv(GLint location,
5009 GLsizei count,
5010 GLboolean transpose,
5011 const GLfloat *value)
5012{
5013 Program *program = mGLState.getProgram();
5014 program->setUniformMatrix2x4fv(location, count, transpose, value);
5015}
5016
5017void Context::uniformMatrix4x2fv(GLint location,
5018 GLsizei count,
5019 GLboolean transpose,
5020 const GLfloat *value)
5021{
5022 Program *program = mGLState.getProgram();
5023 program->setUniformMatrix4x2fv(location, count, transpose, value);
5024}
5025
5026void Context::uniformMatrix3x4fv(GLint location,
5027 GLsizei count,
5028 GLboolean transpose,
5029 const GLfloat *value)
5030{
5031 Program *program = mGLState.getProgram();
5032 program->setUniformMatrix3x4fv(location, count, transpose, value);
5033}
5034
5035void Context::uniformMatrix4x3fv(GLint location,
5036 GLsizei count,
5037 GLboolean transpose,
5038 const GLfloat *value)
5039{
5040 Program *program = mGLState.getProgram();
5041 program->setUniformMatrix4x3fv(location, count, transpose, value);
5042}
5043
Jamie Madilld7576732017-08-26 18:49:50 -04005044void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5045{
5046 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5047 {
5048 GLuint vertexArray = arrays[arrayIndex];
5049
5050 if (arrays[arrayIndex] != 0)
5051 {
5052 VertexArray *vertexArrayObject = nullptr;
5053 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5054 {
5055 if (vertexArrayObject != nullptr)
5056 {
5057 detachVertexArray(vertexArray);
5058 vertexArrayObject->onDestroy(this);
5059 }
5060
5061 mVertexArrayHandleAllocator.release(vertexArray);
5062 }
5063 }
5064 }
5065}
5066
5067void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5068{
5069 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5070 {
5071 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5072 mVertexArrayMap.assign(vertexArray, nullptr);
5073 arrays[arrayIndex] = vertexArray;
5074 }
5075}
5076
5077bool Context::isVertexArray(GLuint array)
5078{
5079 if (array == 0)
5080 {
5081 return GL_FALSE;
5082 }
5083
5084 VertexArray *vao = getVertexArray(array);
5085 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5086}
5087
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005088void Context::endTransformFeedback()
5089{
5090 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5091 transformFeedback->end(this);
5092}
5093
5094void Context::transformFeedbackVaryings(GLuint program,
5095 GLsizei count,
5096 const GLchar *const *varyings,
5097 GLenum bufferMode)
5098{
5099 Program *programObject = getProgram(program);
5100 ASSERT(programObject);
5101 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5102}
5103
5104void Context::getTransformFeedbackVarying(GLuint program,
5105 GLuint index,
5106 GLsizei bufSize,
5107 GLsizei *length,
5108 GLsizei *size,
5109 GLenum *type,
5110 GLchar *name)
5111{
5112 Program *programObject = getProgram(program);
5113 ASSERT(programObject);
5114 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5115}
5116
5117void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5118{
5119 for (int i = 0; i < n; i++)
5120 {
5121 GLuint transformFeedback = ids[i];
5122 if (transformFeedback == 0)
5123 {
5124 continue;
5125 }
5126
5127 TransformFeedback *transformFeedbackObject = nullptr;
5128 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5129 {
5130 if (transformFeedbackObject != nullptr)
5131 {
5132 detachTransformFeedback(transformFeedback);
5133 transformFeedbackObject->release(this);
5134 }
5135
5136 mTransformFeedbackHandleAllocator.release(transformFeedback);
5137 }
5138 }
5139}
5140
5141void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5142{
5143 for (int i = 0; i < n; i++)
5144 {
5145 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5146 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5147 ids[i] = transformFeedback;
5148 }
5149}
5150
5151bool Context::isTransformFeedback(GLuint id)
5152{
5153 if (id == 0)
5154 {
5155 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5156 // returns FALSE
5157 return GL_FALSE;
5158 }
5159
5160 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5161 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5162}
5163
5164void Context::pauseTransformFeedback()
5165{
5166 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5167 transformFeedback->pause();
5168}
5169
5170void Context::resumeTransformFeedback()
5171{
5172 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5173 transformFeedback->resume();
5174}
5175
Jamie Madill12e957f2017-08-26 21:42:26 -04005176void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5177{
5178 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005179 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005180}
5181
5182GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5183{
5184 const Program *programObject = getProgram(program);
5185 return programObject->getFragDataLocation(name);
5186}
5187
5188void Context::getUniformIndices(GLuint program,
5189 GLsizei uniformCount,
5190 const GLchar *const *uniformNames,
5191 GLuint *uniformIndices)
5192{
5193 const Program *programObject = getProgram(program);
5194 if (!programObject->isLinked())
5195 {
5196 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5197 {
5198 uniformIndices[uniformId] = GL_INVALID_INDEX;
5199 }
5200 }
5201 else
5202 {
5203 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5204 {
5205 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5206 }
5207 }
5208}
5209
5210void Context::getActiveUniformsiv(GLuint program,
5211 GLsizei uniformCount,
5212 const GLuint *uniformIndices,
5213 GLenum pname,
5214 GLint *params)
5215{
5216 const Program *programObject = getProgram(program);
5217 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5218 {
5219 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005220 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005221 }
5222}
5223
5224GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5225{
5226 const Program *programObject = getProgram(program);
5227 return programObject->getUniformBlockIndex(uniformBlockName);
5228}
5229
5230void Context::getActiveUniformBlockiv(GLuint program,
5231 GLuint uniformBlockIndex,
5232 GLenum pname,
5233 GLint *params)
5234{
5235 const Program *programObject = getProgram(program);
5236 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5237}
5238
5239void Context::getActiveUniformBlockName(GLuint program,
5240 GLuint uniformBlockIndex,
5241 GLsizei bufSize,
5242 GLsizei *length,
5243 GLchar *uniformBlockName)
5244{
5245 const Program *programObject = getProgram(program);
5246 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5247}
5248
5249void Context::uniformBlockBinding(GLuint program,
5250 GLuint uniformBlockIndex,
5251 GLuint uniformBlockBinding)
5252{
5253 Program *programObject = getProgram(program);
5254 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5255}
5256
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005257GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5258{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005259 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5260 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005261
Jamie Madill70b5bb02017-08-28 13:32:37 -04005262 Sync *syncObject = getSync(syncHandle);
5263 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005264 if (error.isError())
5265 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005266 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005267 handleError(error);
5268 return nullptr;
5269 }
5270
Jamie Madill70b5bb02017-08-28 13:32:37 -04005271 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005272}
5273
5274GLboolean Context::isSync(GLsync sync)
5275{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005276 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005277}
5278
5279GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5280{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005281 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005282
5283 GLenum result = GL_WAIT_FAILED;
5284 handleError(syncObject->clientWait(flags, timeout, &result));
5285 return result;
5286}
5287
5288void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5289{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005290 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005291 handleError(syncObject->serverWait(flags, timeout));
5292}
5293
5294void Context::getInteger64v(GLenum pname, GLint64 *params)
5295{
5296 GLenum nativeType = GL_NONE;
5297 unsigned int numParams = 0;
5298 getQueryParameterInfo(pname, &nativeType, &numParams);
5299
5300 if (nativeType == GL_INT_64_ANGLEX)
5301 {
5302 getInteger64vImpl(pname, params);
5303 }
5304 else
5305 {
5306 CastStateValues(this, nativeType, pname, numParams, params);
5307 }
5308}
5309
Corentin Wallez336129f2017-10-17 15:55:40 -04005310void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04005311{
5312 Buffer *buffer = mGLState.getTargetBuffer(target);
5313 QueryBufferParameteri64v(buffer, pname, params);
5314}
5315
5316void Context::genSamplers(GLsizei count, GLuint *samplers)
5317{
5318 for (int i = 0; i < count; i++)
5319 {
5320 samplers[i] = mState.mSamplers->createSampler();
5321 }
5322}
5323
5324void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
5325{
5326 for (int i = 0; i < count; i++)
5327 {
5328 GLuint sampler = samplers[i];
5329
5330 if (mState.mSamplers->getSampler(sampler))
5331 {
5332 detachSampler(sampler);
5333 }
5334
5335 mState.mSamplers->deleteObject(this, sampler);
5336 }
5337}
5338
5339void Context::getInternalformativ(GLenum target,
5340 GLenum internalformat,
5341 GLenum pname,
5342 GLsizei bufSize,
5343 GLint *params)
5344{
5345 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
5346 QueryInternalFormativ(formatCaps, pname, bufSize, params);
5347}
5348
Jiajia Qin5451d532017-11-16 17:16:34 +08005349void Context::programUniform1i(GLuint program, GLint location, GLint v0)
5350{
5351 programUniform1iv(program, location, 1, &v0);
5352}
5353
5354void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
5355{
5356 GLint xy[2] = {v0, v1};
5357 programUniform2iv(program, location, 1, xy);
5358}
5359
5360void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
5361{
5362 GLint xyz[3] = {v0, v1, v2};
5363 programUniform3iv(program, location, 1, xyz);
5364}
5365
5366void Context::programUniform4i(GLuint program,
5367 GLint location,
5368 GLint v0,
5369 GLint v1,
5370 GLint v2,
5371 GLint v3)
5372{
5373 GLint xyzw[4] = {v0, v1, v2, v3};
5374 programUniform4iv(program, location, 1, xyzw);
5375}
5376
5377void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
5378{
5379 programUniform1uiv(program, location, 1, &v0);
5380}
5381
5382void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
5383{
5384 GLuint xy[2] = {v0, v1};
5385 programUniform2uiv(program, location, 1, xy);
5386}
5387
5388void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
5389{
5390 GLuint xyz[3] = {v0, v1, v2};
5391 programUniform3uiv(program, location, 1, xyz);
5392}
5393
5394void Context::programUniform4ui(GLuint program,
5395 GLint location,
5396 GLuint v0,
5397 GLuint v1,
5398 GLuint v2,
5399 GLuint v3)
5400{
5401 GLuint xyzw[4] = {v0, v1, v2, v3};
5402 programUniform4uiv(program, location, 1, xyzw);
5403}
5404
5405void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
5406{
5407 programUniform1fv(program, location, 1, &v0);
5408}
5409
5410void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
5411{
5412 GLfloat xy[2] = {v0, v1};
5413 programUniform2fv(program, location, 1, xy);
5414}
5415
5416void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
5417{
5418 GLfloat xyz[3] = {v0, v1, v2};
5419 programUniform3fv(program, location, 1, xyz);
5420}
5421
5422void Context::programUniform4f(GLuint program,
5423 GLint location,
5424 GLfloat v0,
5425 GLfloat v1,
5426 GLfloat v2,
5427 GLfloat v3)
5428{
5429 GLfloat xyzw[4] = {v0, v1, v2, v3};
5430 programUniform4fv(program, location, 1, xyzw);
5431}
5432
Jamie Madill81c2e252017-09-09 23:32:46 -04005433void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5434{
5435 Program *programObject = getProgram(program);
5436 ASSERT(programObject);
5437 if (programObject->setUniform1iv(location, count, value) ==
5438 Program::SetUniformResult::SamplerChanged)
5439 {
5440 mGLState.setObjectDirty(GL_PROGRAM);
5441 }
5442}
5443
Jiajia Qin5451d532017-11-16 17:16:34 +08005444void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5445{
5446 Program *programObject = getProgram(program);
5447 ASSERT(programObject);
5448 programObject->setUniform2iv(location, count, value);
5449}
5450
5451void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5452{
5453 Program *programObject = getProgram(program);
5454 ASSERT(programObject);
5455 programObject->setUniform3iv(location, count, value);
5456}
5457
5458void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5459{
5460 Program *programObject = getProgram(program);
5461 ASSERT(programObject);
5462 programObject->setUniform4iv(location, count, value);
5463}
5464
5465void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5466{
5467 Program *programObject = getProgram(program);
5468 ASSERT(programObject);
5469 programObject->setUniform1uiv(location, count, value);
5470}
5471
5472void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5473{
5474 Program *programObject = getProgram(program);
5475 ASSERT(programObject);
5476 programObject->setUniform2uiv(location, count, value);
5477}
5478
5479void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5480{
5481 Program *programObject = getProgram(program);
5482 ASSERT(programObject);
5483 programObject->setUniform3uiv(location, count, value);
5484}
5485
5486void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5487{
5488 Program *programObject = getProgram(program);
5489 ASSERT(programObject);
5490 programObject->setUniform4uiv(location, count, value);
5491}
5492
5493void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5494{
5495 Program *programObject = getProgram(program);
5496 ASSERT(programObject);
5497 programObject->setUniform1fv(location, count, value);
5498}
5499
5500void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5501{
5502 Program *programObject = getProgram(program);
5503 ASSERT(programObject);
5504 programObject->setUniform2fv(location, count, value);
5505}
5506
5507void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5508{
5509 Program *programObject = getProgram(program);
5510 ASSERT(programObject);
5511 programObject->setUniform3fv(location, count, value);
5512}
5513
5514void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5515{
5516 Program *programObject = getProgram(program);
5517 ASSERT(programObject);
5518 programObject->setUniform4fv(location, count, value);
5519}
5520
5521void Context::programUniformMatrix2fv(GLuint program,
5522 GLint location,
5523 GLsizei count,
5524 GLboolean transpose,
5525 const GLfloat *value)
5526{
5527 Program *programObject = getProgram(program);
5528 ASSERT(programObject);
5529 programObject->setUniformMatrix2fv(location, count, transpose, value);
5530}
5531
5532void Context::programUniformMatrix3fv(GLuint program,
5533 GLint location,
5534 GLsizei count,
5535 GLboolean transpose,
5536 const GLfloat *value)
5537{
5538 Program *programObject = getProgram(program);
5539 ASSERT(programObject);
5540 programObject->setUniformMatrix3fv(location, count, transpose, value);
5541}
5542
5543void Context::programUniformMatrix4fv(GLuint program,
5544 GLint location,
5545 GLsizei count,
5546 GLboolean transpose,
5547 const GLfloat *value)
5548{
5549 Program *programObject = getProgram(program);
5550 ASSERT(programObject);
5551 programObject->setUniformMatrix4fv(location, count, transpose, value);
5552}
5553
5554void Context::programUniformMatrix2x3fv(GLuint program,
5555 GLint location,
5556 GLsizei count,
5557 GLboolean transpose,
5558 const GLfloat *value)
5559{
5560 Program *programObject = getProgram(program);
5561 ASSERT(programObject);
5562 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
5563}
5564
5565void Context::programUniformMatrix3x2fv(GLuint program,
5566 GLint location,
5567 GLsizei count,
5568 GLboolean transpose,
5569 const GLfloat *value)
5570{
5571 Program *programObject = getProgram(program);
5572 ASSERT(programObject);
5573 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
5574}
5575
5576void Context::programUniformMatrix2x4fv(GLuint program,
5577 GLint location,
5578 GLsizei count,
5579 GLboolean transpose,
5580 const GLfloat *value)
5581{
5582 Program *programObject = getProgram(program);
5583 ASSERT(programObject);
5584 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
5585}
5586
5587void Context::programUniformMatrix4x2fv(GLuint program,
5588 GLint location,
5589 GLsizei count,
5590 GLboolean transpose,
5591 const GLfloat *value)
5592{
5593 Program *programObject = getProgram(program);
5594 ASSERT(programObject);
5595 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
5596}
5597
5598void Context::programUniformMatrix3x4fv(GLuint program,
5599 GLint location,
5600 GLsizei count,
5601 GLboolean transpose,
5602 const GLfloat *value)
5603{
5604 Program *programObject = getProgram(program);
5605 ASSERT(programObject);
5606 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
5607}
5608
5609void Context::programUniformMatrix4x3fv(GLuint program,
5610 GLint location,
5611 GLsizei count,
5612 GLboolean transpose,
5613 const GLfloat *value)
5614{
5615 Program *programObject = getProgram(program);
5616 ASSERT(programObject);
5617 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
5618}
5619
Jamie Madill81c2e252017-09-09 23:32:46 -04005620void Context::onTextureChange(const Texture *texture)
5621{
5622 // Conservatively assume all textures are dirty.
5623 // TODO(jmadill): More fine-grained update.
5624 mGLState.setObjectDirty(GL_TEXTURE);
5625}
5626
Yunchao Hea336b902017-08-02 16:05:21 +08005627void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
5628{
5629 for (int i = 0; i < count; i++)
5630 {
5631 pipelines[i] = createProgramPipeline();
5632 }
5633}
5634
5635void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
5636{
5637 for (int i = 0; i < count; i++)
5638 {
5639 if (pipelines[i] != 0)
5640 {
5641 deleteProgramPipeline(pipelines[i]);
5642 }
5643 }
5644}
5645
5646GLboolean Context::isProgramPipeline(GLuint pipeline)
5647{
5648 if (pipeline == 0)
5649 {
5650 return GL_FALSE;
5651 }
5652
5653 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
5654}
5655
Jamie Madill2b7bbc22017-12-21 17:30:38 -05005656void Context::finishFenceNV(GLuint fence)
5657{
5658 FenceNV *fenceObject = getFenceNV(fence);
5659
5660 ASSERT(fenceObject && fenceObject->isSet());
5661 handleError(fenceObject->finish());
5662}
5663
5664void Context::getFenceivNV(GLuint fence, GLenum pname, GLint *params)
5665{
5666 FenceNV *fenceObject = getFenceNV(fence);
5667
5668 ASSERT(fenceObject && fenceObject->isSet());
5669
5670 switch (pname)
5671 {
5672 case GL_FENCE_STATUS_NV:
5673 {
5674 // GL_NV_fence spec:
5675 // Once the status of a fence has been finished (via FinishFenceNV) or tested and
5676 // the returned status is TRUE (via either TestFenceNV or GetFenceivNV querying the
5677 // FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
5678 GLboolean status = GL_TRUE;
5679 if (fenceObject->getStatus() != GL_TRUE)
5680 {
5681 ANGLE_CONTEXT_TRY(fenceObject->test(&status));
5682 }
5683 *params = status;
5684 break;
5685 }
5686
5687 case GL_FENCE_CONDITION_NV:
5688 {
5689 *params = static_cast<GLint>(fenceObject->getCondition());
5690 break;
5691 }
5692
5693 default:
5694 UNREACHABLE();
5695 }
5696}
5697
5698void Context::getTranslatedShaderSource(GLuint shader,
5699 GLsizei bufsize,
5700 GLsizei *length,
5701 GLchar *source)
5702{
5703 Shader *shaderObject = getShader(shader);
5704 ASSERT(shaderObject);
5705 shaderObject->getTranslatedSourceWithDebugInfo(this, bufsize, length, source);
5706}
5707
5708void Context::getnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
5709{
5710 Program *programObject = getProgram(program);
5711 ASSERT(programObject);
5712
5713 programObject->getUniformfv(this, location, params);
5714}
5715
5716void Context::getnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint *params)
5717{
5718 Program *programObject = getProgram(program);
5719 ASSERT(programObject);
5720
5721 programObject->getUniformiv(this, location, params);
5722}
5723
5724GLboolean Context::isFenceNV(GLuint fence)
5725{
5726 FenceNV *fenceObject = getFenceNV(fence);
5727
5728 if (fenceObject == nullptr)
5729 {
5730 return GL_FALSE;
5731 }
5732
5733 // GL_NV_fence spec:
5734 // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an
5735 // existing fence.
5736 return fenceObject->isSet();
5737}
5738
5739void Context::readnPixels(GLint x,
5740 GLint y,
5741 GLsizei width,
5742 GLsizei height,
5743 GLenum format,
5744 GLenum type,
5745 GLsizei bufSize,
5746 void *data)
5747{
5748 return readPixels(x, y, width, height, format, type, data);
5749}
5750
Jamie Madillc29968b2016-01-20 11:17:23 -05005751} // namespace gl