blob: 63f196c28842244214015db4484499abdc643b32 [file] [log] [blame]
Shannon Woods53a94a82014-06-24 15:20:36 -04001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// State.cpp: Implements the State class, encapsulating raw GL state.
8
Geoff Lang2b5420c2014-11-19 14:20:15 -05009#include "libANGLE/State.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040010
Sami Väisänene45e53b2016-05-25 10:36:04 +030011#include <limits>
12#include <string.h>
13
Jamie Madill20e005b2017-04-07 14:19:22 -040014#include "common/bitset_utils.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030015#include "common/matrix_utils.h"
16#include "common/mathutil.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050017#include "libANGLE/Context.h"
18#include "libANGLE/Caps.h"
Geoff Lang70d0f492015-12-10 17:45:46 -050019#include "libANGLE/Debug.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050020#include "libANGLE/Framebuffer.h"
21#include "libANGLE/FramebufferAttachment.h"
22#include "libANGLE/Query.h"
23#include "libANGLE/VertexArray.h"
24#include "libANGLE/formatutils.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040025
Olli Etuahobbf1c102016-06-28 13:31:33 +030026namespace
27{
28
29GLenum ActiveQueryType(const GLenum type)
30{
31 return (type == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) ? GL_ANY_SAMPLES_PASSED : type;
32}
33
34} // anonymous namepace
35
Shannon Woods53a94a82014-06-24 15:20:36 -040036namespace gl
37{
Geoff Lang76b10c92014-09-05 16:28:14 -040038
Shannon Woods53a94a82014-06-24 15:20:36 -040039State::State()
Jamie Madille79b1e12015-11-04 16:36:37 -050040 : mMaxDrawBuffers(0),
41 mMaxCombinedTextureImageUnits(0),
42 mDepthClearValue(0),
43 mStencilClearValue(0),
44 mScissorTest(false),
45 mSampleCoverage(false),
46 mSampleCoverageValue(0),
47 mSampleCoverageInvert(false),
48 mStencilRef(0),
49 mStencilBackRef(0),
50 mLineWidth(0),
51 mGenerateMipmapHint(GL_NONE),
52 mFragmentShaderDerivativeHint(GL_NONE),
Geoff Langf41a7152016-09-19 15:11:17 -040053 mBindGeneratesResource(true),
Geoff Langfeb8c682017-02-13 16:07:35 -050054 mClientArraysEnabled(true),
Jamie Madille79b1e12015-11-04 16:36:37 -050055 mNearZ(0),
56 mFarZ(0),
57 mReadFramebuffer(nullptr),
58 mDrawFramebuffer(nullptr),
59 mProgram(nullptr),
60 mVertexArray(nullptr),
61 mActiveSampler(0),
Sami Väisänen74c23472016-05-09 17:30:30 +030062 mPrimitiveRestart(false),
63 mMultiSampling(false),
Geoff Lang1d2c41d2016-10-19 16:14:46 -070064 mSampleAlphaToOne(false),
Jamie Madille08a1d32017-03-07 17:24:06 -050065 mFramebufferSRGB(true),
66 mRobustResourceInit(false)
Shannon Woods53a94a82014-06-24 15:20:36 -040067{
Geoff Lang76b10c92014-09-05 16:28:14 -040068}
69
70State::~State()
71{
Geoff Lang76b10c92014-09-05 16:28:14 -040072}
73
Jamie Madill4928b7c2017-06-20 12:57:39 -040074void State::initialize(const Context *context,
Geoff Langf41a7152016-09-19 15:11:17 -040075 bool debug,
Geoff Langfeb8c682017-02-13 16:07:35 -050076 bool bindGeneratesResource,
Jamie Madille08a1d32017-03-07 17:24:06 -050077 bool clientArraysEnabled,
78 bool robustResourceInit)
Geoff Lang76b10c92014-09-05 16:28:14 -040079{
Jamie Madill4928b7c2017-06-20 12:57:39 -040080 const Caps &caps = context->getCaps();
81 const Extensions &extensions = context->getExtensions();
82 const Version &clientVersion = context->getClientVersion();
83
Shannon Woods2df6a602014-09-26 16:12:07 -040084 mMaxDrawBuffers = caps.maxDrawBuffers;
85 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -040086
Jamie Madillf75ab352015-03-16 10:46:52 -040087 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -040088
89 mDepthClearValue = 1.0f;
90 mStencilClearValue = 0;
91
Shannon Woods53a94a82014-06-24 15:20:36 -040092 mScissorTest = false;
93 mScissor.x = 0;
94 mScissor.y = 0;
95 mScissor.width = 0;
96 mScissor.height = 0;
97
Shannon Woods53a94a82014-06-24 15:20:36 -040098 mBlendColor.red = 0;
99 mBlendColor.green = 0;
100 mBlendColor.blue = 0;
101 mBlendColor.alpha = 0;
102
Shannon Woods53a94a82014-06-24 15:20:36 -0400103 mStencilRef = 0;
104 mStencilBackRef = 0;
105
106 mSampleCoverage = false;
107 mSampleCoverageValue = 1.0f;
108 mSampleCoverageInvert = false;
109 mGenerateMipmapHint = GL_DONT_CARE;
110 mFragmentShaderDerivativeHint = GL_DONT_CARE;
111
Geoff Langf41a7152016-09-19 15:11:17 -0400112 mBindGeneratesResource = bindGeneratesResource;
Geoff Langfeb8c682017-02-13 16:07:35 -0500113 mClientArraysEnabled = clientArraysEnabled;
Geoff Langf41a7152016-09-19 15:11:17 -0400114
Shannon Woods53a94a82014-06-24 15:20:36 -0400115 mLineWidth = 1.0f;
116
117 mViewport.x = 0;
118 mViewport.y = 0;
119 mViewport.width = 0;
120 mViewport.height = 0;
121 mNearZ = 0.0f;
122 mFarZ = 1.0f;
123
124 mBlend.colorMaskRed = true;
125 mBlend.colorMaskGreen = true;
126 mBlend.colorMaskBlue = true;
127 mBlend.colorMaskAlpha = true;
128
Geoff Lang76b10c92014-09-05 16:28:14 -0400129 mActiveSampler = 0;
130
Shannon Woods23e05002014-09-22 19:07:27 -0400131 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400132
Geoff Lang4dc3af02016-11-18 14:09:27 -0500133 mUniformBuffers.resize(caps.maxUniformBufferBindings);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400134
Geoff Lang76b10c92014-09-05 16:28:14 -0400135 mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits);
136 mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits);
Geoff Langeb66a6e2016-10-31 13:06:12 -0400137 if (clientVersion >= Version(3, 0))
Shannon Woods53a94a82014-06-24 15:20:36 -0400138 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400139 // TODO: These could also be enabled via extension
140 mSamplerTextures[GL_TEXTURE_2D_ARRAY].resize(caps.maxCombinedTextureImageUnits);
141 mSamplerTextures[GL_TEXTURE_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400142 }
Geoff Lang3b573612016-10-31 14:08:10 -0400143 if (clientVersion >= Version(3, 1))
144 {
145 mSamplerTextures[GL_TEXTURE_2D_MULTISAMPLE].resize(caps.maxCombinedTextureImageUnits);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800146
147 mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800148 mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800149 mImageUnits.resize(caps.maxImageUnits);
Geoff Lang3b573612016-10-31 14:08:10 -0400150 }
Ian Ewellbda75592016-04-18 17:25:54 -0400151 if (extensions.eglImageExternal || extensions.eglStreamConsumerExternal)
152 {
153 mSamplerTextures[GL_TEXTURE_EXTERNAL_OES].resize(caps.maxCombinedTextureImageUnits);
154 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400155
Geoff Lang76b10c92014-09-05 16:28:14 -0400156 mSamplers.resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400157
Jamie Madill4928b7c2017-06-20 12:57:39 -0400158 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(context, nullptr);
159 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(context, nullptr);
160 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(context, nullptr);
161 mActiveQueries[GL_TIME_ELAPSED_EXT].set(context, nullptr);
162 mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400163
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500164 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400165
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500166 mReadFramebuffer = nullptr;
167 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500168
169 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500170
171 mDebug.setOutputEnabled(debug);
172 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300173
174 if (extensions.framebufferMultisample)
175 {
176 mMultiSampling = true;
177 mSampleAlphaToOne = false;
178 }
Sami Väisänena797e062016-05-12 15:23:40 +0300179
180 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300181
182 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
183 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
184 mPathStencilFunc = GL_ALWAYS;
185 mPathStencilRef = 0;
186 mPathStencilMask = std::numeric_limits<GLuint>::max();
Jamie Madille08a1d32017-03-07 17:24:06 -0500187
188 mRobustResourceInit = robustResourceInit;
Shannon Woods53a94a82014-06-24 15:20:36 -0400189}
190
Jamie Madill6c1f6712017-02-14 19:08:04 -0500191void State::reset(const Context *context)
Shannon Woods53a94a82014-06-24 15:20:36 -0400192{
Geoff Lang76b10c92014-09-05 16:28:14 -0400193 for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400194 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400195 TextureBindingVector &textureVector = bindingVec->second;
196 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400197 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400198 textureVector[textureIdx].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400199 }
200 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400201 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
202 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400203 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400204 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400205
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800206 for (auto &imageUnit : mImageUnits)
207 {
208 imageUnit.texture.set(context, nullptr);
209 imageUnit.level = 0;
210 imageUnit.layered = false;
211 imageUnit.layer = 0;
212 imageUnit.access = GL_READ_ONLY;
213 imageUnit.format = GL_R32UI;
214 }
215
Jamie Madill4928b7c2017-06-20 12:57:39 -0400216 mArrayBuffer.set(context, nullptr);
217 mDrawIndirectBuffer.set(context, nullptr);
218 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400219
Geoff Lang7dd2e102014-11-10 15:19:26 -0500220 if (mProgram)
221 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500222 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500223 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800224 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500225
Jamie Madill4928b7c2017-06-20 12:57:39 -0400226 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400227
228 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
229 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400230 i->second.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400231 }
232
Jamie Madill4928b7c2017-06-20 12:57:39 -0400233 mGenericUniformBuffer.set(context, nullptr);
Shannon Woods8299bb02014-09-26 18:55:43 -0400234 for (BufferVector::iterator bufItr = mUniformBuffers.begin(); bufItr != mUniformBuffers.end(); ++bufItr)
Shannon Woods53a94a82014-06-24 15:20:36 -0400235 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400236 bufItr->set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400237 }
238
Jamie Madill4928b7c2017-06-20 12:57:39 -0400239 mCopyReadBuffer.set(context, nullptr);
240 mCopyWriteBuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400241
Jamie Madill4928b7c2017-06-20 12:57:39 -0400242 mPack.pixelBuffer.set(context, nullptr);
243 mUnpack.pixelBuffer.set(context, nullptr);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500244
Jamie Madill4928b7c2017-06-20 12:57:39 -0400245 mGenericAtomicCounterBuffer.set(context, nullptr);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800246 for (auto &buf : mAtomicCounterBuffers)
247 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400248 buf.set(context, nullptr);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800249 }
250
Jamie Madill4928b7c2017-06-20 12:57:39 -0400251 mGenericShaderStorageBuffer.set(context, nullptr);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800252 for (auto &buf : mShaderStorageBuffers)
253 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400254 buf.set(context, nullptr);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800255 }
256
Yunchao Hed7297bf2017-04-19 15:27:10 +0800257 mProgram = nullptr;
Jamie Madill1b94d432015-08-07 13:23:23 -0400258
Sami Väisänene45e53b2016-05-25 10:36:04 +0300259 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
260 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
261 mPathStencilFunc = GL_ALWAYS;
262 mPathStencilRef = 0;
263 mPathStencilMask = std::numeric_limits<GLuint>::max();
264
Jamie Madill1b94d432015-08-07 13:23:23 -0400265 // TODO(jmadill): Is this necessary?
266 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400267}
268
269const RasterizerState &State::getRasterizerState() const
270{
271 return mRasterizer;
272}
273
274const BlendState &State::getBlendState() const
275{
276 return mBlend;
277}
278
279const DepthStencilState &State::getDepthStencilState() const
280{
281 return mDepthStencil;
282}
283
Jamie Madillf75ab352015-03-16 10:46:52 -0400284void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400285{
286 mColorClearValue.red = red;
287 mColorClearValue.green = green;
288 mColorClearValue.blue = blue;
289 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400290 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400291}
292
Jamie Madillf75ab352015-03-16 10:46:52 -0400293void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400294{
295 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400296 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400297}
298
Jamie Madillf75ab352015-03-16 10:46:52 -0400299void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400300{
301 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400302 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400303}
304
Shannon Woods53a94a82014-06-24 15:20:36 -0400305void State::setColorMask(bool red, bool green, bool blue, bool alpha)
306{
307 mBlend.colorMaskRed = red;
308 mBlend.colorMaskGreen = green;
309 mBlend.colorMaskBlue = blue;
310 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400311 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400312}
313
314void State::setDepthMask(bool mask)
315{
316 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400317 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400318}
319
320bool State::isRasterizerDiscardEnabled() const
321{
322 return mRasterizer.rasterizerDiscard;
323}
324
325void State::setRasterizerDiscard(bool enabled)
326{
327 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400328 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400329}
330
331bool State::isCullFaceEnabled() const
332{
333 return mRasterizer.cullFace;
334}
335
336void State::setCullFace(bool enabled)
337{
338 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400339 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400340}
341
342void State::setCullMode(GLenum mode)
343{
344 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400345 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400346}
347
348void State::setFrontFace(GLenum front)
349{
350 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400351 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400352}
353
354bool State::isDepthTestEnabled() const
355{
356 return mDepthStencil.depthTest;
357}
358
359void State::setDepthTest(bool enabled)
360{
361 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400362 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400363}
364
365void State::setDepthFunc(GLenum depthFunc)
366{
367 mDepthStencil.depthFunc = depthFunc;
Jamie Madill1b94d432015-08-07 13:23:23 -0400368 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400369}
370
371void State::setDepthRange(float zNear, float zFar)
372{
373 mNearZ = zNear;
374 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400375 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400376}
377
Geoff Langd42f5b82015-04-16 14:03:29 -0400378float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400379{
Geoff Langd42f5b82015-04-16 14:03:29 -0400380 return mNearZ;
381}
382
383float State::getFarPlane() const
384{
385 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400386}
387
388bool State::isBlendEnabled() const
389{
390 return mBlend.blend;
391}
392
393void State::setBlend(bool enabled)
394{
395 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400396 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400397}
398
399void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
400{
401 mBlend.sourceBlendRGB = sourceRGB;
402 mBlend.destBlendRGB = destRGB;
403 mBlend.sourceBlendAlpha = sourceAlpha;
404 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400405 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400406}
407
408void State::setBlendColor(float red, float green, float blue, float alpha)
409{
410 mBlendColor.red = red;
411 mBlendColor.green = green;
412 mBlendColor.blue = blue;
413 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400414 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400415}
416
417void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
418{
419 mBlend.blendEquationRGB = rgbEquation;
420 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400421 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400422}
423
424const ColorF &State::getBlendColor() const
425{
426 return mBlendColor;
427}
428
429bool State::isStencilTestEnabled() const
430{
431 return mDepthStencil.stencilTest;
432}
433
434void State::setStencilTest(bool enabled)
435{
436 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400437 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400438}
439
440void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
441{
442 mDepthStencil.stencilFunc = stencilFunc;
443 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
444 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400445 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400446}
447
448void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
449{
450 mDepthStencil.stencilBackFunc = stencilBackFunc;
451 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
452 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400453 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400454}
455
456void State::setStencilWritemask(GLuint stencilWritemask)
457{
458 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400459 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400460}
461
462void State::setStencilBackWritemask(GLuint stencilBackWritemask)
463{
464 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400465 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400466}
467
468void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
469{
470 mDepthStencil.stencilFail = stencilFail;
471 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
472 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400473 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400474}
475
476void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
477{
478 mDepthStencil.stencilBackFail = stencilBackFail;
479 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
480 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400481 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400482}
483
484GLint State::getStencilRef() const
485{
486 return mStencilRef;
487}
488
489GLint State::getStencilBackRef() const
490{
491 return mStencilBackRef;
492}
493
494bool State::isPolygonOffsetFillEnabled() const
495{
496 return mRasterizer.polygonOffsetFill;
497}
498
499void State::setPolygonOffsetFill(bool enabled)
500{
Jamie Madill1b94d432015-08-07 13:23:23 -0400501 mRasterizer.polygonOffsetFill = enabled;
502 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400503}
504
505void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
506{
507 // An application can pass NaN values here, so handle this gracefully
508 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
509 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400510 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400511}
512
513bool State::isSampleAlphaToCoverageEnabled() const
514{
515 return mBlend.sampleAlphaToCoverage;
516}
517
518void State::setSampleAlphaToCoverage(bool enabled)
519{
520 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400521 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400522}
523
524bool State::isSampleCoverageEnabled() const
525{
526 return mSampleCoverage;
527}
528
529void State::setSampleCoverage(bool enabled)
530{
531 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400532 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400533}
534
535void State::setSampleCoverageParams(GLclampf value, bool invert)
536{
537 mSampleCoverageValue = value;
538 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400539 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400540}
541
Geoff Lang0fbb6002015-04-16 11:11:53 -0400542GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400543{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400544 return mSampleCoverageValue;
545}
Shannon Woods53a94a82014-06-24 15:20:36 -0400546
Geoff Lang0fbb6002015-04-16 11:11:53 -0400547bool State::getSampleCoverageInvert() const
548{
549 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400550}
551
Sami Väisänen74c23472016-05-09 17:30:30 +0300552void State::setSampleAlphaToOne(bool enabled)
553{
554 mSampleAlphaToOne = enabled;
555 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
556}
557
558bool State::isSampleAlphaToOneEnabled() const
559{
560 return mSampleAlphaToOne;
561}
562
563void State::setMultisampling(bool enabled)
564{
565 mMultiSampling = enabled;
566 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
567}
568
569bool State::isMultisamplingEnabled() const
570{
571 return mMultiSampling;
572}
573
Shannon Woods53a94a82014-06-24 15:20:36 -0400574bool State::isScissorTestEnabled() const
575{
576 return mScissorTest;
577}
578
579void State::setScissorTest(bool enabled)
580{
581 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400582 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400583}
584
585void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
586{
587 mScissor.x = x;
588 mScissor.y = y;
589 mScissor.width = width;
590 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400591 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400592}
593
594const Rectangle &State::getScissor() const
595{
596 return mScissor;
597}
598
599bool State::isDitherEnabled() const
600{
601 return mBlend.dither;
602}
603
604void State::setDither(bool enabled)
605{
606 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400607 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400608}
609
Jamie Madillb4b53c52015-02-03 15:22:48 -0500610bool State::isPrimitiveRestartEnabled() const
611{
612 return mPrimitiveRestart;
613}
614
615void State::setPrimitiveRestart(bool enabled)
616{
617 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400618 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500619}
620
Shannon Woods53a94a82014-06-24 15:20:36 -0400621void State::setEnableFeature(GLenum feature, bool enabled)
622{
623 switch (feature)
624 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300625 case GL_MULTISAMPLE_EXT: setMultisampling(enabled); break;
626 case GL_SAMPLE_ALPHA_TO_ONE_EXT: setSampleAlphaToOne(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400627 case GL_CULL_FACE: setCullFace(enabled); break;
628 case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
629 case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
630 case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
631 case GL_SCISSOR_TEST: setScissorTest(enabled); break;
632 case GL_STENCIL_TEST: setStencilTest(enabled); break;
633 case GL_DEPTH_TEST: setDepthTest(enabled); break;
634 case GL_BLEND: setBlend(enabled); break;
635 case GL_DITHER: setDither(enabled); break;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500636 case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400637 case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
Geoff Lang3b573612016-10-31 14:08:10 -0400638 case GL_SAMPLE_MASK:
Geoff Lang9f090372016-12-02 10:20:43 -0500639 if (enabled)
640 {
641 // Enabling this feature is not implemented yet.
642 UNIMPLEMENTED();
643 }
Geoff Lang3b573612016-10-31 14:08:10 -0400644 break;
Geoff Lang70d0f492015-12-10 17:45:46 -0500645 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
646 mDebug.setOutputSynchronous(enabled);
647 break;
648 case GL_DEBUG_OUTPUT:
649 mDebug.setOutputEnabled(enabled);
650 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700651 case GL_FRAMEBUFFER_SRGB_EXT:
652 setFramebufferSRGB(enabled);
653 break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400654 default: UNREACHABLE();
655 }
656}
657
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700658bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400659{
660 switch (feature)
661 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300662 case GL_MULTISAMPLE_EXT: return isMultisamplingEnabled();
663 case GL_SAMPLE_ALPHA_TO_ONE_EXT: return isSampleAlphaToOneEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400664 case GL_CULL_FACE: return isCullFaceEnabled();
665 case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
666 case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
667 case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
668 case GL_SCISSOR_TEST: return isScissorTestEnabled();
669 case GL_STENCIL_TEST: return isStencilTestEnabled();
670 case GL_DEPTH_TEST: return isDepthTestEnabled();
671 case GL_BLEND: return isBlendEnabled();
672 case GL_DITHER: return isDitherEnabled();
Jamie Madillb4b53c52015-02-03 15:22:48 -0500673 case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400674 case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
Geoff Langb5e997f2016-12-06 10:55:34 -0500675 case GL_SAMPLE_MASK:
676 UNIMPLEMENTED();
677 return false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500678 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
679 return mDebug.isOutputSynchronous();
680 case GL_DEBUG_OUTPUT:
681 return mDebug.isOutputEnabled();
Geoff Langf41a7152016-09-19 15:11:17 -0400682 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
683 return isBindGeneratesResourceEnabled();
Geoff Langfeb8c682017-02-13 16:07:35 -0500684 case GL_CLIENT_ARRAYS_ANGLE:
685 return areClientArraysEnabled();
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700686 case GL_FRAMEBUFFER_SRGB_EXT:
687 return getFramebufferSRGB();
Jamie Madille08a1d32017-03-07 17:24:06 -0500688 case GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
689 return mRobustResourceInit;
Shannon Woods53a94a82014-06-24 15:20:36 -0400690 default: UNREACHABLE(); return false;
691 }
692}
693
694void State::setLineWidth(GLfloat width)
695{
696 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400697 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400698}
699
Geoff Lang4b3f4162015-04-16 13:22:05 -0400700float State::getLineWidth() const
701{
702 return mLineWidth;
703}
704
Shannon Woods53a94a82014-06-24 15:20:36 -0400705void State::setGenerateMipmapHint(GLenum hint)
706{
707 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400708 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400709}
710
711void State::setFragmentShaderDerivativeHint(GLenum hint)
712{
713 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400714 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400715 // TODO: Propagate the hint to shader translator so we can write
716 // ddx, ddx_coarse, or ddx_fine depending on the hint.
717 // Ignore for now. It is valid for implementations to ignore hint.
718}
719
Geoff Langf41a7152016-09-19 15:11:17 -0400720bool State::isBindGeneratesResourceEnabled() const
721{
722 return mBindGeneratesResource;
723}
724
Geoff Langfeb8c682017-02-13 16:07:35 -0500725bool State::areClientArraysEnabled() const
726{
727 return mClientArraysEnabled;
728}
729
Shannon Woods53a94a82014-06-24 15:20:36 -0400730void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
731{
732 mViewport.x = x;
733 mViewport.y = y;
734 mViewport.width = width;
735 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400736 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400737}
738
739const Rectangle &State::getViewport() const
740{
741 return mViewport;
742}
743
744void State::setActiveSampler(unsigned int active)
745{
746 mActiveSampler = active;
747}
748
749unsigned int State::getActiveSampler() const
750{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700751 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400752}
753
Jamie Madill4928b7c2017-06-20 12:57:39 -0400754void State::setSamplerTexture(const Context *context, GLenum type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400755{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400756 mSamplerTextures[type][mActiveSampler].set(context, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -0400757}
758
Jamie Madillc29968b2016-01-20 11:17:23 -0500759Texture *State::getTargetTexture(GLenum target) const
760{
761 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), target);
762}
763
Geoff Lang76b10c92014-09-05 16:28:14 -0400764Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400765{
Jamie Madill5864ac22015-01-12 14:43:07 -0500766 const auto it = mSamplerTextures.find(type);
767 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400768 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500769 return it->second[sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400770}
771
Geoff Lang76b10c92014-09-05 16:28:14 -0400772GLuint State::getSamplerTextureId(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400773{
Jamie Madill5864ac22015-01-12 14:43:07 -0500774 const auto it = mSamplerTextures.find(type);
775 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400776 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500777 return it->second[sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400778}
779
Jamie Madilla02315b2017-02-23 14:14:47 -0500780void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400781{
782 // Textures have a detach method on State rather than a simple
783 // removeBinding, because the zero/null texture objects are managed
784 // separately, and don't have to go through the Context's maps or
785 // the ResourceManager.
786
787 // [OpenGL ES 2.0.24] section 3.8 page 84:
788 // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
789 // rebound to texture object zero
790
Corentin Walleza2257da2016-04-19 16:43:12 -0400791 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400792 {
Corentin Walleza2257da2016-04-19 16:43:12 -0400793 GLenum textureType = bindingVec.first;
794 TextureBindingVector &textureVector = bindingVec.second;
Geoff Lang76b10c92014-09-05 16:28:14 -0400795 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400796 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400797 BindingPointer<Texture> &binding = textureVector[textureIdx];
798 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400799 {
Jamie Madill5864ac22015-01-12 14:43:07 -0500800 auto it = zeroTextures.find(textureType);
801 ASSERT(it != zeroTextures.end());
Jamie Madille6382c32014-11-07 15:05:26 -0500802 // Zero textures are the "default" textures instead of NULL
Jamie Madill4928b7c2017-06-20 12:57:39 -0400803 binding.set(context, it->second.get());
Shannon Woods53a94a82014-06-24 15:20:36 -0400804 }
805 }
806 }
807
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800808 for (auto &bindingImageUnit : mImageUnits)
809 {
810 if (bindingImageUnit.texture.id() == texture)
811 {
812 bindingImageUnit.texture.set(context, nullptr);
813 bindingImageUnit.level = 0;
814 bindingImageUnit.layered = false;
815 bindingImageUnit.layer = 0;
816 bindingImageUnit.access = GL_READ_ONLY;
817 bindingImageUnit.format = GL_R32UI;
818 break;
819 }
820 }
821
Shannon Woods53a94a82014-06-24 15:20:36 -0400822 // [OpenGL ES 2.0.24] section 4.4 page 112:
823 // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
824 // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
825 // image was attached in the currently bound framebuffer.
826
827 if (mReadFramebuffer)
828 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500829 mReadFramebuffer->detachTexture(context, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -0400830 }
831
832 if (mDrawFramebuffer)
833 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500834 mDrawFramebuffer->detachTexture(context, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -0400835 }
836}
837
Jamie Madill4928b7c2017-06-20 12:57:39 -0400838void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -0500839{
840 for (const auto &zeroTexture : zeroTextures)
841 {
842 auto &samplerTextureArray = mSamplerTextures[zeroTexture.first];
843
844 for (size_t textureUnit = 0; textureUnit < samplerTextureArray.size(); ++textureUnit)
845 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400846 samplerTextureArray[textureUnit].set(context, zeroTexture.second.get());
Jamie Madille6382c32014-11-07 15:05:26 -0500847 }
848 }
849}
850
Jamie Madill4928b7c2017-06-20 12:57:39 -0400851void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400852{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400853 mSamplers[textureUnit].set(context, sampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400854}
855
856GLuint State::getSamplerId(GLuint textureUnit) const
857{
Geoff Lang76b10c92014-09-05 16:28:14 -0400858 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400859 return mSamplers[textureUnit].id();
860}
861
862Sampler *State::getSampler(GLuint textureUnit) const
863{
864 return mSamplers[textureUnit].get();
865}
866
Jamie Madill4928b7c2017-06-20 12:57:39 -0400867void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400868{
869 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
870 // If a sampler object that is currently bound to one or more texture units is
871 // deleted, it is as though BindSampler is called once for each texture unit to
872 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Geoff Lang76b10c92014-09-05 16:28:14 -0400873 for (size_t textureUnit = 0; textureUnit < mSamplers.size(); textureUnit++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400874 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400875 BindingPointer<Sampler> &samplerBinding = mSamplers[textureUnit];
876 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400877 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400878 samplerBinding.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400879 }
880 }
881}
882
Jamie Madill4928b7c2017-06-20 12:57:39 -0400883void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400884{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400885 mRenderbuffer.set(context, renderbuffer);
Shannon Woods53a94a82014-06-24 15:20:36 -0400886}
887
888GLuint State::getRenderbufferId() const
889{
890 return mRenderbuffer.id();
891}
892
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700893Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400894{
895 return mRenderbuffer.get();
896}
897
Jamie Madilla02315b2017-02-23 14:14:47 -0500898void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400899{
900 // [OpenGL ES 2.0.24] section 4.4 page 109:
901 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
902 // had been executed with the target RENDERBUFFER and name of zero.
903
904 if (mRenderbuffer.id() == renderbuffer)
905 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400906 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400907 }
908
909 // [OpenGL ES 2.0.24] section 4.4 page 111:
910 // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
911 // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
912 // point to which this image was attached in the currently bound framebuffer.
913
914 Framebuffer *readFramebuffer = mReadFramebuffer;
915 Framebuffer *drawFramebuffer = mDrawFramebuffer;
916
917 if (readFramebuffer)
918 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500919 readFramebuffer->detachRenderbuffer(context, renderbuffer);
Shannon Woods53a94a82014-06-24 15:20:36 -0400920 }
921
922 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
923 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500924 drawFramebuffer->detachRenderbuffer(context, renderbuffer);
Shannon Woods53a94a82014-06-24 15:20:36 -0400925 }
926
927}
928
929void State::setReadFramebufferBinding(Framebuffer *framebuffer)
930{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500931 if (mReadFramebuffer == framebuffer)
932 return;
933
Shannon Woods53a94a82014-06-24 15:20:36 -0400934 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500935 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
936
937 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
938 {
939 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
940 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400941}
942
943void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
944{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500945 if (mDrawFramebuffer == framebuffer)
946 return;
947
Shannon Woods53a94a82014-06-24 15:20:36 -0400948 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500949 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
950
951 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
952 {
953 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
954 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400955}
956
957Framebuffer *State::getTargetFramebuffer(GLenum target) const
958{
959 switch (target)
960 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500961 case GL_READ_FRAMEBUFFER_ANGLE:
962 return mReadFramebuffer;
963 case GL_DRAW_FRAMEBUFFER_ANGLE:
964 case GL_FRAMEBUFFER:
965 return mDrawFramebuffer;
966 default:
967 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +0800968 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400969 }
970}
971
Jamie Madill51f40ec2016-06-15 14:06:00 -0400972Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400973{
974 return mReadFramebuffer;
975}
976
Jamie Madill51f40ec2016-06-15 14:06:00 -0400977Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400978{
979 return mDrawFramebuffer;
980}
981
982bool State::removeReadFramebufferBinding(GLuint framebuffer)
983{
Jamie Madill77a72f62015-04-14 11:18:32 -0400984 if (mReadFramebuffer != nullptr &&
985 mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400986 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500987 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400988 return true;
989 }
990
991 return false;
992}
993
994bool State::removeDrawFramebufferBinding(GLuint framebuffer)
995{
Jamie Madill77a72f62015-04-14 11:18:32 -0400996 if (mReadFramebuffer != nullptr &&
997 mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400998 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500999 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001000 return true;
1001 }
1002
1003 return false;
1004}
1005
1006void State::setVertexArrayBinding(VertexArray *vertexArray)
1007{
1008 mVertexArray = vertexArray;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001009 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001010
1011 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1012 {
1013 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1014 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001015}
1016
1017GLuint State::getVertexArrayId() const
1018{
Yunchao He4f285442017-04-21 12:15:49 +08001019 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001020 return mVertexArray->id();
1021}
1022
1023VertexArray *State::getVertexArray() const
1024{
Yunchao He4f285442017-04-21 12:15:49 +08001025 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001026 return mVertexArray;
1027}
1028
1029bool State::removeVertexArrayBinding(GLuint vertexArray)
1030{
1031 if (mVertexArray->id() == vertexArray)
1032 {
Yunchao Hed7297bf2017-04-19 15:27:10 +08001033 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001034 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001035 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001036 return true;
1037 }
1038
1039 return false;
1040}
1041
Jamie Madill4928b7c2017-06-20 12:57:39 -04001042void State::setElementArrayBuffer(const Context *context, Buffer *buffer)
Shao80957d92017-02-20 21:25:59 +08001043{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001044 getVertexArray()->setElementArrayBuffer(context, buffer);
Shao80957d92017-02-20 21:25:59 +08001045 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1046}
1047
Jamie Madill4928b7c2017-06-20 12:57:39 -04001048void State::bindVertexBuffer(const Context *context,
1049 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001050 Buffer *boundBuffer,
1051 GLintptr offset,
1052 GLsizei stride)
1053{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001054 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001055 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1056}
1057
1058void State::setVertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
1059{
1060 getVertexArray()->setVertexAttribBinding(attribIndex, bindingIndex);
1061 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1062}
1063
1064void State::setVertexAttribFormat(GLuint attribIndex,
1065 GLint size,
1066 GLenum type,
1067 bool normalized,
1068 bool pureInteger,
1069 GLuint relativeOffset)
1070{
1071 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1072 relativeOffset);
1073 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1074}
1075
1076void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1077{
1078 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1079 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1080}
1081
Jamie Madill6c1f6712017-02-14 19:08:04 -05001082void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001083{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001084 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001085 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001086 if (mProgram)
1087 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001088 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001089 }
1090
1091 mProgram = newProgram;
1092
1093 if (mProgram)
1094 {
1095 newProgram->addRef();
1096 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001097 }
1098}
1099
Geoff Lang7dd2e102014-11-10 15:19:26 -05001100Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001101{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001102 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001103}
1104
Jamie Madill4928b7c2017-06-20 12:57:39 -04001105void State::setTransformFeedbackBinding(const Context *context,
1106 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001107{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001108 mTransformFeedback.set(context, transformFeedback);
Shannon Woods53a94a82014-06-24 15:20:36 -04001109}
1110
1111TransformFeedback *State::getCurrentTransformFeedback() const
1112{
1113 return mTransformFeedback.get();
1114}
1115
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001116bool State::isTransformFeedbackActiveUnpaused() const
1117{
1118 gl::TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001119 return curTransformFeedback && curTransformFeedback->isActive() && !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001120}
1121
Jamie Madill4928b7c2017-06-20 12:57:39 -04001122bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001123{
1124 if (mTransformFeedback.id() == transformFeedback)
1125 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001126 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001127 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001128 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001129
1130 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001131}
1132
Olli Etuahobbf1c102016-06-28 13:31:33 +03001133bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001134{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001135 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001136 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001137 const Query *query = iter.second.get();
1138 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001139 {
1140 return true;
1141 }
1142 }
1143
1144 return false;
1145}
1146
1147bool State::isQueryActive(Query *query) const
1148{
1149 for (auto &iter : mActiveQueries)
1150 {
1151 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001152 {
1153 return true;
1154 }
1155 }
1156
1157 return false;
1158}
1159
Jamie Madill4928b7c2017-06-20 12:57:39 -04001160void State::setActiveQuery(const Context *context, GLenum target, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001161{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001162 mActiveQueries[target].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001163}
1164
1165GLuint State::getActiveQueryId(GLenum target) const
1166{
1167 const Query *query = getActiveQuery(target);
1168 return (query ? query->id() : 0u);
1169}
1170
1171Query *State::getActiveQuery(GLenum target) const
1172{
Jamie Madill5864ac22015-01-12 14:43:07 -05001173 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001174
Jamie Madill5864ac22015-01-12 14:43:07 -05001175 // All query types should already exist in the activeQueries map
1176 ASSERT(it != mActiveQueries.end());
1177
1178 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001179}
1180
Jamie Madill4928b7c2017-06-20 12:57:39 -04001181void State::setArrayBufferBinding(const Context *context, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001182{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001183 mArrayBuffer.set(context, buffer);
Shannon Woods53a94a82014-06-24 15:20:36 -04001184}
1185
1186GLuint State::getArrayBufferId() const
1187{
1188 return mArrayBuffer.id();
1189}
1190
Jamie Madill4928b7c2017-06-20 12:57:39 -04001191void State::setDrawIndirectBufferBinding(const Context *context, Buffer *buffer)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001192{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001193 mDrawIndirectBuffer.set(context, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001194 mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
1195}
1196
Jamie Madill4928b7c2017-06-20 12:57:39 -04001197void State::setGenericUniformBufferBinding(const Context *context, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001198{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001199 mGenericUniformBuffer.set(context, buffer);
Shannon Woods53a94a82014-06-24 15:20:36 -04001200}
1201
Jamie Madill4928b7c2017-06-20 12:57:39 -04001202void State::setIndexedUniformBufferBinding(const Context *context,
1203 GLuint index,
1204 Buffer *buffer,
1205 GLintptr offset,
1206 GLsizeiptr size)
Shannon Woods53a94a82014-06-24 15:20:36 -04001207{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001208 mUniformBuffers[index].set(context, buffer, offset, size);
Shannon Woods53a94a82014-06-24 15:20:36 -04001209}
1210
Geoff Lang5d124a62015-09-15 13:03:27 -04001211const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001212{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001213 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001214 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001215}
1216
Jamie Madill4928b7c2017-06-20 12:57:39 -04001217void State::setGenericAtomicCounterBufferBinding(const Context *context, Buffer *buffer)
Jiajia Qin6eafb042016-12-27 17:04:07 +08001218{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001219 mGenericAtomicCounterBuffer.set(context, buffer);
Jiajia Qin6eafb042016-12-27 17:04:07 +08001220}
1221
Jamie Madill4928b7c2017-06-20 12:57:39 -04001222void State::setIndexedAtomicCounterBufferBinding(const Context *context,
1223 GLuint index,
Jiajia Qin6eafb042016-12-27 17:04:07 +08001224 Buffer *buffer,
1225 GLintptr offset,
1226 GLsizeiptr size)
1227{
1228 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
Jamie Madill4928b7c2017-06-20 12:57:39 -04001229 mAtomicCounterBuffers[index].set(context, buffer, offset, size);
Jiajia Qin6eafb042016-12-27 17:04:07 +08001230}
1231
1232const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1233{
1234 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1235 return mAtomicCounterBuffers[index];
1236}
1237
Jamie Madill4928b7c2017-06-20 12:57:39 -04001238void State::setGenericShaderStorageBufferBinding(const Context *context, Buffer *buffer)
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001239{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001240 mGenericShaderStorageBuffer.set(context, buffer);
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001241}
1242
Jamie Madill4928b7c2017-06-20 12:57:39 -04001243void State::setIndexedShaderStorageBufferBinding(const Context *context,
1244 GLuint index,
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001245 Buffer *buffer,
1246 GLintptr offset,
1247 GLsizeiptr size)
1248{
1249 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
Jamie Madill4928b7c2017-06-20 12:57:39 -04001250 mShaderStorageBuffers[index].set(context, buffer, offset, size);
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001251}
1252
1253const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1254{
1255 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1256 return mShaderStorageBuffers[index];
1257}
1258
Jamie Madill4928b7c2017-06-20 12:57:39 -04001259void State::setCopyReadBufferBinding(const Context *context, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001260{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001261 mCopyReadBuffer.set(context, buffer);
Shannon Woods53a94a82014-06-24 15:20:36 -04001262}
1263
Jamie Madill4928b7c2017-06-20 12:57:39 -04001264void State::setCopyWriteBufferBinding(const Context *context, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001265{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001266 mCopyWriteBuffer.set(context, buffer);
Shannon Woods53a94a82014-06-24 15:20:36 -04001267}
1268
Jamie Madill4928b7c2017-06-20 12:57:39 -04001269void State::setPixelPackBufferBinding(const Context *context, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001270{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001271 mPack.pixelBuffer.set(context, buffer);
Corentin Wallezbbd663a2016-04-20 17:49:17 -04001272 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001273}
1274
Jamie Madill4928b7c2017-06-20 12:57:39 -04001275void State::setPixelUnpackBufferBinding(const Context *context, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001276{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001277 mUnpack.pixelBuffer.set(context, buffer);
Corentin Wallezbbd663a2016-04-20 17:49:17 -04001278 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001279}
1280
1281Buffer *State::getTargetBuffer(GLenum target) const
1282{
1283 switch (target)
1284 {
1285 case GL_ARRAY_BUFFER: return mArrayBuffer.get();
1286 case GL_COPY_READ_BUFFER: return mCopyReadBuffer.get();
1287 case GL_COPY_WRITE_BUFFER: return mCopyWriteBuffer.get();
Jamie Madill8e344942015-07-09 14:22:07 -04001288 case GL_ELEMENT_ARRAY_BUFFER: return getVertexArray()->getElementArrayBuffer().get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001289 case GL_PIXEL_PACK_BUFFER: return mPack.pixelBuffer.get();
1290 case GL_PIXEL_UNPACK_BUFFER: return mUnpack.pixelBuffer.get();
Geoff Lang045536b2015-03-27 15:17:18 -04001291 case GL_TRANSFORM_FEEDBACK_BUFFER: return mTransformFeedback->getGenericBuffer().get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001292 case GL_UNIFORM_BUFFER: return mGenericUniformBuffer.get();
Geoff Langb5e997f2016-12-06 10:55:34 -05001293 case GL_ATOMIC_COUNTER_BUFFER:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001294 return mGenericAtomicCounterBuffer.get();
Geoff Langb5e997f2016-12-06 10:55:34 -05001295 case GL_SHADER_STORAGE_BUFFER:
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001296 return mGenericShaderStorageBuffer.get();
Geoff Langb5e997f2016-12-06 10:55:34 -05001297 case GL_DRAW_INDIRECT_BUFFER:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001298 return mDrawIndirectBuffer.get();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001299 default:
1300 UNREACHABLE();
1301 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001302 }
1303}
1304
Jamie Madill4928b7c2017-06-20 12:57:39 -04001305void State::detachBuffer(const Context *context, GLuint bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001306{
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001307 BindingPointer<Buffer> *buffers[] = {
1308 &mArrayBuffer, &mGenericAtomicCounterBuffer, &mCopyReadBuffer,
1309 &mCopyWriteBuffer, &mDrawIndirectBuffer, &mPack.pixelBuffer,
1310 &mUnpack.pixelBuffer, &mGenericUniformBuffer, &mGenericShaderStorageBuffer};
Yuly Novikov5807a532015-12-03 13:01:22 -05001311 for (auto buffer : buffers)
1312 {
1313 if (buffer->id() == bufferName)
1314 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001315 buffer->set(context, nullptr);
Yuly Novikov5807a532015-12-03 13:01:22 -05001316 }
1317 }
1318
1319 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1320 if (curTransformFeedback)
1321 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001322 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001323 }
1324
Jamie Madill4928b7c2017-06-20 12:57:39 -04001325 getVertexArray()->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001326}
1327
Shannon Woods53a94a82014-06-24 15:20:36 -04001328void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1329{
1330 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001331 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001332}
1333
1334void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1335{
Shannon Woods23e05002014-09-22 19:07:27 -04001336 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001337 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001338 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001339}
1340
1341void State::setVertexAttribu(GLuint index, const GLuint values[4])
1342{
Shannon Woods23e05002014-09-22 19:07:27 -04001343 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001344 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001345 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001346}
1347
1348void State::setVertexAttribi(GLuint index, const GLint values[4])
1349{
Shannon Woods23e05002014-09-22 19:07:27 -04001350 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001351 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001352 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001353}
1354
Jamie Madill4928b7c2017-06-20 12:57:39 -04001355void State::setVertexAttribState(const Context *context,
1356 unsigned int attribNum,
Jamie Madill0b9e9032015-08-17 11:51:52 +00001357 Buffer *boundBuffer,
1358 GLint size,
1359 GLenum type,
1360 bool normalized,
1361 bool pureInteger,
1362 GLsizei stride,
1363 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001364{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001365 getVertexArray()->setAttributeState(context, attribNum, boundBuffer, size, type, normalized,
1366 pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001367 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001368}
1369
1370void State::setVertexAttribDivisor(GLuint index, GLuint divisor)
1371{
1372 getVertexArray()->setVertexAttribDivisor(index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001373 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001374}
1375
Jamie Madill6de51852017-04-12 09:53:01 -04001376const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001377{
Jamie Madill6de51852017-04-12 09:53:01 -04001378 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001379 return mVertexAttribCurrentValues[attribNum];
1380}
1381
Shannon Woods53a94a82014-06-24 15:20:36 -04001382const void *State::getVertexAttribPointer(unsigned int attribNum) const
1383{
1384 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1385}
1386
1387void State::setPackAlignment(GLint alignment)
1388{
1389 mPack.alignment = alignment;
Jamie Madill1b94d432015-08-07 13:23:23 -04001390 mDirtyBits.set(DIRTY_BIT_PACK_ALIGNMENT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001391}
1392
1393GLint State::getPackAlignment() const
1394{
1395 return mPack.alignment;
1396}
1397
1398void State::setPackReverseRowOrder(bool reverseRowOrder)
1399{
1400 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madill1b94d432015-08-07 13:23:23 -04001401 mDirtyBits.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001402}
1403
1404bool State::getPackReverseRowOrder() const
1405{
1406 return mPack.reverseRowOrder;
1407}
1408
Minmin Gongadff67b2015-10-14 10:34:45 -04001409void State::setPackRowLength(GLint rowLength)
1410{
1411 mPack.rowLength = rowLength;
1412 mDirtyBits.set(DIRTY_BIT_PACK_ROW_LENGTH);
1413}
1414
1415GLint State::getPackRowLength() const
1416{
1417 return mPack.rowLength;
1418}
1419
1420void State::setPackSkipRows(GLint skipRows)
1421{
1422 mPack.skipRows = skipRows;
1423 mDirtyBits.set(DIRTY_BIT_PACK_SKIP_ROWS);
1424}
1425
1426GLint State::getPackSkipRows() const
1427{
1428 return mPack.skipRows;
1429}
1430
1431void State::setPackSkipPixels(GLint skipPixels)
1432{
1433 mPack.skipPixels = skipPixels;
1434 mDirtyBits.set(DIRTY_BIT_PACK_SKIP_PIXELS);
1435}
1436
1437GLint State::getPackSkipPixels() const
1438{
1439 return mPack.skipPixels;
1440}
1441
Shannon Woods53a94a82014-06-24 15:20:36 -04001442const PixelPackState &State::getPackState() const
1443{
1444 return mPack;
1445}
1446
Jamie Madill87de3622015-03-16 10:41:44 -04001447PixelPackState &State::getPackState()
1448{
1449 return mPack;
1450}
1451
Shannon Woods53a94a82014-06-24 15:20:36 -04001452void State::setUnpackAlignment(GLint alignment)
1453{
1454 mUnpack.alignment = alignment;
Jamie Madill1b94d432015-08-07 13:23:23 -04001455 mDirtyBits.set(DIRTY_BIT_UNPACK_ALIGNMENT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001456}
1457
1458GLint State::getUnpackAlignment() const
1459{
1460 return mUnpack.alignment;
1461}
1462
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001463void State::setUnpackRowLength(GLint rowLength)
1464{
1465 mUnpack.rowLength = rowLength;
Jamie Madill1b94d432015-08-07 13:23:23 -04001466 mDirtyBits.set(DIRTY_BIT_UNPACK_ROW_LENGTH);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001467}
1468
1469GLint State::getUnpackRowLength() const
1470{
1471 return mUnpack.rowLength;
1472}
1473
Minmin Gongadff67b2015-10-14 10:34:45 -04001474void State::setUnpackImageHeight(GLint imageHeight)
1475{
1476 mUnpack.imageHeight = imageHeight;
1477 mDirtyBits.set(DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
1478}
1479
1480GLint State::getUnpackImageHeight() const
1481{
1482 return mUnpack.imageHeight;
1483}
1484
1485void State::setUnpackSkipImages(GLint skipImages)
1486{
1487 mUnpack.skipImages = skipImages;
1488 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_IMAGES);
1489}
1490
1491GLint State::getUnpackSkipImages() const
1492{
1493 return mUnpack.skipImages;
1494}
1495
1496void State::setUnpackSkipRows(GLint skipRows)
1497{
1498 mUnpack.skipRows = skipRows;
1499 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_ROWS);
1500}
1501
1502GLint State::getUnpackSkipRows() const
1503{
1504 return mUnpack.skipRows;
1505}
1506
1507void State::setUnpackSkipPixels(GLint skipPixels)
1508{
1509 mUnpack.skipPixels = skipPixels;
1510 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_PIXELS);
1511}
1512
1513GLint State::getUnpackSkipPixels() const
1514{
1515 return mUnpack.skipPixels;
1516}
1517
Shannon Woods53a94a82014-06-24 15:20:36 -04001518const PixelUnpackState &State::getUnpackState() const
1519{
1520 return mUnpack;
1521}
1522
Jamie Madill67102f02015-03-16 10:41:42 -04001523PixelUnpackState &State::getUnpackState()
1524{
1525 return mUnpack;
1526}
1527
Geoff Lang70d0f492015-12-10 17:45:46 -05001528const Debug &State::getDebug() const
1529{
1530 return mDebug;
1531}
1532
1533Debug &State::getDebug()
1534{
1535 return mDebug;
1536}
1537
Sami Väisänena797e062016-05-12 15:23:40 +03001538void State::setCoverageModulation(GLenum components)
1539{
1540 mCoverageModulation = components;
1541 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1542}
1543
1544GLenum State::getCoverageModulation() const
1545{
1546 return mCoverageModulation;
1547}
1548
Sami Väisänene45e53b2016-05-25 10:36:04 +03001549void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1550{
1551 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1552 {
1553 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1554 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1555 }
1556 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1557 {
1558 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1559 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1560 }
1561 else
1562 {
1563 UNREACHABLE();
1564 }
1565}
1566
1567const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1568{
1569 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1570 {
1571 return mPathMatrixMV;
1572 }
1573 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1574 {
1575 return mPathMatrixProj;
1576 }
1577
1578 UNREACHABLE();
1579 return nullptr;
1580}
1581
1582void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1583{
1584 mPathStencilFunc = func;
1585 mPathStencilRef = ref;
1586 mPathStencilMask = mask;
1587 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1588}
1589
1590GLenum State::getPathStencilFunc() const
1591{
1592 return mPathStencilFunc;
1593}
1594
1595GLint State::getPathStencilRef() const
1596{
1597 return mPathStencilRef;
1598}
1599
1600GLuint State::getPathStencilMask() const
1601{
1602 return mPathStencilMask;
1603}
1604
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001605void State::setFramebufferSRGB(bool sRGB)
1606{
1607 mFramebufferSRGB = sRGB;
1608 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1609}
1610
1611bool State::getFramebufferSRGB() const
1612{
1613 return mFramebufferSRGB;
1614}
1615
Shannon Woods53a94a82014-06-24 15:20:36 -04001616void State::getBooleanv(GLenum pname, GLboolean *params)
1617{
1618 switch (pname)
1619 {
1620 case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
1621 case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
1622 case GL_COLOR_WRITEMASK:
1623 params[0] = mBlend.colorMaskRed;
1624 params[1] = mBlend.colorMaskGreen;
1625 params[2] = mBlend.colorMaskBlue;
1626 params[3] = mBlend.colorMaskAlpha;
1627 break;
1628 case GL_CULL_FACE: *params = mRasterizer.cullFace; break;
1629 case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
1630 case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
1631 case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
1632 case GL_SCISSOR_TEST: *params = mScissorTest; break;
1633 case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
1634 case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
1635 case GL_BLEND: *params = mBlend.blend; break;
1636 case GL_DITHER: *params = mBlend.dither; break;
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001637 case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE; break;
1638 case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE; break;
Jamie Madille2cd53d2015-10-27 11:15:46 -04001639 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1640 *params = mPrimitiveRestart;
1641 break;
Geoff Langab831f02015-12-01 09:39:10 -05001642 case GL_RASTERIZER_DISCARD:
1643 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1644 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001645 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1646 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1647 break;
1648 case GL_DEBUG_OUTPUT:
1649 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1650 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001651 case GL_MULTISAMPLE_EXT:
1652 *params = mMultiSampling;
1653 break;
1654 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1655 *params = mSampleAlphaToOne;
1656 break;
Geoff Langf41a7152016-09-19 15:11:17 -04001657 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1658 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1659 break;
Geoff Langfeb8c682017-02-13 16:07:35 -05001660 case GL_CLIENT_ARRAYS_ANGLE:
1661 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1662 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001663 case GL_FRAMEBUFFER_SRGB_EXT:
1664 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1665 break;
Jamie Madille08a1d32017-03-07 17:24:06 -05001666 case GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1667 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1668 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001669 default:
1670 UNREACHABLE();
1671 break;
1672 }
1673}
1674
1675void State::getFloatv(GLenum pname, GLfloat *params)
1676{
1677 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1678 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1679 // GetIntegerv as its native query function. As it would require conversion in any
1680 // case, this should make no difference to the calling application.
1681 switch (pname)
1682 {
1683 case GL_LINE_WIDTH: *params = mLineWidth; break;
1684 case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
1685 case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
1686 case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
1687 case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
1688 case GL_DEPTH_RANGE:
1689 params[0] = mNearZ;
1690 params[1] = mFarZ;
1691 break;
1692 case GL_COLOR_CLEAR_VALUE:
1693 params[0] = mColorClearValue.red;
1694 params[1] = mColorClearValue.green;
1695 params[2] = mColorClearValue.blue;
1696 params[3] = mColorClearValue.alpha;
1697 break;
1698 case GL_BLEND_COLOR:
1699 params[0] = mBlendColor.red;
1700 params[1] = mBlendColor.green;
1701 params[2] = mBlendColor.blue;
1702 params[3] = mBlendColor.alpha;
1703 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001704 case GL_MULTISAMPLE_EXT:
1705 *params = static_cast<GLfloat>(mMultiSampling);
1706 break;
1707 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1708 *params = static_cast<GLfloat>(mSampleAlphaToOne);
Sami Väisänena797e062016-05-12 15:23:40 +03001709 case GL_COVERAGE_MODULATION_CHROMIUM:
Jamie Madille2e406c2016-06-02 13:04:10 -04001710 params[0] = static_cast<GLfloat>(mCoverageModulation);
1711 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001712 default:
1713 UNREACHABLE();
1714 break;
1715 }
1716}
1717
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001718void State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001719{
1720 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1721 {
1722 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001723 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001724 Framebuffer *framebuffer = mDrawFramebuffer;
1725 *params = framebuffer->getDrawBufferState(colorAttachment);
1726 return;
1727 }
1728
1729 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1730 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1731 // GetIntegerv as its native query function. As it would require conversion in any
1732 // case, this should make no difference to the calling application. You may find it in
1733 // State::getFloatv.
1734 switch (pname)
1735 {
1736 case GL_ARRAY_BUFFER_BINDING: *params = mArrayBuffer.id(); break;
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001737 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1738 *params = mDrawIndirectBuffer.id();
1739 break;
Jamie Madill8e344942015-07-09 14:22:07 -04001740 case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = getVertexArray()->getElementArrayBuffer().id(); break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001741 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1742 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
1743 case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
1744 case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
1745 case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
Geoff Lang7dd2e102014-11-10 15:19:26 -05001746 case GL_CURRENT_PROGRAM: *params = mProgram ? mProgram->id() : 0; break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001747 case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
1748 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001749 case GL_PACK_ROW_LENGTH:
1750 *params = mPack.rowLength;
1751 break;
1752 case GL_PACK_SKIP_ROWS:
1753 *params = mPack.skipRows;
1754 break;
1755 case GL_PACK_SKIP_PIXELS:
1756 *params = mPack.skipPixels;
1757 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001758 case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001759 case GL_UNPACK_ROW_LENGTH: *params = mUnpack.rowLength; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001760 case GL_UNPACK_IMAGE_HEIGHT:
1761 *params = mUnpack.imageHeight;
1762 break;
1763 case GL_UNPACK_SKIP_IMAGES:
1764 *params = mUnpack.skipImages;
1765 break;
1766 case GL_UNPACK_SKIP_ROWS:
1767 *params = mUnpack.skipRows;
1768 break;
1769 case GL_UNPACK_SKIP_PIXELS:
1770 *params = mUnpack.skipPixels;
1771 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001772 case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
1773 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001774 case GL_ACTIVE_TEXTURE:
1775 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
1776 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001777 case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
1778 case GL_STENCIL_REF: *params = mStencilRef; break;
1779 case GL_STENCIL_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilMask); break;
1780 case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
1781 case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
1782 case GL_STENCIL_BACK_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilBackMask); break;
1783 case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
1784 case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
1785 case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
1786 case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
1787 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
1788 case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
1789 case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
1790 case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
1791 case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
1792 case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
1793 case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
1794 case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
1795 case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
1796 case GL_STENCIL_WRITEMASK: *params = clampToInt(mDepthStencil.stencilWritemask); break;
1797 case GL_STENCIL_BACK_WRITEMASK: *params = clampToInt(mDepthStencil.stencilBackWritemask); break;
1798 case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
Jamie Madill4928b7c2017-06-20 12:57:39 -04001799 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
1800 *params = mReadFramebuffer->getImplementationColorReadType(context);
1801 break;
1802 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
1803 *params = mReadFramebuffer->getImplementationColorReadFormat(context);
1804 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001805 case GL_SAMPLE_BUFFERS:
1806 case GL_SAMPLES:
1807 {
1808 gl::Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001809 if (framebuffer->checkStatus(context) == GL_FRAMEBUFFER_COMPLETE)
Shannon Woods53a94a82014-06-24 15:20:36 -04001810 {
1811 switch (pname)
1812 {
1813 case GL_SAMPLE_BUFFERS:
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001814 if (framebuffer->getSamples(context) != 0)
1815 {
1816 *params = 1;
Shannon Woods53a94a82014-06-24 15:20:36 -04001817 }
1818 else
1819 {
1820 *params = 0;
1821 }
1822 break;
1823 case GL_SAMPLES:
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001824 *params = framebuffer->getSamples(context);
1825 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001826 }
1827 }
1828 else
1829 {
1830 *params = 0;
1831 }
1832 }
1833 break;
1834 case GL_VIEWPORT:
1835 params[0] = mViewport.x;
1836 params[1] = mViewport.y;
1837 params[2] = mViewport.width;
1838 params[3] = mViewport.height;
1839 break;
1840 case GL_SCISSOR_BOX:
1841 params[0] = mScissor.x;
1842 params[1] = mScissor.y;
1843 params[2] = mScissor.width;
1844 params[3] = mScissor.height;
1845 break;
1846 case GL_CULL_FACE_MODE: *params = mRasterizer.cullMode; break;
1847 case GL_FRONT_FACE: *params = mRasterizer.frontFace; break;
1848 case GL_RED_BITS:
1849 case GL_GREEN_BITS:
1850 case GL_BLUE_BITS:
1851 case GL_ALPHA_BITS:
1852 {
1853 gl::Framebuffer *framebuffer = getDrawFramebuffer();
Jamie Madillb6bda4a2015-04-20 12:53:26 -04001854 const gl::FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001855
1856 if (colorbuffer)
1857 {
1858 switch (pname)
1859 {
1860 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1861 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1862 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1863 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1864 }
1865 }
1866 else
1867 {
1868 *params = 0;
1869 }
1870 }
1871 break;
1872 case GL_DEPTH_BITS:
1873 {
Jamie Madille3ef7152015-04-28 16:55:17 +00001874 const gl::Framebuffer *framebuffer = getDrawFramebuffer();
1875 const gl::FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001876
1877 if (depthbuffer)
1878 {
1879 *params = depthbuffer->getDepthSize();
1880 }
1881 else
1882 {
1883 *params = 0;
1884 }
1885 }
1886 break;
1887 case GL_STENCIL_BITS:
1888 {
Jamie Madille3ef7152015-04-28 16:55:17 +00001889 const gl::Framebuffer *framebuffer = getDrawFramebuffer();
1890 const gl::FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001891
1892 if (stencilbuffer)
1893 {
1894 *params = stencilbuffer->getStencilSize();
1895 }
1896 else
1897 {
1898 *params = 0;
1899 }
1900 }
1901 break;
1902 case GL_TEXTURE_BINDING_2D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001903 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001904 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001905 break;
1906 case GL_TEXTURE_BINDING_CUBE_MAP:
Shannon Woods2df6a602014-09-26 16:12:07 -04001907 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001908 *params =
1909 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_CUBE_MAP);
Shannon Woods53a94a82014-06-24 15:20:36 -04001910 break;
1911 case GL_TEXTURE_BINDING_3D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001912 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001913 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_3D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001914 break;
1915 case GL_TEXTURE_BINDING_2D_ARRAY:
Shannon Woods2df6a602014-09-26 16:12:07 -04001916 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001917 *params =
1918 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001919 break;
John Bauman18319182016-09-28 14:22:27 -07001920 case GL_TEXTURE_BINDING_EXTERNAL_OES:
1921 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1922 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
1923 GL_TEXTURE_EXTERNAL_OES);
1924 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001925 case GL_UNIFORM_BUFFER_BINDING:
1926 *params = mGenericUniformBuffer.id();
1927 break;
Frank Henigman22581ff2015-11-06 14:25:54 -05001928 case GL_TRANSFORM_FEEDBACK_BINDING:
Frank Henigmanb0f0b812015-11-21 17:49:29 -05001929 *params = mTransformFeedback.id();
Frank Henigman22581ff2015-11-06 14:25:54 -05001930 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001931 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Geoff Lang045536b2015-03-27 15:17:18 -04001932 *params = mTransformFeedback->getGenericBuffer().id();
Shannon Woods53a94a82014-06-24 15:20:36 -04001933 break;
1934 case GL_COPY_READ_BUFFER_BINDING:
1935 *params = mCopyReadBuffer.id();
1936 break;
1937 case GL_COPY_WRITE_BUFFER_BINDING:
1938 *params = mCopyWriteBuffer.id();
1939 break;
1940 case GL_PIXEL_PACK_BUFFER_BINDING:
1941 *params = mPack.pixelBuffer.id();
1942 break;
1943 case GL_PIXEL_UNPACK_BUFFER_BINDING:
1944 *params = mUnpack.pixelBuffer.id();
1945 break;
Olli Etuaho86821db2016-03-04 12:05:47 +02001946 case GL_READ_BUFFER:
1947 *params = mReadFramebuffer->getReadBufferState();
1948 break;
1949 case GL_SAMPLER_BINDING:
1950 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1951 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
1952 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001953 case GL_DEBUG_LOGGED_MESSAGES:
1954 *params = static_cast<GLint>(mDebug.getMessageCount());
1955 break;
1956 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
1957 *params = static_cast<GLint>(mDebug.getNextMessageLength());
1958 break;
1959 case GL_DEBUG_GROUP_STACK_DEPTH:
1960 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
1961 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001962 case GL_MULTISAMPLE_EXT:
1963 *params = static_cast<GLint>(mMultiSampling);
1964 break;
1965 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1966 *params = static_cast<GLint>(mSampleAlphaToOne);
Sami Väisänena797e062016-05-12 15:23:40 +03001967 case GL_COVERAGE_MODULATION_CHROMIUM:
1968 *params = static_cast<GLint>(mCoverageModulation);
Sami Väisänen74c23472016-05-09 17:30:30 +03001969 break;
Jiajia Qin6eafb042016-12-27 17:04:07 +08001970 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1971 *params = mGenericAtomicCounterBuffer.id();
1972 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001973 case GL_SHADER_STORAGE_BUFFER_BINDING:
1974 *params = mGenericShaderStorageBuffer.id();
1975 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001976 default:
1977 UNREACHABLE();
1978 break;
1979 }
1980}
1981
Geoff Lang70d0f492015-12-10 17:45:46 -05001982void State::getPointerv(GLenum pname, void **params) const
1983{
1984 switch (pname)
1985 {
1986 case GL_DEBUG_CALLBACK_FUNCTION:
1987 *params = reinterpret_cast<void *>(mDebug.getCallback());
1988 break;
1989 case GL_DEBUG_CALLBACK_USER_PARAM:
1990 *params = const_cast<void *>(mDebug.getUserParam());
1991 break;
1992 default:
1993 UNREACHABLE();
1994 break;
1995 }
1996}
1997
Martin Radev66fb8202016-07-28 11:45:20 +03001998void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04001999{
2000 switch (target)
2001 {
2002 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002003 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2004 *data = mTransformFeedback->getIndexedBuffer(index).id();
2005 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002006 case GL_UNIFORM_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002007 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2008 *data = mUniformBuffers[index].id();
2009 break;
2010 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2011 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2012 *data = mAtomicCounterBuffers[index].id();
2013 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002014 case GL_SHADER_STORAGE_BUFFER_BINDING:
2015 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2016 *data = mShaderStorageBuffers[index].id();
2017 break;
Shao80957d92017-02-20 21:25:59 +08002018 case GL_VERTEX_BINDING_BUFFER:
2019 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002020 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
Shao80957d92017-02-20 21:25:59 +08002021 break;
2022 case GL_VERTEX_BINDING_DIVISOR:
2023 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002024 *data = mVertexArray->getVertexBinding(index).getDivisor();
Shao80957d92017-02-20 21:25:59 +08002025 break;
2026 case GL_VERTEX_BINDING_OFFSET:
2027 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002028 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
Shao80957d92017-02-20 21:25:59 +08002029 break;
2030 case GL_VERTEX_BINDING_STRIDE:
2031 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002032 *data = mVertexArray->getVertexBinding(index).getStride();
Shao80957d92017-02-20 21:25:59 +08002033 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002034 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002035 UNREACHABLE();
2036 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002037 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002038}
2039
Martin Radev66fb8202016-07-28 11:45:20 +03002040void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002041{
2042 switch (target)
2043 {
2044 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002045 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2046 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2047 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002048 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002049 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2050 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2051 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002052 case GL_UNIFORM_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002053 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2054 *data = mUniformBuffers[index].getOffset();
2055 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002056 case GL_UNIFORM_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002057 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2058 *data = mUniformBuffers[index].getSize();
2059 break;
2060 case GL_ATOMIC_COUNTER_BUFFER_START:
2061 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2062 *data = mAtomicCounterBuffers[index].getOffset();
2063 break;
2064 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2065 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2066 *data = mAtomicCounterBuffers[index].getSize();
2067 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002068 case GL_SHADER_STORAGE_BUFFER_START:
2069 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2070 *data = mShaderStorageBuffers[index].getOffset();
2071 break;
2072 case GL_SHADER_STORAGE_BUFFER_SIZE:
2073 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2074 *data = mShaderStorageBuffers[index].getSize();
2075 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002076 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002077 UNREACHABLE();
2078 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002079 }
Martin Radev66fb8202016-07-28 11:45:20 +03002080}
Shannon Woods53a94a82014-06-24 15:20:36 -04002081
Martin Radev66fb8202016-07-28 11:45:20 +03002082void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2083{
2084 UNREACHABLE();
Shannon Woods53a94a82014-06-24 15:20:36 -04002085}
2086
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002087bool State::hasMappedBuffer(GLenum target) const
2088{
2089 if (target == GL_ARRAY_BUFFER)
2090 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002091 const VertexArray *vao = getVertexArray();
Jamie Madilleea3a6e2015-04-15 10:02:48 -04002092 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002093 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madill8e344942015-07-09 14:22:07 -04002094 size_t maxEnabledAttrib = vao->getMaxEnabledAttribute();
Jamie Madillaebf9dd2015-04-28 12:39:07 -04002095 for (size_t attribIndex = 0; attribIndex < maxEnabledAttrib; attribIndex++)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002096 {
Jamie Madilleea3a6e2015-04-15 10:02:48 -04002097 const gl::VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Martin Radevdd5f27e2017-06-07 10:17:09 +03002098 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002099 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
2100 {
2101 return true;
2102 }
2103 }
2104
2105 return false;
2106 }
2107 else
2108 {
2109 Buffer *buffer = getTargetBuffer(target);
2110 return (buffer && buffer->isMapped());
2111 }
2112}
2113
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002114void State::syncDirtyObjects(const Context *context)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002115{
2116 if (!mDirtyObjects.any())
2117 return;
2118
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002119 syncDirtyObjects(context, mDirtyObjects);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002120}
2121
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002122void State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002123{
Jamie Madill6de51852017-04-12 09:53:01 -04002124 for (auto dirtyObject : bitset)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002125 {
2126 switch (dirtyObject)
2127 {
2128 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002129 ASSERT(mReadFramebuffer);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002130 mReadFramebuffer->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002131 break;
2132 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002133 ASSERT(mDrawFramebuffer);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002134 mDrawFramebuffer->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002135 break;
2136 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002137 ASSERT(mVertexArray);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002138 mVertexArray->syncImplState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002139 break;
2140 case DIRTY_OBJECT_PROGRAM:
2141 // TODO(jmadill): implement this
2142 break;
2143 default:
2144 UNREACHABLE();
2145 break;
2146 }
2147 }
2148
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002149 mDirtyObjects &= ~bitset;
2150}
2151
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002152void State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002153{
2154 DirtyObjects localSet;
2155
2156 switch (target)
2157 {
2158 case GL_READ_FRAMEBUFFER:
2159 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2160 break;
2161 case GL_DRAW_FRAMEBUFFER:
2162 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2163 break;
2164 case GL_FRAMEBUFFER:
2165 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2166 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2167 break;
2168 case GL_VERTEX_ARRAY:
2169 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2170 break;
2171 case GL_PROGRAM:
2172 localSet.set(DIRTY_OBJECT_PROGRAM);
2173 break;
2174 }
2175
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002176 syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002177}
2178
2179void State::setObjectDirty(GLenum target)
2180{
2181 switch (target)
2182 {
2183 case GL_READ_FRAMEBUFFER:
2184 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2185 break;
2186 case GL_DRAW_FRAMEBUFFER:
2187 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2188 break;
2189 case GL_FRAMEBUFFER:
2190 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2191 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2192 break;
2193 case GL_VERTEX_ARRAY:
2194 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2195 break;
2196 case GL_PROGRAM:
2197 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
2198 break;
2199 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002200}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002201
Xinghua Cao65ec0b22017-03-28 16:10:52 +08002202void State::setImageUnit(const Context *context,
2203 GLuint unit,
2204 Texture *texture,
2205 GLint level,
2206 GLboolean layered,
2207 GLint layer,
2208 GLenum access,
2209 GLenum format)
2210{
2211 mImageUnits[unit].texture.set(context, texture);
2212 mImageUnits[unit].level = level;
2213 mImageUnits[unit].layered = layered;
2214 mImageUnits[unit].layer = layer;
2215 mImageUnits[unit].access = access;
2216 mImageUnits[unit].format = format;
2217}
2218
2219const ImageUnit &State::getImageUnit(GLuint unit) const
2220{
2221 return mImageUnits[unit];
2222}
2223
Jamie Madillc9d442d2016-01-20 11:17:24 -05002224} // namespace gl