blob: 66873aadcb5c76376c3cb5e67c5d04db7f9d6afc [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
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800153 mSamplerTextures[TextureType::_2D].resize(caps.maxCombinedTextureImageUnits);
154 mSamplerTextures[TextureType::CubeMap].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
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800158 mSamplerTextures[TextureType::_2DArray].resize(caps.maxCombinedTextureImageUnits);
159 mSamplerTextures[TextureType::_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 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800163 mSamplerTextures[TextureType::_2DMultisample].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 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800171 mSamplerTextures[TextureType::Rectangle].resize(caps.maxCombinedTextureImageUnits);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400172 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400173 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400174 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800175 mSamplerTextures[TextureType::External].resize(caps.maxCombinedTextureImageUnits);
Ian Ewellbda75592016-04-18 17:25:54 -0400176 }
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 {
Jamie Madilld4442552018-02-27 22:03:47 -0500183 mCompleteTextureBindings.emplace_back(this, textureIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -0400184 }
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 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800223 for (size_t textureIdx = 0; textureIdx < bindingVec.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400224 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800225 bindingVec[textureIdx].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400226 }
227 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400228 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
229 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400230 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400231 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400232
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800233 for (auto &imageUnit : mImageUnits)
234 {
235 imageUnit.texture.set(context, nullptr);
236 imageUnit.level = 0;
237 imageUnit.layered = false;
238 imageUnit.layer = 0;
239 imageUnit.access = GL_READ_ONLY;
240 imageUnit.format = GL_R32UI;
241 }
242
Jamie Madill4928b7c2017-06-20 12:57:39 -0400243 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400244
Corentin Wallez336129f2017-10-17 15:55:40 -0400245 for (auto type : angle::AllEnums<BufferBinding>())
246 {
247 mBoundBuffers[type].set(context, nullptr);
248 }
249
Geoff Lang7dd2e102014-11-10 15:19:26 -0500250 if (mProgram)
251 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500252 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500253 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800254 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500255
Yunchao Hea336b902017-08-02 16:05:21 +0800256 mProgramPipeline.set(context, nullptr);
257
Jamie Madill4928b7c2017-06-20 12:57:39 -0400258 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400259
260 for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
261 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400262 i->second.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400263 }
264
Corentin Wallez336129f2017-10-17 15:55:40 -0400265 for (auto &buf : mUniformBuffers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400266 {
Corentin Wallez336129f2017-10-17 15:55:40 -0400267 buf.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400268 }
269
Jiajia Qin6eafb042016-12-27 17:04:07 +0800270 for (auto &buf : mAtomicCounterBuffers)
271 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400272 buf.set(context, nullptr);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800273 }
274
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800275 for (auto &buf : mShaderStorageBuffers)
276 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400277 buf.set(context, nullptr);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800278 }
279
Sami Väisänene45e53b2016-05-25 10:36:04 +0300280 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
281 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
282 mPathStencilFunc = GL_ALWAYS;
283 mPathStencilRef = 0;
284 mPathStencilMask = std::numeric_limits<GLuint>::max();
285
Jamie Madill1b94d432015-08-07 13:23:23 -0400286 // TODO(jmadill): Is this necessary?
287 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400288}
289
290const RasterizerState &State::getRasterizerState() const
291{
292 return mRasterizer;
293}
294
295const BlendState &State::getBlendState() const
296{
297 return mBlend;
298}
299
300const DepthStencilState &State::getDepthStencilState() const
301{
302 return mDepthStencil;
303}
304
Jamie Madillf75ab352015-03-16 10:46:52 -0400305void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400306{
307 mColorClearValue.red = red;
308 mColorClearValue.green = green;
309 mColorClearValue.blue = blue;
310 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400311 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400312}
313
Jamie Madillf75ab352015-03-16 10:46:52 -0400314void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400315{
316 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400317 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400318}
319
Jamie Madillf75ab352015-03-16 10:46:52 -0400320void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400321{
322 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400323 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400324}
325
Shannon Woods53a94a82014-06-24 15:20:36 -0400326void State::setColorMask(bool red, bool green, bool blue, bool alpha)
327{
328 mBlend.colorMaskRed = red;
329 mBlend.colorMaskGreen = green;
330 mBlend.colorMaskBlue = blue;
331 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400332 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400333}
334
335void State::setDepthMask(bool mask)
336{
337 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400338 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400339}
340
341bool State::isRasterizerDiscardEnabled() const
342{
343 return mRasterizer.rasterizerDiscard;
344}
345
346void State::setRasterizerDiscard(bool enabled)
347{
348 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400349 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400350}
351
352bool State::isCullFaceEnabled() const
353{
354 return mRasterizer.cullFace;
355}
356
357void State::setCullFace(bool enabled)
358{
359 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400360 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400361}
362
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400363void State::setCullMode(CullFaceMode mode)
Shannon Woods53a94a82014-06-24 15:20:36 -0400364{
365 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400366 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400367}
368
369void State::setFrontFace(GLenum front)
370{
371 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400372 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400373}
374
375bool State::isDepthTestEnabled() const
376{
377 return mDepthStencil.depthTest;
378}
379
380void State::setDepthTest(bool enabled)
381{
382 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400383 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400384}
385
386void State::setDepthFunc(GLenum depthFunc)
387{
388 mDepthStencil.depthFunc = depthFunc;
Jamie Madill1b94d432015-08-07 13:23:23 -0400389 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400390}
391
392void State::setDepthRange(float zNear, float zFar)
393{
394 mNearZ = zNear;
395 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400396 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400397}
398
Geoff Langd42f5b82015-04-16 14:03:29 -0400399float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400400{
Geoff Langd42f5b82015-04-16 14:03:29 -0400401 return mNearZ;
402}
403
404float State::getFarPlane() const
405{
406 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400407}
408
409bool State::isBlendEnabled() const
410{
411 return mBlend.blend;
412}
413
414void State::setBlend(bool enabled)
415{
416 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400417 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400418}
419
420void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
421{
422 mBlend.sourceBlendRGB = sourceRGB;
423 mBlend.destBlendRGB = destRGB;
424 mBlend.sourceBlendAlpha = sourceAlpha;
425 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400426 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400427}
428
429void State::setBlendColor(float red, float green, float blue, float alpha)
430{
431 mBlendColor.red = red;
432 mBlendColor.green = green;
433 mBlendColor.blue = blue;
434 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400435 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400436}
437
438void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
439{
440 mBlend.blendEquationRGB = rgbEquation;
441 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400442 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400443}
444
445const ColorF &State::getBlendColor() const
446{
447 return mBlendColor;
448}
449
450bool State::isStencilTestEnabled() const
451{
452 return mDepthStencil.stencilTest;
453}
454
455void State::setStencilTest(bool enabled)
456{
457 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400458 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400459}
460
461void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
462{
463 mDepthStencil.stencilFunc = stencilFunc;
464 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
465 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400466 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400467}
468
469void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
470{
471 mDepthStencil.stencilBackFunc = stencilBackFunc;
472 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
473 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400474 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400475}
476
477void State::setStencilWritemask(GLuint stencilWritemask)
478{
479 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400480 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400481}
482
483void State::setStencilBackWritemask(GLuint stencilBackWritemask)
484{
485 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400486 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400487}
488
489void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
490{
491 mDepthStencil.stencilFail = stencilFail;
492 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
493 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400494 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400495}
496
497void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
498{
499 mDepthStencil.stencilBackFail = stencilBackFail;
500 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
501 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400502 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400503}
504
505GLint State::getStencilRef() const
506{
507 return mStencilRef;
508}
509
510GLint State::getStencilBackRef() const
511{
512 return mStencilBackRef;
513}
514
515bool State::isPolygonOffsetFillEnabled() const
516{
517 return mRasterizer.polygonOffsetFill;
518}
519
520void State::setPolygonOffsetFill(bool enabled)
521{
Jamie Madill1b94d432015-08-07 13:23:23 -0400522 mRasterizer.polygonOffsetFill = enabled;
523 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400524}
525
526void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
527{
528 // An application can pass NaN values here, so handle this gracefully
529 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
530 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400531 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400532}
533
534bool State::isSampleAlphaToCoverageEnabled() const
535{
536 return mBlend.sampleAlphaToCoverage;
537}
538
539void State::setSampleAlphaToCoverage(bool enabled)
540{
541 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400542 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400543}
544
545bool State::isSampleCoverageEnabled() const
546{
547 return mSampleCoverage;
548}
549
550void State::setSampleCoverage(bool enabled)
551{
552 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400553 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400554}
555
556void State::setSampleCoverageParams(GLclampf value, bool invert)
557{
558 mSampleCoverageValue = value;
559 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400560 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400561}
562
Geoff Lang0fbb6002015-04-16 11:11:53 -0400563GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400564{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400565 return mSampleCoverageValue;
566}
Shannon Woods53a94a82014-06-24 15:20:36 -0400567
Geoff Lang0fbb6002015-04-16 11:11:53 -0400568bool State::getSampleCoverageInvert() const
569{
570 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400571}
572
Jiawei Shaodb342272017-09-27 10:21:45 +0800573bool State::isSampleMaskEnabled() const
574{
575 return mSampleMask;
576}
577
578void State::setSampleMaskEnabled(bool enabled)
579{
580 mSampleMask = enabled;
581 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
582}
583
584void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
585{
586 ASSERT(maskNumber < mMaxSampleMaskWords);
587 mSampleMaskValues[maskNumber] = mask;
Jamie Madillc67323a2017-11-02 23:11:41 -0400588 // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
589 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
Jiawei Shaodb342272017-09-27 10:21:45 +0800590}
591
592GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
593{
594 ASSERT(maskNumber < mMaxSampleMaskWords);
595 return mSampleMaskValues[maskNumber];
596}
597
598GLuint State::getMaxSampleMaskWords() const
599{
600 return mMaxSampleMaskWords;
601}
602
Sami Väisänen74c23472016-05-09 17:30:30 +0300603void State::setSampleAlphaToOne(bool enabled)
604{
605 mSampleAlphaToOne = enabled;
606 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
607}
608
609bool State::isSampleAlphaToOneEnabled() const
610{
611 return mSampleAlphaToOne;
612}
613
614void State::setMultisampling(bool enabled)
615{
616 mMultiSampling = enabled;
617 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
618}
619
620bool State::isMultisamplingEnabled() const
621{
622 return mMultiSampling;
623}
624
Shannon Woods53a94a82014-06-24 15:20:36 -0400625bool State::isScissorTestEnabled() const
626{
627 return mScissorTest;
628}
629
630void State::setScissorTest(bool enabled)
631{
632 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400633 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400634}
635
636void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
637{
638 mScissor.x = x;
639 mScissor.y = y;
640 mScissor.width = width;
641 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400642 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400643}
644
645const Rectangle &State::getScissor() const
646{
647 return mScissor;
648}
649
650bool State::isDitherEnabled() const
651{
652 return mBlend.dither;
653}
654
655void State::setDither(bool enabled)
656{
657 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400658 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400659}
660
Jamie Madillb4b53c52015-02-03 15:22:48 -0500661bool State::isPrimitiveRestartEnabled() const
662{
663 return mPrimitiveRestart;
664}
665
666void State::setPrimitiveRestart(bool enabled)
667{
668 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400669 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500670}
671
Shannon Woods53a94a82014-06-24 15:20:36 -0400672void State::setEnableFeature(GLenum feature, bool enabled)
673{
674 switch (feature)
675 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300676 case GL_MULTISAMPLE_EXT: setMultisampling(enabled); break;
677 case GL_SAMPLE_ALPHA_TO_ONE_EXT: setSampleAlphaToOne(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400678 case GL_CULL_FACE: setCullFace(enabled); break;
679 case GL_POLYGON_OFFSET_FILL: setPolygonOffsetFill(enabled); break;
680 case GL_SAMPLE_ALPHA_TO_COVERAGE: setSampleAlphaToCoverage(enabled); break;
681 case GL_SAMPLE_COVERAGE: setSampleCoverage(enabled); break;
682 case GL_SCISSOR_TEST: setScissorTest(enabled); break;
683 case GL_STENCIL_TEST: setStencilTest(enabled); break;
684 case GL_DEPTH_TEST: setDepthTest(enabled); break;
685 case GL_BLEND: setBlend(enabled); break;
686 case GL_DITHER: setDither(enabled); break;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500687 case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled); break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400688 case GL_RASTERIZER_DISCARD: setRasterizerDiscard(enabled); break;
Geoff Lang3b573612016-10-31 14:08:10 -0400689 case GL_SAMPLE_MASK:
Jiawei Shaodb342272017-09-27 10:21:45 +0800690 setSampleMaskEnabled(enabled);
Geoff Lang3b573612016-10-31 14:08:10 -0400691 break;
Geoff Lang70d0f492015-12-10 17:45:46 -0500692 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
693 mDebug.setOutputSynchronous(enabled);
694 break;
695 case GL_DEBUG_OUTPUT:
696 mDebug.setOutputEnabled(enabled);
697 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700698 case GL_FRAMEBUFFER_SRGB_EXT:
699 setFramebufferSRGB(enabled);
700 break;
Shannon Woods53a94a82014-06-24 15:20:36 -0400701 default: UNREACHABLE();
702 }
703}
704
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700705bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400706{
707 switch (feature)
708 {
Sami Väisänen74c23472016-05-09 17:30:30 +0300709 case GL_MULTISAMPLE_EXT: return isMultisamplingEnabled();
710 case GL_SAMPLE_ALPHA_TO_ONE_EXT: return isSampleAlphaToOneEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400711 case GL_CULL_FACE: return isCullFaceEnabled();
712 case GL_POLYGON_OFFSET_FILL: return isPolygonOffsetFillEnabled();
713 case GL_SAMPLE_ALPHA_TO_COVERAGE: return isSampleAlphaToCoverageEnabled();
714 case GL_SAMPLE_COVERAGE: return isSampleCoverageEnabled();
715 case GL_SCISSOR_TEST: return isScissorTestEnabled();
716 case GL_STENCIL_TEST: return isStencilTestEnabled();
717 case GL_DEPTH_TEST: return isDepthTestEnabled();
718 case GL_BLEND: return isBlendEnabled();
719 case GL_DITHER: return isDitherEnabled();
Jamie Madillb4b53c52015-02-03 15:22:48 -0500720 case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
Shannon Woods53a94a82014-06-24 15:20:36 -0400721 case GL_RASTERIZER_DISCARD: return isRasterizerDiscardEnabled();
Geoff Langb5e997f2016-12-06 10:55:34 -0500722 case GL_SAMPLE_MASK:
Jiawei Shaodb342272017-09-27 10:21:45 +0800723 return isSampleMaskEnabled();
Geoff Lang70d0f492015-12-10 17:45:46 -0500724 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
725 return mDebug.isOutputSynchronous();
726 case GL_DEBUG_OUTPUT:
727 return mDebug.isOutputEnabled();
Geoff Langf41a7152016-09-19 15:11:17 -0400728 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
729 return isBindGeneratesResourceEnabled();
Geoff Langfeb8c682017-02-13 16:07:35 -0500730 case GL_CLIENT_ARRAYS_ANGLE:
731 return areClientArraysEnabled();
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700732 case GL_FRAMEBUFFER_SRGB_EXT:
733 return getFramebufferSRGB();
Geoff Langb433e872017-10-05 14:01:47 -0400734 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madille08a1d32017-03-07 17:24:06 -0500735 return mRobustResourceInit;
Jamie Madillc43be722017-07-13 16:22:14 -0400736 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
737 return mProgramBinaryCacheEnabled;
738
739 default:
740 UNREACHABLE();
741 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -0400742 }
743}
744
745void State::setLineWidth(GLfloat width)
746{
747 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -0400748 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400749}
750
Geoff Lang4b3f4162015-04-16 13:22:05 -0400751float State::getLineWidth() const
752{
753 return mLineWidth;
754}
755
Shannon Woods53a94a82014-06-24 15:20:36 -0400756void State::setGenerateMipmapHint(GLenum hint)
757{
758 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400759 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400760}
761
762void State::setFragmentShaderDerivativeHint(GLenum hint)
763{
764 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -0400765 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400766 // TODO: Propagate the hint to shader translator so we can write
767 // ddx, ddx_coarse, or ddx_fine depending on the hint.
768 // Ignore for now. It is valid for implementations to ignore hint.
769}
770
Geoff Langf41a7152016-09-19 15:11:17 -0400771bool State::isBindGeneratesResourceEnabled() const
772{
773 return mBindGeneratesResource;
774}
775
Geoff Langfeb8c682017-02-13 16:07:35 -0500776bool State::areClientArraysEnabled() const
777{
778 return mClientArraysEnabled;
779}
780
Shannon Woods53a94a82014-06-24 15:20:36 -0400781void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
782{
783 mViewport.x = x;
784 mViewport.y = y;
785 mViewport.width = width;
786 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400787 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400788}
789
790const Rectangle &State::getViewport() const
791{
792 return mViewport;
793}
794
795void State::setActiveSampler(unsigned int active)
796{
797 mActiveSampler = active;
798}
799
800unsigned int State::getActiveSampler() const
801{
Cooper Partin4d61f7e2015-08-12 10:56:50 -0700802 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -0400803}
804
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800805void State::setSamplerTexture(const Context *context, TextureType type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400806{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400807 mSamplerTextures[type][mActiveSampler].set(context, texture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400808 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
809 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400810}
811
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800812Texture *State::getTargetTexture(TextureType type) const
Jamie Madillc29968b2016-01-20 11:17:23 -0500813{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800814 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), type);
Jamie Madillc29968b2016-01-20 11:17:23 -0500815}
816
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800817Texture *State::getSamplerTexture(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400818{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800819 ASSERT(sampler < mSamplerTextures[type].size());
820 return mSamplerTextures[type][sampler].get();
Shannon Woods53a94a82014-06-24 15:20:36 -0400821}
822
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800823GLuint State::getSamplerTextureId(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -0400824{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800825 ASSERT(sampler < mSamplerTextures[type].size());
826 return mSamplerTextures[type][sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -0400827}
828
Jamie Madilla02315b2017-02-23 14:14:47 -0500829void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400830{
831 // Textures have a detach method on State rather than a simple
832 // removeBinding, because the zero/null texture objects are managed
833 // separately, and don't have to go through the Context's maps or
834 // the ResourceManager.
835
836 // [OpenGL ES 2.0.24] section 3.8 page 84:
837 // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
838 // rebound to texture object zero
839
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800840 for (TextureType type : angle::AllEnums<TextureType>())
Shannon Woods53a94a82014-06-24 15:20:36 -0400841 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800842 TextureBindingVector &textureVector = mSamplerTextures[type];
Jamie Madill81c2e252017-09-09 23:32:46 -0400843 for (BindingPointer<Texture> &binding : textureVector)
Shannon Woods53a94a82014-06-24 15:20:36 -0400844 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400845 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -0400846 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800847 Texture *zeroTexture = zeroTextures[type].get();
848 ASSERT(zeroTexture != nullptr);
Jamie Madille6382c32014-11-07 15:05:26 -0500849 // Zero textures are the "default" textures instead of NULL
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800850 binding.set(context, zeroTexture);
Jamie Madill81c2e252017-09-09 23:32:46 -0400851 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400852 }
853 }
854 }
855
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800856 for (auto &bindingImageUnit : mImageUnits)
857 {
858 if (bindingImageUnit.texture.id() == texture)
859 {
860 bindingImageUnit.texture.set(context, nullptr);
861 bindingImageUnit.level = 0;
862 bindingImageUnit.layered = false;
863 bindingImageUnit.layer = 0;
864 bindingImageUnit.access = GL_READ_ONLY;
865 bindingImageUnit.format = GL_R32UI;
866 break;
867 }
868 }
869
Shannon Woods53a94a82014-06-24 15:20:36 -0400870 // [OpenGL ES 2.0.24] section 4.4 page 112:
871 // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
872 // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
873 // image was attached in the currently bound framebuffer.
874
Jamie Madill8693bdb2017-09-02 15:32:14 -0400875 if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400876 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400877 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400878 }
879
Jamie Madill8693bdb2017-09-02 15:32:14 -0400880 if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -0400881 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400882 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400883 }
884}
885
Jamie Madill4928b7c2017-06-20 12:57:39 -0400886void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -0500887{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800888 for (TextureType type : angle::AllEnums<TextureType>())
Jamie Madille6382c32014-11-07 15:05:26 -0500889 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800890 for (size_t textureUnit = 0; textureUnit < mSamplerTextures[type].size(); ++textureUnit)
Jamie Madille6382c32014-11-07 15:05:26 -0500891 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800892 mSamplerTextures[type][textureUnit].set(context, zeroTextures[type].get());
Jamie Madille6382c32014-11-07 15:05:26 -0500893 }
894 }
895}
896
Jamie Madill4928b7c2017-06-20 12:57:39 -0400897void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400898{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400899 mSamplers[textureUnit].set(context, sampler);
Jamie Madill81c2e252017-09-09 23:32:46 -0400900 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
901 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Shannon Woods53a94a82014-06-24 15:20:36 -0400902}
903
904GLuint State::getSamplerId(GLuint textureUnit) const
905{
Geoff Lang76b10c92014-09-05 16:28:14 -0400906 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -0400907 return mSamplers[textureUnit].id();
908}
909
910Sampler *State::getSampler(GLuint textureUnit) const
911{
912 return mSamplers[textureUnit].get();
913}
914
Jamie Madill4928b7c2017-06-20 12:57:39 -0400915void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400916{
917 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
918 // If a sampler object that is currently bound to one or more texture units is
919 // deleted, it is as though BindSampler is called once for each texture unit to
920 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Jamie Madill81c2e252017-09-09 23:32:46 -0400921 for (BindingPointer<Sampler> &samplerBinding : mSamplers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400922 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400923 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -0400924 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400925 samplerBinding.set(context, nullptr);
Jamie Madill81c2e252017-09-09 23:32:46 -0400926 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400927 }
928 }
929}
930
Jamie Madill4928b7c2017-06-20 12:57:39 -0400931void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400932{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400933 mRenderbuffer.set(context, renderbuffer);
Jamie Madill8693bdb2017-09-02 15:32:14 -0400934 mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -0400935}
936
937GLuint State::getRenderbufferId() const
938{
939 return mRenderbuffer.id();
940}
941
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700942Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400943{
944 return mRenderbuffer.get();
945}
946
Jamie Madilla02315b2017-02-23 14:14:47 -0500947void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -0400948{
949 // [OpenGL ES 2.0.24] section 4.4 page 109:
950 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though BindRenderbuffer
951 // had been executed with the target RENDERBUFFER and name of zero.
952
953 if (mRenderbuffer.id() == renderbuffer)
954 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400955 setRenderbufferBinding(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400956 }
957
958 // [OpenGL ES 2.0.24] section 4.4 page 111:
959 // If a renderbuffer object is deleted while its image is attached to the currently bound framebuffer,
960 // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
961 // point to which this image was attached in the currently bound framebuffer.
962
963 Framebuffer *readFramebuffer = mReadFramebuffer;
964 Framebuffer *drawFramebuffer = mDrawFramebuffer;
965
Jamie Madill8693bdb2017-09-02 15:32:14 -0400966 if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
Shannon Woods53a94a82014-06-24 15:20:36 -0400967 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400968 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -0400969 }
970
971 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
972 {
Jamie Madill8693bdb2017-09-02 15:32:14 -0400973 if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
974 {
975 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
976 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400977 }
978
979}
980
981void State::setReadFramebufferBinding(Framebuffer *framebuffer)
982{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500983 if (mReadFramebuffer == framebuffer)
984 return;
985
Shannon Woods53a94a82014-06-24 15:20:36 -0400986 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500987 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
988
989 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
990 {
991 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
992 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400993}
994
995void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
996{
Jamie Madill60ec6ea2016-01-22 15:27:19 -0500997 if (mDrawFramebuffer == framebuffer)
998 return;
999
Shannon Woods53a94a82014-06-24 15:20:36 -04001000 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001001 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1002
1003 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
1004 {
1005 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1006 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001007}
1008
1009Framebuffer *State::getTargetFramebuffer(GLenum target) const
1010{
1011 switch (target)
1012 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001013 case GL_READ_FRAMEBUFFER_ANGLE:
1014 return mReadFramebuffer;
1015 case GL_DRAW_FRAMEBUFFER_ANGLE:
1016 case GL_FRAMEBUFFER:
1017 return mDrawFramebuffer;
1018 default:
1019 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001020 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001021 }
1022}
1023
Jamie Madill51f40ec2016-06-15 14:06:00 -04001024Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001025{
1026 return mReadFramebuffer;
1027}
1028
Jamie Madill51f40ec2016-06-15 14:06:00 -04001029Framebuffer *State::getDrawFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001030{
1031 return mDrawFramebuffer;
1032}
1033
1034bool State::removeReadFramebufferBinding(GLuint framebuffer)
1035{
Jamie Madill77a72f62015-04-14 11:18:32 -04001036 if (mReadFramebuffer != nullptr &&
1037 mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001038 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001039 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001040 return true;
1041 }
1042
1043 return false;
1044}
1045
1046bool State::removeDrawFramebufferBinding(GLuint framebuffer)
1047{
Jamie Madill77a72f62015-04-14 11:18:32 -04001048 if (mReadFramebuffer != nullptr &&
1049 mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001050 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001051 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001052 return true;
1053 }
1054
1055 return false;
1056}
1057
1058void State::setVertexArrayBinding(VertexArray *vertexArray)
1059{
1060 mVertexArray = vertexArray;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001061 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001062
1063 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1064 {
1065 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1066 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001067}
1068
1069GLuint State::getVertexArrayId() const
1070{
Yunchao He4f285442017-04-21 12:15:49 +08001071 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001072 return mVertexArray->id();
1073}
1074
1075VertexArray *State::getVertexArray() const
1076{
Yunchao He4f285442017-04-21 12:15:49 +08001077 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001078 return mVertexArray;
1079}
1080
1081bool State::removeVertexArrayBinding(GLuint vertexArray)
1082{
1083 if (mVertexArray->id() == vertexArray)
1084 {
Yunchao Hed7297bf2017-04-19 15:27:10 +08001085 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001086 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001087 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001088 return true;
1089 }
1090
1091 return false;
1092}
1093
Jamie Madill4928b7c2017-06-20 12:57:39 -04001094void State::bindVertexBuffer(const Context *context,
1095 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001096 Buffer *boundBuffer,
1097 GLintptr offset,
1098 GLsizei stride)
1099{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001100 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001101 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1102}
1103
Shaodde78e82017-05-22 14:13:27 +08001104void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
Shao80957d92017-02-20 21:25:59 +08001105{
Shaodde78e82017-05-22 14:13:27 +08001106 getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08001107 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1108}
1109
1110void State::setVertexAttribFormat(GLuint attribIndex,
1111 GLint size,
1112 GLenum type,
1113 bool normalized,
1114 bool pureInteger,
1115 GLuint relativeOffset)
1116{
1117 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1118 relativeOffset);
1119 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1120}
1121
1122void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1123{
1124 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1125 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1126}
1127
Jamie Madill6c1f6712017-02-14 19:08:04 -05001128void State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001129{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001130 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001131 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001132 if (mProgram)
1133 {
Jamie Madill6c1f6712017-02-14 19:08:04 -05001134 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001135 }
1136
1137 mProgram = newProgram;
1138
1139 if (mProgram)
1140 {
1141 newProgram->addRef();
Jamie Madill81c2e252017-09-09 23:32:46 -04001142 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001143 }
Jamie Madilla779b612017-07-24 11:46:05 -04001144 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
1145 mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001146 }
1147}
1148
Geoff Lang7dd2e102014-11-10 15:19:26 -05001149Program *State::getProgram() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001150{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001151 return mProgram;
Shannon Woods53a94a82014-06-24 15:20:36 -04001152}
1153
Jamie Madill4928b7c2017-06-20 12:57:39 -04001154void State::setTransformFeedbackBinding(const Context *context,
1155 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001156{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001157 mTransformFeedback.set(context, transformFeedback);
Geoff Langded79232017-11-28 15:21:11 -05001158 mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001159}
1160
1161TransformFeedback *State::getCurrentTransformFeedback() const
1162{
1163 return mTransformFeedback.get();
1164}
1165
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001166bool State::isTransformFeedbackActiveUnpaused() const
1167{
Jamie Madill81c2e252017-09-09 23:32:46 -04001168 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001169 return curTransformFeedback && curTransformFeedback->isActive() && !curTransformFeedback->isPaused();
Gregoire Payen de La Garanderie52742022015-02-04 14:55:39 +00001170}
1171
Jamie Madill4928b7c2017-06-20 12:57:39 -04001172bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001173{
1174 if (mTransformFeedback.id() == transformFeedback)
1175 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001176 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001177 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001178 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001179
1180 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001181}
1182
Yunchao Hea336b902017-08-02 16:05:21 +08001183void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
1184{
1185 mProgramPipeline.set(context, pipeline);
1186}
1187
1188void State::detachProgramPipeline(const Context *context, GLuint pipeline)
1189{
1190 mProgramPipeline.set(context, nullptr);
1191}
1192
Olli Etuahobbf1c102016-06-28 13:31:33 +03001193bool State::isQueryActive(const GLenum type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001194{
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001195 for (auto &iter : mActiveQueries)
Shannon Woods53a94a82014-06-24 15:20:36 -04001196 {
Olli Etuahobbf1c102016-06-28 13:31:33 +03001197 const Query *query = iter.second.get();
1198 if (query != nullptr && ActiveQueryType(query->getType()) == ActiveQueryType(type))
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001199 {
1200 return true;
1201 }
1202 }
1203
1204 return false;
1205}
1206
1207bool State::isQueryActive(Query *query) const
1208{
1209 for (auto &iter : mActiveQueries)
1210 {
1211 if (iter.second.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001212 {
1213 return true;
1214 }
1215 }
1216
1217 return false;
1218}
1219
Jamie Madill4928b7c2017-06-20 12:57:39 -04001220void State::setActiveQuery(const Context *context, GLenum target, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001221{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001222 mActiveQueries[target].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001223}
1224
1225GLuint State::getActiveQueryId(GLenum target) const
1226{
1227 const Query *query = getActiveQuery(target);
1228 return (query ? query->id() : 0u);
1229}
1230
1231Query *State::getActiveQuery(GLenum target) const
1232{
Jamie Madill5864ac22015-01-12 14:43:07 -05001233 const auto it = mActiveQueries.find(target);
Shannon Woods53a94a82014-06-24 15:20:36 -04001234
Jamie Madill5864ac22015-01-12 14:43:07 -05001235 // All query types should already exist in the activeQueries map
1236 ASSERT(it != mActiveQueries.end());
1237
1238 return it->second.get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001239}
1240
Corentin Wallez336129f2017-10-17 15:55:40 -04001241void State::setBufferBinding(const Context *context, BufferBinding target, Buffer *buffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001242{
Corentin Wallez336129f2017-10-17 15:55:40 -04001243 switch (target)
1244 {
1245 case BufferBinding::PixelPack:
Corentin Wallezd5d30992017-11-13 10:21:52 -08001246 mBoundBuffers[target].set(context, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001247 mDirtyBits.set(DIRTY_BIT_PACK_BUFFER_BINDING);
1248 break;
1249 case BufferBinding::PixelUnpack:
Corentin Wallezd5d30992017-11-13 10:21:52 -08001250 mBoundBuffers[target].set(context, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001251 mDirtyBits.set(DIRTY_BIT_UNPACK_BUFFER_BINDING);
1252 break;
1253 case BufferBinding::DrawIndirect:
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_DRAW_INDIRECT_BUFFER_BINDING);
1256 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08001257 case BufferBinding::DispatchIndirect:
1258 mBoundBuffers[target].set(context, buffer);
1259 mDirtyBits.set(DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING);
1260 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001261 case BufferBinding::TransformFeedback:
1262 if (mTransformFeedback.get() != nullptr)
1263 {
1264 mTransformFeedback->bindGenericBuffer(context, buffer);
1265 }
1266 break;
1267 case BufferBinding::ElementArray:
1268 getVertexArray()->setElementArrayBuffer(context, buffer);
1269 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1270 break;
Xinghua Cao10a4d432017-11-28 14:46:26 +08001271 case BufferBinding::ShaderStorage:
1272 mBoundBuffers[target].set(context, buffer);
1273 mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
1274 break;
Corentin Wallez336129f2017-10-17 15:55:40 -04001275 default:
Corentin Wallezd5d30992017-11-13 10:21:52 -08001276 mBoundBuffers[target].set(context, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001277 break;
1278 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001279}
Corentin Wallez336129f2017-10-17 15:55:40 -04001280void State::setIndexedBufferBinding(const Context *context,
1281 BufferBinding target,
1282 GLuint index,
1283 Buffer *buffer,
1284 GLintptr offset,
1285 GLsizeiptr size)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001286{
Corentin Wallez336129f2017-10-17 15:55:40 -04001287 setBufferBinding(context, target, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001288
Corentin Wallez336129f2017-10-17 15:55:40 -04001289 switch (target)
1290 {
1291 case BufferBinding::TransformFeedback:
1292 mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
1293 break;
1294 case BufferBinding::Uniform:
1295 mUniformBuffers[index].set(context, buffer, offset, size);
Jamie Madillf4141212017-12-12 15:08:07 -05001296 mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
Corentin Wallez336129f2017-10-17 15:55:40 -04001297 break;
1298 case BufferBinding::AtomicCounter:
1299 mAtomicCounterBuffers[index].set(context, buffer, offset, size);
1300 break;
1301 case BufferBinding::ShaderStorage:
1302 mShaderStorageBuffers[index].set(context, buffer, offset, size);
1303 break;
1304 default:
1305 UNREACHABLE();
1306 break;
1307 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001308}
1309
Geoff Lang5d124a62015-09-15 13:03:27 -04001310const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001311{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001312 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001313 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001314}
1315
Jiajia Qin6eafb042016-12-27 17:04:07 +08001316const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1317{
1318 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1319 return mAtomicCounterBuffers[index];
1320}
1321
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001322const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1323{
1324 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1325 return mShaderStorageBuffers[index];
1326}
1327
Corentin Wallez336129f2017-10-17 15:55:40 -04001328Buffer *State::getTargetBuffer(BufferBinding target) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001329{
1330 switch (target)
1331 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001332 case BufferBinding::ElementArray:
1333 return getVertexArray()->getElementArrayBuffer().get();
1334 case BufferBinding::TransformFeedback:
1335 return mTransformFeedback->getGenericBuffer().get();
1336 default:
1337 return mBoundBuffers[target].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001338 }
1339}
1340
Jamie Madill4928b7c2017-06-20 12:57:39 -04001341void State::detachBuffer(const Context *context, GLuint bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001342{
Corentin Wallez336129f2017-10-17 15:55:40 -04001343 for (auto &buffer : mBoundBuffers)
Yuly Novikov5807a532015-12-03 13:01:22 -05001344 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001345 if (buffer.id() == bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001346 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001347 buffer.set(context, nullptr);
Yuly Novikov5807a532015-12-03 13:01:22 -05001348 }
1349 }
1350
1351 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1352 if (curTransformFeedback)
1353 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001354 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001355 }
1356
Jamie Madill4928b7c2017-06-20 12:57:39 -04001357 getVertexArray()->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001358}
1359
Shannon Woods53a94a82014-06-24 15:20:36 -04001360void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1361{
1362 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001363 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001364}
1365
1366void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1367{
Shannon Woods23e05002014-09-22 19:07:27 -04001368 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001369 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001370 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1371 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001372 mCurrentValuesTypeMask.setIndex(GL_FLOAT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001373}
1374
1375void State::setVertexAttribu(GLuint index, const GLuint values[4])
1376{
Shannon Woods23e05002014-09-22 19:07:27 -04001377 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001378 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001379 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1380 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001381 mCurrentValuesTypeMask.setIndex(GL_UNSIGNED_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001382}
1383
1384void State::setVertexAttribi(GLuint index, const GLint values[4])
1385{
Shannon Woods23e05002014-09-22 19:07:27 -04001386 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001387 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001388 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1389 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001390 mCurrentValuesTypeMask.setIndex(GL_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001391}
1392
Shaodde78e82017-05-22 14:13:27 +08001393void State::setVertexAttribPointer(const Context *context,
1394 unsigned int attribNum,
1395 Buffer *boundBuffer,
1396 GLint size,
1397 GLenum type,
1398 bool normalized,
1399 bool pureInteger,
1400 GLsizei stride,
1401 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001402{
Shaodde78e82017-05-22 14:13:27 +08001403 getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1404 normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001405 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001406}
1407
Shaodde78e82017-05-22 14:13:27 +08001408void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
Jamie Madill0b9e9032015-08-17 11:51:52 +00001409{
Shaodde78e82017-05-22 14:13:27 +08001410 getVertexArray()->setVertexAttribDivisor(context, index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001411 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001412}
1413
Jamie Madill6de51852017-04-12 09:53:01 -04001414const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001415{
Jamie Madill6de51852017-04-12 09:53:01 -04001416 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001417 return mVertexAttribCurrentValues[attribNum];
1418}
1419
Jamie Madillcac94a92017-11-10 10:09:32 -05001420const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
1421{
1422 return mVertexAttribCurrentValues;
1423}
1424
Shannon Woods53a94a82014-06-24 15:20:36 -04001425const void *State::getVertexAttribPointer(unsigned int attribNum) const
1426{
1427 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1428}
1429
1430void State::setPackAlignment(GLint alignment)
1431{
1432 mPack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001433 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001434}
1435
1436GLint State::getPackAlignment() const
1437{
1438 return mPack.alignment;
1439}
1440
1441void State::setPackReverseRowOrder(bool reverseRowOrder)
1442{
1443 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madillc67323a2017-11-02 23:11:41 -04001444 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001445}
1446
1447bool State::getPackReverseRowOrder() const
1448{
1449 return mPack.reverseRowOrder;
1450}
1451
Minmin Gongadff67b2015-10-14 10:34:45 -04001452void State::setPackRowLength(GLint rowLength)
1453{
1454 mPack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001455 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001456}
1457
1458GLint State::getPackRowLength() const
1459{
1460 return mPack.rowLength;
1461}
1462
1463void State::setPackSkipRows(GLint skipRows)
1464{
1465 mPack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001466 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001467}
1468
1469GLint State::getPackSkipRows() const
1470{
1471 return mPack.skipRows;
1472}
1473
1474void State::setPackSkipPixels(GLint skipPixels)
1475{
1476 mPack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001477 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001478}
1479
1480GLint State::getPackSkipPixels() const
1481{
1482 return mPack.skipPixels;
1483}
1484
Shannon Woods53a94a82014-06-24 15:20:36 -04001485const PixelPackState &State::getPackState() const
1486{
1487 return mPack;
1488}
1489
Jamie Madill87de3622015-03-16 10:41:44 -04001490PixelPackState &State::getPackState()
1491{
1492 return mPack;
1493}
1494
Shannon Woods53a94a82014-06-24 15:20:36 -04001495void State::setUnpackAlignment(GLint alignment)
1496{
1497 mUnpack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001498 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001499}
1500
1501GLint State::getUnpackAlignment() const
1502{
1503 return mUnpack.alignment;
1504}
1505
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001506void State::setUnpackRowLength(GLint rowLength)
1507{
1508 mUnpack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001509 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001510}
1511
1512GLint State::getUnpackRowLength() const
1513{
1514 return mUnpack.rowLength;
1515}
1516
Minmin Gongadff67b2015-10-14 10:34:45 -04001517void State::setUnpackImageHeight(GLint imageHeight)
1518{
1519 mUnpack.imageHeight = imageHeight;
Jamie Madillc67323a2017-11-02 23:11:41 -04001520 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001521}
1522
1523GLint State::getUnpackImageHeight() const
1524{
1525 return mUnpack.imageHeight;
1526}
1527
1528void State::setUnpackSkipImages(GLint skipImages)
1529{
1530 mUnpack.skipImages = skipImages;
Jamie Madillc67323a2017-11-02 23:11:41 -04001531 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001532}
1533
1534GLint State::getUnpackSkipImages() const
1535{
1536 return mUnpack.skipImages;
1537}
1538
1539void State::setUnpackSkipRows(GLint skipRows)
1540{
1541 mUnpack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001542 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001543}
1544
1545GLint State::getUnpackSkipRows() const
1546{
1547 return mUnpack.skipRows;
1548}
1549
1550void State::setUnpackSkipPixels(GLint skipPixels)
1551{
1552 mUnpack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001553 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001554}
1555
1556GLint State::getUnpackSkipPixels() const
1557{
1558 return mUnpack.skipPixels;
1559}
1560
Shannon Woods53a94a82014-06-24 15:20:36 -04001561const PixelUnpackState &State::getUnpackState() const
1562{
1563 return mUnpack;
1564}
1565
Jamie Madill67102f02015-03-16 10:41:42 -04001566PixelUnpackState &State::getUnpackState()
1567{
1568 return mUnpack;
1569}
1570
Geoff Lang70d0f492015-12-10 17:45:46 -05001571const Debug &State::getDebug() const
1572{
1573 return mDebug;
1574}
1575
1576Debug &State::getDebug()
1577{
1578 return mDebug;
1579}
1580
Sami Väisänena797e062016-05-12 15:23:40 +03001581void State::setCoverageModulation(GLenum components)
1582{
1583 mCoverageModulation = components;
1584 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1585}
1586
1587GLenum State::getCoverageModulation() const
1588{
1589 return mCoverageModulation;
1590}
1591
Sami Väisänene45e53b2016-05-25 10:36:04 +03001592void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1593{
1594 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1595 {
1596 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
1597 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_MV);
1598 }
1599 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1600 {
1601 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
1602 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_MATRIX_PROJ);
1603 }
1604 else
1605 {
1606 UNREACHABLE();
1607 }
1608}
1609
1610const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1611{
1612 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1613 {
1614 return mPathMatrixMV;
1615 }
1616 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1617 {
1618 return mPathMatrixProj;
1619 }
1620
1621 UNREACHABLE();
1622 return nullptr;
1623}
1624
1625void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1626{
1627 mPathStencilFunc = func;
1628 mPathStencilRef = ref;
1629 mPathStencilMask = mask;
1630 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING_STENCIL_STATE);
1631}
1632
1633GLenum State::getPathStencilFunc() const
1634{
1635 return mPathStencilFunc;
1636}
1637
1638GLint State::getPathStencilRef() const
1639{
1640 return mPathStencilRef;
1641}
1642
1643GLuint State::getPathStencilMask() const
1644{
1645 return mPathStencilMask;
1646}
1647
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001648void State::setFramebufferSRGB(bool sRGB)
1649{
1650 mFramebufferSRGB = sRGB;
1651 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1652}
1653
1654bool State::getFramebufferSRGB() const
1655{
1656 return mFramebufferSRGB;
1657}
1658
Shannon Woods53a94a82014-06-24 15:20:36 -04001659void State::getBooleanv(GLenum pname, GLboolean *params)
1660{
1661 switch (pname)
1662 {
1663 case GL_SAMPLE_COVERAGE_INVERT: *params = mSampleCoverageInvert; break;
1664 case GL_DEPTH_WRITEMASK: *params = mDepthStencil.depthMask; break;
1665 case GL_COLOR_WRITEMASK:
1666 params[0] = mBlend.colorMaskRed;
1667 params[1] = mBlend.colorMaskGreen;
1668 params[2] = mBlend.colorMaskBlue;
1669 params[3] = mBlend.colorMaskAlpha;
1670 break;
Corentin Wallez2e568cf2017-09-18 17:05:22 -04001671 case GL_CULL_FACE:
1672 *params = mRasterizer.cullFace;
1673 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001674 case GL_POLYGON_OFFSET_FILL: *params = mRasterizer.polygonOffsetFill; break;
1675 case GL_SAMPLE_ALPHA_TO_COVERAGE: *params = mBlend.sampleAlphaToCoverage; break;
1676 case GL_SAMPLE_COVERAGE: *params = mSampleCoverage; break;
Jiawei Shaodb342272017-09-27 10:21:45 +08001677 case GL_SAMPLE_MASK:
1678 *params = mSampleMask;
1679 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001680 case GL_SCISSOR_TEST: *params = mScissorTest; break;
1681 case GL_STENCIL_TEST: *params = mDepthStencil.stencilTest; break;
1682 case GL_DEPTH_TEST: *params = mDepthStencil.depthTest; break;
1683 case GL_BLEND: *params = mBlend.blend; break;
1684 case GL_DITHER: *params = mBlend.dither; break;
Geoff Langbb0a0bb2015-03-27 12:16:57 -04001685 case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE; break;
1686 case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE; break;
Jamie Madille2cd53d2015-10-27 11:15:46 -04001687 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1688 *params = mPrimitiveRestart;
1689 break;
Geoff Langab831f02015-12-01 09:39:10 -05001690 case GL_RASTERIZER_DISCARD:
1691 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1692 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05001693 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1694 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1695 break;
1696 case GL_DEBUG_OUTPUT:
1697 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1698 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001699 case GL_MULTISAMPLE_EXT:
1700 *params = mMultiSampling;
1701 break;
1702 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1703 *params = mSampleAlphaToOne;
1704 break;
Geoff Langf41a7152016-09-19 15:11:17 -04001705 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1706 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1707 break;
Geoff Langfeb8c682017-02-13 16:07:35 -05001708 case GL_CLIENT_ARRAYS_ANGLE:
1709 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1710 break;
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001711 case GL_FRAMEBUFFER_SRGB_EXT:
1712 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1713 break;
Geoff Langb433e872017-10-05 14:01:47 -04001714 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madille08a1d32017-03-07 17:24:06 -05001715 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1716 break;
Jamie Madillc43be722017-07-13 16:22:14 -04001717 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1718 *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
1719 break;
1720
Shannon Woods53a94a82014-06-24 15:20:36 -04001721 default:
1722 UNREACHABLE();
1723 break;
1724 }
1725}
1726
1727void State::getFloatv(GLenum pname, GLfloat *params)
1728{
1729 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
1730 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1731 // GetIntegerv as its native query function. As it would require conversion in any
1732 // case, this should make no difference to the calling application.
1733 switch (pname)
1734 {
1735 case GL_LINE_WIDTH: *params = mLineWidth; break;
1736 case GL_SAMPLE_COVERAGE_VALUE: *params = mSampleCoverageValue; break;
1737 case GL_DEPTH_CLEAR_VALUE: *params = mDepthClearValue; break;
1738 case GL_POLYGON_OFFSET_FACTOR: *params = mRasterizer.polygonOffsetFactor; break;
1739 case GL_POLYGON_OFFSET_UNITS: *params = mRasterizer.polygonOffsetUnits; break;
1740 case GL_DEPTH_RANGE:
1741 params[0] = mNearZ;
1742 params[1] = mFarZ;
1743 break;
1744 case GL_COLOR_CLEAR_VALUE:
1745 params[0] = mColorClearValue.red;
1746 params[1] = mColorClearValue.green;
1747 params[2] = mColorClearValue.blue;
1748 params[3] = mColorClearValue.alpha;
1749 break;
1750 case GL_BLEND_COLOR:
1751 params[0] = mBlendColor.red;
1752 params[1] = mBlendColor.green;
1753 params[2] = mBlendColor.blue;
1754 params[3] = mBlendColor.alpha;
1755 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03001756 case GL_MULTISAMPLE_EXT:
1757 *params = static_cast<GLfloat>(mMultiSampling);
1758 break;
1759 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1760 *params = static_cast<GLfloat>(mSampleAlphaToOne);
Nico Weber41b072b2018-02-09 10:01:32 -05001761 break;
Sami Väisänena797e062016-05-12 15:23:40 +03001762 case GL_COVERAGE_MODULATION_CHROMIUM:
Nico Weber41b072b2018-02-09 10:01:32 -05001763 params[0] = static_cast<GLfloat>(mCoverageModulation);
1764 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001765 default:
1766 UNREACHABLE();
1767 break;
1768 }
1769}
1770
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001771void State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04001772{
1773 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
1774 {
1775 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04001776 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04001777 Framebuffer *framebuffer = mDrawFramebuffer;
1778 *params = framebuffer->getDrawBufferState(colorAttachment);
1779 return;
1780 }
1781
1782 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1783 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1784 // GetIntegerv as its native query function. As it would require conversion in any
1785 // case, this should make no difference to the calling application. You may find it in
1786 // State::getFloatv.
1787 switch (pname)
1788 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001789 case GL_ARRAY_BUFFER_BINDING:
1790 *params = mBoundBuffers[BufferBinding::Array].id();
1791 break;
1792 case GL_DRAW_INDIRECT_BUFFER_BINDING:
1793 *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
1794 break;
1795 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
1796 *params = getVertexArray()->getElementArrayBuffer().id();
1797 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001798 //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
1799 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mDrawFramebuffer->id(); break;
1800 case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mReadFramebuffer->id(); break;
1801 case GL_RENDERBUFFER_BINDING: *params = mRenderbuffer.id(); break;
1802 case GL_VERTEX_ARRAY_BINDING: *params = mVertexArray->id(); break;
Geoff Lang7dd2e102014-11-10 15:19:26 -05001803 case GL_CURRENT_PROGRAM: *params = mProgram ? mProgram->id() : 0; break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001804 case GL_PACK_ALIGNMENT: *params = mPack.alignment; break;
1805 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: *params = mPack.reverseRowOrder; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001806 case GL_PACK_ROW_LENGTH:
1807 *params = mPack.rowLength;
1808 break;
1809 case GL_PACK_SKIP_ROWS:
1810 *params = mPack.skipRows;
1811 break;
1812 case GL_PACK_SKIP_PIXELS:
1813 *params = mPack.skipPixels;
1814 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001815 case GL_UNPACK_ALIGNMENT: *params = mUnpack.alignment; break;
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001816 case GL_UNPACK_ROW_LENGTH: *params = mUnpack.rowLength; break;
Minmin Gongadff67b2015-10-14 10:34:45 -04001817 case GL_UNPACK_IMAGE_HEIGHT:
1818 *params = mUnpack.imageHeight;
1819 break;
1820 case GL_UNPACK_SKIP_IMAGES:
1821 *params = mUnpack.skipImages;
1822 break;
1823 case GL_UNPACK_SKIP_ROWS:
1824 *params = mUnpack.skipRows;
1825 break;
1826 case GL_UNPACK_SKIP_PIXELS:
1827 *params = mUnpack.skipPixels;
1828 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001829 case GL_GENERATE_MIPMAP_HINT: *params = mGenerateMipmapHint; break;
1830 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mFragmentShaderDerivativeHint; break;
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001831 case GL_ACTIVE_TEXTURE:
1832 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
1833 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001834 case GL_STENCIL_FUNC: *params = mDepthStencil.stencilFunc; break;
1835 case GL_STENCIL_REF: *params = mStencilRef; break;
jchen10a99ed552017-09-22 08:10:32 +08001836 case GL_STENCIL_VALUE_MASK:
1837 *params = CastMaskValue(context, mDepthStencil.stencilMask);
1838 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001839 case GL_STENCIL_BACK_FUNC: *params = mDepthStencil.stencilBackFunc; break;
1840 case GL_STENCIL_BACK_REF: *params = mStencilBackRef; break;
jchen10a99ed552017-09-22 08:10:32 +08001841 case GL_STENCIL_BACK_VALUE_MASK:
1842 *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
1843 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001844 case GL_STENCIL_FAIL: *params = mDepthStencil.stencilFail; break;
1845 case GL_STENCIL_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilPassDepthFail; break;
1846 case GL_STENCIL_PASS_DEPTH_PASS: *params = mDepthStencil.stencilPassDepthPass; break;
1847 case GL_STENCIL_BACK_FAIL: *params = mDepthStencil.stencilBackFail; break;
1848 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: *params = mDepthStencil.stencilBackPassDepthFail; break;
1849 case GL_STENCIL_BACK_PASS_DEPTH_PASS: *params = mDepthStencil.stencilBackPassDepthPass; break;
1850 case GL_DEPTH_FUNC: *params = mDepthStencil.depthFunc; break;
1851 case GL_BLEND_SRC_RGB: *params = mBlend.sourceBlendRGB; break;
1852 case GL_BLEND_SRC_ALPHA: *params = mBlend.sourceBlendAlpha; break;
1853 case GL_BLEND_DST_RGB: *params = mBlend.destBlendRGB; break;
1854 case GL_BLEND_DST_ALPHA: *params = mBlend.destBlendAlpha; break;
1855 case GL_BLEND_EQUATION_RGB: *params = mBlend.blendEquationRGB; break;
1856 case GL_BLEND_EQUATION_ALPHA: *params = mBlend.blendEquationAlpha; break;
jchen10a99ed552017-09-22 08:10:32 +08001857 case GL_STENCIL_WRITEMASK:
1858 *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
1859 break;
1860 case GL_STENCIL_BACK_WRITEMASK:
1861 *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
1862 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001863 case GL_STENCIL_CLEAR_VALUE: *params = mStencilClearValue; break;
Jamie Madill4928b7c2017-06-20 12:57:39 -04001864 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
1865 *params = mReadFramebuffer->getImplementationColorReadType(context);
1866 break;
1867 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
1868 *params = mReadFramebuffer->getImplementationColorReadFormat(context);
1869 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001870 case GL_SAMPLE_BUFFERS:
1871 case GL_SAMPLES:
1872 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001873 Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madilldd43e6c2017-03-24 14:18:49 -04001874 if (framebuffer->checkStatus(context) == GL_FRAMEBUFFER_COMPLETE)
Shannon Woods53a94a82014-06-24 15:20:36 -04001875 {
1876 switch (pname)
1877 {
Jamie Madilla0016b72017-07-14 14:30:46 -04001878 case GL_SAMPLE_BUFFERS:
1879 if (framebuffer->getSamples(context) != 0)
1880 {
1881 *params = 1;
1882 }
1883 else
1884 {
1885 *params = 0;
1886 }
1887 break;
1888 case GL_SAMPLES:
1889 *params = framebuffer->getSamples(context);
1890 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001891 }
1892 }
1893 else
1894 {
1895 *params = 0;
1896 }
1897 }
1898 break;
1899 case GL_VIEWPORT:
1900 params[0] = mViewport.x;
1901 params[1] = mViewport.y;
1902 params[2] = mViewport.width;
1903 params[3] = mViewport.height;
1904 break;
1905 case GL_SCISSOR_BOX:
1906 params[0] = mScissor.x;
1907 params[1] = mScissor.y;
1908 params[2] = mScissor.width;
1909 params[3] = mScissor.height;
1910 break;
Corentin Wallez2e568cf2017-09-18 17:05:22 -04001911 case GL_CULL_FACE_MODE:
1912 *params = ToGLenum(mRasterizer.cullMode);
1913 break;
1914 case GL_FRONT_FACE:
1915 *params = mRasterizer.frontFace;
1916 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001917 case GL_RED_BITS:
1918 case GL_GREEN_BITS:
1919 case GL_BLUE_BITS:
1920 case GL_ALPHA_BITS:
1921 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001922 Framebuffer *framebuffer = getDrawFramebuffer();
1923 const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001924
1925 if (colorbuffer)
1926 {
1927 switch (pname)
1928 {
1929 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1930 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1931 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1932 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1933 }
1934 }
1935 else
1936 {
1937 *params = 0;
1938 }
1939 }
1940 break;
1941 case GL_DEPTH_BITS:
1942 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001943 const Framebuffer *framebuffer = getDrawFramebuffer();
1944 const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001945
1946 if (depthbuffer)
1947 {
1948 *params = depthbuffer->getDepthSize();
1949 }
1950 else
1951 {
1952 *params = 0;
1953 }
1954 }
1955 break;
1956 case GL_STENCIL_BITS:
1957 {
Jamie Madill81c2e252017-09-09 23:32:46 -04001958 const Framebuffer *framebuffer = getDrawFramebuffer();
1959 const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04001960
1961 if (stencilbuffer)
1962 {
1963 *params = stencilbuffer->getStencilSize();
1964 }
1965 else
1966 {
1967 *params = 0;
1968 }
1969 }
1970 break;
1971 case GL_TEXTURE_BINDING_2D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001972 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001973 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001974 break;
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001975 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
1976 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1977 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001978 TextureType::Rectangle);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001979 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04001980 case GL_TEXTURE_BINDING_CUBE_MAP:
Shannon Woods2df6a602014-09-26 16:12:07 -04001981 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001982 *params =
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001983 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::CubeMap);
Shannon Woods53a94a82014-06-24 15:20:36 -04001984 break;
1985 case GL_TEXTURE_BINDING_3D:
Shannon Woods2df6a602014-09-26 16:12:07 -04001986 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001987 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_3D);
Shannon Woods53a94a82014-06-24 15:20:36 -04001988 break;
1989 case GL_TEXTURE_BINDING_2D_ARRAY:
Shannon Woods2df6a602014-09-26 16:12:07 -04001990 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001991 *params =
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001992 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2DArray);
Shannon Woods53a94a82014-06-24 15:20:36 -04001993 break;
JiangYizhou24fe74c2017-07-06 16:56:50 +08001994 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
1995 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
1996 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001997 TextureType::_2DMultisample);
JiangYizhou24fe74c2017-07-06 16:56:50 +08001998 break;
John Bauman18319182016-09-28 14:22:27 -07001999 case GL_TEXTURE_BINDING_EXTERNAL_OES:
2000 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002001 *params =
2002 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::External);
John Bauman18319182016-09-28 14:22:27 -07002003 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002004 case GL_UNIFORM_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002005 *params = mBoundBuffers[BufferBinding::Uniform].id();
2006 break;
Frank Henigman22581ff2015-11-06 14:25:54 -05002007 case GL_TRANSFORM_FEEDBACK_BINDING:
Frank Henigmanb0f0b812015-11-21 17:49:29 -05002008 *params = mTransformFeedback.id();
Frank Henigman22581ff2015-11-06 14:25:54 -05002009 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002010 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002011 ASSERT(mTransformFeedback.get() != nullptr);
2012 *params = mTransformFeedback->getGenericBuffer().id();
2013 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002014 case GL_COPY_READ_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002015 *params = mBoundBuffers[BufferBinding::CopyRead].id();
2016 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002017 case GL_COPY_WRITE_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002018 *params = mBoundBuffers[BufferBinding::CopyWrite].id();
2019 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002020 case GL_PIXEL_PACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002021 *params = mBoundBuffers[BufferBinding::PixelPack].id();
Corentin Wallezcda6af12017-10-30 19:20:37 -04002022 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002023 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002024 *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
Corentin Wallezcda6af12017-10-30 19:20:37 -04002025 break;
Olli Etuaho86821db2016-03-04 12:05:47 +02002026 case GL_READ_BUFFER:
2027 *params = mReadFramebuffer->getReadBufferState();
2028 break;
2029 case GL_SAMPLER_BINDING:
2030 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2031 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
2032 break;
Geoff Lang70d0f492015-12-10 17:45:46 -05002033 case GL_DEBUG_LOGGED_MESSAGES:
2034 *params = static_cast<GLint>(mDebug.getMessageCount());
2035 break;
2036 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
2037 *params = static_cast<GLint>(mDebug.getNextMessageLength());
2038 break;
2039 case GL_DEBUG_GROUP_STACK_DEPTH:
2040 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
2041 break;
Sami Väisänen74c23472016-05-09 17:30:30 +03002042 case GL_MULTISAMPLE_EXT:
2043 *params = static_cast<GLint>(mMultiSampling);
2044 break;
2045 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2046 *params = static_cast<GLint>(mSampleAlphaToOne);
Nico Weber41b072b2018-02-09 10:01:32 -05002047 break;
Sami Väisänena797e062016-05-12 15:23:40 +03002048 case GL_COVERAGE_MODULATION_CHROMIUM:
2049 *params = static_cast<GLint>(mCoverageModulation);
Sami Väisänen74c23472016-05-09 17:30:30 +03002050 break;
Jiajia Qin6eafb042016-12-27 17:04:07 +08002051 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002052 *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
Jiajia Qin6eafb042016-12-27 17:04:07 +08002053 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002054 case GL_SHADER_STORAGE_BUFFER_BINDING:
Corentin Wallez336129f2017-10-17 15:55:40 -04002055 *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002056 break;
Qin Jiajiaa98a2812017-11-30 18:12:06 +08002057 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
2058 *params = mBoundBuffers[BufferBinding::DispatchIndirect].id();
2059 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002060 default:
2061 UNREACHABLE();
2062 break;
2063 }
2064}
2065
Geoff Lang70d0f492015-12-10 17:45:46 -05002066void State::getPointerv(GLenum pname, void **params) const
2067{
2068 switch (pname)
2069 {
2070 case GL_DEBUG_CALLBACK_FUNCTION:
2071 *params = reinterpret_cast<void *>(mDebug.getCallback());
2072 break;
2073 case GL_DEBUG_CALLBACK_USER_PARAM:
2074 *params = const_cast<void *>(mDebug.getUserParam());
2075 break;
2076 default:
2077 UNREACHABLE();
2078 break;
2079 }
2080}
2081
Martin Radev66fb8202016-07-28 11:45:20 +03002082void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002083{
2084 switch (target)
2085 {
2086 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002087 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2088 *data = mTransformFeedback->getIndexedBuffer(index).id();
2089 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002090 case GL_UNIFORM_BUFFER_BINDING:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002091 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2092 *data = mUniformBuffers[index].id();
2093 break;
2094 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2095 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2096 *data = mAtomicCounterBuffers[index].id();
2097 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002098 case GL_SHADER_STORAGE_BUFFER_BINDING:
2099 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2100 *data = mShaderStorageBuffers[index].id();
2101 break;
Shao80957d92017-02-20 21:25:59 +08002102 case GL_VERTEX_BINDING_BUFFER:
2103 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002104 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
Shao80957d92017-02-20 21:25:59 +08002105 break;
2106 case GL_VERTEX_BINDING_DIVISOR:
2107 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002108 *data = mVertexArray->getVertexBinding(index).getDivisor();
Shao80957d92017-02-20 21:25:59 +08002109 break;
2110 case GL_VERTEX_BINDING_OFFSET:
2111 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002112 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
Shao80957d92017-02-20 21:25:59 +08002113 break;
2114 case GL_VERTEX_BINDING_STRIDE:
2115 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
Martin Radevdd5f27e2017-06-07 10:17:09 +03002116 *data = mVertexArray->getVertexBinding(index).getStride();
Shao80957d92017-02-20 21:25:59 +08002117 break;
Jiawei Shaodb342272017-09-27 10:21:45 +08002118 case GL_SAMPLE_MASK_VALUE:
2119 ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2120 *data = mSampleMaskValues[index];
2121 break;
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002122 case GL_IMAGE_BINDING_NAME:
2123 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2124 *data = mImageUnits[index].texture.id();
2125 break;
2126 case GL_IMAGE_BINDING_LEVEL:
2127 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2128 *data = mImageUnits[index].level;
2129 break;
2130 case GL_IMAGE_BINDING_LAYER:
2131 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2132 *data = mImageUnits[index].layer;
2133 break;
2134 case GL_IMAGE_BINDING_ACCESS:
2135 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2136 *data = mImageUnits[index].access;
2137 break;
2138 case GL_IMAGE_BINDING_FORMAT:
2139 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2140 *data = mImageUnits[index].format;
2141 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002142 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002143 UNREACHABLE();
2144 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002145 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002146}
2147
Martin Radev66fb8202016-07-28 11:45:20 +03002148void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002149{
2150 switch (target)
2151 {
2152 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002153 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2154 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2155 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002156 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002157 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2158 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2159 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002160 case GL_UNIFORM_BUFFER_START:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002161 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2162 *data = mUniformBuffers[index].getOffset();
2163 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002164 case GL_UNIFORM_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +08002165 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2166 *data = mUniformBuffers[index].getSize();
2167 break;
2168 case GL_ATOMIC_COUNTER_BUFFER_START:
2169 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2170 *data = mAtomicCounterBuffers[index].getOffset();
2171 break;
2172 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2173 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2174 *data = mAtomicCounterBuffers[index].getSize();
2175 break;
Jiajia Qinf546e7d2017-03-27 14:12:59 +08002176 case GL_SHADER_STORAGE_BUFFER_START:
2177 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2178 *data = mShaderStorageBuffers[index].getOffset();
2179 break;
2180 case GL_SHADER_STORAGE_BUFFER_SIZE:
2181 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2182 *data = mShaderStorageBuffers[index].getSize();
2183 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002184 default:
Martin Radev66fb8202016-07-28 11:45:20 +03002185 UNREACHABLE();
2186 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002187 }
Martin Radev66fb8202016-07-28 11:45:20 +03002188}
Shannon Woods53a94a82014-06-24 15:20:36 -04002189
Martin Radev66fb8202016-07-28 11:45:20 +03002190void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2191{
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002192 switch (target)
2193 {
2194 case GL_IMAGE_BINDING_LAYERED:
2195 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2196 *data = mImageUnits[index].layered;
2197 break;
2198 default:
2199 UNREACHABLE();
2200 break;
2201 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002202}
2203
Corentin Wallez336129f2017-10-17 15:55:40 -04002204bool State::hasMappedBuffer(BufferBinding target) const
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002205{
Corentin Wallez336129f2017-10-17 15:55:40 -04002206 if (target == BufferBinding::Array)
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002207 {
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002208 const VertexArray *vao = getVertexArray();
Jamie Madilleea3a6e2015-04-15 10:02:48 -04002209 const auto &vertexAttribs = vao->getVertexAttributes();
Jiawei-Shao2597fb62016-12-09 16:38:02 +08002210 const auto &vertexBindings = vao->getVertexBindings();
Jamie Madilld078c682018-01-02 11:50:24 -05002211 for (size_t attribIndex : vao->getEnabledAttributesMask())
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002212 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002213 const VertexAttribute &vertexAttrib = vertexAttribs[attribIndex];
Martin Radevdd5f27e2017-06-07 10:17:09 +03002214 auto *boundBuffer = vertexBindings[vertexAttrib.bindingIndex].getBuffer().get();
Jamie Madilld9ba4f72014-08-04 10:47:59 -04002215 if (vertexAttrib.enabled && boundBuffer && boundBuffer->isMapped())
2216 {
2217 return true;
2218 }
2219 }
2220
2221 return false;
2222 }
2223 else
2224 {
2225 Buffer *buffer = getTargetBuffer(target);
2226 return (buffer && buffer->isMapped());
2227 }
2228}
2229
Jamie Madillbc918e72018-03-08 09:47:21 -05002230Error State::syncDirtyObjects(const Context *context)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002231{
2232 if (!mDirtyObjects.any())
Jamie Madillbc918e72018-03-08 09:47:21 -05002233 return NoError();
Jamie Madillc9d442d2016-01-20 11:17:24 -05002234
Jamie Madillbc918e72018-03-08 09:47:21 -05002235 return syncDirtyObjects(context, mDirtyObjects);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002236}
2237
Jamie Madillbc918e72018-03-08 09:47:21 -05002238Error State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002239{
Jamie Madill6de51852017-04-12 09:53:01 -04002240 for (auto dirtyObject : bitset)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002241 {
2242 switch (dirtyObject)
2243 {
2244 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002245 ASSERT(mReadFramebuffer);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002246 mReadFramebuffer->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002247 break;
2248 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002249 ASSERT(mDrawFramebuffer);
Jamie Madilldd43e6c2017-03-24 14:18:49 -04002250 mDrawFramebuffer->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002251 break;
2252 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002253 ASSERT(mVertexArray);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002254 mVertexArray->syncState(context);
Jamie Madillc9d442d2016-01-20 11:17:24 -05002255 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002256 case DIRTY_OBJECT_PROGRAM_TEXTURES:
2257 syncProgramTextures(context);
2258 break;
2259
Jamie Madillc9d442d2016-01-20 11:17:24 -05002260 default:
2261 UNREACHABLE();
2262 break;
2263 }
2264 }
2265
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002266 mDirtyObjects &= ~bitset;
Jamie Madillbc918e72018-03-08 09:47:21 -05002267 return NoError();
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002268}
2269
Jamie Madill81c2e252017-09-09 23:32:46 -04002270void State::syncProgramTextures(const Context *context)
2271{
Jamie Madill81c2e252017-09-09 23:32:46 -04002272 // TODO(jmadill): Fine-grained updates.
2273 if (!mProgram)
2274 {
2275 return;
2276 }
2277
2278 ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
2279 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2280
Jamie Madill0f80ed82017-09-19 00:24:56 -04002281 ActiveTextureMask newActiveTextures;
2282
Geoff Lange51ba632017-11-21 11:45:25 -05002283 // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
2284 // initialized.
2285 mCachedTexturesInitState = InitState::Initialized;
2286
Jamie Madill81c2e252017-09-09 23:32:46 -04002287 for (const SamplerBinding &samplerBinding : mProgram->getSamplerBindings())
2288 {
2289 if (samplerBinding.unreferenced)
2290 continue;
2291
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002292 TextureType textureType = samplerBinding.textureType;
Jamie Madill81c2e252017-09-09 23:32:46 -04002293 for (GLuint textureUnitIndex : samplerBinding.boundTextureUnits)
2294 {
2295 Texture *texture = getSamplerTexture(textureUnitIndex, textureType);
Jamie Madill06ef36b2017-09-09 23:32:46 -04002296 Sampler *sampler = getSampler(textureUnitIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002297 ASSERT(static_cast<size_t>(textureUnitIndex) < mCompleteTextureCache.size());
2298 ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
Jamie Madill81c2e252017-09-09 23:32:46 -04002299
Jamie Madill42975642017-10-12 12:31:51 -04002300 ASSERT(texture);
Jamie Madill81c2e252017-09-09 23:32:46 -04002301
Jamie Madill42975642017-10-12 12:31:51 -04002302 // Mark the texture binding bit as dirty if the texture completeness changes.
2303 // TODO(jmadill): Use specific dirty bit for completeness change.
2304 if (texture->isSamplerComplete(context, sampler) &&
2305 !mDrawFramebuffer->hasTextureAttachment(texture))
2306 {
2307 texture->syncState();
2308 mCompleteTextureCache[textureUnitIndex] = texture;
Jamie Madill81c2e252017-09-09 23:32:46 -04002309 }
Jamie Madill42975642017-10-12 12:31:51 -04002310 else
2311 {
2312 mCompleteTextureCache[textureUnitIndex] = nullptr;
2313 }
2314
2315 // Bind the texture unconditionally, to recieve completeness change notifications.
Jamie Madill888081d2018-02-27 00:24:46 -05002316 mCompleteTextureBindings[textureUnitIndex].bind(texture->getSubject());
Jamie Madilla59fc192017-11-02 12:57:58 -04002317 mActiveTexturesMask.set(textureUnitIndex);
Jamie Madill42975642017-10-12 12:31:51 -04002318 newActiveTextures.set(textureUnitIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -04002319
Jamie Madill06ef36b2017-09-09 23:32:46 -04002320 if (sampler != nullptr)
2321 {
2322 sampler->syncState(context);
2323 }
Geoff Lange51ba632017-11-21 11:45:25 -05002324
2325 if (texture->initState() == InitState::MayNeedInit)
2326 {
2327 mCachedTexturesInitState = InitState::MayNeedInit;
2328 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002329 }
2330 }
Jamie Madill0f80ed82017-09-19 00:24:56 -04002331
2332 // Unset now missing textures.
Jamie Madilla59fc192017-11-02 12:57:58 -04002333 ActiveTextureMask negativeMask = mActiveTexturesMask & ~newActiveTextures;
Jamie Madill0f80ed82017-09-19 00:24:56 -04002334 if (negativeMask.any())
2335 {
2336 for (auto textureIndex : negativeMask)
2337 {
2338 mCompleteTextureBindings[textureIndex].reset();
2339 mCompleteTextureCache[textureIndex] = nullptr;
Jamie Madilla59fc192017-11-02 12:57:58 -04002340 mActiveTexturesMask.reset(textureIndex);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002341 }
2342 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002343}
2344
Jamie Madillbc918e72018-03-08 09:47:21 -05002345Error State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002346{
2347 DirtyObjects localSet;
2348
2349 switch (target)
2350 {
2351 case GL_READ_FRAMEBUFFER:
2352 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2353 break;
2354 case GL_DRAW_FRAMEBUFFER:
2355 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2356 break;
2357 case GL_FRAMEBUFFER:
2358 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2359 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2360 break;
2361 case GL_VERTEX_ARRAY:
2362 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2363 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002364 case GL_TEXTURE:
2365 case GL_SAMPLER:
2366 case GL_PROGRAM:
2367 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2368 break;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002369 }
2370
Jamie Madillbc918e72018-03-08 09:47:21 -05002371 return syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002372}
2373
2374void State::setObjectDirty(GLenum target)
2375{
2376 switch (target)
2377 {
2378 case GL_READ_FRAMEBUFFER:
2379 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2380 break;
2381 case GL_DRAW_FRAMEBUFFER:
2382 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2383 break;
2384 case GL_FRAMEBUFFER:
2385 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2386 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2387 break;
2388 case GL_VERTEX_ARRAY:
2389 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2390 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002391 case GL_TEXTURE:
2392 case GL_SAMPLER:
Jamie Madill81c2e252017-09-09 23:32:46 -04002393 case GL_PROGRAM:
2394 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2395 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2396 break;
Jamie Madilla779b612017-07-24 11:46:05 -04002397 }
2398}
2399
Jamie Madill888081d2018-02-27 00:24:46 -05002400void State::setFramebufferDirty(const Framebuffer *framebuffer) const
2401{
2402 if (framebuffer == mReadFramebuffer)
2403 {
2404 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2405 }
2406 if (framebuffer == mDrawFramebuffer)
2407 {
2408 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2409 }
2410}
2411
Jamie Madilla779b612017-07-24 11:46:05 -04002412void State::onProgramExecutableChange(Program *program)
2413{
2414 // OpenGL Spec:
2415 // "If LinkProgram or ProgramBinary successfully re-links a program object
2416 // that was already in use as a result of a previous call to UseProgram, then the
2417 // generated executable code will be installed as part of the current rendering state."
2418 if (program->isLinked() && mProgram == program)
2419 {
2420 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
Jamie Madill81c2e252017-09-09 23:32:46 -04002421 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002422 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002423}
Jamie Madillc9d442d2016-01-20 11:17:24 -05002424
Xinghua Cao65ec0b22017-03-28 16:10:52 +08002425void State::setImageUnit(const Context *context,
2426 GLuint unit,
2427 Texture *texture,
2428 GLint level,
2429 GLboolean layered,
2430 GLint layer,
2431 GLenum access,
2432 GLenum format)
2433{
2434 mImageUnits[unit].texture.set(context, texture);
2435 mImageUnits[unit].level = level;
2436 mImageUnits[unit].layered = layered;
2437 mImageUnits[unit].layer = layer;
2438 mImageUnits[unit].access = access;
2439 mImageUnits[unit].format = format;
2440}
2441
2442const ImageUnit &State::getImageUnit(GLuint unit) const
2443{
2444 return mImageUnits[unit];
2445}
2446
Jamie Madill81c2e252017-09-09 23:32:46 -04002447// Handle a dirty texture event.
Jamie Madilld4442552018-02-27 22:03:47 -05002448void State::onSubjectStateChange(const Context *context,
2449 angle::SubjectIndex index,
2450 angle::SubjectMessage message)
Jamie Madill81c2e252017-09-09 23:32:46 -04002451{
2452 // Conservatively assume all textures are dirty.
2453 // TODO(jmadill): More fine-grained update.
2454 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lange51ba632017-11-21 11:45:25 -05002455
Jamie Madilld4442552018-02-27 22:03:47 -05002456 if (!mCompleteTextureCache[index] ||
2457 mCompleteTextureCache[index]->initState() == InitState::MayNeedInit)
Geoff Lange51ba632017-11-21 11:45:25 -05002458 {
2459 mCachedTexturesInitState = InitState::MayNeedInit;
2460 }
Jamie Madill81c2e252017-09-09 23:32:46 -04002461}
2462
Jamie Madill05b35b22017-10-03 09:01:44 -04002463Error State::clearUnclearedActiveTextures(const Context *context)
2464{
Jamie Madilla59fc192017-11-02 12:57:58 -04002465 ASSERT(mRobustResourceInit);
Jamie Madill05b35b22017-10-03 09:01:44 -04002466
Geoff Lange51ba632017-11-21 11:45:25 -05002467 if (mCachedTexturesInitState == InitState::Initialized)
2468 {
2469 return NoError();
2470 }
2471
Jamie Madilla59fc192017-11-02 12:57:58 -04002472 for (auto textureIndex : mActiveTexturesMask)
Jamie Madill05b35b22017-10-03 09:01:44 -04002473 {
Jamie Madilla59fc192017-11-02 12:57:58 -04002474 Texture *texture = mCompleteTextureCache[textureIndex];
Jamie Madill05b35b22017-10-03 09:01:44 -04002475 if (texture)
2476 {
2477 ANGLE_TRY(texture->ensureInitialized(context));
2478 }
2479 }
Jamie Madilla59fc192017-11-02 12:57:58 -04002480
Geoff Lange51ba632017-11-21 11:45:25 -05002481 mCachedTexturesInitState = InitState::Initialized;
2482
Jamie Madill05b35b22017-10-03 09:01:44 -04002483 return NoError();
2484}
2485
Jamie Madillc67323a2017-11-02 23:11:41 -04002486AttributesMask State::getAndResetDirtyCurrentValues() const
2487{
2488 AttributesMask retVal = mDirtyCurrentValues;
2489 mDirtyCurrentValues.reset();
2490 return retVal;
2491}
2492
Jamie Madillc9d442d2016-01-20 11:17:24 -05002493} // namespace gl