blob: 5ec2090d6bdb52c10c5a9ccead68525c60eac24c [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 Madillc9d442d2016-01-20 11:17:24 -050014#include "common/BitSetIterator.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),
65 mFramebufferSRGB(true)
Shannon Woods53a94a82014-06-24 15:20:36 -040066{
Geoff Lang76b10c92014-09-05 16:28:14 -040067}
68
69State::~State()
70{
Geoff Lang76b10c92014-09-05 16:28:14 -040071}
72
Geoff Lang70d0f492015-12-10 17:45:46 -050073void State::initialize(const Caps &caps,
74 const Extensions &extensions,
Geoff Langeb66a6e2016-10-31 13:06:12 -040075 const Version &clientVersion,
Geoff Langf41a7152016-09-19 15:11:17 -040076 bool debug,
Geoff Langfeb8c682017-02-13 16:07:35 -050077 bool bindGeneratesResource,
78 bool clientArraysEnabled)
Geoff Lang76b10c92014-09-05 16:28:14 -040079{
Shannon Woods2df6a602014-09-26 16:12:07 -040080 mMaxDrawBuffers = caps.maxDrawBuffers;
81 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -040082
Jamie Madillf75ab352015-03-16 10:46:52 -040083 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -040084
85 mDepthClearValue = 1.0f;
86 mStencilClearValue = 0;
87
88 mRasterizer.rasterizerDiscard = false;
89 mRasterizer.cullFace = false;
90 mRasterizer.cullMode = GL_BACK;
91 mRasterizer.frontFace = GL_CCW;
92 mRasterizer.polygonOffsetFill = false;
93 mRasterizer.polygonOffsetFactor = 0.0f;
94 mRasterizer.polygonOffsetUnits = 0.0f;
95 mRasterizer.pointDrawMode = false;
96 mRasterizer.multiSample = false;
97 mScissorTest = false;
98 mScissor.x = 0;
99 mScissor.y = 0;
100 mScissor.width = 0;
101 mScissor.height = 0;
102
103 mBlend.blend = false;
104 mBlend.sourceBlendRGB = GL_ONE;
105 mBlend.sourceBlendAlpha = GL_ONE;
106 mBlend.destBlendRGB = GL_ZERO;
107 mBlend.destBlendAlpha = GL_ZERO;
108 mBlend.blendEquationRGB = GL_FUNC_ADD;
109 mBlend.blendEquationAlpha = GL_FUNC_ADD;
110 mBlend.sampleAlphaToCoverage = false;
111 mBlend.dither = true;
112
113 mBlendColor.red = 0;
114 mBlendColor.green = 0;
115 mBlendColor.blue = 0;
116 mBlendColor.alpha = 0;
117
118 mDepthStencil.depthTest = false;
119 mDepthStencil.depthFunc = GL_LESS;
120 mDepthStencil.depthMask = true;
121 mDepthStencil.stencilTest = false;
122 mDepthStencil.stencilFunc = GL_ALWAYS;
Austin Kinrossb8af7232015-03-16 22:33:25 -0700123 mDepthStencil.stencilMask = static_cast<GLuint>(-1);
124 mDepthStencil.stencilWritemask = static_cast<GLuint>(-1);
Shannon Woods53a94a82014-06-24 15:20:36 -0400125 mDepthStencil.stencilBackFunc = GL_ALWAYS;
Austin Kinrossb8af7232015-03-16 22:33:25 -0700126 mDepthStencil.stencilBackMask = static_cast<GLuint>(-1);
127 mDepthStencil.stencilBackWritemask = static_cast<GLuint>(-1);
Shannon Woods53a94a82014-06-24 15:20:36 -0400128 mDepthStencil.stencilFail = GL_KEEP;
129 mDepthStencil.stencilPassDepthFail = GL_KEEP;
130 mDepthStencil.stencilPassDepthPass = GL_KEEP;
131 mDepthStencil.stencilBackFail = GL_KEEP;
132 mDepthStencil.stencilBackPassDepthFail = GL_KEEP;
133 mDepthStencil.stencilBackPassDepthPass = GL_KEEP;
134
135 mStencilRef = 0;
136 mStencilBackRef = 0;
137
138 mSampleCoverage = false;
139 mSampleCoverageValue = 1.0f;
140 mSampleCoverageInvert = false;
141 mGenerateMipmapHint = GL_DONT_CARE;
142 mFragmentShaderDerivativeHint = GL_DONT_CARE;
143
Geoff Langf41a7152016-09-19 15:11:17 -0400144 mBindGeneratesResource = bindGeneratesResource;
Geoff Langfeb8c682017-02-13 16:07:35 -0500145 mClientArraysEnabled = clientArraysEnabled;
Geoff Langf41a7152016-09-19 15:11:17 -0400146
Shannon Woods53a94a82014-06-24 15:20:36 -0400147 mLineWidth = 1.0f;
148
149 mViewport.x = 0;
150 mViewport.y = 0;
151 mViewport.width = 0;
152 mViewport.height = 0;
153 mNearZ = 0.0f;
154 mFarZ = 1.0f;
155
156 mBlend.colorMaskRed = true;
157 mBlend.colorMaskGreen = true;
158 mBlend.colorMaskBlue = true;
159 mBlend.colorMaskAlpha = true;
160
Geoff Lang76b10c92014-09-05 16:28:14 -0400161 mActiveSampler = 0;
162
Shannon Woods23e05002014-09-22 19:07:27 -0400163 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400164
Geoff Lang4dc3af02016-11-18 14:09:27 -0500165 mUniformBuffers.resize(caps.maxUniformBufferBindings);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400166
Geoff Lang76b10c92014-09-05 16:28:14 -0400167 mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits);
168 mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits);
Geoff Langeb66a6e2016-10-31 13:06:12 -0400169 if (clientVersion >= Version(3, 0))
Shannon Woods53a94a82014-06-24 15:20:36 -0400170 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400171 // TODO: These could also be enabled via extension
172 mSamplerTextures[GL_TEXTURE_2D_ARRAY].resize(caps.maxCombinedTextureImageUnits);
173 mSamplerTextures[GL_TEXTURE_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400174 }
Geoff Lang3b573612016-10-31 14:08:10 -0400175 if (clientVersion >= Version(3, 1))
176 {
177 mSamplerTextures[GL_TEXTURE_2D_MULTISAMPLE].resize(caps.maxCombinedTextureImageUnits);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800178
179 mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
Geoff Lang3b573612016-10-31 14:08:10 -0400180 }
Ian Ewellbda75592016-04-18 17:25:54 -0400181 if (extensions.eglImageExternal || extensions.eglStreamConsumerExternal)
182 {
183 mSamplerTextures[GL_TEXTURE_EXTERNAL_OES].resize(caps.maxCombinedTextureImageUnits);
184 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400185
Geoff Lang76b10c92014-09-05 16:28:14 -0400186 mSamplers.resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400187
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500188 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(nullptr);
189 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(nullptr);
190 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(nullptr);
191 mActiveQueries[GL_TIME_ELAPSED_EXT].set(nullptr);
Geoff Lang2b4ce802016-04-28 13:34:50 -0400192 mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400193
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500194 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400195
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500196 mReadFramebuffer = nullptr;
197 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500198
199 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500200
201 mDebug.setOutputEnabled(debug);
202 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300203
204 if (extensions.framebufferMultisample)
205 {
206 mMultiSampling = true;
207 mSampleAlphaToOne = false;
208 }
Sami Väisänena797e062016-05-12 15:23:40 +0300209
210 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300211
212 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
213 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
214 mPathStencilFunc = GL_ALWAYS;
215 mPathStencilRef = 0;
216 mPathStencilMask = std::numeric_limits<GLuint>::max();
Shannon Woods53a94a82014-06-24 15:20:36 -0400217}
218
Jamie Madill6c1f6712017-02-14 19:08:04 -0500219void State::reset(const Context *context)
Shannon Woods53a94a82014-06-24 15:20:36 -0400220{
Geoff Lang76b10c92014-09-05 16:28:14 -0400221 for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400222 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400223 TextureBindingVector &textureVector = bindingVec->second;
224 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400225 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400226 textureVector[textureIdx].set(NULL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400227 }
228 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400229 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
230 {
231 mSamplers[samplerIdx].set(NULL);
232 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400233
Shannon Woods53a94a82014-06-24 15:20:36 -0400234 mArrayBuffer.set(NULL);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800235 mDrawIndirectBuffer.set(NULL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400236 mRenderbuffer.set(NULL);
237
Geoff Lang7dd2e102014-11-10 15:19:26 -0500238 if (mProgram)
239 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500240 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500241 }
242 mProgram = NULL;
243
Shannon Woods53a94a82014-06-24 15:20:36 -0400244 mTransformFeedback.set(NULL);
245
246 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
247 {
248 i->second.set(NULL);
249 }
250
251 mGenericUniformBuffer.set(NULL);
Shannon Woods8299bb02014-09-26 18:55:43 -0400252 for (BufferVector::iterator bufItr = mUniformBuffers.begin(); bufItr != mUniformBuffers.end(); ++bufItr)
Shannon Woods53a94a82014-06-24 15:20:36 -0400253 {
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400254 bufItr->set(NULL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400255 }
256
Shannon Woods53a94a82014-06-24 15:20:36 -0400257 mCopyReadBuffer.set(NULL);
258 mCopyWriteBuffer.set(NULL);
259
260 mPack.pixelBuffer.set(NULL);
261 mUnpack.pixelBuffer.set(NULL);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500262
Jiajia Qin6eafb042016-12-27 17:04:07 +0800263 mGenericAtomicCounterBuffer.set(nullptr);
264 for (auto &buf : mAtomicCounterBuffers)
265 {
266 buf.set(nullptr);
267 }
268
Geoff Lang7dd2e102014-11-10 15:19:26 -0500269 mProgram = NULL;
Jamie Madill1b94d432015-08-07 13:23:23 -0400270
Sami Väisänene45e53b2016-05-25 10:36:04 +0300271 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
272 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
273 mPathStencilFunc = GL_ALWAYS;
274 mPathStencilRef = 0;
275 mPathStencilMask = std::numeric_limits<GLuint>::max();
276
Jamie Madill1b94d432015-08-07 13:23:23 -0400277 // TODO(jmadill): Is this necessary?
278 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400279}
280
281const RasterizerState &State::getRasterizerState() const
282{
283 return mRasterizer;
284}
285
286const BlendState &State::getBlendState() const
287{
288 return mBlend;
289}
290
291const DepthStencilState &State::getDepthStencilState() const
292{
293 return mDepthStencil;
294}
295
Jamie Madillf75ab352015-03-16 10:46:52 -0400296void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400297{
298 mColorClearValue.red = red;
299 mColorClearValue.green = green;
300 mColorClearValue.blue = blue;
301 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400302 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400303}
304
Jamie Madillf75ab352015-03-16 10:46:52 -0400305void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400306{
307 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400308 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400309}
310
Jamie Madillf75ab352015-03-16 10:46:52 -0400311void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400312{
313 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400314 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400315}
316
Shannon Woods53a94a82014-06-24 15:20:36 -0400317void State::setColorMask(bool red, bool green, bool blue, bool alpha)
318{
319 mBlend.colorMaskRed = red;
320 mBlend.colorMaskGreen = green;
321 mBlend.colorMaskBlue = blue;
322 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400323 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400324}
325
326void State::setDepthMask(bool mask)
327{
328 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400329 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400330}
331
332bool State::isRasterizerDiscardEnabled() const
333{
334 return mRasterizer.rasterizerDiscard;
335}
336
337void State::setRasterizerDiscard(bool enabled)
338{
339 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400340 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400341}
342
343bool State::isCullFaceEnabled() const
344{
345 return mRasterizer.cullFace;
346}
347
348void State::setCullFace(bool enabled)
349{
350 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400351 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400352}
353
354void State::setCullMode(GLenum mode)
355{
356 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400357 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400358}
359
360void State::setFrontFace(GLenum front)
361{
362 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400363 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400364}
365
366bool State::isDepthTestEnabled() const
367{
368 return mDepthStencil.depthTest;
369}
370
371void State::setDepthTest(bool enabled)
372{
373 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400374 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400375}
376
377void State::setDepthFunc(GLenum depthFunc)
378{
379 mDepthStencil.depthFunc = depthFunc;
Jamie Madill1b94d432015-08-07 13:23:23 -0400380 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400381}
382
383void State::setDepthRange(float zNear, float zFar)
384{
385 mNearZ = zNear;
386 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400387 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400388}
389
Geoff Langd42f5b82015-04-16 14:03:29 -0400390float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400391{
Geoff Langd42f5b82015-04-16 14:03:29 -0400392 return mNearZ;
393}
394
395float State::getFarPlane() const
396{
397 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400398}
399
400bool State::isBlendEnabled() const
401{
402 return mBlend.blend;
403}
404
405void State::setBlend(bool enabled)
406{
407 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400408 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400409}
410
411void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
412{
413 mBlend.sourceBlendRGB = sourceRGB;
414 mBlend.destBlendRGB = destRGB;
415 mBlend.sourceBlendAlpha = sourceAlpha;
416 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400417 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400418}
419
420void State::setBlendColor(float red, float green, float blue, float alpha)
421{
422 mBlendColor.red = red;
423 mBlendColor.green = green;
424 mBlendColor.blue = blue;
425 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400426 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400427}
428
429void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
430{
431 mBlend.blendEquationRGB = rgbEquation;
432 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400433 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400434}
435
436const ColorF &State::getBlendColor() const
437{
438 return mBlendColor;
439}
440
441bool State::isStencilTestEnabled() const
442{
443 return mDepthStencil.stencilTest;
444}
445
446void State::setStencilTest(bool enabled)
447{
448 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400449 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400450}
451
452void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
453{
454 mDepthStencil.stencilFunc = stencilFunc;
455 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
456 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400457 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400458}
459
460void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
461{
462 mDepthStencil.stencilBackFunc = stencilBackFunc;
463 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
464 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400465 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400466}
467
468void State::setStencilWritemask(GLuint stencilWritemask)
469{
470 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400471 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400472}
473
474void State::setStencilBackWritemask(GLuint stencilBackWritemask)
475{
476 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400477 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400478}
479
480void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
481{
482 mDepthStencil.stencilFail = stencilFail;
483 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
484 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400485 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400486}
487
488void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
489{
490 mDepthStencil.stencilBackFail = stencilBackFail;
491 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
492 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400493 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400494}
495
496GLint State::getStencilRef() const
497{
498 return mStencilRef;
499}
500
501GLint State::getStencilBackRef() const
502{
503 return mStencilBackRef;
504}
505
506bool State::isPolygonOffsetFillEnabled() const
507{
508 return mRasterizer.polygonOffsetFill;
509}
510
511void State::setPolygonOffsetFill(bool enabled)
512{
Jamie Madill1b94d432015-08-07 13:23:23 -0400513 mRasterizer.polygonOffsetFill = enabled;
514 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400515}
516
517void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
518{
519 // An application can pass NaN values here, so handle this gracefully
520 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
521 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400522 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400523}
524
525bool State::isSampleAlphaToCoverageEnabled() const
526{
527 return mBlend.sampleAlphaToCoverage;
528}
529
530void State::setSampleAlphaToCoverage(bool enabled)
531{
532 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400533 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400534}
535
536bool State::isSampleCoverageEnabled() const
537{
538 return mSampleCoverage;
539}
540
541void State::setSampleCoverage(bool enabled)
542{
543 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400544 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400545}
546
547void State::setSampleCoverageParams(GLclampf value, bool invert)
548{
549 mSampleCoverageValue = value;
550 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400551 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400552}
553
Geoff Lang0fbb6002015-04-16 11:11:53 -0400554GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400555{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400556 return mSampleCoverageValue;
557}
Shannon Woods53a94a82014-06-24 15:20:36 -0400558
Geoff Lang0fbb6002015-04-16 11:11:53 -0400559bool State::getSampleCoverageInvert() const
560{
561 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400562}
563
Sami Väisänen74c23472016-05-09 17:30:30 +0300564void State::setSampleAlphaToOne(bool enabled)
565{
566 mSampleAlphaToOne = enabled;
567 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
568}
569
570bool State::isSampleAlphaToOneEnabled() const
571{
572 return mSampleAlphaToOne;
573}
574
575void State::setMultisampling(bool enabled)
576{
577 mMultiSampling = enabled;
578 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
579}
580
581bool State::isMultisamplingEnabled() const
582{
583 return mMultiSampling;
584}
585
Shannon Woods53a94a82014-06-24 15:20:36 -0400586bool State::isScissorTestEnabled() const
587{
588 return mScissorTest;
589}
590
591void State::setScissorTest(bool enabled)
592{
593 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400594 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400595}
596
597void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
598{
599 mScissor.x = x;
600 mScissor.y = y;
601 mScissor.width = width;
602 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400603 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400604}
605
606const Rectangle &State::getScissor() const
607{
608 return mScissor;
609}
610
611bool State::isDitherEnabled() const
612{
613 return mBlend.dither;
614}
615
616void State::setDither(bool enabled)
617{
618 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400619 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400620}
621
Jamie Madillb4b53c52015-02-03 15:22:48 -0500622bool State::isPrimitiveRestartEnabled() const
623{
624 return mPrimitiveRestart;
625}
626
627void State::setPrimitiveRestart(bool enabled)
628{
629 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400630 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500631}
632
Shannon Woods53a94a82014-06-24 15:20:36 -0400633void State::setEnableFeature(GLenum feature, bool enabled)
634{
635 switch (feature)
636 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300637 case GL_MULTISAMPLE_EXT: setMultisampling(enabled); break;
638 case GL_SAMPLE_ALPHA_TO_ONE_EXT: setSampleAlphaToOne(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400639 case GL_CULL_FACE: setCullFace(enabled); break;
640 case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
641 case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
642 case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
643 case GL_SCISSOR_TEST: setScissorTest(enabled); break;
644 case GL_STENCIL_TEST: setStencilTest(enabled); break;
645 case GL_DEPTH_TEST: setDepthTest(enabled); break;
646 case GL_BLEND: setBlend(enabled); break;
647 case GL_DITHER: setDither(enabled); break;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500648 case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400649 case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
Geoff Lang3b573612016-10-31 14:08:10 -0400650 case GL_SAMPLE_MASK:
Geoff Lang9f090372016-12-02 10:20:43 -0500651 if (enabled)
652 {
653 // Enabling this feature is not implemented yet.
654 UNIMPLEMENTED();
655 }
Geoff Lang3b573612016-10-31 14:08:10 -0400656 break;
Geoff Lang70d0f492015-12-10 17:45:46 -0500657 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
658 mDebug.setOutputSynchronous(enabled);
659 break;
660 case GL_DEBUG_OUTPUT:
661 mDebug.setOutputEnabled(enabled);
662 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700663 case GL_FRAMEBUFFER_SRGB_EXT:
664 setFramebufferSRGB(enabled);
665 break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400666 default: UNREACHABLE();
667 }
668}
669
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700670bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400671{
672 switch (feature)
673 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300674 case GL_MULTISAMPLE_EXT: return isMultisamplingEnabled();
675 case GL_SAMPLE_ALPHA_TO_ONE_EXT: return isSampleAlphaToOneEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400676 case GL_CULL_FACE: return isCullFaceEnabled();
677 case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
678 case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
679 case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
680 case GL_SCISSOR_TEST: return isScissorTestEnabled();
681 case GL_STENCIL_TEST: return isStencilTestEnabled();
682 case GL_DEPTH_TEST: return isDepthTestEnabled();
683 case GL_BLEND: return isBlendEnabled();
684 case GL_DITHER: return isDitherEnabled();
Jamie Madillb4b53c52015-02-03 15:22:48 -0500685 case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400686 case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
Geoff Langb5e997f2016-12-06 10:55:34 -0500687 case GL_SAMPLE_MASK:
688 UNIMPLEMENTED();
689 return false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500690 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
691 return mDebug.isOutputSynchronous();
692 case GL_DEBUG_OUTPUT:
693 return mDebug.isOutputEnabled();
Geoff Langf41a7152016-09-19 15:11:17 -0400694 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
695 return isBindGeneratesResourceEnabled();
Geoff Langfeb8c682017-02-13 16:07:35 -0500696 case GL_CLIENT_ARRAYS_ANGLE:
697 return areClientArraysEnabled();
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700698 case GL_FRAMEBUFFER_SRGB_EXT:
699 return getFramebufferSRGB();
Shannon Woods53a94a82014-06-24 15:20:36 -0400700 default: UNREACHABLE(); return false;
701 }
702}
703
704void State::setLineWidth(GLfloat width)
705{
706 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400707 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400708}
709
Geoff Lang4b3f4162015-04-16 13:22:05 -0400710float State::getLineWidth() const
711{
712 return mLineWidth;
713}
714
Shannon Woods53a94a82014-06-24 15:20:36 -0400715void State::setGenerateMipmapHint(GLenum hint)
716{
717 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400718 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400719}
720
721void State::setFragmentShaderDerivativeHint(GLenum hint)
722{
723 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400724 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400725 // TODO: Propagate the hint to shader translator so we can write
726 // ddx, ddx_coarse, or ddx_fine depending on the hint.
727 // Ignore for now. It is valid for implementations to ignore hint.
728}
729
Geoff Langf41a7152016-09-19 15:11:17 -0400730bool State::isBindGeneratesResourceEnabled() const
731{
732 return mBindGeneratesResource;
733}
734
Geoff Langfeb8c682017-02-13 16:07:35 -0500735bool State::areClientArraysEnabled() const
736{
737 return mClientArraysEnabled;
738}
739
Shannon Woods53a94a82014-06-24 15:20:36 -0400740void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
741{
742 mViewport.x = x;
743 mViewport.y = y;
744 mViewport.width = width;
745 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400746 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400747}
748
749const Rectangle &State::getViewport() const
750{
751 return mViewport;
752}
753
754void State::setActiveSampler(unsigned int active)
755{
756 mActiveSampler = active;
757}
758
759unsigned int State::getActiveSampler() const
760{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700761 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400762}
763
Geoff Lang76b10c92014-09-05 16:28:14 -0400764void State::setSamplerTexture(GLenum type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400765{
Geoff Lang76b10c92014-09-05 16:28:14 -0400766 mSamplerTextures[type][mActiveSampler].set(texture);
Shannon Woods53a94a82014-06-24 15:20:36 -0400767}
768
Jamie Madillc29968b2016-01-20 11:17:23 -0500769Texture *State::getTargetTexture(GLenum target) const
770{
771 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), target);
772}
773
Geoff Lang76b10c92014-09-05 16:28:14 -0400774Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400775{
Jamie Madill5864ac22015-01-12 14:43:07 -0500776 const auto it = mSamplerTextures.find(type);
777 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400778 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500779 return it->second[sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400780}
781
Geoff Lang76b10c92014-09-05 16:28:14 -0400782GLuint State::getSamplerTextureId(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400783{
Jamie Madill5864ac22015-01-12 14:43:07 -0500784 const auto it = mSamplerTextures.find(type);
785 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400786 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500787 return it->second[sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400788}
789
Jamie Madilla02315b2017-02-23 14:14:47 -0500790void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400791{
792 // Textures have a detach method on State rather than a simple
793 // removeBinding, because the zero/null texture objects are managed
794 // separately, and don't have to go through the Context's maps or
795 // the ResourceManager.
796
797 // [OpenGL ES 2.0.24] section 3.8 page 84:
798 // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
799 // rebound to texture object zero
800
Corentin Walleza2257da2016-04-19 16:43:12 -0400801 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400802 {
Corentin Walleza2257da2016-04-19 16:43:12 -0400803 GLenum textureType = bindingVec.first;
804 TextureBindingVector &textureVector = bindingVec.second;
Geoff Lang76b10c92014-09-05 16:28:14 -0400805 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400806 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400807 BindingPointer<Texture> &binding = textureVector[textureIdx];
808 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400809 {
Jamie Madill5864ac22015-01-12 14:43:07 -0500810 auto it = zeroTextures.find(textureType);
811 ASSERT(it != zeroTextures.end());
Jamie Madille6382c32014-11-07 15:05:26 -0500812 // Zero textures are the "default" textures instead of NULL
Jamie Madill5864ac22015-01-12 14:43:07 -0500813 binding.set(it->second.get());
Shannon Woods53a94a82014-06-24 15:20:36 -0400814 }
815 }
816 }
817
818 // [OpenGL ES 2.0.24] section 4.4 page 112:
819 // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
820 // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
821 // image was attached in the currently bound framebuffer.
822
823 if (mReadFramebuffer)
824 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500825 mReadFramebuffer->detachTexture(context, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -0400826 }
827
828 if (mDrawFramebuffer)
829 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500830 mDrawFramebuffer->detachTexture(context, texture);
Shannon Woods53a94a82014-06-24 15:20:36 -0400831 }
832}
833
Jamie Madille6382c32014-11-07 15:05:26 -0500834void State::initializeZeroTextures(const TextureMap &zeroTextures)
835{
836 for (const auto &zeroTexture : zeroTextures)
837 {
838 auto &samplerTextureArray = mSamplerTextures[zeroTexture.first];
839
840 for (size_t textureUnit = 0; textureUnit < samplerTextureArray.size(); ++textureUnit)
841 {
842 samplerTextureArray[textureUnit].set(zeroTexture.second.get());
843 }
844 }
845}
846
Shannon Woods53a94a82014-06-24 15:20:36 -0400847void State::setSamplerBinding(GLuint textureUnit, Sampler *sampler)
848{
849 mSamplers[textureUnit].set(sampler);
850}
851
852GLuint State::getSamplerId(GLuint textureUnit) const
853{
Geoff Lang76b10c92014-09-05 16:28:14 -0400854 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400855 return mSamplers[textureUnit].id();
856}
857
858Sampler *State::getSampler(GLuint textureUnit) const
859{
860 return mSamplers[textureUnit].get();
861}
862
863void State::detachSampler(GLuint sampler)
864{
865 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
866 // If a sampler object that is currently bound to one or more texture units is
867 // deleted, it is as though BindSampler is called once for each texture unit to
868 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Geoff Lang76b10c92014-09-05 16:28:14 -0400869 for (size_t textureUnit = 0; textureUnit < mSamplers.size(); textureUnit++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400870 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400871 BindingPointer<Sampler> &samplerBinding = mSamplers[textureUnit];
872 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400873 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400874 samplerBinding.set(NULL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400875 }
876 }
877}
878
879void State::setRenderbufferBinding(Renderbuffer *renderbuffer)
880{
881 mRenderbuffer.set(renderbuffer);
882}
883
884GLuint State::getRenderbufferId() const
885{
886 return mRenderbuffer.id();
887}
888
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700889Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400890{
891 return mRenderbuffer.get();
892}
893
Jamie Madilla02315b2017-02-23 14:14:47 -0500894void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400895{
896 // [OpenGL ES 2.0.24] section 4.4 page 109:
897 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
898 // had been executed with the target RENDERBUFFER and name of zero.
899
900 if (mRenderbuffer.id() == renderbuffer)
901 {
902 mRenderbuffer.set(NULL);
903 }
904
905 // [OpenGL ES 2.0.24] section 4.4 page 111:
906 // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
907 // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
908 // point to which this image was attached in the currently bound framebuffer.
909
910 Framebuffer *readFramebuffer = mReadFramebuffer;
911 Framebuffer *drawFramebuffer = mDrawFramebuffer;
912
913 if (readFramebuffer)
914 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500915 readFramebuffer->detachRenderbuffer(context, renderbuffer);
Shannon Woods53a94a82014-06-24 15:20:36 -0400916 }
917
918 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
919 {
Jamie Madilla02315b2017-02-23 14:14:47 -0500920 drawFramebuffer->detachRenderbuffer(context, renderbuffer);
Shannon Woods53a94a82014-06-24 15:20:36 -0400921 }
922
923}
924
925void State::setReadFramebufferBinding(Framebuffer *framebuffer)
926{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500927 if (mReadFramebuffer == framebuffer)
928 return;
929
Shannon Woods53a94a82014-06-24 15:20:36 -0400930 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500931 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
932
933 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
934 {
935 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
936 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400937}
938
939void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
940{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500941 if (mDrawFramebuffer == framebuffer)
942 return;
943
Shannon Woods53a94a82014-06-24 15:20:36 -0400944 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500945 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
946
947 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
948 {
949 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
950 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400951}
952
953Framebuffer *State::getTargetFramebuffer(GLenum target) const
954{
955 switch (target)
956 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500957 case GL_READ_FRAMEBUFFER_ANGLE:
958 return mReadFramebuffer;
959 case GL_DRAW_FRAMEBUFFER_ANGLE:
960 case GL_FRAMEBUFFER:
961 return mDrawFramebuffer;
962 default:
963 UNREACHABLE();
964 return NULL;
Shannon Woods53a94a82014-06-24 15:20:36 -0400965 }
966}
967
Jamie Madill51f40ec2016-06-15 14:06:00 -0400968Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400969{
970 return mReadFramebuffer;
971}
972
Jamie Madill51f40ec2016-06-15 14:06:00 -0400973Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400974{
975 return mDrawFramebuffer;
976}
977
978bool State::removeReadFramebufferBinding(GLuint framebuffer)
979{
Jamie Madill77a72f62015-04-14 11:18:32 -0400980 if (mReadFramebuffer != nullptr &&
981 mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400982 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500983 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400984 return true;
985 }
986
987 return false;
988}
989
990bool State::removeDrawFramebufferBinding(GLuint framebuffer)
991{
Jamie Madill77a72f62015-04-14 11:18:32 -0400992 if (mReadFramebuffer != nullptr &&
993 mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400994 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500995 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400996 return true;
997 }
998
999 return false;
1000}
1001
1002void State::setVertexArrayBinding(VertexArray *vertexArray)
1003{
1004 mVertexArray = vertexArray;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001005 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001006
1007 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1008 {
1009 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1010 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001011}
1012
1013GLuint State::getVertexArrayId() const
1014{
1015 ASSERT(mVertexArray != NULL);
1016 return mVertexArray->id();
1017}
1018
1019VertexArray *State::getVertexArray() const
1020{
1021 ASSERT(mVertexArray != NULL);
1022 return mVertexArray;
1023}
1024
1025bool State::removeVertexArrayBinding(GLuint vertexArray)
1026{
1027 if (mVertexArray->id() == vertexArray)
1028 {
1029 mVertexArray = NULL;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001030 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001031 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001032 return true;
1033 }
1034
1035 return false;
1036}
1037
Jamie Madill6c1f6712017-02-14 19:08:04 -05001038void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001039{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001040 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001041 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001042 if (mProgram)
1043 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001044 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001045 }
1046
1047 mProgram = newProgram;
1048
1049 if (mProgram)
1050 {
1051 newProgram->addRef();
1052 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001053 }
1054}
1055
Geoff Lang7dd2e102014-11-10 15:19:26 -05001056Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001057{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001058 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001059}
1060
1061void State::setTransformFeedbackBinding(TransformFeedback *transformFeedback)
1062{
1063 mTransformFeedback.set(transformFeedback);
1064}
1065
1066TransformFeedback *State::getCurrentTransformFeedback() const
1067{
1068 return mTransformFeedback.get();
1069}
1070
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001071bool State::isTransformFeedbackActiveUnpaused() const
1072{
1073 gl::TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001074 return curTransformFeedback && curTransformFeedback->isActive() && !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001075}
1076
Corentin Walleza2257da2016-04-19 16:43:12 -04001077bool State::removeTransformFeedbackBinding(GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001078{
1079 if (mTransformFeedback.id() == transformFeedback)
1080 {
Corentin Walleza2257da2016-04-19 16:43:12 -04001081 mTransformFeedback.set(nullptr);
1082 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001083 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001084
1085 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001086}
1087
Olli Etuahobbf1c102016-06-28 13:31:33 +03001088bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001089{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001090 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001091 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001092 const Query *query = iter.second.get();
1093 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001094 {
1095 return true;
1096 }
1097 }
1098
1099 return false;
1100}
1101
1102bool State::isQueryActive(Query *query) const
1103{
1104 for (auto &iter : mActiveQueries)
1105 {
1106 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001107 {
1108 return true;
1109 }
1110 }
1111
1112 return false;
1113}
1114
1115void State::setActiveQuery(GLenum target, Query *query)
1116{
1117 mActiveQueries[target].set(query);
1118}
1119
1120GLuint State::getActiveQueryId(GLenum target) const
1121{
1122 const Query *query = getActiveQuery(target);
1123 return (query ? query->id() : 0u);
1124}
1125
1126Query *State::getActiveQuery(GLenum target) const
1127{
Jamie Madill5864ac22015-01-12 14:43:07 -05001128 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001129
Jamie Madill5864ac22015-01-12 14:43:07 -05001130 // All query types should already exist in the activeQueries map
1131 ASSERT(it != mActiveQueries.end());
1132
1133 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001134}
1135
1136void State::setArrayBufferBinding(Buffer *buffer)
1137{
1138 mArrayBuffer.set(buffer);
1139}
1140
1141GLuint State::getArrayBufferId() const
1142{
1143 return mArrayBuffer.id();
1144}
1145
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001146void State::setDrawIndirectBufferBinding(Buffer *buffer)
1147{
1148 mDrawIndirectBuffer.set(buffer);
1149 mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
1150}
1151
Shannon Woods53a94a82014-06-24 15:20:36 -04001152void State::setGenericUniformBufferBinding(Buffer *buffer)
1153{
1154 mGenericUniformBuffer.set(buffer);
1155}
1156
1157void State::setIndexedUniformBufferBinding(GLuint index, Buffer *buffer, GLintptr offset, GLsizeiptr size)
1158{
1159 mUniformBuffers[index].set(buffer, offset, size);
1160}
1161
Geoff Lang5d124a62015-09-15 13:03:27 -04001162const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001163{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001164 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001165 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001166}
1167
Jiajia Qin6eafb042016-12-27 17:04:07 +08001168void State::setGenericAtomicCounterBufferBinding(Buffer *buffer)
1169{
1170 mGenericAtomicCounterBuffer.set(buffer);
1171}
1172
1173void State::setIndexedAtomicCounterBufferBinding(GLuint index,
1174 Buffer *buffer,
1175 GLintptr offset,
1176 GLsizeiptr size)
1177{
1178 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1179 mAtomicCounterBuffers[index].set(buffer, offset, size);
1180}
1181
1182const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1183{
1184 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1185 return mAtomicCounterBuffers[index];
1186}
1187
Shannon Woods53a94a82014-06-24 15:20:36 -04001188void State::setCopyReadBufferBinding(Buffer *buffer)
1189{
1190 mCopyReadBuffer.set(buffer);
1191}
1192
1193void State::setCopyWriteBufferBinding(Buffer *buffer)
1194{
1195 mCopyWriteBuffer.set(buffer);
1196}
1197
1198void State::setPixelPackBufferBinding(Buffer *buffer)
1199{
1200 mPack.pixelBuffer.set(buffer);
Corentin Wallezbbd663a2016-04-20 17:49:17 -04001201 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001202}
1203
1204void State::setPixelUnpackBufferBinding(Buffer *buffer)
1205{
1206 mUnpack.pixelBuffer.set(buffer);
Corentin Wallezbbd663a2016-04-20 17:49:17 -04001207 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001208}
1209
1210Buffer *State::getTargetBuffer(GLenum target) const
1211{
1212 switch (target)
1213 {
1214 case GL_ARRAY_BUFFER: return mArrayBuffer.get();
1215 case GL_COPY_READ_BUFFER: return mCopyReadBuffer.get();
1216 case GL_COPY_WRITE_BUFFER: return mCopyWriteBuffer.get();
Jamie Madill8e344942015-07-09 14:22:07 -04001217 case GL_ELEMENT_ARRAY_BUFFER: return getVertexArray()->getElementArrayBuffer().get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001218 case GL_PIXEL_PACK_BUFFER: return mPack.pixelBuffer.get();
1219 case GL_PIXEL_UNPACK_BUFFER: return mUnpack.pixelBuffer.get();
Geoff Lang045536b2015-03-27 15:17:18 -04001220 case GL_TRANSFORM_FEEDBACK_BUFFER: return mTransformFeedback->getGenericBuffer().get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001221 case GL_UNIFORM_BUFFER: return mGenericUniformBuffer.get();
Geoff Langb5e997f2016-12-06 10:55:34 -05001222 case GL_ATOMIC_COUNTER_BUFFER:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001223 return mGenericAtomicCounterBuffer.get();
Geoff Langb5e997f2016-12-06 10:55:34 -05001224 case GL_SHADER_STORAGE_BUFFER:
1225 UNIMPLEMENTED();
1226 return nullptr;
1227 case GL_DRAW_INDIRECT_BUFFER:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001228 return mDrawIndirectBuffer.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001229 default: UNREACHABLE(); return NULL;
1230 }
1231}
1232
Yuly Novikov5807a532015-12-03 13:01:22 -05001233void State::detachBuffer(GLuint bufferName)
1234{
Jiajia Qin6eafb042016-12-27 17:04:07 +08001235 BindingPointer<Buffer> *buffers[] = {&mArrayBuffer, &mGenericAtomicCounterBuffer,
1236 &mCopyReadBuffer, &mCopyWriteBuffer,
1237 &mDrawIndirectBuffer, &mPack.pixelBuffer,
1238 &mUnpack.pixelBuffer, &mGenericUniformBuffer};
Yuly Novikov5807a532015-12-03 13:01:22 -05001239 for (auto buffer : buffers)
1240 {
1241 if (buffer->id() == bufferName)
1242 {
1243 buffer->set(nullptr);
1244 }
1245 }
1246
1247 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1248 if (curTransformFeedback)
1249 {
1250 curTransformFeedback->detachBuffer(bufferName);
1251 }
1252
1253 getVertexArray()->detachBuffer(bufferName);
1254}
1255
Shannon Woods53a94a82014-06-24 15:20:36 -04001256void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1257{
1258 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001259 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001260}
1261
1262void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1263{
Shannon Woods23e05002014-09-22 19:07:27 -04001264 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001265 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001266 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001267}
1268
1269void State::setVertexAttribu(GLuint index, const GLuint values[4])
1270{
Shannon Woods23e05002014-09-22 19:07:27 -04001271 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001272 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001273 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001274}
1275
1276void State::setVertexAttribi(GLuint index, const GLint values[4])
1277{
Shannon Woods23e05002014-09-22 19:07:27 -04001278 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001279 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madill1e0bc3a2015-08-11 08:12:21 -04001280 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001281}
1282
Jamie Madill0b9e9032015-08-17 11:51:52 +00001283void State::setVertexAttribState(unsigned int attribNum,
1284 Buffer *boundBuffer,
1285 GLint size,
1286 GLenum type,
1287 bool normalized,
1288 bool pureInteger,
1289 GLsizei stride,
1290 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001291{
1292 getVertexArray()->setAttributeState(attribNum, boundBuffer, size, type, normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001293 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001294}
1295
1296void State::setVertexAttribDivisor(GLuint index, GLuint divisor)
1297{
1298 getVertexArray()->setVertexAttribDivisor(index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001299 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001300}
1301
Shannon Woods53a94a82014-06-24 15:20:36 -04001302const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(unsigned int attribNum) const
1303{
Shannon Woods23e05002014-09-22 19:07:27 -04001304 ASSERT(static_cast<size_t>(attribNum) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001305 return mVertexAttribCurrentValues[attribNum];
1306}
1307
Shannon Woods53a94a82014-06-24 15:20:36 -04001308const void *State::getVertexAttribPointer(unsigned int attribNum) const
1309{
1310 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1311}
1312
1313void State::setPackAlignment(GLint alignment)
1314{
1315 mPack.alignment = alignment;
Jamie Madill1b94d432015-08-07 13:23:23 -04001316 mDirtyBits.set(DIRTY_BIT_PACK_ALIGNMENT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001317}
1318
1319GLint State::getPackAlignment() const
1320{
1321 return mPack.alignment;
1322}
1323
1324void State::setPackReverseRowOrder(bool reverseRowOrder)
1325{
1326 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madill1b94d432015-08-07 13:23:23 -04001327 mDirtyBits.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001328}
1329
1330bool State::getPackReverseRowOrder() const
1331{
1332 return mPack.reverseRowOrder;
1333}
1334
Minmin Gongadff67b2015-10-14 10:34:45 -04001335void State::setPackRowLength(GLint rowLength)
1336{
1337 mPack.rowLength = rowLength;
1338 mDirtyBits.set(DIRTY_BIT_PACK_ROW_LENGTH);
1339}
1340
1341GLint State::getPackRowLength() const
1342{
1343 return mPack.rowLength;
1344}
1345
1346void State::setPackSkipRows(GLint skipRows)
1347{
1348 mPack.skipRows = skipRows;
1349 mDirtyBits.set(DIRTY_BIT_PACK_SKIP_ROWS);
1350}
1351
1352GLint State::getPackSkipRows() const
1353{
1354 return mPack.skipRows;
1355}
1356
1357void State::setPackSkipPixels(GLint skipPixels)
1358{
1359 mPack.skipPixels = skipPixels;
1360 mDirtyBits.set(DIRTY_BIT_PACK_SKIP_PIXELS);
1361}
1362
1363GLint State::getPackSkipPixels() const
1364{
1365 return mPack.skipPixels;
1366}
1367
Shannon Woods53a94a82014-06-24 15:20:36 -04001368const PixelPackState &State::getPackState() const
1369{
1370 return mPack;
1371}
1372
Jamie Madill87de3622015-03-16 10:41:44 -04001373PixelPackState &State::getPackState()
1374{
1375 return mPack;
1376}
1377
Shannon Woods53a94a82014-06-24 15:20:36 -04001378void State::setUnpackAlignment(GLint alignment)
1379{
1380 mUnpack.alignment = alignment;
Jamie Madill1b94d432015-08-07 13:23:23 -04001381 mDirtyBits.set(DIRTY_BIT_UNPACK_ALIGNMENT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001382}
1383
1384GLint State::getUnpackAlignment() const
1385{
1386 return mUnpack.alignment;
1387}
1388
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001389void State::setUnpackRowLength(GLint rowLength)
1390{
1391 mUnpack.rowLength = rowLength;
Jamie Madill1b94d432015-08-07 13:23:23 -04001392 mDirtyBits.set(DIRTY_BIT_UNPACK_ROW_LENGTH);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001393}
1394
1395GLint State::getUnpackRowLength() const
1396{
1397 return mUnpack.rowLength;
1398}
1399
Minmin Gongadff67b2015-10-14 10:34:45 -04001400void State::setUnpackImageHeight(GLint imageHeight)
1401{
1402 mUnpack.imageHeight = imageHeight;
1403 mDirtyBits.set(DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
1404}
1405
1406GLint State::getUnpackImageHeight() const
1407{
1408 return mUnpack.imageHeight;
1409}
1410
1411void State::setUnpackSkipImages(GLint skipImages)
1412{
1413 mUnpack.skipImages = skipImages;
1414 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_IMAGES);
1415}
1416
1417GLint State::getUnpackSkipImages() const
1418{
1419 return mUnpack.skipImages;
1420}
1421
1422void State::setUnpackSkipRows(GLint skipRows)
1423{
1424 mUnpack.skipRows = skipRows;
1425 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_ROWS);
1426}
1427
1428GLint State::getUnpackSkipRows() const
1429{
1430 return mUnpack.skipRows;
1431}
1432
1433void State::setUnpackSkipPixels(GLint skipPixels)
1434{
1435 mUnpack.skipPixels = skipPixels;
1436 mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_PIXELS);
1437}
1438
1439GLint State::getUnpackSkipPixels() const
1440{
1441 return mUnpack.skipPixels;
1442}
1443
Shannon Woods53a94a82014-06-24 15:20:36 -04001444const PixelUnpackState &State::getUnpackState() const
1445{
1446 return mUnpack;
1447}
1448
Jamie Madill67102f02015-03-16 10:41:42 -04001449PixelUnpackState &State::getUnpackState()
1450{
1451 return mUnpack;
1452}
1453
Geoff Lang70d0f492015-12-10 17:45:46 -05001454const Debug &State::getDebug() const
1455{
1456 return mDebug;
1457}
1458
1459Debug &State::getDebug()
1460{
1461 return mDebug;
1462}
1463
Sami Väisänena797e062016-05-12 15:23:40 +03001464void State::setCoverageModulation(GLenum components)
1465{
1466 mCoverageModulation = components;
1467 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1468}
1469
1470GLenum State::getCoverageModulation() const
1471{
1472 return mCoverageModulation;
1473}
1474
Sami Väisänene45e53b2016-05-25 10:36:04 +03001475void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1476{
1477 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1478 {
1479 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1480 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1481 }
1482 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1483 {
1484 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1485 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1486 }
1487 else
1488 {
1489 UNREACHABLE();
1490 }
1491}
1492
1493const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1494{
1495 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1496 {
1497 return mPathMatrixMV;
1498 }
1499 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1500 {
1501 return mPathMatrixProj;
1502 }
1503
1504 UNREACHABLE();
1505 return nullptr;
1506}
1507
1508void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1509{
1510 mPathStencilFunc = func;
1511 mPathStencilRef = ref;
1512 mPathStencilMask = mask;
1513 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1514}
1515
1516GLenum State::getPathStencilFunc() const
1517{
1518 return mPathStencilFunc;
1519}
1520
1521GLint State::getPathStencilRef() const
1522{
1523 return mPathStencilRef;
1524}
1525
1526GLuint State::getPathStencilMask() const
1527{
1528 return mPathStencilMask;
1529}
1530
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001531void State::setFramebufferSRGB(bool sRGB)
1532{
1533 mFramebufferSRGB = sRGB;
1534 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1535}
1536
1537bool State::getFramebufferSRGB() const
1538{
1539 return mFramebufferSRGB;
1540}
1541
Shannon Woods53a94a82014-06-24 15:20:36 -04001542void State::getBooleanv(GLenum pname, GLboolean *params)
1543{
1544 switch (pname)
1545 {
1546 case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
1547 case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
1548 case GL_COLOR_WRITEMASK:
1549 params[0] = mBlend.colorMaskRed;
1550 params[1] = mBlend.colorMaskGreen;
1551 params[2] = mBlend.colorMaskBlue;
1552 params[3] = mBlend.colorMaskAlpha;
1553 break;
1554 case GL_CULL_FACE: *params = mRasterizer.cullFace; break;
1555 case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
1556 case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
1557 case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
1558 case GL_SCISSOR_TEST: *params = mScissorTest; break;
1559 case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
1560 case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
1561 case GL_BLEND: *params = mBlend.blend; break;
1562 case GL_DITHER: *params = mBlend.dither; break;
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001563 case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE; break;
1564 case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE; break;
Jamie Madille2cd53d2015-10-27 11:15:46 -04001565 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1566 *params = mPrimitiveRestart;
1567 break;
Geoff Langab831f02015-12-01 09:39:10 -05001568 case GL_RASTERIZER_DISCARD:
1569 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1570 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001571 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1572 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1573 break;
1574 case GL_DEBUG_OUTPUT:
1575 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1576 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001577 case GL_MULTISAMPLE_EXT:
1578 *params = mMultiSampling;
1579 break;
1580 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1581 *params = mSampleAlphaToOne;
1582 break;
Geoff Langf41a7152016-09-19 15:11:17 -04001583 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1584 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1585 break;
Geoff Langfeb8c682017-02-13 16:07:35 -05001586 case GL_CLIENT_ARRAYS_ANGLE:
1587 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1588 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001589 case GL_FRAMEBUFFER_SRGB_EXT:
1590 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1591 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001592 default:
1593 UNREACHABLE();
1594 break;
1595 }
1596}
1597
1598void State::getFloatv(GLenum pname, GLfloat *params)
1599{
1600 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1601 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1602 // GetIntegerv as its native query function. As it would require conversion in any
1603 // case, this should make no difference to the calling application.
1604 switch (pname)
1605 {
1606 case GL_LINE_WIDTH: *params = mLineWidth; break;
1607 case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
1608 case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
1609 case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
1610 case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
1611 case GL_DEPTH_RANGE:
1612 params[0] = mNearZ;
1613 params[1] = mFarZ;
1614 break;
1615 case GL_COLOR_CLEAR_VALUE:
1616 params[0] = mColorClearValue.red;
1617 params[1] = mColorClearValue.green;
1618 params[2] = mColorClearValue.blue;
1619 params[3] = mColorClearValue.alpha;
1620 break;
1621 case GL_BLEND_COLOR:
1622 params[0] = mBlendColor.red;
1623 params[1] = mBlendColor.green;
1624 params[2] = mBlendColor.blue;
1625 params[3] = mBlendColor.alpha;
1626 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001627 case GL_MULTISAMPLE_EXT:
1628 *params = static_cast<GLfloat>(mMultiSampling);
1629 break;
1630 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1631 *params = static_cast<GLfloat>(mSampleAlphaToOne);
Sami Väisänena797e062016-05-12 15:23:40 +03001632 case GL_COVERAGE_MODULATION_CHROMIUM:
Jamie Madille2e406c2016-06-02 13:04:10 -04001633 params[0] = static_cast<GLfloat>(mCoverageModulation);
1634 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001635 default:
1636 UNREACHABLE();
1637 break;
1638 }
1639}
1640
Jamie Madill9082b982016-04-27 15:21:51 -04001641void State::getIntegerv(const ContextState &data, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001642{
1643 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1644 {
1645 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001646 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001647 Framebuffer *framebuffer = mDrawFramebuffer;
1648 *params = framebuffer->getDrawBufferState(colorAttachment);
1649 return;
1650 }
1651
1652 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1653 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1654 // GetIntegerv as its native query function. As it would require conversion in any
1655 // case, this should make no difference to the calling application. You may find it in
1656 // State::getFloatv.
1657 switch (pname)
1658 {
1659 case GL_ARRAY_BUFFER_BINDING: *params = mArrayBuffer.id(); break;
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001660 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1661 *params = mDrawIndirectBuffer.id();
1662 break;
Jamie Madill8e344942015-07-09 14:22:07 -04001663 case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = getVertexArray()->getElementArrayBuffer().id(); break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001664 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1665 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
1666 case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
1667 case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
1668 case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
Geoff Lang7dd2e102014-11-10 15:19:26 -05001669 case GL_CURRENT_PROGRAM: *params = mProgram ? mProgram->id() : 0; break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001670 case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
1671 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001672 case GL_PACK_ROW_LENGTH:
1673 *params = mPack.rowLength;
1674 break;
1675 case GL_PACK_SKIP_ROWS:
1676 *params = mPack.skipRows;
1677 break;
1678 case GL_PACK_SKIP_PIXELS:
1679 *params = mPack.skipPixels;
1680 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001681 case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001682 case GL_UNPACK_ROW_LENGTH: *params = mUnpack.rowLength; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001683 case GL_UNPACK_IMAGE_HEIGHT:
1684 *params = mUnpack.imageHeight;
1685 break;
1686 case GL_UNPACK_SKIP_IMAGES:
1687 *params = mUnpack.skipImages;
1688 break;
1689 case GL_UNPACK_SKIP_ROWS:
1690 *params = mUnpack.skipRows;
1691 break;
1692 case GL_UNPACK_SKIP_PIXELS:
1693 *params = mUnpack.skipPixels;
1694 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001695 case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
1696 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001697 case GL_ACTIVE_TEXTURE:
1698 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
1699 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001700 case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
1701 case GL_STENCIL_REF: *params = mStencilRef; break;
1702 case GL_STENCIL_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilMask); break;
1703 case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
1704 case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
1705 case GL_STENCIL_BACK_VALUE_MASK: *params = clampToInt(mDepthStencil.stencilBackMask); break;
1706 case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
1707 case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
1708 case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
1709 case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
1710 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
1711 case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
1712 case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
1713 case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
1714 case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
1715 case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
1716 case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
1717 case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
1718 case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
1719 case GL_STENCIL_WRITEMASK: *params = clampToInt(mDepthStencil.stencilWritemask); break;
1720 case GL_STENCIL_BACK_WRITEMASK: *params = clampToInt(mDepthStencil.stencilBackWritemask); break;
1721 case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
Geoff Langbce529e2014-12-01 12:48:41 -05001722 case GL_IMPLEMENTATION_COLOR_READ_TYPE: *params = mReadFramebuffer->getImplementationColorReadType(); break;
1723 case GL_IMPLEMENTATION_COLOR_READ_FORMAT: *params = mReadFramebuffer->getImplementationColorReadFormat(); break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001724 case GL_SAMPLE_BUFFERS:
1725 case GL_SAMPLES:
1726 {
1727 gl::Framebuffer *framebuffer = mDrawFramebuffer;
Geoff Lang748f74e2014-12-01 11:25:34 -05001728 if (framebuffer->checkStatus(data) == GL_FRAMEBUFFER_COMPLETE)
Shannon Woods53a94a82014-06-24 15:20:36 -04001729 {
1730 switch (pname)
1731 {
1732 case GL_SAMPLE_BUFFERS:
Jamie Madill48faf802014-11-06 15:27:22 -05001733 if (framebuffer->getSamples(data) != 0)
Shannon Woods53a94a82014-06-24 15:20:36 -04001734 {
1735 *params = 1;
1736 }
1737 else
1738 {
1739 *params = 0;
1740 }
1741 break;
1742 case GL_SAMPLES:
Jamie Madill48faf802014-11-06 15:27:22 -05001743 *params = framebuffer->getSamples(data);
Shannon Woods53a94a82014-06-24 15:20:36 -04001744 break;
1745 }
1746 }
1747 else
1748 {
1749 *params = 0;
1750 }
1751 }
1752 break;
1753 case GL_VIEWPORT:
1754 params[0] = mViewport.x;
1755 params[1] = mViewport.y;
1756 params[2] = mViewport.width;
1757 params[3] = mViewport.height;
1758 break;
1759 case GL_SCISSOR_BOX:
1760 params[0] = mScissor.x;
1761 params[1] = mScissor.y;
1762 params[2] = mScissor.width;
1763 params[3] = mScissor.height;
1764 break;
1765 case GL_CULL_FACE_MODE: *params = mRasterizer.cullMode; break;
1766 case GL_FRONT_FACE: *params = mRasterizer.frontFace; break;
1767 case GL_RED_BITS:
1768 case GL_GREEN_BITS:
1769 case GL_BLUE_BITS:
1770 case GL_ALPHA_BITS:
1771 {
1772 gl::Framebuffer *framebuffer = getDrawFramebuffer();
Jamie Madillb6bda4a2015-04-20 12:53:26 -04001773 const gl::FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001774
1775 if (colorbuffer)
1776 {
1777 switch (pname)
1778 {
1779 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1780 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1781 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1782 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1783 }
1784 }
1785 else
1786 {
1787 *params = 0;
1788 }
1789 }
1790 break;
1791 case GL_DEPTH_BITS:
1792 {
Jamie Madille3ef7152015-04-28 16:55:17 +00001793 const gl::Framebuffer *framebuffer = getDrawFramebuffer();
1794 const gl::FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001795
1796 if (depthbuffer)
1797 {
1798 *params = depthbuffer->getDepthSize();
1799 }
1800 else
1801 {
1802 *params = 0;
1803 }
1804 }
1805 break;
1806 case GL_STENCIL_BITS:
1807 {
Jamie Madille3ef7152015-04-28 16:55:17 +00001808 const gl::Framebuffer *framebuffer = getDrawFramebuffer();
1809 const gl::FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001810
1811 if (stencilbuffer)
1812 {
1813 *params = stencilbuffer->getStencilSize();
1814 }
1815 else
1816 {
1817 *params = 0;
1818 }
1819 }
1820 break;
1821 case GL_TEXTURE_BINDING_2D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001822 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001823 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001824 break;
1825 case GL_TEXTURE_BINDING_CUBE_MAP:
Shannon Woods2df6a602014-09-26 16:12:07 -04001826 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001827 *params =
1828 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_CUBE_MAP);
Shannon Woods53a94a82014-06-24 15:20:36 -04001829 break;
1830 case GL_TEXTURE_BINDING_3D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001831 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001832 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_3D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001833 break;
1834 case GL_TEXTURE_BINDING_2D_ARRAY:
Shannon Woods2df6a602014-09-26 16:12:07 -04001835 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001836 *params =
1837 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001838 break;
John Bauman18319182016-09-28 14:22:27 -07001839 case GL_TEXTURE_BINDING_EXTERNAL_OES:
1840 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1841 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
1842 GL_TEXTURE_EXTERNAL_OES);
1843 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001844 case GL_UNIFORM_BUFFER_BINDING:
1845 *params = mGenericUniformBuffer.id();
1846 break;
Frank Henigman22581ff2015-11-06 14:25:54 -05001847 case GL_TRANSFORM_FEEDBACK_BINDING:
Frank Henigmanb0f0b812015-11-21 17:49:29 -05001848 *params = mTransformFeedback.id();
Frank Henigman22581ff2015-11-06 14:25:54 -05001849 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001850 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Geoff Lang045536b2015-03-27 15:17:18 -04001851 *params = mTransformFeedback->getGenericBuffer().id();
Shannon Woods53a94a82014-06-24 15:20:36 -04001852 break;
1853 case GL_COPY_READ_BUFFER_BINDING:
1854 *params = mCopyReadBuffer.id();
1855 break;
1856 case GL_COPY_WRITE_BUFFER_BINDING:
1857 *params = mCopyWriteBuffer.id();
1858 break;
1859 case GL_PIXEL_PACK_BUFFER_BINDING:
1860 *params = mPack.pixelBuffer.id();
1861 break;
1862 case GL_PIXEL_UNPACK_BUFFER_BINDING:
1863 *params = mUnpack.pixelBuffer.id();
1864 break;
Olli Etuaho86821db2016-03-04 12:05:47 +02001865 case GL_READ_BUFFER:
1866 *params = mReadFramebuffer->getReadBufferState();
1867 break;
1868 case GL_SAMPLER_BINDING:
1869 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1870 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
1871 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001872 case GL_DEBUG_LOGGED_MESSAGES:
1873 *params = static_cast<GLint>(mDebug.getMessageCount());
1874 break;
1875 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
1876 *params = static_cast<GLint>(mDebug.getNextMessageLength());
1877 break;
1878 case GL_DEBUG_GROUP_STACK_DEPTH:
1879 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
1880 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001881 case GL_MULTISAMPLE_EXT:
1882 *params = static_cast<GLint>(mMultiSampling);
1883 break;
1884 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1885 *params = static_cast<GLint>(mSampleAlphaToOne);
Sami Väisänena797e062016-05-12 15:23:40 +03001886 case GL_COVERAGE_MODULATION_CHROMIUM:
1887 *params = static_cast<GLint>(mCoverageModulation);
Sami Väisänen74c23472016-05-09 17:30:30 +03001888 break;
Jiajia Qin6eafb042016-12-27 17:04:07 +08001889 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1890 *params = mGenericAtomicCounterBuffer.id();
1891 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001892 default:
1893 UNREACHABLE();
1894 break;
1895 }
1896}
1897
Geoff Lang70d0f492015-12-10 17:45:46 -05001898void State::getPointerv(GLenum pname, void **params) const
1899{
1900 switch (pname)
1901 {
1902 case GL_DEBUG_CALLBACK_FUNCTION:
1903 *params = reinterpret_cast<void *>(mDebug.getCallback());
1904 break;
1905 case GL_DEBUG_CALLBACK_USER_PARAM:
1906 *params = const_cast<void *>(mDebug.getUserParam());
1907 break;
1908 default:
1909 UNREACHABLE();
1910 break;
1911 }
1912}
1913
Martin Radev66fb8202016-07-28 11:45:20 +03001914void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04001915{
1916 switch (target)
1917 {
1918 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001919 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
1920 *data = mTransformFeedback->getIndexedBuffer(index).id();
1921 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001922 case GL_UNIFORM_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001923 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
1924 *data = mUniformBuffers[index].id();
1925 break;
1926 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1927 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1928 *data = mAtomicCounterBuffers[index].id();
1929 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001930 default:
Martin Radev66fb8202016-07-28 11:45:20 +03001931 UNREACHABLE();
1932 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001933 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001934}
1935
Martin Radev66fb8202016-07-28 11:45:20 +03001936void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04001937{
1938 switch (target)
1939 {
1940 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001941 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
1942 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
1943 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001944 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001945 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
1946 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
1947 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001948 case GL_UNIFORM_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001949 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
1950 *data = mUniformBuffers[index].getOffset();
1951 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001952 case GL_UNIFORM_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08001953 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
1954 *data = mUniformBuffers[index].getSize();
1955 break;
1956 case GL_ATOMIC_COUNTER_BUFFER_START:
1957 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1958 *data = mAtomicCounterBuffers[index].getOffset();
1959 break;
1960 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
1961 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1962 *data = mAtomicCounterBuffers[index].getSize();
1963 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001964 default:
Martin Radev66fb8202016-07-28 11:45:20 +03001965 UNREACHABLE();
1966 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001967 }
Martin Radev66fb8202016-07-28 11:45:20 +03001968}
Shannon Woods53a94a82014-06-24 15:20:36 -04001969
Martin Radev66fb8202016-07-28 11:45:20 +03001970void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
1971{
1972 UNREACHABLE();
Shannon Woods53a94a82014-06-24 15:20:36 -04001973}
1974
Jamie Madilld9ba4f72014-08-04 10:47:59 -04001975bool State::hasMappedBuffer(GLenum target) const
1976{
1977 if (target == GL_ARRAY_BUFFER)
1978 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001979 const VertexArray *vao = getVertexArray();
Jamie Madilleea3a6e2015-04-15 10:02:48 -04001980 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001981 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madill8e344942015-07-09 14:22:07 -04001982 size_t maxEnabledAttrib = vao->getMaxEnabledAttribute();
Jamie Madillaebf9dd2015-04-28 12:39:07 -04001983 for (size_t attribIndex = 0; attribIndex < maxEnabledAttrib; attribIndex++)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04001984 {
Jamie Madilleea3a6e2015-04-15 10:02:48 -04001985 const gl::VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001986 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].buffer.get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04001987 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
1988 {
1989 return true;
1990 }
1991 }
1992
1993 return false;
1994 }
1995 else
1996 {
1997 Buffer *buffer = getTargetBuffer(target);
1998 return (buffer && buffer->isMapped());
1999 }
2000}
2001
Jamie Madillc9d442d2016-01-20 11:17:24 -05002002void State::syncDirtyObjects()
2003{
2004 if (!mDirtyObjects.any())
2005 return;
2006
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002007 syncDirtyObjects(mDirtyObjects);
2008}
2009
2010void State::syncDirtyObjects(const DirtyObjects &bitset)
2011{
2012 for (auto dirtyObject : angle::IterateBitSet(bitset))
Jamie Madillc9d442d2016-01-20 11:17:24 -05002013 {
2014 switch (dirtyObject)
2015 {
2016 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002017 ASSERT(mReadFramebuffer);
2018 mReadFramebuffer->syncState();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002019 break;
2020 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002021 ASSERT(mDrawFramebuffer);
2022 mDrawFramebuffer->syncState();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002023 break;
2024 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002025 ASSERT(mVertexArray);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002026 mVertexArray->syncImplState();
2027 break;
2028 case DIRTY_OBJECT_PROGRAM:
2029 // TODO(jmadill): implement this
2030 break;
2031 default:
2032 UNREACHABLE();
2033 break;
2034 }
2035 }
2036
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002037 mDirtyObjects &= ~bitset;
2038}
2039
2040void State::syncDirtyObject(GLenum target)
2041{
2042 DirtyObjects localSet;
2043
2044 switch (target)
2045 {
2046 case GL_READ_FRAMEBUFFER:
2047 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2048 break;
2049 case GL_DRAW_FRAMEBUFFER:
2050 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2051 break;
2052 case GL_FRAMEBUFFER:
2053 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2054 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2055 break;
2056 case GL_VERTEX_ARRAY:
2057 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2058 break;
2059 case GL_PROGRAM:
2060 localSet.set(DIRTY_OBJECT_PROGRAM);
2061 break;
2062 }
2063
2064 syncDirtyObjects(localSet);
2065}
2066
2067void State::setObjectDirty(GLenum target)
2068{
2069 switch (target)
2070 {
2071 case GL_READ_FRAMEBUFFER:
2072 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2073 break;
2074 case GL_DRAW_FRAMEBUFFER:
2075 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2076 break;
2077 case GL_FRAMEBUFFER:
2078 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2079 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2080 break;
2081 case GL_VERTEX_ARRAY:
2082 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2083 break;
2084 case GL_PROGRAM:
2085 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
2086 break;
2087 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002088}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002089
2090} // namespace gl