blob: 08a6b8c7e1504d471a304e0de53640369a1a7314 [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
Jamie Madillc9d442d2016-01-20 11:17:24 -050011#include "common/BitSetIterator.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050012#include "libANGLE/Context.h"
13#include "libANGLE/Caps.h"
Geoff Lang70d0f492015-12-10 17:45:46 -050014#include "libANGLE/Debug.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050015#include "libANGLE/Framebuffer.h"
16#include "libANGLE/FramebufferAttachment.h"
17#include "libANGLE/Query.h"
18#include "libANGLE/VertexArray.h"
19#include "libANGLE/formatutils.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040020
21namespace gl
22{
Geoff Lang76b10c92014-09-05 16:28:14 -040023
Shannon Woods53a94a82014-06-24 15:20:36 -040024State::State()
Jamie Madille79b1e12015-11-04 16:36:37 -050025 : mMaxDrawBuffers(0),
26 mMaxCombinedTextureImageUnits(0),
27 mDepthClearValue(0),
28 mStencilClearValue(0),
29 mScissorTest(false),
30 mSampleCoverage(false),
31 mSampleCoverageValue(0),
32 mSampleCoverageInvert(false),
33 mStencilRef(0),
34 mStencilBackRef(0),
35 mLineWidth(0),
36 mGenerateMipmapHint(GL_NONE),
37 mFragmentShaderDerivativeHint(GL_NONE),
38 mNearZ(0),
39 mFarZ(0),
40 mReadFramebuffer(nullptr),
41 mDrawFramebuffer(nullptr),
42 mProgram(nullptr),
43 mVertexArray(nullptr),
44 mActiveSampler(0),
Sami Väisänen74c23472016-05-09 17:30:30 +030045 mPrimitiveRestart(false),
46 mMultiSampling(false),
47 mSampleAlphaToOne(false)
Shannon Woods53a94a82014-06-24 15:20:36 -040048{
Geoff Lang76b10c92014-09-05 16:28:14 -040049}
50
51State::~State()
52{
53 reset();
54}
55
Geoff Lang70d0f492015-12-10 17:45:46 -050056void State::initialize(const Caps &caps,
57 const Extensions &extensions,
58 GLuint clientVersion,
59 bool debug)
Geoff Lang76b10c92014-09-05 16:28:14 -040060{
Shannon Woods2df6a602014-09-26 16:12:07 -040061 mMaxDrawBuffers = caps.maxDrawBuffers;
62 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -040063
Jamie Madillf75ab352015-03-16 10:46:52 -040064 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -040065
66 mDepthClearValue = 1.0f;
67 mStencilClearValue = 0;
68
69 mRasterizer.rasterizerDiscard = false;
70 mRasterizer.cullFace = false;
71 mRasterizer.cullMode = GL_BACK;
72 mRasterizer.frontFace = GL_CCW;
73 mRasterizer.polygonOffsetFill = false;
74 mRasterizer.polygonOffsetFactor = 0.0f;
75 mRasterizer.polygonOffsetUnits = 0.0f;
76 mRasterizer.pointDrawMode = false;
77 mRasterizer.multiSample = false;
78 mScissorTest = false;
79 mScissor.x = 0;
80 mScissor.y = 0;
81 mScissor.width = 0;
82 mScissor.height = 0;
83
84 mBlend.blend = false;
85 mBlend.sourceBlendRGB = GL_ONE;
86 mBlend.sourceBlendAlpha = GL_ONE;
87 mBlend.destBlendRGB = GL_ZERO;
88 mBlend.destBlendAlpha = GL_ZERO;
89 mBlend.blendEquationRGB = GL_FUNC_ADD;
90 mBlend.blendEquationAlpha = GL_FUNC_ADD;
91 mBlend.sampleAlphaToCoverage = false;
92 mBlend.dither = true;
93
94 mBlendColor.red = 0;
95 mBlendColor.green = 0;
96 mBlendColor.blue = 0;
97 mBlendColor.alpha = 0;
98
99 mDepthStencil.depthTest = false;
100 mDepthStencil.depthFunc = GL_LESS;
101 mDepthStencil.depthMask = true;
102 mDepthStencil.stencilTest = false;
103 mDepthStencil.stencilFunc = GL_ALWAYS;
Austin Kinrossb8af7232015-03-16 22:33:25 -0700104 mDepthStencil.stencilMask = static_cast<GLuint>(-1);
105 mDepthStencil.stencilWritemask = static_cast<GLuint>(-1);
Shannon Woods53a94a82014-06-24 15:20:36 -0400106 mDepthStencil.stencilBackFunc = GL_ALWAYS;
Austin Kinrossb8af7232015-03-16 22:33:25 -0700107 mDepthStencil.stencilBackMask = static_cast<GLuint>(-1);
108 mDepthStencil.stencilBackWritemask = static_cast<GLuint>(-1);
Shannon Woods53a94a82014-06-24 15:20:36 -0400109 mDepthStencil.stencilFail = GL_KEEP;
110 mDepthStencil.stencilPassDepthFail = GL_KEEP;
111 mDepthStencil.stencilPassDepthPass = GL_KEEP;
112 mDepthStencil.stencilBackFail = GL_KEEP;
113 mDepthStencil.stencilBackPassDepthFail = GL_KEEP;
114 mDepthStencil.stencilBackPassDepthPass = GL_KEEP;
115
116 mStencilRef = 0;
117 mStencilBackRef = 0;
118
119 mSampleCoverage = false;
120 mSampleCoverageValue = 1.0f;
121 mSampleCoverageInvert = false;
122 mGenerateMipmapHint = GL_DONT_CARE;
123 mFragmentShaderDerivativeHint = GL_DONT_CARE;
124
125 mLineWidth = 1.0f;
126
127 mViewport.x = 0;
128 mViewport.y = 0;
129 mViewport.width = 0;
130 mViewport.height = 0;
131 mNearZ = 0.0f;
132 mFarZ = 1.0f;
133
134 mBlend.colorMaskRed = true;
135 mBlend.colorMaskGreen = true;
136 mBlend.colorMaskBlue = true;
137 mBlend.colorMaskAlpha = true;
138
Geoff Lang76b10c92014-09-05 16:28:14 -0400139 mActiveSampler = 0;
140
Shannon Woods23e05002014-09-22 19:07:27 -0400141 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400142
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400143 mUniformBuffers.resize(caps.maxCombinedUniformBlocks);
144
Geoff Lang76b10c92014-09-05 16:28:14 -0400145 mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits);
146 mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits);
147 if (clientVersion >= 3)
Shannon Woods53a94a82014-06-24 15:20:36 -0400148 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400149 // TODO: These could also be enabled via extension
150 mSamplerTextures[GL_TEXTURE_2D_ARRAY].resize(caps.maxCombinedTextureImageUnits);
151 mSamplerTextures[GL_TEXTURE_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400152 }
Ian Ewellbda75592016-04-18 17:25:54 -0400153 if (extensions.eglImageExternal || extensions.eglStreamConsumerExternal)
154 {
155 mSamplerTextures[GL_TEXTURE_EXTERNAL_OES].resize(caps.maxCombinedTextureImageUnits);
156 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400157
Geoff Lang76b10c92014-09-05 16:28:14 -0400158 mSamplers.resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400159
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500160 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(nullptr);
161 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(nullptr);
162 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(nullptr);
163 mActiveQueries[GL_TIME_ELAPSED_EXT].set(nullptr);
Geoff Lang2b4ce802016-04-28 13:34:50 -0400164 mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400165
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500166 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400167
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500168 mReadFramebuffer = nullptr;
169 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500170
171 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500172
173 mDebug.setOutputEnabled(debug);
174 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300175
176 if (extensions.framebufferMultisample)
177 {
178 mMultiSampling = true;
179 mSampleAlphaToOne = false;
180 }
Sami Väisänena797e062016-05-12 15:23:40 +0300181
182 mCoverageModulation = GL_NONE;
Shannon Woods53a94a82014-06-24 15:20:36 -0400183}
184
Geoff Lang76b10c92014-09-05 16:28:14 -0400185void State::reset()
Shannon Woods53a94a82014-06-24 15:20:36 -0400186{
Geoff Lang76b10c92014-09-05 16:28:14 -0400187 for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400188 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400189 TextureBindingVector &textureVector = bindingVec->second;
190 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400191 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400192 textureVector[textureIdx].set(NULL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400193 }
194 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400195 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
196 {
197 mSamplers[samplerIdx].set(NULL);
198 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400199
Shannon Woods53a94a82014-06-24 15:20:36 -0400200 mArrayBuffer.set(NULL);
201 mRenderbuffer.set(NULL);
202
Geoff Lang7dd2e102014-11-10 15:19:26 -0500203 if (mProgram)
204 {
205 mProgram->release();
206 }
207 mProgram = NULL;
208
Shannon Woods53a94a82014-06-24 15:20:36 -0400209 mTransformFeedback.set(NULL);
210
211 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
212 {
213 i->second.set(NULL);
214 }
215
216 mGenericUniformBuffer.set(NULL);
Shannon Woods8299bb02014-09-26 18:55:43 -0400217 for (BufferVector::iterator bufItr = mUniformBuffers.begin(); bufItr != mUniformBuffers.end(); ++bufItr)
Shannon Woods53a94a82014-06-24 15:20:36 -0400218 {
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400219 bufItr->set(NULL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400220 }
221
Shannon Woods53a94a82014-06-24 15:20:36 -0400222 mCopyReadBuffer.set(NULL);
223 mCopyWriteBuffer.set(NULL);
224
225 mPack.pixelBuffer.set(NULL);
226 mUnpack.pixelBuffer.set(NULL);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500227
228 mProgram = NULL;
Jamie Madill1b94d432015-08-07 13:23:23 -0400229
230 // TODO(jmadill): Is this necessary?
231 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400232}
233
234const RasterizerState &State::getRasterizerState() const
235{
236 return mRasterizer;
237}
238
239const BlendState &State::getBlendState() const
240{
241 return mBlend;
242}
243
244const DepthStencilState &State::getDepthStencilState() const
245{
246 return mDepthStencil;
247}
248
Jamie Madillf75ab352015-03-16 10:46:52 -0400249void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400250{
251 mColorClearValue.red = red;
252 mColorClearValue.green = green;
253 mColorClearValue.blue = blue;
254 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400255 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400256}
257
Jamie Madillf75ab352015-03-16 10:46:52 -0400258void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400259{
260 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400261 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400262}
263
Jamie Madillf75ab352015-03-16 10:46:52 -0400264void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400265{
266 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400267 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400268}
269
Shannon Woods53a94a82014-06-24 15:20:36 -0400270void State::setColorMask(bool red, bool green, bool blue, bool alpha)
271{
272 mBlend.colorMaskRed = red;
273 mBlend.colorMaskGreen = green;
274 mBlend.colorMaskBlue = blue;
275 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400276 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400277}
278
279void State::setDepthMask(bool mask)
280{
281 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400282 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400283}
284
285bool State::isRasterizerDiscardEnabled() const
286{
287 return mRasterizer.rasterizerDiscard;
288}
289
290void State::setRasterizerDiscard(bool enabled)
291{
292 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400293 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400294}
295
296bool State::isCullFaceEnabled() const
297{
298 return mRasterizer.cullFace;
299}
300
301void State::setCullFace(bool enabled)
302{
303 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400304 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400305}
306
307void State::setCullMode(GLenum mode)
308{
309 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400310 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400311}
312
313void State::setFrontFace(GLenum front)
314{
315 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400316 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400317}
318
319bool State::isDepthTestEnabled() const
320{
321 return mDepthStencil.depthTest;
322}
323
324void State::setDepthTest(bool enabled)
325{
326 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400327 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400328}
329
330void State::setDepthFunc(GLenum depthFunc)
331{
332 mDepthStencil.depthFunc = depthFunc;
Jamie Madill1b94d432015-08-07 13:23:23 -0400333 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400334}
335
336void State::setDepthRange(float zNear, float zFar)
337{
338 mNearZ = zNear;
339 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400340 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400341}
342
Geoff Langd42f5b82015-04-16 14:03:29 -0400343float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400344{
Geoff Langd42f5b82015-04-16 14:03:29 -0400345 return mNearZ;
346}
347
348float State::getFarPlane() const
349{
350 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400351}
352
353bool State::isBlendEnabled() const
354{
355 return mBlend.blend;
356}
357
358void State::setBlend(bool enabled)
359{
360 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400361 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400362}
363
364void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
365{
366 mBlend.sourceBlendRGB = sourceRGB;
367 mBlend.destBlendRGB = destRGB;
368 mBlend.sourceBlendAlpha = sourceAlpha;
369 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400370 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400371}
372
373void State::setBlendColor(float red, float green, float blue, float alpha)
374{
375 mBlendColor.red = red;
376 mBlendColor.green = green;
377 mBlendColor.blue = blue;
378 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400379 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400380}
381
382void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
383{
384 mBlend.blendEquationRGB = rgbEquation;
385 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400386 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400387}
388
389const ColorF &State::getBlendColor() const
390{
391 return mBlendColor;
392}
393
394bool State::isStencilTestEnabled() const
395{
396 return mDepthStencil.stencilTest;
397}
398
399void State::setStencilTest(bool enabled)
400{
401 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400402 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400403}
404
405void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
406{
407 mDepthStencil.stencilFunc = stencilFunc;
408 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
409 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400410 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400411}
412
413void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
414{
415 mDepthStencil.stencilBackFunc = stencilBackFunc;
416 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
417 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400418 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400419}
420
421void State::setStencilWritemask(GLuint stencilWritemask)
422{
423 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400424 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400425}
426
427void State::setStencilBackWritemask(GLuint stencilBackWritemask)
428{
429 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400430 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400431}
432
433void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
434{
435 mDepthStencil.stencilFail = stencilFail;
436 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
437 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400438 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400439}
440
441void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
442{
443 mDepthStencil.stencilBackFail = stencilBackFail;
444 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
445 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400446 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400447}
448
449GLint State::getStencilRef() const
450{
451 return mStencilRef;
452}
453
454GLint State::getStencilBackRef() const
455{
456 return mStencilBackRef;
457}
458
459bool State::isPolygonOffsetFillEnabled() const
460{
461 return mRasterizer.polygonOffsetFill;
462}
463
464void State::setPolygonOffsetFill(bool enabled)
465{
Jamie Madill1b94d432015-08-07 13:23:23 -0400466 mRasterizer.polygonOffsetFill = enabled;
467 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400468}
469
470void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
471{
472 // An application can pass NaN values here, so handle this gracefully
473 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
474 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400475 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400476}
477
478bool State::isSampleAlphaToCoverageEnabled() const
479{
480 return mBlend.sampleAlphaToCoverage;
481}
482
483void State::setSampleAlphaToCoverage(bool enabled)
484{
485 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400486 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400487}
488
489bool State::isSampleCoverageEnabled() const
490{
491 return mSampleCoverage;
492}
493
494void State::setSampleCoverage(bool enabled)
495{
496 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400497 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400498}
499
500void State::setSampleCoverageParams(GLclampf value, bool invert)
501{
502 mSampleCoverageValue = value;
503 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400504 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400505}
506
Geoff Lang0fbb6002015-04-16 11:11:53 -0400507GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400508{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400509 return mSampleCoverageValue;
510}
Shannon Woods53a94a82014-06-24 15:20:36 -0400511
Geoff Lang0fbb6002015-04-16 11:11:53 -0400512bool State::getSampleCoverageInvert() const
513{
514 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400515}
516
Sami Väisänen74c23472016-05-09 17:30:30 +0300517void State::setSampleAlphaToOne(bool enabled)
518{
519 mSampleAlphaToOne = enabled;
520 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
521}
522
523bool State::isSampleAlphaToOneEnabled() const
524{
525 return mSampleAlphaToOne;
526}
527
528void State::setMultisampling(bool enabled)
529{
530 mMultiSampling = enabled;
531 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
532}
533
534bool State::isMultisamplingEnabled() const
535{
536 return mMultiSampling;
537}
538
Shannon Woods53a94a82014-06-24 15:20:36 -0400539bool State::isScissorTestEnabled() const
540{
541 return mScissorTest;
542}
543
544void State::setScissorTest(bool enabled)
545{
546 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400547 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400548}
549
550void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
551{
552 mScissor.x = x;
553 mScissor.y = y;
554 mScissor.width = width;
555 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400556 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400557}
558
559const Rectangle &State::getScissor() const
560{
561 return mScissor;
562}
563
564bool State::isDitherEnabled() const
565{
566 return mBlend.dither;
567}
568
569void State::setDither(bool enabled)
570{
571 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400572 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400573}
574
Jamie Madillb4b53c52015-02-03 15:22:48 -0500575bool State::isPrimitiveRestartEnabled() const
576{
577 return mPrimitiveRestart;
578}
579
580void State::setPrimitiveRestart(bool enabled)
581{
582 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400583 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500584}
585
Shannon Woods53a94a82014-06-24 15:20:36 -0400586void State::setEnableFeature(GLenum feature, bool enabled)
587{
588 switch (feature)
589 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300590 case GL_MULTISAMPLE_EXT: setMultisampling(enabled); break;
591 case GL_SAMPLE_ALPHA_TO_ONE_EXT: setSampleAlphaToOne(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400592 case GL_CULL_FACE: setCullFace(enabled); break;
593 case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
594 case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
595 case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
596 case GL_SCISSOR_TEST: setScissorTest(enabled); break;
597 case GL_STENCIL_TEST: setStencilTest(enabled); break;
598 case GL_DEPTH_TEST: setDepthTest(enabled); break;
599 case GL_BLEND: setBlend(enabled); break;
600 case GL_DITHER: setDither(enabled); break;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500601 case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400602 case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
Geoff Lang70d0f492015-12-10 17:45:46 -0500603 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
604 mDebug.setOutputSynchronous(enabled);
605 break;
606 case GL_DEBUG_OUTPUT:
607 mDebug.setOutputEnabled(enabled);
608 break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400609 default: UNREACHABLE();
610 }
611}
612
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700613bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400614{
615 switch (feature)
616 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300617 case GL_MULTISAMPLE_EXT: return isMultisamplingEnabled();
618 case GL_SAMPLE_ALPHA_TO_ONE_EXT: return isSampleAlphaToOneEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400619 case GL_CULL_FACE: return isCullFaceEnabled();
620 case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
621 case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
622 case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
623 case GL_SCISSOR_TEST: return isScissorTestEnabled();
624 case GL_STENCIL_TEST: return isStencilTestEnabled();
625 case GL_DEPTH_TEST: return isDepthTestEnabled();
626 case GL_BLEND: return isBlendEnabled();
627 case GL_DITHER: return isDitherEnabled();
Jamie Madillb4b53c52015-02-03 15:22:48 -0500628 case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400629 case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
Geoff Lang70d0f492015-12-10 17:45:46 -0500630 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
631 return mDebug.isOutputSynchronous();
632 case GL_DEBUG_OUTPUT:
633 return mDebug.isOutputEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400634 default: UNREACHABLE(); return false;
635 }
636}
637
638void State::setLineWidth(GLfloat width)
639{
640 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400641 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400642}
643
Geoff Lang4b3f4162015-04-16 13:22:05 -0400644float State::getLineWidth() const
645{
646 return mLineWidth;
647}
648
Shannon Woods53a94a82014-06-24 15:20:36 -0400649void State::setGenerateMipmapHint(GLenum hint)
650{
651 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400652 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400653}
654
655void State::setFragmentShaderDerivativeHint(GLenum hint)
656{
657 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400658 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400659 // TODO: Propagate the hint to shader translator so we can write
660 // ddx, ddx_coarse, or ddx_fine depending on the hint.
661 // Ignore for now. It is valid for implementations to ignore hint.
662}
663
664void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
665{
666 mViewport.x = x;
667 mViewport.y = y;
668 mViewport.width = width;
669 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400670 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400671}
672
673const Rectangle &State::getViewport() const
674{
675 return mViewport;
676}
677
678void State::setActiveSampler(unsigned int active)
679{
680 mActiveSampler = active;
681}
682
683unsigned int State::getActiveSampler() const
684{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700685 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400686}
687
Geoff Lang76b10c92014-09-05 16:28:14 -0400688void State::setSamplerTexture(GLenum type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400689{
Geoff Lang76b10c92014-09-05 16:28:14 -0400690 mSamplerTextures[type][mActiveSampler].set(texture);
Shannon Woods53a94a82014-06-24 15:20:36 -0400691}
692
Jamie Madillc29968b2016-01-20 11:17:23 -0500693Texture *State::getTargetTexture(GLenum target) const
694{
695 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), target);
696}
697
Geoff Lang76b10c92014-09-05 16:28:14 -0400698Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400699{
Jamie Madill5864ac22015-01-12 14:43:07 -0500700 const auto it = mSamplerTextures.find(type);
701 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400702 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500703 return it->second[sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400704}
705
Geoff Lang76b10c92014-09-05 16:28:14 -0400706GLuint State::getSamplerTextureId(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400707{
Jamie Madill5864ac22015-01-12 14:43:07 -0500708 const auto it = mSamplerTextures.find(type);
709 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400710 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500711 return it->second[sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400712}
713
Jamie Madille6382c32014-11-07 15:05:26 -0500714void State::detachTexture(const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400715{
716 // Textures have a detach method on State rather than a simple
717 // removeBinding, because the zero/null texture objects are managed
718 // separately, and don't have to go through the Context's maps or
719 // the ResourceManager.
720
721 // [OpenGL ES 2.0.24] section 3.8 page 84:
722 // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
723 // rebound to texture object zero
724
Corentin Walleza2257da2016-04-19 16:43:12 -0400725 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400726 {
Corentin Walleza2257da2016-04-19 16:43:12 -0400727 GLenum textureType = bindingVec.first;
728 TextureBindingVector &textureVector = bindingVec.second;
Geoff Lang76b10c92014-09-05 16:28:14 -0400729 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400730 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400731 BindingPointer<Texture> &binding = textureVector[textureIdx];
732 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400733 {
Jamie Madill5864ac22015-01-12 14:43:07 -0500734 auto it = zeroTextures.find(textureType);
735 ASSERT(it != zeroTextures.end());
Jamie Madille6382c32014-11-07 15:05:26 -0500736 // Zero textures are the "default" textures instead of NULL
Jamie Madill5864ac22015-01-12 14:43:07 -0500737 binding.set(it->second.get());
Shannon Woods53a94a82014-06-24 15:20:36 -0400738 }
739 }
740 }
741
742 // [OpenGL ES 2.0.24] section 4.4 page 112:
743 // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
744 // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
745 // image was attached in the currently bound framebuffer.
746
747 if (mReadFramebuffer)
748 {
749 mReadFramebuffer->detachTexture(texture);
750 }
751
752 if (mDrawFramebuffer)
753 {
754 mDrawFramebuffer->detachTexture(texture);
755 }
756}
757
Jamie Madille6382c32014-11-07 15:05:26 -0500758void State::initializeZeroTextures(const TextureMap &zeroTextures)
759{
760 for (const auto &zeroTexture : zeroTextures)
761 {
762 auto &samplerTextureArray = mSamplerTextures[zeroTexture.first];
763
764 for (size_t textureUnit = 0; textureUnit < samplerTextureArray.size(); ++textureUnit)
765 {
766 samplerTextureArray[textureUnit].set(zeroTexture.second.get());
767 }
768 }
769}
770
Shannon Woods53a94a82014-06-24 15:20:36 -0400771void State::setSamplerBinding(GLuint textureUnit, Sampler *sampler)
772{
773 mSamplers[textureUnit].set(sampler);
774}
775
776GLuint State::getSamplerId(GLuint textureUnit) const
777{
Geoff Lang76b10c92014-09-05 16:28:14 -0400778 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400779 return mSamplers[textureUnit].id();
780}
781
782Sampler *State::getSampler(GLuint textureUnit) const
783{
784 return mSamplers[textureUnit].get();
785}
786
787void State::detachSampler(GLuint sampler)
788{
789 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
790 // If a sampler object that is currently bound to one or more texture units is
791 // deleted, it is as though BindSampler is called once for each texture unit to
792 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Geoff Lang76b10c92014-09-05 16:28:14 -0400793 for (size_t textureUnit = 0; textureUnit < mSamplers.size(); textureUnit++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400794 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400795 BindingPointer<Sampler> &samplerBinding = mSamplers[textureUnit];
796 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400797 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400798 samplerBinding.set(NULL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400799 }
800 }
801}
802
803void State::setRenderbufferBinding(Renderbuffer *renderbuffer)
804{
805 mRenderbuffer.set(renderbuffer);
806}
807
808GLuint State::getRenderbufferId() const
809{
810 return mRenderbuffer.id();
811}
812
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700813Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400814{
815 return mRenderbuffer.get();
816}
817
818void State::detachRenderbuffer(GLuint renderbuffer)
819{
820 // [OpenGL ES 2.0.24] section 4.4 page 109:
821 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
822 // had been executed with the target RENDERBUFFER and name of zero.
823
824 if (mRenderbuffer.id() == renderbuffer)
825 {
826 mRenderbuffer.set(NULL);
827 }
828
829 // [OpenGL ES 2.0.24] section 4.4 page 111:
830 // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
831 // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
832 // point to which this image was attached in the currently bound framebuffer.
833
834 Framebuffer *readFramebuffer = mReadFramebuffer;
835 Framebuffer *drawFramebuffer = mDrawFramebuffer;
836
837 if (readFramebuffer)
838 {
839 readFramebuffer->detachRenderbuffer(renderbuffer);
840 }
841
842 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
843 {
844 drawFramebuffer->detachRenderbuffer(renderbuffer);
845 }
846
847}
848
849void State::setReadFramebufferBinding(Framebuffer *framebuffer)
850{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500851 if (mReadFramebuffer == framebuffer)
852 return;
853
Shannon Woods53a94a82014-06-24 15:20:36 -0400854 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500855 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
856
857 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
858 {
859 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
860 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400861}
862
863void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
864{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500865 if (mDrawFramebuffer == framebuffer)
866 return;
867
Shannon Woods53a94a82014-06-24 15:20:36 -0400868 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500869 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
870
871 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
872 {
873 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
874 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400875}
876
877Framebuffer *State::getTargetFramebuffer(GLenum target) const
878{
879 switch (target)
880 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500881 case GL_READ_FRAMEBUFFER_ANGLE:
882 return mReadFramebuffer;
883 case GL_DRAW_FRAMEBUFFER_ANGLE:
884 case GL_FRAMEBUFFER:
885 return mDrawFramebuffer;
886 default:
887 UNREACHABLE();
888 return NULL;
Shannon Woods53a94a82014-06-24 15:20:36 -0400889 }
890}
891
Jamie Madill51f40ec2016-06-15 14:06:00 -0400892Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400893{
894 return mReadFramebuffer;
895}
896
Jamie Madill51f40ec2016-06-15 14:06:00 -0400897Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400898{
899 return mDrawFramebuffer;
900}
901
902bool State::removeReadFramebufferBinding(GLuint framebuffer)
903{
Jamie Madill77a72f62015-04-14 11:18:32 -0400904 if (mReadFramebuffer != nullptr &&
905 mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400906 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500907 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400908 return true;
909 }
910
911 return false;
912}
913
914bool State::removeDrawFramebufferBinding(GLuint framebuffer)
915{
Jamie Madill77a72f62015-04-14 11:18:32 -0400916 if (mReadFramebuffer != nullptr &&
917 mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400918 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500919 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400920 return true;
921 }
922
923 return false;
924}
925
926void State::setVertexArrayBinding(VertexArray *vertexArray)
927{
928 mVertexArray = vertexArray;
Jamie Madill0b9e9032015-08-17 11:51:52 +0000929 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -0500930
931 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
932 {
933 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
934 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400935}
936
937GLuint State::getVertexArrayId() const
938{
939 ASSERT(mVertexArray != NULL);
940 return mVertexArray->id();
941}
942
943VertexArray *State::getVertexArray() const
944{
945 ASSERT(mVertexArray != NULL);
946 return mVertexArray;
947}
948
949bool State::removeVertexArrayBinding(GLuint vertexArray)
950{
951 if (mVertexArray->id() == vertexArray)
952 {
953 mVertexArray = NULL;
Jamie Madill0b9e9032015-08-17 11:51:52 +0000954 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -0500955 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -0400956 return true;
957 }
958
959 return false;
960}
961
Geoff Lang7dd2e102014-11-10 15:19:26 -0500962void State::setProgram(Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -0400963{
Geoff Lang7dd2e102014-11-10 15:19:26 -0500964 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -0400965 {
Geoff Lang7dd2e102014-11-10 15:19:26 -0500966 if (mProgram)
967 {
968 mProgram->release();
969 }
970
971 mProgram = newProgram;
972
973 if (mProgram)
974 {
975 newProgram->addRef();
976 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400977 }
978}
979
Geoff Lang7dd2e102014-11-10 15:19:26 -0500980Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400981{
Geoff Lang7dd2e102014-11-10 15:19:26 -0500982 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -0400983}
984
985void State::setTransformFeedbackBinding(TransformFeedback *transformFeedback)
986{
987 mTransformFeedback.set(transformFeedback);
988}
989
990TransformFeedback *State::getCurrentTransformFeedback() const
991{
992 return mTransformFeedback.get();
993}
994
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +0000995bool State::isTransformFeedbackActiveUnpaused() const
996{
997 gl::TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Geoff Langbb0a0bb2015-03-27 12:16:57 -0400998 return curTransformFeedback && curTransformFeedback->isActive() && !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +0000999}
1000
Corentin Walleza2257da2016-04-19 16:43:12 -04001001bool State::removeTransformFeedbackBinding(GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001002{
1003 if (mTransformFeedback.id() == transformFeedback)
1004 {
Corentin Walleza2257da2016-04-19 16:43:12 -04001005 mTransformFeedback.set(nullptr);
1006 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001007 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001008
1009 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001010}
1011
Corentin Walleze71ea192016-04-19 13:16:37 -04001012bool State::isQueryActive(GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001013{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001014 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001015 {
Corentin Walleze71ea192016-04-19 13:16:37 -04001016 Query *query = iter.second.get();
1017 if (query != nullptr && query->getType() == type)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001018 {
1019 return true;
1020 }
1021 }
1022
1023 return false;
1024}
1025
1026bool State::isQueryActive(Query *query) const
1027{
1028 for (auto &iter : mActiveQueries)
1029 {
1030 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001031 {
1032 return true;
1033 }
1034 }
1035
1036 return false;
1037}
1038
1039void State::setActiveQuery(GLenum target, Query *query)
1040{
1041 mActiveQueries[target].set(query);
1042}
1043
1044GLuint State::getActiveQueryId(GLenum target) const
1045{
1046 const Query *query = getActiveQuery(target);
1047 return (query ? query->id() : 0u);
1048}
1049
1050Query *State::getActiveQuery(GLenum target) const
1051{
Jamie Madill5864ac22015-01-12 14:43:07 -05001052 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001053
Jamie Madill5864ac22015-01-12 14:43:07 -05001054 // All query types should already exist in the activeQueries map
1055 ASSERT(it != mActiveQueries.end());
1056
1057 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001058}
1059
1060void State::setArrayBufferBinding(Buffer *buffer)
1061{
1062 mArrayBuffer.set(buffer);
1063}
1064
1065GLuint State::getArrayBufferId() const
1066{
1067 return mArrayBuffer.id();
1068}
1069
Shannon Woods53a94a82014-06-24 15:20:36 -04001070void State::setGenericUniformBufferBinding(Buffer *buffer)
1071{
1072 mGenericUniformBuffer.set(buffer);
1073}
1074
1075void State::setIndexedUniformBufferBinding(GLuint index, Buffer *buffer, GLintptr offset, GLsizeiptr size)
1076{
1077 mUniformBuffers[index].set(buffer, offset, size);
1078}
1079
Geoff Lang5d124a62015-09-15 13:03:27 -04001080const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001081{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001082 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001083 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001084}
1085
Shannon Woods53a94a82014-06-24 15:20:36 -04001086void State::setCopyReadBufferBinding(Buffer *buffer)
1087{
1088 mCopyReadBuffer.set(buffer);
1089}
1090
1091void State::setCopyWriteBufferBinding(Buffer *buffer)
1092{
1093 mCopyWriteBuffer.set(buffer);
1094}
1095
1096void State::setPixelPackBufferBinding(Buffer *buffer)
1097{
1098 mPack.pixelBuffer.set(buffer);
Corentin Wallezbbd663a2016-04-20 17:49:17 -04001099 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001100}
1101
1102void State::setPixelUnpackBufferBinding(Buffer *buffer)
1103{
1104 mUnpack.pixelBuffer.set(buffer);
Corentin Wallezbbd663a2016-04-20 17:49:17 -04001105 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001106}
1107
1108Buffer *State::getTargetBuffer(GLenum target) const
1109{
1110 switch (target)
1111 {
1112 case GL_ARRAY_BUFFER: return mArrayBuffer.get();
1113 case GL_COPY_READ_BUFFER: return mCopyReadBuffer.get();
1114 case GL_COPY_WRITE_BUFFER: return mCopyWriteBuffer.get();
Jamie Madill8e344942015-07-09 14:22:07 -04001115 case GL_ELEMENT_ARRAY_BUFFER: return getVertexArray()->getElementArrayBuffer().get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001116 case GL_PIXEL_PACK_BUFFER: return mPack.pixelBuffer.get();
1117 case GL_PIXEL_UNPACK_BUFFER: return mUnpack.pixelBuffer.get();
Geoff Lang045536b2015-03-27 15:17:18 -04001118 case GL_TRANSFORM_FEEDBACK_BUFFER: return mTransformFeedback->getGenericBuffer().get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001119 case GL_UNIFORM_BUFFER: return mGenericUniformBuffer.get();
1120 default: UNREACHABLE(); return NULL;
1121 }
1122}
1123
Yuly Novikov5807a532015-12-03 13:01:22 -05001124void State::detachBuffer(GLuint bufferName)
1125{
1126 BindingPointer<Buffer> *buffers[] = {&mArrayBuffer, &mCopyReadBuffer,
1127 &mCopyWriteBuffer, &mPack.pixelBuffer,
1128 &mUnpack.pixelBuffer, &mGenericUniformBuffer};
1129 for (auto buffer : buffers)
1130 {
1131 if (buffer->id() == bufferName)
1132 {
1133 buffer->set(nullptr);
1134 }
1135 }
1136
1137 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1138 if (curTransformFeedback)
1139 {
1140 curTransformFeedback->detachBuffer(bufferName);
1141 }
1142
1143 getVertexArray()->detachBuffer(bufferName);
1144}
1145
Shannon Woods53a94a82014-06-24 15:20:36 -04001146void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1147{
1148 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001149 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001150}
1151
1152void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1153{
Shannon Woods23e05002014-09-22 19:07:27 -04001154 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001155 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001156 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001157}
1158
1159void State::setVertexAttribu(GLuint index, const GLuint values[4])
1160{
Shannon Woods23e05002014-09-22 19:07:27 -04001161 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001162 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001163 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001164}
1165
1166void State::setVertexAttribi(GLuint index, const GLint values[4])
1167{
Shannon Woods23e05002014-09-22 19:07:27 -04001168 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001169 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001170 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001171}
1172
Jamie Madill0b9e9032015-08-17 11:51:52 +00001173void State::setVertexAttribState(unsigned int attribNum,
1174 Buffer *boundBuffer,
1175 GLint size,
1176 GLenum type,
1177 bool normalized,
1178 bool pureInteger,
1179 GLsizei stride,
1180 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001181{
1182 getVertexArray()->setAttributeState(attribNum, boundBuffer, size, type, normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001183 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001184}
1185
1186void State::setVertexAttribDivisor(GLuint index, GLuint divisor)
1187{
1188 getVertexArray()->setVertexAttribDivisor(index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001189 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001190}
1191
Shannon Woods53a94a82014-06-24 15:20:36 -04001192const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(unsigned int attribNum) const
1193{
Shannon Woods23e05002014-09-22 19:07:27 -04001194 ASSERT(static_cast<size_t>(attribNum) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001195 return mVertexAttribCurrentValues[attribNum];
1196}
1197
Shannon Woods53a94a82014-06-24 15:20:36 -04001198const void *State::getVertexAttribPointer(unsigned int attribNum) const
1199{
1200 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1201}
1202
1203void State::setPackAlignment(GLint alignment)
1204{
1205 mPack.alignment = alignment;
Jamie Madill1b94d432015-08-07 13:23:23 -04001206 mDirtyBits.set(DIRTY_BIT_PACK_ALIGNMENT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001207}
1208
1209GLint State::getPackAlignment() const
1210{
1211 return mPack.alignment;
1212}
1213
1214void State::setPackReverseRowOrder(bool reverseRowOrder)
1215{
1216 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madill1b94d432015-08-07 13:23:23 -04001217 mDirtyBits.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001218}
1219
1220bool State::getPackReverseRowOrder() const
1221{
1222 return mPack.reverseRowOrder;
1223}
1224
Minmin Gongadff67b2015-10-14 10:34:45 -04001225void State::setPackRowLength(GLint rowLength)
1226{
1227 mPack.rowLength = rowLength;
1228 mDirtyBits.set(DIRTY_BIT_PACK_ROW_LENGTH);
1229}
1230
1231GLint State::getPackRowLength() const
1232{
1233 return mPack.rowLength;
1234}
1235
1236void State::setPackSkipRows(GLint skipRows)
1237{
1238 mPack.skipRows = skipRows;
1239 mDirtyBits.set(DIRTY_BIT_PACK_SKIP_ROWS);
1240}
1241
1242GLint State::getPackSkipRows() const
1243{
1244 return mPack.skipRows;
1245}
1246
1247void State::setPackSkipPixels(GLint skipPixels)
1248{
1249 mPack.skipPixels = skipPixels;
1250 mDirtyBits.set(DIRTY_BIT_PACK_SKIP_PIXELS);
1251}
1252
1253GLint State::getPackSkipPixels() const
1254{
1255 return mPack.skipPixels;
1256}
1257
Shannon Woods53a94a82014-06-24 15:20:36 -04001258const PixelPackState &State::getPackState() const
1259{
1260 return mPack;
1261}
1262
Jamie Madill87de3622015-03-16 10:41:44 -04001263PixelPackState &State::getPackState()
1264{
1265 return mPack;
1266}
1267
Shannon Woods53a94a82014-06-24 15:20:36 -04001268void State::setUnpackAlignment(GLint alignment)
1269{
1270 mUnpack.alignment = alignment;
Jamie Madill1b94d432015-08-07 13:23:23 -04001271 mDirtyBits.set(DIRTY_BIT_UNPACK_ALIGNMENT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001272}
1273
1274GLint State::getUnpackAlignment() const
1275{
1276 return mUnpack.alignment;
1277}
1278
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001279void State::setUnpackRowLength(GLint rowLength)
1280{
1281 mUnpack.rowLength = rowLength;
Jamie Madill1b94d432015-08-07 13:23:23 -04001282 mDirtyBits.set(DIRTY_BIT_UNPACK_ROW_LENGTH);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001283}
1284
1285GLint State::getUnpackRowLength() const
1286{
1287 return mUnpack.rowLength;
1288}
1289
Minmin Gongadff67b2015-10-14 10:34:45 -04001290void State::setUnpackImageHeight(GLint imageHeight)
1291{
1292 mUnpack.imageHeight = imageHeight;
1293 mDirtyBits.set(DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
1294}
1295
1296GLint State::getUnpackImageHeight() const
1297{
1298 return mUnpack.imageHeight;
1299}
1300
1301void State::setUnpackSkipImages(GLint skipImages)
1302{
1303 mUnpack.skipImages = skipImages;
1304 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_IMAGES);
1305}
1306
1307GLint State::getUnpackSkipImages() const
1308{
1309 return mUnpack.skipImages;
1310}
1311
1312void State::setUnpackSkipRows(GLint skipRows)
1313{
1314 mUnpack.skipRows = skipRows;
1315 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_ROWS);
1316}
1317
1318GLint State::getUnpackSkipRows() const
1319{
1320 return mUnpack.skipRows;
1321}
1322
1323void State::setUnpackSkipPixels(GLint skipPixels)
1324{
1325 mUnpack.skipPixels = skipPixels;
1326 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_PIXELS);
1327}
1328
1329GLint State::getUnpackSkipPixels() const
1330{
1331 return mUnpack.skipPixels;
1332}
1333
Shannon Woods53a94a82014-06-24 15:20:36 -04001334const PixelUnpackState &State::getUnpackState() const
1335{
1336 return mUnpack;
1337}
1338
Jamie Madill67102f02015-03-16 10:41:42 -04001339PixelUnpackState &State::getUnpackState()
1340{
1341 return mUnpack;
1342}
1343
Geoff Lang70d0f492015-12-10 17:45:46 -05001344const Debug &State::getDebug() const
1345{
1346 return mDebug;
1347}
1348
1349Debug &State::getDebug()
1350{
1351 return mDebug;
1352}
1353
Sami Väisänena797e062016-05-12 15:23:40 +03001354void State::setCoverageModulation(GLenum components)
1355{
1356 mCoverageModulation = components;
1357 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1358}
1359
1360GLenum State::getCoverageModulation() const
1361{
1362 return mCoverageModulation;
1363}
1364
Shannon Woods53a94a82014-06-24 15:20:36 -04001365void State::getBooleanv(GLenum pname, GLboolean *params)
1366{
1367 switch (pname)
1368 {
1369 case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
1370 case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
1371 case GL_COLOR_WRITEMASK:
1372 params[0] = mBlend.colorMaskRed;
1373 params[1] = mBlend.colorMaskGreen;
1374 params[2] = mBlend.colorMaskBlue;
1375 params[3] = mBlend.colorMaskAlpha;
1376 break;
1377 case GL_CULL_FACE: *params = mRasterizer.cullFace; break;
1378 case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
1379 case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
1380 case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
1381 case GL_SCISSOR_TEST: *params = mScissorTest; break;
1382 case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
1383 case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
1384 case GL_BLEND: *params = mBlend.blend; break;
1385 case GL_DITHER: *params = mBlend.dither; break;
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001386 case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE; break;
1387 case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE; break;
Jamie Madille2cd53d2015-10-27 11:15:46 -04001388 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1389 *params = mPrimitiveRestart;
1390 break;
Geoff Langab831f02015-12-01 09:39:10 -05001391 case GL_RASTERIZER_DISCARD:
1392 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1393 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001394 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1395 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1396 break;
1397 case GL_DEBUG_OUTPUT:
1398 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1399 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001400 case GL_MULTISAMPLE_EXT:
1401 *params = mMultiSampling;
1402 break;
1403 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1404 *params = mSampleAlphaToOne;
1405 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001406 default:
1407 UNREACHABLE();
1408 break;
1409 }
1410}
1411
1412void State::getFloatv(GLenum pname, GLfloat *params)
1413{
1414 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1415 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1416 // GetIntegerv as its native query function. As it would require conversion in any
1417 // case, this should make no difference to the calling application.
1418 switch (pname)
1419 {
1420 case GL_LINE_WIDTH: *params = mLineWidth; break;
1421 case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
1422 case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
1423 case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
1424 case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
1425 case GL_DEPTH_RANGE:
1426 params[0] = mNearZ;
1427 params[1] = mFarZ;
1428 break;
1429 case GL_COLOR_CLEAR_VALUE:
1430 params[0] = mColorClearValue.red;
1431 params[1] = mColorClearValue.green;
1432 params[2] = mColorClearValue.blue;
1433 params[3] = mColorClearValue.alpha;
1434 break;
1435 case GL_BLEND_COLOR:
1436 params[0] = mBlendColor.red;
1437 params[1] = mBlendColor.green;
1438 params[2] = mBlendColor.blue;
1439 params[3] = mBlendColor.alpha;
1440 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001441 case GL_MULTISAMPLE_EXT:
1442 *params = static_cast<GLfloat>(mMultiSampling);
1443 break;
1444 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1445 *params = static_cast<GLfloat>(mSampleAlphaToOne);
Sami Väisänena797e062016-05-12 15:23:40 +03001446 case GL_COVERAGE_MODULATION_CHROMIUM:
Jamie Madille2e406c2016-06-02 13:04:10 -04001447 params[0] = static_cast<GLfloat>(mCoverageModulation);
1448 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001449 default:
1450 UNREACHABLE();
1451 break;
1452 }
1453}
1454
Jamie Madill9082b982016-04-27 15:21:51 -04001455void State::getIntegerv(const ContextState &data, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001456{
1457 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1458 {
1459 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001460 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001461 Framebuffer *framebuffer = mDrawFramebuffer;
1462 *params = framebuffer->getDrawBufferState(colorAttachment);
1463 return;
1464 }
1465
1466 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1467 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1468 // GetIntegerv as its native query function. As it would require conversion in any
1469 // case, this should make no difference to the calling application. You may find it in
1470 // State::getFloatv.
1471 switch (pname)
1472 {
1473 case GL_ARRAY_BUFFER_BINDING: *params = mArrayBuffer.id(); break;
Jamie Madill8e344942015-07-09 14:22:07 -04001474 case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = getVertexArray()->getElementArrayBuffer().id(); break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001475 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1476 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
1477 case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
1478 case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
1479 case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
Geoff Lang7dd2e102014-11-10 15:19:26 -05001480 case GL_CURRENT_PROGRAM: *params = mProgram ? mProgram->id() : 0; break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001481 case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
1482 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001483 case GL_PACK_ROW_LENGTH:
1484 *params = mPack.rowLength;
1485 break;
1486 case GL_PACK_SKIP_ROWS:
1487 *params = mPack.skipRows;
1488 break;
1489 case GL_PACK_SKIP_PIXELS:
1490 *params = mPack.skipPixels;
1491 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001492 case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001493 case GL_UNPACK_ROW_LENGTH: *params = mUnpack.rowLength; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001494 case GL_UNPACK_IMAGE_HEIGHT:
1495 *params = mUnpack.imageHeight;
1496 break;
1497 case GL_UNPACK_SKIP_IMAGES:
1498 *params = mUnpack.skipImages;
1499 break;
1500 case GL_UNPACK_SKIP_ROWS:
1501 *params = mUnpack.skipRows;
1502 break;
1503 case GL_UNPACK_SKIP_PIXELS:
1504 *params = mUnpack.skipPixels;
1505 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001506 case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
1507 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001508 case GL_ACTIVE_TEXTURE:
1509 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
1510 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001511 case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
1512 case GL_STENCIL_REF: *params = mStencilRef; break;
1513 case GL_STENCIL_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilMask); break;
1514 case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
1515 case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
1516 case GL_STENCIL_BACK_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilBackMask); break;
1517 case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
1518 case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
1519 case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
1520 case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
1521 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
1522 case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
1523 case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
1524 case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
1525 case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
1526 case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
1527 case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
1528 case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
1529 case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
1530 case GL_STENCIL_WRITEMASK: *params = clampToInt(mDepthStencil.stencilWritemask); break;
1531 case GL_STENCIL_BACK_WRITEMASK: *params = clampToInt(mDepthStencil.stencilBackWritemask); break;
1532 case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
Geoff Langbce529e2014-12-01 12:48:41 -05001533 case GL_IMPLEMENTATION_COLOR_READ_TYPE: *params = mReadFramebuffer->getImplementationColorReadType(); break;
1534 case GL_IMPLEMENTATION_COLOR_READ_FORMAT: *params = mReadFramebuffer->getImplementationColorReadFormat(); break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001535 case GL_SAMPLE_BUFFERS:
1536 case GL_SAMPLES:
1537 {
1538 gl::Framebuffer *framebuffer = mDrawFramebuffer;
Geoff Lang748f74e2014-12-01 11:25:34 -05001539 if (framebuffer->checkStatus(data) == GL_FRAMEBUFFER_COMPLETE)
Shannon Woods53a94a82014-06-24 15:20:36 -04001540 {
1541 switch (pname)
1542 {
1543 case GL_SAMPLE_BUFFERS:
Jamie Madill48faf802014-11-06 15:27:22 -05001544 if (framebuffer->getSamples(data) != 0)
Shannon Woods53a94a82014-06-24 15:20:36 -04001545 {
1546 *params = 1;
1547 }
1548 else
1549 {
1550 *params = 0;
1551 }
1552 break;
1553 case GL_SAMPLES:
Jamie Madill48faf802014-11-06 15:27:22 -05001554 *params = framebuffer->getSamples(data);
Shannon Woods53a94a82014-06-24 15:20:36 -04001555 break;
1556 }
1557 }
1558 else
1559 {
1560 *params = 0;
1561 }
1562 }
1563 break;
1564 case GL_VIEWPORT:
1565 params[0] = mViewport.x;
1566 params[1] = mViewport.y;
1567 params[2] = mViewport.width;
1568 params[3] = mViewport.height;
1569 break;
1570 case GL_SCISSOR_BOX:
1571 params[0] = mScissor.x;
1572 params[1] = mScissor.y;
1573 params[2] = mScissor.width;
1574 params[3] = mScissor.height;
1575 break;
1576 case GL_CULL_FACE_MODE: *params = mRasterizer.cullMode; break;
1577 case GL_FRONT_FACE: *params = mRasterizer.frontFace; break;
1578 case GL_RED_BITS:
1579 case GL_GREEN_BITS:
1580 case GL_BLUE_BITS:
1581 case GL_ALPHA_BITS:
1582 {
1583 gl::Framebuffer *framebuffer = getDrawFramebuffer();
Jamie Madillb6bda4a2015-04-20 12:53:26 -04001584 const gl::FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001585
1586 if (colorbuffer)
1587 {
1588 switch (pname)
1589 {
1590 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1591 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1592 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1593 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1594 }
1595 }
1596 else
1597 {
1598 *params = 0;
1599 }
1600 }
1601 break;
1602 case GL_DEPTH_BITS:
1603 {
Jamie Madille3ef7152015-04-28 16:55:17 +00001604 const gl::Framebuffer *framebuffer = getDrawFramebuffer();
1605 const gl::FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001606
1607 if (depthbuffer)
1608 {
1609 *params = depthbuffer->getDepthSize();
1610 }
1611 else
1612 {
1613 *params = 0;
1614 }
1615 }
1616 break;
1617 case GL_STENCIL_BITS:
1618 {
Jamie Madille3ef7152015-04-28 16:55:17 +00001619 const gl::Framebuffer *framebuffer = getDrawFramebuffer();
1620 const gl::FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001621
1622 if (stencilbuffer)
1623 {
1624 *params = stencilbuffer->getStencilSize();
1625 }
1626 else
1627 {
1628 *params = 0;
1629 }
1630 }
1631 break;
1632 case GL_TEXTURE_BINDING_2D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001633 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001634 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001635 break;
1636 case GL_TEXTURE_BINDING_CUBE_MAP:
Shannon Woods2df6a602014-09-26 16:12:07 -04001637 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001638 *params =
1639 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_CUBE_MAP);
Shannon Woods53a94a82014-06-24 15:20:36 -04001640 break;
1641 case GL_TEXTURE_BINDING_3D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001642 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001643 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_3D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001644 break;
1645 case GL_TEXTURE_BINDING_2D_ARRAY:
Shannon Woods2df6a602014-09-26 16:12:07 -04001646 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001647 *params =
1648 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001649 break;
1650 case GL_UNIFORM_BUFFER_BINDING:
1651 *params = mGenericUniformBuffer.id();
1652 break;
Frank Henigman22581ff2015-11-06 14:25:54 -05001653 case GL_TRANSFORM_FEEDBACK_BINDING:
Frank Henigmanb0f0b812015-11-21 17:49:29 -05001654 *params = mTransformFeedback.id();
Frank Henigman22581ff2015-11-06 14:25:54 -05001655 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001656 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Geoff Lang045536b2015-03-27 15:17:18 -04001657 *params = mTransformFeedback->getGenericBuffer().id();
Shannon Woods53a94a82014-06-24 15:20:36 -04001658 break;
1659 case GL_COPY_READ_BUFFER_BINDING:
1660 *params = mCopyReadBuffer.id();
1661 break;
1662 case GL_COPY_WRITE_BUFFER_BINDING:
1663 *params = mCopyWriteBuffer.id();
1664 break;
1665 case GL_PIXEL_PACK_BUFFER_BINDING:
1666 *params = mPack.pixelBuffer.id();
1667 break;
1668 case GL_PIXEL_UNPACK_BUFFER_BINDING:
1669 *params = mUnpack.pixelBuffer.id();
1670 break;
Olli Etuaho86821db2016-03-04 12:05:47 +02001671 case GL_READ_BUFFER:
1672 *params = mReadFramebuffer->getReadBufferState();
1673 break;
1674 case GL_SAMPLER_BINDING:
1675 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1676 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
1677 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001678 case GL_DEBUG_LOGGED_MESSAGES:
1679 *params = static_cast<GLint>(mDebug.getMessageCount());
1680 break;
1681 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
1682 *params = static_cast<GLint>(mDebug.getNextMessageLength());
1683 break;
1684 case GL_DEBUG_GROUP_STACK_DEPTH:
1685 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
1686 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001687 case GL_MULTISAMPLE_EXT:
1688 *params = static_cast<GLint>(mMultiSampling);
1689 break;
1690 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1691 *params = static_cast<GLint>(mSampleAlphaToOne);
Sami Väisänena797e062016-05-12 15:23:40 +03001692 case GL_COVERAGE_MODULATION_CHROMIUM:
1693 *params = static_cast<GLint>(mCoverageModulation);
Sami Väisänen74c23472016-05-09 17:30:30 +03001694 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001695 default:
1696 UNREACHABLE();
1697 break;
1698 }
1699}
1700
Geoff Lang70d0f492015-12-10 17:45:46 -05001701void State::getPointerv(GLenum pname, void **params) const
1702{
1703 switch (pname)
1704 {
1705 case GL_DEBUG_CALLBACK_FUNCTION:
1706 *params = reinterpret_cast<void *>(mDebug.getCallback());
1707 break;
1708 case GL_DEBUG_CALLBACK_USER_PARAM:
1709 *params = const_cast<void *>(mDebug.getUserParam());
1710 break;
1711 default:
1712 UNREACHABLE();
1713 break;
1714 }
1715}
1716
Shannon Woods53a94a82014-06-24 15:20:36 -04001717bool State::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
1718{
1719 switch (target)
1720 {
1721 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Geoff Lang045536b2015-03-27 15:17:18 -04001722 if (static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount())
Shannon Woods53a94a82014-06-24 15:20:36 -04001723 {
Geoff Lang045536b2015-03-27 15:17:18 -04001724 *data = mTransformFeedback->getIndexedBuffer(index).id();
Shannon Woods53a94a82014-06-24 15:20:36 -04001725 }
1726 break;
1727 case GL_UNIFORM_BUFFER_BINDING:
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001728 if (static_cast<size_t>(index) < mUniformBuffers.size())
Shannon Woods53a94a82014-06-24 15:20:36 -04001729 {
1730 *data = mUniformBuffers[index].id();
1731 }
1732 break;
1733 default:
1734 return false;
1735 }
1736
1737 return true;
1738}
1739
1740bool State::getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data)
1741{
1742 switch (target)
1743 {
1744 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
Geoff Lang045536b2015-03-27 15:17:18 -04001745 if (static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount())
Shannon Woods53a94a82014-06-24 15:20:36 -04001746 {
Geoff Lang045536b2015-03-27 15:17:18 -04001747 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
Shannon Woods53a94a82014-06-24 15:20:36 -04001748 }
1749 break;
1750 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
Geoff Lang045536b2015-03-27 15:17:18 -04001751 if (static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount())
Shannon Woods53a94a82014-06-24 15:20:36 -04001752 {
Geoff Lang045536b2015-03-27 15:17:18 -04001753 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
Shannon Woods53a94a82014-06-24 15:20:36 -04001754 }
1755 break;
1756 case GL_UNIFORM_BUFFER_START:
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001757 if (static_cast<size_t>(index) < mUniformBuffers.size())
Shannon Woods53a94a82014-06-24 15:20:36 -04001758 {
1759 *data = mUniformBuffers[index].getOffset();
1760 }
1761 break;
1762 case GL_UNIFORM_BUFFER_SIZE:
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001763 if (static_cast<size_t>(index) < mUniformBuffers.size())
Shannon Woods53a94a82014-06-24 15:20:36 -04001764 {
1765 *data = mUniformBuffers[index].getSize();
1766 }
1767 break;
1768 default:
1769 return false;
1770 }
1771
1772 return true;
1773}
1774
Jamie Madilld9ba4f72014-08-04 10:47:59 -04001775bool State::hasMappedBuffer(GLenum target) const
1776{
1777 if (target == GL_ARRAY_BUFFER)
1778 {
Geoff Lang5ead9272015-03-25 12:27:43 -04001779 const VertexArray *vao = getVertexArray();
Jamie Madilleea3a6e2015-04-15 10:02:48 -04001780 const auto &vertexAttribs = vao->getVertexAttributes();
Jamie Madill8e344942015-07-09 14:22:07 -04001781 size_t maxEnabledAttrib = vao->getMaxEnabledAttribute();
Jamie Madillaebf9dd2015-04-28 12:39:07 -04001782 for (size_t attribIndex = 0; attribIndex < maxEnabledAttrib; attribIndex++)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04001783 {
Jamie Madilleea3a6e2015-04-15 10:02:48 -04001784 const gl::VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Jamie Madilld9ba4f72014-08-04 10:47:59 -04001785 gl::Buffer *boundBuffer = vertexAttrib.buffer.get();
1786 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
1787 {
1788 return true;
1789 }
1790 }
1791
1792 return false;
1793 }
1794 else
1795 {
1796 Buffer *buffer = getTargetBuffer(target);
1797 return (buffer && buffer->isMapped());
1798 }
1799}
1800
Jamie Madillc9d442d2016-01-20 11:17:24 -05001801void State::syncDirtyObjects()
1802{
1803 if (!mDirtyObjects.any())
1804 return;
1805
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001806 syncDirtyObjects(mDirtyObjects);
1807}
1808
1809void State::syncDirtyObjects(const DirtyObjects &bitset)
1810{
1811 for (auto dirtyObject : angle::IterateBitSet(bitset))
Jamie Madillc9d442d2016-01-20 11:17:24 -05001812 {
1813 switch (dirtyObject)
1814 {
1815 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001816 ASSERT(mReadFramebuffer);
1817 mReadFramebuffer->syncState();
Jamie Madillc9d442d2016-01-20 11:17:24 -05001818 break;
1819 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001820 ASSERT(mDrawFramebuffer);
1821 mDrawFramebuffer->syncState();
Jamie Madillc9d442d2016-01-20 11:17:24 -05001822 break;
1823 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001824 ASSERT(mVertexArray);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001825 mVertexArray->syncImplState();
1826 break;
1827 case DIRTY_OBJECT_PROGRAM:
1828 // TODO(jmadill): implement this
1829 break;
1830 default:
1831 UNREACHABLE();
1832 break;
1833 }
1834 }
1835
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001836 mDirtyObjects &= ~bitset;
1837}
1838
1839void State::syncDirtyObject(GLenum target)
1840{
1841 DirtyObjects localSet;
1842
1843 switch (target)
1844 {
1845 case GL_READ_FRAMEBUFFER:
1846 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1847 break;
1848 case GL_DRAW_FRAMEBUFFER:
1849 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1850 break;
1851 case GL_FRAMEBUFFER:
1852 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1853 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1854 break;
1855 case GL_VERTEX_ARRAY:
1856 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
1857 break;
1858 case GL_PROGRAM:
1859 localSet.set(DIRTY_OBJECT_PROGRAM);
1860 break;
1861 }
1862
1863 syncDirtyObjects(localSet);
1864}
1865
1866void State::setObjectDirty(GLenum target)
1867{
1868 switch (target)
1869 {
1870 case GL_READ_FRAMEBUFFER:
1871 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1872 break;
1873 case GL_DRAW_FRAMEBUFFER:
1874 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1875 break;
1876 case GL_FRAMEBUFFER:
1877 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1878 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1879 break;
1880 case GL_VERTEX_ARRAY:
1881 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1882 break;
1883 case GL_PROGRAM:
1884 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
1885 break;
1886 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001887}
Jamie Madillc9d442d2016-01-20 11:17:24 -05001888
1889} // namespace gl