blob: 8115230e143fa6aff2c910d39940b1b97a408c2c [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
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400414 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000415}
416
Jamie Madill4928b7c2017-06-20 12:57:39 -0400417egl::Error Context::onDestroy(const egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000418{
Corentin Wallez80b24112015-08-25 16:41:57 -0400419 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000420 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400421 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000422 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400423 mFenceNVMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000424
Corentin Wallez80b24112015-08-25 16:41:57 -0400425 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000426 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400427 if (query.second != nullptr)
428 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400429 query.second->release(this);
Geoff Langf0aa8422015-09-29 15:08:34 -0400430 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000431 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400432 mQueryMap.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000433
Corentin Wallez80b24112015-08-25 16:41:57 -0400434 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400435 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400436 if (vertexArray.second)
437 {
438 vertexArray.second->onDestroy(this);
439 }
Jamie Madill57a89722013-07-02 11:57:03 -0400440 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400441 mVertexArrayMap.clear();
Jamie Madill57a89722013-07-02 11:57:03 -0400442
Corentin Wallez80b24112015-08-25 16:41:57 -0400443 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500444 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500445 if (transformFeedback.second != nullptr)
446 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500447 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500448 }
Geoff Langc8058452014-02-03 12:04:11 -0500449 }
Jamie Madill96a483b2017-06-27 16:49:21 -0400450 mTransformFeedbackMap.clear();
Geoff Langc8058452014-02-03 12:04:11 -0500451
Jamie Madilldedd7b92014-11-05 16:30:36 -0500452 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400453 {
Jamie Madill71c88b32017-09-14 22:20:29 -0400454 ANGLE_TRY(zeroTexture.second->onDestroy(this));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400455 zeroTexture.second.set(this, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400456 }
457 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000458
Corentin Wallezccab69d2017-01-27 16:57:15 -0500459 SafeDelete(mSurfacelessFramebuffer);
460
Jamie Madill4928b7c2017-06-20 12:57:39 -0400461 ANGLE_TRY(releaseSurface(display));
Jamie Madill2f348d22017-06-05 10:50:59 -0400462 releaseShaderCompiler();
Jamie Madill6c1f6712017-02-14 19:08:04 -0500463
Jamie Madill4928b7c2017-06-20 12:57:39 -0400464 mGLState.reset(this);
465
Jamie Madill6c1f6712017-02-14 19:08:04 -0500466 mState.mBuffers->release(this);
467 mState.mShaderPrograms->release(this);
468 mState.mTextures->release(this);
469 mState.mRenderbuffers->release(this);
470 mState.mSamplers->release(this);
Jamie Madill70b5bb02017-08-28 13:32:37 -0400471 mState.mSyncs->release(this);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500472 mState.mPaths->release(this);
473 mState.mFramebuffers->release(this);
Yunchao Hea336b902017-08-02 16:05:21 +0800474 mState.mPipelines->release(this);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400475
Jamie Madill76e471e2017-10-21 09:56:01 -0400476 mImplementation->onDestroy(this);
477
Jamie Madill4928b7c2017-06-20 12:57:39 -0400478 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000479}
480
Jamie Madill70ee0f62017-02-06 16:04:20 -0500481Context::~Context()
482{
483}
484
Jamie Madill4928b7c2017-06-20 12:57:39 -0400485egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000486{
Jamie Madill61e16b42017-06-19 11:13:23 -0400487 mCurrentDisplay = display;
488
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000489 if (!mHasBeenCurrent)
490 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000491 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500492 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400493 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000494
Corentin Wallezc295e512017-01-27 17:47:50 -0500495 int width = 0;
496 int height = 0;
497 if (surface != nullptr)
498 {
499 width = surface->getWidth();
500 height = surface->getHeight();
501 }
502
503 mGLState.setViewportParams(0, 0, width, height);
504 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000505
506 mHasBeenCurrent = true;
507 }
508
Jamie Madill1b94d432015-08-07 13:23:23 -0400509 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700510 mGLState.setAllDirtyBits();
Jamie Madill81c2e252017-09-09 23:32:46 -0400511 mGLState.setAllDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -0400512
Jamie Madill4928b7c2017-06-20 12:57:39 -0400513 ANGLE_TRY(releaseSurface(display));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500514
515 Framebuffer *newDefault = nullptr;
516 if (surface != nullptr)
517 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400518 ANGLE_TRY(surface->setIsCurrent(this, true));
Corentin Wallezccab69d2017-01-27 16:57:15 -0500519 mCurrentSurface = surface;
520 newDefault = surface->getDefaultFramebuffer();
521 }
522 else
523 {
524 if (mSurfacelessFramebuffer == nullptr)
525 {
526 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
527 }
528
529 newDefault = mSurfacelessFramebuffer;
530 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000531
Corentin Wallez37c39792015-08-20 14:19:46 -0400532 // Update default framebuffer, the binding of the previous default
533 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400534 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700535 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400536 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700537 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400538 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700539 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400540 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700541 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400542 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500543 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400544 }
Ian Ewell292f0052016-02-04 10:37:32 -0500545
546 // Notify the renderer of a context switch
Jamie Madill4928b7c2017-06-20 12:57:39 -0400547 mImplementation->onMakeCurrent(this);
548 return egl::NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000549}
550
Jamie Madill4928b7c2017-06-20 12:57:39 -0400551egl::Error Context::releaseSurface(const egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400552{
Corentin Wallez37c39792015-08-20 14:19:46 -0400553 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500554 Framebuffer *currentDefault = nullptr;
555 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400556 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500557 currentDefault = mCurrentSurface->getDefaultFramebuffer();
558 }
559 else if (mSurfacelessFramebuffer != nullptr)
560 {
561 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400562 }
563
Corentin Wallezc295e512017-01-27 17:47:50 -0500564 if (mGLState.getReadFramebuffer() == currentDefault)
565 {
566 mGLState.setReadFramebufferBinding(nullptr);
567 }
568 if (mGLState.getDrawFramebuffer() == currentDefault)
569 {
570 mGLState.setDrawFramebufferBinding(nullptr);
571 }
572 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
573
574 if (mCurrentSurface)
575 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400576 ANGLE_TRY(mCurrentSurface->setIsCurrent(this, false));
Corentin Wallezc295e512017-01-27 17:47:50 -0500577 mCurrentSurface = nullptr;
578 }
Jamie Madill4928b7c2017-06-20 12:57:39 -0400579
580 return egl::NoError();
Jamie Madill77a72f62015-04-14 11:18:32 -0400581}
582
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000583GLuint Context::createBuffer()
584{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500585 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000586}
587
588GLuint Context::createProgram()
589{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500590 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000591}
592
593GLuint Context::createShader(GLenum type)
594{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500595 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000596}
597
598GLuint Context::createTexture()
599{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500600 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000601}
602
603GLuint Context::createRenderbuffer()
604{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500605 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000606}
607
Sami Väisänene45e53b2016-05-25 10:36:04 +0300608GLuint Context::createPaths(GLsizei range)
609{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500610 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300611 if (resultOrError.isError())
612 {
613 handleError(resultOrError.getError());
614 return 0;
615 }
616 return resultOrError.getResult();
617}
618
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000619// Returns an unused framebuffer name
620GLuint Context::createFramebuffer()
621{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500622 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000623}
624
Jamie Madill33dc8432013-07-26 11:55:05 -0400625GLuint Context::createFenceNV()
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000626{
Jamie Madill33dc8432013-07-26 11:55:05 -0400627 GLuint handle = mFenceNVHandleAllocator.allocate();
Jamie Madill96a483b2017-06-27 16:49:21 -0400628 mFenceNVMap.assign(handle, new FenceNV(mImplementation->createFenceNV()));
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000629 return handle;
630}
631
Yunchao Hea336b902017-08-02 16:05:21 +0800632GLuint Context::createProgramPipeline()
633{
634 return mState.mPipelines->createProgramPipeline();
635}
636
Jiajia Qin5451d532017-11-16 17:16:34 +0800637GLuint Context::createShaderProgramv(GLenum type, GLsizei count, const GLchar *const *strings)
638{
639 UNIMPLEMENTED();
640 return 0u;
641}
642
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000643void Context::deleteBuffer(GLuint buffer)
644{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500645 if (mState.mBuffers->getBuffer(buffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000646 {
647 detachBuffer(buffer);
648 }
Jamie Madill893ab082014-05-16 16:56:10 -0400649
Jamie Madill6c1f6712017-02-14 19:08:04 -0500650 mState.mBuffers->deleteObject(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000651}
652
653void Context::deleteShader(GLuint shader)
654{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500655 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000656}
657
658void Context::deleteProgram(GLuint program)
659{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500660 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000661}
662
663void Context::deleteTexture(GLuint texture)
664{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500665 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000666 {
667 detachTexture(texture);
668 }
669
Jamie Madill6c1f6712017-02-14 19:08:04 -0500670 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000671}
672
673void Context::deleteRenderbuffer(GLuint renderbuffer)
674{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500675 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000676 {
677 detachRenderbuffer(renderbuffer);
678 }
Jamie Madill893ab082014-05-16 16:56:10 -0400679
Jamie Madill6c1f6712017-02-14 19:08:04 -0500680 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000681}
682
Jamie Madill7f0c5a42017-08-26 22:43:26 -0400683void Context::deleteSync(GLsync sync)
Jamie Madillcd055f82013-07-26 11:55:15 -0400684{
685 // The spec specifies the underlying Fence object is not deleted until all current
686 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
687 // and since our API is currently designed for being called from a single thread, we can delete
688 // the fence immediately.
Jamie Madill70b5bb02017-08-28 13:32:37 -0400689 mState.mSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400690}
691
Yunchao Hea336b902017-08-02 16:05:21 +0800692void Context::deleteProgramPipeline(GLuint pipeline)
693{
694 if (mState.mPipelines->getProgramPipeline(pipeline))
695 {
696 detachProgramPipeline(pipeline);
697 }
698
699 mState.mPipelines->deleteObject(this, pipeline);
700}
701
Sami Väisänene45e53b2016-05-25 10:36:04 +0300702void Context::deletePaths(GLuint first, GLsizei range)
703{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500704 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300705}
706
707bool Context::hasPathData(GLuint path) const
708{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500709 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300710 if (pathObj == nullptr)
711 return false;
712
713 return pathObj->hasPathData();
714}
715
716bool Context::hasPath(GLuint path) const
717{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500718 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300719}
720
721void Context::setPathCommands(GLuint path,
722 GLsizei numCommands,
723 const GLubyte *commands,
724 GLsizei numCoords,
725 GLenum coordType,
726 const void *coords)
727{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500728 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300729
730 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
731}
732
733void Context::setPathParameterf(GLuint path, GLenum pname, GLfloat value)
734{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500735 auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300736
737 switch (pname)
738 {
739 case GL_PATH_STROKE_WIDTH_CHROMIUM:
740 pathObj->setStrokeWidth(value);
741 break;
742 case GL_PATH_END_CAPS_CHROMIUM:
743 pathObj->setEndCaps(static_cast<GLenum>(value));
744 break;
745 case GL_PATH_JOIN_STYLE_CHROMIUM:
746 pathObj->setJoinStyle(static_cast<GLenum>(value));
747 break;
748 case GL_PATH_MITER_LIMIT_CHROMIUM:
749 pathObj->setMiterLimit(value);
750 break;
751 case GL_PATH_STROKE_BOUND_CHROMIUM:
752 pathObj->setStrokeBound(value);
753 break;
754 default:
755 UNREACHABLE();
756 break;
757 }
758}
759
760void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const
761{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500762 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300763
764 switch (pname)
765 {
766 case GL_PATH_STROKE_WIDTH_CHROMIUM:
767 *value = pathObj->getStrokeWidth();
768 break;
769 case GL_PATH_END_CAPS_CHROMIUM:
770 *value = static_cast<GLfloat>(pathObj->getEndCaps());
771 break;
772 case GL_PATH_JOIN_STYLE_CHROMIUM:
773 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
774 break;
775 case GL_PATH_MITER_LIMIT_CHROMIUM:
776 *value = pathObj->getMiterLimit();
777 break;
778 case GL_PATH_STROKE_BOUND_CHROMIUM:
779 *value = pathObj->getStrokeBound();
780 break;
781 default:
782 UNREACHABLE();
783 break;
784 }
785}
786
787void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
788{
789 mGLState.setPathStencilFunc(func, ref, mask);
790}
791
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000792void Context::deleteFramebuffer(GLuint framebuffer)
793{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500794 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000795 {
796 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000797 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500798
Jamie Madill6c1f6712017-02-14 19:08:04 -0500799 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000800}
801
Jamie Madill33dc8432013-07-26 11:55:05 -0400802void Context::deleteFenceNV(GLuint fence)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000803{
Jamie Madill96a483b2017-06-27 16:49:21 -0400804 FenceNV *fenceObject = nullptr;
805 if (mFenceNVMap.erase(fence, &fenceObject))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000806 {
Jamie Madill96a483b2017-06-27 16:49:21 -0400807 mFenceNVHandleAllocator.release(fence);
808 delete fenceObject;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000809 }
810}
811
Geoff Lang70d0f492015-12-10 17:45:46 -0500812Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000813{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500814 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000815}
816
Jamie Madill570f7c82014-07-03 10:38:54 -0400817Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000818{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500819 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000820}
821
Geoff Lang70d0f492015-12-10 17:45:46 -0500822Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000823{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500824 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000825}
826
Jamie Madill70b5bb02017-08-28 13:32:37 -0400827Sync *Context::getSync(GLsync handle) const
Jamie Madillcd055f82013-07-26 11:55:15 -0400828{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400829 return mState.mSyncs->getSync(static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400830}
831
Jamie Madill57a89722013-07-02 11:57:03 -0400832VertexArray *Context::getVertexArray(GLuint handle) const
833{
Jamie Madill96a483b2017-06-27 16:49:21 -0400834 return mVertexArrayMap.query(handle);
Jamie Madill57a89722013-07-02 11:57:03 -0400835}
836
Jamie Madilldc356042013-07-19 16:36:57 -0400837Sampler *Context::getSampler(GLuint handle) const
838{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500839 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400840}
841
Geoff Langc8058452014-02-03 12:04:11 -0500842TransformFeedback *Context::getTransformFeedback(GLuint handle) const
843{
Jamie Madill96a483b2017-06-27 16:49:21 -0400844 return mTransformFeedbackMap.query(handle);
Geoff Langc8058452014-02-03 12:04:11 -0500845}
846
Yunchao Hea336b902017-08-02 16:05:21 +0800847ProgramPipeline *Context::getProgramPipeline(GLuint handle) const
848{
849 return mState.mPipelines->getProgramPipeline(handle);
850}
851
Geoff Lang70d0f492015-12-10 17:45:46 -0500852LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
853{
854 switch (identifier)
855 {
856 case GL_BUFFER:
857 return getBuffer(name);
858 case GL_SHADER:
859 return getShader(name);
860 case GL_PROGRAM:
861 return getProgram(name);
862 case GL_VERTEX_ARRAY:
863 return getVertexArray(name);
864 case GL_QUERY:
865 return getQuery(name);
866 case GL_TRANSFORM_FEEDBACK:
867 return getTransformFeedback(name);
868 case GL_SAMPLER:
869 return getSampler(name);
870 case GL_TEXTURE:
871 return getTexture(name);
872 case GL_RENDERBUFFER:
873 return getRenderbuffer(name);
874 case GL_FRAMEBUFFER:
875 return getFramebuffer(name);
876 default:
877 UNREACHABLE();
878 return nullptr;
879 }
880}
881
882LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
883{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400884 return getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
Geoff Lang70d0f492015-12-10 17:45:46 -0500885}
886
Martin Radev9d901792016-07-15 15:58:58 +0300887void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
888{
889 LabeledObject *object = getLabeledObject(identifier, name);
890 ASSERT(object != nullptr);
891
892 std::string labelName = GetObjectLabelFromPointer(length, label);
893 object->setLabel(labelName);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400894
895 // TODO(jmadill): Determine if the object is dirty based on 'name'. Conservatively assume the
896 // specified object is active until we do this.
897 mGLState.setObjectDirty(identifier);
Martin Radev9d901792016-07-15 15:58:58 +0300898}
899
900void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
901{
902 LabeledObject *object = getLabeledObjectFromPtr(ptr);
903 ASSERT(object != nullptr);
904
905 std::string labelName = GetObjectLabelFromPointer(length, label);
906 object->setLabel(labelName);
907}
908
909void Context::getObjectLabel(GLenum identifier,
910 GLuint name,
911 GLsizei bufSize,
912 GLsizei *length,
913 GLchar *label) const
914{
915 LabeledObject *object = getLabeledObject(identifier, name);
916 ASSERT(object != nullptr);
917
918 const std::string &objectLabel = object->getLabel();
919 GetObjectLabelBase(objectLabel, bufSize, length, label);
920}
921
922void Context::getObjectPtrLabel(const void *ptr,
923 GLsizei bufSize,
924 GLsizei *length,
925 GLchar *label) const
926{
927 LabeledObject *object = getLabeledObjectFromPtr(ptr);
928 ASSERT(object != nullptr);
929
930 const std::string &objectLabel = object->getLabel();
931 GetObjectLabelBase(objectLabel, bufSize, length, label);
932}
933
Jamie Madilldc356042013-07-19 16:36:57 -0400934bool Context::isSampler(GLuint samplerName) const
935{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500936 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400937}
938
Jamie Madilldedd7b92014-11-05 16:30:36 -0500939void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000940{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500941 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000942
Jamie Madilldedd7b92014-11-05 16:30:36 -0500943 if (handle == 0)
944 {
945 texture = mZeroTextures[target].get();
946 }
947 else
948 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500949 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500950 }
951
952 ASSERT(texture);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400953 mGLState.setSamplerTexture(this, target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000954}
955
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500956void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000957{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500958 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
959 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700960 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000961}
962
Jamie Madill5bf9ff42016-02-01 11:13:03 -0500963void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000964{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500965 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
966 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700967 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000968}
969
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500970void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -0400971{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500972 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700973 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400974}
975
Shao80957d92017-02-20 21:25:59 +0800976void Context::bindVertexBuffer(GLuint bindingIndex,
977 GLuint bufferHandle,
978 GLintptr offset,
979 GLsizei stride)
980{
981 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400982 mGLState.bindVertexBuffer(this, bindingIndex, buffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +0800983}
984
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500985void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -0400986{
Geoff Lang76b10c92014-09-05 16:28:14 -0400987 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -0400988 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500989 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400990 mGLState.setSamplerBinding(this, textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -0400991}
992
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800993void Context::bindImageTexture(GLuint unit,
994 GLuint texture,
995 GLint level,
996 GLboolean layered,
997 GLint layer,
998 GLenum access,
999 GLenum format)
1000{
1001 Texture *tex = mState.mTextures->getTexture(texture);
1002 mGLState.setImageUnit(this, unit, tex, level, layered, layer, access, format);
1003}
1004
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001005void Context::useProgram(GLuint program)
1006{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001007 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001008}
1009
Jiajia Qin5451d532017-11-16 17:16:34 +08001010void Context::useProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
1011{
1012 UNIMPLEMENTED();
1013}
1014
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001015void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001016{
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04001017 ASSERT(target == GL_TRANSFORM_FEEDBACK);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001018 TransformFeedback *transformFeedback =
1019 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001020 mGLState.setTransformFeedbackBinding(this, transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001021}
1022
Yunchao Hea336b902017-08-02 16:05:21 +08001023void Context::bindProgramPipeline(GLuint pipelineHandle)
1024{
1025 ProgramPipeline *pipeline =
1026 mState.mPipelines->checkProgramPipelineAllocation(mImplementation.get(), pipelineHandle);
1027 mGLState.setProgramPipelineBinding(this, pipeline);
1028}
1029
Jamie Madillf0e04492017-08-26 15:28:42 -04001030void Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001031{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001032 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001033 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001034
Geoff Lang5aad9672014-09-08 11:10:42 -04001035 // begin query
Jamie Madillf0e04492017-08-26 15:28:42 -04001036 ANGLE_CONTEXT_TRY(queryObject->begin());
Geoff Lang5aad9672014-09-08 11:10:42 -04001037
1038 // set query as active for specified target only if begin succeeded
Jamie Madill4928b7c2017-06-20 12:57:39 -04001039 mGLState.setActiveQuery(this, target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001040}
1041
Jamie Madillf0e04492017-08-26 15:28:42 -04001042void Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001043{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001044 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001045 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001046
Jamie Madillf0e04492017-08-26 15:28:42 -04001047 handleError(queryObject->end());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001048
Geoff Lang5aad9672014-09-08 11:10:42 -04001049 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madill4928b7c2017-06-20 12:57:39 -04001050 mGLState.setActiveQuery(this, target, nullptr);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001051}
1052
Jamie Madillf0e04492017-08-26 15:28:42 -04001053void Context::queryCounter(GLuint id, GLenum target)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001054{
1055 ASSERT(target == GL_TIMESTAMP_EXT);
1056
1057 Query *queryObject = getQuery(id, true, target);
1058 ASSERT(queryObject);
1059
Jamie Madillf0e04492017-08-26 15:28:42 -04001060 handleError(queryObject->queryCounter());
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001061}
1062
1063void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1064{
1065 switch (pname)
1066 {
1067 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001068 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001069 break;
1070 case GL_QUERY_COUNTER_BITS_EXT:
1071 switch (target)
1072 {
1073 case GL_TIME_ELAPSED_EXT:
1074 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1075 break;
1076 case GL_TIMESTAMP_EXT:
1077 params[0] = getExtensions().queryCounterBitsTimestamp;
1078 break;
1079 default:
1080 UNREACHABLE();
1081 params[0] = 0;
1082 break;
1083 }
1084 break;
1085 default:
1086 UNREACHABLE();
1087 return;
1088 }
1089}
1090
Geoff Lang2186c382016-10-14 10:54:54 -04001091void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001092{
Geoff Lang2186c382016-10-14 10:54:54 -04001093 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001094}
1095
Geoff Lang2186c382016-10-14 10:54:54 -04001096void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001097{
Geoff Lang2186c382016-10-14 10:54:54 -04001098 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001099}
1100
Geoff Lang2186c382016-10-14 10:54:54 -04001101void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001102{
Geoff Lang2186c382016-10-14 10:54:54 -04001103 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001104}
1105
Geoff Lang2186c382016-10-14 10:54:54 -04001106void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001107{
Geoff Lang2186c382016-10-14 10:54:54 -04001108 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001109}
1110
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001111Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001112{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001113 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001114}
1115
Jamie Madill2f348d22017-06-05 10:50:59 -04001116FenceNV *Context::getFenceNV(GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001117{
Jamie Madill96a483b2017-06-27 16:49:21 -04001118 return mFenceNVMap.query(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001119}
1120
Jamie Madill2f348d22017-06-05 10:50:59 -04001121Query *Context::getQuery(GLuint handle, bool create, GLenum type)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001122{
Jamie Madill96a483b2017-06-27 16:49:21 -04001123 if (!mQueryMap.contains(handle))
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001124 {
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001125 return nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001126 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001127
1128 Query *query = mQueryMap.query(handle);
1129 if (!query && create)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001130 {
Jamie Madill96a483b2017-06-27 16:49:21 -04001131 query = new Query(mImplementation->createQuery(type), handle);
1132 query->addRef();
1133 mQueryMap.assign(handle, query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001134 }
Jamie Madill96a483b2017-06-27 16:49:21 -04001135 return query;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001136}
1137
Geoff Lang70d0f492015-12-10 17:45:46 -05001138Query *Context::getQuery(GLuint handle) const
1139{
Jamie Madill96a483b2017-06-27 16:49:21 -04001140 return mQueryMap.query(handle);
Geoff Lang70d0f492015-12-10 17:45:46 -05001141}
1142
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001143Texture *Context::getTargetTexture(GLenum target) const
1144{
Ian Ewellbda75592016-04-18 17:25:54 -04001145 ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001146 return mGLState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001147}
1148
Geoff Lang76b10c92014-09-05 16:28:14 -04001149Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001150{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001151 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001152}
1153
Geoff Lang492a7e42014-11-05 13:27:06 -05001154Compiler *Context::getCompiler() const
1155{
Jamie Madill2f348d22017-06-05 10:50:59 -04001156 if (mCompiler.get() == nullptr)
1157 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001158 mCompiler.set(this, new Compiler(mImplementation.get(), mState));
Jamie Madill2f348d22017-06-05 10:50:59 -04001159 }
1160 return mCompiler.get();
Geoff Lang492a7e42014-11-05 13:27:06 -05001161}
1162
Jamie Madillc1d770e2017-04-13 17:31:24 -04001163void Context::getBooleanvImpl(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001164{
1165 switch (pname)
1166 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001167 case GL_SHADER_COMPILER:
1168 *params = GL_TRUE;
1169 break;
1170 case GL_CONTEXT_ROBUST_ACCESS_EXT:
1171 *params = mRobustAccess ? GL_TRUE : GL_FALSE;
1172 break;
1173 default:
1174 mGLState.getBooleanv(pname, params);
1175 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001176 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001177}
1178
Jamie Madillc1d770e2017-04-13 17:31:24 -04001179void Context::getFloatvImpl(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001180{
Shannon Woods53a94a82014-06-24 15:20:36 -04001181 // Queries about context capabilities and maximums are answered by Context.
1182 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001183 switch (pname)
1184 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001185 case GL_ALIASED_LINE_WIDTH_RANGE:
1186 params[0] = mCaps.minAliasedLineWidth;
1187 params[1] = mCaps.maxAliasedLineWidth;
1188 break;
1189 case GL_ALIASED_POINT_SIZE_RANGE:
1190 params[0] = mCaps.minAliasedPointSize;
1191 params[1] = mCaps.maxAliasedPointSize;
1192 break;
1193 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
1194 ASSERT(mExtensions.textureFilterAnisotropic);
1195 *params = mExtensions.maxTextureAnisotropy;
1196 break;
1197 case GL_MAX_TEXTURE_LOD_BIAS:
1198 *params = mCaps.maxLODBias;
1199 break;
1200
1201 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1202 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1203 {
1204 ASSERT(mExtensions.pathRendering);
1205 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1206 memcpy(params, m, 16 * sizeof(GLfloat));
1207 }
Geoff Lange6d4e122015-06-29 13:33:55 -04001208 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001209
Jamie Madill231c7f52017-04-26 13:45:37 -04001210 default:
1211 mGLState.getFloatv(pname, params);
1212 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001213 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001214}
1215
Jamie Madillc1d770e2017-04-13 17:31:24 -04001216void Context::getIntegervImpl(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001217{
Shannon Woods53a94a82014-06-24 15:20:36 -04001218 // Queries about context capabilities and maximums are answered by Context.
1219 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001220
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001221 switch (pname)
1222 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001223 case GL_MAX_VERTEX_ATTRIBS:
1224 *params = mCaps.maxVertexAttributes;
1225 break;
1226 case GL_MAX_VERTEX_UNIFORM_VECTORS:
1227 *params = mCaps.maxVertexUniformVectors;
1228 break;
1229 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
1230 *params = mCaps.maxVertexUniformComponents;
1231 break;
1232 case GL_MAX_VARYING_VECTORS:
1233 *params = mCaps.maxVaryingVectors;
1234 break;
1235 case GL_MAX_VARYING_COMPONENTS:
1236 *params = mCaps.maxVertexOutputComponents;
1237 break;
1238 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
1239 *params = mCaps.maxCombinedTextureImageUnits;
1240 break;
1241 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
1242 *params = mCaps.maxVertexTextureImageUnits;
1243 break;
1244 case GL_MAX_TEXTURE_IMAGE_UNITS:
1245 *params = mCaps.maxTextureImageUnits;
1246 break;
1247 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1248 *params = mCaps.maxFragmentUniformVectors;
1249 break;
1250 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
1251 *params = mCaps.maxFragmentUniformComponents;
1252 break;
1253 case GL_MAX_RENDERBUFFER_SIZE:
1254 *params = mCaps.maxRenderbufferSize;
1255 break;
1256 case GL_MAX_COLOR_ATTACHMENTS_EXT:
1257 *params = mCaps.maxColorAttachments;
1258 break;
1259 case GL_MAX_DRAW_BUFFERS_EXT:
1260 *params = mCaps.maxDrawBuffers;
1261 break;
1262 // case GL_FRAMEBUFFER_BINDING: // now equivalent to
1263 // GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1264 case GL_SUBPIXEL_BITS:
1265 *params = 4;
1266 break;
1267 case GL_MAX_TEXTURE_SIZE:
1268 *params = mCaps.max2DTextureSize;
1269 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001270 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
1271 *params = mCaps.maxRectangleTextureSize;
1272 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001273 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
1274 *params = mCaps.maxCubeMapTextureSize;
1275 break;
1276 case GL_MAX_3D_TEXTURE_SIZE:
1277 *params = mCaps.max3DTextureSize;
1278 break;
1279 case GL_MAX_ARRAY_TEXTURE_LAYERS:
1280 *params = mCaps.maxArrayTextureLayers;
1281 break;
1282 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
1283 *params = mCaps.uniformBufferOffsetAlignment;
1284 break;
1285 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
1286 *params = mCaps.maxUniformBufferBindings;
1287 break;
1288 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
1289 *params = mCaps.maxVertexUniformBlocks;
1290 break;
1291 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
1292 *params = mCaps.maxFragmentUniformBlocks;
1293 break;
1294 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
1295 *params = mCaps.maxCombinedTextureImageUnits;
1296 break;
1297 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
1298 *params = mCaps.maxVertexOutputComponents;
1299 break;
1300 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
1301 *params = mCaps.maxFragmentInputComponents;
1302 break;
1303 case GL_MIN_PROGRAM_TEXEL_OFFSET:
1304 *params = mCaps.minProgramTexelOffset;
1305 break;
1306 case GL_MAX_PROGRAM_TEXEL_OFFSET:
1307 *params = mCaps.maxProgramTexelOffset;
1308 break;
1309 case GL_MAJOR_VERSION:
1310 *params = getClientVersion().major;
1311 break;
1312 case GL_MINOR_VERSION:
1313 *params = getClientVersion().minor;
1314 break;
1315 case GL_MAX_ELEMENTS_INDICES:
1316 *params = mCaps.maxElementsIndices;
1317 break;
1318 case GL_MAX_ELEMENTS_VERTICES:
1319 *params = mCaps.maxElementsVertices;
1320 break;
1321 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
1322 *params = mCaps.maxTransformFeedbackInterleavedComponents;
1323 break;
1324 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
1325 *params = mCaps.maxTransformFeedbackSeparateAttributes;
1326 break;
1327 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
1328 *params = mCaps.maxTransformFeedbackSeparateComponents;
1329 break;
1330 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1331 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1332 break;
1333 case GL_MAX_SAMPLES_ANGLE:
1334 *params = mCaps.maxSamples;
1335 break;
1336 case GL_MAX_VIEWPORT_DIMS:
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001337 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001338 params[0] = mCaps.maxViewportWidth;
1339 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001340 }
1341 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001342 case GL_COMPRESSED_TEXTURE_FORMATS:
1343 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(),
1344 params);
1345 break;
1346 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1347 *params = mResetStrategy;
1348 break;
1349 case GL_NUM_SHADER_BINARY_FORMATS:
1350 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
1351 break;
1352 case GL_SHADER_BINARY_FORMATS:
1353 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1354 break;
1355 case GL_NUM_PROGRAM_BINARY_FORMATS:
1356 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
1357 break;
1358 case GL_PROGRAM_BINARY_FORMATS:
1359 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
1360 break;
1361 case GL_NUM_EXTENSIONS:
1362 *params = static_cast<GLint>(mExtensionStrings.size());
1363 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001364
Jamie Madill231c7f52017-04-26 13:45:37 -04001365 // GL_KHR_debug
1366 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1367 *params = mExtensions.maxDebugMessageLength;
1368 break;
1369 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1370 *params = mExtensions.maxDebugLoggedMessages;
1371 break;
1372 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1373 *params = mExtensions.maxDebugGroupStackDepth;
1374 break;
1375 case GL_MAX_LABEL_LENGTH:
1376 *params = mExtensions.maxLabelLength;
1377 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001378
Martin Radeve5285d22017-07-14 16:23:53 +03001379 // GL_ANGLE_multiview
1380 case GL_MAX_VIEWS_ANGLE:
1381 *params = mExtensions.maxViews;
1382 break;
1383
Jamie Madill231c7f52017-04-26 13:45:37 -04001384 // GL_EXT_disjoint_timer_query
1385 case GL_GPU_DISJOINT_EXT:
1386 *params = mImplementation->getGPUDisjoint();
1387 break;
1388 case GL_MAX_FRAMEBUFFER_WIDTH:
1389 *params = mCaps.maxFramebufferWidth;
1390 break;
1391 case GL_MAX_FRAMEBUFFER_HEIGHT:
1392 *params = mCaps.maxFramebufferHeight;
1393 break;
1394 case GL_MAX_FRAMEBUFFER_SAMPLES:
1395 *params = mCaps.maxFramebufferSamples;
1396 break;
1397 case GL_MAX_SAMPLE_MASK_WORDS:
1398 *params = mCaps.maxSampleMaskWords;
1399 break;
1400 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1401 *params = mCaps.maxColorTextureSamples;
1402 break;
1403 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1404 *params = mCaps.maxDepthTextureSamples;
1405 break;
1406 case GL_MAX_INTEGER_SAMPLES:
1407 *params = mCaps.maxIntegerSamples;
1408 break;
1409 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1410 *params = mCaps.maxVertexAttribRelativeOffset;
1411 break;
1412 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1413 *params = mCaps.maxVertexAttribBindings;
1414 break;
1415 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1416 *params = mCaps.maxVertexAttribStride;
1417 break;
1418 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1419 *params = mCaps.maxVertexAtomicCounterBuffers;
1420 break;
1421 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1422 *params = mCaps.maxVertexAtomicCounters;
1423 break;
1424 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1425 *params = mCaps.maxVertexImageUniforms;
1426 break;
1427 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1428 *params = mCaps.maxVertexShaderStorageBlocks;
1429 break;
1430 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1431 *params = mCaps.maxFragmentAtomicCounterBuffers;
1432 break;
1433 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1434 *params = mCaps.maxFragmentAtomicCounters;
1435 break;
1436 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1437 *params = mCaps.maxFragmentImageUniforms;
1438 break;
1439 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1440 *params = mCaps.maxFragmentShaderStorageBlocks;
1441 break;
1442 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1443 *params = mCaps.minProgramTextureGatherOffset;
1444 break;
1445 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1446 *params = mCaps.maxProgramTextureGatherOffset;
1447 break;
1448 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1449 *params = mCaps.maxComputeWorkGroupInvocations;
1450 break;
1451 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1452 *params = mCaps.maxComputeUniformBlocks;
1453 break;
1454 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1455 *params = mCaps.maxComputeTextureImageUnits;
1456 break;
1457 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1458 *params = mCaps.maxComputeSharedMemorySize;
1459 break;
1460 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1461 *params = mCaps.maxComputeUniformComponents;
1462 break;
1463 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1464 *params = mCaps.maxComputeAtomicCounterBuffers;
1465 break;
1466 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1467 *params = mCaps.maxComputeAtomicCounters;
1468 break;
1469 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1470 *params = mCaps.maxComputeImageUniforms;
1471 break;
1472 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1473 *params = mCaps.maxCombinedComputeUniformComponents;
1474 break;
1475 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1476 *params = mCaps.maxComputeShaderStorageBlocks;
1477 break;
1478 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1479 *params = mCaps.maxCombinedShaderOutputResources;
1480 break;
1481 case GL_MAX_UNIFORM_LOCATIONS:
1482 *params = mCaps.maxUniformLocations;
1483 break;
1484 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1485 *params = mCaps.maxAtomicCounterBufferBindings;
1486 break;
1487 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1488 *params = mCaps.maxAtomicCounterBufferSize;
1489 break;
1490 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1491 *params = mCaps.maxCombinedAtomicCounterBuffers;
1492 break;
1493 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1494 *params = mCaps.maxCombinedAtomicCounters;
1495 break;
1496 case GL_MAX_IMAGE_UNITS:
1497 *params = mCaps.maxImageUnits;
1498 break;
1499 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1500 *params = mCaps.maxCombinedImageUniforms;
1501 break;
1502 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1503 *params = mCaps.maxShaderStorageBufferBindings;
1504 break;
1505 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1506 *params = mCaps.maxCombinedShaderStorageBlocks;
1507 break;
1508 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1509 *params = mCaps.shaderStorageBufferOffsetAlignment;
1510 break;
Jiawei Shao361df072017-11-22 09:33:59 +08001511
1512 // GL_EXT_geometry_shader
1513 case GL_MAX_FRAMEBUFFER_LAYERS_EXT:
1514 *params = mCaps.maxFramebufferLayers;
1515 break;
1516 case GL_LAYER_PROVOKING_VERTEX_EXT:
1517 *params = mCaps.layerProvokingVertex;
1518 break;
1519 case GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1520 *params = mCaps.maxGeometryUniformComponents;
1521 break;
1522 case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
1523 *params = mCaps.maxGeometryUniformBlocks;
1524 break;
1525 case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
1526 *params = mCaps.maxCombinedGeometryUniformComponents;
1527 break;
1528 case GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT:
1529 *params = mCaps.maxGeometryInputComponents;
1530 break;
1531 case GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT:
1532 *params = mCaps.maxGeometryOutputComponents;
1533 break;
1534 case GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT:
1535 *params = mCaps.maxGeometryOutputVertices;
1536 break;
1537 case GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT:
1538 *params = mCaps.maxGeometryTotalOutputComponents;
1539 break;
1540 case GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT:
1541 *params = mCaps.maxGeometryShaderInvocations;
1542 break;
1543 case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
1544 *params = mCaps.maxGeometryTextureImageUnits;
1545 break;
1546 case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
1547 *params = mCaps.maxGeometryAtomicCounterBuffers;
1548 break;
1549 case GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT:
1550 *params = mCaps.maxGeometryAtomicCounters;
1551 break;
1552 case GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT:
1553 *params = mCaps.maxGeometryImageUniforms;
1554 break;
1555 case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
1556 *params = mCaps.maxGeometryShaderStorageBlocks;
1557 break;
Jamie Madill231c7f52017-04-26 13:45:37 -04001558 default:
1559 mGLState.getIntegerv(this, pname, params);
1560 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001561 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001562}
1563
Jamie Madill7f0c5a42017-08-26 22:43:26 -04001564void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001565{
Shannon Woods53a94a82014-06-24 15:20:36 -04001566 // Queries about context capabilities and maximums are answered by Context.
1567 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001568 switch (pname)
1569 {
Jamie Madill231c7f52017-04-26 13:45:37 -04001570 case GL_MAX_ELEMENT_INDEX:
1571 *params = mCaps.maxElementIndex;
1572 break;
1573 case GL_MAX_UNIFORM_BLOCK_SIZE:
1574 *params = mCaps.maxUniformBlockSize;
1575 break;
1576 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
1577 *params = mCaps.maxCombinedVertexUniformComponents;
1578 break;
1579 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
1580 *params = mCaps.maxCombinedFragmentUniformComponents;
1581 break;
1582 case GL_MAX_SERVER_WAIT_TIMEOUT:
1583 *params = mCaps.maxServerWaitTimeout;
1584 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001585
Jamie Madill231c7f52017-04-26 13:45:37 -04001586 // GL_EXT_disjoint_timer_query
1587 case GL_TIMESTAMP_EXT:
1588 *params = mImplementation->getTimestamp();
1589 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001590
Jamie Madill231c7f52017-04-26 13:45:37 -04001591 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1592 *params = mCaps.maxShaderStorageBlockSize;
1593 break;
1594 default:
1595 UNREACHABLE();
1596 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001597 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001598}
1599
Geoff Lang70d0f492015-12-10 17:45:46 -05001600void Context::getPointerv(GLenum pname, void **params) const
1601{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001602 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001603}
1604
Martin Radev66fb8202016-07-28 11:45:20 +03001605void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001606{
Shannon Woods53a94a82014-06-24 15:20:36 -04001607 // Queries about context capabilities and maximums are answered by Context.
1608 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001609
1610 GLenum nativeType;
1611 unsigned int numParams;
1612 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1613 ASSERT(queryStatus);
1614
1615 if (nativeType == GL_INT)
1616 {
1617 switch (target)
1618 {
1619 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1620 ASSERT(index < 3u);
1621 *data = mCaps.maxComputeWorkGroupCount[index];
1622 break;
1623 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1624 ASSERT(index < 3u);
1625 *data = mCaps.maxComputeWorkGroupSize[index];
1626 break;
1627 default:
1628 mGLState.getIntegeri_v(target, index, data);
1629 }
1630 }
1631 else
1632 {
1633 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1634 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001635}
1636
Martin Radev66fb8202016-07-28 11:45:20 +03001637void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001638{
Shannon Woods53a94a82014-06-24 15:20:36 -04001639 // Queries about context capabilities and maximums are answered by Context.
1640 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001641
1642 GLenum nativeType;
1643 unsigned int numParams;
1644 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1645 ASSERT(queryStatus);
1646
1647 if (nativeType == GL_INT_64_ANGLEX)
1648 {
1649 mGLState.getInteger64i_v(target, index, data);
1650 }
1651 else
1652 {
1653 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1654 }
1655}
1656
1657void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1658{
1659 // Queries about context capabilities and maximums are answered by Context.
1660 // Queries about current GL state values are answered by State.
1661
1662 GLenum nativeType;
1663 unsigned int numParams;
1664 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1665 ASSERT(queryStatus);
1666
1667 if (nativeType == GL_BOOL)
1668 {
1669 mGLState.getBooleani_v(target, index, data);
1670 }
1671 else
1672 {
1673 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1674 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001675}
1676
Corentin Wallez336129f2017-10-17 15:55:40 -04001677void Context::getBufferParameteriv(BufferBinding target, GLenum pname, GLint *params)
He Yunchao010e4db2017-03-03 14:22:06 +08001678{
1679 Buffer *buffer = mGLState.getTargetBuffer(target);
1680 QueryBufferParameteriv(buffer, pname, params);
1681}
1682
1683void Context::getFramebufferAttachmentParameteriv(GLenum target,
1684 GLenum attachment,
1685 GLenum pname,
1686 GLint *params)
1687{
1688 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08001689 QueryFramebufferAttachmentParameteriv(this, framebuffer, attachment, pname, params);
He Yunchao010e4db2017-03-03 14:22:06 +08001690}
1691
1692void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1693{
1694 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1695 QueryRenderbufferiv(this, renderbuffer, pname, params);
1696}
1697
1698void Context::getTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
1699{
1700 Texture *texture = getTargetTexture(target);
1701 QueryTexParameterfv(texture, pname, params);
1702}
1703
1704void Context::getTexParameteriv(GLenum target, GLenum pname, GLint *params)
1705{
1706 Texture *texture = getTargetTexture(target);
1707 QueryTexParameteriv(texture, pname, params);
1708}
Jiajia Qin5451d532017-11-16 17:16:34 +08001709
1710void Context::getTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)
1711{
1712 Texture *texture =
1713 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
1714 QueryTexLevelParameteriv(texture, target, level, pname, params);
1715}
1716
1717void Context::getTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)
1718{
1719 Texture *texture =
1720 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
1721 QueryTexLevelParameterfv(texture, target, level, pname, params);
1722}
1723
He Yunchao010e4db2017-03-03 14:22:06 +08001724void Context::texParameterf(GLenum target, GLenum pname, GLfloat param)
1725{
1726 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001727 SetTexParameterf(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001728 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001729}
1730
1731void Context::texParameterfv(GLenum target, GLenum pname, const GLfloat *params)
1732{
1733 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001734 SetTexParameterfv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001735 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001736}
1737
1738void Context::texParameteri(GLenum target, GLenum pname, GLint param)
1739{
1740 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001741 SetTexParameteri(this, texture, pname, param);
Jamie Madill81c2e252017-09-09 23:32:46 -04001742 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001743}
1744
1745void Context::texParameteriv(GLenum target, GLenum pname, const GLint *params)
1746{
1747 Texture *texture = getTargetTexture(target);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001748 SetTexParameteriv(this, texture, pname, params);
Jamie Madill81c2e252017-09-09 23:32:46 -04001749 onTextureChange(texture);
He Yunchao010e4db2017-03-03 14:22:06 +08001750}
1751
Jamie Madill675fe712016-12-19 13:07:54 -05001752void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001753{
Jamie Madill05b35b22017-10-03 09:01:44 -04001754 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001755 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
1756 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001757}
1758
Jamie Madill675fe712016-12-19 13:07:54 -05001759void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04001760{
Jamie Madill05b35b22017-10-03 09:01:44 -04001761 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001762 ANGLE_CONTEXT_TRY(
1763 mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount));
1764 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
Geoff Langf6db0982015-08-25 13:04:00 -04001765}
1766
Jamie Madill876429b2017-04-20 15:46:24 -04001767void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001768{
Jamie Madill05b35b22017-10-03 09:01:44 -04001769 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001770 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
Geoff Langf6db0982015-08-25 13:04:00 -04001771}
1772
Jamie Madill675fe712016-12-19 13:07:54 -05001773void Context::drawElementsInstanced(GLenum mode,
1774 GLsizei count,
1775 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001776 const void *indices,
Jamie Madill9c9b40a2017-04-26 16:31:57 -04001777 GLsizei instances)
Geoff Langf6db0982015-08-25 13:04:00 -04001778{
Jamie Madill05b35b22017-10-03 09:01:44 -04001779 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001780 ANGLE_CONTEXT_TRY(
Qin Jiajia1da00652017-06-20 17:16:25 +08001781 mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances));
Geoff Langf6db0982015-08-25 13:04:00 -04001782}
1783
Jamie Madill675fe712016-12-19 13:07:54 -05001784void Context::drawRangeElements(GLenum mode,
1785 GLuint start,
1786 GLuint end,
1787 GLsizei count,
1788 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04001789 const void *indices)
Geoff Langf6db0982015-08-25 13:04:00 -04001790{
Jamie Madill05b35b22017-10-03 09:01:44 -04001791 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001792 ANGLE_CONTEXT_TRY(
1793 mImplementation->drawRangeElements(this, mode, start, end, count, type, indices));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001794}
1795
Jamie Madill876429b2017-04-20 15:46:24 -04001796void Context::drawArraysIndirect(GLenum mode, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001797{
Jamie Madill05b35b22017-10-03 09:01:44 -04001798 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001799 ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001800}
1801
Jamie Madill876429b2017-04-20 15:46:24 -04001802void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
Jiajia Qind9671222016-11-29 16:30:31 +08001803{
Jamie Madill05b35b22017-10-03 09:01:44 -04001804 ANGLE_CONTEXT_TRY(prepareForDraw());
Jamie Madillb6664922017-07-25 12:55:04 -04001805 ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
Jiajia Qind9671222016-11-29 16:30:31 +08001806}
1807
Jamie Madill675fe712016-12-19 13:07:54 -05001808void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001809{
Jamie Madillafa02a22017-11-23 12:57:38 -05001810 handleError(mImplementation->flush(this));
Geoff Lang129753a2015-01-09 16:52:09 -05001811}
1812
Jamie Madill675fe712016-12-19 13:07:54 -05001813void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05001814{
Jamie Madillafa02a22017-11-23 12:57:38 -05001815 handleError(mImplementation->finish(this));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001816}
1817
Austin Kinross6ee1e782015-05-29 17:05:37 -07001818void Context::insertEventMarker(GLsizei length, const char *marker)
1819{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001820 ASSERT(mImplementation);
1821 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001822}
1823
1824void Context::pushGroupMarker(GLsizei length, const char *marker)
1825{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001826 ASSERT(mImplementation);
1827 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001828}
1829
1830void Context::popGroupMarker()
1831{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001832 ASSERT(mImplementation);
1833 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001834}
1835
Geoff Langd8605522016-04-13 10:19:12 -04001836void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1837{
1838 Program *programObject = getProgram(program);
1839 ASSERT(programObject);
1840
1841 programObject->bindUniformLocation(location, name);
1842}
1843
Sami Väisänena797e062016-05-12 15:23:40 +03001844void Context::setCoverageModulation(GLenum components)
1845{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001846 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001847}
1848
Sami Väisänene45e53b2016-05-25 10:36:04 +03001849void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1850{
1851 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1852}
1853
1854void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1855{
1856 GLfloat I[16];
1857 angle::Matrix<GLfloat>::setToIdentity(I);
1858
1859 mGLState.loadPathRenderingMatrix(matrixMode, I);
1860}
1861
1862void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1863{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001864 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001865 if (!pathObj)
1866 return;
1867
1868 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1869 syncRendererState();
1870
1871 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1872}
1873
1874void Context::stencilStrokePath(GLuint path, GLint reference, GLuint mask)
1875{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001876 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001877 if (!pathObj)
1878 return;
1879
1880 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1881 syncRendererState();
1882
1883 mImplementation->stencilStrokePath(pathObj, reference, mask);
1884}
1885
1886void Context::coverFillPath(GLuint path, GLenum coverMode)
1887{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001888 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001889 if (!pathObj)
1890 return;
1891
1892 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1893 syncRendererState();
1894
1895 mImplementation->coverFillPath(pathObj, coverMode);
1896}
1897
1898void Context::coverStrokePath(GLuint path, GLenum coverMode)
1899{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001900 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001901 if (!pathObj)
1902 return;
1903
1904 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1905 syncRendererState();
1906
1907 mImplementation->coverStrokePath(pathObj, coverMode);
1908}
1909
1910void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode)
1911{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001912 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001913 if (!pathObj)
1914 return;
1915
1916 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1917 syncRendererState();
1918
1919 mImplementation->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
1920}
1921
1922void Context::stencilThenCoverStrokePath(GLuint path,
1923 GLint reference,
1924 GLuint mask,
1925 GLenum coverMode)
1926{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001927 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001928 if (!pathObj)
1929 return;
1930
1931 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1932 syncRendererState();
1933
1934 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
1935}
1936
Sami Väisänend59ca052016-06-21 16:10:00 +03001937void Context::coverFillPathInstanced(GLsizei numPaths,
1938 GLenum pathNameType,
1939 const void *paths,
1940 GLuint pathBase,
1941 GLenum coverMode,
1942 GLenum transformType,
1943 const GLfloat *transformValues)
1944{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001945 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001946
1947 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1948 syncRendererState();
1949
1950 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
1951}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001952
Sami Väisänend59ca052016-06-21 16:10:00 +03001953void Context::coverStrokePathInstanced(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->coverStrokePathInstanced(pathObjects, coverMode, transformType,
1967 transformValues);
1968}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001969
Sami Väisänend59ca052016-06-21 16:10:00 +03001970void Context::stencilFillPathInstanced(GLsizei numPaths,
1971 GLenum pathNameType,
1972 const void *paths,
1973 GLuint pathBase,
1974 GLenum fillMode,
1975 GLuint mask,
1976 GLenum transformType,
1977 const GLfloat *transformValues)
1978{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001979 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001980
1981 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1982 syncRendererState();
1983
1984 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
1985 transformValues);
1986}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001987
Sami Väisänend59ca052016-06-21 16:10:00 +03001988void Context::stencilStrokePathInstanced(GLsizei numPaths,
1989 GLenum pathNameType,
1990 const void *paths,
1991 GLuint pathBase,
1992 GLint reference,
1993 GLuint mask,
1994 GLenum transformType,
1995 const GLfloat *transformValues)
1996{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001997 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001998
1999 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2000 syncRendererState();
2001
2002 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
2003 transformValues);
2004}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002005
Sami Väisänend59ca052016-06-21 16:10:00 +03002006void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
2007 GLenum pathNameType,
2008 const void *paths,
2009 GLuint pathBase,
2010 GLenum fillMode,
2011 GLuint mask,
2012 GLenum coverMode,
2013 GLenum transformType,
2014 const GLfloat *transformValues)
2015{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002016 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002017
2018 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2019 syncRendererState();
2020
2021 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2022 transformType, transformValues);
2023}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002024
Sami Väisänend59ca052016-06-21 16:10:00 +03002025void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2026 GLenum pathNameType,
2027 const void *paths,
2028 GLuint pathBase,
2029 GLint reference,
2030 GLuint mask,
2031 GLenum coverMode,
2032 GLenum transformType,
2033 const GLfloat *transformValues)
2034{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002035 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002036
2037 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2038 syncRendererState();
2039
2040 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2041 transformType, transformValues);
2042}
2043
Sami Väisänen46eaa942016-06-29 10:26:37 +03002044void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2045{
2046 auto *programObject = getProgram(program);
2047
2048 programObject->bindFragmentInputLocation(location, name);
2049}
2050
2051void Context::programPathFragmentInputGen(GLuint program,
2052 GLint location,
2053 GLenum genMode,
2054 GLint components,
2055 const GLfloat *coeffs)
2056{
2057 auto *programObject = getProgram(program);
2058
Jamie Madillbd044ed2017-06-05 12:59:21 -04002059 programObject->pathFragmentInputGen(this, location, genMode, components, coeffs);
Sami Väisänen46eaa942016-06-29 10:26:37 +03002060}
2061
jchen1015015f72017-03-16 13:54:21 +08002062GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2063{
jchen10fd7c3b52017-03-21 15:36:03 +08002064 const auto *programObject = getProgram(program);
jchen1015015f72017-03-16 13:54:21 +08002065 return QueryProgramResourceIndex(programObject, programInterface, name);
2066}
2067
jchen10fd7c3b52017-03-21 15:36:03 +08002068void Context::getProgramResourceName(GLuint program,
2069 GLenum programInterface,
2070 GLuint index,
2071 GLsizei bufSize,
2072 GLsizei *length,
2073 GLchar *name)
2074{
2075 const auto *programObject = getProgram(program);
2076 QueryProgramResourceName(programObject, programInterface, index, bufSize, length, name);
2077}
2078
jchen10191381f2017-04-11 13:59:04 +08002079GLint Context::getProgramResourceLocation(GLuint program,
2080 GLenum programInterface,
2081 const GLchar *name)
2082{
2083 const auto *programObject = getProgram(program);
2084 return QueryProgramResourceLocation(programObject, programInterface, name);
2085}
2086
jchen10880683b2017-04-12 16:21:55 +08002087void Context::getProgramResourceiv(GLuint program,
2088 GLenum programInterface,
2089 GLuint index,
2090 GLsizei propCount,
2091 const GLenum *props,
2092 GLsizei bufSize,
2093 GLsizei *length,
2094 GLint *params)
2095{
2096 const auto *programObject = getProgram(program);
2097 QueryProgramResourceiv(programObject, programInterface, index, propCount, props, bufSize,
2098 length, params);
2099}
2100
jchen10d9cd7b72017-08-30 15:04:25 +08002101void Context::getProgramInterfaceiv(GLuint program,
2102 GLenum programInterface,
2103 GLenum pname,
2104 GLint *params)
2105{
2106 const auto *programObject = getProgram(program);
2107 QueryProgramInterfaceiv(programObject, programInterface, pname, params);
2108}
2109
Jamie Madill71c88b32017-09-14 22:20:29 -04002110void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002111{
Geoff Langda5777c2014-07-11 09:52:58 -04002112 if (error.isError())
2113 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002114 GLenum code = error.getCode();
2115 mErrors.insert(code);
2116 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2117 {
2118 markContextLost();
2119 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002120
Geoff Langee6884e2017-11-09 16:51:11 -05002121 ASSERT(!error.getMessage().empty());
2122 mGLState.getDebug().insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2123 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Langda5777c2014-07-11 09:52:58 -04002124 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002125}
2126
2127// Get one of the recorded errors and clear its flag, if any.
2128// [OpenGL ES 2.0.24] section 2.5 page 13.
2129GLenum Context::getError()
2130{
Geoff Langda5777c2014-07-11 09:52:58 -04002131 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002132 {
Geoff Langda5777c2014-07-11 09:52:58 -04002133 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002134 }
Geoff Langda5777c2014-07-11 09:52:58 -04002135 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002136 {
Geoff Langda5777c2014-07-11 09:52:58 -04002137 GLenum error = *mErrors.begin();
2138 mErrors.erase(mErrors.begin());
2139 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002140 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002141}
2142
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002143// NOTE: this function should not assume that this context is current!
2144void Context::markContextLost()
2145{
2146 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002147 {
Jamie Madill231c7f52017-04-26 13:45:37 -04002148 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002149 mContextLostForced = true;
2150 }
Jamie Madill231c7f52017-04-26 13:45:37 -04002151 mContextLost = true;
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002152}
2153
2154bool Context::isContextLost()
2155{
2156 return mContextLost;
2157}
2158
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002159GLenum Context::getResetStatus()
2160{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002161 // Even if the application doesn't want to know about resets, we want to know
2162 // as it will allow us to skip all the calls.
2163 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002164 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002165 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002166 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002167 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002168 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002169
2170 // EXT_robustness, section 2.6: If the reset notification behavior is
2171 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2172 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2173 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002174 }
2175
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002176 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2177 // status should be returned at least once, and GL_NO_ERROR should be returned
2178 // once the device has finished resetting.
2179 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002180 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002181 ASSERT(mResetStatus == GL_NO_ERROR);
2182 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002183
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002184 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002185 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002186 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002187 }
2188 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002189 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002190 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002191 // If markContextLost was used to mark the context lost then
2192 // assume that is not recoverable, and continue to report the
2193 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002194 mResetStatus = mImplementation->getResetStatus();
2195 }
Jamie Madill893ab082014-05-16 16:56:10 -04002196
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002197 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002198}
2199
2200bool Context::isResetNotificationEnabled()
2201{
2202 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2203}
2204
Corentin Walleze3b10e82015-05-20 11:06:25 -04002205const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002206{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002207 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002208}
2209
2210EGLenum Context::getClientType() const
2211{
2212 return mClientType;
2213}
2214
2215EGLenum Context::getRenderBuffer() const
2216{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002217 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2218 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002219 {
2220 return EGL_NONE;
2221 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002222
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002223 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(this, GL_BACK);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002224 ASSERT(backAttachment != nullptr);
2225 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002226}
2227
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002228VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002229{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002230 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002231 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2232 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002233 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002234 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2235 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002236
Jamie Madill96a483b2017-06-27 16:49:21 -04002237 mVertexArrayMap.assign(vertexArrayHandle, vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002238 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002239
2240 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002241}
2242
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002243TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002244{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002245 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002246 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2247 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002248 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002249 transformFeedback =
2250 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002251 transformFeedback->addRef();
Jamie Madill96a483b2017-06-27 16:49:21 -04002252 mTransformFeedbackMap.assign(transformFeedbackHandle, transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002253 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002254
2255 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002256}
2257
2258bool Context::isVertexArrayGenerated(GLuint vertexArray)
2259{
Jamie Madill96a483b2017-06-27 16:49:21 -04002260 ASSERT(mVertexArrayMap.contains(0));
2261 return mVertexArrayMap.contains(vertexArray);
Geoff Lang36167ab2015-12-07 10:27:14 -05002262}
2263
2264bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2265{
Jamie Madill96a483b2017-06-27 16:49:21 -04002266 ASSERT(mTransformFeedbackMap.contains(0));
2267 return mTransformFeedbackMap.contains(transformFeedback);
Geoff Lang36167ab2015-12-07 10:27:14 -05002268}
2269
Shannon Woods53a94a82014-06-24 15:20:36 -04002270void Context::detachTexture(GLuint texture)
2271{
2272 // Simple pass-through to State's detachTexture method, as textures do not require
2273 // allocation map management either here or in the resource manager at detach time.
2274 // Zero textures are held by the Context, and we don't attempt to request them from
2275 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002276 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002277}
2278
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002279void Context::detachBuffer(GLuint buffer)
2280{
Yuly Novikov5807a532015-12-03 13:01:22 -05002281 // Simple pass-through to State's detachBuffer method, since
2282 // only buffer attachments to container objects that are bound to the current context
2283 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002284
Yuly Novikov5807a532015-12-03 13:01:22 -05002285 // [OpenGL ES 3.2] section 5.1.2 page 45:
2286 // Attachments to unbound container objects, such as
2287 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2288 // are not affected and continue to act as references on the deleted object
Jamie Madill4928b7c2017-06-20 12:57:39 -04002289 mGLState.detachBuffer(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002290}
2291
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002292void Context::detachFramebuffer(GLuint framebuffer)
2293{
Shannon Woods53a94a82014-06-24 15:20:36 -04002294 // Framebuffer detachment is handled by Context, because 0 is a valid
2295 // Framebuffer object, and a pointer to it must be passed from Context
2296 // to State at binding time.
2297
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002298 // [OpenGL ES 2.0.24] section 4.4 page 107:
Jamie Madill231c7f52017-04-26 13:45:37 -04002299 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as
2300 // though BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of
2301 // zero.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002302
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002303 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002304 {
2305 bindReadFramebuffer(0);
2306 }
2307
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002308 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002309 {
2310 bindDrawFramebuffer(0);
2311 }
2312}
2313
2314void Context::detachRenderbuffer(GLuint renderbuffer)
2315{
Jamie Madilla02315b2017-02-23 14:14:47 -05002316 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002317}
2318
Jamie Madill57a89722013-07-02 11:57:03 -04002319void Context::detachVertexArray(GLuint vertexArray)
2320{
Jamie Madill77a72f62015-04-14 11:18:32 -04002321 // Vertex array detachment is handled by Context, because 0 is a valid
2322 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002323 // binding time.
2324
Jamie Madill57a89722013-07-02 11:57:03 -04002325 // [OpenGL ES 3.0.2] section 2.10 page 43:
2326 // If a vertex array object that is currently bound is deleted, the binding
2327 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002328 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002329 {
2330 bindVertexArray(0);
2331 }
2332}
2333
Geoff Langc8058452014-02-03 12:04:11 -05002334void Context::detachTransformFeedback(GLuint transformFeedback)
2335{
Corentin Walleza2257da2016-04-19 16:43:12 -04002336 // Transform feedback detachment is handled by Context, because 0 is a valid
2337 // transform feedback, and a pointer to it must be passed from Context to State at
2338 // binding time.
2339
2340 // The OpenGL specification doesn't mention what should happen when the currently bound
2341 // transform feedback object is deleted. Since it is a container object, we treat it like
2342 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madill4928b7c2017-06-20 12:57:39 -04002343 if (mGLState.removeTransformFeedbackBinding(this, transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002344 {
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04002345 bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
Corentin Walleza2257da2016-04-19 16:43:12 -04002346 }
Geoff Langc8058452014-02-03 12:04:11 -05002347}
2348
Jamie Madilldc356042013-07-19 16:36:57 -04002349void Context::detachSampler(GLuint sampler)
2350{
Jamie Madill4928b7c2017-06-20 12:57:39 -04002351 mGLState.detachSampler(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002352}
2353
Yunchao Hea336b902017-08-02 16:05:21 +08002354void Context::detachProgramPipeline(GLuint pipeline)
2355{
2356 mGLState.detachProgramPipeline(this, pipeline);
2357}
2358
Jamie Madill3ef140a2017-08-26 23:11:21 -04002359void Context::vertexAttribDivisor(GLuint index, GLuint divisor)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002360{
Shaodde78e82017-05-22 14:13:27 +08002361 mGLState.setVertexAttribDivisor(this, index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002362}
2363
Jamie Madille29d1672013-07-19 16:36:57 -04002364void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2365{
Geoff Langc1984ed2016-10-07 12:41:00 -04002366 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002367 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002368 SetSamplerParameteri(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002369 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002370}
Jamie Madille29d1672013-07-19 16:36:57 -04002371
Geoff Langc1984ed2016-10-07 12:41:00 -04002372void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2373{
2374 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002375 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002376 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002377 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002378}
2379
2380void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat 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 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002385 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madille29d1672013-07-19 16:36:57 -04002386}
2387
Geoff Langc1984ed2016-10-07 12:41:00 -04002388void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002389{
Geoff Langc1984ed2016-10-07 12:41:00 -04002390 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002391 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002392 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002393 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002394}
2395
Geoff Langc1984ed2016-10-07 12:41:00 -04002396void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002397{
Geoff Langc1984ed2016-10-07 12:41:00 -04002398 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002399 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002400 QuerySamplerParameteriv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002401 mGLState.setObjectDirty(GL_SAMPLER);
Geoff Langc1984ed2016-10-07 12:41:00 -04002402}
Jamie Madill9675b802013-07-19 16:36:59 -04002403
Geoff Langc1984ed2016-10-07 12:41:00 -04002404void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2405{
2406 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002407 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002408 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002409 mGLState.setObjectDirty(GL_SAMPLER);
Jamie Madill9675b802013-07-19 16:36:59 -04002410}
2411
Olli Etuahof0fee072016-03-30 15:11:58 +03002412void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2413{
2414 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002415 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002416}
2417
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002418void Context::initRendererString()
2419{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002420 std::ostringstream rendererString;
2421 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002422 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002423 rendererString << ")";
2424
Geoff Langcec35902014-04-16 10:52:36 -04002425 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002426}
2427
Geoff Langc339c4e2016-11-29 10:37:36 -05002428void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002429{
Geoff Langc339c4e2016-11-29 10:37:36 -05002430 const Version &clientVersion = getClientVersion();
2431
2432 std::ostringstream versionString;
2433 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2434 << ANGLE_VERSION_STRING << ")";
2435 mVersionString = MakeStaticString(versionString.str());
2436
2437 std::ostringstream shadingLanguageVersionString;
2438 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2439 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2440 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2441 << ")";
2442 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002443}
2444
Geoff Langcec35902014-04-16 10:52:36 -04002445void Context::initExtensionStrings()
2446{
Geoff Langc339c4e2016-11-29 10:37:36 -05002447 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2448 std::ostringstream combinedStringStream;
2449 std::copy(strings.begin(), strings.end(),
2450 std::ostream_iterator<const char *>(combinedStringStream, " "));
2451 return MakeStaticString(combinedStringStream.str());
2452 };
2453
2454 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002455 for (const auto &extensionString : mExtensions.getStrings())
2456 {
2457 mExtensionStrings.push_back(MakeStaticString(extensionString));
2458 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002459 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002460
Bryan Bernhart58806562017-01-05 13:09:31 -08002461 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2462
Geoff Langc339c4e2016-11-29 10:37:36 -05002463 mRequestableExtensionStrings.clear();
2464 for (const auto &extensionInfo : GetExtensionInfoMap())
2465 {
2466 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002467 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2468 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002469 {
2470 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2471 }
2472 }
2473 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002474}
2475
Geoff Langc339c4e2016-11-29 10:37:36 -05002476const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002477{
Geoff Langc339c4e2016-11-29 10:37:36 -05002478 switch (name)
2479 {
2480 case GL_VENDOR:
2481 return reinterpret_cast<const GLubyte *>("Google Inc.");
2482
2483 case GL_RENDERER:
2484 return reinterpret_cast<const GLubyte *>(mRendererString);
2485
2486 case GL_VERSION:
2487 return reinterpret_cast<const GLubyte *>(mVersionString);
2488
2489 case GL_SHADING_LANGUAGE_VERSION:
2490 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2491
2492 case GL_EXTENSIONS:
2493 return reinterpret_cast<const GLubyte *>(mExtensionString);
2494
2495 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2496 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2497
2498 default:
2499 UNREACHABLE();
2500 return nullptr;
2501 }
Geoff Langcec35902014-04-16 10:52:36 -04002502}
2503
Geoff Langc339c4e2016-11-29 10:37:36 -05002504const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002505{
Geoff Langc339c4e2016-11-29 10:37:36 -05002506 switch (name)
2507 {
2508 case GL_EXTENSIONS:
2509 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2510
2511 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2512 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2513
2514 default:
2515 UNREACHABLE();
2516 return nullptr;
2517 }
Geoff Langcec35902014-04-16 10:52:36 -04002518}
2519
2520size_t Context::getExtensionStringCount() const
2521{
2522 return mExtensionStrings.size();
2523}
2524
Geoff Lang111a99e2017-10-17 10:58:41 -04002525bool Context::isExtensionRequestable(const char *name)
2526{
2527 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2528 auto extension = extensionInfos.find(name);
2529
2530 const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2531 return extension != extensionInfos.end() && extension->second.Requestable &&
2532 nativeExtensions.*(extension->second.ExtensionsMember);
2533}
2534
Geoff Langc339c4e2016-11-29 10:37:36 -05002535void Context::requestExtension(const char *name)
2536{
2537 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2538 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2539 const auto &extension = extensionInfos.at(name);
2540 ASSERT(extension.Requestable);
Geoff Lang111a99e2017-10-17 10:58:41 -04002541 ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
Geoff Langc339c4e2016-11-29 10:37:36 -05002542
2543 if (mExtensions.*(extension.ExtensionsMember))
2544 {
2545 // Extension already enabled
2546 return;
2547 }
2548
2549 mExtensions.*(extension.ExtensionsMember) = true;
2550 updateCaps();
2551 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002552
Jamie Madill2f348d22017-06-05 10:50:59 -04002553 // Release the shader compiler so it will be re-created with the requested extensions enabled.
2554 releaseShaderCompiler();
Geoff Lang9aded172017-04-05 11:07:56 -04002555
Jamie Madill81c2e252017-09-09 23:32:46 -04002556 // Invalidate all textures and framebuffer. Some extensions make new formats renderable or
2557 // sampleable.
2558 mState.mTextures->signalAllTexturesDirty();
Geoff Lang9aded172017-04-05 11:07:56 -04002559 for (auto &zeroTexture : mZeroTextures)
2560 {
Jamie Madill05b35b22017-10-03 09:01:44 -04002561 zeroTexture.second->signalDirty(InitState::Initialized);
Geoff Lang9aded172017-04-05 11:07:56 -04002562 }
2563
2564 mState.mFramebuffers->invalidateFramebufferComplenessCache();
Geoff Langc339c4e2016-11-29 10:37:36 -05002565}
2566
2567size_t Context::getRequestableExtensionStringCount() const
2568{
2569 return mRequestableExtensionStrings.size();
2570}
2571
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002572void Context::beginTransformFeedback(GLenum primitiveMode)
2573{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002574 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002575 ASSERT(transformFeedback != nullptr);
2576 ASSERT(!transformFeedback->isPaused());
2577
Jamie Madill6c1f6712017-02-14 19:08:04 -05002578 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002579}
2580
2581bool Context::hasActiveTransformFeedback(GLuint program) const
2582{
2583 for (auto pair : mTransformFeedbackMap)
2584 {
2585 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2586 {
2587 return true;
2588 }
2589 }
2590 return false;
2591}
2592
Geoff Langb433e872017-10-05 14:01:47 -04002593void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Geoff Lang493daf52014-07-03 13:38:44 -04002594{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002595 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002596
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002597 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002598
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002599 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002600
Geoff Langeb66a6e2016-10-31 13:06:12 -04002601 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002602 {
2603 // Disable ES3+ extensions
Jamie Madill231c7f52017-04-26 13:45:37 -04002604 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002605 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002606 mExtensions.textureNorm16 = false;
Martin Radev137032d2017-07-13 10:11:12 +03002607 mExtensions.multiview = false;
2608 mExtensions.maxViews = 1u;
Geoff Lang493daf52014-07-03 13:38:44 -04002609 }
2610
Jiawei Shao89be29a2017-11-06 14:36:45 +08002611 if (getClientVersion() < ES_3_1)
2612 {
2613 // Disable ES3.1+ extensions
2614 mExtensions.geometryShader = false;
2615 }
2616
Geoff Langeb66a6e2016-10-31 13:06:12 -04002617 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002618 {
2619 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
Jamie Madill231c7f52017-04-26 13:45:37 -04002620 // mExtensions.sRGB = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002621 }
2622
Jamie Madill00ed7a12016-05-19 13:13:38 -04002623 // Some extensions are always available because they are implemented in the GL layer.
Jamie Madill231c7f52017-04-26 13:45:37 -04002624 mExtensions.bindUniformLocation = true;
2625 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04002626 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05002627 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05002628 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04002629
2630 // Enable the no error extension if the context was created with the flag.
2631 mExtensions.noError = mSkipValidation;
2632
Corentin Wallezccab69d2017-01-27 16:57:15 -05002633 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05002634 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05002635
Geoff Lang70d0f492015-12-10 17:45:46 -05002636 // Explicitly enable GL_KHR_debug
2637 mExtensions.debug = true;
2638 mExtensions.maxDebugMessageLength = 1024;
2639 mExtensions.maxDebugLoggedMessages = 1024;
2640 mExtensions.maxDebugGroupStackDepth = 1024;
2641 mExtensions.maxLabelLength = 1024;
2642
Geoff Langff5b2d52016-09-07 11:32:23 -04002643 // Explicitly enable GL_ANGLE_robust_client_memory
2644 mExtensions.robustClientMemory = true;
2645
Jamie Madille08a1d32017-03-07 17:24:06 -05002646 // Determine robust resource init availability from EGL.
Geoff Langb433e872017-10-05 14:01:47 -04002647 mExtensions.robustResourceInitialization = robustResourceInit;
Jamie Madille08a1d32017-03-07 17:24:06 -05002648
Jiajia Qin8a7b3a02017-08-25 16:05:48 +08002649 // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
2650 // supports it.
2651 mExtensions.robustBufferAccessBehavior =
2652 mRobustAccess && mExtensions.robustBufferAccessBehavior;
2653
Jamie Madillc43be722017-07-13 16:22:14 -04002654 // Enable the cache control query unconditionally.
2655 mExtensions.programCacheControl = true;
2656
Geoff Lang301d1612014-07-09 10:34:37 -04002657 // Apply implementation limits
Jamie Madill0f80ed82017-09-19 00:24:56 -04002658 LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002659
Jamie Madill0f80ed82017-09-19 00:24:56 -04002660 if (getClientVersion() < ES_3_1)
2661 {
2662 mCaps.maxVertexAttribBindings = mCaps.maxVertexAttributes;
2663 }
2664 else
2665 {
2666 LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
2667 }
Geoff Lang301d1612014-07-09 10:34:37 -04002668
Jamie Madill0f80ed82017-09-19 00:24:56 -04002669 LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2670 LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2671 LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2672
2673 // Limit textures as well, so we can use fast bitsets with texture bindings.
2674 LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
2675 LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
2676 LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
Geoff Lang3a61c322014-07-10 13:01:54 -04002677
Jiawei Shaodb342272017-09-27 10:21:45 +08002678 mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
2679
Geoff Langc287ea62016-09-16 14:46:51 -04002680 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002681 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04002682 for (const auto &extensionInfo : GetExtensionInfoMap())
2683 {
2684 // If this context is for WebGL, disable all enableable extensions
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002685 if (mWebGLContext && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04002686 {
2687 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
2688 }
2689 }
2690
2691 // Generate texture caps
2692 updateCaps();
2693}
2694
2695void Context::updateCaps()
2696{
Geoff Lang900013c2014-07-07 11:32:19 -04002697 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002698 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04002699
Jamie Madill7b62cf92017-11-02 15:20:49 -04002700 for (GLenum sizedInternalFormat : GetAllSizedInternalFormats())
Geoff Lang493daf52014-07-03 13:38:44 -04002701 {
Jamie Madill7b62cf92017-11-02 15:20:49 -04002702 TextureCaps formatCaps = mImplementation->getNativeTextureCaps().get(sizedInternalFormat);
Geoff Langca271392017-04-05 12:30:00 -04002703 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002704
Geoff Lang0d8b7242015-09-09 14:56:53 -04002705 // Update the format caps based on the client version and extensions.
2706 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2707 // ES3.
2708 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002709 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002710 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002711 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002712 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002713 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002714
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002715 // OpenGL ES does not support multisampling with non-rendererable formats
2716 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
Olli Etuaho50c562d2017-06-06 14:43:30 +03002717 if (!formatCaps.renderable ||
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002718 (getClientVersion() < ES_3_1 &&
2719 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04002720 {
Geoff Langd87878e2014-09-19 15:42:59 -04002721 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002722 }
Olli Etuaho50c562d2017-06-06 14:43:30 +03002723 else
2724 {
2725 // We may have limited the max samples for some required renderbuffer formats due to
2726 // non-conformant formats. In this case MAX_SAMPLES needs to be lowered accordingly.
2727 GLuint formatMaxSamples = formatCaps.getMaxSamples();
2728
2729 // GLES 3.0.5 section 4.4.2.2: "Implementations must support creation of renderbuffers
2730 // in these required formats with up to the value of MAX_SAMPLES multisamples, with the
2731 // exception of signed and unsigned integer formats."
2732 if (formatInfo.componentType != GL_INT && formatInfo.componentType != GL_UNSIGNED_INT &&
2733 formatInfo.isRequiredRenderbufferFormat(getClientVersion()))
2734 {
2735 ASSERT(getClientVersion() < ES_3_0 || formatMaxSamples >= 4);
2736 mCaps.maxSamples = std::min(mCaps.maxSamples, formatMaxSamples);
2737 }
2738
2739 // Handle GLES 3.1 MAX_*_SAMPLES values similarly to MAX_SAMPLES.
2740 if (getClientVersion() >= ES_3_1)
2741 {
2742 // GLES 3.1 section 9.2.5: "Implementations must support creation of renderbuffers
2743 // in these required formats with up to the value of MAX_SAMPLES multisamples, with
2744 // the exception that the signed and unsigned integer formats are required only to
2745 // support creation of renderbuffers with up to the value of MAX_INTEGER_SAMPLES
2746 // multisamples, which must be at least one."
2747 if (formatInfo.componentType == GL_INT ||
2748 formatInfo.componentType == GL_UNSIGNED_INT)
2749 {
2750 mCaps.maxIntegerSamples = std::min(mCaps.maxIntegerSamples, formatMaxSamples);
2751 }
2752
2753 // GLES 3.1 section 19.3.1.
2754 if (formatCaps.texturable)
2755 {
2756 if (formatInfo.depthBits > 0)
2757 {
2758 mCaps.maxDepthTextureSamples =
2759 std::min(mCaps.maxDepthTextureSamples, formatMaxSamples);
2760 }
2761 else if (formatInfo.redBits > 0)
2762 {
2763 mCaps.maxColorTextureSamples =
2764 std::min(mCaps.maxColorTextureSamples, formatMaxSamples);
2765 }
2766 }
2767 }
2768 }
Geoff Langd87878e2014-09-19 15:42:59 -04002769
2770 if (formatCaps.texturable && formatInfo.compressed)
2771 {
Geoff Langca271392017-04-05 12:30:00 -04002772 mCaps.compressedTextureFormats.push_back(sizedInternalFormat);
Geoff Langd87878e2014-09-19 15:42:59 -04002773 }
2774
Geoff Langca271392017-04-05 12:30:00 -04002775 mTextureCaps.insert(sizedInternalFormat, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002776 }
Jamie Madill32447362017-06-28 14:53:52 -04002777
2778 // If program binary is disabled, blank out the memory cache pointer.
2779 if (!mImplementation->getNativeExtensions().getProgramBinary)
2780 {
2781 mMemoryProgramCache = nullptr;
2782 }
Corentin Walleze4477002017-12-01 14:39:58 -05002783
2784 // Compute which buffer types are allowed
2785 mValidBufferBindings.reset();
2786 mValidBufferBindings.set(BufferBinding::ElementArray);
2787 mValidBufferBindings.set(BufferBinding::Array);
2788
2789 if (mExtensions.pixelBufferObject || getClientVersion() >= ES_3_0)
2790 {
2791 mValidBufferBindings.set(BufferBinding::PixelPack);
2792 mValidBufferBindings.set(BufferBinding::PixelUnpack);
2793 }
2794
2795 if (getClientVersion() >= ES_3_0)
2796 {
2797 mValidBufferBindings.set(BufferBinding::CopyRead);
2798 mValidBufferBindings.set(BufferBinding::CopyWrite);
2799 mValidBufferBindings.set(BufferBinding::TransformFeedback);
2800 mValidBufferBindings.set(BufferBinding::Uniform);
2801 }
2802
2803 if (getClientVersion() >= ES_3_1)
2804 {
2805 mValidBufferBindings.set(BufferBinding::AtomicCounter);
2806 mValidBufferBindings.set(BufferBinding::ShaderStorage);
2807 mValidBufferBindings.set(BufferBinding::DrawIndirect);
2808 mValidBufferBindings.set(BufferBinding::DispatchIndirect);
2809 }
Geoff Lang493daf52014-07-03 13:38:44 -04002810}
2811
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002812void Context::initWorkarounds()
2813{
Jamie Madill761b02c2017-06-23 16:27:06 -04002814 // Apply back-end workarounds.
2815 mImplementation->applyNativeWorkarounds(&mWorkarounds);
2816
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002817 // Lose the context upon out of memory error if the application is
2818 // expecting to watch for those events.
2819 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2820}
2821
Jamie Madill05b35b22017-10-03 09:01:44 -04002822Error Context::prepareForDraw()
2823{
2824 syncRendererState();
Jamie Madilla59fc192017-11-02 12:57:58 -04002825
2826 if (isRobustResourceInitEnabled())
2827 {
2828 ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
2829 ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
2830 }
2831
Jamie Madill05b35b22017-10-03 09:01:44 -04002832 return NoError();
2833}
2834
Jamie Madill1b94d432015-08-07 13:23:23 -04002835void Context::syncRendererState()
2836{
Jamie Madill7d1f5c62017-09-02 15:32:15 -04002837 mGLState.syncDirtyObjects(this);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002838 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Jamie Madillfe548342017-06-19 11:13:24 -04002839 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002840 mGLState.clearDirtyBits();
Jamie Madill1b94d432015-08-07 13:23:23 -04002841}
2842
Jamie Madillad9f24e2016-02-12 09:27:24 -05002843void Context::syncRendererState(const State::DirtyBits &bitMask,
2844 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002845{
Jamie Madill7d1f5c62017-09-02 15:32:15 -04002846 mGLState.syncDirtyObjects(this, objectMask);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002847 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Jamie Madillfe548342017-06-19 11:13:24 -04002848 mImplementation->syncState(this, dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002849 mGLState.clearDirtyBits(dirtyBits);
Jamie Madill1b94d432015-08-07 13:23:23 -04002850}
Jamie Madillc29968b2016-01-20 11:17:23 -05002851
2852void Context::blitFramebuffer(GLint srcX0,
2853 GLint srcY0,
2854 GLint srcX1,
2855 GLint srcY1,
2856 GLint dstX0,
2857 GLint dstY0,
2858 GLint dstX1,
2859 GLint dstY1,
2860 GLbitfield mask,
2861 GLenum filter)
2862{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002863 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002864 ASSERT(drawFramebuffer);
2865
2866 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2867 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2868
Jamie Madillad9f24e2016-02-12 09:27:24 -05002869 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002870
Jamie Madillc564c072017-06-01 12:45:42 -04002871 handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002872}
Jamie Madillc29968b2016-01-20 11:17:23 -05002873
2874void Context::clear(GLbitfield mask)
2875{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002876 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002877 handleError(mGLState.getDrawFramebuffer()->clear(this, mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05002878}
2879
2880void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2881{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002882 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002883 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002884}
2885
2886void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2887{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002888 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002889 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002890}
2891
2892void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2893{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002894 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002895 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002896}
2897
2898void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2899{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002900 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002901 ASSERT(framebufferObject);
2902
2903 // If a buffer is not present, the clear has no effect
2904 if (framebufferObject->getDepthbuffer() == nullptr &&
2905 framebufferObject->getStencilbuffer() == nullptr)
2906 {
2907 return;
2908 }
2909
Jamie Madillad9f24e2016-02-12 09:27:24 -05002910 syncStateForClear();
Jamie Madillc564c072017-06-01 12:45:42 -04002911 handleError(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05002912}
2913
2914void Context::readPixels(GLint x,
2915 GLint y,
2916 GLsizei width,
2917 GLsizei height,
2918 GLenum format,
2919 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002920 void *pixels)
Jamie Madillc29968b2016-01-20 11:17:23 -05002921{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002922 if (width == 0 || height == 0)
2923 {
2924 return;
2925 }
2926
Jamie Madillad9f24e2016-02-12 09:27:24 -05002927 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002928
Jamie Madillb6664922017-07-25 12:55:04 -04002929 Framebuffer *readFBO = mGLState.getReadFramebuffer();
2930 ASSERT(readFBO);
Jamie Madillc29968b2016-01-20 11:17:23 -05002931
2932 Rectangle area(x, y, width, height);
Jamie Madillb6664922017-07-25 12:55:04 -04002933 handleError(readFBO->readPixels(this, area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05002934}
2935
2936void Context::copyTexImage2D(GLenum target,
2937 GLint level,
2938 GLenum internalformat,
2939 GLint x,
2940 GLint y,
2941 GLsizei width,
2942 GLsizei height,
2943 GLint border)
2944{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002945 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002946 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002947
Jamie Madillc29968b2016-01-20 11:17:23 -05002948 Rectangle sourceArea(x, y, width, height);
2949
Jamie Madill05b35b22017-10-03 09:01:44 -04002950 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002951 Texture *texture =
2952 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002953 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002954}
2955
2956void Context::copyTexSubImage2D(GLenum target,
2957 GLint level,
2958 GLint xoffset,
2959 GLint yoffset,
2960 GLint x,
2961 GLint y,
2962 GLsizei width,
2963 GLsizei height)
2964{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002965 if (width == 0 || height == 0)
2966 {
2967 return;
2968 }
2969
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002970 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002971 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002972
Jamie Madillc29968b2016-01-20 11:17:23 -05002973 Offset destOffset(xoffset, yoffset, 0);
2974 Rectangle sourceArea(x, y, width, height);
2975
Jamie Madill05b35b22017-10-03 09:01:44 -04002976 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002977 Texture *texture =
2978 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002979 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002980}
2981
2982void Context::copyTexSubImage3D(GLenum target,
2983 GLint level,
2984 GLint xoffset,
2985 GLint yoffset,
2986 GLint zoffset,
2987 GLint x,
2988 GLint y,
2989 GLsizei width,
2990 GLsizei height)
2991{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002992 if (width == 0 || height == 0)
2993 {
2994 return;
2995 }
2996
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002997 // Only sync the read FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002998 mGLState.syncDirtyObject(this, GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002999
Jamie Madillc29968b2016-01-20 11:17:23 -05003000 Offset destOffset(xoffset, yoffset, zoffset);
3001 Rectangle sourceArea(x, y, width, height);
3002
Jamie Madill05b35b22017-10-03 09:01:44 -04003003 Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3004 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003005 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05003006}
3007
3008void Context::framebufferTexture2D(GLenum target,
3009 GLenum attachment,
3010 GLenum textarget,
3011 GLuint texture,
3012 GLint level)
3013{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003014 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003015 ASSERT(framebuffer);
3016
3017 if (texture != 0)
3018 {
3019 Texture *textureObj = getTexture(texture);
3020
3021 ImageIndex index = ImageIndex::MakeInvalid();
3022
3023 if (textarget == GL_TEXTURE_2D)
3024 {
3025 index = ImageIndex::Make2D(level);
3026 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -04003027 else if (textarget == GL_TEXTURE_RECTANGLE_ANGLE)
3028 {
3029 index = ImageIndex::MakeRectangle(level);
3030 }
JiangYizhoubddc46b2016-12-09 09:50:51 +08003031 else if (textarget == GL_TEXTURE_2D_MULTISAMPLE)
3032 {
3033 ASSERT(level == 0);
3034 index = ImageIndex::Make2DMultisample();
3035 }
Jamie Madillc29968b2016-01-20 11:17:23 -05003036 else
3037 {
3038 ASSERT(IsCubeMapTextureTarget(textarget));
3039 index = ImageIndex::MakeCube(textarget, level);
3040 }
3041
Jamie Madilla02315b2017-02-23 14:14:47 -05003042 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05003043 }
3044 else
3045 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003046 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003047 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003048
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003049 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003050}
3051
3052void Context::framebufferRenderbuffer(GLenum target,
3053 GLenum attachment,
3054 GLenum renderbuffertarget,
3055 GLuint renderbuffer)
3056{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003057 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003058 ASSERT(framebuffer);
3059
3060 if (renderbuffer != 0)
3061 {
3062 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05003063
3064 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05003065 renderbufferObject);
3066 }
3067 else
3068 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003069 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003070 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003071
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003072 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003073}
3074
3075void Context::framebufferTextureLayer(GLenum target,
3076 GLenum attachment,
3077 GLuint texture,
3078 GLint level,
3079 GLint layer)
3080{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003081 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003082 ASSERT(framebuffer);
3083
3084 if (texture != 0)
3085 {
3086 Texture *textureObject = getTexture(texture);
3087
3088 ImageIndex index = ImageIndex::MakeInvalid();
3089
3090 if (textureObject->getTarget() == GL_TEXTURE_3D)
3091 {
3092 index = ImageIndex::Make3D(level, layer);
3093 }
3094 else
3095 {
3096 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
3097 index = ImageIndex::Make2DArray(level, layer);
3098 }
3099
Jamie Madilla02315b2017-02-23 14:14:47 -05003100 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05003101 }
3102 else
3103 {
Jamie Madilla02315b2017-02-23 14:14:47 -05003104 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05003105 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003106
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003107 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003108}
3109
Martin Radev137032d2017-07-13 10:11:12 +03003110void Context::framebufferTextureMultiviewLayeredANGLE(GLenum target,
3111 GLenum attachment,
3112 GLuint texture,
3113 GLint level,
3114 GLint baseViewIndex,
3115 GLsizei numViews)
3116{
Martin Radev82ef7742017-08-08 17:44:58 +03003117 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3118 ASSERT(framebuffer);
3119
3120 if (texture != 0)
3121 {
3122 Texture *textureObj = getTexture(texture);
3123
Martin Radev18b75ba2017-08-15 15:50:40 +03003124 ImageIndex index = ImageIndex::Make2DArrayRange(level, baseViewIndex, numViews);
Martin Radev82ef7742017-08-08 17:44:58 +03003125 framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
3126 numViews, baseViewIndex);
3127 }
3128 else
3129 {
3130 framebuffer->resetAttachment(this, attachment);
3131 }
3132
3133 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003134}
3135
3136void Context::framebufferTextureMultiviewSideBySideANGLE(GLenum target,
3137 GLenum attachment,
3138 GLuint texture,
3139 GLint level,
3140 GLsizei numViews,
3141 const GLint *viewportOffsets)
3142{
Martin Radev5dae57b2017-07-14 16:15:55 +03003143 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3144 ASSERT(framebuffer);
3145
3146 if (texture != 0)
3147 {
3148 Texture *textureObj = getTexture(texture);
3149
3150 ImageIndex index = ImageIndex::Make2D(level);
3151 framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
3152 textureObj, numViews, viewportOffsets);
3153 }
3154 else
3155 {
3156 framebuffer->resetAttachment(this, attachment);
3157 }
3158
3159 mGLState.setObjectDirty(target);
Martin Radev137032d2017-07-13 10:11:12 +03003160}
3161
Jamie Madillc29968b2016-01-20 11:17:23 -05003162void Context::drawBuffers(GLsizei n, const GLenum *bufs)
3163{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003164 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003165 ASSERT(framebuffer);
3166 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003167 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003168}
3169
3170void Context::readBuffer(GLenum mode)
3171{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003172 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05003173 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003174 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05003175}
3176
3177void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
3178{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003179 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003180 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003181
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003182 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003183 ASSERT(framebuffer);
3184
3185 // The specification isn't clear what should be done when the framebuffer isn't complete.
3186 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill4928b7c2017-06-20 12:57:39 -04003187 handleError(framebuffer->discard(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003188}
3189
3190void Context::invalidateFramebuffer(GLenum target,
3191 GLsizei numAttachments,
3192 const GLenum *attachments)
3193{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003194 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003195 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003196
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003197 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003198 ASSERT(framebuffer);
3199
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003200 if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05003201 {
Jamie Madill437fa652016-05-03 15:13:24 -04003202 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003203 }
Jamie Madill437fa652016-05-03 15:13:24 -04003204
Jamie Madill4928b7c2017-06-20 12:57:39 -04003205 handleError(framebuffer->invalidate(this, numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05003206}
3207
3208void Context::invalidateSubFramebuffer(GLenum target,
3209 GLsizei numAttachments,
3210 const GLenum *attachments,
3211 GLint x,
3212 GLint y,
3213 GLsizei width,
3214 GLsizei height)
3215{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003216 // Only sync the FBO
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003217 mGLState.syncDirtyObject(this, target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05003218
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003219 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05003220 ASSERT(framebuffer);
3221
Jamie Madilldd43e6c2017-03-24 14:18:49 -04003222 if (framebuffer->checkStatus(this) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05003223 {
Jamie Madill437fa652016-05-03 15:13:24 -04003224 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05003225 }
Jamie Madill437fa652016-05-03 15:13:24 -04003226
3227 Rectangle area(x, y, width, height);
Jamie Madill4928b7c2017-06-20 12:57:39 -04003228 handleError(framebuffer->invalidateSub(this, numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05003229}
3230
Jamie Madill73a84962016-02-12 09:27:23 -05003231void Context::texImage2D(GLenum target,
3232 GLint level,
3233 GLint internalformat,
3234 GLsizei width,
3235 GLsizei height,
3236 GLint border,
3237 GLenum format,
3238 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003239 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003240{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003241 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003242
3243 Extents size(width, height, 1);
3244 Texture *texture =
3245 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003246 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3247 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003248}
3249
3250void Context::texImage3D(GLenum target,
3251 GLint level,
3252 GLint internalformat,
3253 GLsizei width,
3254 GLsizei height,
3255 GLsizei depth,
3256 GLint border,
3257 GLenum format,
3258 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003259 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003260{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003261 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003262
3263 Extents size(width, height, depth);
3264 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003265 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3266 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003267}
3268
3269void Context::texSubImage2D(GLenum target,
3270 GLint level,
3271 GLint xoffset,
3272 GLint yoffset,
3273 GLsizei width,
3274 GLsizei height,
3275 GLenum format,
3276 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003277 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003278{
3279 // Zero sized uploads are valid but no-ops
3280 if (width == 0 || height == 0)
3281 {
3282 return;
3283 }
3284
Jamie Madillad9f24e2016-02-12 09:27:24 -05003285 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003286
3287 Box area(xoffset, yoffset, 0, width, height, 1);
3288 Texture *texture =
3289 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003290 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3291 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003292}
3293
3294void Context::texSubImage3D(GLenum target,
3295 GLint level,
3296 GLint xoffset,
3297 GLint yoffset,
3298 GLint zoffset,
3299 GLsizei width,
3300 GLsizei height,
3301 GLsizei depth,
3302 GLenum format,
3303 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04003304 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05003305{
3306 // Zero sized uploads are valid but no-ops
3307 if (width == 0 || height == 0 || depth == 0)
3308 {
3309 return;
3310 }
3311
Jamie Madillad9f24e2016-02-12 09:27:24 -05003312 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003313
3314 Box area(xoffset, yoffset, zoffset, width, height, depth);
3315 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003316 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3317 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003318}
3319
3320void Context::compressedTexImage2D(GLenum target,
3321 GLint level,
3322 GLenum internalformat,
3323 GLsizei width,
3324 GLsizei height,
3325 GLint border,
3326 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003327 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003328{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003329 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003330
3331 Extents size(width, height, 1);
3332 Texture *texture =
3333 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003334 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003335 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003336 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003337}
3338
3339void Context::compressedTexImage3D(GLenum target,
3340 GLint level,
3341 GLenum internalformat,
3342 GLsizei width,
3343 GLsizei height,
3344 GLsizei depth,
3345 GLint border,
3346 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003347 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003348{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003349 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003350
3351 Extents size(width, height, depth);
3352 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003353 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003354 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003355 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003356}
3357
3358void Context::compressedTexSubImage2D(GLenum target,
3359 GLint level,
3360 GLint xoffset,
3361 GLint yoffset,
3362 GLsizei width,
3363 GLsizei height,
3364 GLenum format,
3365 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003366 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003367{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003368 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003369
3370 Box area(xoffset, yoffset, 0, width, height, 1);
3371 Texture *texture =
3372 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003373 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003374 format, imageSize,
3375 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003376}
3377
3378void Context::compressedTexSubImage3D(GLenum target,
3379 GLint level,
3380 GLint xoffset,
3381 GLint yoffset,
3382 GLint zoffset,
3383 GLsizei width,
3384 GLsizei height,
3385 GLsizei depth,
3386 GLenum format,
3387 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003388 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003389{
3390 // Zero sized uploads are valid but no-ops
3391 if (width == 0 || height == 0)
3392 {
3393 return;
3394 }
3395
Jamie Madillad9f24e2016-02-12 09:27:24 -05003396 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003397
3398 Box area(xoffset, yoffset, zoffset, width, height, depth);
3399 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003400 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003401 format, imageSize,
3402 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003403}
3404
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003405void Context::generateMipmap(GLenum target)
3406{
3407 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003408 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003409}
3410
Geoff Lang97073d12016-04-20 10:42:34 -07003411void Context::copyTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003412 GLint sourceLevel,
3413 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003414 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003415 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003416 GLint internalFormat,
3417 GLenum destType,
3418 GLboolean unpackFlipY,
3419 GLboolean unpackPremultiplyAlpha,
3420 GLboolean unpackUnmultiplyAlpha)
3421{
3422 syncStateForTexImage();
3423
3424 gl::Texture *sourceTexture = getTexture(sourceId);
3425 gl::Texture *destTexture = getTexture(destId);
Geoff Lang92019432017-11-20 13:09:34 -05003426 handleError(destTexture->copyTexture(this, destTarget, destLevel, internalFormat, destType,
3427 sourceLevel, ConvertToBool(unpackFlipY),
3428 ConvertToBool(unpackPremultiplyAlpha),
3429 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003430}
3431
3432void Context::copySubTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003433 GLint sourceLevel,
3434 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003435 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003436 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003437 GLint xoffset,
3438 GLint yoffset,
3439 GLint x,
3440 GLint y,
3441 GLsizei width,
3442 GLsizei height,
3443 GLboolean unpackFlipY,
3444 GLboolean unpackPremultiplyAlpha,
3445 GLboolean unpackUnmultiplyAlpha)
3446{
3447 // Zero sized copies are valid but no-ops
3448 if (width == 0 || height == 0)
3449 {
3450 return;
3451 }
3452
3453 syncStateForTexImage();
3454
3455 gl::Texture *sourceTexture = getTexture(sourceId);
3456 gl::Texture *destTexture = getTexture(destId);
3457 Offset offset(xoffset, yoffset, 0);
3458 Rectangle area(x, y, width, height);
Geoff Lang92019432017-11-20 13:09:34 -05003459 handleError(destTexture->copySubTexture(this, destTarget, destLevel, offset, sourceLevel, area,
3460 ConvertToBool(unpackFlipY),
3461 ConvertToBool(unpackPremultiplyAlpha),
3462 ConvertToBool(unpackUnmultiplyAlpha), sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003463}
3464
Geoff Lang47110bf2016-04-20 11:13:22 -07003465void Context::compressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId)
3466{
3467 syncStateForTexImage();
3468
3469 gl::Texture *sourceTexture = getTexture(sourceId);
3470 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05003471 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07003472}
3473
Corentin Wallez336129f2017-10-17 15:55:40 -04003474void Context::getBufferPointerv(BufferBinding target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003475{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003476 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003477 ASSERT(buffer);
3478
Geoff Lang496c02d2016-10-20 11:38:11 -07003479 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003480}
3481
Corentin Wallez336129f2017-10-17 15:55:40 -04003482void *Context::mapBuffer(BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003483{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003484 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003485 ASSERT(buffer);
3486
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003487 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003488 if (error.isError())
3489 {
Jamie Madill437fa652016-05-03 15:13:24 -04003490 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003491 return nullptr;
3492 }
3493
3494 return buffer->getMapPointer();
3495}
3496
Corentin Wallez336129f2017-10-17 15:55:40 -04003497GLboolean Context::unmapBuffer(BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003498{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003499 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003500 ASSERT(buffer);
3501
3502 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003503 Error error = buffer->unmap(this, &result);
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 GL_FALSE;
3508 }
3509
3510 return result;
3511}
3512
Corentin Wallez336129f2017-10-17 15:55:40 -04003513void *Context::mapBufferRange(BufferBinding target,
3514 GLintptr offset,
3515 GLsizeiptr length,
3516 GLbitfield access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003517{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003518 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003519 ASSERT(buffer);
3520
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003521 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003522 if (error.isError())
3523 {
Jamie Madill437fa652016-05-03 15:13:24 -04003524 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003525 return nullptr;
3526 }
3527
3528 return buffer->getMapPointer();
3529}
3530
Corentin Wallez336129f2017-10-17 15:55:40 -04003531void Context::flushMappedBufferRange(BufferBinding /*target*/,
3532 GLintptr /*offset*/,
3533 GLsizeiptr /*length*/)
Olli Etuaho4f667482016-03-30 15:56:35 +03003534{
3535 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3536}
3537
Jamie Madillad9f24e2016-02-12 09:27:24 -05003538void Context::syncStateForReadPixels()
3539{
3540 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
3541}
3542
3543void Context::syncStateForTexImage()
3544{
3545 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
3546}
3547
3548void Context::syncStateForClear()
3549{
3550 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
3551}
3552
3553void Context::syncStateForBlit()
3554{
3555 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
3556}
3557
Jiajia Qin5451d532017-11-16 17:16:34 +08003558void Context::activeShaderProgram(GLuint pipeline, GLuint program)
3559{
3560 UNIMPLEMENTED();
3561}
3562
Jamie Madillc20ab272016-06-09 07:20:46 -07003563void Context::activeTexture(GLenum texture)
3564{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003565 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003566}
3567
Jamie Madill876429b2017-04-20 15:46:24 -04003568void Context::blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003569{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003570 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003571}
3572
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003573void Context::blendEquation(GLenum mode)
3574{
3575 mGLState.setBlendEquation(mode, mode);
3576}
3577
Jamie Madillc20ab272016-06-09 07:20:46 -07003578void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3579{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003580 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003581}
3582
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003583void Context::blendFunc(GLenum sfactor, GLenum dfactor)
3584{
3585 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
3586}
3587
Jamie Madillc20ab272016-06-09 07:20:46 -07003588void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3589{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003590 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003591}
3592
Jamie Madill876429b2017-04-20 15:46:24 -04003593void Context::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc20ab272016-06-09 07:20:46 -07003594{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003595 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003596}
3597
Jamie Madill876429b2017-04-20 15:46:24 -04003598void Context::clearDepthf(GLfloat depth)
Jamie Madillc20ab272016-06-09 07:20:46 -07003599{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003600 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003601}
3602
3603void Context::clearStencil(GLint s)
3604{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003605 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003606}
3607
3608void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3609{
Geoff Lang92019432017-11-20 13:09:34 -05003610 mGLState.setColorMask(ConvertToBool(red), ConvertToBool(green), ConvertToBool(blue),
3611 ConvertToBool(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003612}
3613
Corentin Wallez2e568cf2017-09-18 17:05:22 -04003614void Context::cullFace(CullFaceMode mode)
Jamie Madillc20ab272016-06-09 07:20:46 -07003615{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003616 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003617}
3618
3619void Context::depthFunc(GLenum func)
3620{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003621 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003622}
3623
3624void Context::depthMask(GLboolean flag)
3625{
Geoff Lang92019432017-11-20 13:09:34 -05003626 mGLState.setDepthMask(ConvertToBool(flag));
Jamie Madillc20ab272016-06-09 07:20:46 -07003627}
3628
Jamie Madill876429b2017-04-20 15:46:24 -04003629void Context::depthRangef(GLfloat zNear, GLfloat zFar)
Jamie Madillc20ab272016-06-09 07:20:46 -07003630{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003631 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003632}
3633
3634void Context::disable(GLenum cap)
3635{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003636 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003637}
3638
3639void Context::disableVertexAttribArray(GLuint index)
3640{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003641 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003642}
3643
3644void Context::enable(GLenum cap)
3645{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003646 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003647}
3648
3649void Context::enableVertexAttribArray(GLuint index)
3650{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003651 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003652}
3653
3654void Context::frontFace(GLenum mode)
3655{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003656 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003657}
3658
3659void Context::hint(GLenum target, GLenum mode)
3660{
3661 switch (target)
3662 {
3663 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003664 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003665 break;
3666
3667 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003668 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003669 break;
3670
3671 default:
3672 UNREACHABLE();
3673 return;
3674 }
3675}
3676
3677void Context::lineWidth(GLfloat width)
3678{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003679 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003680}
3681
3682void Context::pixelStorei(GLenum pname, GLint param)
3683{
3684 switch (pname)
3685 {
3686 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003687 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003688 break;
3689
3690 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003691 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003692 break;
3693
3694 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003695 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003696 break;
3697
3698 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003699 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003700 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003701 break;
3702
3703 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003704 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003705 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003706 break;
3707
3708 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003709 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003710 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003711 break;
3712
3713 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003714 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003715 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003716 break;
3717
3718 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003719 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003720 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003721 break;
3722
3723 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003724 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003725 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003726 break;
3727
3728 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003729 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003730 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003731 break;
3732
3733 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003734 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003735 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003736 break;
3737
3738 default:
3739 UNREACHABLE();
3740 return;
3741 }
3742}
3743
3744void Context::polygonOffset(GLfloat factor, GLfloat units)
3745{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003746 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003747}
3748
Jamie Madill876429b2017-04-20 15:46:24 -04003749void Context::sampleCoverage(GLfloat value, GLboolean invert)
Jamie Madillc20ab272016-06-09 07:20:46 -07003750{
Geoff Lang92019432017-11-20 13:09:34 -05003751 mGLState.setSampleCoverageParams(clamp01(value), ConvertToBool(invert));
Jamie Madillc20ab272016-06-09 07:20:46 -07003752}
3753
Jiawei Shaodb342272017-09-27 10:21:45 +08003754void Context::sampleMaski(GLuint maskNumber, GLbitfield mask)
3755{
3756 mGLState.setSampleMaskParams(maskNumber, mask);
3757}
3758
Jamie Madillc20ab272016-06-09 07:20:46 -07003759void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3760{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003761 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003762}
3763
3764void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3765{
3766 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3767 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003768 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003769 }
3770
3771 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3772 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003773 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003774 }
3775}
3776
3777void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3778{
3779 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3780 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003781 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003782 }
3783
3784 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3785 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003786 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003787 }
3788}
3789
3790void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3791{
3792 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3793 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003794 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003795 }
3796
3797 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3798 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003799 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003800 }
3801}
3802
3803void Context::vertexAttrib1f(GLuint index, GLfloat x)
3804{
3805 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003806 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003807}
3808
3809void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3810{
3811 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003812 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003813}
3814
3815void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3816{
3817 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003818 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003819}
3820
3821void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3822{
3823 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003824 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003825}
3826
3827void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3828{
3829 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003830 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003831}
3832
3833void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3834{
3835 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003836 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003837}
3838
3839void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3840{
3841 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003842 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003843}
3844
3845void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3846{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003847 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003848}
3849
3850void Context::vertexAttribPointer(GLuint index,
3851 GLint size,
3852 GLenum type,
3853 GLboolean normalized,
3854 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003855 const void *ptr)
Jamie Madillc20ab272016-06-09 07:20:46 -07003856{
Corentin Wallez336129f2017-10-17 15:55:40 -04003857 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
Geoff Lang92019432017-11-20 13:09:34 -05003858 size, type, ConvertToBool(normalized), false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07003859}
3860
Shao80957d92017-02-20 21:25:59 +08003861void Context::vertexAttribFormat(GLuint attribIndex,
3862 GLint size,
3863 GLenum type,
3864 GLboolean normalized,
3865 GLuint relativeOffset)
3866{
Geoff Lang92019432017-11-20 13:09:34 -05003867 mGLState.setVertexAttribFormat(attribIndex, size, type, ConvertToBool(normalized), false,
Shao80957d92017-02-20 21:25:59 +08003868 relativeOffset);
3869}
3870
3871void Context::vertexAttribIFormat(GLuint attribIndex,
3872 GLint size,
3873 GLenum type,
3874 GLuint relativeOffset)
3875{
3876 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
3877}
3878
3879void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
3880{
Shaodde78e82017-05-22 14:13:27 +08003881 mGLState.setVertexAttribBinding(this, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08003882}
3883
Jiajia Qin5451d532017-11-16 17:16:34 +08003884void Context::vertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
Shao80957d92017-02-20 21:25:59 +08003885{
3886 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
3887}
3888
Jamie Madillc20ab272016-06-09 07:20:46 -07003889void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
3890{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003891 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003892}
3893
3894void Context::vertexAttribIPointer(GLuint index,
3895 GLint size,
3896 GLenum type,
3897 GLsizei stride,
Jamie Madill876429b2017-04-20 15:46:24 -04003898 const void *pointer)
Jamie Madillc20ab272016-06-09 07:20:46 -07003899{
Corentin Wallez336129f2017-10-17 15:55:40 -04003900 mGLState.setVertexAttribPointer(this, index, mGLState.getTargetBuffer(BufferBinding::Array),
3901 size, type, false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07003902}
3903
3904void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
3905{
3906 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003907 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003908}
3909
3910void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
3911{
3912 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003913 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003914}
3915
3916void Context::vertexAttribI4iv(GLuint index, const GLint *v)
3917{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003918 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003919}
3920
3921void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
3922{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003923 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003924}
3925
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003926void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
3927{
3928 const VertexAttribCurrentValueData &currentValues =
3929 getGLState().getVertexAttribCurrentValue(index);
3930 const VertexArray *vao = getGLState().getVertexArray();
3931 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3932 currentValues, pname, params);
3933}
3934
3935void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
3936{
3937 const VertexAttribCurrentValueData &currentValues =
3938 getGLState().getVertexAttribCurrentValue(index);
3939 const VertexArray *vao = getGLState().getVertexArray();
3940 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3941 currentValues, pname, params);
3942}
3943
3944void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
3945{
3946 const VertexAttribCurrentValueData &currentValues =
3947 getGLState().getVertexAttribCurrentValue(index);
3948 const VertexArray *vao = getGLState().getVertexArray();
3949 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3950 currentValues, pname, params);
3951}
3952
3953void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
3954{
3955 const VertexAttribCurrentValueData &currentValues =
3956 getGLState().getVertexAttribCurrentValue(index);
3957 const VertexArray *vao = getGLState().getVertexArray();
3958 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3959 currentValues, pname, params);
3960}
3961
Jamie Madill876429b2017-04-20 15:46:24 -04003962void Context::getVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003963{
3964 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
3965 QueryVertexAttribPointerv(attrib, pname, pointer);
3966}
3967
Jamie Madillc20ab272016-06-09 07:20:46 -07003968void Context::debugMessageControl(GLenum source,
3969 GLenum type,
3970 GLenum severity,
3971 GLsizei count,
3972 const GLuint *ids,
3973 GLboolean enabled)
3974{
3975 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003976 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
Geoff Lang92019432017-11-20 13:09:34 -05003977 ConvertToBool(enabled));
Jamie Madillc20ab272016-06-09 07:20:46 -07003978}
3979
3980void Context::debugMessageInsert(GLenum source,
3981 GLenum type,
3982 GLuint id,
3983 GLenum severity,
3984 GLsizei length,
3985 const GLchar *buf)
3986{
3987 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003988 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003989}
3990
3991void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
3992{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003993 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07003994}
3995
3996GLuint Context::getDebugMessageLog(GLuint count,
3997 GLsizei bufSize,
3998 GLenum *sources,
3999 GLenum *types,
4000 GLuint *ids,
4001 GLenum *severities,
4002 GLsizei *lengths,
4003 GLchar *messageLog)
4004{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004005 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
4006 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07004007}
4008
4009void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
4010{
4011 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004012 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Geoff Lang5d5253a2017-11-22 14:51:12 -05004013 mImplementation->pushDebugGroup(source, id, length, message);
Jamie Madillc20ab272016-06-09 07:20:46 -07004014}
4015
4016void Context::popDebugGroup()
4017{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07004018 mGLState.getDebug().popGroup();
Geoff Lang5d5253a2017-11-22 14:51:12 -05004019 mImplementation->popDebugGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07004020}
4021
Corentin Wallez336129f2017-10-17 15:55:40 -04004022void Context::bufferData(BufferBinding target, GLsizeiptr size, const void *data, BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004023{
4024 Buffer *buffer = mGLState.getTargetBuffer(target);
4025 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004026 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04004027}
4028
Corentin Wallez336129f2017-10-17 15:55:40 -04004029void Context::bufferSubData(BufferBinding target,
4030 GLintptr offset,
4031 GLsizeiptr size,
4032 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004033{
4034 if (data == nullptr)
4035 {
4036 return;
4037 }
4038
4039 Buffer *buffer = mGLState.getTargetBuffer(target);
4040 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08004041 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04004042}
4043
Jamie Madillef300b12016-10-07 15:12:09 -04004044void Context::attachShader(GLuint program, GLuint shader)
4045{
Jamie Madillacf2f3a2017-11-21 19:22:44 -05004046 Program *programObject = mState.mShaderPrograms->getProgram(program);
4047 Shader *shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04004048 ASSERT(programObject && shaderObject);
4049 programObject->attachShader(shaderObject);
4050}
4051
Kenneth Russellf2f6f652016-10-05 19:53:23 -07004052const Workarounds &Context::getWorkarounds() const
4053{
4054 return mWorkarounds;
4055}
4056
Corentin Wallez336129f2017-10-17 15:55:40 -04004057void Context::copyBufferSubData(BufferBinding readTarget,
4058 BufferBinding writeTarget,
Jamie Madillb0817d12016-11-01 15:48:31 -04004059 GLintptr readOffset,
4060 GLintptr writeOffset,
4061 GLsizeiptr size)
4062{
4063 // if size is zero, the copy is a successful no-op
4064 if (size == 0)
4065 {
4066 return;
4067 }
4068
4069 // TODO(jmadill): cache these.
4070 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
4071 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
4072
Jamie Madill5f56ddb2017-01-13 17:29:55 -05004073 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04004074}
4075
Jamie Madill01a80ee2016-11-07 12:06:18 -05004076void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
4077{
4078 Program *programObject = getProgram(program);
4079 // TODO(jmadill): Re-use this from the validation if possible.
4080 ASSERT(programObject);
4081 programObject->bindAttributeLocation(index, name);
4082}
4083
Corentin Wallez336129f2017-10-17 15:55:40 -04004084void Context::bindBuffer(BufferBinding target, GLuint buffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004085{
Corentin Wallez336129f2017-10-17 15:55:40 -04004086 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4087 mGLState.setBufferBinding(this, target, bufferObject);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004088}
4089
Corentin Wallez336129f2017-10-17 15:55:40 -04004090void Context::bindBufferBase(BufferBinding target, GLuint index, GLuint buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08004091{
4092 bindBufferRange(target, index, buffer, 0, 0);
4093}
4094
Corentin Wallez336129f2017-10-17 15:55:40 -04004095void Context::bindBufferRange(BufferBinding target,
Jiajia Qin6eafb042016-12-27 17:04:07 +08004096 GLuint index,
4097 GLuint buffer,
4098 GLintptr offset,
4099 GLsizeiptr size)
4100{
Corentin Wallez336129f2017-10-17 15:55:40 -04004101 Buffer *bufferObject = mState.mBuffers->checkBufferAllocation(mImplementation.get(), buffer);
4102 mGLState.setIndexedBufferBinding(this, target, index, bufferObject, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08004103}
4104
Jamie Madill01a80ee2016-11-07 12:06:18 -05004105void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
4106{
4107 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4108 {
4109 bindReadFramebuffer(framebuffer);
4110 }
4111
4112 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
4113 {
4114 bindDrawFramebuffer(framebuffer);
4115 }
4116}
4117
4118void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
4119{
4120 ASSERT(target == GL_RENDERBUFFER);
4121 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05004122 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill4928b7c2017-06-20 12:57:39 -04004123 mGLState.setRenderbufferBinding(this, object);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004124}
4125
JiangYizhoubddc46b2016-12-09 09:50:51 +08004126void Context::texStorage2DMultisample(GLenum target,
4127 GLsizei samples,
4128 GLenum internalformat,
4129 GLsizei width,
4130 GLsizei height,
4131 GLboolean fixedsamplelocations)
4132{
4133 Extents size(width, height, 1);
4134 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05004135 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
Geoff Lang92019432017-11-20 13:09:34 -05004136 ConvertToBool(fixedsamplelocations)));
JiangYizhoubddc46b2016-12-09 09:50:51 +08004137}
4138
4139void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
4140{
JiangYizhou5b03f472017-01-09 10:22:53 +08004141 // According to spec 3.1 Table 20.49: Framebuffer Dependent Values,
4142 // the sample position should be queried by DRAW_FRAMEBUFFER.
4143 mGLState.syncDirtyObject(this, GL_DRAW_FRAMEBUFFER);
4144 const Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
JiangYizhoubddc46b2016-12-09 09:50:51 +08004145
4146 switch (pname)
4147 {
4148 case GL_SAMPLE_POSITION:
4149 handleError(framebuffer->getSamplePosition(index, val));
4150 break;
4151 default:
4152 UNREACHABLE();
4153 }
4154}
4155
Jamie Madille8fb6402017-02-14 17:56:40 -05004156void Context::renderbufferStorage(GLenum target,
4157 GLenum internalformat,
4158 GLsizei width,
4159 GLsizei height)
4160{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004161 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4162 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
4163
Jamie Madille8fb6402017-02-14 17:56:40 -05004164 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4928b7c2017-06-20 12:57:39 -04004165 handleError(renderbuffer->setStorage(this, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004166}
4167
4168void Context::renderbufferStorageMultisample(GLenum target,
4169 GLsizei samples,
4170 GLenum internalformat,
4171 GLsizei width,
4172 GLsizei height)
4173{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004174 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
4175 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05004176
4177 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05004178 handleError(
Jamie Madill4928b7c2017-06-20 12:57:39 -04004179 renderbuffer->setStorageMultisample(this, samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05004180}
4181
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004182void Context::getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
4183{
Jamie Madill70b5bb02017-08-28 13:32:37 -04004184 const Sync *syncObject = getSync(sync);
Geoff Lang82483b92017-04-11 15:33:00 -04004185 handleError(QuerySynciv(syncObject, pname, bufSize, length, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04004186}
4187
JiangYizhoue18e6392017-02-20 10:32:23 +08004188void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
4189{
4190 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4191 QueryFramebufferParameteriv(framebuffer, pname, params);
4192}
4193
Jiajia Qin5451d532017-11-16 17:16:34 +08004194void Context::framebufferParameteri(GLenum target, GLenum pname, GLint param)
JiangYizhoue18e6392017-02-20 10:32:23 +08004195{
4196 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4197 SetFramebufferParameteri(framebuffer, pname, param);
4198}
4199
Jamie Madillb3f26b92017-07-19 15:07:41 -04004200Error Context::getScratchBuffer(size_t requstedSizeBytes,
4201 angle::MemoryBuffer **scratchBufferOut) const
Jamie Madille14951e2017-03-09 18:55:16 -05004202{
Jamie Madillb3f26b92017-07-19 15:07:41 -04004203 if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
4204 {
4205 return OutOfMemory() << "Failed to allocate internal buffer.";
4206 }
4207 return NoError();
4208}
4209
4210Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
4211 angle::MemoryBuffer **zeroBufferOut) const
4212{
4213 if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
Jamie Madille14951e2017-03-09 18:55:16 -05004214 {
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004215 return OutOfMemory() << "Failed to allocate internal buffer.";
Jamie Madille14951e2017-03-09 18:55:16 -05004216 }
Yuly Novikovc4d18aa2017-03-09 18:45:02 -05004217 return NoError();
Jamie Madille14951e2017-03-09 18:55:16 -05004218}
4219
Xinghua Cao2b396592017-03-29 15:36:04 +08004220void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
4221{
4222 if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
4223 {
4224 return;
4225 }
4226
Jamie Madill05b35b22017-10-03 09:01:44 -04004227 // TODO(jmadill): Dirty bits for compute.
Jamie Madilla59fc192017-11-02 12:57:58 -04004228 if (isRobustResourceInitEnabled())
4229 {
4230 ANGLE_CONTEXT_TRY(mGLState.clearUnclearedActiveTextures(this));
4231 }
Jamie Madill05b35b22017-10-03 09:01:44 -04004232
Jamie Madill71c88b32017-09-14 22:20:29 -04004233 handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
Xinghua Cao2b396592017-03-29 15:36:04 +08004234}
4235
Jiajia Qin5451d532017-11-16 17:16:34 +08004236void Context::dispatchComputeIndirect(GLintptr indirect)
4237{
4238 UNIMPLEMENTED();
4239}
4240
JiangYizhou165361c2017-06-07 14:56:57 +08004241void Context::texStorage2D(GLenum target,
4242 GLsizei levels,
4243 GLenum internalFormat,
4244 GLsizei width,
4245 GLsizei height)
4246{
4247 Extents size(width, height, 1);
4248 Texture *texture = getTargetTexture(target);
4249 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4250}
4251
4252void Context::texStorage3D(GLenum target,
4253 GLsizei levels,
4254 GLenum internalFormat,
4255 GLsizei width,
4256 GLsizei height,
4257 GLsizei depth)
4258{
4259 Extents size(width, height, depth);
4260 Texture *texture = getTargetTexture(target);
4261 handleError(texture->setStorage(this, target, levels, internalFormat, size));
4262}
4263
Jiajia Qin5451d532017-11-16 17:16:34 +08004264void Context::memoryBarrier(GLbitfield barriers)
4265{
4266 UNIMPLEMENTED();
4267}
4268
4269void Context::memoryBarrierByRegion(GLbitfield barriers)
4270{
4271 UNIMPLEMENTED();
4272}
4273
Jamie Madillc1d770e2017-04-13 17:31:24 -04004274GLenum Context::checkFramebufferStatus(GLenum target)
4275{
4276 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
4277 ASSERT(framebuffer);
4278
4279 return framebuffer->checkStatus(this);
4280}
4281
4282void Context::compileShader(GLuint shader)
4283{
4284 Shader *shaderObject = GetValidShader(this, shader);
4285 if (!shaderObject)
4286 {
4287 return;
4288 }
4289 shaderObject->compile(this);
4290}
4291
4292void Context::deleteBuffers(GLsizei n, const GLuint *buffers)
4293{
4294 for (int i = 0; i < n; i++)
4295 {
4296 deleteBuffer(buffers[i]);
4297 }
4298}
4299
4300void Context::deleteFramebuffers(GLsizei n, const GLuint *framebuffers)
4301{
4302 for (int i = 0; i < n; i++)
4303 {
4304 if (framebuffers[i] != 0)
4305 {
4306 deleteFramebuffer(framebuffers[i]);
4307 }
4308 }
4309}
4310
4311void Context::deleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
4312{
4313 for (int i = 0; i < n; i++)
4314 {
4315 deleteRenderbuffer(renderbuffers[i]);
4316 }
4317}
4318
4319void Context::deleteTextures(GLsizei n, const GLuint *textures)
4320{
4321 for (int i = 0; i < n; i++)
4322 {
4323 if (textures[i] != 0)
4324 {
4325 deleteTexture(textures[i]);
4326 }
4327 }
4328}
4329
4330void Context::detachShader(GLuint program, GLuint shader)
4331{
4332 Program *programObject = getProgram(program);
4333 ASSERT(programObject);
4334
4335 Shader *shaderObject = getShader(shader);
4336 ASSERT(shaderObject);
4337
4338 programObject->detachShader(this, shaderObject);
4339}
4340
4341void Context::genBuffers(GLsizei n, GLuint *buffers)
4342{
4343 for (int i = 0; i < n; i++)
4344 {
4345 buffers[i] = createBuffer();
4346 }
4347}
4348
4349void Context::genFramebuffers(GLsizei n, GLuint *framebuffers)
4350{
4351 for (int i = 0; i < n; i++)
4352 {
4353 framebuffers[i] = createFramebuffer();
4354 }
4355}
4356
4357void Context::genRenderbuffers(GLsizei n, GLuint *renderbuffers)
4358{
4359 for (int i = 0; i < n; i++)
4360 {
4361 renderbuffers[i] = createRenderbuffer();
4362 }
4363}
4364
4365void Context::genTextures(GLsizei n, GLuint *textures)
4366{
4367 for (int i = 0; i < n; i++)
4368 {
4369 textures[i] = createTexture();
4370 }
4371}
4372
4373void Context::getActiveAttrib(GLuint program,
4374 GLuint index,
4375 GLsizei bufsize,
4376 GLsizei *length,
4377 GLint *size,
4378 GLenum *type,
4379 GLchar *name)
4380{
4381 Program *programObject = getProgram(program);
4382 ASSERT(programObject);
4383 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
4384}
4385
4386void Context::getActiveUniform(GLuint program,
4387 GLuint index,
4388 GLsizei bufsize,
4389 GLsizei *length,
4390 GLint *size,
4391 GLenum *type,
4392 GLchar *name)
4393{
4394 Program *programObject = getProgram(program);
4395 ASSERT(programObject);
4396 programObject->getActiveUniform(index, bufsize, length, size, type, name);
4397}
4398
4399void Context::getAttachedShaders(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders)
4400{
4401 Program *programObject = getProgram(program);
4402 ASSERT(programObject);
4403 programObject->getAttachedShaders(maxcount, count, shaders);
4404}
4405
4406GLint Context::getAttribLocation(GLuint program, const GLchar *name)
4407{
4408 Program *programObject = getProgram(program);
4409 ASSERT(programObject);
4410 return programObject->getAttributeLocation(name);
4411}
4412
4413void Context::getBooleanv(GLenum pname, GLboolean *params)
4414{
4415 GLenum nativeType;
4416 unsigned int numParams = 0;
4417 getQueryParameterInfo(pname, &nativeType, &numParams);
4418
4419 if (nativeType == GL_BOOL)
4420 {
4421 getBooleanvImpl(pname, params);
4422 }
4423 else
4424 {
4425 CastStateValues(this, nativeType, pname, numParams, params);
4426 }
4427}
4428
4429void Context::getFloatv(GLenum pname, GLfloat *params)
4430{
4431 GLenum nativeType;
4432 unsigned int numParams = 0;
4433 getQueryParameterInfo(pname, &nativeType, &numParams);
4434
4435 if (nativeType == GL_FLOAT)
4436 {
4437 getFloatvImpl(pname, params);
4438 }
4439 else
4440 {
4441 CastStateValues(this, nativeType, pname, numParams, params);
4442 }
4443}
4444
4445void Context::getIntegerv(GLenum pname, GLint *params)
4446{
4447 GLenum nativeType;
4448 unsigned int numParams = 0;
4449 getQueryParameterInfo(pname, &nativeType, &numParams);
4450
4451 if (nativeType == GL_INT)
4452 {
4453 getIntegervImpl(pname, params);
4454 }
4455 else
4456 {
4457 CastStateValues(this, nativeType, pname, numParams, params);
4458 }
4459}
4460
4461void Context::getProgramiv(GLuint program, GLenum pname, GLint *params)
4462{
4463 Program *programObject = getProgram(program);
4464 ASSERT(programObject);
Jamie Madillffe00c02017-06-27 16:26:55 -04004465 QueryProgramiv(this, programObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004466}
4467
Jiajia Qin5451d532017-11-16 17:16:34 +08004468void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
4469{
4470 UNIMPLEMENTED();
4471}
4472
Jamie Madillbe849e42017-05-02 15:49:00 -04004473void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004474{
4475 Program *programObject = getProgram(program);
4476 ASSERT(programObject);
4477 programObject->getInfoLog(bufsize, length, infolog);
4478}
4479
Jiajia Qin5451d532017-11-16 17:16:34 +08004480void Context::getProgramPipelineInfoLog(GLuint pipeline,
4481 GLsizei bufSize,
4482 GLsizei *length,
4483 GLchar *infoLog)
4484{
4485 UNIMPLEMENTED();
4486}
4487
Jamie Madillc1d770e2017-04-13 17:31:24 -04004488void Context::getShaderiv(GLuint shader, GLenum pname, GLint *params)
4489{
4490 Shader *shaderObject = getShader(shader);
4491 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004492 QueryShaderiv(this, shaderObject, pname, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004493}
4494
4495void Context::getShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog)
4496{
4497 Shader *shaderObject = getShader(shader);
4498 ASSERT(shaderObject);
Jamie Madillbd044ed2017-06-05 12:59:21 -04004499 shaderObject->getInfoLog(this, bufsize, length, infolog);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004500}
4501
4502void Context::getShaderPrecisionFormat(GLenum shadertype,
4503 GLenum precisiontype,
4504 GLint *range,
4505 GLint *precision)
4506{
4507 // TODO(jmadill): Compute shaders.
4508
4509 switch (shadertype)
4510 {
4511 case GL_VERTEX_SHADER:
4512 switch (precisiontype)
4513 {
4514 case GL_LOW_FLOAT:
4515 mCaps.vertexLowpFloat.get(range, precision);
4516 break;
4517 case GL_MEDIUM_FLOAT:
4518 mCaps.vertexMediumpFloat.get(range, precision);
4519 break;
4520 case GL_HIGH_FLOAT:
4521 mCaps.vertexHighpFloat.get(range, precision);
4522 break;
4523
4524 case GL_LOW_INT:
4525 mCaps.vertexLowpInt.get(range, precision);
4526 break;
4527 case GL_MEDIUM_INT:
4528 mCaps.vertexMediumpInt.get(range, precision);
4529 break;
4530 case GL_HIGH_INT:
4531 mCaps.vertexHighpInt.get(range, precision);
4532 break;
4533
4534 default:
4535 UNREACHABLE();
4536 return;
4537 }
4538 break;
4539
4540 case GL_FRAGMENT_SHADER:
4541 switch (precisiontype)
4542 {
4543 case GL_LOW_FLOAT:
4544 mCaps.fragmentLowpFloat.get(range, precision);
4545 break;
4546 case GL_MEDIUM_FLOAT:
4547 mCaps.fragmentMediumpFloat.get(range, precision);
4548 break;
4549 case GL_HIGH_FLOAT:
4550 mCaps.fragmentHighpFloat.get(range, precision);
4551 break;
4552
4553 case GL_LOW_INT:
4554 mCaps.fragmentLowpInt.get(range, precision);
4555 break;
4556 case GL_MEDIUM_INT:
4557 mCaps.fragmentMediumpInt.get(range, precision);
4558 break;
4559 case GL_HIGH_INT:
4560 mCaps.fragmentHighpInt.get(range, precision);
4561 break;
4562
4563 default:
4564 UNREACHABLE();
4565 return;
4566 }
4567 break;
4568
4569 default:
4570 UNREACHABLE();
4571 return;
4572 }
4573}
4574
4575void Context::getShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source)
4576{
4577 Shader *shaderObject = getShader(shader);
4578 ASSERT(shaderObject);
4579 shaderObject->getSource(bufsize, length, source);
4580}
4581
4582void Context::getUniformfv(GLuint program, GLint location, GLfloat *params)
4583{
4584 Program *programObject = getProgram(program);
4585 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004586 programObject->getUniformfv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004587}
4588
4589void Context::getUniformiv(GLuint program, GLint location, GLint *params)
4590{
4591 Program *programObject = getProgram(program);
4592 ASSERT(programObject);
Jamie Madill54164b02017-08-28 15:17:37 -04004593 programObject->getUniformiv(this, location, params);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004594}
4595
4596GLint Context::getUniformLocation(GLuint program, const GLchar *name)
4597{
4598 Program *programObject = getProgram(program);
4599 ASSERT(programObject);
4600 return programObject->getUniformLocation(name);
4601}
4602
4603GLboolean Context::isBuffer(GLuint buffer)
4604{
4605 if (buffer == 0)
4606 {
4607 return GL_FALSE;
4608 }
4609
4610 return (getBuffer(buffer) ? GL_TRUE : GL_FALSE);
4611}
4612
4613GLboolean Context::isEnabled(GLenum cap)
4614{
4615 return mGLState.getEnableFeature(cap);
4616}
4617
4618GLboolean Context::isFramebuffer(GLuint framebuffer)
4619{
4620 if (framebuffer == 0)
4621 {
4622 return GL_FALSE;
4623 }
4624
4625 return (getFramebuffer(framebuffer) ? GL_TRUE : GL_FALSE);
4626}
4627
4628GLboolean Context::isProgram(GLuint program)
4629{
4630 if (program == 0)
4631 {
4632 return GL_FALSE;
4633 }
4634
4635 return (getProgram(program) ? GL_TRUE : GL_FALSE);
4636}
4637
4638GLboolean Context::isRenderbuffer(GLuint renderbuffer)
4639{
4640 if (renderbuffer == 0)
4641 {
4642 return GL_FALSE;
4643 }
4644
4645 return (getRenderbuffer(renderbuffer) ? GL_TRUE : GL_FALSE);
4646}
4647
4648GLboolean Context::isShader(GLuint shader)
4649{
4650 if (shader == 0)
4651 {
4652 return GL_FALSE;
4653 }
4654
4655 return (getShader(shader) ? GL_TRUE : GL_FALSE);
4656}
4657
4658GLboolean Context::isTexture(GLuint texture)
4659{
4660 if (texture == 0)
4661 {
4662 return GL_FALSE;
4663 }
4664
4665 return (getTexture(texture) ? GL_TRUE : GL_FALSE);
4666}
4667
4668void Context::linkProgram(GLuint program)
4669{
4670 Program *programObject = getProgram(program);
4671 ASSERT(programObject);
4672 handleError(programObject->link(this));
Martin Radev0abb7a22017-08-28 15:34:45 +03004673 mGLState.onProgramExecutableChange(programObject);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004674}
4675
4676void Context::releaseShaderCompiler()
4677{
Jamie Madill4928b7c2017-06-20 12:57:39 -04004678 mCompiler.set(this, nullptr);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004679}
4680
4681void Context::shaderBinary(GLsizei n,
4682 const GLuint *shaders,
4683 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04004684 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04004685 GLsizei length)
4686{
4687 // No binary shader formats are supported.
4688 UNIMPLEMENTED();
4689}
4690
4691void Context::shaderSource(GLuint shader,
4692 GLsizei count,
4693 const GLchar *const *string,
4694 const GLint *length)
4695{
4696 Shader *shaderObject = getShader(shader);
4697 ASSERT(shaderObject);
4698 shaderObject->setSource(count, string, length);
4699}
4700
4701void Context::stencilFunc(GLenum func, GLint ref, GLuint mask)
4702{
4703 stencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4704}
4705
4706void Context::stencilMask(GLuint mask)
4707{
4708 stencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4709}
4710
4711void Context::stencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4712{
4713 stencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4714}
4715
4716void Context::uniform1f(GLint location, GLfloat x)
4717{
4718 Program *program = mGLState.getProgram();
4719 program->setUniform1fv(location, 1, &x);
4720}
4721
4722void Context::uniform1fv(GLint location, GLsizei count, const GLfloat *v)
4723{
4724 Program *program = mGLState.getProgram();
4725 program->setUniform1fv(location, count, v);
4726}
4727
4728void Context::uniform1i(GLint location, GLint x)
4729{
4730 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004731 if (program->setUniform1iv(location, 1, &x) == Program::SetUniformResult::SamplerChanged)
4732 {
4733 mGLState.setObjectDirty(GL_PROGRAM);
4734 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004735}
4736
4737void Context::uniform1iv(GLint location, GLsizei count, const GLint *v)
4738{
4739 Program *program = mGLState.getProgram();
Jamie Madill81c2e252017-09-09 23:32:46 -04004740 if (program->setUniform1iv(location, count, v) == Program::SetUniformResult::SamplerChanged)
4741 {
4742 mGLState.setObjectDirty(GL_PROGRAM);
4743 }
Jamie Madillc1d770e2017-04-13 17:31:24 -04004744}
4745
4746void Context::uniform2f(GLint location, GLfloat x, GLfloat y)
4747{
4748 GLfloat xy[2] = {x, y};
4749 Program *program = mGLState.getProgram();
4750 program->setUniform2fv(location, 1, xy);
4751}
4752
4753void Context::uniform2fv(GLint location, GLsizei count, const GLfloat *v)
4754{
4755 Program *program = mGLState.getProgram();
4756 program->setUniform2fv(location, count, v);
4757}
4758
4759void Context::uniform2i(GLint location, GLint x, GLint y)
4760{
4761 GLint xy[2] = {x, y};
4762 Program *program = mGLState.getProgram();
4763 program->setUniform2iv(location, 1, xy);
4764}
4765
4766void Context::uniform2iv(GLint location, GLsizei count, const GLint *v)
4767{
4768 Program *program = mGLState.getProgram();
4769 program->setUniform2iv(location, count, v);
4770}
4771
4772void Context::uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4773{
4774 GLfloat xyz[3] = {x, y, z};
4775 Program *program = mGLState.getProgram();
4776 program->setUniform3fv(location, 1, xyz);
4777}
4778
4779void Context::uniform3fv(GLint location, GLsizei count, const GLfloat *v)
4780{
4781 Program *program = mGLState.getProgram();
4782 program->setUniform3fv(location, count, v);
4783}
4784
4785void Context::uniform3i(GLint location, GLint x, GLint y, GLint z)
4786{
4787 GLint xyz[3] = {x, y, z};
4788 Program *program = mGLState.getProgram();
4789 program->setUniform3iv(location, 1, xyz);
4790}
4791
4792void Context::uniform3iv(GLint location, GLsizei count, const GLint *v)
4793{
4794 Program *program = mGLState.getProgram();
4795 program->setUniform3iv(location, count, v);
4796}
4797
4798void Context::uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4799{
4800 GLfloat xyzw[4] = {x, y, z, w};
4801 Program *program = mGLState.getProgram();
4802 program->setUniform4fv(location, 1, xyzw);
4803}
4804
4805void Context::uniform4fv(GLint location, GLsizei count, const GLfloat *v)
4806{
4807 Program *program = mGLState.getProgram();
4808 program->setUniform4fv(location, count, v);
4809}
4810
4811void Context::uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4812{
4813 GLint xyzw[4] = {x, y, z, w};
4814 Program *program = mGLState.getProgram();
4815 program->setUniform4iv(location, 1, xyzw);
4816}
4817
4818void Context::uniform4iv(GLint location, GLsizei count, const GLint *v)
4819{
4820 Program *program = mGLState.getProgram();
4821 program->setUniform4iv(location, count, v);
4822}
4823
4824void Context::uniformMatrix2fv(GLint location,
4825 GLsizei count,
4826 GLboolean transpose,
4827 const GLfloat *value)
4828{
4829 Program *program = mGLState.getProgram();
4830 program->setUniformMatrix2fv(location, count, transpose, value);
4831}
4832
4833void Context::uniformMatrix3fv(GLint location,
4834 GLsizei count,
4835 GLboolean transpose,
4836 const GLfloat *value)
4837{
4838 Program *program = mGLState.getProgram();
4839 program->setUniformMatrix3fv(location, count, transpose, value);
4840}
4841
4842void Context::uniformMatrix4fv(GLint location,
4843 GLsizei count,
4844 GLboolean transpose,
4845 const GLfloat *value)
4846{
4847 Program *program = mGLState.getProgram();
4848 program->setUniformMatrix4fv(location, count, transpose, value);
4849}
4850
4851void Context::validateProgram(GLuint program)
4852{
4853 Program *programObject = getProgram(program);
4854 ASSERT(programObject);
4855 programObject->validate(mCaps);
4856}
4857
Jiajia Qin5451d532017-11-16 17:16:34 +08004858void Context::validateProgramPipeline(GLuint pipeline)
4859{
4860 UNIMPLEMENTED();
4861}
4862
Jamie Madilld04908b2017-06-09 14:15:35 -04004863void Context::getProgramBinary(GLuint program,
4864 GLsizei bufSize,
4865 GLsizei *length,
4866 GLenum *binaryFormat,
4867 void *binary)
4868{
4869 Program *programObject = getProgram(program);
4870 ASSERT(programObject != nullptr);
4871
4872 handleError(programObject->saveBinary(this, binaryFormat, binary, bufSize, length));
4873}
4874
4875void Context::programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
4876{
4877 Program *programObject = getProgram(program);
4878 ASSERT(programObject != nullptr);
Jamie Madillb6664922017-07-25 12:55:04 -04004879
Jamie Madilld04908b2017-06-09 14:15:35 -04004880 handleError(programObject->loadBinary(this, binaryFormat, binary, length));
4881}
4882
Jamie Madillff325f12017-08-26 15:06:05 -04004883void Context::uniform1ui(GLint location, GLuint v0)
4884{
4885 Program *program = mGLState.getProgram();
4886 program->setUniform1uiv(location, 1, &v0);
4887}
4888
4889void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
4890{
4891 Program *program = mGLState.getProgram();
4892 const GLuint xy[] = {v0, v1};
4893 program->setUniform2uiv(location, 1, xy);
4894}
4895
4896void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
4897{
4898 Program *program = mGLState.getProgram();
4899 const GLuint xyz[] = {v0, v1, v2};
4900 program->setUniform3uiv(location, 1, xyz);
4901}
4902
4903void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
4904{
4905 Program *program = mGLState.getProgram();
4906 const GLuint xyzw[] = {v0, v1, v2, v3};
4907 program->setUniform4uiv(location, 1, xyzw);
4908}
4909
4910void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
4911{
4912 Program *program = mGLState.getProgram();
4913 program->setUniform1uiv(location, count, value);
4914}
4915void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
4916{
4917 Program *program = mGLState.getProgram();
4918 program->setUniform2uiv(location, count, value);
4919}
4920
4921void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
4922{
4923 Program *program = mGLState.getProgram();
4924 program->setUniform3uiv(location, count, value);
4925}
4926
4927void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
4928{
4929 Program *program = mGLState.getProgram();
4930 program->setUniform4uiv(location, count, value);
4931}
4932
Jamie Madillf0e04492017-08-26 15:28:42 -04004933void Context::genQueries(GLsizei n, GLuint *ids)
4934{
4935 for (GLsizei i = 0; i < n; i++)
4936 {
4937 GLuint handle = mQueryHandleAllocator.allocate();
4938 mQueryMap.assign(handle, nullptr);
4939 ids[i] = handle;
4940 }
4941}
4942
4943void Context::deleteQueries(GLsizei n, const GLuint *ids)
4944{
4945 for (int i = 0; i < n; i++)
4946 {
4947 GLuint query = ids[i];
4948
4949 Query *queryObject = nullptr;
4950 if (mQueryMap.erase(query, &queryObject))
4951 {
4952 mQueryHandleAllocator.release(query);
4953 if (queryObject)
4954 {
4955 queryObject->release(this);
4956 }
4957 }
4958 }
4959}
4960
4961GLboolean Context::isQuery(GLuint id)
4962{
4963 return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
4964}
4965
Jamie Madillc8c95812017-08-26 18:40:09 -04004966void Context::uniformMatrix2x3fv(GLint location,
4967 GLsizei count,
4968 GLboolean transpose,
4969 const GLfloat *value)
4970{
4971 Program *program = mGLState.getProgram();
4972 program->setUniformMatrix2x3fv(location, count, transpose, value);
4973}
4974
4975void Context::uniformMatrix3x2fv(GLint location,
4976 GLsizei count,
4977 GLboolean transpose,
4978 const GLfloat *value)
4979{
4980 Program *program = mGLState.getProgram();
4981 program->setUniformMatrix3x2fv(location, count, transpose, value);
4982}
4983
4984void Context::uniformMatrix2x4fv(GLint location,
4985 GLsizei count,
4986 GLboolean transpose,
4987 const GLfloat *value)
4988{
4989 Program *program = mGLState.getProgram();
4990 program->setUniformMatrix2x4fv(location, count, transpose, value);
4991}
4992
4993void Context::uniformMatrix4x2fv(GLint location,
4994 GLsizei count,
4995 GLboolean transpose,
4996 const GLfloat *value)
4997{
4998 Program *program = mGLState.getProgram();
4999 program->setUniformMatrix4x2fv(location, count, transpose, value);
5000}
5001
5002void Context::uniformMatrix3x4fv(GLint location,
5003 GLsizei count,
5004 GLboolean transpose,
5005 const GLfloat *value)
5006{
5007 Program *program = mGLState.getProgram();
5008 program->setUniformMatrix3x4fv(location, count, transpose, value);
5009}
5010
5011void Context::uniformMatrix4x3fv(GLint location,
5012 GLsizei count,
5013 GLboolean transpose,
5014 const GLfloat *value)
5015{
5016 Program *program = mGLState.getProgram();
5017 program->setUniformMatrix4x3fv(location, count, transpose, value);
5018}
5019
Jamie Madilld7576732017-08-26 18:49:50 -04005020void Context::deleteVertexArrays(GLsizei n, const GLuint *arrays)
5021{
5022 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5023 {
5024 GLuint vertexArray = arrays[arrayIndex];
5025
5026 if (arrays[arrayIndex] != 0)
5027 {
5028 VertexArray *vertexArrayObject = nullptr;
5029 if (mVertexArrayMap.erase(vertexArray, &vertexArrayObject))
5030 {
5031 if (vertexArrayObject != nullptr)
5032 {
5033 detachVertexArray(vertexArray);
5034 vertexArrayObject->onDestroy(this);
5035 }
5036
5037 mVertexArrayHandleAllocator.release(vertexArray);
5038 }
5039 }
5040 }
5041}
5042
5043void Context::genVertexArrays(GLsizei n, GLuint *arrays)
5044{
5045 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
5046 {
5047 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
5048 mVertexArrayMap.assign(vertexArray, nullptr);
5049 arrays[arrayIndex] = vertexArray;
5050 }
5051}
5052
5053bool Context::isVertexArray(GLuint array)
5054{
5055 if (array == 0)
5056 {
5057 return GL_FALSE;
5058 }
5059
5060 VertexArray *vao = getVertexArray(array);
5061 return (vao != nullptr ? GL_TRUE : GL_FALSE);
5062}
5063
Jamie Madillf0dcb8b2017-08-26 19:05:13 -04005064void Context::endTransformFeedback()
5065{
5066 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5067 transformFeedback->end(this);
5068}
5069
5070void Context::transformFeedbackVaryings(GLuint program,
5071 GLsizei count,
5072 const GLchar *const *varyings,
5073 GLenum bufferMode)
5074{
5075 Program *programObject = getProgram(program);
5076 ASSERT(programObject);
5077 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
5078}
5079
5080void Context::getTransformFeedbackVarying(GLuint program,
5081 GLuint index,
5082 GLsizei bufSize,
5083 GLsizei *length,
5084 GLsizei *size,
5085 GLenum *type,
5086 GLchar *name)
5087{
5088 Program *programObject = getProgram(program);
5089 ASSERT(programObject);
5090 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
5091}
5092
5093void Context::deleteTransformFeedbacks(GLsizei n, const GLuint *ids)
5094{
5095 for (int i = 0; i < n; i++)
5096 {
5097 GLuint transformFeedback = ids[i];
5098 if (transformFeedback == 0)
5099 {
5100 continue;
5101 }
5102
5103 TransformFeedback *transformFeedbackObject = nullptr;
5104 if (mTransformFeedbackMap.erase(transformFeedback, &transformFeedbackObject))
5105 {
5106 if (transformFeedbackObject != nullptr)
5107 {
5108 detachTransformFeedback(transformFeedback);
5109 transformFeedbackObject->release(this);
5110 }
5111
5112 mTransformFeedbackHandleAllocator.release(transformFeedback);
5113 }
5114 }
5115}
5116
5117void Context::genTransformFeedbacks(GLsizei n, GLuint *ids)
5118{
5119 for (int i = 0; i < n; i++)
5120 {
5121 GLuint transformFeedback = mTransformFeedbackHandleAllocator.allocate();
5122 mTransformFeedbackMap.assign(transformFeedback, nullptr);
5123 ids[i] = transformFeedback;
5124 }
5125}
5126
5127bool Context::isTransformFeedback(GLuint id)
5128{
5129 if (id == 0)
5130 {
5131 // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
5132 // returns FALSE
5133 return GL_FALSE;
5134 }
5135
5136 const TransformFeedback *transformFeedback = getTransformFeedback(id);
5137 return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
5138}
5139
5140void Context::pauseTransformFeedback()
5141{
5142 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5143 transformFeedback->pause();
5144}
5145
5146void Context::resumeTransformFeedback()
5147{
5148 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
5149 transformFeedback->resume();
5150}
5151
Jamie Madill12e957f2017-08-26 21:42:26 -04005152void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
5153{
5154 const Program *programObject = getProgram(program);
Jamie Madill54164b02017-08-28 15:17:37 -04005155 programObject->getUniformuiv(this, location, params);
Jamie Madill12e957f2017-08-26 21:42:26 -04005156}
5157
5158GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
5159{
5160 const Program *programObject = getProgram(program);
5161 return programObject->getFragDataLocation(name);
5162}
5163
5164void Context::getUniformIndices(GLuint program,
5165 GLsizei uniformCount,
5166 const GLchar *const *uniformNames,
5167 GLuint *uniformIndices)
5168{
5169 const Program *programObject = getProgram(program);
5170 if (!programObject->isLinked())
5171 {
5172 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5173 {
5174 uniformIndices[uniformId] = GL_INVALID_INDEX;
5175 }
5176 }
5177 else
5178 {
5179 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5180 {
5181 uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
5182 }
5183 }
5184}
5185
5186void Context::getActiveUniformsiv(GLuint program,
5187 GLsizei uniformCount,
5188 const GLuint *uniformIndices,
5189 GLenum pname,
5190 GLint *params)
5191{
5192 const Program *programObject = getProgram(program);
5193 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
5194 {
5195 const GLuint index = uniformIndices[uniformId];
jchen10baf5d942017-08-28 20:45:48 +08005196 params[uniformId] = GetUniformResourceProperty(programObject, index, pname);
Jamie Madill12e957f2017-08-26 21:42:26 -04005197 }
5198}
5199
5200GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
5201{
5202 const Program *programObject = getProgram(program);
5203 return programObject->getUniformBlockIndex(uniformBlockName);
5204}
5205
5206void Context::getActiveUniformBlockiv(GLuint program,
5207 GLuint uniformBlockIndex,
5208 GLenum pname,
5209 GLint *params)
5210{
5211 const Program *programObject = getProgram(program);
5212 QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
5213}
5214
5215void Context::getActiveUniformBlockName(GLuint program,
5216 GLuint uniformBlockIndex,
5217 GLsizei bufSize,
5218 GLsizei *length,
5219 GLchar *uniformBlockName)
5220{
5221 const Program *programObject = getProgram(program);
5222 programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
5223}
5224
5225void Context::uniformBlockBinding(GLuint program,
5226 GLuint uniformBlockIndex,
5227 GLuint uniformBlockBinding)
5228{
5229 Program *programObject = getProgram(program);
5230 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
5231}
5232
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005233GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
5234{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005235 GLuint handle = mState.mSyncs->createSync(mImplementation.get());
5236 GLsync syncHandle = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005237
Jamie Madill70b5bb02017-08-28 13:32:37 -04005238 Sync *syncObject = getSync(syncHandle);
5239 Error error = syncObject->set(condition, flags);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005240 if (error.isError())
5241 {
Jamie Madill70b5bb02017-08-28 13:32:37 -04005242 deleteSync(syncHandle);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005243 handleError(error);
5244 return nullptr;
5245 }
5246
Jamie Madill70b5bb02017-08-28 13:32:37 -04005247 return syncHandle;
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005248}
5249
5250GLboolean Context::isSync(GLsync sync)
5251{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005252 return (getSync(sync) != nullptr);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005253}
5254
5255GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5256{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005257 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005258
5259 GLenum result = GL_WAIT_FAILED;
5260 handleError(syncObject->clientWait(flags, timeout, &result));
5261 return result;
5262}
5263
5264void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
5265{
Jamie Madill70b5bb02017-08-28 13:32:37 -04005266 Sync *syncObject = getSync(sync);
Jamie Madill7f0c5a42017-08-26 22:43:26 -04005267 handleError(syncObject->serverWait(flags, timeout));
5268}
5269
5270void Context::getInteger64v(GLenum pname, GLint64 *params)
5271{
5272 GLenum nativeType = GL_NONE;
5273 unsigned int numParams = 0;
5274 getQueryParameterInfo(pname, &nativeType, &numParams);
5275
5276 if (nativeType == GL_INT_64_ANGLEX)
5277 {
5278 getInteger64vImpl(pname, params);
5279 }
5280 else
5281 {
5282 CastStateValues(this, nativeType, pname, numParams, params);
5283 }
5284}
5285
Corentin Wallez336129f2017-10-17 15:55:40 -04005286void Context::getBufferParameteri64v(BufferBinding target, GLenum pname, GLint64 *params)
Jamie Madill3ef140a2017-08-26 23:11:21 -04005287{
5288 Buffer *buffer = mGLState.getTargetBuffer(target);
5289 QueryBufferParameteri64v(buffer, pname, params);
5290}
5291
5292void Context::genSamplers(GLsizei count, GLuint *samplers)
5293{
5294 for (int i = 0; i < count; i++)
5295 {
5296 samplers[i] = mState.mSamplers->createSampler();
5297 }
5298}
5299
5300void Context::deleteSamplers(GLsizei count, const GLuint *samplers)
5301{
5302 for (int i = 0; i < count; i++)
5303 {
5304 GLuint sampler = samplers[i];
5305
5306 if (mState.mSamplers->getSampler(sampler))
5307 {
5308 detachSampler(sampler);
5309 }
5310
5311 mState.mSamplers->deleteObject(this, sampler);
5312 }
5313}
5314
5315void Context::getInternalformativ(GLenum target,
5316 GLenum internalformat,
5317 GLenum pname,
5318 GLsizei bufSize,
5319 GLint *params)
5320{
5321 const TextureCaps &formatCaps = mTextureCaps.get(internalformat);
5322 QueryInternalFormativ(formatCaps, pname, bufSize, params);
5323}
5324
Jiajia Qin5451d532017-11-16 17:16:34 +08005325void Context::programUniform1i(GLuint program, GLint location, GLint v0)
5326{
5327 programUniform1iv(program, location, 1, &v0);
5328}
5329
5330void Context::programUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
5331{
5332 GLint xy[2] = {v0, v1};
5333 programUniform2iv(program, location, 1, xy);
5334}
5335
5336void Context::programUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)
5337{
5338 GLint xyz[3] = {v0, v1, v2};
5339 programUniform3iv(program, location, 1, xyz);
5340}
5341
5342void Context::programUniform4i(GLuint program,
5343 GLint location,
5344 GLint v0,
5345 GLint v1,
5346 GLint v2,
5347 GLint v3)
5348{
5349 GLint xyzw[4] = {v0, v1, v2, v3};
5350 programUniform4iv(program, location, 1, xyzw);
5351}
5352
5353void Context::programUniform1ui(GLuint program, GLint location, GLuint v0)
5354{
5355 programUniform1uiv(program, location, 1, &v0);
5356}
5357
5358void Context::programUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
5359{
5360 GLuint xy[2] = {v0, v1};
5361 programUniform2uiv(program, location, 1, xy);
5362}
5363
5364void Context::programUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)
5365{
5366 GLuint xyz[3] = {v0, v1, v2};
5367 programUniform3uiv(program, location, 1, xyz);
5368}
5369
5370void Context::programUniform4ui(GLuint program,
5371 GLint location,
5372 GLuint v0,
5373 GLuint v1,
5374 GLuint v2,
5375 GLuint v3)
5376{
5377 GLuint xyzw[4] = {v0, v1, v2, v3};
5378 programUniform4uiv(program, location, 1, xyzw);
5379}
5380
5381void Context::programUniform1f(GLuint program, GLint location, GLfloat v0)
5382{
5383 programUniform1fv(program, location, 1, &v0);
5384}
5385
5386void Context::programUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
5387{
5388 GLfloat xy[2] = {v0, v1};
5389 programUniform2fv(program, location, 1, xy);
5390}
5391
5392void Context::programUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
5393{
5394 GLfloat xyz[3] = {v0, v1, v2};
5395 programUniform3fv(program, location, 1, xyz);
5396}
5397
5398void Context::programUniform4f(GLuint program,
5399 GLint location,
5400 GLfloat v0,
5401 GLfloat v1,
5402 GLfloat v2,
5403 GLfloat v3)
5404{
5405 GLfloat xyzw[4] = {v0, v1, v2, v3};
5406 programUniform4fv(program, location, 1, xyzw);
5407}
5408
Jamie Madill81c2e252017-09-09 23:32:46 -04005409void Context::programUniform1iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5410{
5411 Program *programObject = getProgram(program);
5412 ASSERT(programObject);
5413 if (programObject->setUniform1iv(location, count, value) ==
5414 Program::SetUniformResult::SamplerChanged)
5415 {
5416 mGLState.setObjectDirty(GL_PROGRAM);
5417 }
5418}
5419
Jiajia Qin5451d532017-11-16 17:16:34 +08005420void Context::programUniform2iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5421{
5422 Program *programObject = getProgram(program);
5423 ASSERT(programObject);
5424 programObject->setUniform2iv(location, count, value);
5425}
5426
5427void Context::programUniform3iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5428{
5429 Program *programObject = getProgram(program);
5430 ASSERT(programObject);
5431 programObject->setUniform3iv(location, count, value);
5432}
5433
5434void Context::programUniform4iv(GLuint program, GLint location, GLsizei count, const GLint *value)
5435{
5436 Program *programObject = getProgram(program);
5437 ASSERT(programObject);
5438 programObject->setUniform4iv(location, count, value);
5439}
5440
5441void Context::programUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5442{
5443 Program *programObject = getProgram(program);
5444 ASSERT(programObject);
5445 programObject->setUniform1uiv(location, count, value);
5446}
5447
5448void Context::programUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5449{
5450 Program *programObject = getProgram(program);
5451 ASSERT(programObject);
5452 programObject->setUniform2uiv(location, count, value);
5453}
5454
5455void Context::programUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5456{
5457 Program *programObject = getProgram(program);
5458 ASSERT(programObject);
5459 programObject->setUniform3uiv(location, count, value);
5460}
5461
5462void Context::programUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint *value)
5463{
5464 Program *programObject = getProgram(program);
5465 ASSERT(programObject);
5466 programObject->setUniform4uiv(location, count, value);
5467}
5468
5469void Context::programUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5470{
5471 Program *programObject = getProgram(program);
5472 ASSERT(programObject);
5473 programObject->setUniform1fv(location, count, value);
5474}
5475
5476void Context::programUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5477{
5478 Program *programObject = getProgram(program);
5479 ASSERT(programObject);
5480 programObject->setUniform2fv(location, count, value);
5481}
5482
5483void Context::programUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5484{
5485 Program *programObject = getProgram(program);
5486 ASSERT(programObject);
5487 programObject->setUniform3fv(location, count, value);
5488}
5489
5490void Context::programUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat *value)
5491{
5492 Program *programObject = getProgram(program);
5493 ASSERT(programObject);
5494 programObject->setUniform4fv(location, count, value);
5495}
5496
5497void Context::programUniformMatrix2fv(GLuint program,
5498 GLint location,
5499 GLsizei count,
5500 GLboolean transpose,
5501 const GLfloat *value)
5502{
5503 Program *programObject = getProgram(program);
5504 ASSERT(programObject);
5505 programObject->setUniformMatrix2fv(location, count, transpose, value);
5506}
5507
5508void Context::programUniformMatrix3fv(GLuint program,
5509 GLint location,
5510 GLsizei count,
5511 GLboolean transpose,
5512 const GLfloat *value)
5513{
5514 Program *programObject = getProgram(program);
5515 ASSERT(programObject);
5516 programObject->setUniformMatrix3fv(location, count, transpose, value);
5517}
5518
5519void Context::programUniformMatrix4fv(GLuint program,
5520 GLint location,
5521 GLsizei count,
5522 GLboolean transpose,
5523 const GLfloat *value)
5524{
5525 Program *programObject = getProgram(program);
5526 ASSERT(programObject);
5527 programObject->setUniformMatrix4fv(location, count, transpose, value);
5528}
5529
5530void Context::programUniformMatrix2x3fv(GLuint program,
5531 GLint location,
5532 GLsizei count,
5533 GLboolean transpose,
5534 const GLfloat *value)
5535{
5536 Program *programObject = getProgram(program);
5537 ASSERT(programObject);
5538 programObject->setUniformMatrix2x3fv(location, count, transpose, value);
5539}
5540
5541void Context::programUniformMatrix3x2fv(GLuint program,
5542 GLint location,
5543 GLsizei count,
5544 GLboolean transpose,
5545 const GLfloat *value)
5546{
5547 Program *programObject = getProgram(program);
5548 ASSERT(programObject);
5549 programObject->setUniformMatrix3x2fv(location, count, transpose, value);
5550}
5551
5552void Context::programUniformMatrix2x4fv(GLuint program,
5553 GLint location,
5554 GLsizei count,
5555 GLboolean transpose,
5556 const GLfloat *value)
5557{
5558 Program *programObject = getProgram(program);
5559 ASSERT(programObject);
5560 programObject->setUniformMatrix2x4fv(location, count, transpose, value);
5561}
5562
5563void Context::programUniformMatrix4x2fv(GLuint program,
5564 GLint location,
5565 GLsizei count,
5566 GLboolean transpose,
5567 const GLfloat *value)
5568{
5569 Program *programObject = getProgram(program);
5570 ASSERT(programObject);
5571 programObject->setUniformMatrix4x2fv(location, count, transpose, value);
5572}
5573
5574void Context::programUniformMatrix3x4fv(GLuint program,
5575 GLint location,
5576 GLsizei count,
5577 GLboolean transpose,
5578 const GLfloat *value)
5579{
5580 Program *programObject = getProgram(program);
5581 ASSERT(programObject);
5582 programObject->setUniformMatrix3x4fv(location, count, transpose, value);
5583}
5584
5585void Context::programUniformMatrix4x3fv(GLuint program,
5586 GLint location,
5587 GLsizei count,
5588 GLboolean transpose,
5589 const GLfloat *value)
5590{
5591 Program *programObject = getProgram(program);
5592 ASSERT(programObject);
5593 programObject->setUniformMatrix4x3fv(location, count, transpose, value);
5594}
5595
Jamie Madill81c2e252017-09-09 23:32:46 -04005596void Context::onTextureChange(const Texture *texture)
5597{
5598 // Conservatively assume all textures are dirty.
5599 // TODO(jmadill): More fine-grained update.
5600 mGLState.setObjectDirty(GL_TEXTURE);
5601}
5602
Yunchao Hea336b902017-08-02 16:05:21 +08005603void Context::genProgramPipelines(GLsizei count, GLuint *pipelines)
5604{
5605 for (int i = 0; i < count; i++)
5606 {
5607 pipelines[i] = createProgramPipeline();
5608 }
5609}
5610
5611void Context::deleteProgramPipelines(GLsizei count, const GLuint *pipelines)
5612{
5613 for (int i = 0; i < count; i++)
5614 {
5615 if (pipelines[i] != 0)
5616 {
5617 deleteProgramPipeline(pipelines[i]);
5618 }
5619 }
5620}
5621
5622GLboolean Context::isProgramPipeline(GLuint pipeline)
5623{
5624 if (pipeline == 0)
5625 {
5626 return GL_FALSE;
5627 }
5628
5629 return (getProgramPipeline(pipeline) ? GL_TRUE : GL_FALSE);
5630}
5631
Jamie Madillc29968b2016-01-20 11:17:23 -05005632} // namespace gl