blob: 2c2806f26208849ec6367fd5c3349d6c7fb05751 [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 Madillb9293972015-02-19 11:07:54 -050012#include <iterator>
13#include <sstream>
Sami Väisänene45e53b2016-05-25 10:36:04 +030014#include <string.h>
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"
Geoff Lang2b5420c2014-11-19 14:20:15 -050023#include "libANGLE/Fence.h"
24#include "libANGLE/Framebuffer.h"
25#include "libANGLE/FramebufferAttachment.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030026#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050027#include "libANGLE/Program.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050028#include "libANGLE/Query.h"
Jiawei-Shao2597fb62016-12-09 16:38:02 +080029#include "libANGLE/queryutils.h"
Jamie Madillb9293972015-02-19 11:07:54 -050030#include "libANGLE/Renderbuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050031#include "libANGLE/ResourceManager.h"
32#include "libANGLE/Sampler.h"
Jamie Madill9dd0cf02014-11-24 11:38:51 -050033#include "libANGLE/Surface.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050034#include "libANGLE/Texture.h"
35#include "libANGLE/TransformFeedback.h"
36#include "libANGLE/VertexArray.h"
37#include "libANGLE/formatutils.h"
38#include "libANGLE/validationES.h"
Kenneth Russellf2f6f652016-10-05 19:53:23 -070039#include "libANGLE/Workarounds.h"
Jamie Madill437fa652016-05-03 15:13:24 -040040#include "libANGLE/renderer/ContextImpl.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040041#include "libANGLE/renderer/EGLImplFactory.h"
Martin Radev66fb8202016-07-28 11:45:20 +030042#include "libANGLE/queryconversions.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040043#include "libANGLE/queryutils.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000044
Geoff Langf6db0982015-08-25 13:04:00 -040045namespace
46{
47
Ian Ewell3ffd78b2016-01-22 16:09:42 -050048template <typename T>
Geoff Lang4ddf5af2016-12-01 14:30:44 -050049std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030050 GLsizei numPaths,
51 const void *paths,
52 GLuint pathBase)
53{
54 std::vector<gl::Path *> ret;
55 ret.reserve(numPaths);
56
57 const auto *nameArray = static_cast<const T *>(paths);
58
59 for (GLsizei i = 0; i < numPaths; ++i)
60 {
61 const GLuint pathName = nameArray[i] + pathBase;
62
63 ret.push_back(resourceManager.getPath(pathName));
64 }
65
66 return ret;
67}
68
Geoff Lang4ddf5af2016-12-01 14:30:44 -050069std::vector<gl::Path *> GatherPaths(gl::PathManager &resourceManager,
Sami Väisänend59ca052016-06-21 16:10:00 +030070 GLsizei numPaths,
71 GLenum pathNameType,
72 const void *paths,
73 GLuint pathBase)
74{
75 switch (pathNameType)
76 {
77 case GL_UNSIGNED_BYTE:
78 return GatherPaths<GLubyte>(resourceManager, numPaths, paths, pathBase);
79
80 case GL_BYTE:
81 return GatherPaths<GLbyte>(resourceManager, numPaths, paths, pathBase);
82
83 case GL_UNSIGNED_SHORT:
84 return GatherPaths<GLushort>(resourceManager, numPaths, paths, pathBase);
85
86 case GL_SHORT:
87 return GatherPaths<GLshort>(resourceManager, numPaths, paths, pathBase);
88
89 case GL_UNSIGNED_INT:
90 return GatherPaths<GLuint>(resourceManager, numPaths, paths, pathBase);
91
92 case GL_INT:
93 return GatherPaths<GLint>(resourceManager, numPaths, paths, pathBase);
94 }
95
96 UNREACHABLE();
97 return std::vector<gl::Path *>();
98}
99
100template <typename T>
Geoff Lang2186c382016-10-14 10:54:54 -0400101gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500102{
Geoff Lang2186c382016-10-14 10:54:54 -0400103 ASSERT(query != nullptr);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500104
105 switch (pname)
106 {
107 case GL_QUERY_RESULT_EXT:
Geoff Lang2186c382016-10-14 10:54:54 -0400108 return query->getResult(params);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500109 case GL_QUERY_RESULT_AVAILABLE_EXT:
110 {
111 bool available;
Geoff Lang2186c382016-10-14 10:54:54 -0400112 gl::Error error = query->isResultAvailable(&available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500113 if (!error.isError())
114 {
Geoff Lang2186c382016-10-14 10:54:54 -0400115 *params = gl::ConvertFromGLboolean<T>(available);
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500116 }
117 return error;
118 }
119 default:
120 UNREACHABLE();
121 return gl::Error(GL_INVALID_OPERATION, "Unreachable Error");
122 }
123}
124
Geoff Langf6db0982015-08-25 13:04:00 -0400125void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
126{
Geoff Lang1a683462015-09-29 15:09:59 -0400127 if (transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
Geoff Langf6db0982015-08-25 13:04:00 -0400128 {
129 for (size_t tfBufferIndex = 0; tfBufferIndex < transformFeedback->getIndexedBufferCount();
130 tfBufferIndex++)
131 {
132 const OffsetBindingPointer<gl::Buffer> &buffer =
133 transformFeedback->getIndexedBuffer(tfBufferIndex);
134 if (buffer.get() != nullptr)
135 {
136 buffer->onTransformFeedback();
137 }
138 }
139 }
140}
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500141
142// Attribute map queries.
Martin Radev1be913c2016-07-11 17:59:16 +0300143EGLint GetClientMajorVersion(const egl::AttributeMap &attribs)
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500144{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400145 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500146}
147
Martin Radev1be913c2016-07-11 17:59:16 +0300148EGLint GetClientMinorVersion(const egl::AttributeMap &attribs)
149{
150 return static_cast<EGLint>(attribs.get(EGL_CONTEXT_MINOR_VERSION, 0));
151}
152
Geoff Langeb66a6e2016-10-31 13:06:12 -0400153gl::Version GetClientVersion(const egl::AttributeMap &attribs)
154{
155 return gl::Version(GetClientMajorVersion(attribs), GetClientMinorVersion(attribs));
156}
157
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500158GLenum GetResetStrategy(const egl::AttributeMap &attribs)
159{
Ian Ewellec2c0c52016-04-05 13:46:26 -0400160 EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
161 EGL_NO_RESET_NOTIFICATION_EXT);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500162 switch (attrib)
163 {
164 case EGL_NO_RESET_NOTIFICATION:
165 return GL_NO_RESET_NOTIFICATION_EXT;
166 case EGL_LOSE_CONTEXT_ON_RESET:
167 return GL_LOSE_CONTEXT_ON_RESET_EXT;
168 default:
169 UNREACHABLE();
170 return GL_NONE;
171 }
172}
173
174bool GetRobustAccess(const egl::AttributeMap &attribs)
175{
Geoff Lang077f20a2016-11-01 10:08:02 -0400176 return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) ||
177 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) !=
178 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500179}
180
181bool GetDebug(const egl::AttributeMap &attribs)
182{
Geoff Lang077f20a2016-11-01 10:08:02 -0400183 return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE) ||
184 ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) != 0);
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500185}
186
187bool GetNoError(const egl::AttributeMap &attribs)
188{
189 return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
190}
191
Geoff Langc287ea62016-09-16 14:46:51 -0400192bool GetWebGLContext(const egl::AttributeMap &attribs)
193{
194 return (attribs.get(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE, EGL_FALSE) == EGL_TRUE);
195}
196
Geoff Langf41a7152016-09-19 15:11:17 -0400197bool GetBindGeneratesResource(const egl::AttributeMap &attribs)
198{
199 return (attribs.get(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM, EGL_TRUE) == EGL_TRUE);
200}
201
Geoff Langfeb8c682017-02-13 16:07:35 -0500202bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
203{
204 return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
205}
206
Jamie Madille08a1d32017-03-07 17:24:06 -0500207bool GetRobustResourceInit(const egl::AttributeMap &attribs)
208{
209 return (attribs.get(EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
210}
211
Martin Radev9d901792016-07-15 15:58:58 +0300212std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
213{
214 std::string labelName;
215 if (label != nullptr)
216 {
217 size_t labelLength = length < 0 ? strlen(label) : length;
218 labelName = std::string(label, labelLength);
219 }
220 return labelName;
221}
222
223void GetObjectLabelBase(const std::string &objectLabel,
224 GLsizei bufSize,
225 GLsizei *length,
226 GLchar *label)
227{
228 size_t writeLength = objectLabel.length();
229 if (label != nullptr && bufSize > 0)
230 {
231 writeLength = std::min(static_cast<size_t>(bufSize) - 1, objectLabel.length());
232 std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
233 label[writeLength] = '\0';
234 }
235
236 if (length != nullptr)
237 {
238 *length = static_cast<GLsizei>(writeLength);
239 }
240}
241
Geoff Langf6db0982015-08-25 13:04:00 -0400242} // anonymous namespace
243
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000244namespace gl
245{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +0000246
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400247Context::Context(rx::EGLImplFactory *implFactory,
248 const egl::Config *config,
Corentin Wallez51706ea2015-08-07 14:39:22 -0400249 const Context *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500250 TextureManager *shareTextures,
Corentin Wallezc295e512017-01-27 17:47:50 -0500251 const egl::AttributeMap &attribs,
252 const egl::DisplayExtensions &displayExtensions)
Martin Radev1be913c2016-07-11 17:59:16 +0300253
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500254 : ValidationContext(shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500255 shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500256 GetClientVersion(attribs),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700257 &mGLState,
Jamie Madillf25855c2015-11-03 11:06:18 -0500258 mCaps,
259 mTextureCaps,
260 mExtensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500261 mLimitations,
262 GetNoError(attribs)),
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700263 mImplementation(implFactory->createContext(mState)),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500264 mCompiler(nullptr),
Corentin Walleze3b10e82015-05-20 11:06:25 -0400265 mConfig(config),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500266 mClientType(EGL_OPENGL_ES_API),
267 mHasBeenCurrent(false),
268 mContextLost(false),
269 mResetStatus(GL_NO_ERROR),
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700270 mContextLostForced(false),
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500271 mResetStrategy(GetResetStrategy(attribs)),
272 mRobustAccess(GetRobustAccess(attribs)),
Corentin Wallezccab69d2017-01-27 16:57:15 -0500273 mCurrentSurface(nullptr),
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500274 mSurfacelessFramebuffer(nullptr),
Jamie Madille14951e2017-03-09 18:55:16 -0500275 mWebGLContext(GetWebGLContext(attribs)),
276 mScratchBuffer(1000u)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000277{
Geoff Lang077f20a2016-11-01 10:08:02 -0400278 if (mRobustAccess)
279 {
280 UNIMPLEMENTED();
281 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000282
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500283 initCaps(displayExtensions);
Kenneth Russellf2f6f652016-10-05 19:53:23 -0700284 initWorkarounds();
Geoff Langc0b9ef42014-07-02 10:02:37 -0400285
Geoff Langeb66a6e2016-10-31 13:06:12 -0400286 mGLState.initialize(mCaps, mExtensions, getClientVersion(), GetDebug(attribs),
Jamie Madille08a1d32017-03-07 17:24:06 -0500287 GetBindGeneratesResource(attribs), GetClientArraysEnabled(attribs),
288 GetRobustResourceInit(attribs));
Régis Fénéon83107972015-02-05 12:57:44 +0100289
Shannon Woods53a94a82014-06-24 15:20:36 -0400290 mFenceNVHandleAllocator.setBaseHandle(0);
Geoff Lang7dca1862013-07-30 16:30:46 -0400291
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000292 // [OpenGL ES 2.0.24] section 3.7 page 83:
293 // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional
294 // and cube map texture state vectors respectively associated with them.
295 // In order that access to these initial textures not be lost, they are treated as texture
296 // objects all of whose names are 0.
297
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400298 Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500299 mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500300
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400301 Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500302 mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube);
Geoff Lang76b10c92014-09-05 16:28:14 -0400303
Geoff Langeb66a6e2016-10-31 13:06:12 -0400304 if (getClientVersion() >= Version(3, 0))
Geoff Lang76b10c92014-09-05 16:28:14 -0400305 {
306 // TODO: These could also be enabled via extension
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400307 Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500308 mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D);
Geoff Lang76b10c92014-09-05 16:28:14 -0400309
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400310 Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
Jamie Madilldedd7b92014-11-05 16:30:36 -0500311 mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray);
Geoff Lang76b10c92014-09-05 16:28:14 -0400312 }
Geoff Lang3b573612016-10-31 14:08:10 -0400313 if (getClientVersion() >= Version(3, 1))
314 {
315 Texture *zeroTexture2DMultisample =
316 new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_MULTISAMPLE);
317 mZeroTextures[GL_TEXTURE_2D_MULTISAMPLE].set(zeroTexture2DMultisample);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800318
319 bindGenericAtomicCounterBuffer(0);
320 for (unsigned int i = 0; i < mCaps.maxAtomicCounterBufferBindings; i++)
321 {
322 bindIndexedAtomicCounterBuffer(0, i, 0, 0);
323 }
Geoff Lang3b573612016-10-31 14:08:10 -0400324 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000325
Ian Ewellbda75592016-04-18 17:25:54 -0400326 if (mExtensions.eglImageExternal || mExtensions.eglStreamConsumerExternal)
327 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400328 Texture *zeroTextureExternal =
329 new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
Ian Ewellbda75592016-04-18 17:25:54 -0400330 mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(zeroTextureExternal);
331 }
332
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700333 mGLState.initializeZeroTextures(mZeroTextures);
Jamie Madille6382c32014-11-07 15:05:26 -0500334
Jamie Madill57a89722013-07-02 11:57:03 -0400335 bindVertexArray(0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000336 bindArrayBuffer(0);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800337 bindDrawIndirectBuffer(0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000338 bindElementArrayBuffer(0);
Geoff Lang76b10c92014-09-05 16:28:14 -0400339
Jamie Madill01a80ee2016-11-07 12:06:18 -0500340 bindRenderbuffer(GL_RENDERBUFFER, 0);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000341
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000342 bindGenericUniformBuffer(0);
Geoff Lang4dc3af02016-11-18 14:09:27 -0500343 for (unsigned int i = 0; i < mCaps.maxUniformBufferBindings; i++)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000344 {
345 bindIndexedUniformBuffer(0, i, 0, -1);
346 }
347
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000348 bindCopyReadBuffer(0);
349 bindCopyWriteBuffer(0);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000350 bindPixelPackBuffer(0);
351 bindPixelUnpackBuffer(0);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000352
Geoff Langeb66a6e2016-10-31 13:06:12 -0400353 if (getClientVersion() >= Version(3, 0))
Geoff Lang1a683462015-09-29 15:09:59 -0400354 {
355 // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
356 // In the initial state, a default transform feedback object is bound and treated as
357 // a transform feedback object with a name of zero. That object is bound any time
358 // BindTransformFeedback is called with id of zero
Geoff Lang1a683462015-09-29 15:09:59 -0400359 bindTransformFeedback(0);
360 }
Geoff Langc8058452014-02-03 12:04:11 -0500361
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700362 mCompiler = new Compiler(mImplementation.get(), mState);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500363
364 // Initialize dirty bit masks
365 // TODO(jmadill): additional ES3 state
366 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ALIGNMENT);
367 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ROW_LENGTH);
368 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
369 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_IMAGES);
370 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_ROWS);
371 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400372 mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500373 // No dirty objects.
374
375 // Readpixels uses the pack state and read FBO
376 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT);
377 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
378 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ROW_LENGTH);
379 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_ROWS);
380 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_PIXELS);
Corentin Wallezbbd663a2016-04-20 17:49:17 -0400381 mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_BUFFER_BINDING);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500382 mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
383
384 mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
385 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
386 mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
387 mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
388 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
389 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
390 mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
391 mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
392 mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
393 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
394 mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
395 mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
396
397 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
398 mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700399 mBlitDirtyBits.set(State::DIRTY_BIT_FRAMEBUFFER_SRGB);
Jamie Madillad9f24e2016-02-12 09:27:24 -0500400 mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
401 mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Jamie Madill437fa652016-05-03 15:13:24 -0400402
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400403 handleError(mImplementation->initialize());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000404}
405
Jamie Madill70ee0f62017-02-06 16:04:20 -0500406void Context::destroy(egl::Display *display)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000407{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500408 mGLState.reset(this);
Geoff Lang21329412014-12-02 20:50:30 +0000409
Corentin Wallez80b24112015-08-25 16:41:57 -0400410 for (auto fence : mFenceNVMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000411 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400412 SafeDelete(fence.second);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000413 }
414
Corentin Wallez80b24112015-08-25 16:41:57 -0400415 for (auto query : mQueryMap)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000416 {
Geoff Langf0aa8422015-09-29 15:08:34 -0400417 if (query.second != nullptr)
418 {
419 query.second->release();
420 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000421 }
422
Corentin Wallez80b24112015-08-25 16:41:57 -0400423 for (auto vertexArray : mVertexArrayMap)
Jamie Madill57a89722013-07-02 11:57:03 -0400424 {
Corentin Wallez80b24112015-08-25 16:41:57 -0400425 SafeDelete(vertexArray.second);
Jamie Madill57a89722013-07-02 11:57:03 -0400426 }
427
Corentin Wallez80b24112015-08-25 16:41:57 -0400428 for (auto transformFeedback : mTransformFeedbackMap)
Geoff Langc8058452014-02-03 12:04:11 -0500429 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500430 if (transformFeedback.second != nullptr)
431 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500432 transformFeedback.second->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500433 }
Geoff Langc8058452014-02-03 12:04:11 -0500434 }
435
Jamie Madilldedd7b92014-11-05 16:30:36 -0500436 for (auto &zeroTexture : mZeroTextures)
Geoff Lang76b10c92014-09-05 16:28:14 -0400437 {
Jamie Madilldedd7b92014-11-05 16:30:36 -0500438 zeroTexture.second.set(NULL);
Geoff Lang76b10c92014-09-05 16:28:14 -0400439 }
440 mZeroTextures.clear();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000441
Corentin Wallezccab69d2017-01-27 16:57:15 -0500442 SafeDelete(mSurfacelessFramebuffer);
443
Jamie Madill70ee0f62017-02-06 16:04:20 -0500444 releaseSurface(display);
Corentin Wallez51706ea2015-08-07 14:39:22 -0400445
Geoff Lang492a7e42014-11-05 13:27:06 -0500446 SafeDelete(mCompiler);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500447
448 mState.mBuffers->release(this);
449 mState.mShaderPrograms->release(this);
450 mState.mTextures->release(this);
451 mState.mRenderbuffers->release(this);
452 mState.mSamplers->release(this);
453 mState.mFenceSyncs->release(this);
454 mState.mPaths->release(this);
455 mState.mFramebuffers->release(this);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000456}
457
Jamie Madill70ee0f62017-02-06 16:04:20 -0500458Context::~Context()
459{
460}
461
462void Context::makeCurrent(egl::Display *display, egl::Surface *surface)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000463{
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000464 if (!mHasBeenCurrent)
465 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000466 initRendererString();
Geoff Langc339c4e2016-11-29 10:37:36 -0500467 initVersionStrings();
Geoff Langcec35902014-04-16 10:52:36 -0400468 initExtensionStrings();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000469
Corentin Wallezc295e512017-01-27 17:47:50 -0500470 int width = 0;
471 int height = 0;
472 if (surface != nullptr)
473 {
474 width = surface->getWidth();
475 height = surface->getHeight();
476 }
477
478 mGLState.setViewportParams(0, 0, width, height);
479 mGLState.setScissorParams(0, 0, width, height);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000480
481 mHasBeenCurrent = true;
482 }
483
Jamie Madill1b94d432015-08-07 13:23:23 -0400484 // TODO(jmadill): Rework this when we support ContextImpl
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700485 mGLState.setAllDirtyBits();
Jamie Madill1b94d432015-08-07 13:23:23 -0400486
Jamie Madill70ee0f62017-02-06 16:04:20 -0500487 releaseSurface(display);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500488
489 Framebuffer *newDefault = nullptr;
490 if (surface != nullptr)
491 {
Jamie Madill70ee0f62017-02-06 16:04:20 -0500492 surface->setIsCurrent(display, true);
Corentin Wallezccab69d2017-01-27 16:57:15 -0500493 mCurrentSurface = surface;
494 newDefault = surface->getDefaultFramebuffer();
495 }
496 else
497 {
498 if (mSurfacelessFramebuffer == nullptr)
499 {
500 mSurfacelessFramebuffer = new Framebuffer(mImplementation.get());
501 }
502
503 newDefault = mSurfacelessFramebuffer;
504 }
Jamie Madill18fdcbc2015-08-19 18:12:44 +0000505
Corentin Wallez37c39792015-08-20 14:19:46 -0400506 // Update default framebuffer, the binding of the previous default
507 // framebuffer (or lack of) will have a nullptr.
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400508 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700509 if (mGLState.getReadFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400510 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700511 mGLState.setReadFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400512 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700513 if (mGLState.getDrawFramebuffer() == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -0400514 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700515 mGLState.setDrawFramebufferBinding(newDefault);
Corentin Wallez37c39792015-08-20 14:19:46 -0400516 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500517 mState.mFramebuffers->setDefaultFramebuffer(newDefault);
Jamie Madillc1c1cdc2015-04-30 09:42:26 -0400518 }
Ian Ewell292f0052016-02-04 10:37:32 -0500519
520 // Notify the renderer of a context switch
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700521 mImplementation->onMakeCurrent(mState);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000522}
523
Jamie Madill70ee0f62017-02-06 16:04:20 -0500524void Context::releaseSurface(egl::Display *display)
Jamie Madill77a72f62015-04-14 11:18:32 -0400525{
Corentin Wallez37c39792015-08-20 14:19:46 -0400526 // Remove the default framebuffer
Corentin Wallezc295e512017-01-27 17:47:50 -0500527 Framebuffer *currentDefault = nullptr;
528 if (mCurrentSurface != nullptr)
Corentin Wallez51706ea2015-08-07 14:39:22 -0400529 {
Corentin Wallezc295e512017-01-27 17:47:50 -0500530 currentDefault = mCurrentSurface->getDefaultFramebuffer();
531 }
532 else if (mSurfacelessFramebuffer != nullptr)
533 {
534 currentDefault = mSurfacelessFramebuffer;
Corentin Wallez51706ea2015-08-07 14:39:22 -0400535 }
536
Corentin Wallezc295e512017-01-27 17:47:50 -0500537 if (mGLState.getReadFramebuffer() == currentDefault)
538 {
539 mGLState.setReadFramebufferBinding(nullptr);
540 }
541 if (mGLState.getDrawFramebuffer() == currentDefault)
542 {
543 mGLState.setDrawFramebufferBinding(nullptr);
544 }
545 mState.mFramebuffers->setDefaultFramebuffer(nullptr);
546
547 if (mCurrentSurface)
548 {
Jamie Madill70ee0f62017-02-06 16:04:20 -0500549 mCurrentSurface->setIsCurrent(display, false);
Corentin Wallezc295e512017-01-27 17:47:50 -0500550 mCurrentSurface = nullptr;
551 }
Jamie Madill77a72f62015-04-14 11:18:32 -0400552}
553
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000554GLuint Context::createBuffer()
555{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500556 return mState.mBuffers->createBuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000557}
558
559GLuint Context::createProgram()
560{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500561 return mState.mShaderPrograms->createProgram(mImplementation.get());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000562}
563
564GLuint Context::createShader(GLenum type)
565{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500566 return mState.mShaderPrograms->createShader(mImplementation.get(), mLimitations, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000567}
568
569GLuint Context::createTexture()
570{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500571 return mState.mTextures->createTexture();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000572}
573
574GLuint Context::createRenderbuffer()
575{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500576 return mState.mRenderbuffers->createRenderbuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000577}
578
Geoff Lang882033e2014-09-30 11:26:07 -0400579GLsync Context::createFenceSync()
Jamie Madillcd055f82013-07-26 11:55:15 -0400580{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500581 GLuint handle = mState.mFenceSyncs->createFenceSync(mImplementation.get());
Jamie Madillcd055f82013-07-26 11:55:15 -0400582
Cooper Partind8e62a32015-01-29 15:21:25 -0800583 return reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
Jamie Madillcd055f82013-07-26 11:55:15 -0400584}
585
Sami Väisänene45e53b2016-05-25 10:36:04 +0300586GLuint Context::createPaths(GLsizei range)
587{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500588 auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300589 if (resultOrError.isError())
590 {
591 handleError(resultOrError.getError());
592 return 0;
593 }
594 return resultOrError.getResult();
595}
596
Jamie Madill57a89722013-07-02 11:57:03 -0400597GLuint Context::createVertexArray()
598{
Geoff Lang36167ab2015-12-07 10:27:14 -0500599 GLuint vertexArray = mVertexArrayHandleAllocator.allocate();
600 mVertexArrayMap[vertexArray] = nullptr;
601 return vertexArray;
Jamie Madill57a89722013-07-02 11:57:03 -0400602}
603
Jamie Madilldc356042013-07-19 16:36:57 -0400604GLuint Context::createSampler()
605{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500606 return mState.mSamplers->createSampler();
Jamie Madilldc356042013-07-19 16:36:57 -0400607}
608
Geoff Langc8058452014-02-03 12:04:11 -0500609GLuint Context::createTransformFeedback()
610{
Geoff Lang36167ab2015-12-07 10:27:14 -0500611 GLuint transformFeedback = mTransformFeedbackAllocator.allocate();
612 mTransformFeedbackMap[transformFeedback] = nullptr;
613 return transformFeedback;
Geoff Langc8058452014-02-03 12:04:11 -0500614}
615
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000616// Returns an unused framebuffer name
617GLuint Context::createFramebuffer()
618{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500619 return mState.mFramebuffers->createFramebuffer();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000620}
621
Jamie Madill33dc8432013-07-26 11:55:05 -0400622GLuint Context::createFenceNV()
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000623{
Jamie Madill33dc8432013-07-26 11:55:05 -0400624 GLuint handle = mFenceNVHandleAllocator.allocate();
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000625
Jamie Madill53ea9cc2016-05-17 10:12:52 -0400626 mFenceNVMap[handle] = new FenceNV(mImplementation->createFenceNV());
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000627
628 return handle;
629}
630
631// Returns an unused query name
632GLuint Context::createQuery()
633{
634 GLuint handle = mQueryHandleAllocator.allocate();
635
636 mQueryMap[handle] = NULL;
637
638 return handle;
639}
640
641void Context::deleteBuffer(GLuint buffer)
642{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500643 if (mState.mBuffers->getBuffer(buffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000644 {
645 detachBuffer(buffer);
646 }
Jamie Madill893ab082014-05-16 16:56:10 -0400647
Jamie Madill6c1f6712017-02-14 19:08:04 -0500648 mState.mBuffers->deleteObject(this, buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000649}
650
651void Context::deleteShader(GLuint shader)
652{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500653 mState.mShaderPrograms->deleteShader(this, shader);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000654}
655
656void Context::deleteProgram(GLuint program)
657{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500658 mState.mShaderPrograms->deleteProgram(this, program);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000659}
660
661void Context::deleteTexture(GLuint texture)
662{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500663 if (mState.mTextures->getTexture(texture))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000664 {
665 detachTexture(texture);
666 }
667
Jamie Madill6c1f6712017-02-14 19:08:04 -0500668 mState.mTextures->deleteObject(this, texture);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000669}
670
671void Context::deleteRenderbuffer(GLuint renderbuffer)
672{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500673 if (mState.mRenderbuffers->getRenderbuffer(renderbuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000674 {
675 detachRenderbuffer(renderbuffer);
676 }
Jamie Madill893ab082014-05-16 16:56:10 -0400677
Jamie Madill6c1f6712017-02-14 19:08:04 -0500678 mState.mRenderbuffers->deleteObject(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000679}
680
Jamie Madillcd055f82013-07-26 11:55:15 -0400681void Context::deleteFenceSync(GLsync fenceSync)
682{
683 // The spec specifies the underlying Fence object is not deleted until all current
684 // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
685 // and since our API is currently designed for being called from a single thread, we can delete
686 // the fence immediately.
Jamie Madill6c1f6712017-02-14 19:08:04 -0500687 mState.mFenceSyncs->deleteObject(this,
688 static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400689}
690
Sami Väisänene45e53b2016-05-25 10:36:04 +0300691void Context::deletePaths(GLuint first, GLsizei range)
692{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500693 mState.mPaths->deletePaths(first, range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300694}
695
696bool Context::hasPathData(GLuint path) const
697{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500698 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300699 if (pathObj == nullptr)
700 return false;
701
702 return pathObj->hasPathData();
703}
704
705bool Context::hasPath(GLuint path) const
706{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500707 return mState.mPaths->hasPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300708}
709
710void Context::setPathCommands(GLuint path,
711 GLsizei numCommands,
712 const GLubyte *commands,
713 GLsizei numCoords,
714 GLenum coordType,
715 const void *coords)
716{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500717 auto *pathObject = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300718
719 handleError(pathObject->setCommands(numCommands, commands, numCoords, coordType, coords));
720}
721
722void Context::setPathParameterf(GLuint path, GLenum pname, GLfloat value)
723{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500724 auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300725
726 switch (pname)
727 {
728 case GL_PATH_STROKE_WIDTH_CHROMIUM:
729 pathObj->setStrokeWidth(value);
730 break;
731 case GL_PATH_END_CAPS_CHROMIUM:
732 pathObj->setEndCaps(static_cast<GLenum>(value));
733 break;
734 case GL_PATH_JOIN_STYLE_CHROMIUM:
735 pathObj->setJoinStyle(static_cast<GLenum>(value));
736 break;
737 case GL_PATH_MITER_LIMIT_CHROMIUM:
738 pathObj->setMiterLimit(value);
739 break;
740 case GL_PATH_STROKE_BOUND_CHROMIUM:
741 pathObj->setStrokeBound(value);
742 break;
743 default:
744 UNREACHABLE();
745 break;
746 }
747}
748
749void Context::getPathParameterfv(GLuint path, GLenum pname, GLfloat *value) const
750{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500751 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300752
753 switch (pname)
754 {
755 case GL_PATH_STROKE_WIDTH_CHROMIUM:
756 *value = pathObj->getStrokeWidth();
757 break;
758 case GL_PATH_END_CAPS_CHROMIUM:
759 *value = static_cast<GLfloat>(pathObj->getEndCaps());
760 break;
761 case GL_PATH_JOIN_STYLE_CHROMIUM:
762 *value = static_cast<GLfloat>(pathObj->getJoinStyle());
763 break;
764 case GL_PATH_MITER_LIMIT_CHROMIUM:
765 *value = pathObj->getMiterLimit();
766 break;
767 case GL_PATH_STROKE_BOUND_CHROMIUM:
768 *value = pathObj->getStrokeBound();
769 break;
770 default:
771 UNREACHABLE();
772 break;
773 }
774}
775
776void Context::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
777{
778 mGLState.setPathStencilFunc(func, ref, mask);
779}
780
Jamie Madill57a89722013-07-02 11:57:03 -0400781void Context::deleteVertexArray(GLuint vertexArray)
782{
Geoff Lang36167ab2015-12-07 10:27:14 -0500783 auto iter = mVertexArrayMap.find(vertexArray);
784 if (iter != mVertexArrayMap.end())
Geoff Lang50b3fe82015-12-08 14:49:12 +0000785 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500786 VertexArray *vertexArrayObject = iter->second;
787 if (vertexArrayObject != nullptr)
788 {
789 detachVertexArray(vertexArray);
790 delete vertexArrayObject;
791 }
Geoff Lang50b3fe82015-12-08 14:49:12 +0000792
Geoff Lang36167ab2015-12-07 10:27:14 -0500793 mVertexArrayMap.erase(iter);
794 mVertexArrayHandleAllocator.release(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -0400795 }
796}
797
Jamie Madilldc356042013-07-19 16:36:57 -0400798void Context::deleteSampler(GLuint sampler)
799{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500800 if (mState.mSamplers->getSampler(sampler))
Jamie Madilldc356042013-07-19 16:36:57 -0400801 {
802 detachSampler(sampler);
803 }
804
Jamie Madill6c1f6712017-02-14 19:08:04 -0500805 mState.mSamplers->deleteObject(this, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -0400806}
807
Geoff Langc8058452014-02-03 12:04:11 -0500808void Context::deleteTransformFeedback(GLuint transformFeedback)
809{
Jamie Madill5fd0b2d2015-01-05 13:38:44 -0500810 auto iter = mTransformFeedbackMap.find(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500811 if (iter != mTransformFeedbackMap.end())
812 {
Geoff Lang36167ab2015-12-07 10:27:14 -0500813 TransformFeedback *transformFeedbackObject = iter->second;
814 if (transformFeedbackObject != nullptr)
815 {
816 detachTransformFeedback(transformFeedback);
Jamie Madill6c1f6712017-02-14 19:08:04 -0500817 transformFeedbackObject->release(this);
Geoff Lang36167ab2015-12-07 10:27:14 -0500818 }
819
Geoff Lang50b3fe82015-12-08 14:49:12 +0000820 mTransformFeedbackMap.erase(iter);
Geoff Lang36167ab2015-12-07 10:27:14 -0500821 mTransformFeedbackAllocator.release(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -0500822 }
823}
824
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000825void Context::deleteFramebuffer(GLuint framebuffer)
826{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500827 if (mState.mFramebuffers->getFramebuffer(framebuffer))
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000828 {
829 detachFramebuffer(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000830 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500831
Jamie Madill6c1f6712017-02-14 19:08:04 -0500832 mState.mFramebuffers->deleteObject(this, framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000833}
834
Jamie Madill33dc8432013-07-26 11:55:05 -0400835void Context::deleteFenceNV(GLuint fence)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000836{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500837 auto fenceObject = mFenceNVMap.find(fence);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000838
Jamie Madill33dc8432013-07-26 11:55:05 -0400839 if (fenceObject != mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000840 {
Jamie Madill33dc8432013-07-26 11:55:05 -0400841 mFenceNVHandleAllocator.release(fenceObject->first);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000842 delete fenceObject->second;
Jamie Madill33dc8432013-07-26 11:55:05 -0400843 mFenceNVMap.erase(fenceObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000844 }
845}
846
847void Context::deleteQuery(GLuint query)
848{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500849 auto queryObject = mQueryMap.find(query);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000850 if (queryObject != mQueryMap.end())
851 {
852 mQueryHandleAllocator.release(queryObject->first);
853 if (queryObject->second)
854 {
855 queryObject->second->release();
856 }
857 mQueryMap.erase(queryObject);
858 }
859}
860
Geoff Lang70d0f492015-12-10 17:45:46 -0500861Buffer *Context::getBuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000862{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500863 return mState.mBuffers->getBuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000864}
865
Jamie Madill570f7c82014-07-03 10:38:54 -0400866Texture *Context::getTexture(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000867{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500868 return mState.mTextures->getTexture(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000869}
870
Geoff Lang70d0f492015-12-10 17:45:46 -0500871Renderbuffer *Context::getRenderbuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000872{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500873 return mState.mRenderbuffers->getRenderbuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000874}
875
Jamie Madillcd055f82013-07-26 11:55:15 -0400876FenceSync *Context::getFenceSync(GLsync handle) const
877{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500878 return mState.mFenceSyncs->getFenceSync(
879 static_cast<GLuint>(reinterpret_cast<uintptr_t>(handle)));
Jamie Madillcd055f82013-07-26 11:55:15 -0400880}
881
Jamie Madill57a89722013-07-02 11:57:03 -0400882VertexArray *Context::getVertexArray(GLuint handle) const
883{
884 auto vertexArray = mVertexArrayMap.find(handle);
Geoff Lang36167ab2015-12-07 10:27:14 -0500885 return (vertexArray != mVertexArrayMap.end()) ? vertexArray->second : nullptr;
Jamie Madill57a89722013-07-02 11:57:03 -0400886}
887
Jamie Madilldc356042013-07-19 16:36:57 -0400888Sampler *Context::getSampler(GLuint handle) const
889{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500890 return mState.mSamplers->getSampler(handle);
Jamie Madilldc356042013-07-19 16:36:57 -0400891}
892
Geoff Langc8058452014-02-03 12:04:11 -0500893TransformFeedback *Context::getTransformFeedback(GLuint handle) const
894{
Geoff Lang36167ab2015-12-07 10:27:14 -0500895 auto iter = mTransformFeedbackMap.find(handle);
896 return (iter != mTransformFeedbackMap.end()) ? iter->second : nullptr;
Geoff Langc8058452014-02-03 12:04:11 -0500897}
898
Geoff Lang70d0f492015-12-10 17:45:46 -0500899LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
900{
901 switch (identifier)
902 {
903 case GL_BUFFER:
904 return getBuffer(name);
905 case GL_SHADER:
906 return getShader(name);
907 case GL_PROGRAM:
908 return getProgram(name);
909 case GL_VERTEX_ARRAY:
910 return getVertexArray(name);
911 case GL_QUERY:
912 return getQuery(name);
913 case GL_TRANSFORM_FEEDBACK:
914 return getTransformFeedback(name);
915 case GL_SAMPLER:
916 return getSampler(name);
917 case GL_TEXTURE:
918 return getTexture(name);
919 case GL_RENDERBUFFER:
920 return getRenderbuffer(name);
921 case GL_FRAMEBUFFER:
922 return getFramebuffer(name);
923 default:
924 UNREACHABLE();
925 return nullptr;
926 }
927}
928
929LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
930{
931 return getFenceSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr)));
932}
933
Martin Radev9d901792016-07-15 15:58:58 +0300934void Context::objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
935{
936 LabeledObject *object = getLabeledObject(identifier, name);
937 ASSERT(object != nullptr);
938
939 std::string labelName = GetObjectLabelFromPointer(length, label);
940 object->setLabel(labelName);
941}
942
943void Context::objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
944{
945 LabeledObject *object = getLabeledObjectFromPtr(ptr);
946 ASSERT(object != nullptr);
947
948 std::string labelName = GetObjectLabelFromPointer(length, label);
949 object->setLabel(labelName);
950}
951
952void Context::getObjectLabel(GLenum identifier,
953 GLuint name,
954 GLsizei bufSize,
955 GLsizei *length,
956 GLchar *label) const
957{
958 LabeledObject *object = getLabeledObject(identifier, name);
959 ASSERT(object != nullptr);
960
961 const std::string &objectLabel = object->getLabel();
962 GetObjectLabelBase(objectLabel, bufSize, length, label);
963}
964
965void Context::getObjectPtrLabel(const void *ptr,
966 GLsizei bufSize,
967 GLsizei *length,
968 GLchar *label) const
969{
970 LabeledObject *object = getLabeledObjectFromPtr(ptr);
971 ASSERT(object != nullptr);
972
973 const std::string &objectLabel = object->getLabel();
974 GetObjectLabelBase(objectLabel, bufSize, length, label);
975}
976
Jamie Madilldc356042013-07-19 16:36:57 -0400977bool Context::isSampler(GLuint samplerName) const
978{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500979 return mState.mSamplers->isSampler(samplerName);
Jamie Madilldc356042013-07-19 16:36:57 -0400980}
981
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500982void Context::bindArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000983{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500984 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700985 mGLState.setArrayBufferBinding(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000986}
987
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800988void Context::bindDrawIndirectBuffer(GLuint bufferHandle)
989{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500990 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800991 mGLState.setDrawIndirectBufferBinding(buffer);
992}
993
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500994void Context::bindElementArrayBuffer(GLuint bufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000995{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500996 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Shao80957d92017-02-20 21:25:59 +0800997 mGLState.setElementArrayBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +0000998}
999
Jamie Madilldedd7b92014-11-05 16:30:36 -05001000void Context::bindTexture(GLenum target, GLuint handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001001{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001002 Texture *texture = nullptr;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001003
Jamie Madilldedd7b92014-11-05 16:30:36 -05001004 if (handle == 0)
1005 {
1006 texture = mZeroTextures[target].get();
1007 }
1008 else
1009 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001010 texture = mState.mTextures->checkTextureAllocation(mImplementation.get(), handle, target);
Jamie Madilldedd7b92014-11-05 16:30:36 -05001011 }
1012
1013 ASSERT(texture);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001014 mGLState.setSamplerTexture(target, texture);
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001015}
1016
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001017void Context::bindReadFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001018{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001019 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1020 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001021 mGLState.setReadFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001022}
1023
Jamie Madill5bf9ff42016-02-01 11:13:03 -05001024void Context::bindDrawFramebuffer(GLuint framebufferHandle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001025{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001026 Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
1027 mImplementation.get(), mCaps, framebufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001028 mGLState.setDrawFramebufferBinding(framebuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001029}
1030
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001031void Context::bindVertexArray(GLuint vertexArrayHandle)
Jamie Madill57a89722013-07-02 11:57:03 -04001032{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001033 VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001034 mGLState.setVertexArrayBinding(vertexArray);
Jamie Madill57a89722013-07-02 11:57:03 -04001035}
1036
Shao80957d92017-02-20 21:25:59 +08001037void Context::bindVertexBuffer(GLuint bindingIndex,
1038 GLuint bufferHandle,
1039 GLintptr offset,
1040 GLsizei stride)
1041{
1042 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
1043 mGLState.bindVertexBuffer(bindingIndex, buffer, offset, stride);
1044}
1045
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001046void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -04001047{
Geoff Lang76b10c92014-09-05 16:28:14 -04001048 ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
Jamie Madill901b3792016-05-26 09:20:40 -04001049 Sampler *sampler =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001050 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), samplerHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001051 mGLState.setSamplerBinding(textureUnit, sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04001052}
1053
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001054void Context::bindGenericUniformBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001055{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001056 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001057 mGLState.setGenericUniformBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001058}
1059
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001060void Context::bindIndexedUniformBuffer(GLuint bufferHandle,
1061 GLuint index,
1062 GLintptr offset,
1063 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001064{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001065 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001066 mGLState.setIndexedUniformBufferBinding(index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001067}
1068
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001069void Context::bindGenericTransformFeedbackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001070{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001071 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001072 mGLState.getCurrentTransformFeedback()->bindGenericBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001073}
1074
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001075void Context::bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
1076 GLuint index,
1077 GLintptr offset,
1078 GLsizeiptr size)
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001079{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001080 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001081 mGLState.getCurrentTransformFeedback()->bindIndexedBuffer(index, buffer, offset, size);
shannon.woods%transgaming.com@gtempaccount.com34089352013-04-13 03:36:57 +00001082}
1083
Jiajia Qin6eafb042016-12-27 17:04:07 +08001084void Context::bindGenericAtomicCounterBuffer(GLuint bufferHandle)
1085{
1086 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
1087 mGLState.setGenericAtomicCounterBufferBinding(buffer);
1088}
1089
1090void Context::bindIndexedAtomicCounterBuffer(GLuint bufferHandle,
1091 GLuint index,
1092 GLintptr offset,
1093 GLsizeiptr size)
1094{
1095 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
1096 mGLState.setIndexedAtomicCounterBufferBinding(index, buffer, offset, size);
1097}
1098
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001099void Context::bindCopyReadBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001100{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001101 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001102 mGLState.setCopyReadBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001103}
1104
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001105void Context::bindCopyWriteBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001106{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001107 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001108 mGLState.setCopyWriteBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001109}
1110
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001111void Context::bindPixelPackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001112{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001113 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001114 mGLState.setPixelPackBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001115}
1116
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001117void Context::bindPixelUnpackBuffer(GLuint bufferHandle)
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001118{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001119 Buffer *buffer = mState.mBuffers->checkBufferAllocation(mImplementation.get(), bufferHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001120 mGLState.setPixelUnpackBufferBinding(buffer);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001121}
1122
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001123void Context::useProgram(GLuint program)
1124{
Jamie Madill6c1f6712017-02-14 19:08:04 -05001125 mGLState.setProgram(this, getProgram(program));
daniel@transgaming.com95d29422012-07-24 18:36:10 +00001126}
1127
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001128void Context::bindTransformFeedback(GLuint transformFeedbackHandle)
Geoff Langc8058452014-02-03 12:04:11 -05001129{
Jamie Madill3f01e6c2016-03-08 13:53:02 -05001130 TransformFeedback *transformFeedback =
1131 checkTransformFeedbackAllocation(transformFeedbackHandle);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001132 mGLState.setTransformFeedbackBinding(transformFeedback);
Geoff Langc8058452014-02-03 12:04:11 -05001133}
1134
Geoff Lang5aad9672014-09-08 11:10:42 -04001135Error Context::beginQuery(GLenum target, GLuint query)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001136{
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001137 Query *queryObject = getQuery(query, true, target);
Jamie Madilldb2f14c2014-05-13 13:56:30 -04001138 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001139
Geoff Lang5aad9672014-09-08 11:10:42 -04001140 // begin query
1141 Error error = queryObject->begin();
1142 if (error.isError())
1143 {
1144 return error;
1145 }
1146
1147 // set query as active for specified target only if begin succeeded
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001148 mGLState.setActiveQuery(target, queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001149
He Yunchaoacd18982017-01-04 10:46:42 +08001150 return NoError();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001151}
1152
Geoff Lang5aad9672014-09-08 11:10:42 -04001153Error Context::endQuery(GLenum target)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001154{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001155 Query *queryObject = mGLState.getActiveQuery(target);
Jamie Madill45c785d2014-05-13 14:09:34 -04001156 ASSERT(queryObject);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001157
Geoff Lang5aad9672014-09-08 11:10:42 -04001158 gl::Error error = queryObject->end();
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001159
Geoff Lang5aad9672014-09-08 11:10:42 -04001160 // Always unbind the query, even if there was an error. This may delete the query object.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001161 mGLState.setActiveQuery(target, NULL);
Geoff Lang5aad9672014-09-08 11:10:42 -04001162
1163 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001164}
1165
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001166Error Context::queryCounter(GLuint id, GLenum target)
1167{
1168 ASSERT(target == GL_TIMESTAMP_EXT);
1169
1170 Query *queryObject = getQuery(id, true, target);
1171 ASSERT(queryObject);
1172
1173 return queryObject->queryCounter();
1174}
1175
1176void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
1177{
1178 switch (pname)
1179 {
1180 case GL_CURRENT_QUERY_EXT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001181 params[0] = mGLState.getActiveQueryId(target);
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001182 break;
1183 case GL_QUERY_COUNTER_BITS_EXT:
1184 switch (target)
1185 {
1186 case GL_TIME_ELAPSED_EXT:
1187 params[0] = getExtensions().queryCounterBitsTimeElapsed;
1188 break;
1189 case GL_TIMESTAMP_EXT:
1190 params[0] = getExtensions().queryCounterBitsTimestamp;
1191 break;
1192 default:
1193 UNREACHABLE();
1194 params[0] = 0;
1195 break;
1196 }
1197 break;
1198 default:
1199 UNREACHABLE();
1200 return;
1201 }
1202}
1203
Geoff Lang2186c382016-10-14 10:54:54 -04001204void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001205{
Geoff Lang2186c382016-10-14 10:54:54 -04001206 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001207}
1208
Geoff Lang2186c382016-10-14 10:54:54 -04001209void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001210{
Geoff Lang2186c382016-10-14 10:54:54 -04001211 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001212}
1213
Geoff Lang2186c382016-10-14 10:54:54 -04001214void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001215{
Geoff Lang2186c382016-10-14 10:54:54 -04001216 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001217}
1218
Geoff Lang2186c382016-10-14 10:54:54 -04001219void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001220{
Geoff Lang2186c382016-10-14 10:54:54 -04001221 handleError(GetQueryObjectParameter(getQuery(id), pname, params));
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001222}
1223
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001224Framebuffer *Context::getFramebuffer(GLuint handle) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001225{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05001226 return mState.mFramebuffers->getFramebuffer(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001227}
1228
Jamie Madill33dc8432013-07-26 11:55:05 -04001229FenceNV *Context::getFenceNV(unsigned int handle)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001230{
Jamie Madill4e25a0d2016-03-08 13:53:03 -05001231 auto fence = mFenceNVMap.find(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001232
Jamie Madill33dc8432013-07-26 11:55:05 -04001233 if (fence == mFenceNVMap.end())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001234 {
1235 return NULL;
1236 }
1237 else
1238 {
1239 return fence->second;
1240 }
1241}
1242
1243Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
1244{
Jamie Madill4e25a0d2016-03-08 13:53:03 -05001245 auto query = mQueryMap.find(handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001246
1247 if (query == mQueryMap.end())
1248 {
1249 return NULL;
1250 }
1251 else
1252 {
1253 if (!query->second && create)
1254 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001255 query->second = new Query(mImplementation->createQuery(type), handle);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001256 query->second->addRef();
1257 }
1258 return query->second;
1259 }
1260}
1261
Geoff Lang70d0f492015-12-10 17:45:46 -05001262Query *Context::getQuery(GLuint handle) const
1263{
1264 auto iter = mQueryMap.find(handle);
1265 return (iter != mQueryMap.end()) ? iter->second : nullptr;
1266}
1267
Jamie Madill1fc7e2c2014-01-21 16:47:10 -05001268Texture *Context::getTargetTexture(GLenum target) const
1269{
Ian Ewellbda75592016-04-18 17:25:54 -04001270 ASSERT(ValidTextureTarget(this, target) || ValidTextureExternalTarget(this, target));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001271 return mGLState.getTargetTexture(target);
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001272}
1273
Geoff Lang76b10c92014-09-05 16:28:14 -04001274Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001275{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001276 return mGLState.getSamplerTexture(sampler, type);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001277}
1278
Geoff Lang492a7e42014-11-05 13:27:06 -05001279Compiler *Context::getCompiler() const
1280{
1281 return mCompiler;
1282}
1283
Jamie Madill893ab082014-05-16 16:56:10 -04001284void Context::getBooleanv(GLenum pname, GLboolean *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001285{
1286 switch (pname)
1287 {
daniel@transgaming.comf39967e2012-11-28 19:35:56 +00001288 case GL_SHADER_COMPILER: *params = GL_TRUE; break;
daniel@transgaming.comf39967e2012-11-28 19:35:56 +00001289 case GL_CONTEXT_ROBUST_ACCESS_EXT: *params = mRobustAccess ? GL_TRUE : GL_FALSE; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001290 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001291 mGLState.getBooleanv(pname, params);
1292 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001293 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001294}
1295
Jamie Madill893ab082014-05-16 16:56:10 -04001296void Context::getFloatv(GLenum pname, GLfloat *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001297{
Shannon Woods53a94a82014-06-24 15:20:36 -04001298 // Queries about context capabilities and maximums are answered by Context.
1299 // Queries about current GL state values are answered by State.
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001300 switch (pname)
1301 {
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001302 case GL_ALIASED_LINE_WIDTH_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001303 params[0] = mCaps.minAliasedLineWidth;
1304 params[1] = mCaps.maxAliasedLineWidth;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001305 break;
1306 case GL_ALIASED_POINT_SIZE_RANGE:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001307 params[0] = mCaps.minAliasedPointSize;
1308 params[1] = mCaps.maxAliasedPointSize;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001309 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001310 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001311 ASSERT(mExtensions.textureFilterAnisotropic);
1312 *params = mExtensions.maxTextureAnisotropy;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00001313 break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001314 case GL_MAX_TEXTURE_LOD_BIAS:
1315 *params = mCaps.maxLODBias;
1316 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03001317
1318 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
1319 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
1320 {
1321 ASSERT(mExtensions.pathRendering);
1322 const GLfloat *m = mGLState.getPathRenderingMatrix(pname);
1323 memcpy(params, m, 16 * sizeof(GLfloat));
1324 }
1325 break;
1326
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001327 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001328 mGLState.getFloatv(pname, params);
1329 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001330 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001331}
1332
Jamie Madill893ab082014-05-16 16:56:10 -04001333void Context::getIntegerv(GLenum pname, GLint *params)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001334{
Shannon Woods53a94a82014-06-24 15:20:36 -04001335 // Queries about context capabilities and maximums are answered by Context.
1336 // Queries about current GL state values are answered by State.
shannon.woods%transgaming.com@gtempaccount.combc373e52013-04-13 03:31:23 +00001337
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001338 switch (pname)
1339 {
Geoff Lang301d1612014-07-09 10:34:37 -04001340 case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break;
1341 case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break;
1342 case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mCaps.maxVertexUniformComponents; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001343 case GL_MAX_VARYING_VECTORS: *params = mCaps.maxVaryingVectors; break;
1344 case GL_MAX_VARYING_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1345 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001346 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxVertexTextureImageUnits; break;
1347 case GL_MAX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break;
1348 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break;
Geoff Lange7468902015-10-02 10:46:24 -04001349 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: *params = mCaps.maxFragmentUniformComponents; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001350 case GL_MAX_RENDERBUFFER_SIZE: *params = mCaps.maxRenderbufferSize; break;
1351 case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mCaps.maxColorAttachments; break;
1352 case GL_MAX_DRAW_BUFFERS_EXT: *params = mCaps.maxDrawBuffers; break;
Jamie Madill1caff072013-07-19 16:36:56 -04001353 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
Jamie Madill1caff072013-07-19 16:36:56 -04001354 case GL_SUBPIXEL_BITS: *params = 4; break;
Geoff Langc0b9ef42014-07-02 10:02:37 -04001355 case GL_MAX_TEXTURE_SIZE: *params = mCaps.max2DTextureSize; break;
1356 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = mCaps.maxCubeMapTextureSize; break;
1357 case GL_MAX_3D_TEXTURE_SIZE: *params = mCaps.max3DTextureSize; break;
1358 case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = mCaps.maxArrayTextureLayers; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001359 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = mCaps.uniformBufferOffsetAlignment; break;
1360 case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = mCaps.maxUniformBufferBindings; break;
Geoff Lang301d1612014-07-09 10:34:37 -04001361 case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; break;
1362 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: *params = mCaps.maxFragmentUniformBlocks; break;
Geoff Lang3a61c322014-07-10 13:01:54 -04001363 case GL_MAX_COMBINED_UNIFORM_BLOCKS: *params = mCaps.maxCombinedTextureImageUnits; break;
Geoff Lange6d4e122015-06-29 13:33:55 -04001364 case GL_MAX_VERTEX_OUTPUT_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
1365 case GL_MAX_FRAGMENT_INPUT_COMPONENTS: *params = mCaps.maxFragmentInputComponents; break;
1366 case GL_MIN_PROGRAM_TEXEL_OFFSET: *params = mCaps.minProgramTexelOffset; break;
1367 case GL_MAX_PROGRAM_TEXEL_OFFSET: *params = mCaps.maxProgramTexelOffset; break;
Martin Radev1be913c2016-07-11 17:59:16 +03001368 case GL_MAJOR_VERSION:
Geoff Langeb66a6e2016-10-31 13:06:12 -04001369 *params = getClientVersion().major;
Martin Radev1be913c2016-07-11 17:59:16 +03001370 break;
1371 case GL_MINOR_VERSION:
Geoff Langeb66a6e2016-10-31 13:06:12 -04001372 *params = getClientVersion().minor;
Martin Radev1be913c2016-07-11 17:59:16 +03001373 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001374 case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break;
1375 case GL_MAX_ELEMENTS_VERTICES: *params = mCaps.maxElementsVertices; break;
Geoff Lang05881a02014-07-10 14:05:30 -04001376 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mCaps.maxTransformFeedbackInterleavedComponents; break;
1377 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: *params = mCaps.maxTransformFeedbackSeparateAttributes; break;
1378 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: *params = mCaps.maxTransformFeedbackSeparateComponents; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001379 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
1380 *params = static_cast<GLint>(mCaps.compressedTextureFormats.size());
1381 break;
Geoff Langdef624b2015-04-13 10:46:56 -04001382 case GL_MAX_SAMPLES_ANGLE: *params = mCaps.maxSamples; break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001383 case GL_MAX_VIEWPORT_DIMS:
1384 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001385 params[0] = mCaps.maxViewportWidth;
1386 params[1] = mCaps.maxViewportHeight;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001387 }
1388 break;
1389 case GL_COMPRESSED_TEXTURE_FORMATS:
Geoff Lang900013c2014-07-07 11:32:19 -04001390 std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001391 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001392 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
1393 *params = mResetStrategy;
1394 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001395 case GL_NUM_SHADER_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001396 *params = static_cast<GLint>(mCaps.shaderBinaryFormats.size());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001397 break;
Geoff Lang900013c2014-07-07 11:32:19 -04001398 case GL_SHADER_BINARY_FORMATS:
1399 std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
1400 break;
1401 case GL_NUM_PROGRAM_BINARY_FORMATS:
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001402 *params = static_cast<GLint>(mCaps.programBinaryFormats.size());
Geoff Lang900013c2014-07-07 11:32:19 -04001403 break;
1404 case GL_PROGRAM_BINARY_FORMATS:
1405 std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001406 break;
Geoff Lang23c81692013-08-12 10:46:58 -04001407 case GL_NUM_EXTENSIONS:
Geoff Langcec35902014-04-16 10:52:36 -04001408 *params = static_cast<GLint>(mExtensionStrings.size());
Geoff Lang23c81692013-08-12 10:46:58 -04001409 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001410
1411 // GL_KHR_debug
1412 case GL_MAX_DEBUG_MESSAGE_LENGTH:
1413 *params = mExtensions.maxDebugMessageLength;
1414 break;
1415 case GL_MAX_DEBUG_LOGGED_MESSAGES:
1416 *params = mExtensions.maxDebugLoggedMessages;
1417 break;
1418 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
1419 *params = mExtensions.maxDebugGroupStackDepth;
1420 break;
1421 case GL_MAX_LABEL_LENGTH:
1422 *params = mExtensions.maxLabelLength;
1423 break;
1424
Ian Ewell53f59f42016-01-28 17:36:55 -05001425 // GL_EXT_disjoint_timer_query
1426 case GL_GPU_DISJOINT_EXT:
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001427 *params = mImplementation->getGPUDisjoint();
Ian Ewell53f59f42016-01-28 17:36:55 -05001428 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001429 case GL_MAX_FRAMEBUFFER_WIDTH:
1430 *params = mCaps.maxFramebufferWidth;
1431 break;
1432 case GL_MAX_FRAMEBUFFER_HEIGHT:
1433 *params = mCaps.maxFramebufferHeight;
1434 break;
1435 case GL_MAX_FRAMEBUFFER_SAMPLES:
1436 *params = mCaps.maxFramebufferSamples;
1437 break;
1438 case GL_MAX_SAMPLE_MASK_WORDS:
1439 *params = mCaps.maxSampleMaskWords;
1440 break;
1441 case GL_MAX_COLOR_TEXTURE_SAMPLES:
1442 *params = mCaps.maxColorTextureSamples;
1443 break;
1444 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
1445 *params = mCaps.maxDepthTextureSamples;
1446 break;
1447 case GL_MAX_INTEGER_SAMPLES:
1448 *params = mCaps.maxIntegerSamples;
1449 break;
1450 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
1451 *params = mCaps.maxVertexAttribRelativeOffset;
1452 break;
1453 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
1454 *params = mCaps.maxVertexAttribBindings;
1455 break;
1456 case GL_MAX_VERTEX_ATTRIB_STRIDE:
1457 *params = mCaps.maxVertexAttribStride;
1458 break;
1459 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
1460 *params = mCaps.maxVertexAtomicCounterBuffers;
1461 break;
1462 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
1463 *params = mCaps.maxVertexAtomicCounters;
1464 break;
1465 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
1466 *params = mCaps.maxVertexImageUniforms;
1467 break;
1468 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
1469 *params = mCaps.maxVertexShaderStorageBlocks;
1470 break;
1471 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
1472 *params = mCaps.maxFragmentAtomicCounterBuffers;
1473 break;
1474 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
1475 *params = mCaps.maxFragmentAtomicCounters;
1476 break;
1477 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
1478 *params = mCaps.maxFragmentImageUniforms;
1479 break;
1480 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
1481 *params = mCaps.maxFragmentShaderStorageBlocks;
1482 break;
1483 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
1484 *params = mCaps.minProgramTextureGatherOffset;
1485 break;
1486 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
1487 *params = mCaps.maxProgramTextureGatherOffset;
1488 break;
1489 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
1490 *params = mCaps.maxComputeWorkGroupInvocations;
1491 break;
1492 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
1493 *params = mCaps.maxComputeUniformBlocks;
1494 break;
1495 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
1496 *params = mCaps.maxComputeTextureImageUnits;
1497 break;
1498 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
1499 *params = mCaps.maxComputeSharedMemorySize;
1500 break;
1501 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
1502 *params = mCaps.maxComputeUniformComponents;
1503 break;
1504 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
1505 *params = mCaps.maxComputeAtomicCounterBuffers;
1506 break;
1507 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
1508 *params = mCaps.maxComputeAtomicCounters;
1509 break;
1510 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
1511 *params = mCaps.maxComputeImageUniforms;
1512 break;
1513 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
1514 *params = mCaps.maxCombinedComputeUniformComponents;
1515 break;
1516 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
1517 *params = mCaps.maxComputeShaderStorageBlocks;
1518 break;
1519 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
1520 *params = mCaps.maxCombinedShaderOutputResources;
1521 break;
1522 case GL_MAX_UNIFORM_LOCATIONS:
1523 *params = mCaps.maxUniformLocations;
1524 break;
1525 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
1526 *params = mCaps.maxAtomicCounterBufferBindings;
1527 break;
1528 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
1529 *params = mCaps.maxAtomicCounterBufferSize;
1530 break;
1531 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
1532 *params = mCaps.maxCombinedAtomicCounterBuffers;
1533 break;
1534 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
1535 *params = mCaps.maxCombinedAtomicCounters;
1536 break;
1537 case GL_MAX_IMAGE_UNITS:
1538 *params = mCaps.maxImageUnits;
1539 break;
1540 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
1541 *params = mCaps.maxCombinedImageUniforms;
1542 break;
1543 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
1544 *params = mCaps.maxShaderStorageBufferBindings;
1545 break;
1546 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
1547 *params = mCaps.maxCombinedShaderStorageBlocks;
1548 break;
1549 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
1550 *params = mCaps.shaderStorageBufferOffsetAlignment;
1551 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001552 default:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001553 mGLState.getIntegerv(mState, pname, params);
1554 break;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001555 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001556}
1557
Jamie Madill893ab082014-05-16 16:56:10 -04001558void Context::getInteger64v(GLenum pname, GLint64 *params)
Jamie Madill0fda9862013-07-19 16:36:55 -04001559{
Shannon Woods53a94a82014-06-24 15:20:36 -04001560 // Queries about context capabilities and maximums are answered by Context.
1561 // Queries about current GL state values are answered by State.
Jamie Madill0fda9862013-07-19 16:36:55 -04001562 switch (pname)
1563 {
1564 case GL_MAX_ELEMENT_INDEX:
Geoff Langc0b9ef42014-07-02 10:02:37 -04001565 *params = mCaps.maxElementIndex;
Jamie Madill0fda9862013-07-19 16:36:55 -04001566 break;
1567 case GL_MAX_UNIFORM_BLOCK_SIZE:
Geoff Lang3a61c322014-07-10 13:01:54 -04001568 *params = mCaps.maxUniformBlockSize;
Jamie Madill0fda9862013-07-19 16:36:55 -04001569 break;
1570 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001571 *params = mCaps.maxCombinedVertexUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001572 break;
1573 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
Geoff Lang3a61c322014-07-10 13:01:54 -04001574 *params = mCaps.maxCombinedFragmentUniformComponents;
Jamie Madill0fda9862013-07-19 16:36:55 -04001575 break;
1576 case GL_MAX_SERVER_WAIT_TIMEOUT:
Geoff Lang900013c2014-07-07 11:32:19 -04001577 *params = mCaps.maxServerWaitTimeout;
Jamie Madill0fda9862013-07-19 16:36:55 -04001578 break;
Ian Ewell53f59f42016-01-28 17:36:55 -05001579
1580 // GL_EXT_disjoint_timer_query
1581 case GL_TIMESTAMP_EXT:
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001582 *params = mImplementation->getTimestamp();
Ian Ewell53f59f42016-01-28 17:36:55 -05001583 break;
Martin Radev66fb8202016-07-28 11:45:20 +03001584
1585 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
1586 *params = mCaps.maxShaderStorageBlockSize;
1587 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001588 default:
Jamie Madill893ab082014-05-16 16:56:10 -04001589 UNREACHABLE();
1590 break;
Jamie Madill0fda9862013-07-19 16:36:55 -04001591 }
Jamie Madill0fda9862013-07-19 16:36:55 -04001592}
1593
Geoff Lang70d0f492015-12-10 17:45:46 -05001594void Context::getPointerv(GLenum pname, void **params) const
1595{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001596 mGLState.getPointerv(pname, params);
Geoff Lang70d0f492015-12-10 17:45:46 -05001597}
1598
Martin Radev66fb8202016-07-28 11:45:20 +03001599void Context::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001600{
Shannon Woods53a94a82014-06-24 15:20:36 -04001601 // Queries about context capabilities and maximums are answered by Context.
1602 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001603
1604 GLenum nativeType;
1605 unsigned int numParams;
1606 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1607 ASSERT(queryStatus);
1608
1609 if (nativeType == GL_INT)
1610 {
1611 switch (target)
1612 {
1613 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
1614 ASSERT(index < 3u);
1615 *data = mCaps.maxComputeWorkGroupCount[index];
1616 break;
1617 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
1618 ASSERT(index < 3u);
1619 *data = mCaps.maxComputeWorkGroupSize[index];
1620 break;
1621 default:
1622 mGLState.getIntegeri_v(target, index, data);
1623 }
1624 }
1625 else
1626 {
1627 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1628 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001629}
1630
Martin Radev66fb8202016-07-28 11:45:20 +03001631void Context::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods1b2fb852013-08-19 14:28:48 -04001632{
Shannon Woods53a94a82014-06-24 15:20:36 -04001633 // Queries about context capabilities and maximums are answered by Context.
1634 // Queries about current GL state values are answered by State.
Martin Radev66fb8202016-07-28 11:45:20 +03001635
1636 GLenum nativeType;
1637 unsigned int numParams;
1638 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1639 ASSERT(queryStatus);
1640
1641 if (nativeType == GL_INT_64_ANGLEX)
1642 {
1643 mGLState.getInteger64i_v(target, index, data);
1644 }
1645 else
1646 {
1647 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1648 }
1649}
1650
1651void Context::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1652{
1653 // Queries about context capabilities and maximums are answered by Context.
1654 // Queries about current GL state values are answered by State.
1655
1656 GLenum nativeType;
1657 unsigned int numParams;
1658 bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams);
1659 ASSERT(queryStatus);
1660
1661 if (nativeType == GL_BOOL)
1662 {
1663 mGLState.getBooleani_v(target, index, data);
1664 }
1665 else
1666 {
1667 CastIndexedStateValues(this, nativeType, target, index, numParams, data);
1668 }
Shannon Woods1b2fb852013-08-19 14:28:48 -04001669}
1670
He Yunchao010e4db2017-03-03 14:22:06 +08001671void Context::getBufferParameteriv(GLenum target, GLenum pname, GLint *params)
1672{
1673 Buffer *buffer = mGLState.getTargetBuffer(target);
1674 QueryBufferParameteriv(buffer, pname, params);
1675}
1676
1677void Context::getFramebufferAttachmentParameteriv(GLenum target,
1678 GLenum attachment,
1679 GLenum pname,
1680 GLint *params)
1681{
1682 const Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
1683 QueryFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);
1684}
1685
1686void Context::getRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
1687{
1688 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
1689 QueryRenderbufferiv(this, renderbuffer, pname, params);
1690}
1691
1692void Context::getTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
1693{
1694 Texture *texture = getTargetTexture(target);
1695 QueryTexParameterfv(texture, pname, params);
1696}
1697
1698void Context::getTexParameteriv(GLenum target, GLenum pname, GLint *params)
1699{
1700 Texture *texture = getTargetTexture(target);
1701 QueryTexParameteriv(texture, pname, params);
1702}
1703void Context::texParameterf(GLenum target, GLenum pname, GLfloat param)
1704{
1705 Texture *texture = getTargetTexture(target);
1706 SetTexParameterf(texture, pname, param);
1707}
1708
1709void Context::texParameterfv(GLenum target, GLenum pname, const GLfloat *params)
1710{
1711 Texture *texture = getTargetTexture(target);
1712 SetTexParameterfv(texture, pname, params);
1713}
1714
1715void Context::texParameteri(GLenum target, GLenum pname, GLint param)
1716{
1717 Texture *texture = getTargetTexture(target);
1718 SetTexParameteri(texture, pname, param);
1719}
1720
1721void Context::texParameteriv(GLenum target, GLenum pname, const GLint *params)
1722{
1723 Texture *texture = getTargetTexture(target);
1724 SetTexParameteriv(texture, pname, params);
1725}
1726
Jamie Madill675fe712016-12-19 13:07:54 -05001727void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001728{
Jamie Madill1b94d432015-08-07 13:23:23 -04001729 syncRendererState();
Jamie Madill675fe712016-12-19 13:07:54 -05001730 auto error = mImplementation->drawArrays(mode, first, count);
1731 handleError(error);
1732 if (!error.isError())
1733 {
1734 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
1735 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001736}
1737
Jamie Madill675fe712016-12-19 13:07:54 -05001738void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
Geoff Langf6db0982015-08-25 13:04:00 -04001739{
1740 syncRendererState();
Jamie Madill675fe712016-12-19 13:07:54 -05001741 auto error = mImplementation->drawArraysInstanced(mode, first, count, instanceCount);
1742 handleError(error);
1743 if (!error.isError())
1744 {
1745 MarkTransformFeedbackBufferUsage(mGLState.getCurrentTransformFeedback());
1746 }
Geoff Langf6db0982015-08-25 13:04:00 -04001747}
1748
Jamie Madill675fe712016-12-19 13:07:54 -05001749void Context::drawElements(GLenum mode,
1750 GLsizei count,
1751 GLenum type,
1752 const GLvoid *indices,
1753 const IndexRange &indexRange)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001754{
Jamie Madill1b94d432015-08-07 13:23:23 -04001755 syncRendererState();
Jamie Madill675fe712016-12-19 13:07:54 -05001756 handleError(mImplementation->drawElements(mode, count, type, indices, indexRange));
Geoff Langf6db0982015-08-25 13:04:00 -04001757}
1758
Jamie Madill675fe712016-12-19 13:07:54 -05001759void Context::drawElementsInstanced(GLenum mode,
1760 GLsizei count,
1761 GLenum type,
1762 const GLvoid *indices,
1763 GLsizei instances,
1764 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001765{
1766 syncRendererState();
Jamie Madill675fe712016-12-19 13:07:54 -05001767 handleError(
1768 mImplementation->drawElementsInstanced(mode, count, type, indices, instances, indexRange));
Geoff Langf6db0982015-08-25 13:04:00 -04001769}
1770
Jamie Madill675fe712016-12-19 13:07:54 -05001771void Context::drawRangeElements(GLenum mode,
1772 GLuint start,
1773 GLuint end,
1774 GLsizei count,
1775 GLenum type,
1776 const GLvoid *indices,
1777 const IndexRange &indexRange)
Geoff Langf6db0982015-08-25 13:04:00 -04001778{
1779 syncRendererState();
Jamie Madill675fe712016-12-19 13:07:54 -05001780 handleError(
1781 mImplementation->drawRangeElements(mode, start, end, count, type, indices, indexRange));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001782}
1783
Jiajia Qind9671222016-11-29 16:30:31 +08001784void Context::drawArraysIndirect(GLenum mode, const GLvoid *indirect)
1785{
1786 syncRendererState();
1787 handleError(mImplementation->drawArraysIndirect(mode, indirect));
1788}
1789
1790void Context::drawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
1791{
1792 syncRendererState();
1793 handleError(mImplementation->drawElementsIndirect(mode, type, indirect));
1794}
1795
Jamie Madill675fe712016-12-19 13:07:54 -05001796void Context::flush()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001797{
Jamie Madill675fe712016-12-19 13:07:54 -05001798 handleError(mImplementation->flush());
Geoff Lang129753a2015-01-09 16:52:09 -05001799}
1800
Jamie Madill675fe712016-12-19 13:07:54 -05001801void Context::finish()
Geoff Lang129753a2015-01-09 16:52:09 -05001802{
Jamie Madill675fe712016-12-19 13:07:54 -05001803 handleError(mImplementation->finish());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00001804}
1805
Austin Kinross6ee1e782015-05-29 17:05:37 -07001806void Context::insertEventMarker(GLsizei length, const char *marker)
1807{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001808 ASSERT(mImplementation);
1809 mImplementation->insertEventMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001810}
1811
1812void Context::pushGroupMarker(GLsizei length, const char *marker)
1813{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001814 ASSERT(mImplementation);
1815 mImplementation->pushGroupMarker(length, marker);
Austin Kinross6ee1e782015-05-29 17:05:37 -07001816}
1817
1818void Context::popGroupMarker()
1819{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04001820 ASSERT(mImplementation);
1821 mImplementation->popGroupMarker();
Austin Kinross6ee1e782015-05-29 17:05:37 -07001822}
1823
Geoff Langd8605522016-04-13 10:19:12 -04001824void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
1825{
1826 Program *programObject = getProgram(program);
1827 ASSERT(programObject);
1828
1829 programObject->bindUniformLocation(location, name);
1830}
1831
Sami Väisänena797e062016-05-12 15:23:40 +03001832void Context::setCoverageModulation(GLenum components)
1833{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001834 mGLState.setCoverageModulation(components);
Sami Väisänena797e062016-05-12 15:23:40 +03001835}
1836
Sami Väisänene45e53b2016-05-25 10:36:04 +03001837void Context::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1838{
1839 mGLState.loadPathRenderingMatrix(matrixMode, matrix);
1840}
1841
1842void Context::loadPathRenderingIdentityMatrix(GLenum matrixMode)
1843{
1844 GLfloat I[16];
1845 angle::Matrix<GLfloat>::setToIdentity(I);
1846
1847 mGLState.loadPathRenderingMatrix(matrixMode, I);
1848}
1849
1850void Context::stencilFillPath(GLuint path, GLenum fillMode, GLuint mask)
1851{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001852 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001853 if (!pathObj)
1854 return;
1855
1856 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1857 syncRendererState();
1858
1859 mImplementation->stencilFillPath(pathObj, fillMode, mask);
1860}
1861
1862void Context::stencilStrokePath(GLuint path, GLint reference, 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->stencilStrokePath(pathObj, reference, mask);
1872}
1873
1874void Context::coverFillPath(GLuint path, GLenum coverMode)
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->coverFillPath(pathObj, coverMode);
1884}
1885
1886void Context::coverStrokePath(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->coverStrokePath(pathObj, coverMode);
1896}
1897
1898void Context::stencilThenCoverFillPath(GLuint path, GLenum fillMode, GLuint mask, 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->stencilThenCoverFillPath(pathObj, fillMode, mask, coverMode);
1908}
1909
1910void Context::stencilThenCoverStrokePath(GLuint path,
1911 GLint reference,
1912 GLuint mask,
1913 GLenum coverMode)
1914{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001915 const auto *pathObj = mState.mPaths->getPath(path);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001916 if (!pathObj)
1917 return;
1918
1919 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1920 syncRendererState();
1921
1922 mImplementation->stencilThenCoverStrokePath(pathObj, reference, mask, coverMode);
1923}
1924
Sami Väisänend59ca052016-06-21 16:10:00 +03001925void Context::coverFillPathInstanced(GLsizei numPaths,
1926 GLenum pathNameType,
1927 const void *paths,
1928 GLuint pathBase,
1929 GLenum coverMode,
1930 GLenum transformType,
1931 const GLfloat *transformValues)
1932{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001933 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001934
1935 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1936 syncRendererState();
1937
1938 mImplementation->coverFillPathInstanced(pathObjects, coverMode, transformType, transformValues);
1939}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001940
Sami Väisänend59ca052016-06-21 16:10:00 +03001941void Context::coverStrokePathInstanced(GLsizei numPaths,
1942 GLenum pathNameType,
1943 const void *paths,
1944 GLuint pathBase,
1945 GLenum coverMode,
1946 GLenum transformType,
1947 const GLfloat *transformValues)
1948{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001949 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001950
1951 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1952 syncRendererState();
1953
1954 mImplementation->coverStrokePathInstanced(pathObjects, coverMode, transformType,
1955 transformValues);
1956}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001957
Sami Väisänend59ca052016-06-21 16:10:00 +03001958void Context::stencilFillPathInstanced(GLsizei numPaths,
1959 GLenum pathNameType,
1960 const void *paths,
1961 GLuint pathBase,
1962 GLenum fillMode,
1963 GLuint mask,
1964 GLenum transformType,
1965 const GLfloat *transformValues)
1966{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001967 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001968
1969 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1970 syncRendererState();
1971
1972 mImplementation->stencilFillPathInstanced(pathObjects, fillMode, mask, transformType,
1973 transformValues);
1974}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001975
Sami Väisänend59ca052016-06-21 16:10:00 +03001976void Context::stencilStrokePathInstanced(GLsizei numPaths,
1977 GLenum pathNameType,
1978 const void *paths,
1979 GLuint pathBase,
1980 GLint reference,
1981 GLuint mask,
1982 GLenum transformType,
1983 const GLfloat *transformValues)
1984{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05001985 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03001986
1987 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
1988 syncRendererState();
1989
1990 mImplementation->stencilStrokePathInstanced(pathObjects, reference, mask, transformType,
1991 transformValues);
1992}
Sami Väisänen46eaa942016-06-29 10:26:37 +03001993
Sami Väisänend59ca052016-06-21 16:10:00 +03001994void Context::stencilThenCoverFillPathInstanced(GLsizei numPaths,
1995 GLenum pathNameType,
1996 const void *paths,
1997 GLuint pathBase,
1998 GLenum fillMode,
1999 GLuint mask,
2000 GLenum coverMode,
2001 GLenum transformType,
2002 const GLfloat *transformValues)
2003{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002004 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002005
2006 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2007 syncRendererState();
2008
2009 mImplementation->stencilThenCoverFillPathInstanced(pathObjects, coverMode, fillMode, mask,
2010 transformType, transformValues);
2011}
Sami Väisänen46eaa942016-06-29 10:26:37 +03002012
Sami Väisänend59ca052016-06-21 16:10:00 +03002013void Context::stencilThenCoverStrokePathInstanced(GLsizei numPaths,
2014 GLenum pathNameType,
2015 const void *paths,
2016 GLuint pathBase,
2017 GLint reference,
2018 GLuint mask,
2019 GLenum coverMode,
2020 GLenum transformType,
2021 const GLfloat *transformValues)
2022{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002023 const auto &pathObjects = GatherPaths(*mState.mPaths, numPaths, pathNameType, paths, pathBase);
Sami Väisänend59ca052016-06-21 16:10:00 +03002024
2025 // TODO(svaisanen@nvidia.com): maybe sync only state required for path rendering?
2026 syncRendererState();
2027
2028 mImplementation->stencilThenCoverStrokePathInstanced(pathObjects, coverMode, reference, mask,
2029 transformType, transformValues);
2030}
2031
Sami Väisänen46eaa942016-06-29 10:26:37 +03002032void Context::bindFragmentInputLocation(GLuint program, GLint location, const GLchar *name)
2033{
2034 auto *programObject = getProgram(program);
2035
2036 programObject->bindFragmentInputLocation(location, name);
2037}
2038
2039void Context::programPathFragmentInputGen(GLuint program,
2040 GLint location,
2041 GLenum genMode,
2042 GLint components,
2043 const GLfloat *coeffs)
2044{
2045 auto *programObject = getProgram(program);
2046
2047 programObject->pathFragmentInputGen(location, genMode, components, coeffs);
2048}
2049
jchen1015015f72017-03-16 13:54:21 +08002050GLuint Context::getProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
2051{
2052 gl::Program *programObject = getProgram(program);
2053 return QueryProgramResourceIndex(programObject, programInterface, name);
2054}
2055
Jamie Madill437fa652016-05-03 15:13:24 -04002056void Context::handleError(const Error &error)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002057{
Geoff Langda5777c2014-07-11 09:52:58 -04002058 if (error.isError())
2059 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002060 GLenum code = error.getCode();
2061 mErrors.insert(code);
2062 if (code == GL_OUT_OF_MEMORY && getWorkarounds().loseContextOnOutOfMemory)
2063 {
2064 markContextLost();
2065 }
Geoff Lang70d0f492015-12-10 17:45:46 -05002066
2067 if (!error.getMessage().empty())
2068 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002069 auto *debug = &mGLState.getDebug();
2070 debug->insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
2071 GL_DEBUG_SEVERITY_HIGH, error.getMessage());
Geoff Lang70d0f492015-12-10 17:45:46 -05002072 }
Geoff Langda5777c2014-07-11 09:52:58 -04002073 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002074}
2075
2076// Get one of the recorded errors and clear its flag, if any.
2077// [OpenGL ES 2.0.24] section 2.5 page 13.
2078GLenum Context::getError()
2079{
Geoff Langda5777c2014-07-11 09:52:58 -04002080 if (mErrors.empty())
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002081 {
Geoff Langda5777c2014-07-11 09:52:58 -04002082 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002083 }
Geoff Langda5777c2014-07-11 09:52:58 -04002084 else
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002085 {
Geoff Langda5777c2014-07-11 09:52:58 -04002086 GLenum error = *mErrors.begin();
2087 mErrors.erase(mErrors.begin());
2088 return error;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002089 }
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002090}
2091
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002092// NOTE: this function should not assume that this context is current!
2093void Context::markContextLost()
2094{
2095 if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002096 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002097 mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002098 mContextLostForced = true;
2099 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002100 mContextLost = true;
2101}
2102
2103bool Context::isContextLost()
2104{
2105 return mContextLost;
2106}
2107
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002108GLenum Context::getResetStatus()
2109{
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002110 // Even if the application doesn't want to know about resets, we want to know
2111 // as it will allow us to skip all the calls.
2112 if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002113 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002114 if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002115 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002116 mContextLost = true;
Jamie Madill9dd0cf02014-11-24 11:38:51 -05002117 }
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002118
2119 // EXT_robustness, section 2.6: If the reset notification behavior is
2120 // NO_RESET_NOTIFICATION_EXT, then the implementation will never deliver notification of
2121 // reset events, and GetGraphicsResetStatusEXT will always return NO_ERROR.
2122 return GL_NO_ERROR;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002123 }
2124
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002125 // The GL_EXT_robustness spec says that if a reset is encountered, a reset
2126 // status should be returned at least once, and GL_NO_ERROR should be returned
2127 // once the device has finished resetting.
2128 if (!mContextLost)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002129 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002130 ASSERT(mResetStatus == GL_NO_ERROR);
2131 mResetStatus = mImplementation->getResetStatus();
shannon.woods@transgaming.comddd6c802013-02-28 23:05:14 +00002132
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002133 if (mResetStatus != GL_NO_ERROR)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002134 {
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002135 mContextLost = true;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002136 }
2137 }
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002138 else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002139 {
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002140 // If markContextLost was used to mark the context lost then
2141 // assume that is not recoverable, and continue to report the
2142 // lost reset status for the lifetime of this context.
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002143 mResetStatus = mImplementation->getResetStatus();
2144 }
Jamie Madill893ab082014-05-16 16:56:10 -04002145
Corentin Wallez87fbe1c2016-08-03 14:41:42 -04002146 return mResetStatus;
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002147}
2148
2149bool Context::isResetNotificationEnabled()
2150{
2151 return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2152}
2153
Corentin Walleze3b10e82015-05-20 11:06:25 -04002154const egl::Config *Context::getConfig() const
Régis Fénéon83107972015-02-05 12:57:44 +01002155{
Corentin Walleze3b10e82015-05-20 11:06:25 -04002156 return mConfig;
Régis Fénéon83107972015-02-05 12:57:44 +01002157}
2158
2159EGLenum Context::getClientType() const
2160{
2161 return mClientType;
2162}
2163
2164EGLenum Context::getRenderBuffer() const
2165{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002166 const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
2167 if (framebuffer == nullptr)
Corentin Wallez37c39792015-08-20 14:19:46 -04002168 {
2169 return EGL_NONE;
2170 }
Geoff Lang3bf8e3a2016-12-01 17:28:52 -05002171
2172 const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
2173 ASSERT(backAttachment != nullptr);
2174 return backAttachment->getSurface()->getRenderBuffer();
Régis Fénéon83107972015-02-05 12:57:44 +01002175}
2176
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002177VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002178{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002179 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002180 VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
2181 if (!vertexArray)
Geoff Lang36167ab2015-12-07 10:27:14 -05002182 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002183 vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle,
2184 mCaps.maxVertexAttributes, mCaps.maxVertexAttribBindings);
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002185
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002186 mVertexArrayMap[vertexArrayHandle] = vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002187 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002188
2189 return vertexArray;
Geoff Lang36167ab2015-12-07 10:27:14 -05002190}
2191
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002192TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
Geoff Lang36167ab2015-12-07 10:27:14 -05002193{
Jamie Madill5bf9ff42016-02-01 11:13:03 -05002194 // Only called after a prior call to Gen.
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002195 TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
2196 if (!transformFeedback)
Geoff Lang36167ab2015-12-07 10:27:14 -05002197 {
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002198 transformFeedback =
2199 new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002200 transformFeedback->addRef();
2201 mTransformFeedbackMap[transformFeedbackHandle] = transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002202 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -05002203
2204 return transformFeedback;
Geoff Lang36167ab2015-12-07 10:27:14 -05002205}
2206
2207bool Context::isVertexArrayGenerated(GLuint vertexArray)
2208{
Geoff Langf41a7152016-09-19 15:11:17 -04002209 ASSERT(mVertexArrayMap.find(0) != mVertexArrayMap.end());
Geoff Lang36167ab2015-12-07 10:27:14 -05002210 return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
2211}
2212
2213bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
2214{
Geoff Langf41a7152016-09-19 15:11:17 -04002215 ASSERT(mTransformFeedbackMap.find(0) != mTransformFeedbackMap.end());
Geoff Lang36167ab2015-12-07 10:27:14 -05002216 return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
2217}
2218
Shannon Woods53a94a82014-06-24 15:20:36 -04002219void Context::detachTexture(GLuint texture)
2220{
2221 // Simple pass-through to State's detachTexture method, as textures do not require
2222 // allocation map management either here or in the resource manager at detach time.
2223 // Zero textures are held by the Context, and we don't attempt to request them from
2224 // the State.
Jamie Madilla02315b2017-02-23 14:14:47 -05002225 mGLState.detachTexture(this, mZeroTextures, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -04002226}
2227
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002228void Context::detachBuffer(GLuint buffer)
2229{
Yuly Novikov5807a532015-12-03 13:01:22 -05002230 // Simple pass-through to State's detachBuffer method, since
2231 // only buffer attachments to container objects that are bound to the current context
2232 // should be detached. And all those are available in State.
Shannon Woods53a94a82014-06-24 15:20:36 -04002233
Yuly Novikov5807a532015-12-03 13:01:22 -05002234 // [OpenGL ES 3.2] section 5.1.2 page 45:
2235 // Attachments to unbound container objects, such as
2236 // deletion of a buffer attached to a vertex array object which is not bound to the context,
2237 // are not affected and continue to act as references on the deleted object
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002238 mGLState.detachBuffer(buffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002239}
2240
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002241void Context::detachFramebuffer(GLuint framebuffer)
2242{
Shannon Woods53a94a82014-06-24 15:20:36 -04002243 // Framebuffer detachment is handled by Context, because 0 is a valid
2244 // Framebuffer object, and a pointer to it must be passed from Context
2245 // to State at binding time.
2246
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002247 // [OpenGL ES 2.0.24] section 4.4 page 107:
2248 // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
2249 // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
2250
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002251 if (mGLState.removeReadFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002252 {
2253 bindReadFramebuffer(0);
2254 }
2255
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002256 if (mGLState.removeDrawFramebufferBinding(framebuffer) && framebuffer != 0)
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002257 {
2258 bindDrawFramebuffer(0);
2259 }
2260}
2261
2262void Context::detachRenderbuffer(GLuint renderbuffer)
2263{
Jamie Madilla02315b2017-02-23 14:14:47 -05002264 mGLState.detachRenderbuffer(this, renderbuffer);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002265}
2266
Jamie Madill57a89722013-07-02 11:57:03 -04002267void Context::detachVertexArray(GLuint vertexArray)
2268{
Jamie Madill77a72f62015-04-14 11:18:32 -04002269 // Vertex array detachment is handled by Context, because 0 is a valid
2270 // VAO, and a pointer to it must be passed from Context to State at
Shannon Woods53a94a82014-06-24 15:20:36 -04002271 // binding time.
2272
Jamie Madill57a89722013-07-02 11:57:03 -04002273 // [OpenGL ES 3.0.2] section 2.10 page 43:
2274 // If a vertex array object that is currently bound is deleted, the binding
2275 // for that object reverts to zero and the default vertex array becomes current.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002276 if (mGLState.removeVertexArrayBinding(vertexArray))
Jamie Madill57a89722013-07-02 11:57:03 -04002277 {
2278 bindVertexArray(0);
2279 }
2280}
2281
Geoff Langc8058452014-02-03 12:04:11 -05002282void Context::detachTransformFeedback(GLuint transformFeedback)
2283{
Corentin Walleza2257da2016-04-19 16:43:12 -04002284 // Transform feedback detachment is handled by Context, because 0 is a valid
2285 // transform feedback, and a pointer to it must be passed from Context to State at
2286 // binding time.
2287
2288 // The OpenGL specification doesn't mention what should happen when the currently bound
2289 // transform feedback object is deleted. Since it is a container object, we treat it like
2290 // VAOs and FBOs and set the current bound transform feedback back to 0.
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002291 if (mGLState.removeTransformFeedbackBinding(transformFeedback))
Corentin Walleza2257da2016-04-19 16:43:12 -04002292 {
2293 bindTransformFeedback(0);
2294 }
Geoff Langc8058452014-02-03 12:04:11 -05002295}
2296
Jamie Madilldc356042013-07-19 16:36:57 -04002297void Context::detachSampler(GLuint sampler)
2298{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002299 mGLState.detachSampler(sampler);
Jamie Madilldc356042013-07-19 16:36:57 -04002300}
2301
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002302void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
2303{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002304 mGLState.setVertexAttribDivisor(index, divisor);
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002305}
2306
Jamie Madille29d1672013-07-19 16:36:57 -04002307void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
2308{
Geoff Langc1984ed2016-10-07 12:41:00 -04002309 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002310 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002311 SetSamplerParameteri(samplerObject, pname, param);
2312}
Jamie Madille29d1672013-07-19 16:36:57 -04002313
Geoff Langc1984ed2016-10-07 12:41:00 -04002314void Context::samplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
2315{
2316 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002317 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002318 SetSamplerParameteriv(samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002319}
2320
2321void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
2322{
Geoff Langc1984ed2016-10-07 12:41:00 -04002323 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002324 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002325 SetSamplerParameterf(samplerObject, pname, param);
Jamie Madille29d1672013-07-19 16:36:57 -04002326}
2327
Geoff Langc1984ed2016-10-07 12:41:00 -04002328void Context::samplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
Jamie Madill9675b802013-07-19 16:36:59 -04002329{
Geoff Langc1984ed2016-10-07 12:41:00 -04002330 Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002331 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002332 SetSamplerParameterfv(samplerObject, pname, param);
Jamie Madill9675b802013-07-19 16:36:59 -04002333}
2334
Geoff Langc1984ed2016-10-07 12:41:00 -04002335void Context::getSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
Jamie Madill9675b802013-07-19 16:36:59 -04002336{
Geoff Langc1984ed2016-10-07 12:41:00 -04002337 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002338 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002339 QuerySamplerParameteriv(samplerObject, pname, params);
2340}
Jamie Madill9675b802013-07-19 16:36:59 -04002341
Geoff Langc1984ed2016-10-07 12:41:00 -04002342void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
2343{
2344 const Sampler *samplerObject =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002345 mState.mSamplers->checkSamplerAllocation(mImplementation.get(), sampler);
Geoff Langc1984ed2016-10-07 12:41:00 -04002346 QuerySamplerParameterfv(samplerObject, pname, params);
Jamie Madill9675b802013-07-19 16:36:59 -04002347}
2348
Olli Etuahof0fee072016-03-30 15:11:58 +03002349void Context::programParameteri(GLuint program, GLenum pname, GLint value)
2350{
2351 gl::Program *programObject = getProgram(program);
Yunchao He61afff12017-03-14 15:34:03 +08002352 SetProgramParameteri(programObject, pname, value);
Olli Etuahof0fee072016-03-30 15:11:58 +03002353}
2354
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002355void Context::initRendererString()
2356{
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002357 std::ostringstream rendererString;
2358 rendererString << "ANGLE (";
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002359 rendererString << mImplementation->getRendererDescription();
daniel@transgaming.comca1ac1f2013-01-11 04:13:05 +00002360 rendererString << ")";
2361
Geoff Langcec35902014-04-16 10:52:36 -04002362 mRendererString = MakeStaticString(rendererString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002363}
2364
Geoff Langc339c4e2016-11-29 10:37:36 -05002365void Context::initVersionStrings()
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002366{
Geoff Langc339c4e2016-11-29 10:37:36 -05002367 const Version &clientVersion = getClientVersion();
2368
2369 std::ostringstream versionString;
2370 versionString << "OpenGL ES " << clientVersion.major << "." << clientVersion.minor << " (ANGLE "
2371 << ANGLE_VERSION_STRING << ")";
2372 mVersionString = MakeStaticString(versionString.str());
2373
2374 std::ostringstream shadingLanguageVersionString;
2375 shadingLanguageVersionString << "OpenGL ES GLSL ES "
2376 << (clientVersion.major == 2 ? 1 : clientVersion.major) << "."
2377 << clientVersion.minor << "0 (ANGLE " << ANGLE_VERSION_STRING
2378 << ")";
2379 mShadingLanguageString = MakeStaticString(shadingLanguageVersionString.str());
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002380}
2381
Geoff Langcec35902014-04-16 10:52:36 -04002382void Context::initExtensionStrings()
2383{
Geoff Langc339c4e2016-11-29 10:37:36 -05002384 auto mergeExtensionStrings = [](const std::vector<const char *> &strings) {
2385 std::ostringstream combinedStringStream;
2386 std::copy(strings.begin(), strings.end(),
2387 std::ostream_iterator<const char *>(combinedStringStream, " "));
2388 return MakeStaticString(combinedStringStream.str());
2389 };
2390
2391 mExtensionStrings.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002392 for (const auto &extensionString : mExtensions.getStrings())
2393 {
2394 mExtensionStrings.push_back(MakeStaticString(extensionString));
2395 }
Geoff Langc339c4e2016-11-29 10:37:36 -05002396 mExtensionString = mergeExtensionStrings(mExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002397
Bryan Bernhart58806562017-01-05 13:09:31 -08002398 const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
2399
Geoff Langc339c4e2016-11-29 10:37:36 -05002400 mRequestableExtensionStrings.clear();
2401 for (const auto &extensionInfo : GetExtensionInfoMap())
2402 {
2403 if (extensionInfo.second.Requestable &&
Bryan Bernhart58806562017-01-05 13:09:31 -08002404 !(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
2405 nativeExtensions.*(extensionInfo.second.ExtensionsMember))
Geoff Langc339c4e2016-11-29 10:37:36 -05002406 {
2407 mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
2408 }
2409 }
2410 mRequestableExtensionString = mergeExtensionStrings(mRequestableExtensionStrings);
Geoff Langcec35902014-04-16 10:52:36 -04002411}
2412
Geoff Langc339c4e2016-11-29 10:37:36 -05002413const GLubyte *Context::getString(GLenum name) const
Geoff Langcec35902014-04-16 10:52:36 -04002414{
Geoff Langc339c4e2016-11-29 10:37:36 -05002415 switch (name)
2416 {
2417 case GL_VENDOR:
2418 return reinterpret_cast<const GLubyte *>("Google Inc.");
2419
2420 case GL_RENDERER:
2421 return reinterpret_cast<const GLubyte *>(mRendererString);
2422
2423 case GL_VERSION:
2424 return reinterpret_cast<const GLubyte *>(mVersionString);
2425
2426 case GL_SHADING_LANGUAGE_VERSION:
2427 return reinterpret_cast<const GLubyte *>(mShadingLanguageString);
2428
2429 case GL_EXTENSIONS:
2430 return reinterpret_cast<const GLubyte *>(mExtensionString);
2431
2432 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2433 return reinterpret_cast<const GLubyte *>(mRequestableExtensionString);
2434
2435 default:
2436 UNREACHABLE();
2437 return nullptr;
2438 }
Geoff Langcec35902014-04-16 10:52:36 -04002439}
2440
Geoff Langc339c4e2016-11-29 10:37:36 -05002441const GLubyte *Context::getStringi(GLenum name, GLuint index) const
Geoff Langcec35902014-04-16 10:52:36 -04002442{
Geoff Langc339c4e2016-11-29 10:37:36 -05002443 switch (name)
2444 {
2445 case GL_EXTENSIONS:
2446 return reinterpret_cast<const GLubyte *>(mExtensionStrings[index]);
2447
2448 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
2449 return reinterpret_cast<const GLubyte *>(mRequestableExtensionStrings[index]);
2450
2451 default:
2452 UNREACHABLE();
2453 return nullptr;
2454 }
Geoff Langcec35902014-04-16 10:52:36 -04002455}
2456
2457size_t Context::getExtensionStringCount() const
2458{
2459 return mExtensionStrings.size();
2460}
2461
Geoff Langc339c4e2016-11-29 10:37:36 -05002462void Context::requestExtension(const char *name)
2463{
2464 const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
2465 ASSERT(extensionInfos.find(name) != extensionInfos.end());
2466 const auto &extension = extensionInfos.at(name);
2467 ASSERT(extension.Requestable);
2468
2469 if (mExtensions.*(extension.ExtensionsMember))
2470 {
2471 // Extension already enabled
2472 return;
2473 }
2474
2475 mExtensions.*(extension.ExtensionsMember) = true;
2476 updateCaps();
2477 initExtensionStrings();
Bryan Bernhart58806562017-01-05 13:09:31 -08002478
2479 // Re-create the compiler with the requested extensions enabled.
2480 SafeDelete(mCompiler);
2481 mCompiler = new Compiler(mImplementation.get(), mState);
Geoff Langc339c4e2016-11-29 10:37:36 -05002482}
2483
2484size_t Context::getRequestableExtensionStringCount() const
2485{
2486 return mRequestableExtensionStrings.size();
2487}
2488
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002489void Context::beginTransformFeedback(GLenum primitiveMode)
2490{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002491 TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002492 ASSERT(transformFeedback != nullptr);
2493 ASSERT(!transformFeedback->isPaused());
2494
Jamie Madill6c1f6712017-02-14 19:08:04 -05002495 transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
Olli Etuahoc3e55a42016-03-09 16:29:18 +02002496}
2497
2498bool Context::hasActiveTransformFeedback(GLuint program) const
2499{
2500 for (auto pair : mTransformFeedbackMap)
2501 {
2502 if (pair.second != nullptr && pair.second->hasBoundProgram(program))
2503 {
2504 return true;
2505 }
2506 }
2507 return false;
2508}
2509
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002510void Context::initCaps(const egl::DisplayExtensions &displayExtensions)
Geoff Lang493daf52014-07-03 13:38:44 -04002511{
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002512 mCaps = mImplementation->getNativeCaps();
Geoff Lang493daf52014-07-03 13:38:44 -04002513
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002514 mExtensions = mImplementation->getNativeExtensions();
Geoff Lang493daf52014-07-03 13:38:44 -04002515
Jamie Madill53ea9cc2016-05-17 10:12:52 -04002516 mLimitations = mImplementation->getNativeLimitations();
Austin Kinross02df7962015-07-01 10:03:42 -07002517
Geoff Langeb66a6e2016-10-31 13:06:12 -04002518 if (getClientVersion() < Version(3, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002519 {
2520 // Disable ES3+ extensions
2521 mExtensions.colorBufferFloat = false;
Geoff Langb66a9092016-05-16 15:59:14 -04002522 mExtensions.eglImageExternalEssl3 = false;
Vincent Lang25ab4512016-05-13 18:13:59 +02002523 mExtensions.textureNorm16 = false;
Geoff Lang493daf52014-07-03 13:38:44 -04002524 }
2525
Geoff Langeb66a6e2016-10-31 13:06:12 -04002526 if (getClientVersion() > Version(2, 0))
Geoff Lang493daf52014-07-03 13:38:44 -04002527 {
2528 // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
2529 //mExtensions.sRGB = false;
2530 }
2531
Jamie Madill00ed7a12016-05-19 13:13:38 -04002532 // Some extensions are always available because they are implemented in the GL layer.
2533 mExtensions.bindUniformLocation = true;
2534 mExtensions.vertexArrayObject = true;
Geoff Langf41a7152016-09-19 15:11:17 -04002535 mExtensions.bindGeneratesResource = true;
Geoff Langfeb8c682017-02-13 16:07:35 -05002536 mExtensions.clientArrays = true;
Geoff Langc339c4e2016-11-29 10:37:36 -05002537 mExtensions.requestExtension = true;
Jamie Madill00ed7a12016-05-19 13:13:38 -04002538
2539 // Enable the no error extension if the context was created with the flag.
2540 mExtensions.noError = mSkipValidation;
2541
Corentin Wallezccab69d2017-01-27 16:57:15 -05002542 // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
Corentin Wallezc295e512017-01-27 17:47:50 -05002543 mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
Corentin Wallezccab69d2017-01-27 16:57:15 -05002544
Geoff Lang70d0f492015-12-10 17:45:46 -05002545 // Explicitly enable GL_KHR_debug
2546 mExtensions.debug = true;
2547 mExtensions.maxDebugMessageLength = 1024;
2548 mExtensions.maxDebugLoggedMessages = 1024;
2549 mExtensions.maxDebugGroupStackDepth = 1024;
2550 mExtensions.maxLabelLength = 1024;
2551
Geoff Langff5b2d52016-09-07 11:32:23 -04002552 // Explicitly enable GL_ANGLE_robust_client_memory
2553 mExtensions.robustClientMemory = true;
2554
Jamie Madille08a1d32017-03-07 17:24:06 -05002555 // Determine robust resource init availability from EGL.
2556 mExtensions.robustResourceInitialization =
2557 displayExtensions.createContextRobustResourceInitialization;
2558
Geoff Lang301d1612014-07-09 10:34:37 -04002559 // Apply implementation limits
2560 mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002561 mCaps.maxVertexAttribBindings =
2562 getClientVersion() < ES_3_1
2563 ? mCaps.maxVertexAttributes
2564 : std::min<GLuint>(mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
2565
Geoff Lang301d1612014-07-09 10:34:37 -04002566 mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
2567 mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
2568
2569 mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
Geoff Lang3a61c322014-07-10 13:01:54 -04002570
Geoff Langc287ea62016-09-16 14:46:51 -04002571 // WebGL compatibility
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002572 mExtensions.webglCompatibility = mWebGLContext;
Geoff Langc287ea62016-09-16 14:46:51 -04002573 for (const auto &extensionInfo : GetExtensionInfoMap())
2574 {
2575 // If this context is for WebGL, disable all enableable extensions
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002576 if (mWebGLContext && extensionInfo.second.Requestable)
Geoff Langc287ea62016-09-16 14:46:51 -04002577 {
2578 mExtensions.*(extensionInfo.second.ExtensionsMember) = false;
2579 }
2580 }
2581
2582 // Generate texture caps
2583 updateCaps();
2584}
2585
2586void Context::updateCaps()
2587{
Geoff Lang900013c2014-07-07 11:32:19 -04002588 mCaps.compressedTextureFormats.clear();
Geoff Langc287ea62016-09-16 14:46:51 -04002589 mTextureCaps.clear();
Geoff Lang900013c2014-07-07 11:32:19 -04002590
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002591 for (auto capsIt : mImplementation->getNativeTextureCaps())
Geoff Lang493daf52014-07-03 13:38:44 -04002592 {
Jamie Madill4e0e6f82017-02-17 11:06:03 -05002593 GLenum format = capsIt.first;
2594 TextureCaps formatCaps = capsIt.second;
Geoff Lang493daf52014-07-03 13:38:44 -04002595
Geoff Lang5d601382014-07-22 15:14:06 -04002596 const InternalFormat &formatInfo = GetInternalFormatInfo(format);
Geoff Langd87878e2014-09-19 15:42:59 -04002597
Geoff Lang0d8b7242015-09-09 14:56:53 -04002598 // Update the format caps based on the client version and extensions.
2599 // Caps are AND'd with the renderer caps because some core formats are still unsupported in
2600 // ES3.
2601 formatCaps.texturable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002602 formatCaps.texturable && formatInfo.textureSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002603 formatCaps.renderable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002604 formatCaps.renderable && formatInfo.renderSupport(getClientVersion(), mExtensions);
Geoff Lang0d8b7242015-09-09 14:56:53 -04002605 formatCaps.filterable =
Geoff Langeb66a6e2016-10-31 13:06:12 -04002606 formatCaps.filterable && formatInfo.filterSupport(getClientVersion(), mExtensions);
Geoff Langd87878e2014-09-19 15:42:59 -04002607
He Yunchaoccd8c9b2017-01-18 17:36:14 +08002608 // OpenGL ES does not support multisampling with non-rendererable formats
2609 // OpenGL ES 3.0 or prior does not support multisampling with integer formats
2610 if (!formatInfo.renderSupport ||
2611 (getClientVersion() < ES_3_1 &&
2612 (formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)))
Geoff Lang493daf52014-07-03 13:38:44 -04002613 {
Geoff Langd87878e2014-09-19 15:42:59 -04002614 formatCaps.sampleCounts.clear();
Geoff Lang493daf52014-07-03 13:38:44 -04002615 }
Geoff Langd87878e2014-09-19 15:42:59 -04002616
2617 if (formatCaps.texturable && formatInfo.compressed)
2618 {
2619 mCaps.compressedTextureFormats.push_back(format);
2620 }
2621
2622 mTextureCaps.insert(format, formatCaps);
Geoff Lang493daf52014-07-03 13:38:44 -04002623 }
2624}
2625
Kenneth Russellf2f6f652016-10-05 19:53:23 -07002626void Context::initWorkarounds()
2627{
2628 // Lose the context upon out of memory error if the application is
2629 // expecting to watch for those events.
2630 mWorkarounds.loseContextOnOutOfMemory = (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
2631}
2632
Jamie Madill1b94d432015-08-07 13:23:23 -04002633void Context::syncRendererState()
2634{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002635 const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
Frank Henigman5a53d542017-02-16 21:24:10 -05002636 mImplementation->syncState(dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002637 mGLState.clearDirtyBits();
2638 mGLState.syncDirtyObjects();
Jamie Madill1b94d432015-08-07 13:23:23 -04002639}
2640
Jamie Madillad9f24e2016-02-12 09:27:24 -05002641void Context::syncRendererState(const State::DirtyBits &bitMask,
2642 const State::DirtyObjects &objectMask)
Jamie Madill1b94d432015-08-07 13:23:23 -04002643{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002644 const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
Frank Henigman5a53d542017-02-16 21:24:10 -05002645 mImplementation->syncState(dirtyBits);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002646 mGLState.clearDirtyBits(dirtyBits);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002647
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002648 mGLState.syncDirtyObjects(objectMask);
Jamie Madill1b94d432015-08-07 13:23:23 -04002649}
Jamie Madillc29968b2016-01-20 11:17:23 -05002650
2651void Context::blitFramebuffer(GLint srcX0,
2652 GLint srcY0,
2653 GLint srcX1,
2654 GLint srcY1,
2655 GLint dstX0,
2656 GLint dstY0,
2657 GLint dstX1,
2658 GLint dstY1,
2659 GLbitfield mask,
2660 GLenum filter)
2661{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002662 Framebuffer *drawFramebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002663 ASSERT(drawFramebuffer);
2664
2665 Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
2666 Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
2667
Jamie Madillad9f24e2016-02-12 09:27:24 -05002668 syncStateForBlit();
Jamie Madillc29968b2016-01-20 11:17:23 -05002669
Jamie Madill8415b5f2016-04-26 13:41:39 -04002670 handleError(drawFramebuffer->blit(mImplementation.get(), srcArea, dstArea, mask, filter));
apatrick@chromium.org144f2802012-07-12 01:42:34 +00002671}
Jamie Madillc29968b2016-01-20 11:17:23 -05002672
2673void Context::clear(GLbitfield mask)
2674{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002675 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002676 handleError(mGLState.getDrawFramebuffer()->clear(mImplementation.get(), mask));
Jamie Madillc29968b2016-01-20 11:17:23 -05002677}
2678
2679void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
2680{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002681 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002682 handleError(mGLState.getDrawFramebuffer()->clearBufferfv(mImplementation.get(), buffer,
2683 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002684}
2685
2686void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
2687{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002688 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002689 handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(mImplementation.get(), buffer,
2690 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002691}
2692
2693void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
2694{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002695 syncStateForClear();
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002696 handleError(mGLState.getDrawFramebuffer()->clearBufferiv(mImplementation.get(), buffer,
2697 drawbuffer, values));
Jamie Madillc29968b2016-01-20 11:17:23 -05002698}
2699
2700void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
2701{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002702 Framebuffer *framebufferObject = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002703 ASSERT(framebufferObject);
2704
2705 // If a buffer is not present, the clear has no effect
2706 if (framebufferObject->getDepthbuffer() == nullptr &&
2707 framebufferObject->getStencilbuffer() == nullptr)
2708 {
2709 return;
2710 }
2711
Jamie Madillad9f24e2016-02-12 09:27:24 -05002712 syncStateForClear();
Jamie Madill8415b5f2016-04-26 13:41:39 -04002713 handleError(framebufferObject->clearBufferfi(mImplementation.get(), buffer, drawbuffer, depth,
2714 stencil));
Jamie Madillc29968b2016-01-20 11:17:23 -05002715}
2716
2717void Context::readPixels(GLint x,
2718 GLint y,
2719 GLsizei width,
2720 GLsizei height,
2721 GLenum format,
2722 GLenum type,
2723 GLvoid *pixels)
2724{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002725 if (width == 0 || height == 0)
2726 {
2727 return;
2728 }
2729
Jamie Madillad9f24e2016-02-12 09:27:24 -05002730 syncStateForReadPixels();
Jamie Madillc29968b2016-01-20 11:17:23 -05002731
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002732 Framebuffer *framebufferObject = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002733 ASSERT(framebufferObject);
2734
2735 Rectangle area(x, y, width, height);
Jamie Madill8415b5f2016-04-26 13:41:39 -04002736 handleError(framebufferObject->readPixels(mImplementation.get(), area, format, type, pixels));
Jamie Madillc29968b2016-01-20 11:17:23 -05002737}
2738
2739void Context::copyTexImage2D(GLenum target,
2740 GLint level,
2741 GLenum internalformat,
2742 GLint x,
2743 GLint y,
2744 GLsizei width,
2745 GLsizei height,
2746 GLint border)
2747{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002748 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002749 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002750
Jamie Madillc29968b2016-01-20 11:17:23 -05002751 Rectangle sourceArea(x, y, width, height);
2752
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002753 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002754 Texture *texture =
2755 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002756 handleError(texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002757}
2758
2759void Context::copyTexSubImage2D(GLenum target,
2760 GLint level,
2761 GLint xoffset,
2762 GLint yoffset,
2763 GLint x,
2764 GLint y,
2765 GLsizei width,
2766 GLsizei height)
2767{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002768 if (width == 0 || height == 0)
2769 {
2770 return;
2771 }
2772
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002773 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002774 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002775
Jamie Madillc29968b2016-01-20 11:17:23 -05002776 Offset destOffset(xoffset, yoffset, 0);
2777 Rectangle sourceArea(x, y, width, height);
2778
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002779 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002780 Texture *texture =
2781 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002782 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002783}
2784
2785void Context::copyTexSubImage3D(GLenum target,
2786 GLint level,
2787 GLint xoffset,
2788 GLint yoffset,
2789 GLint zoffset,
2790 GLint x,
2791 GLint y,
2792 GLsizei width,
2793 GLsizei height)
2794{
Corentin Wallez9a8d3662016-09-22 12:18:29 -04002795 if (width == 0 || height == 0)
2796 {
2797 return;
2798 }
2799
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002800 // Only sync the read FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002801 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002802
Jamie Madillc29968b2016-01-20 11:17:23 -05002803 Offset destOffset(xoffset, yoffset, zoffset);
2804 Rectangle sourceArea(x, y, width, height);
2805
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002806 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002807 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002808 handleError(texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
Jamie Madillc29968b2016-01-20 11:17:23 -05002809}
2810
2811void Context::framebufferTexture2D(GLenum target,
2812 GLenum attachment,
2813 GLenum textarget,
2814 GLuint texture,
2815 GLint level)
2816{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002817 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002818 ASSERT(framebuffer);
2819
2820 if (texture != 0)
2821 {
2822 Texture *textureObj = getTexture(texture);
2823
2824 ImageIndex index = ImageIndex::MakeInvalid();
2825
2826 if (textarget == GL_TEXTURE_2D)
2827 {
2828 index = ImageIndex::Make2D(level);
2829 }
JiangYizhoubddc46b2016-12-09 09:50:51 +08002830 else if (textarget == GL_TEXTURE_2D_MULTISAMPLE)
2831 {
2832 ASSERT(level == 0);
2833 index = ImageIndex::Make2DMultisample();
2834 }
Jamie Madillc29968b2016-01-20 11:17:23 -05002835 else
2836 {
2837 ASSERT(IsCubeMapTextureTarget(textarget));
2838 index = ImageIndex::MakeCube(textarget, level);
2839 }
2840
Jamie Madilla02315b2017-02-23 14:14:47 -05002841 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
Jamie Madillc29968b2016-01-20 11:17:23 -05002842 }
2843 else
2844 {
Jamie Madilla02315b2017-02-23 14:14:47 -05002845 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05002846 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002847
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002848 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002849}
2850
2851void Context::framebufferRenderbuffer(GLenum target,
2852 GLenum attachment,
2853 GLenum renderbuffertarget,
2854 GLuint renderbuffer)
2855{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002856 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002857 ASSERT(framebuffer);
2858
2859 if (renderbuffer != 0)
2860 {
2861 Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
Jamie Madilla02315b2017-02-23 14:14:47 -05002862
2863 framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
Jamie Madillc29968b2016-01-20 11:17:23 -05002864 renderbufferObject);
2865 }
2866 else
2867 {
Jamie Madilla02315b2017-02-23 14:14:47 -05002868 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05002869 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002870
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002871 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002872}
2873
2874void Context::framebufferTextureLayer(GLenum target,
2875 GLenum attachment,
2876 GLuint texture,
2877 GLint level,
2878 GLint layer)
2879{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002880 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002881 ASSERT(framebuffer);
2882
2883 if (texture != 0)
2884 {
2885 Texture *textureObject = getTexture(texture);
2886
2887 ImageIndex index = ImageIndex::MakeInvalid();
2888
2889 if (textureObject->getTarget() == GL_TEXTURE_3D)
2890 {
2891 index = ImageIndex::Make3D(level, layer);
2892 }
2893 else
2894 {
2895 ASSERT(textureObject->getTarget() == GL_TEXTURE_2D_ARRAY);
2896 index = ImageIndex::Make2DArray(level, layer);
2897 }
2898
Jamie Madilla02315b2017-02-23 14:14:47 -05002899 framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
Jamie Madillc29968b2016-01-20 11:17:23 -05002900 }
2901 else
2902 {
Jamie Madilla02315b2017-02-23 14:14:47 -05002903 framebuffer->resetAttachment(this, attachment);
Jamie Madillc29968b2016-01-20 11:17:23 -05002904 }
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002905
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002906 mGLState.setObjectDirty(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002907}
2908
2909void Context::drawBuffers(GLsizei n, const GLenum *bufs)
2910{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002911 Framebuffer *framebuffer = mGLState.getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002912 ASSERT(framebuffer);
2913 framebuffer->setDrawBuffers(n, bufs);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002914 mGLState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002915}
2916
2917void Context::readBuffer(GLenum mode)
2918{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002919 Framebuffer *readFBO = mGLState.getReadFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002920 readFBO->setReadBuffer(mode);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002921 mGLState.setObjectDirty(GL_READ_FRAMEBUFFER);
Jamie Madillc29968b2016-01-20 11:17:23 -05002922}
2923
2924void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
2925{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002926 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002927 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002928
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002929 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002930 ASSERT(framebuffer);
2931
2932 // The specification isn't clear what should be done when the framebuffer isn't complete.
2933 // We leave it up to the framebuffer implementation to decide what to do.
Jamie Madill437fa652016-05-03 15:13:24 -04002934 handleError(framebuffer->discard(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002935}
2936
2937void Context::invalidateFramebuffer(GLenum target,
2938 GLsizei numAttachments,
2939 const GLenum *attachments)
2940{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002941 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002942 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002943
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002944 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002945 ASSERT(framebuffer);
2946
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002947 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002948 {
Jamie Madill437fa652016-05-03 15:13:24 -04002949 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002950 }
Jamie Madill437fa652016-05-03 15:13:24 -04002951
2952 handleError(framebuffer->invalidate(numAttachments, attachments));
Jamie Madillc29968b2016-01-20 11:17:23 -05002953}
2954
2955void Context::invalidateSubFramebuffer(GLenum target,
2956 GLsizei numAttachments,
2957 const GLenum *attachments,
2958 GLint x,
2959 GLint y,
2960 GLsizei width,
2961 GLsizei height)
2962{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002963 // Only sync the FBO
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002964 mGLState.syncDirtyObject(target);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002965
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002966 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
Jamie Madillc29968b2016-01-20 11:17:23 -05002967 ASSERT(framebuffer);
2968
Jamie Madilldfde6ab2016-06-09 07:07:18 -07002969 if (framebuffer->checkStatus(mState) != GL_FRAMEBUFFER_COMPLETE)
Jamie Madillc29968b2016-01-20 11:17:23 -05002970 {
Jamie Madill437fa652016-05-03 15:13:24 -04002971 return;
Jamie Madillc29968b2016-01-20 11:17:23 -05002972 }
Jamie Madill437fa652016-05-03 15:13:24 -04002973
2974 Rectangle area(x, y, width, height);
2975 handleError(framebuffer->invalidateSub(numAttachments, attachments, area));
Jamie Madillc29968b2016-01-20 11:17:23 -05002976}
2977
Jamie Madill73a84962016-02-12 09:27:23 -05002978void Context::texImage2D(GLenum target,
2979 GLint level,
2980 GLint internalformat,
2981 GLsizei width,
2982 GLsizei height,
2983 GLint border,
2984 GLenum format,
2985 GLenum type,
2986 const GLvoid *pixels)
2987{
Jamie Madillad9f24e2016-02-12 09:27:24 -05002988 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05002989
2990 Extents size(width, height, 1);
2991 Texture *texture =
2992 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05002993 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
2994 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05002995}
2996
2997void Context::texImage3D(GLenum target,
2998 GLint level,
2999 GLint internalformat,
3000 GLsizei width,
3001 GLsizei height,
3002 GLsizei depth,
3003 GLint border,
3004 GLenum format,
3005 GLenum type,
3006 const GLvoid *pixels)
3007{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003008 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003009
3010 Extents size(width, height, depth);
3011 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003012 handleError(texture->setImage(this, mGLState.getUnpackState(), target, level, internalformat,
3013 size, format, type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003014}
3015
3016void Context::texSubImage2D(GLenum target,
3017 GLint level,
3018 GLint xoffset,
3019 GLint yoffset,
3020 GLsizei width,
3021 GLsizei height,
3022 GLenum format,
3023 GLenum type,
3024 const GLvoid *pixels)
3025{
3026 // Zero sized uploads are valid but no-ops
3027 if (width == 0 || height == 0)
3028 {
3029 return;
3030 }
3031
Jamie Madillad9f24e2016-02-12 09:27:24 -05003032 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003033
3034 Box area(xoffset, yoffset, 0, width, height, 1);
3035 Texture *texture =
3036 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003037 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3038 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003039}
3040
3041void Context::texSubImage3D(GLenum target,
3042 GLint level,
3043 GLint xoffset,
3044 GLint yoffset,
3045 GLint zoffset,
3046 GLsizei width,
3047 GLsizei height,
3048 GLsizei depth,
3049 GLenum format,
3050 GLenum type,
3051 const GLvoid *pixels)
3052{
3053 // Zero sized uploads are valid but no-ops
3054 if (width == 0 || height == 0 || depth == 0)
3055 {
3056 return;
3057 }
3058
Jamie Madillad9f24e2016-02-12 09:27:24 -05003059 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003060
3061 Box area(xoffset, yoffset, zoffset, width, height, depth);
3062 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003063 handleError(texture->setSubImage(this, mGLState.getUnpackState(), target, level, area, format,
3064 type, reinterpret_cast<const uint8_t *>(pixels)));
Jamie Madill73a84962016-02-12 09:27:23 -05003065}
3066
3067void Context::compressedTexImage2D(GLenum target,
3068 GLint level,
3069 GLenum internalformat,
3070 GLsizei width,
3071 GLsizei height,
3072 GLint border,
3073 GLsizei imageSize,
3074 const GLvoid *data)
3075{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003076 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003077
3078 Extents size(width, height, 1);
3079 Texture *texture =
3080 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003081 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003082 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003083 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003084}
3085
3086void Context::compressedTexImage3D(GLenum target,
3087 GLint level,
3088 GLenum internalformat,
3089 GLsizei width,
3090 GLsizei height,
3091 GLsizei depth,
3092 GLint border,
3093 GLsizei imageSize,
3094 const GLvoid *data)
3095{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003096 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003097
3098 Extents size(width, height, depth);
3099 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003100 handleError(texture->setCompressedImage(this, mGLState.getUnpackState(), target, level,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003101 internalformat, size, imageSize,
Jamie Madill437fa652016-05-03 15:13:24 -04003102 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003103}
3104
3105void Context::compressedTexSubImage2D(GLenum target,
3106 GLint level,
3107 GLint xoffset,
3108 GLint yoffset,
3109 GLsizei width,
3110 GLsizei height,
3111 GLenum format,
3112 GLsizei imageSize,
3113 const GLvoid *data)
3114{
Jamie Madillad9f24e2016-02-12 09:27:24 -05003115 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003116
3117 Box area(xoffset, yoffset, 0, width, height, 1);
3118 Texture *texture =
3119 getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003120 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003121 format, imageSize,
3122 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003123}
3124
3125void Context::compressedTexSubImage3D(GLenum target,
3126 GLint level,
3127 GLint xoffset,
3128 GLint yoffset,
3129 GLint zoffset,
3130 GLsizei width,
3131 GLsizei height,
3132 GLsizei depth,
3133 GLenum format,
3134 GLsizei imageSize,
3135 const GLvoid *data)
3136{
3137 // Zero sized uploads are valid but no-ops
3138 if (width == 0 || height == 0)
3139 {
3140 return;
3141 }
3142
Jamie Madillad9f24e2016-02-12 09:27:24 -05003143 syncStateForTexImage();
Jamie Madill73a84962016-02-12 09:27:23 -05003144
3145 Box area(xoffset, yoffset, zoffset, width, height, depth);
3146 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003147 handleError(texture->setCompressedSubImage(this, mGLState.getUnpackState(), target, level, area,
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003148 format, imageSize,
3149 reinterpret_cast<const uint8_t *>(data)));
Jamie Madill73a84962016-02-12 09:27:23 -05003150}
3151
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003152void Context::generateMipmap(GLenum target)
3153{
3154 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003155 handleError(texture->generateMipmap(this));
Olli Etuaho0f2b1562016-05-13 16:15:35 +03003156}
3157
Geoff Lang97073d12016-04-20 10:42:34 -07003158void Context::copyTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003159 GLint sourceLevel,
3160 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003161 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003162 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003163 GLint internalFormat,
3164 GLenum destType,
3165 GLboolean unpackFlipY,
3166 GLboolean unpackPremultiplyAlpha,
3167 GLboolean unpackUnmultiplyAlpha)
3168{
3169 syncStateForTexImage();
3170
3171 gl::Texture *sourceTexture = getTexture(sourceId);
3172 gl::Texture *destTexture = getTexture(destId);
Geoff Langfc72a072017-03-24 14:52:39 -04003173 handleError(destTexture->copyTexture(
3174 this, destTarget, destLevel, internalFormat, destType, sourceLevel, unpackFlipY == GL_TRUE,
3175 unpackPremultiplyAlpha == GL_TRUE, unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003176}
3177
3178void Context::copySubTextureCHROMIUM(GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04003179 GLint sourceLevel,
3180 GLenum destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07003181 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04003182 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07003183 GLint xoffset,
3184 GLint yoffset,
3185 GLint x,
3186 GLint y,
3187 GLsizei width,
3188 GLsizei height,
3189 GLboolean unpackFlipY,
3190 GLboolean unpackPremultiplyAlpha,
3191 GLboolean unpackUnmultiplyAlpha)
3192{
3193 // Zero sized copies are valid but no-ops
3194 if (width == 0 || height == 0)
3195 {
3196 return;
3197 }
3198
3199 syncStateForTexImage();
3200
3201 gl::Texture *sourceTexture = getTexture(sourceId);
3202 gl::Texture *destTexture = getTexture(destId);
3203 Offset offset(xoffset, yoffset, 0);
3204 Rectangle area(x, y, width, height);
Geoff Langfc72a072017-03-24 14:52:39 -04003205 handleError(destTexture->copySubTexture(
3206 this, destTarget, destLevel, offset, sourceLevel, area, unpackFlipY == GL_TRUE,
3207 unpackPremultiplyAlpha == GL_TRUE, unpackUnmultiplyAlpha == GL_TRUE, sourceTexture));
Geoff Lang97073d12016-04-20 10:42:34 -07003208}
3209
Geoff Lang47110bf2016-04-20 11:13:22 -07003210void Context::compressedCopyTextureCHROMIUM(GLuint sourceId, GLuint destId)
3211{
3212 syncStateForTexImage();
3213
3214 gl::Texture *sourceTexture = getTexture(sourceId);
3215 gl::Texture *destTexture = getTexture(destId);
Jamie Madill8897afa2017-02-06 17:17:23 -05003216 handleError(destTexture->copyCompressedTexture(this, sourceTexture));
Geoff Lang47110bf2016-04-20 11:13:22 -07003217}
3218
Geoff Lang496c02d2016-10-20 11:38:11 -07003219void Context::getBufferPointerv(GLenum target, GLenum pname, void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003220{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003221 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003222 ASSERT(buffer);
3223
Geoff Lang496c02d2016-10-20 11:38:11 -07003224 QueryBufferPointerv(buffer, pname, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003225}
3226
3227GLvoid *Context::mapBuffer(GLenum target, GLenum access)
3228{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003229 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003230 ASSERT(buffer);
3231
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003232 Error error = buffer->map(this, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003233 if (error.isError())
3234 {
Jamie Madill437fa652016-05-03 15:13:24 -04003235 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003236 return nullptr;
3237 }
3238
3239 return buffer->getMapPointer();
3240}
3241
3242GLboolean Context::unmapBuffer(GLenum target)
3243{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003244 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003245 ASSERT(buffer);
3246
3247 GLboolean result;
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003248 Error error = buffer->unmap(this, &result);
Olli Etuaho4f667482016-03-30 15:56:35 +03003249 if (error.isError())
3250 {
Jamie Madill437fa652016-05-03 15:13:24 -04003251 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003252 return GL_FALSE;
3253 }
3254
3255 return result;
3256}
3257
3258GLvoid *Context::mapBufferRange(GLenum target,
3259 GLintptr offset,
3260 GLsizeiptr length,
3261 GLbitfield access)
3262{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003263 Buffer *buffer = mGLState.getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003264 ASSERT(buffer);
3265
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003266 Error error = buffer->mapRange(this, offset, length, access);
Olli Etuaho4f667482016-03-30 15:56:35 +03003267 if (error.isError())
3268 {
Jamie Madill437fa652016-05-03 15:13:24 -04003269 handleError(error);
Olli Etuaho4f667482016-03-30 15:56:35 +03003270 return nullptr;
3271 }
3272
3273 return buffer->getMapPointer();
3274}
3275
3276void Context::flushMappedBufferRange(GLenum /*target*/, GLintptr /*offset*/, GLsizeiptr /*length*/)
3277{
3278 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
3279}
3280
Jamie Madillad9f24e2016-02-12 09:27:24 -05003281void Context::syncStateForReadPixels()
3282{
3283 syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
3284}
3285
3286void Context::syncStateForTexImage()
3287{
3288 syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
3289}
3290
3291void Context::syncStateForClear()
3292{
3293 syncRendererState(mClearDirtyBits, mClearDirtyObjects);
3294}
3295
3296void Context::syncStateForBlit()
3297{
3298 syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
3299}
3300
Jamie Madillc20ab272016-06-09 07:20:46 -07003301void Context::activeTexture(GLenum texture)
3302{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003303 mGLState.setActiveSampler(texture - GL_TEXTURE0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003304}
3305
3306void Context::blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
3307{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003308 mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
Jamie Madillc20ab272016-06-09 07:20:46 -07003309}
3310
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003311void Context::blendEquation(GLenum mode)
3312{
3313 mGLState.setBlendEquation(mode, mode);
3314}
3315
Jamie Madillc20ab272016-06-09 07:20:46 -07003316void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
3317{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003318 mGLState.setBlendEquation(modeRGB, modeAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003319}
3320
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05003321void Context::blendFunc(GLenum sfactor, GLenum dfactor)
3322{
3323 mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
3324}
3325
Jamie Madillc20ab272016-06-09 07:20:46 -07003326void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
3327{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003328 mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003329}
3330
3331void Context::clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
3332{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003333 mGLState.setColorClearValue(red, green, blue, alpha);
Jamie Madillc20ab272016-06-09 07:20:46 -07003334}
3335
3336void Context::clearDepthf(GLclampf depth)
3337{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003338 mGLState.setDepthClearValue(depth);
Jamie Madillc20ab272016-06-09 07:20:46 -07003339}
3340
3341void Context::clearStencil(GLint s)
3342{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003343 mGLState.setStencilClearValue(s);
Jamie Madillc20ab272016-06-09 07:20:46 -07003344}
3345
3346void Context::colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
3347{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003348 mGLState.setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003349}
3350
3351void Context::cullFace(GLenum mode)
3352{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003353 mGLState.setCullMode(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003354}
3355
3356void Context::depthFunc(GLenum func)
3357{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003358 mGLState.setDepthFunc(func);
Jamie Madillc20ab272016-06-09 07:20:46 -07003359}
3360
3361void Context::depthMask(GLboolean flag)
3362{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003363 mGLState.setDepthMask(flag != GL_FALSE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003364}
3365
3366void Context::depthRangef(GLclampf zNear, GLclampf zFar)
3367{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003368 mGLState.setDepthRange(zNear, zFar);
Jamie Madillc20ab272016-06-09 07:20:46 -07003369}
3370
3371void Context::disable(GLenum cap)
3372{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003373 mGLState.setEnableFeature(cap, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003374}
3375
3376void Context::disableVertexAttribArray(GLuint index)
3377{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003378 mGLState.setEnableVertexAttribArray(index, false);
Jamie Madillc20ab272016-06-09 07:20:46 -07003379}
3380
3381void Context::enable(GLenum cap)
3382{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003383 mGLState.setEnableFeature(cap, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003384}
3385
3386void Context::enableVertexAttribArray(GLuint index)
3387{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003388 mGLState.setEnableVertexAttribArray(index, true);
Jamie Madillc20ab272016-06-09 07:20:46 -07003389}
3390
3391void Context::frontFace(GLenum mode)
3392{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003393 mGLState.setFrontFace(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003394}
3395
3396void Context::hint(GLenum target, GLenum mode)
3397{
3398 switch (target)
3399 {
3400 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003401 mGLState.setGenerateMipmapHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003402 break;
3403
3404 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003405 mGLState.setFragmentShaderDerivativeHint(mode);
Jamie Madillc20ab272016-06-09 07:20:46 -07003406 break;
3407
3408 default:
3409 UNREACHABLE();
3410 return;
3411 }
3412}
3413
3414void Context::lineWidth(GLfloat width)
3415{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003416 mGLState.setLineWidth(width);
Jamie Madillc20ab272016-06-09 07:20:46 -07003417}
3418
3419void Context::pixelStorei(GLenum pname, GLint param)
3420{
3421 switch (pname)
3422 {
3423 case GL_UNPACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003424 mGLState.setUnpackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003425 break;
3426
3427 case GL_PACK_ALIGNMENT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003428 mGLState.setPackAlignment(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003429 break;
3430
3431 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003432 mGLState.setPackReverseRowOrder(param != 0);
Jamie Madillc20ab272016-06-09 07:20:46 -07003433 break;
3434
3435 case GL_UNPACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003436 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003437 mGLState.setUnpackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003438 break;
3439
3440 case GL_UNPACK_IMAGE_HEIGHT:
Martin Radev1be913c2016-07-11 17:59:16 +03003441 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003442 mGLState.setUnpackImageHeight(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003443 break;
3444
3445 case GL_UNPACK_SKIP_IMAGES:
Martin Radev1be913c2016-07-11 17:59:16 +03003446 ASSERT(getClientMajorVersion() >= 3);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003447 mGLState.setUnpackSkipImages(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003448 break;
3449
3450 case GL_UNPACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003451 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003452 mGLState.setUnpackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003453 break;
3454
3455 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003456 ASSERT((getClientMajorVersion() >= 3) || getExtensions().unpackSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003457 mGLState.setUnpackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003458 break;
3459
3460 case GL_PACK_ROW_LENGTH:
Martin Radev1be913c2016-07-11 17:59:16 +03003461 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003462 mGLState.setPackRowLength(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003463 break;
3464
3465 case GL_PACK_SKIP_ROWS:
Martin Radev1be913c2016-07-11 17:59:16 +03003466 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003467 mGLState.setPackSkipRows(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003468 break;
3469
3470 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +03003471 ASSERT((getClientMajorVersion() >= 3) || getExtensions().packSubimage);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003472 mGLState.setPackSkipPixels(param);
Jamie Madillc20ab272016-06-09 07:20:46 -07003473 break;
3474
3475 default:
3476 UNREACHABLE();
3477 return;
3478 }
3479}
3480
3481void Context::polygonOffset(GLfloat factor, GLfloat units)
3482{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003483 mGLState.setPolygonOffsetParams(factor, units);
Jamie Madillc20ab272016-06-09 07:20:46 -07003484}
3485
3486void Context::sampleCoverage(GLclampf value, GLboolean invert)
3487{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003488 mGLState.setSampleCoverageParams(clamp01(value), invert == GL_TRUE);
Jamie Madillc20ab272016-06-09 07:20:46 -07003489}
3490
3491void Context::scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3492{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003493 mGLState.setScissorParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003494}
3495
3496void Context::stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3497{
3498 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3499 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003500 mGLState.setStencilParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003501 }
3502
3503 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3504 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003505 mGLState.setStencilBackParams(func, ref, mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003506 }
3507}
3508
3509void Context::stencilMaskSeparate(GLenum face, GLuint mask)
3510{
3511 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3512 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003513 mGLState.setStencilWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003514 }
3515
3516 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3517 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003518 mGLState.setStencilBackWritemask(mask);
Jamie Madillc20ab272016-06-09 07:20:46 -07003519 }
3520}
3521
3522void Context::stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3523{
3524 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3525 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003526 mGLState.setStencilOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003527 }
3528
3529 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3530 {
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003531 mGLState.setStencilBackOperations(fail, zfail, zpass);
Jamie Madillc20ab272016-06-09 07:20:46 -07003532 }
3533}
3534
3535void Context::vertexAttrib1f(GLuint index, GLfloat x)
3536{
3537 GLfloat vals[4] = {x, 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003538 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003539}
3540
3541void Context::vertexAttrib1fv(GLuint index, const GLfloat *values)
3542{
3543 GLfloat vals[4] = {values[0], 0, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003544 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003545}
3546
3547void Context::vertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3548{
3549 GLfloat vals[4] = {x, y, 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003550 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003551}
3552
3553void Context::vertexAttrib2fv(GLuint index, const GLfloat *values)
3554{
3555 GLfloat vals[4] = {values[0], values[1], 0, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003556 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003557}
3558
3559void Context::vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3560{
3561 GLfloat vals[4] = {x, y, z, 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003562 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003563}
3564
3565void Context::vertexAttrib3fv(GLuint index, const GLfloat *values)
3566{
3567 GLfloat vals[4] = {values[0], values[1], values[2], 1};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003568 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003569}
3570
3571void Context::vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3572{
3573 GLfloat vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003574 mGLState.setVertexAttribf(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003575}
3576
3577void Context::vertexAttrib4fv(GLuint index, const GLfloat *values)
3578{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003579 mGLState.setVertexAttribf(index, values);
Jamie Madillc20ab272016-06-09 07:20:46 -07003580}
3581
3582void Context::vertexAttribPointer(GLuint index,
3583 GLint size,
3584 GLenum type,
3585 GLboolean normalized,
3586 GLsizei stride,
3587 const GLvoid *ptr)
3588{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003589 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
3590 normalized == GL_TRUE, false, stride, ptr);
Jamie Madillc20ab272016-06-09 07:20:46 -07003591}
3592
Shao80957d92017-02-20 21:25:59 +08003593void Context::vertexAttribFormat(GLuint attribIndex,
3594 GLint size,
3595 GLenum type,
3596 GLboolean normalized,
3597 GLuint relativeOffset)
3598{
3599 mGLState.setVertexAttribFormat(attribIndex, size, type, normalized == GL_TRUE, false,
3600 relativeOffset);
3601}
3602
3603void Context::vertexAttribIFormat(GLuint attribIndex,
3604 GLint size,
3605 GLenum type,
3606 GLuint relativeOffset)
3607{
3608 mGLState.setVertexAttribFormat(attribIndex, size, type, false, true, relativeOffset);
3609}
3610
3611void Context::vertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
3612{
3613 mGLState.setVertexAttribBinding(attribIndex, bindingIndex);
3614}
3615
3616void Context::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
3617{
3618 mGLState.setVertexBindingDivisor(bindingIndex, divisor);
3619}
3620
Jamie Madillc20ab272016-06-09 07:20:46 -07003621void Context::viewport(GLint x, GLint y, GLsizei width, GLsizei height)
3622{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003623 mGLState.setViewportParams(x, y, width, height);
Jamie Madillc20ab272016-06-09 07:20:46 -07003624}
3625
3626void Context::vertexAttribIPointer(GLuint index,
3627 GLint size,
3628 GLenum type,
3629 GLsizei stride,
3630 const GLvoid *pointer)
3631{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003632 mGLState.setVertexAttribState(index, mGLState.getTargetBuffer(GL_ARRAY_BUFFER), size, type,
3633 false, true, stride, pointer);
Jamie Madillc20ab272016-06-09 07:20:46 -07003634}
3635
3636void Context::vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
3637{
3638 GLint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003639 mGLState.setVertexAttribi(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003640}
3641
3642void Context::vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
3643{
3644 GLuint vals[4] = {x, y, z, w};
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003645 mGLState.setVertexAttribu(index, vals);
Jamie Madillc20ab272016-06-09 07:20:46 -07003646}
3647
3648void Context::vertexAttribI4iv(GLuint index, const GLint *v)
3649{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003650 mGLState.setVertexAttribi(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003651}
3652
3653void Context::vertexAttribI4uiv(GLuint index, const GLuint *v)
3654{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003655 mGLState.setVertexAttribu(index, v);
Jamie Madillc20ab272016-06-09 07:20:46 -07003656}
3657
Jiawei-Shao2597fb62016-12-09 16:38:02 +08003658void Context::getVertexAttribiv(GLuint index, GLenum pname, GLint *params)
3659{
3660 const VertexAttribCurrentValueData &currentValues =
3661 getGLState().getVertexAttribCurrentValue(index);
3662 const VertexArray *vao = getGLState().getVertexArray();
3663 QueryVertexAttribiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3664 currentValues, pname, params);
3665}
3666
3667void Context::getVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
3668{
3669 const VertexAttribCurrentValueData &currentValues =
3670 getGLState().getVertexAttribCurrentValue(index);
3671 const VertexArray *vao = getGLState().getVertexArray();
3672 QueryVertexAttribfv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3673 currentValues, pname, params);
3674}
3675
3676void Context::getVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
3677{
3678 const VertexAttribCurrentValueData &currentValues =
3679 getGLState().getVertexAttribCurrentValue(index);
3680 const VertexArray *vao = getGLState().getVertexArray();
3681 QueryVertexAttribIiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3682 currentValues, pname, params);
3683}
3684
3685void Context::getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
3686{
3687 const VertexAttribCurrentValueData &currentValues =
3688 getGLState().getVertexAttribCurrentValue(index);
3689 const VertexArray *vao = getGLState().getVertexArray();
3690 QueryVertexAttribIuiv(vao->getVertexAttribute(index), vao->getBindingFromAttribIndex(index),
3691 currentValues, pname, params);
3692}
3693
3694void Context::getVertexAttribPointerv(GLuint index, GLenum pname, GLvoid **pointer)
3695{
3696 const VertexAttribute &attrib = getGLState().getVertexArray()->getVertexAttribute(index);
3697 QueryVertexAttribPointerv(attrib, pname, pointer);
3698}
3699
Jamie Madillc20ab272016-06-09 07:20:46 -07003700void Context::debugMessageControl(GLenum source,
3701 GLenum type,
3702 GLenum severity,
3703 GLsizei count,
3704 const GLuint *ids,
3705 GLboolean enabled)
3706{
3707 std::vector<GLuint> idVector(ids, ids + count);
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003708 mGLState.getDebug().setMessageControl(source, type, severity, std::move(idVector),
3709 (enabled != GL_FALSE));
Jamie Madillc20ab272016-06-09 07:20:46 -07003710}
3711
3712void Context::debugMessageInsert(GLenum source,
3713 GLenum type,
3714 GLuint id,
3715 GLenum severity,
3716 GLsizei length,
3717 const GLchar *buf)
3718{
3719 std::string msg(buf, (length > 0) ? static_cast<size_t>(length) : strlen(buf));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003720 mGLState.getDebug().insertMessage(source, type, id, severity, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003721}
3722
3723void Context::debugMessageCallback(GLDEBUGPROCKHR callback, const void *userParam)
3724{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003725 mGLState.getDebug().setCallback(callback, userParam);
Jamie Madillc20ab272016-06-09 07:20:46 -07003726}
3727
3728GLuint Context::getDebugMessageLog(GLuint count,
3729 GLsizei bufSize,
3730 GLenum *sources,
3731 GLenum *types,
3732 GLuint *ids,
3733 GLenum *severities,
3734 GLsizei *lengths,
3735 GLchar *messageLog)
3736{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003737 return static_cast<GLuint>(mGLState.getDebug().getMessages(count, bufSize, sources, types, ids,
3738 severities, lengths, messageLog));
Jamie Madillc20ab272016-06-09 07:20:46 -07003739}
3740
3741void Context::pushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar *message)
3742{
3743 std::string msg(message, (length > 0) ? static_cast<size_t>(length) : strlen(message));
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003744 mGLState.getDebug().pushGroup(source, id, std::move(msg));
Jamie Madillc20ab272016-06-09 07:20:46 -07003745}
3746
3747void Context::popDebugGroup()
3748{
Jamie Madilldfde6ab2016-06-09 07:07:18 -07003749 mGLState.getDebug().popGroup();
Jamie Madillc20ab272016-06-09 07:20:46 -07003750}
3751
Jamie Madill29639852016-09-02 15:00:09 -04003752void Context::bufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
3753{
3754 Buffer *buffer = mGLState.getTargetBuffer(target);
3755 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08003756 handleError(buffer->bufferData(this, target, data, size, usage));
Jamie Madill29639852016-09-02 15:00:09 -04003757}
3758
3759void Context::bufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
3760{
3761 if (data == nullptr)
3762 {
3763 return;
3764 }
3765
3766 Buffer *buffer = mGLState.getTargetBuffer(target);
3767 ASSERT(buffer);
Jamie Madillb8353b02017-01-25 12:57:21 -08003768 handleError(buffer->bufferSubData(this, target, data, size, offset));
Jamie Madill29639852016-09-02 15:00:09 -04003769}
3770
Jamie Madillef300b12016-10-07 15:12:09 -04003771void Context::attachShader(GLuint program, GLuint shader)
3772{
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003773 auto programObject = mState.mShaderPrograms->getProgram(program);
3774 auto shaderObject = mState.mShaderPrograms->getShader(shader);
Jamie Madillef300b12016-10-07 15:12:09 -04003775 ASSERT(programObject && shaderObject);
3776 programObject->attachShader(shaderObject);
3777}
3778
Kenneth Russellf2f6f652016-10-05 19:53:23 -07003779const Workarounds &Context::getWorkarounds() const
3780{
3781 return mWorkarounds;
3782}
3783
Jamie Madillb0817d12016-11-01 15:48:31 -04003784void Context::copyBufferSubData(GLenum readTarget,
3785 GLenum writeTarget,
3786 GLintptr readOffset,
3787 GLintptr writeOffset,
3788 GLsizeiptr size)
3789{
3790 // if size is zero, the copy is a successful no-op
3791 if (size == 0)
3792 {
3793 return;
3794 }
3795
3796 // TODO(jmadill): cache these.
3797 Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
3798 Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
3799
Jamie Madill5f56ddb2017-01-13 17:29:55 -05003800 handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
Jamie Madillb0817d12016-11-01 15:48:31 -04003801}
3802
Jamie Madill01a80ee2016-11-07 12:06:18 -05003803void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
3804{
3805 Program *programObject = getProgram(program);
3806 // TODO(jmadill): Re-use this from the validation if possible.
3807 ASSERT(programObject);
3808 programObject->bindAttributeLocation(index, name);
3809}
3810
3811void Context::bindBuffer(GLenum target, GLuint buffer)
3812{
3813 switch (target)
3814 {
3815 case GL_ARRAY_BUFFER:
3816 bindArrayBuffer(buffer);
3817 break;
3818 case GL_ELEMENT_ARRAY_BUFFER:
3819 bindElementArrayBuffer(buffer);
3820 break;
3821 case GL_COPY_READ_BUFFER:
3822 bindCopyReadBuffer(buffer);
3823 break;
3824 case GL_COPY_WRITE_BUFFER:
3825 bindCopyWriteBuffer(buffer);
3826 break;
3827 case GL_PIXEL_PACK_BUFFER:
3828 bindPixelPackBuffer(buffer);
3829 break;
3830 case GL_PIXEL_UNPACK_BUFFER:
3831 bindPixelUnpackBuffer(buffer);
3832 break;
3833 case GL_UNIFORM_BUFFER:
3834 bindGenericUniformBuffer(buffer);
3835 break;
3836 case GL_TRANSFORM_FEEDBACK_BUFFER:
3837 bindGenericTransformFeedbackBuffer(buffer);
3838 break;
Geoff Lang3b573612016-10-31 14:08:10 -04003839 case GL_ATOMIC_COUNTER_BUFFER:
Jiajia Qin6eafb042016-12-27 17:04:07 +08003840 bindGenericAtomicCounterBuffer(buffer);
Geoff Lang3b573612016-10-31 14:08:10 -04003841 break;
3842 case GL_SHADER_STORAGE_BUFFER:
Geoff Lang9f090372016-12-02 10:20:43 -05003843 if (buffer != 0)
3844 {
3845 // Binding buffers to this binding point is not implemented yet.
3846 UNIMPLEMENTED();
3847 }
Geoff Lang3b573612016-10-31 14:08:10 -04003848 break;
3849 case GL_DRAW_INDIRECT_BUFFER:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08003850 bindDrawIndirectBuffer(buffer);
Geoff Lang3b573612016-10-31 14:08:10 -04003851 break;
3852 case GL_DISPATCH_INDIRECT_BUFFER:
Geoff Lang9f090372016-12-02 10:20:43 -05003853 if (buffer != 0)
3854 {
3855 // Binding buffers to this binding point is not implemented yet.
3856 UNIMPLEMENTED();
3857 }
Geoff Lang3b573612016-10-31 14:08:10 -04003858 break;
Jamie Madill01a80ee2016-11-07 12:06:18 -05003859
3860 default:
3861 UNREACHABLE();
3862 break;
3863 }
3864}
3865
Jiajia Qin6eafb042016-12-27 17:04:07 +08003866void Context::bindBufferBase(GLenum target, GLuint index, GLuint buffer)
3867{
3868 bindBufferRange(target, index, buffer, 0, 0);
3869}
3870
3871void Context::bindBufferRange(GLenum target,
3872 GLuint index,
3873 GLuint buffer,
3874 GLintptr offset,
3875 GLsizeiptr size)
3876{
3877 switch (target)
3878 {
3879 case GL_TRANSFORM_FEEDBACK_BUFFER:
3880 bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
3881 bindGenericTransformFeedbackBuffer(buffer);
3882 break;
3883 case GL_UNIFORM_BUFFER:
3884 bindIndexedUniformBuffer(buffer, index, offset, size);
3885 bindGenericUniformBuffer(buffer);
3886 break;
3887 case GL_ATOMIC_COUNTER_BUFFER:
3888 bindIndexedAtomicCounterBuffer(buffer, index, offset, size);
3889 bindGenericAtomicCounterBuffer(buffer);
3890 break;
3891 case GL_SHADER_STORAGE_BUFFER:
3892 if (buffer != 0)
3893 {
3894 // Binding buffers to this binding point is not implemented yet.
3895 UNIMPLEMENTED();
3896 }
3897 break;
3898 default:
3899 UNREACHABLE();
3900 break;
3901 }
3902}
3903
Jamie Madill01a80ee2016-11-07 12:06:18 -05003904void Context::bindFramebuffer(GLenum target, GLuint framebuffer)
3905{
3906 if (target == GL_READ_FRAMEBUFFER || target == GL_FRAMEBUFFER)
3907 {
3908 bindReadFramebuffer(framebuffer);
3909 }
3910
3911 if (target == GL_DRAW_FRAMEBUFFER || target == GL_FRAMEBUFFER)
3912 {
3913 bindDrawFramebuffer(framebuffer);
3914 }
3915}
3916
3917void Context::bindRenderbuffer(GLenum target, GLuint renderbuffer)
3918{
3919 ASSERT(target == GL_RENDERBUFFER);
3920 Renderbuffer *object =
Geoff Lang4ddf5af2016-12-01 14:30:44 -05003921 mState.mRenderbuffers->checkRenderbufferAllocation(mImplementation.get(), renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -05003922 mGLState.setRenderbufferBinding(object);
3923}
3924
JiangYizhoubddc46b2016-12-09 09:50:51 +08003925void Context::texStorage2DMultisample(GLenum target,
3926 GLsizei samples,
3927 GLenum internalformat,
3928 GLsizei width,
3929 GLsizei height,
3930 GLboolean fixedsamplelocations)
3931{
3932 Extents size(width, height, 1);
3933 Texture *texture = getTargetTexture(target);
Jamie Madill8897afa2017-02-06 17:17:23 -05003934 handleError(texture->setStorageMultisample(this, target, samples, internalformat, size,
JiangYizhoubddc46b2016-12-09 09:50:51 +08003935 fixedsamplelocations));
3936}
3937
3938void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
3939{
3940 mGLState.syncDirtyObject(GL_READ_FRAMEBUFFER);
3941 const Framebuffer *framebuffer = mGLState.getReadFramebuffer();
3942
3943 switch (pname)
3944 {
3945 case GL_SAMPLE_POSITION:
3946 handleError(framebuffer->getSamplePosition(index, val));
3947 break;
3948 default:
3949 UNREACHABLE();
3950 }
3951}
3952
Jamie Madille8fb6402017-02-14 17:56:40 -05003953void Context::renderbufferStorage(GLenum target,
3954 GLenum internalformat,
3955 GLsizei width,
3956 GLsizei height)
3957{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003958 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
3959 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
3960
Jamie Madille8fb6402017-02-14 17:56:40 -05003961 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003962 handleError(renderbuffer->setStorage(convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05003963}
3964
3965void Context::renderbufferStorageMultisample(GLenum target,
3966 GLsizei samples,
3967 GLenum internalformat,
3968 GLsizei width,
3969 GLsizei height)
3970{
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003971 // Hack for the special WebGL 1 "DEPTH_STENCIL" internal format.
3972 GLenum convertedInternalFormat = getConvertedRenderbufferFormat(internalformat);
Jamie Madille8fb6402017-02-14 17:56:40 -05003973
3974 Renderbuffer *renderbuffer = mGLState.getCurrentRenderbuffer();
Jamie Madill4e0e6f82017-02-17 11:06:03 -05003975 handleError(
3976 renderbuffer->setStorageMultisample(samples, convertedInternalFormat, width, height));
Jamie Madille8fb6402017-02-14 17:56:40 -05003977}
3978
JiangYizhoue18e6392017-02-20 10:32:23 +08003979void Context::getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
3980{
3981 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3982 QueryFramebufferParameteriv(framebuffer, pname, params);
3983}
3984
3985void Context::setFramebufferParameteri(GLenum target, GLenum pname, GLint param)
3986{
3987 Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
3988 SetFramebufferParameteri(framebuffer, pname, param);
3989}
3990
Jamie Madille14951e2017-03-09 18:55:16 -05003991Error Context::getScratchBuffer(size_t requestedSize, angle::MemoryBuffer **scratchBufferOut) const
3992{
3993 if (!mScratchBuffer.get(requestedSize, scratchBufferOut))
3994 {
3995 return gl::OutOfMemory() << "Failed to allocate internal buffer.";
3996 }
3997 return gl::NoError();
3998}
3999
Jamie Madillc29968b2016-01-20 11:17:23 -05004000} // namespace gl