blob: d837af8558baa9b3ae66544ac9e6cb330d9d264c [file] [log] [blame]
Shannon Woods53a94a82014-06-24 15:20:36 -04001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// State.cpp: Implements the State class, encapsulating raw GL state.
8
Geoff Lang2b5420c2014-11-19 14:20:15 -05009#include "libANGLE/State.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040010
Sami Väisänene45e53b2016-05-25 10:36:04 +030011#include <limits>
12#include <string.h>
13
Jamie Madill20e005b2017-04-07 14:19:22 -040014#include "common/bitset_utils.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030015#include "common/mathutil.h"
jchen10a99ed552017-09-22 08:10:32 +080016#include "common/matrix_utils.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050017#include "libANGLE/Caps.h"
jchen10a99ed552017-09-22 08:10:32 +080018#include "libANGLE/Context.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"
jchen10a99ed552017-09-22 08:10:32 +080025#include "libANGLE/queryconversions.h"
Geoff Lang4751aab2017-10-30 15:14:52 -040026#include "libANGLE/renderer/ContextImpl.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040027
Olli Etuahobbf1c102016-06-28 13:31:33 +030028namespace
29{
30
31GLenum ActiveQueryType(const GLenum type)
32{
33 return (type == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) ? GL_ANY_SAMPLES_PASSED : type;
34}
35
36} // anonymous namepace
37
Shannon Woods53a94a82014-06-24 15:20:36 -040038namespace gl
39{
Geoff Lang76b10c92014-09-05 16:28:14 -040040
Shannon Woods53a94a82014-06-24 15:20:36 -040041State::State()
Jamie Madille79b1e12015-11-04 16:36:37 -050042 : mMaxDrawBuffers(0),
43 mMaxCombinedTextureImageUnits(0),
44 mDepthClearValue(0),
45 mStencilClearValue(0),
46 mScissorTest(false),
47 mSampleCoverage(false),
48 mSampleCoverageValue(0),
49 mSampleCoverageInvert(false),
Jiawei Shaodb342272017-09-27 10:21:45 +080050 mSampleMask(false),
51 mMaxSampleMaskWords(0),
Jamie Madille79b1e12015-11-04 16:36:37 -050052 mStencilRef(0),
53 mStencilBackRef(0),
54 mLineWidth(0),
55 mGenerateMipmapHint(GL_NONE),
56 mFragmentShaderDerivativeHint(GL_NONE),
Geoff Langf41a7152016-09-19 15:11:17 -040057 mBindGeneratesResource(true),
Geoff Langfeb8c682017-02-13 16:07:35 -050058 mClientArraysEnabled(true),
Jamie Madille79b1e12015-11-04 16:36:37 -050059 mNearZ(0),
60 mFarZ(0),
61 mReadFramebuffer(nullptr),
62 mDrawFramebuffer(nullptr),
63 mProgram(nullptr),
64 mVertexArray(nullptr),
65 mActiveSampler(0),
Sami Väisänen74c23472016-05-09 17:30:30 +030066 mPrimitiveRestart(false),
67 mMultiSampling(false),
Geoff Lang1d2c41d2016-10-19 16:14:46 -070068 mSampleAlphaToOne(false),
Jamie Madille08a1d32017-03-07 17:24:06 -050069 mFramebufferSRGB(true),
Jamie Madillc43be722017-07-13 16:22:14 -040070 mRobustResourceInit(false),
71 mProgramBinaryCacheEnabled(false)
Shannon Woods53a94a82014-06-24 15:20:36 -040072{
Geoff Lang76b10c92014-09-05 16:28:14 -040073}
74
75State::~State()
76{
Geoff Lang76b10c92014-09-05 16:28:14 -040077}
78
Jamie Madill4928b7c2017-06-20 12:57:39 -040079void State::initialize(const Context *context,
Geoff Langf41a7152016-09-19 15:11:17 -040080 bool debug,
Geoff Langfeb8c682017-02-13 16:07:35 -050081 bool bindGeneratesResource,
Jamie Madille08a1d32017-03-07 17:24:06 -050082 bool clientArraysEnabled,
Jamie Madillc43be722017-07-13 16:22:14 -040083 bool robustResourceInit,
84 bool programBinaryCacheEnabled)
Geoff Lang76b10c92014-09-05 16:28:14 -040085{
Jamie Madill4928b7c2017-06-20 12:57:39 -040086 const Caps &caps = context->getCaps();
87 const Extensions &extensions = context->getExtensions();
Geoff Lang4751aab2017-10-30 15:14:52 -040088 const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
Jamie Madill4928b7c2017-06-20 12:57:39 -040089 const Version &clientVersion = context->getClientVersion();
90
Shannon Woods2df6a602014-09-26 16:12:07 -040091 mMaxDrawBuffers = caps.maxDrawBuffers;
92 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -040093
Jamie Madillf75ab352015-03-16 10:46:52 -040094 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -040095
96 mDepthClearValue = 1.0f;
97 mStencilClearValue = 0;
98
Shannon Woods53a94a82014-06-24 15:20:36 -040099 mScissorTest = false;
100 mScissor.x = 0;
101 mScissor.y = 0;
102 mScissor.width = 0;
103 mScissor.height = 0;
104
Shannon Woods53a94a82014-06-24 15:20:36 -0400105 mBlendColor.red = 0;
106 mBlendColor.green = 0;
107 mBlendColor.blue = 0;
108 mBlendColor.alpha = 0;
109
Shannon Woods53a94a82014-06-24 15:20:36 -0400110 mStencilRef = 0;
111 mStencilBackRef = 0;
112
113 mSampleCoverage = false;
114 mSampleCoverageValue = 1.0f;
115 mSampleCoverageInvert = false;
Jiawei Shaodb342272017-09-27 10:21:45 +0800116
117 mMaxSampleMaskWords = caps.maxSampleMaskWords;
118 mSampleMask = false;
119 mSampleMaskValues.fill(~GLbitfield(0));
120
Shannon Woods53a94a82014-06-24 15:20:36 -0400121 mGenerateMipmapHint = GL_DONT_CARE;
122 mFragmentShaderDerivativeHint = GL_DONT_CARE;
123
Geoff Langf41a7152016-09-19 15:11:17 -0400124 mBindGeneratesResource = bindGeneratesResource;
Geoff Langfeb8c682017-02-13 16:07:35 -0500125 mClientArraysEnabled = clientArraysEnabled;
Geoff Langf41a7152016-09-19 15:11:17 -0400126
Shannon Woods53a94a82014-06-24 15:20:36 -0400127 mLineWidth = 1.0f;
128
129 mViewport.x = 0;
130 mViewport.y = 0;
131 mViewport.width = 0;
132 mViewport.height = 0;
133 mNearZ = 0.0f;
134 mFarZ = 1.0f;
135
136 mBlend.colorMaskRed = true;
137 mBlend.colorMaskGreen = true;
138 mBlend.colorMaskBlue = true;
139 mBlend.colorMaskAlpha = true;
140
Geoff Lang76b10c92014-09-05 16:28:14 -0400141 mActiveSampler = 0;
142
Shannon Woods23e05002014-09-22 19:07:27 -0400143 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400144
Brandon Jonesc405ae72017-12-06 14:15:03 -0800145 // Set all indexes in state attributes type mask to float (default)
146 for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
147 {
148 mCurrentValuesTypeMask.setIndex(GL_FLOAT, i);
149 }
150
Geoff Lang4dc3af02016-11-18 14:09:27 -0500151 mUniformBuffers.resize(caps.maxUniformBufferBindings);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400152
Geoff Lang76b10c92014-09-05 16:28:14 -0400153 mSamplerTextures[GL_TEXTURE_2D].resize(caps.maxCombinedTextureImageUnits);
154 mSamplerTextures[GL_TEXTURE_CUBE_MAP].resize(caps.maxCombinedTextureImageUnits);
Geoff Langeb66a6e2016-10-31 13:06:12 -0400155 if (clientVersion >= Version(3, 0))
Shannon Woods53a94a82014-06-24 15:20:36 -0400156 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400157 // TODO: These could also be enabled via extension
158 mSamplerTextures[GL_TEXTURE_2D_ARRAY].resize(caps.maxCombinedTextureImageUnits);
159 mSamplerTextures[GL_TEXTURE_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400160 }
Geoff Lang3b573612016-10-31 14:08:10 -0400161 if (clientVersion >= Version(3, 1))
162 {
163 mSamplerTextures[GL_TEXTURE_2D_MULTISAMPLE].resize(caps.maxCombinedTextureImageUnits);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800164
165 mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800166 mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800167 mImageUnits.resize(caps.maxImageUnits);
Geoff Lang3b573612016-10-31 14:08:10 -0400168 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400169 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400170 {
171 mSamplerTextures[GL_TEXTURE_RECTANGLE_ANGLE].resize(caps.maxCombinedTextureImageUnits);
172 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400173 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400174 {
175 mSamplerTextures[GL_TEXTURE_EXTERNAL_OES].resize(caps.maxCombinedTextureImageUnits);
176 }
Jamie Madill81c2e252017-09-09 23:32:46 -0400177 mCompleteTextureCache.resize(caps.maxCombinedTextureImageUnits, nullptr);
178 mCompleteTextureBindings.reserve(caps.maxCombinedTextureImageUnits);
Geoff Lange51ba632017-11-21 11:45:25 -0500179 mCachedTexturesInitState = InitState::MayNeedInit;
Jamie Madill81c2e252017-09-09 23:32:46 -0400180 for (uint32_t textureIndex = 0; textureIndex < caps.maxCombinedTextureImageUnits;
181 ++textureIndex)
182 {
183 mCompleteTextureBindings.emplace_back(OnAttachmentDirtyBinding(this, textureIndex));
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
Jamie Madill4928b7c2017-06-20 12:57:39 -0400188 mActiveQueries[GL_ANY_SAMPLES_PASSED].set(context, nullptr);
189 mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(context, nullptr);
190 mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(context, nullptr);
191 mActiveQueries[GL_TIME_ELAPSED_EXT].set(context, nullptr);
192 mActiveQueries[GL_COMMANDS_COMPLETED_CHROMIUM].set(context, 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
Geoff Lang488130e2017-09-27 13:53:11 -0400204 mMultiSampling = true;
205 mSampleAlphaToOne = false;
Sami Väisänena797e062016-05-12 15:23:40 +0300206
207 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300208
209 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
210 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
211 mPathStencilFunc = GL_ALWAYS;
212 mPathStencilRef = 0;
213 mPathStencilMask = std::numeric_limits<GLuint>::max();
Jamie Madille08a1d32017-03-07 17:24:06 -0500214
215 mRobustResourceInit = robustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400216 mProgramBinaryCacheEnabled = programBinaryCacheEnabled;
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{
Jamie Madill8693bdb2017-09-02 15:32:14 -0400221 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400222 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400223 TextureBindingVector &textureVector = bindingVec.second;
Geoff Lang76b10c92014-09-05 16:28:14 -0400224 for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400225 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400226 textureVector[textureIdx].set(context, nullptr);
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 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400231 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400232 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400233
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800234 for (auto &imageUnit : mImageUnits)
235 {
236 imageUnit.texture.set(context, nullptr);
237 imageUnit.level = 0;
238 imageUnit.layered = false;
239 imageUnit.layer = 0;
240 imageUnit.access = GL_READ_ONLY;
241 imageUnit.format = GL_R32UI;
242 }
243
Jamie Madill4928b7c2017-06-20 12:57:39 -0400244 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400245
Corentin Wallez336129f2017-10-17 15:55:40 -0400246 for (auto type : angle::AllEnums<BufferBinding>())
247 {
248 mBoundBuffers[type].set(context, nullptr);
249 }
250
Geoff Lang7dd2e102014-11-10 15:19:26 -0500251 if (mProgram)
252 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500253 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500254 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800255 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500256
Yunchao Hea336b902017-08-02 16:05:21 +0800257 mProgramPipeline.set(context, nullptr);
258
Jamie Madill4928b7c2017-06-20 12:57:39 -0400259 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400260
261 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
262 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400263 i->second.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400264 }
265
Corentin Wallez336129f2017-10-17 15:55:40 -0400266 for (auto &buf : mUniformBuffers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400267 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400268 buf.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400269 }
270
Jiajia Qin6eafb042016-12-27 17:04:07 +0800271 for (auto &buf : mAtomicCounterBuffers)
272 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400273 buf.set(context, nullptr);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800274 }
275
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800276 for (auto &buf : mShaderStorageBuffers)
277 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400278 buf.set(context, nullptr);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800279 }
280
Sami Väisänene45e53b2016-05-25 10:36:04 +0300281 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
282 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
283 mPathStencilFunc = GL_ALWAYS;
284 mPathStencilRef = 0;
285 mPathStencilMask = std::numeric_limits<GLuint>::max();
286
Jamie Madill1b94d432015-08-07 13:23:23 -0400287 // TODO(jmadill): Is this necessary?
288 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400289}
290
291const RasterizerState &State::getRasterizerState() const
292{
293 return mRasterizer;
294}
295
296const BlendState &State::getBlendState() const
297{
298 return mBlend;
299}
300
301const DepthStencilState &State::getDepthStencilState() const
302{
303 return mDepthStencil;
304}
305
Jamie Madillf75ab352015-03-16 10:46:52 -0400306void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400307{
308 mColorClearValue.red = red;
309 mColorClearValue.green = green;
310 mColorClearValue.blue = blue;
311 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400312 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400313}
314
Jamie Madillf75ab352015-03-16 10:46:52 -0400315void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400316{
317 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400318 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400319}
320
Jamie Madillf75ab352015-03-16 10:46:52 -0400321void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400322{
323 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400324 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400325}
326
Shannon Woods53a94a82014-06-24 15:20:36 -0400327void State::setColorMask(bool red, bool green, bool blue, bool alpha)
328{
329 mBlend.colorMaskRed = red;
330 mBlend.colorMaskGreen = green;
331 mBlend.colorMaskBlue = blue;
332 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400333 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400334}
335
336void State::setDepthMask(bool mask)
337{
338 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400339 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400340}
341
342bool State::isRasterizerDiscardEnabled() const
343{
344 return mRasterizer.rasterizerDiscard;
345}
346
347void State::setRasterizerDiscard(bool enabled)
348{
349 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400350 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400351}
352
353bool State::isCullFaceEnabled() const
354{
355 return mRasterizer.cullFace;
356}
357
358void State::setCullFace(bool enabled)
359{
360 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400361 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400362}
363
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400364void State::setCullMode(CullFaceMode mode)
Shannon Woods53a94a82014-06-24 15:20:36 -0400365{
366 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400367 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400368}
369
370void State::setFrontFace(GLenum front)
371{
372 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400373 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400374}
375
376bool State::isDepthTestEnabled() const
377{
378 return mDepthStencil.depthTest;
379}
380
381void State::setDepthTest(bool enabled)
382{
383 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400384 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400385}
386
387void State::setDepthFunc(GLenum depthFunc)
388{
389 mDepthStencil.depthFunc = depthFunc;
Jamie Madill1b94d432015-08-07 13:23:23 -0400390 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400391}
392
393void State::setDepthRange(float zNear, float zFar)
394{
395 mNearZ = zNear;
396 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400397 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400398}
399
Geoff Langd42f5b82015-04-16 14:03:29 -0400400float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400401{
Geoff Langd42f5b82015-04-16 14:03:29 -0400402 return mNearZ;
403}
404
405float State::getFarPlane() const
406{
407 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400408}
409
410bool State::isBlendEnabled() const
411{
412 return mBlend.blend;
413}
414
415void State::setBlend(bool enabled)
416{
417 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400418 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400419}
420
421void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
422{
423 mBlend.sourceBlendRGB = sourceRGB;
424 mBlend.destBlendRGB = destRGB;
425 mBlend.sourceBlendAlpha = sourceAlpha;
426 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400427 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400428}
429
430void State::setBlendColor(float red, float green, float blue, float alpha)
431{
432 mBlendColor.red = red;
433 mBlendColor.green = green;
434 mBlendColor.blue = blue;
435 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400436 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400437}
438
439void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
440{
441 mBlend.blendEquationRGB = rgbEquation;
442 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400443 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400444}
445
446const ColorF &State::getBlendColor() const
447{
448 return mBlendColor;
449}
450
451bool State::isStencilTestEnabled() const
452{
453 return mDepthStencil.stencilTest;
454}
455
456void State::setStencilTest(bool enabled)
457{
458 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400459 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400460}
461
462void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
463{
464 mDepthStencil.stencilFunc = stencilFunc;
465 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
466 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400467 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400468}
469
470void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
471{
472 mDepthStencil.stencilBackFunc = stencilBackFunc;
473 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
474 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400475 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400476}
477
478void State::setStencilWritemask(GLuint stencilWritemask)
479{
480 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400481 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400482}
483
484void State::setStencilBackWritemask(GLuint stencilBackWritemask)
485{
486 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400487 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400488}
489
490void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
491{
492 mDepthStencil.stencilFail = stencilFail;
493 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
494 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400495 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400496}
497
498void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
499{
500 mDepthStencil.stencilBackFail = stencilBackFail;
501 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
502 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400503 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400504}
505
506GLint State::getStencilRef() const
507{
508 return mStencilRef;
509}
510
511GLint State::getStencilBackRef() const
512{
513 return mStencilBackRef;
514}
515
516bool State::isPolygonOffsetFillEnabled() const
517{
518 return mRasterizer.polygonOffsetFill;
519}
520
521void State::setPolygonOffsetFill(bool enabled)
522{
Jamie Madill1b94d432015-08-07 13:23:23 -0400523 mRasterizer.polygonOffsetFill = enabled;
524 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400525}
526
527void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
528{
529 // An application can pass NaN values here, so handle this gracefully
530 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
531 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400532 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400533}
534
535bool State::isSampleAlphaToCoverageEnabled() const
536{
537 return mBlend.sampleAlphaToCoverage;
538}
539
540void State::setSampleAlphaToCoverage(bool enabled)
541{
542 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400543 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400544}
545
546bool State::isSampleCoverageEnabled() const
547{
548 return mSampleCoverage;
549}
550
551void State::setSampleCoverage(bool enabled)
552{
553 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400554 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400555}
556
557void State::setSampleCoverageParams(GLclampf value, bool invert)
558{
559 mSampleCoverageValue = value;
560 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400561 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400562}
563
Geoff Lang0fbb6002015-04-16 11:11:53 -0400564GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400565{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400566 return mSampleCoverageValue;
567}
Shannon Woods53a94a82014-06-24 15:20:36 -0400568
Geoff Lang0fbb6002015-04-16 11:11:53 -0400569bool State::getSampleCoverageInvert() const
570{
571 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400572}
573
Jiawei Shaodb342272017-09-27 10:21:45 +0800574bool State::isSampleMaskEnabled() const
575{
576 return mSampleMask;
577}
578
579void State::setSampleMaskEnabled(bool enabled)
580{
581 mSampleMask = enabled;
582 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
583}
584
585void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
586{
587 ASSERT(maskNumber < mMaxSampleMaskWords);
588 mSampleMaskValues[maskNumber] = mask;
Jamie Madillc67323a2017-11-02 23:11:41 -0400589 // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
590 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
Jiawei Shaodb342272017-09-27 10:21:45 +0800591}
592
593GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
594{
595 ASSERT(maskNumber < mMaxSampleMaskWords);
596 return mSampleMaskValues[maskNumber];
597}
598
599GLuint State::getMaxSampleMaskWords() const
600{
601 return mMaxSampleMaskWords;
602}
603
Sami Väisänen74c23472016-05-09 17:30:30 +0300604void State::setSampleAlphaToOne(bool enabled)
605{
606 mSampleAlphaToOne = enabled;
607 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
608}
609
610bool State::isSampleAlphaToOneEnabled() const
611{
612 return mSampleAlphaToOne;
613}
614
615void State::setMultisampling(bool enabled)
616{
617 mMultiSampling = enabled;
618 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
619}
620
621bool State::isMultisamplingEnabled() const
622{
623 return mMultiSampling;
624}
625
Shannon Woods53a94a82014-06-24 15:20:36 -0400626bool State::isScissorTestEnabled() const
627{
628 return mScissorTest;
629}
630
631void State::setScissorTest(bool enabled)
632{
633 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400634 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400635}
636
637void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
638{
639 mScissor.x = x;
640 mScissor.y = y;
641 mScissor.width = width;
642 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400643 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400644}
645
646const Rectangle &State::getScissor() const
647{
648 return mScissor;
649}
650
651bool State::isDitherEnabled() const
652{
653 return mBlend.dither;
654}
655
656void State::setDither(bool enabled)
657{
658 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400659 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400660}
661
Jamie Madillb4b53c52015-02-03 15:22:48 -0500662bool State::isPrimitiveRestartEnabled() const
663{
664 return mPrimitiveRestart;
665}
666
667void State::setPrimitiveRestart(bool enabled)
668{
669 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400670 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500671}
672
Shannon Woods53a94a82014-06-24 15:20:36 -0400673void State::setEnableFeature(GLenum feature, bool enabled)
674{
675 switch (feature)
676 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300677 case GL_MULTISAMPLE_EXT: setMultisampling(enabled); break;
678 case GL_SAMPLE_ALPHA_TO_ONE_EXT: setSampleAlphaToOne(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400679 case GL_CULL_FACE: setCullFace(enabled); break;
680 case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
681 case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
682 case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
683 case GL_SCISSOR_TEST: setScissorTest(enabled); break;
684 case GL_STENCIL_TEST: setStencilTest(enabled); break;
685 case GL_DEPTH_TEST: setDepthTest(enabled); break;
686 case GL_BLEND: setBlend(enabled); break;
687 case GL_DITHER: setDither(enabled); break;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500688 case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400689 case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
Geoff Lang3b573612016-10-31 14:08:10 -0400690 case GL_SAMPLE_MASK:
Jiawei Shaodb342272017-09-27 10:21:45 +0800691 setSampleMaskEnabled(enabled);
Geoff Lang3b573612016-10-31 14:08:10 -0400692 break;
Geoff Lang70d0f492015-12-10 17:45:46 -0500693 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
694 mDebug.setOutputSynchronous(enabled);
695 break;
696 case GL_DEBUG_OUTPUT:
697 mDebug.setOutputEnabled(enabled);
698 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700699 case GL_FRAMEBUFFER_SRGB_EXT:
700 setFramebufferSRGB(enabled);
701 break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400702 default: UNREACHABLE();
703 }
704}
705
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700706bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400707{
708 switch (feature)
709 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300710 case GL_MULTISAMPLE_EXT: return isMultisamplingEnabled();
711 case GL_SAMPLE_ALPHA_TO_ONE_EXT: return isSampleAlphaToOneEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400712 case GL_CULL_FACE: return isCullFaceEnabled();
713 case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
714 case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
715 case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
716 case GL_SCISSOR_TEST: return isScissorTestEnabled();
717 case GL_STENCIL_TEST: return isStencilTestEnabled();
718 case GL_DEPTH_TEST: return isDepthTestEnabled();
719 case GL_BLEND: return isBlendEnabled();
720 case GL_DITHER: return isDitherEnabled();
Jamie Madillb4b53c52015-02-03 15:22:48 -0500721 case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400722 case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
Geoff Langb5e997f2016-12-06 10:55:34 -0500723 case GL_SAMPLE_MASK:
Jiawei Shaodb342272017-09-27 10:21:45 +0800724 return isSampleMaskEnabled();
Geoff Lang70d0f492015-12-10 17:45:46 -0500725 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
726 return mDebug.isOutputSynchronous();
727 case GL_DEBUG_OUTPUT:
728 return mDebug.isOutputEnabled();
Geoff Langf41a7152016-09-19 15:11:17 -0400729 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
730 return isBindGeneratesResourceEnabled();
Geoff Langfeb8c682017-02-13 16:07:35 -0500731 case GL_CLIENT_ARRAYS_ANGLE:
732 return areClientArraysEnabled();
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700733 case GL_FRAMEBUFFER_SRGB_EXT:
734 return getFramebufferSRGB();
Geoff Langb433e872017-10-05 14:01:47 -0400735 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madille08a1d32017-03-07 17:24:06 -0500736 return mRobustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400737 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
738 return mProgramBinaryCacheEnabled;
739
740 default:
741 UNREACHABLE();
742 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -0400743 }
744}
745
746void State::setLineWidth(GLfloat width)
747{
748 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400749 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400750}
751
Geoff Lang4b3f4162015-04-16 13:22:05 -0400752float State::getLineWidth() const
753{
754 return mLineWidth;
755}
756
Shannon Woods53a94a82014-06-24 15:20:36 -0400757void State::setGenerateMipmapHint(GLenum hint)
758{
759 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400760 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400761}
762
763void State::setFragmentShaderDerivativeHint(GLenum hint)
764{
765 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400766 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400767 // TODO: Propagate the hint to shader translator so we can write
768 // ddx, ddx_coarse, or ddx_fine depending on the hint.
769 // Ignore for now. It is valid for implementations to ignore hint.
770}
771
Geoff Langf41a7152016-09-19 15:11:17 -0400772bool State::isBindGeneratesResourceEnabled() const
773{
774 return mBindGeneratesResource;
775}
776
Geoff Langfeb8c682017-02-13 16:07:35 -0500777bool State::areClientArraysEnabled() const
778{
779 return mClientArraysEnabled;
780}
781
Shannon Woods53a94a82014-06-24 15:20:36 -0400782void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
783{
784 mViewport.x = x;
785 mViewport.y = y;
786 mViewport.width = width;
787 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400788 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400789}
790
791const Rectangle &State::getViewport() const
792{
793 return mViewport;
794}
795
796void State::setActiveSampler(unsigned int active)
797{
798 mActiveSampler = active;
799}
800
801unsigned int State::getActiveSampler() const
802{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700803 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400804}
805
Jamie Madill4928b7c2017-06-20 12:57:39 -0400806void State::setSamplerTexture(const Context *context, GLenum type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400807{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400808 mSamplerTextures[type][mActiveSampler].set(context, texture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400809 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
810 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400811}
812
Jamie Madillc29968b2016-01-20 11:17:23 -0500813Texture *State::getTargetTexture(GLenum target) const
814{
815 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), target);
816}
817
Geoff Lang76b10c92014-09-05 16:28:14 -0400818Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400819{
Jamie Madill5864ac22015-01-12 14:43:07 -0500820 const auto it = mSamplerTextures.find(type);
821 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400822 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500823 return it->second[sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400824}
825
Geoff Lang76b10c92014-09-05 16:28:14 -0400826GLuint State::getSamplerTextureId(unsigned int sampler, GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400827{
Jamie Madill5864ac22015-01-12 14:43:07 -0500828 const auto it = mSamplerTextures.find(type);
829 ASSERT(it != mSamplerTextures.end());
Jamie Madill3d3d2f22015-09-23 16:47:51 -0400830 ASSERT(sampler < it->second.size());
Jamie Madill5864ac22015-01-12 14:43:07 -0500831 return it->second[sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400832}
833
Jamie Madilla02315b2017-02-23 14:14:47 -0500834void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400835{
836 // Textures have a detach method on State rather than a simple
837 // removeBinding, because the zero/null texture objects are managed
838 // separately, and don't have to go through the Context's maps or
839 // the ResourceManager.
840
841 // [OpenGL ES 2.0.24] section 3.8 page 84:
842 // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
843 // rebound to texture object zero
844
Corentin Walleza2257da2016-04-19 16:43:12 -0400845 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400846 {
Corentin Walleza2257da2016-04-19 16:43:12 -0400847 GLenum textureType = bindingVec.first;
848 TextureBindingVector &textureVector = bindingVec.second;
Jamie Madill81c2e252017-09-09 23:32:46 -0400849 for (BindingPointer<Texture> &binding : textureVector)
Shannon Woods53a94a82014-06-24 15:20:36 -0400850 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400851 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400852 {
Jamie Madill5864ac22015-01-12 14:43:07 -0500853 auto it = zeroTextures.find(textureType);
854 ASSERT(it != zeroTextures.end());
Jamie Madille6382c32014-11-07 15:05:26 -0500855 // Zero textures are the "default" textures instead of NULL
Jamie Madill4928b7c2017-06-20 12:57:39 -0400856 binding.set(context, it->second.get());
Jamie Madill81c2e252017-09-09 23:32:46 -0400857 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400858 }
859 }
860 }
861
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800862 for (auto &bindingImageUnit : mImageUnits)
863 {
864 if (bindingImageUnit.texture.id() == texture)
865 {
866 bindingImageUnit.texture.set(context, nullptr);
867 bindingImageUnit.level = 0;
868 bindingImageUnit.layered = false;
869 bindingImageUnit.layer = 0;
870 bindingImageUnit.access = GL_READ_ONLY;
871 bindingImageUnit.format = GL_R32UI;
872 break;
873 }
874 }
875
Shannon Woods53a94a82014-06-24 15:20:36 -0400876 // [OpenGL ES 2.0.24] section 4.4 page 112:
877 // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
878 // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
879 // image was attached in the currently bound framebuffer.
880
Jamie Madill8693bdb2017-09-02 15:32:14 -0400881 if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400882 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400883 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400884 }
885
Jamie Madill8693bdb2017-09-02 15:32:14 -0400886 if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400887 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400888 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400889 }
890}
891
Jamie Madill4928b7c2017-06-20 12:57:39 -0400892void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -0500893{
894 for (const auto &zeroTexture : zeroTextures)
895 {
896 auto &samplerTextureArray = mSamplerTextures[zeroTexture.first];
897
898 for (size_t textureUnit = 0; textureUnit < samplerTextureArray.size(); ++textureUnit)
899 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400900 samplerTextureArray[textureUnit].set(context, zeroTexture.second.get());
Jamie Madille6382c32014-11-07 15:05:26 -0500901 }
902 }
903}
904
Jamie Madill4928b7c2017-06-20 12:57:39 -0400905void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400906{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400907 mSamplers[textureUnit].set(context, sampler);
Jamie Madill81c2e252017-09-09 23:32:46 -0400908 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
909 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400910}
911
912GLuint State::getSamplerId(GLuint textureUnit) const
913{
Geoff Lang76b10c92014-09-05 16:28:14 -0400914 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400915 return mSamplers[textureUnit].id();
916}
917
918Sampler *State::getSampler(GLuint textureUnit) const
919{
920 return mSamplers[textureUnit].get();
921}
922
Jamie Madill4928b7c2017-06-20 12:57:39 -0400923void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400924{
925 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
926 // If a sampler object that is currently bound to one or more texture units is
927 // deleted, it is as though BindSampler is called once for each texture unit to
928 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Jamie Madill81c2e252017-09-09 23:32:46 -0400929 for (BindingPointer<Sampler> &samplerBinding : mSamplers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400930 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400931 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400932 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400933 samplerBinding.set(context, nullptr);
Jamie Madill81c2e252017-09-09 23:32:46 -0400934 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400935 }
936 }
937}
938
Jamie Madill4928b7c2017-06-20 12:57:39 -0400939void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400940{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400941 mRenderbuffer.set(context, renderbuffer);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400942 mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -0400943}
944
945GLuint State::getRenderbufferId() const
946{
947 return mRenderbuffer.id();
948}
949
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700950Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400951{
952 return mRenderbuffer.get();
953}
954
Jamie Madilla02315b2017-02-23 14:14:47 -0500955void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400956{
957 // [OpenGL ES 2.0.24] section 4.4 page 109:
958 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
959 // had been executed with the target RENDERBUFFER and name of zero.
960
961 if (mRenderbuffer.id() == renderbuffer)
962 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400963 setRenderbufferBinding(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400964 }
965
966 // [OpenGL ES 2.0.24] section 4.4 page 111:
967 // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
968 // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
969 // point to which this image was attached in the currently bound framebuffer.
970
971 Framebuffer *readFramebuffer = mReadFramebuffer;
972 Framebuffer *drawFramebuffer = mDrawFramebuffer;
973
Jamie Madill8693bdb2017-09-02 15:32:14 -0400974 if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
Shannon Woods53a94a82014-06-24 15:20:36 -0400975 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400976 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400977 }
978
979 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
980 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400981 if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
982 {
983 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
984 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400985 }
986
987}
988
989void State::setReadFramebufferBinding(Framebuffer *framebuffer)
990{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500991 if (mReadFramebuffer == framebuffer)
992 return;
993
Shannon Woods53a94a82014-06-24 15:20:36 -0400994 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500995 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
996
997 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
998 {
999 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1000 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001001}
1002
1003void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
1004{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001005 if (mDrawFramebuffer == framebuffer)
1006 return;
1007
Shannon Woods53a94a82014-06-24 15:20:36 -04001008 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001009 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1010
1011 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
1012 {
1013 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1014 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001015}
1016
1017Framebuffer *State::getTargetFramebuffer(GLenum target) const
1018{
1019 switch (target)
1020 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001021 case GL_READ_FRAMEBUFFER_ANGLE:
1022 return mReadFramebuffer;
1023 case GL_DRAW_FRAMEBUFFER_ANGLE:
1024 case GL_FRAMEBUFFER:
1025 return mDrawFramebuffer;
1026 default:
1027 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001028 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001029 }
1030}
1031
Jamie Madill51f40ec2016-06-15 14:06:00 -04001032Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001033{
1034 return mReadFramebuffer;
1035}
1036
Jamie Madill51f40ec2016-06-15 14:06:00 -04001037Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001038{
1039 return mDrawFramebuffer;
1040}
1041
1042bool State::removeReadFramebufferBinding(GLuint framebuffer)
1043{
Jamie Madill77a72f62015-04-14 11:18:32 -04001044 if (mReadFramebuffer != nullptr &&
1045 mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001046 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001047 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001048 return true;
1049 }
1050
1051 return false;
1052}
1053
1054bool State::removeDrawFramebufferBinding(GLuint framebuffer)
1055{
Jamie Madill77a72f62015-04-14 11:18:32 -04001056 if (mReadFramebuffer != nullptr &&
1057 mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001058 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001059 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001060 return true;
1061 }
1062
1063 return false;
1064}
1065
1066void State::setVertexArrayBinding(VertexArray *vertexArray)
1067{
1068 mVertexArray = vertexArray;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001069 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001070
1071 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1072 {
1073 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1074 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001075}
1076
1077GLuint State::getVertexArrayId() const
1078{
Yunchao He4f285442017-04-21 12:15:49 +08001079 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001080 return mVertexArray->id();
1081}
1082
1083VertexArray *State::getVertexArray() const
1084{
Yunchao He4f285442017-04-21 12:15:49 +08001085 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001086 return mVertexArray;
1087}
1088
1089bool State::removeVertexArrayBinding(GLuint vertexArray)
1090{
1091 if (mVertexArray->id() == vertexArray)
1092 {
Yunchao Hed7297bf2017-04-19 15:27:10 +08001093 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001094 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001095 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001096 return true;
1097 }
1098
1099 return false;
1100}
1101
Jamie Madill4928b7c2017-06-20 12:57:39 -04001102void State::bindVertexBuffer(const Context *context,
1103 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001104 Buffer *boundBuffer,
1105 GLintptr offset,
1106 GLsizei stride)
1107{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001108 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001109 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1110}
1111
Shaodde78e82017-05-22 14:13:27 +08001112void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
Shao80957d92017-02-20 21:25:59 +08001113{
Shaodde78e82017-05-22 14:13:27 +08001114 getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08001115 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1116}
1117
1118void State::setVertexAttribFormat(GLuint attribIndex,
1119 GLint size,
1120 GLenum type,
1121 bool normalized,
1122 bool pureInteger,
1123 GLuint relativeOffset)
1124{
1125 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1126 relativeOffset);
1127 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1128}
1129
1130void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1131{
1132 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1133 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1134}
1135
Jamie Madill6c1f6712017-02-14 19:08:04 -05001136void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001137{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001138 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001139 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001140 if (mProgram)
1141 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001142 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001143 }
1144
1145 mProgram = newProgram;
1146
1147 if (mProgram)
1148 {
1149 newProgram->addRef();
Jamie Madill81c2e252017-09-09 23:32:46 -04001150 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001151 }
Jamie Madilla779b612017-07-24 11:46:05 -04001152 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
1153 mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001154 }
1155}
1156
Geoff Lang7dd2e102014-11-10 15:19:26 -05001157Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001158{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001159 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001160}
1161
Jamie Madill4928b7c2017-06-20 12:57:39 -04001162void State::setTransformFeedbackBinding(const Context *context,
1163 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001164{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001165 mTransformFeedback.set(context, transformFeedback);
Geoff Langded79232017-11-28 15:21:11 -05001166 mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001167}
1168
1169TransformFeedback *State::getCurrentTransformFeedback() const
1170{
1171 return mTransformFeedback.get();
1172}
1173
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001174bool State::isTransformFeedbackActiveUnpaused() const
1175{
Jamie Madill81c2e252017-09-09 23:32:46 -04001176 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001177 return curTransformFeedback && curTransformFeedback->isActive() && !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001178}
1179
Jamie Madill4928b7c2017-06-20 12:57:39 -04001180bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001181{
1182 if (mTransformFeedback.id() == transformFeedback)
1183 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001184 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001185 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001186 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001187
1188 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001189}
1190
Yunchao Hea336b902017-08-02 16:05:21 +08001191void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
1192{
1193 mProgramPipeline.set(context, pipeline);
1194}
1195
1196void State::detachProgramPipeline(const Context *context, GLuint pipeline)
1197{
1198 mProgramPipeline.set(context, nullptr);
1199}
1200
Olli Etuahobbf1c102016-06-28 13:31:33 +03001201bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001202{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001203 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001204 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001205 const Query *query = iter.second.get();
1206 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001207 {
1208 return true;
1209 }
1210 }
1211
1212 return false;
1213}
1214
1215bool State::isQueryActive(Query *query) const
1216{
1217 for (auto &iter : mActiveQueries)
1218 {
1219 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001220 {
1221 return true;
1222 }
1223 }
1224
1225 return false;
1226}
1227
Jamie Madill4928b7c2017-06-20 12:57:39 -04001228void State::setActiveQuery(const Context *context, GLenum target, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001229{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001230 mActiveQueries[target].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001231}
1232
1233GLuint State::getActiveQueryId(GLenum target) const
1234{
1235 const Query *query = getActiveQuery(target);
1236 return (query ? query->id() : 0u);
1237}
1238
1239Query *State::getActiveQuery(GLenum target) const
1240{
Jamie Madill5864ac22015-01-12 14:43:07 -05001241 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001242
Jamie Madill5864ac22015-01-12 14:43:07 -05001243 // All query types should already exist in the activeQueries map
1244 ASSERT(it != mActiveQueries.end());
1245
1246 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001247}
1248
Corentin Wallez336129f2017-10-17 15:55:40 -04001249void State::setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001250{
Corentin Wallez336129f2017-10-17 15:55:40 -04001251 switch (target)
1252 {
1253 case BufferBinding::PixelPack:
Corentin Wallezd5d30992017-11-13 10:21:52 -08001254 mBoundBuffers[target].set(context, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001255 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
1256 break;
1257 case BufferBinding::PixelUnpack:
Corentin Wallezd5d30992017-11-13 10:21:52 -08001258 mBoundBuffers[target].set(context, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001259 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
1260 break;
1261 case BufferBinding::DrawIndirect:
Corentin Wallezd5d30992017-11-13 10:21:52 -08001262 mBoundBuffers[target].set(context, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001263 mDirtyBits.set(DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING);
1264 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001265 case BufferBinding::DispatchIndirect:
1266 mBoundBuffers[target].set(context, buffer);
1267 mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
1268 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001269 case BufferBinding::TransformFeedback:
1270 if (mTransformFeedback.get() != nullptr)
1271 {
1272 mTransformFeedback->bindGenericBuffer(context, buffer);
1273 }
1274 break;
1275 case BufferBinding::ElementArray:
1276 getVertexArray()->setElementArrayBuffer(context, buffer);
1277 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1278 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +08001279 case BufferBinding::ShaderStorage:
1280 mBoundBuffers[target].set(context, buffer);
1281 mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
1282 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001283 default:
Corentin Wallezd5d30992017-11-13 10:21:52 -08001284 mBoundBuffers[target].set(context, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001285 break;
1286 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001287}
Corentin Wallez336129f2017-10-17 15:55:40 -04001288void State::setIndexedBufferBinding(const Context *context,
1289 BufferBinding target,
1290 GLuint index,
1291 Buffer *buffer,
1292 GLintptr offset,
1293 GLsizeiptr size)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001294{
Corentin Wallez336129f2017-10-17 15:55:40 -04001295 setBufferBinding(context, target, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001296
Corentin Wallez336129f2017-10-17 15:55:40 -04001297 switch (target)
1298 {
1299 case BufferBinding::TransformFeedback:
1300 mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
1301 break;
1302 case BufferBinding::Uniform:
1303 mUniformBuffers[index].set(context, buffer, offset, size);
Jamie Madillf4141212017-12-12 15:08:07 -05001304 mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
Corentin Wallez336129f2017-10-17 15:55:40 -04001305 break;
1306 case BufferBinding::AtomicCounter:
1307 mAtomicCounterBuffers[index].set(context, buffer, offset, size);
1308 break;
1309 case BufferBinding::ShaderStorage:
1310 mShaderStorageBuffers[index].set(context, buffer, offset, size);
1311 break;
1312 default:
1313 UNREACHABLE();
1314 break;
1315 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001316}
1317
Geoff Lang5d124a62015-09-15 13:03:27 -04001318const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001319{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001320 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001321 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001322}
1323
Jiajia Qin6eafb042016-12-27 17:04:07 +08001324const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1325{
1326 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1327 return mAtomicCounterBuffers[index];
1328}
1329
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001330const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1331{
1332 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1333 return mShaderStorageBuffers[index];
1334}
1335
Corentin Wallez336129f2017-10-17 15:55:40 -04001336Buffer *State::getTargetBuffer(BufferBinding target) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001337{
1338 switch (target)
1339 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001340 case BufferBinding::ElementArray:
1341 return getVertexArray()->getElementArrayBuffer().get();
1342 case BufferBinding::TransformFeedback:
1343 return mTransformFeedback->getGenericBuffer().get();
1344 default:
1345 return mBoundBuffers[target].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001346 }
1347}
1348
Jamie Madill4928b7c2017-06-20 12:57:39 -04001349void State::detachBuffer(const Context *context, GLuint bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001350{
Corentin Wallez336129f2017-10-17 15:55:40 -04001351 for (auto &buffer : mBoundBuffers)
Yuly Novikov5807a532015-12-03 13:01:22 -05001352 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001353 if (buffer.id() == bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001354 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001355 buffer.set(context, nullptr);
Yuly Novikov5807a532015-12-03 13:01:22 -05001356 }
1357 }
1358
1359 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1360 if (curTransformFeedback)
1361 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001362 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001363 }
1364
Jamie Madill4928b7c2017-06-20 12:57:39 -04001365 getVertexArray()->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001366}
1367
Shannon Woods53a94a82014-06-24 15:20:36 -04001368void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1369{
1370 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001371 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001372}
1373
1374void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1375{
Shannon Woods23e05002014-09-22 19:07:27 -04001376 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001377 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001378 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1379 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001380 mCurrentValuesTypeMask.setIndex(GL_FLOAT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001381}
1382
1383void State::setVertexAttribu(GLuint index, const GLuint values[4])
1384{
Shannon Woods23e05002014-09-22 19:07:27 -04001385 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001386 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001387 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1388 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001389 mCurrentValuesTypeMask.setIndex(GL_UNSIGNED_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001390}
1391
1392void State::setVertexAttribi(GLuint index, const GLint values[4])
1393{
Shannon Woods23e05002014-09-22 19:07:27 -04001394 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001395 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001396 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1397 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001398 mCurrentValuesTypeMask.setIndex(GL_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001399}
1400
Shaodde78e82017-05-22 14:13:27 +08001401void State::setVertexAttribPointer(const Context *context,
1402 unsigned int attribNum,
1403 Buffer *boundBuffer,
1404 GLint size,
1405 GLenum type,
1406 bool normalized,
1407 bool pureInteger,
1408 GLsizei stride,
1409 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001410{
Shaodde78e82017-05-22 14:13:27 +08001411 getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1412 normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001413 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001414}
1415
Shaodde78e82017-05-22 14:13:27 +08001416void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
Jamie Madill0b9e9032015-08-17 11:51:52 +00001417{
Shaodde78e82017-05-22 14:13:27 +08001418 getVertexArray()->setVertexAttribDivisor(context, index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001419 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001420}
1421
Jamie Madill6de51852017-04-12 09:53:01 -04001422const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001423{
Jamie Madill6de51852017-04-12 09:53:01 -04001424 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001425 return mVertexAttribCurrentValues[attribNum];
1426}
1427
Jamie Madillcac94a92017-11-10 10:09:32 -05001428const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
1429{
1430 return mVertexAttribCurrentValues;
1431}
1432
Shannon Woods53a94a82014-06-24 15:20:36 -04001433const void *State::getVertexAttribPointer(unsigned int attribNum) const
1434{
1435 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1436}
1437
1438void State::setPackAlignment(GLint alignment)
1439{
1440 mPack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001441 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001442}
1443
1444GLint State::getPackAlignment() const
1445{
1446 return mPack.alignment;
1447}
1448
1449void State::setPackReverseRowOrder(bool reverseRowOrder)
1450{
1451 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madillc67323a2017-11-02 23:11:41 -04001452 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001453}
1454
1455bool State::getPackReverseRowOrder() const
1456{
1457 return mPack.reverseRowOrder;
1458}
1459
Minmin Gongadff67b2015-10-14 10:34:45 -04001460void State::setPackRowLength(GLint rowLength)
1461{
1462 mPack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001463 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001464}
1465
1466GLint State::getPackRowLength() const
1467{
1468 return mPack.rowLength;
1469}
1470
1471void State::setPackSkipRows(GLint skipRows)
1472{
1473 mPack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001474 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001475}
1476
1477GLint State::getPackSkipRows() const
1478{
1479 return mPack.skipRows;
1480}
1481
1482void State::setPackSkipPixels(GLint skipPixels)
1483{
1484 mPack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001485 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001486}
1487
1488GLint State::getPackSkipPixels() const
1489{
1490 return mPack.skipPixels;
1491}
1492
Shannon Woods53a94a82014-06-24 15:20:36 -04001493const PixelPackState &State::getPackState() const
1494{
1495 return mPack;
1496}
1497
Jamie Madill87de3622015-03-16 10:41:44 -04001498PixelPackState &State::getPackState()
1499{
1500 return mPack;
1501}
1502
Shannon Woods53a94a82014-06-24 15:20:36 -04001503void State::setUnpackAlignment(GLint alignment)
1504{
1505 mUnpack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001506 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001507}
1508
1509GLint State::getUnpackAlignment() const
1510{
1511 return mUnpack.alignment;
1512}
1513
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001514void State::setUnpackRowLength(GLint rowLength)
1515{
1516 mUnpack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001517 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001518}
1519
1520GLint State::getUnpackRowLength() const
1521{
1522 return mUnpack.rowLength;
1523}
1524
Minmin Gongadff67b2015-10-14 10:34:45 -04001525void State::setUnpackImageHeight(GLint imageHeight)
1526{
1527 mUnpack.imageHeight = imageHeight;
Jamie Madillc67323a2017-11-02 23:11:41 -04001528 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001529}
1530
1531GLint State::getUnpackImageHeight() const
1532{
1533 return mUnpack.imageHeight;
1534}
1535
1536void State::setUnpackSkipImages(GLint skipImages)
1537{
1538 mUnpack.skipImages = skipImages;
Jamie Madillc67323a2017-11-02 23:11:41 -04001539 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001540}
1541
1542GLint State::getUnpackSkipImages() const
1543{
1544 return mUnpack.skipImages;
1545}
1546
1547void State::setUnpackSkipRows(GLint skipRows)
1548{
1549 mUnpack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001550 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001551}
1552
1553GLint State::getUnpackSkipRows() const
1554{
1555 return mUnpack.skipRows;
1556}
1557
1558void State::setUnpackSkipPixels(GLint skipPixels)
1559{
1560 mUnpack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001561 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001562}
1563
1564GLint State::getUnpackSkipPixels() const
1565{
1566 return mUnpack.skipPixels;
1567}
1568
Shannon Woods53a94a82014-06-24 15:20:36 -04001569const PixelUnpackState &State::getUnpackState() const
1570{
1571 return mUnpack;
1572}
1573
Jamie Madill67102f02015-03-16 10:41:42 -04001574PixelUnpackState &State::getUnpackState()
1575{
1576 return mUnpack;
1577}
1578
Geoff Lang70d0f492015-12-10 17:45:46 -05001579const Debug &State::getDebug() const
1580{
1581 return mDebug;
1582}
1583
1584Debug &State::getDebug()
1585{
1586 return mDebug;
1587}
1588
Sami Väisänena797e062016-05-12 15:23:40 +03001589void State::setCoverageModulation(GLenum components)
1590{
1591 mCoverageModulation = components;
1592 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1593}
1594
1595GLenum State::getCoverageModulation() const
1596{
1597 return mCoverageModulation;
1598}
1599
Sami Väisänene45e53b2016-05-25 10:36:04 +03001600void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1601{
1602 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1603 {
1604 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1605 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1606 }
1607 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1608 {
1609 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1610 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1611 }
1612 else
1613 {
1614 UNREACHABLE();
1615 }
1616}
1617
1618const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1619{
1620 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1621 {
1622 return mPathMatrixMV;
1623 }
1624 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1625 {
1626 return mPathMatrixProj;
1627 }
1628
1629 UNREACHABLE();
1630 return nullptr;
1631}
1632
1633void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1634{
1635 mPathStencilFunc = func;
1636 mPathStencilRef = ref;
1637 mPathStencilMask = mask;
1638 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1639}
1640
1641GLenum State::getPathStencilFunc() const
1642{
1643 return mPathStencilFunc;
1644}
1645
1646GLint State::getPathStencilRef() const
1647{
1648 return mPathStencilRef;
1649}
1650
1651GLuint State::getPathStencilMask() const
1652{
1653 return mPathStencilMask;
1654}
1655
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001656void State::setFramebufferSRGB(bool sRGB)
1657{
1658 mFramebufferSRGB = sRGB;
1659 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1660}
1661
1662bool State::getFramebufferSRGB() const
1663{
1664 return mFramebufferSRGB;
1665}
1666
Shannon Woods53a94a82014-06-24 15:20:36 -04001667void State::getBooleanv(GLenum pname, GLboolean *params)
1668{
1669 switch (pname)
1670 {
1671 case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
1672 case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
1673 case GL_COLOR_WRITEMASK:
1674 params[0] = mBlend.colorMaskRed;
1675 params[1] = mBlend.colorMaskGreen;
1676 params[2] = mBlend.colorMaskBlue;
1677 params[3] = mBlend.colorMaskAlpha;
1678 break;
Corentin Wallez2e568cf2017-09-18 17:05:22 -04001679 case GL_CULL_FACE:
1680 *params = mRasterizer.cullFace;
1681 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001682 case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
1683 case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
1684 case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
Jiawei Shaodb342272017-09-27 10:21:45 +08001685 case GL_SAMPLE_MASK:
1686 *params = mSampleMask;
1687 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001688 case GL_SCISSOR_TEST: *params = mScissorTest; break;
1689 case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
1690 case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
1691 case GL_BLEND: *params = mBlend.blend; break;
1692 case GL_DITHER: *params = mBlend.dither; break;
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001693 case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE; break;
1694 case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE; break;
Jamie Madille2cd53d2015-10-27 11:15:46 -04001695 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1696 *params = mPrimitiveRestart;
1697 break;
Geoff Langab831f02015-12-01 09:39:10 -05001698 case GL_RASTERIZER_DISCARD:
1699 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1700 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001701 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1702 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1703 break;
1704 case GL_DEBUG_OUTPUT:
1705 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1706 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001707 case GL_MULTISAMPLE_EXT:
1708 *params = mMultiSampling;
1709 break;
1710 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1711 *params = mSampleAlphaToOne;
1712 break;
Geoff Langf41a7152016-09-19 15:11:17 -04001713 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1714 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1715 break;
Geoff Langfeb8c682017-02-13 16:07:35 -05001716 case GL_CLIENT_ARRAYS_ANGLE:
1717 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1718 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001719 case GL_FRAMEBUFFER_SRGB_EXT:
1720 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1721 break;
Geoff Langb433e872017-10-05 14:01:47 -04001722 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madille08a1d32017-03-07 17:24:06 -05001723 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1724 break;
Jamie Madillc43be722017-07-13 16:22:14 -04001725 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1726 *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
1727 break;
1728
Shannon Woods53a94a82014-06-24 15:20:36 -04001729 default:
1730 UNREACHABLE();
1731 break;
1732 }
1733}
1734
1735void State::getFloatv(GLenum pname, GLfloat *params)
1736{
1737 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1738 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1739 // GetIntegerv as its native query function. As it would require conversion in any
1740 // case, this should make no difference to the calling application.
1741 switch (pname)
1742 {
1743 case GL_LINE_WIDTH: *params = mLineWidth; break;
1744 case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
1745 case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
1746 case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
1747 case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
1748 case GL_DEPTH_RANGE:
1749 params[0] = mNearZ;
1750 params[1] = mFarZ;
1751 break;
1752 case GL_COLOR_CLEAR_VALUE:
1753 params[0] = mColorClearValue.red;
1754 params[1] = mColorClearValue.green;
1755 params[2] = mColorClearValue.blue;
1756 params[3] = mColorClearValue.alpha;
1757 break;
1758 case GL_BLEND_COLOR:
1759 params[0] = mBlendColor.red;
1760 params[1] = mBlendColor.green;
1761 params[2] = mBlendColor.blue;
1762 params[3] = mBlendColor.alpha;
1763 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001764 case GL_MULTISAMPLE_EXT:
1765 *params = static_cast<GLfloat>(mMultiSampling);
1766 break;
1767 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1768 *params = static_cast<GLfloat>(mSampleAlphaToOne);
Nico Weber41b072b2018-02-09 10:01:32 -05001769 break;
Sami Väisänena797e062016-05-12 15:23:40 +03001770 case GL_COVERAGE_MODULATION_CHROMIUM:
Nico Weber41b072b2018-02-09 10:01:32 -05001771 params[0] = static_cast<GLfloat>(mCoverageModulation);
1772 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001773 default:
1774 UNREACHABLE();
1775 break;
1776 }
1777}
1778
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001779void State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001780{
1781 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1782 {
1783 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001784 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001785 Framebuffer *framebuffer = mDrawFramebuffer;
1786 *params = framebuffer->getDrawBufferState(colorAttachment);
1787 return;
1788 }
1789
1790 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1791 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1792 // GetIntegerv as its native query function. As it would require conversion in any
1793 // case, this should make no difference to the calling application. You may find it in
1794 // State::getFloatv.
1795 switch (pname)
1796 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001797 case GL_ARRAY_BUFFER_BINDING:
1798 *params = mBoundBuffers[BufferBinding::Array].id();
1799 break;
1800 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1801 *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
1802 break;
1803 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1804 *params = getVertexArray()->getElementArrayBuffer().id();
1805 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001806 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1807 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
1808 case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
1809 case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
1810 case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
Geoff Lang7dd2e102014-11-10 15:19:26 -05001811 case GL_CURRENT_PROGRAM: *params = mProgram ? mProgram->id() : 0; break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001812 case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
1813 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001814 case GL_PACK_ROW_LENGTH:
1815 *params = mPack.rowLength;
1816 break;
1817 case GL_PACK_SKIP_ROWS:
1818 *params = mPack.skipRows;
1819 break;
1820 case GL_PACK_SKIP_PIXELS:
1821 *params = mPack.skipPixels;
1822 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001823 case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001824 case GL_UNPACK_ROW_LENGTH: *params = mUnpack.rowLength; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001825 case GL_UNPACK_IMAGE_HEIGHT:
1826 *params = mUnpack.imageHeight;
1827 break;
1828 case GL_UNPACK_SKIP_IMAGES:
1829 *params = mUnpack.skipImages;
1830 break;
1831 case GL_UNPACK_SKIP_ROWS:
1832 *params = mUnpack.skipRows;
1833 break;
1834 case GL_UNPACK_SKIP_PIXELS:
1835 *params = mUnpack.skipPixels;
1836 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001837 case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
1838 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001839 case GL_ACTIVE_TEXTURE:
1840 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
1841 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001842 case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
1843 case GL_STENCIL_REF: *params = mStencilRef; break;
jchen10a99ed552017-09-22 08:10:32 +08001844 case GL_STENCIL_VALUE_MASK:
1845 *params = CastMaskValue(context, mDepthStencil.stencilMask);
1846 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001847 case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
1848 case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
jchen10a99ed552017-09-22 08:10:32 +08001849 case GL_STENCIL_BACK_VALUE_MASK:
1850 *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
1851 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001852 case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
1853 case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
1854 case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
1855 case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
1856 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
1857 case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
1858 case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
1859 case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
1860 case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
1861 case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
1862 case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
1863 case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
1864 case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
jchen10a99ed552017-09-22 08:10:32 +08001865 case GL_STENCIL_WRITEMASK:
1866 *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
1867 break;
1868 case GL_STENCIL_BACK_WRITEMASK:
1869 *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
1870 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001871 case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
Jamie Madill4928b7c2017-06-20 12:57:39 -04001872 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
1873 *params = mReadFramebuffer->getImplementationColorReadType(context);
1874 break;
1875 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
1876 *params = mReadFramebuffer->getImplementationColorReadFormat(context);
1877 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001878 case GL_SAMPLE_BUFFERS:
1879 case GL_SAMPLES:
1880 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001881 Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001882 if (framebuffer->checkStatus(context) == GL_FRAMEBUFFER_COMPLETE)
Shannon Woods53a94a82014-06-24 15:20:36 -04001883 {
1884 switch (pname)
1885 {
Jamie Madilla0016b72017-07-14 14:30:46 -04001886 case GL_SAMPLE_BUFFERS:
1887 if (framebuffer->getSamples(context) != 0)
1888 {
1889 *params = 1;
1890 }
1891 else
1892 {
1893 *params = 0;
1894 }
1895 break;
1896 case GL_SAMPLES:
1897 *params = framebuffer->getSamples(context);
1898 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001899 }
1900 }
1901 else
1902 {
1903 *params = 0;
1904 }
1905 }
1906 break;
1907 case GL_VIEWPORT:
1908 params[0] = mViewport.x;
1909 params[1] = mViewport.y;
1910 params[2] = mViewport.width;
1911 params[3] = mViewport.height;
1912 break;
1913 case GL_SCISSOR_BOX:
1914 params[0] = mScissor.x;
1915 params[1] = mScissor.y;
1916 params[2] = mScissor.width;
1917 params[3] = mScissor.height;
1918 break;
Corentin Wallez2e568cf2017-09-18 17:05:22 -04001919 case GL_CULL_FACE_MODE:
1920 *params = ToGLenum(mRasterizer.cullMode);
1921 break;
1922 case GL_FRONT_FACE:
1923 *params = mRasterizer.frontFace;
1924 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001925 case GL_RED_BITS:
1926 case GL_GREEN_BITS:
1927 case GL_BLUE_BITS:
1928 case GL_ALPHA_BITS:
1929 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001930 Framebuffer *framebuffer = getDrawFramebuffer();
1931 const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001932
1933 if (colorbuffer)
1934 {
1935 switch (pname)
1936 {
1937 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1938 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1939 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1940 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1941 }
1942 }
1943 else
1944 {
1945 *params = 0;
1946 }
1947 }
1948 break;
1949 case GL_DEPTH_BITS:
1950 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001951 const Framebuffer *framebuffer = getDrawFramebuffer();
1952 const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001953
1954 if (depthbuffer)
1955 {
1956 *params = depthbuffer->getDepthSize();
1957 }
1958 else
1959 {
1960 *params = 0;
1961 }
1962 }
1963 break;
1964 case GL_STENCIL_BITS:
1965 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001966 const Framebuffer *framebuffer = getDrawFramebuffer();
1967 const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001968
1969 if (stencilbuffer)
1970 {
1971 *params = stencilbuffer->getStencilSize();
1972 }
1973 else
1974 {
1975 *params = 0;
1976 }
1977 }
1978 break;
1979 case GL_TEXTURE_BINDING_2D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001980 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001981 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001982 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001983 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
1984 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1985 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
1986 GL_TEXTURE_RECTANGLE_ANGLE);
1987 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001988 case GL_TEXTURE_BINDING_CUBE_MAP:
Shannon Woods2df6a602014-09-26 16:12:07 -04001989 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001990 *params =
1991 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_CUBE_MAP);
Shannon Woods53a94a82014-06-24 15:20:36 -04001992 break;
1993 case GL_TEXTURE_BINDING_3D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001994 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001995 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_3D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001996 break;
1997 case GL_TEXTURE_BINDING_2D_ARRAY:
Shannon Woods2df6a602014-09-26 16:12:07 -04001998 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001999 *params =
2000 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), GL_TEXTURE_2D_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04002001 break;
JiangYizhou24fe74c2017-07-06 16:56:50 +08002002 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2003 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2004 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2005 GL_TEXTURE_2D_MULTISAMPLE);
2006 break;
John Bauman18319182016-09-28 14:22:27 -07002007 case GL_TEXTURE_BINDING_EXTERNAL_OES:
2008 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2009 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2010 GL_TEXTURE_EXTERNAL_OES);
2011 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002012 case GL_UNIFORM_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002013 *params = mBoundBuffers[BufferBinding::Uniform].id();
2014 break;
Frank Henigman22581ff2015-11-06 14:25:54 -05002015 case GL_TRANSFORM_FEEDBACK_BINDING:
Frank Henigmanb0f0b812015-11-21 17:49:29 -05002016 *params = mTransformFeedback.id();
Frank Henigman22581ff2015-11-06 14:25:54 -05002017 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002018 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002019 ASSERT(mTransformFeedback.get() != nullptr);
2020 *params = mTransformFeedback->getGenericBuffer().id();
2021 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002022 case GL_COPY_READ_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002023 *params = mBoundBuffers[BufferBinding::CopyRead].id();
2024 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002025 case GL_COPY_WRITE_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002026 *params = mBoundBuffers[BufferBinding::CopyWrite].id();
2027 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002028 case GL_PIXEL_PACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002029 *params = mBoundBuffers[BufferBinding::PixelPack].id();
Corentin Wallezcda6af12017-10-30 19:20:37 -04002030 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002031 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002032 *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
Corentin Wallezcda6af12017-10-30 19:20:37 -04002033 break;
Olli Etuaho86821db2016-03-04 12:05:47 +02002034 case GL_READ_BUFFER:
2035 *params = mReadFramebuffer->getReadBufferState();
2036 break;
2037 case GL_SAMPLER_BINDING:
2038 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2039 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
2040 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05002041 case GL_DEBUG_LOGGED_MESSAGES:
2042 *params = static_cast<GLint>(mDebug.getMessageCount());
2043 break;
2044 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
2045 *params = static_cast<GLint>(mDebug.getNextMessageLength());
2046 break;
2047 case GL_DEBUG_GROUP_STACK_DEPTH:
2048 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
2049 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03002050 case GL_MULTISAMPLE_EXT:
2051 *params = static_cast<GLint>(mMultiSampling);
2052 break;
2053 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2054 *params = static_cast<GLint>(mSampleAlphaToOne);
Nico Weber41b072b2018-02-09 10:01:32 -05002055 break;
Sami Väisänena797e062016-05-12 15:23:40 +03002056 case GL_COVERAGE_MODULATION_CHROMIUM:
2057 *params = static_cast<GLint>(mCoverageModulation);
Sami Väisänen74c23472016-05-09 17:30:30 +03002058 break;
Jiajia Qin6eafb042016-12-27 17:04:07 +08002059 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002060 *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
Jiajia Qin6eafb042016-12-27 17:04:07 +08002061 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002062 case GL_SHADER_STORAGE_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002063 *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002064 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08002065 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
2066 *params = mBoundBuffers[BufferBinding::DispatchIndirect].id();
2067 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002068 default:
2069 UNREACHABLE();
2070 break;
2071 }
2072}
2073
Geoff Lang70d0f492015-12-10 17:45:46 -05002074void State::getPointerv(GLenum pname, void **params) const
2075{
2076 switch (pname)
2077 {
2078 case GL_DEBUG_CALLBACK_FUNCTION:
2079 *params = reinterpret_cast<void *>(mDebug.getCallback());
2080 break;
2081 case GL_DEBUG_CALLBACK_USER_PARAM:
2082 *params = const_cast<void *>(mDebug.getUserParam());
2083 break;
2084 default:
2085 UNREACHABLE();
2086 break;
2087 }
2088}
2089
Martin Radev66fb8202016-07-28 11:45:20 +03002090void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002091{
2092 switch (target)
2093 {
2094 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002095 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2096 *data = mTransformFeedback->getIndexedBuffer(index).id();
2097 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002098 case GL_UNIFORM_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002099 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2100 *data = mUniformBuffers[index].id();
2101 break;
2102 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2103 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2104 *data = mAtomicCounterBuffers[index].id();
2105 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002106 case GL_SHADER_STORAGE_BUFFER_BINDING:
2107 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2108 *data = mShaderStorageBuffers[index].id();
2109 break;
Shao80957d92017-02-20 21:25:59 +08002110 case GL_VERTEX_BINDING_BUFFER:
2111 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002112 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
Shao80957d92017-02-20 21:25:59 +08002113 break;
2114 case GL_VERTEX_BINDING_DIVISOR:
2115 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002116 *data = mVertexArray->getVertexBinding(index).getDivisor();
Shao80957d92017-02-20 21:25:59 +08002117 break;
2118 case GL_VERTEX_BINDING_OFFSET:
2119 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002120 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
Shao80957d92017-02-20 21:25:59 +08002121 break;
2122 case GL_VERTEX_BINDING_STRIDE:
2123 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002124 *data = mVertexArray->getVertexBinding(index).getStride();
Shao80957d92017-02-20 21:25:59 +08002125 break;
Jiawei Shaodb342272017-09-27 10:21:45 +08002126 case GL_SAMPLE_MASK_VALUE:
2127 ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2128 *data = mSampleMaskValues[index];
2129 break;
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002130 case GL_IMAGE_BINDING_NAME:
2131 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2132 *data = mImageUnits[index].texture.id();
2133 break;
2134 case GL_IMAGE_BINDING_LEVEL:
2135 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2136 *data = mImageUnits[index].level;
2137 break;
2138 case GL_IMAGE_BINDING_LAYER:
2139 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2140 *data = mImageUnits[index].layer;
2141 break;
2142 case GL_IMAGE_BINDING_ACCESS:
2143 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2144 *data = mImageUnits[index].access;
2145 break;
2146 case GL_IMAGE_BINDING_FORMAT:
2147 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2148 *data = mImageUnits[index].format;
2149 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002150 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002151 UNREACHABLE();
2152 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002153 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002154}
2155
Martin Radev66fb8202016-07-28 11:45:20 +03002156void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002157{
2158 switch (target)
2159 {
2160 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002161 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2162 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2163 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002164 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002165 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2166 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2167 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002168 case GL_UNIFORM_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002169 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2170 *data = mUniformBuffers[index].getOffset();
2171 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002172 case GL_UNIFORM_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002173 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2174 *data = mUniformBuffers[index].getSize();
2175 break;
2176 case GL_ATOMIC_COUNTER_BUFFER_START:
2177 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2178 *data = mAtomicCounterBuffers[index].getOffset();
2179 break;
2180 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2181 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2182 *data = mAtomicCounterBuffers[index].getSize();
2183 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002184 case GL_SHADER_STORAGE_BUFFER_START:
2185 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2186 *data = mShaderStorageBuffers[index].getOffset();
2187 break;
2188 case GL_SHADER_STORAGE_BUFFER_SIZE:
2189 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2190 *data = mShaderStorageBuffers[index].getSize();
2191 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002192 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002193 UNREACHABLE();
2194 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002195 }
Martin Radev66fb8202016-07-28 11:45:20 +03002196}
Shannon Woods53a94a82014-06-24 15:20:36 -04002197
Martin Radev66fb8202016-07-28 11:45:20 +03002198void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2199{
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002200 switch (target)
2201 {
2202 case GL_IMAGE_BINDING_LAYERED:
2203 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2204 *data = mImageUnits[index].layered;
2205 break;
2206 default:
2207 UNREACHABLE();
2208 break;
2209 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002210}
2211
Corentin Wallez336129f2017-10-17 15:55:40 -04002212bool State::hasMappedBuffer(BufferBinding target) const
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002213{
Corentin Wallez336129f2017-10-17 15:55:40 -04002214 if (target == BufferBinding::Array)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002215 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002216 const VertexArray *vao = getVertexArray();
Jamie Madilleea3a6e2015-04-15 10:02:48 -04002217 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002218 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madilld078c682018-01-02 11:50:24 -05002219 for (size_t attribIndex : vao->getEnabledAttributesMask())
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002220 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002221 const VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Martin Radevdd5f27e2017-06-07 10:17:09 +03002222 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002223 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
2224 {
2225 return true;
2226 }
2227 }
2228
2229 return false;
2230 }
2231 else
2232 {
2233 Buffer *buffer = getTargetBuffer(target);
2234 return (buffer && buffer->isMapped());
2235 }
2236}
2237
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002238void State::syncDirtyObjects(const Context *context)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002239{
2240 if (!mDirtyObjects.any())
2241 return;
2242
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002243 syncDirtyObjects(context, mDirtyObjects);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002244}
2245
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002246void State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002247{
Jamie Madill6de51852017-04-12 09:53:01 -04002248 for (auto dirtyObject : bitset)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002249 {
2250 switch (dirtyObject)
2251 {
2252 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002253 ASSERT(mReadFramebuffer);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002254 mReadFramebuffer->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002255 break;
2256 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002257 ASSERT(mDrawFramebuffer);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002258 mDrawFramebuffer->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002259 break;
2260 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002261 ASSERT(mVertexArray);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002262 mVertexArray->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002263 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002264 case DIRTY_OBJECT_PROGRAM_TEXTURES:
2265 syncProgramTextures(context);
2266 break;
2267
Jamie Madillc9d442d2016-01-20 11:17:24 -05002268 default:
2269 UNREACHABLE();
2270 break;
2271 }
2272 }
2273
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002274 mDirtyObjects &= ~bitset;
2275}
2276
Jamie Madill81c2e252017-09-09 23:32:46 -04002277void State::syncProgramTextures(const Context *context)
2278{
Jamie Madill81c2e252017-09-09 23:32:46 -04002279 // TODO(jmadill): Fine-grained updates.
2280 if (!mProgram)
2281 {
2282 return;
2283 }
2284
2285 ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
2286 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2287
Jamie Madill0f80ed82017-09-19 00:24:56 -04002288 ActiveTextureMask newActiveTextures;
2289
Geoff Lange51ba632017-11-21 11:45:25 -05002290 // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
2291 // initialized.
2292 mCachedTexturesInitState = InitState::Initialized;
2293
Jamie Madill81c2e252017-09-09 23:32:46 -04002294 for (const SamplerBinding &samplerBinding : mProgram->getSamplerBindings())
2295 {
2296 if (samplerBinding.unreferenced)
2297 continue;
2298
2299 GLenum textureType = samplerBinding.textureType;
2300 for (GLuint textureUnitIndex : samplerBinding.boundTextureUnits)
2301 {
2302 Texture *texture = getSamplerTexture(textureUnitIndex, textureType);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002303 Sampler *sampler = getSampler(textureUnitIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002304 ASSERT(static_cast<size_t>(textureUnitIndex) < mCompleteTextureCache.size());
2305 ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
Jamie Madill81c2e252017-09-09 23:32:46 -04002306
Jamie Madill42975642017-10-12 12:31:51 -04002307 ASSERT(texture);
Jamie Madill81c2e252017-09-09 23:32:46 -04002308
Jamie Madill42975642017-10-12 12:31:51 -04002309 // Mark the texture binding bit as dirty if the texture completeness changes.
2310 // TODO(jmadill): Use specific dirty bit for completeness change.
2311 if (texture->isSamplerComplete(context, sampler) &&
2312 !mDrawFramebuffer->hasTextureAttachment(texture))
2313 {
2314 texture->syncState();
2315 mCompleteTextureCache[textureUnitIndex] = texture;
Jamie Madill81c2e252017-09-09 23:32:46 -04002316 }
Jamie Madill42975642017-10-12 12:31:51 -04002317 else
2318 {
2319 mCompleteTextureCache[textureUnitIndex] = nullptr;
2320 }
2321
2322 // Bind the texture unconditionally, to recieve completeness change notifications.
2323 mCompleteTextureBindings[textureUnitIndex].bind(texture->getDirtyChannel());
Jamie Madilla59fc192017-11-02 12:57:58 -04002324 mActiveTexturesMask.set(textureUnitIndex);
Jamie Madill42975642017-10-12 12:31:51 -04002325 newActiveTextures.set(textureUnitIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -04002326
Jamie Madill06ef36b2017-09-09 23:32:46 -04002327 if (sampler != nullptr)
2328 {
2329 sampler->syncState(context);
2330 }
Geoff Lange51ba632017-11-21 11:45:25 -05002331
2332 if (texture->initState() == InitState::MayNeedInit)
2333 {
2334 mCachedTexturesInitState = InitState::MayNeedInit;
2335 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002336 }
2337 }
Jamie Madill0f80ed82017-09-19 00:24:56 -04002338
2339 // Unset now missing textures.
Jamie Madilla59fc192017-11-02 12:57:58 -04002340 ActiveTextureMask negativeMask = mActiveTexturesMask & ~newActiveTextures;
Jamie Madill0f80ed82017-09-19 00:24:56 -04002341 if (negativeMask.any())
2342 {
2343 for (auto textureIndex : negativeMask)
2344 {
2345 mCompleteTextureBindings[textureIndex].reset();
2346 mCompleteTextureCache[textureIndex] = nullptr;
Jamie Madilla59fc192017-11-02 12:57:58 -04002347 mActiveTexturesMask.reset(textureIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002348 }
2349 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002350}
2351
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002352void State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002353{
2354 DirtyObjects localSet;
2355
2356 switch (target)
2357 {
2358 case GL_READ_FRAMEBUFFER:
2359 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2360 break;
2361 case GL_DRAW_FRAMEBUFFER:
2362 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2363 break;
2364 case GL_FRAMEBUFFER:
2365 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2366 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2367 break;
2368 case GL_VERTEX_ARRAY:
2369 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2370 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002371 case GL_TEXTURE:
2372 case GL_SAMPLER:
2373 case GL_PROGRAM:
2374 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2375 break;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002376 }
2377
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002378 syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002379}
2380
2381void State::setObjectDirty(GLenum target)
2382{
2383 switch (target)
2384 {
2385 case GL_READ_FRAMEBUFFER:
2386 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2387 break;
2388 case GL_DRAW_FRAMEBUFFER:
2389 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2390 break;
2391 case GL_FRAMEBUFFER:
2392 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2393 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2394 break;
2395 case GL_VERTEX_ARRAY:
2396 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2397 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002398 case GL_TEXTURE:
2399 case GL_SAMPLER:
Jamie Madill81c2e252017-09-09 23:32:46 -04002400 case GL_PROGRAM:
2401 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2402 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2403 break;
Jamie Madilla779b612017-07-24 11:46:05 -04002404 }
2405}
2406
2407void State::onProgramExecutableChange(Program *program)
2408{
2409 // OpenGL Spec:
2410 // "If LinkProgram or ProgramBinary successfully re-links a program object
2411 // that was already in use as a result of a previous call to UseProgram, then the
2412 // generated executable code will be installed as part of the current rendering state."
2413 if (program->isLinked() && mProgram == program)
2414 {
2415 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
Jamie Madill81c2e252017-09-09 23:32:46 -04002416 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002417 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002418}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002419
Xinghua Cao65ec0b22017-03-28 16:10:52 +08002420void State::setImageUnit(const Context *context,
2421 GLuint unit,
2422 Texture *texture,
2423 GLint level,
2424 GLboolean layered,
2425 GLint layer,
2426 GLenum access,
2427 GLenum format)
2428{
2429 mImageUnits[unit].texture.set(context, texture);
2430 mImageUnits[unit].level = level;
2431 mImageUnits[unit].layered = layered;
2432 mImageUnits[unit].layer = layer;
2433 mImageUnits[unit].access = access;
2434 mImageUnits[unit].format = format;
2435}
2436
2437const ImageUnit &State::getImageUnit(GLuint unit) const
2438{
2439 return mImageUnits[unit];
2440}
2441
Jamie Madill81c2e252017-09-09 23:32:46 -04002442// Handle a dirty texture event.
Jamie Madill05b35b22017-10-03 09:01:44 -04002443void State::signal(size_t textureIndex, InitState initState)
Jamie Madill81c2e252017-09-09 23:32:46 -04002444{
2445 // Conservatively assume all textures are dirty.
2446 // TODO(jmadill): More fine-grained update.
2447 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lange51ba632017-11-21 11:45:25 -05002448
2449 if (initState == InitState::MayNeedInit)
2450 {
2451 mCachedTexturesInitState = InitState::MayNeedInit;
2452 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002453}
2454
Jamie Madill05b35b22017-10-03 09:01:44 -04002455Error State::clearUnclearedActiveTextures(const Context *context)
2456{
Jamie Madilla59fc192017-11-02 12:57:58 -04002457 ASSERT(mRobustResourceInit);
Jamie Madill05b35b22017-10-03 09:01:44 -04002458
Geoff Lange51ba632017-11-21 11:45:25 -05002459 if (mCachedTexturesInitState == InitState::Initialized)
2460 {
2461 return NoError();
2462 }
2463
Jamie Madilla59fc192017-11-02 12:57:58 -04002464 for (auto textureIndex : mActiveTexturesMask)
Jamie Madill05b35b22017-10-03 09:01:44 -04002465 {
Jamie Madilla59fc192017-11-02 12:57:58 -04002466 Texture *texture = mCompleteTextureCache[textureIndex];
Jamie Madill05b35b22017-10-03 09:01:44 -04002467 if (texture)
2468 {
2469 ANGLE_TRY(texture->ensureInitialized(context));
2470 }
2471 }
Jamie Madilla59fc192017-11-02 12:57:58 -04002472
Geoff Lange51ba632017-11-21 11:45:25 -05002473 mCachedTexturesInitState = InitState::Initialized;
2474
Jamie Madill05b35b22017-10-03 09:01:44 -04002475 return NoError();
2476}
2477
Jamie Madillc67323a2017-11-02 23:11:41 -04002478AttributesMask State::getAndResetDirtyCurrentValues() const
2479{
2480 AttributesMask retVal = mDirtyCurrentValues;
2481 mDirtyCurrentValues.reset();
2482 return retVal;
2483}
2484
Jamie Madillc9d442d2016-01-20 11:17:24 -05002485} // namespace gl