blob: 7b332d033b2970b63d7c5a1ea3ad4e5542c95158 [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 <string.h>
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -070012#include <limits>
Sami Väisänene45e53b2016-05-25 10:36:04 +030013
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"
Jamie Madillcd0a0a32018-10-18 18:41:57 -040017#include "libANGLE/Buffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050018#include "libANGLE/Caps.h"
jchen10a99ed552017-09-22 08:10:32 +080019#include "libANGLE/Context.h"
Geoff Lang70d0f492015-12-10 17:45:46 -050020#include "libANGLE/Debug.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050021#include "libANGLE/Framebuffer.h"
22#include "libANGLE/FramebufferAttachment.h"
23#include "libANGLE/Query.h"
24#include "libANGLE/VertexArray.h"
25#include "libANGLE/formatutils.h"
jchen10a99ed552017-09-22 08:10:32 +080026#include "libANGLE/queryconversions.h"
Lingfeng Yangabb09f12018-04-16 10:43:53 -070027#include "libANGLE/queryutils.h"
Geoff Lang4751aab2017-10-30 15:14:52 -040028#include "libANGLE/renderer/ContextImpl.h"
Jamie Madillf668a4b2018-09-23 17:01:20 -040029#include "libANGLE/renderer/TextureImpl.h"
Shannon Woods53a94a82014-06-24 15:20:36 -040030
Corentin Wallezad3ae902018-03-09 13:40:42 -050031namespace gl
32{
33
Olli Etuahobbf1c102016-06-28 13:31:33 +030034namespace
35{
Corentin Wallezad3ae902018-03-09 13:40:42 -050036bool GetAlternativeQueryType(QueryType type, QueryType *alternativeType)
Olli Etuahobbf1c102016-06-28 13:31:33 +030037{
Corentin Wallezad3ae902018-03-09 13:40:42 -050038 switch (type)
39 {
40 case QueryType::AnySamples:
41 *alternativeType = QueryType::AnySamplesConservative;
42 return true;
43 case QueryType::AnySamplesConservative:
44 *alternativeType = QueryType::AnySamples;
45 return true;
46 default:
47 return false;
48 }
Olli Etuahobbf1c102016-06-28 13:31:33 +030049}
50
Jamie Madillca8eda42018-10-18 18:41:56 -040051// Mapping from a buffer binding type to a dirty bit type.
52constexpr angle::PackedEnumMap<BufferBinding, size_t> kBufferBindingDirtyBits = {{
53 0, /* Array */
54 State::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING, /* AtomicCounter */
55 0, /* CopyRead */
56 0, /* CopyWrite */
57 State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING, /* DispatchIndirect */
58 State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING, /* DrawIndirect */
59 0, /* ElementArray */
60 State::DIRTY_BIT_PACK_BUFFER_BINDING, /* PixelPack */
61 State::DIRTY_BIT_UNPACK_BUFFER_BINDING, /* PixelUnpack */
62 State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING, /* ShaderStorage */
63 0, /* TransformFeedback */
64 State::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS, /* Uniform */
65}};
66
67// Returns a buffer binding function depending on if a dirty bit is set.
68template <BufferBinding Target>
69constexpr State::BufferBindingSetter GetBufferBindingSetter()
70{
71 return kBufferBindingDirtyBits[Target] != 0 ? &State::setGenericBufferBindingWithBit<Target>
72 : &State::setGenericBufferBinding<Target>;
73}
Olli Etuahobbf1c102016-06-28 13:31:33 +030074} // anonymous namepace
75
Jamie Madillbf5177d2018-08-21 12:58:20 -040076template <typename BindingT, typename... ArgsT>
Jamie Madillca8eda42018-10-18 18:41:56 -040077ANGLE_INLINE void UpdateNonTFBufferBinding(const Context *context,
78 BindingT *binding,
79 Buffer *buffer,
80 ArgsT... args)
James Darpiniane8a93c62018-01-04 18:02:24 -080081{
Jamie Madillca8eda42018-10-18 18:41:56 -040082 Buffer *oldBuffer = binding->get();
83 if (oldBuffer)
84 {
85 oldBuffer->onNonTFBindingChanged(-1);
86 oldBuffer->release(context);
87 }
88 binding->assign(buffer, args...);
89 if (buffer)
90 {
91 buffer->addRef();
92 buffer->onNonTFBindingChanged(1);
93 }
Jamie Madillbf5177d2018-08-21 12:58:20 -040094}
95
96template <typename BindingT, typename... ArgsT>
97void UpdateTFBufferBinding(const Context *context, BindingT *binding, bool indexed, ArgsT... args)
98{
99 if (binding->get())
100 (*binding)->onTFBindingChanged(context, false, indexed);
101 binding->set(context, args...);
102 if (binding->get())
103 (*binding)->onTFBindingChanged(context, true, indexed);
James Darpiniane8a93c62018-01-04 18:02:24 -0800104}
105
106void UpdateBufferBinding(const Context *context,
Jamie Madillbf5177d2018-08-21 12:58:20 -0400107 BindingPointer<Buffer> *binding,
James Darpiniane8a93c62018-01-04 18:02:24 -0800108 Buffer *buffer,
Jamie Madillbf5177d2018-08-21 12:58:20 -0400109 BufferBinding target)
James Darpiniane8a93c62018-01-04 18:02:24 -0800110{
Jamie Madillbf5177d2018-08-21 12:58:20 -0400111 if (target == BufferBinding::TransformFeedback)
112 {
113 UpdateTFBufferBinding(context, binding, false, buffer);
114 }
115 else
116 {
117 UpdateNonTFBufferBinding(context, binding, buffer);
118 }
119}
120
121void UpdateIndexedBufferBinding(const Context *context,
122 OffsetBindingPointer<Buffer> *binding,
123 Buffer *buffer,
124 BufferBinding target,
125 GLintptr offset,
126 GLsizeiptr size)
127{
128 if (target == BufferBinding::TransformFeedback)
129 {
130 UpdateTFBufferBinding(context, binding, true, buffer, offset, size);
131 }
132 else
133 {
134 UpdateNonTFBufferBinding(context, binding, buffer, offset, size);
135 }
James Darpiniane8a93c62018-01-04 18:02:24 -0800136}
137
Jamie Madillca8eda42018-10-18 18:41:56 -0400138// These template functions must be defined before they are instantiated in kBufferSetters.
139template <BufferBinding Target>
140void State::setGenericBufferBindingWithBit(const Context *context, Buffer *buffer)
141{
142 UpdateNonTFBufferBinding(context, &mBoundBuffers[Target], buffer);
143 mDirtyBits.set(kBufferBindingDirtyBits[Target]);
144}
145
146template <BufferBinding Target>
147void State::setGenericBufferBinding(const Context *context, Buffer *buffer)
148{
149 UpdateNonTFBufferBinding(context, &mBoundBuffers[Target], buffer);
150}
151
152template <>
153void State::setGenericBufferBinding<BufferBinding::TransformFeedback>(const Context *context,
154 Buffer *buffer)
155{
156 UpdateTFBufferBinding(context, &mBoundBuffers[BufferBinding::TransformFeedback], false, buffer);
157}
158
159template <>
160void State::setGenericBufferBinding<BufferBinding::ElementArray>(const Context *context,
161 Buffer *buffer)
162{
163 Buffer *oldBuffer = mVertexArray->mState.mElementArrayBuffer.get();
164 if (oldBuffer)
165 {
Jamie Madillcd0a0a32018-10-18 18:41:57 -0400166 oldBuffer->removeObserver(&mVertexArray->mState.mElementArrayBuffer);
Jamie Madillca8eda42018-10-18 18:41:56 -0400167 oldBuffer->onNonTFBindingChanged(-1);
168 oldBuffer->release(context);
169 }
170 mVertexArray->mState.mElementArrayBuffer.assign(buffer);
171 if (buffer)
172 {
Jamie Madillcd0a0a32018-10-18 18:41:57 -0400173 buffer->addObserver(&mVertexArray->mState.mElementArrayBuffer);
Jamie Madillca8eda42018-10-18 18:41:56 -0400174 buffer->onNonTFBindingChanged(1);
175 buffer->addRef();
176 }
Jamie Madillca8eda42018-10-18 18:41:56 -0400177 mVertexArray->mDirtyBits.set(VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
178 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
179}
180
181const angle::PackedEnumMap<BufferBinding, State::BufferBindingSetter> State::kBufferSetters = {{
182 GetBufferBindingSetter<BufferBinding::Array>(),
183 GetBufferBindingSetter<BufferBinding::AtomicCounter>(),
184 GetBufferBindingSetter<BufferBinding::CopyRead>(),
185 GetBufferBindingSetter<BufferBinding::CopyWrite>(),
186 GetBufferBindingSetter<BufferBinding::DispatchIndirect>(),
187 GetBufferBindingSetter<BufferBinding::DrawIndirect>(),
188 GetBufferBindingSetter<BufferBinding::ElementArray>(),
189 GetBufferBindingSetter<BufferBinding::PixelPack>(),
190 GetBufferBindingSetter<BufferBinding::PixelUnpack>(),
191 GetBufferBindingSetter<BufferBinding::ShaderStorage>(),
192 GetBufferBindingSetter<BufferBinding::TransformFeedback>(),
193 GetBufferBindingSetter<BufferBinding::Uniform>(),
194}};
195
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400196State::State(bool debug,
197 bool bindGeneratesResource,
198 bool clientArraysEnabled,
199 bool robustResourceInit,
200 bool programBinaryCacheEnabled)
Jamie Madille79b1e12015-11-04 16:36:37 -0500201 : mMaxDrawBuffers(0),
202 mMaxCombinedTextureImageUnits(0),
203 mDepthClearValue(0),
204 mStencilClearValue(0),
205 mScissorTest(false),
206 mSampleCoverage(false),
207 mSampleCoverageValue(0),
208 mSampleCoverageInvert(false),
Jiawei Shaodb342272017-09-27 10:21:45 +0800209 mSampleMask(false),
210 mMaxSampleMaskWords(0),
Jamie Madille79b1e12015-11-04 16:36:37 -0500211 mStencilRef(0),
212 mStencilBackRef(0),
213 mLineWidth(0),
214 mGenerateMipmapHint(GL_NONE),
215 mFragmentShaderDerivativeHint(GL_NONE),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400216 mBindGeneratesResource(bindGeneratesResource),
217 mClientArraysEnabled(clientArraysEnabled),
Jamie Madille79b1e12015-11-04 16:36:37 -0500218 mNearZ(0),
219 mFarZ(0),
220 mReadFramebuffer(nullptr),
221 mDrawFramebuffer(nullptr),
222 mProgram(nullptr),
223 mVertexArray(nullptr),
224 mActiveSampler(0),
Jamie Madill4787d702018-08-08 15:49:26 -0400225 mActiveTexturesCache{},
226 mCachedTexturesInitState(InitState::MayNeedInit),
Qin Jiajia47f6dd02018-08-10 13:36:32 +0800227 mCachedImageTexturesInitState(InitState::MayNeedInit),
Sami Väisänen74c23472016-05-09 17:30:30 +0300228 mPrimitiveRestart(false),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400229 mDebug(debug),
Sami Väisänen74c23472016-05-09 17:30:30 +0300230 mMultiSampling(false),
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700231 mSampleAlphaToOne(false),
Jamie Madille08a1d32017-03-07 17:24:06 -0500232 mFramebufferSRGB(true),
Geoff Lang4fb8a8b2018-06-01 16:47:57 -0400233 mRobustResourceInit(robustResourceInit),
jchen1082af6202018-06-22 10:59:52 +0800234 mProgramBinaryCacheEnabled(programBinaryCacheEnabled),
235 mMaxShaderCompilerThreads(std::numeric_limits<GLuint>::max())
Shannon Woods53a94a82014-06-24 15:20:36 -0400236{
Geoff Lang76b10c92014-09-05 16:28:14 -0400237}
238
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700239State::~State()
240{
241}
Geoff Lang76b10c92014-09-05 16:28:14 -0400242
Jamie Madill6c43a012018-08-08 15:49:27 -0400243void State::initialize(Context *context)
Geoff Lang76b10c92014-09-05 16:28:14 -0400244{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700245 const Caps &caps = context->getCaps();
246 const Extensions &extensions = context->getExtensions();
Geoff Lang4751aab2017-10-30 15:14:52 -0400247 const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700248 const Version &clientVersion = context->getClientVersion();
Jamie Madill4928b7c2017-06-20 12:57:39 -0400249
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700250 mMaxDrawBuffers = caps.maxDrawBuffers;
Shannon Woods2df6a602014-09-26 16:12:07 -0400251 mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
Shannon Woods53a94a82014-06-24 15:20:36 -0400252
Jamie Madillf75ab352015-03-16 10:46:52 -0400253 setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
Shannon Woods53a94a82014-06-24 15:20:36 -0400254
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700255 mDepthClearValue = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400256 mStencilClearValue = 0;
257
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700258 mScissorTest = false;
259 mScissor.x = 0;
260 mScissor.y = 0;
261 mScissor.width = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400262 mScissor.height = 0;
263
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700264 mBlendColor.red = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400265 mBlendColor.green = 0;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700266 mBlendColor.blue = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400267 mBlendColor.alpha = 0;
268
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700269 mStencilRef = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400270 mStencilBackRef = 0;
271
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700272 mSampleCoverage = false;
273 mSampleCoverageValue = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400274 mSampleCoverageInvert = false;
Jiawei Shaodb342272017-09-27 10:21:45 +0800275
276 mMaxSampleMaskWords = caps.maxSampleMaskWords;
277 mSampleMask = false;
278 mSampleMaskValues.fill(~GLbitfield(0));
279
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700280 mGenerateMipmapHint = GL_DONT_CARE;
Shannon Woods53a94a82014-06-24 15:20:36 -0400281 mFragmentShaderDerivativeHint = GL_DONT_CARE;
282
283 mLineWidth = 1.0f;
284
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700285 mViewport.x = 0;
286 mViewport.y = 0;
287 mViewport.width = 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400288 mViewport.height = 0;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700289 mNearZ = 0.0f;
290 mFarZ = 1.0f;
Shannon Woods53a94a82014-06-24 15:20:36 -0400291
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700292 mBlend.colorMaskRed = true;
Shannon Woods53a94a82014-06-24 15:20:36 -0400293 mBlend.colorMaskGreen = true;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700294 mBlend.colorMaskBlue = true;
Shannon Woods53a94a82014-06-24 15:20:36 -0400295 mBlend.colorMaskAlpha = true;
296
Geoff Lang76b10c92014-09-05 16:28:14 -0400297 mActiveSampler = 0;
298
Shannon Woods23e05002014-09-22 19:07:27 -0400299 mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
Shannon Woods53a94a82014-06-24 15:20:36 -0400300
Brandon Jonesc405ae72017-12-06 14:15:03 -0800301 // Set all indexes in state attributes type mask to float (default)
302 for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
303 {
304 mCurrentValuesTypeMask.setIndex(GL_FLOAT, i);
305 }
306
Geoff Lang4dc3af02016-11-18 14:09:27 -0500307 mUniformBuffers.resize(caps.maxUniformBufferBindings);
Shannon Woodsf3acaf92014-09-23 18:07:11 -0400308
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800309 mSamplerTextures[TextureType::_2D].resize(caps.maxCombinedTextureImageUnits);
310 mSamplerTextures[TextureType::CubeMap].resize(caps.maxCombinedTextureImageUnits);
Geoff Langeb66a6e2016-10-31 13:06:12 -0400311 if (clientVersion >= Version(3, 0))
Shannon Woods53a94a82014-06-24 15:20:36 -0400312 {
Geoff Lang76b10c92014-09-05 16:28:14 -0400313 // TODO: These could also be enabled via extension
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800314 mSamplerTextures[TextureType::_2DArray].resize(caps.maxCombinedTextureImageUnits);
315 mSamplerTextures[TextureType::_3D].resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400316 }
Yizhou Jiang7818a852018-09-06 15:02:04 +0800317 if (clientVersion >= Version(3, 1) || nativeExtensions.textureMultisample)
318 {
319 mSamplerTextures[TextureType::_2DMultisample].resize(caps.maxCombinedTextureImageUnits);
320 }
Geoff Lang3b573612016-10-31 14:08:10 -0400321 if (clientVersion >= Version(3, 1))
322 {
Olli Etuahod310a432018-08-24 15:40:23 +0300323 mSamplerTextures[TextureType::_2DMultisampleArray].resize(
324 caps.maxCombinedTextureImageUnits);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800325
326 mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800327 mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800328 mImageUnits.resize(caps.maxImageUnits);
Geoff Lang3b573612016-10-31 14:08:10 -0400329 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400330 if (nativeExtensions.textureRectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400331 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800332 mSamplerTextures[TextureType::Rectangle].resize(caps.maxCombinedTextureImageUnits);
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400333 }
Geoff Lang4751aab2017-10-30 15:14:52 -0400334 if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
Ian Ewellbda75592016-04-18 17:25:54 -0400335 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800336 mSamplerTextures[TextureType::External].resize(caps.maxCombinedTextureImageUnits);
Ian Ewellbda75592016-04-18 17:25:54 -0400337 }
Jamie Madill81c2e252017-09-09 23:32:46 -0400338 mCompleteTextureBindings.reserve(caps.maxCombinedTextureImageUnits);
Yizhou Jiang7818a852018-09-06 15:02:04 +0800339 mCachedTexturesInitState = InitState::MayNeedInit;
Qin Jiajia47f6dd02018-08-10 13:36:32 +0800340 mCachedImageTexturesInitState = InitState::MayNeedInit;
Jamie Madill81c2e252017-09-09 23:32:46 -0400341 for (uint32_t textureIndex = 0; textureIndex < caps.maxCombinedTextureImageUnits;
342 ++textureIndex)
343 {
Jamie Madill6c43a012018-08-08 15:49:27 -0400344 mCompleteTextureBindings.emplace_back(context, textureIndex);
Jamie Madill81c2e252017-09-09 23:32:46 -0400345 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400346
Geoff Lang76b10c92014-09-05 16:28:14 -0400347 mSamplers.resize(caps.maxCombinedTextureImageUnits);
Shannon Woods53a94a82014-06-24 15:20:36 -0400348
Corentin Wallezad3ae902018-03-09 13:40:42 -0500349 for (QueryType type : angle::AllEnums<QueryType>())
350 {
351 mActiveQueries[type].set(context, nullptr);
352 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400353
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500354 mProgram = nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -0400355
Ian Ewell3ffd78b2016-01-22 16:09:42 -0500356 mReadFramebuffer = nullptr;
357 mDrawFramebuffer = nullptr;
Jamie Madillb4b53c52015-02-03 15:22:48 -0500358
359 mPrimitiveRestart = false;
Geoff Lang70d0f492015-12-10 17:45:46 -0500360
Geoff Lang70d0f492015-12-10 17:45:46 -0500361 mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
Sami Väisänen74c23472016-05-09 17:30:30 +0300362
Geoff Lang488130e2017-09-27 13:53:11 -0400363 mMultiSampling = true;
364 mSampleAlphaToOne = false;
Sami Väisänena797e062016-05-12 15:23:40 +0300365
366 mCoverageModulation = GL_NONE;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300367
368 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
369 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
370 mPathStencilFunc = GL_ALWAYS;
371 mPathStencilRef = 0;
372 mPathStencilMask = std::numeric_limits<GLuint>::max();
Jamie Madille08a1d32017-03-07 17:24:06 -0500373
Lingfeng Yangdbb9c532018-02-25 19:58:24 -0800374 // GLES1 emulation: Initialize state for GLES1 if version
375 // applies
376 if (clientVersion < Version(2, 0))
377 {
Lingfeng Yange547aac2018-04-05 09:39:20 -0700378 mGLES1State.initialize(context, this);
Lingfeng Yangdbb9c532018-02-25 19:58:24 -0800379 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400380}
381
Jamie Madill6c1f6712017-02-14 19:08:04 -0500382void State::reset(const Context *context)
Shannon Woods53a94a82014-06-24 15:20:36 -0400383{
Jamie Madill8693bdb2017-09-02 15:32:14 -0400384 for (auto &bindingVec : mSamplerTextures)
Shannon Woods53a94a82014-06-24 15:20:36 -0400385 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800386 for (size_t textureIdx = 0; textureIdx < bindingVec.size(); textureIdx++)
Shannon Woods53a94a82014-06-24 15:20:36 -0400387 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800388 bindingVec[textureIdx].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400389 }
390 }
Geoff Lang76b10c92014-09-05 16:28:14 -0400391 for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
392 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400393 mSamplers[samplerIdx].set(context, nullptr);
Geoff Lang76b10c92014-09-05 16:28:14 -0400394 }
Shannon Woods53a94a82014-06-24 15:20:36 -0400395
Xinghua Cao65ec0b22017-03-28 16:10:52 +0800396 for (auto &imageUnit : mImageUnits)
397 {
398 imageUnit.texture.set(context, nullptr);
399 imageUnit.level = 0;
400 imageUnit.layered = false;
401 imageUnit.layer = 0;
402 imageUnit.access = GL_READ_ONLY;
403 imageUnit.format = GL_R32UI;
404 }
405
Jamie Madill4928b7c2017-06-20 12:57:39 -0400406 mRenderbuffer.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400407
Corentin Wallez336129f2017-10-17 15:55:40 -0400408 for (auto type : angle::AllEnums<BufferBinding>())
409 {
Jamie Madillbf5177d2018-08-21 12:58:20 -0400410 UpdateBufferBinding(context, &mBoundBuffers[type], nullptr, type);
Corentin Wallez336129f2017-10-17 15:55:40 -0400411 }
412
Geoff Lang7dd2e102014-11-10 15:19:26 -0500413 if (mProgram)
414 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500415 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -0500416 }
Yunchao Hed7297bf2017-04-19 15:27:10 +0800417 mProgram = nullptr;
Geoff Lang7dd2e102014-11-10 15:19:26 -0500418
Yunchao Hea336b902017-08-02 16:05:21 +0800419 mProgramPipeline.set(context, nullptr);
420
James Darpiniane8a93c62018-01-04 18:02:24 -0800421 if (mTransformFeedback.get())
Jamie Madill7267aa62018-04-17 15:28:21 -0400422 mTransformFeedback->onBindingChanged(context, false);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400423 mTransformFeedback.set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400424
Corentin Wallezad3ae902018-03-09 13:40:42 -0500425 for (QueryType type : angle::AllEnums<QueryType>())
Shannon Woods53a94a82014-06-24 15:20:36 -0400426 {
Corentin Wallezad3ae902018-03-09 13:40:42 -0500427 mActiveQueries[type].set(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -0400428 }
429
Corentin Wallez336129f2017-10-17 15:55:40 -0400430 for (auto &buf : mUniformBuffers)
Shannon Woods53a94a82014-06-24 15:20:36 -0400431 {
Jamie Madillbf5177d2018-08-21 12:58:20 -0400432 UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::Uniform, 0, 0);
Shannon Woods53a94a82014-06-24 15:20:36 -0400433 }
434
Jiajia Qin6eafb042016-12-27 17:04:07 +0800435 for (auto &buf : mAtomicCounterBuffers)
436 {
Jamie Madillbf5177d2018-08-21 12:58:20 -0400437 UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
Jiajia Qin6eafb042016-12-27 17:04:07 +0800438 }
439
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800440 for (auto &buf : mShaderStorageBuffers)
441 {
Jamie Madillbf5177d2018-08-21 12:58:20 -0400442 UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage, 0, 0);
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800443 }
444
Sami Väisänene45e53b2016-05-25 10:36:04 +0300445 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixProj);
446 angle::Matrix<GLfloat>::setToIdentity(mPathMatrixMV);
447 mPathStencilFunc = GL_ALWAYS;
448 mPathStencilRef = 0;
449 mPathStencilMask = std::numeric_limits<GLuint>::max();
450
Jamie Madill1b94d432015-08-07 13:23:23 -0400451 setAllDirtyBits();
Shannon Woods53a94a82014-06-24 15:20:36 -0400452}
453
Jamie Madille3bb6b72018-10-03 17:51:15 -0400454ANGLE_INLINE void State::unsetActiveTextures(ActiveTextureMask textureMask)
455{
456 // Unset any relevant bound textures.
457 for (size_t textureIndex : mProgram->getActiveSamplersMask())
458 {
459 mActiveTexturesCache[textureIndex] = nullptr;
460 mCompleteTextureBindings[textureIndex].reset();
461 }
462}
463
Jamie Madill6f755b22018-10-09 12:48:54 -0400464ANGLE_INLINE angle::Result State::updateActiveTexture(const Context *context,
465 size_t textureIndex,
466 Texture *texture)
Jamie Madille3bb6b72018-10-03 17:51:15 -0400467{
468 const Sampler *sampler = mSamplers[textureIndex].get();
469
470 if (!texture)
471 {
472 mActiveTexturesCache[textureIndex] = nullptr;
473 mCompleteTextureBindings[textureIndex].bind(nullptr);
Jamie Madill6f755b22018-10-09 12:48:54 -0400474 return angle::Result::Continue();
Jamie Madille3bb6b72018-10-03 17:51:15 -0400475 }
476
Jamie Madill31116732018-10-09 18:30:01 -0400477 mCompleteTextureBindings[textureIndex].bind(texture->getImplementation());
Jamie Madille3bb6b72018-10-03 17:51:15 -0400478
479 if (!texture->isSamplerComplete(context, sampler))
480 {
481 mActiveTexturesCache[textureIndex] = nullptr;
Jamie Madill6f755b22018-10-09 12:48:54 -0400482 return angle::Result::Continue();
Jamie Madille3bb6b72018-10-03 17:51:15 -0400483 }
484
485 mActiveTexturesCache[textureIndex] = texture;
486
487 if (texture->hasAnyDirtyBit())
488 {
489 ANGLE_TRY(texture->syncState(context));
490 }
491
492 if (texture->initState() == InitState::MayNeedInit)
493 {
494 mCachedTexturesInitState = InitState::MayNeedInit;
495 }
496
Jamie Madill6f755b22018-10-09 12:48:54 -0400497 return angle::Result::Continue();
Jamie Madille3bb6b72018-10-03 17:51:15 -0400498}
499
Shannon Woods53a94a82014-06-24 15:20:36 -0400500const RasterizerState &State::getRasterizerState() const
501{
502 return mRasterizer;
503}
504
505const BlendState &State::getBlendState() const
506{
507 return mBlend;
508}
509
510const DepthStencilState &State::getDepthStencilState() const
511{
512 return mDepthStencil;
513}
514
Jamie Madillf75ab352015-03-16 10:46:52 -0400515void State::setColorClearValue(float red, float green, float blue, float alpha)
Shannon Woods53a94a82014-06-24 15:20:36 -0400516{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700517 mColorClearValue.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400518 mColorClearValue.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700519 mColorClearValue.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400520 mColorClearValue.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400521 mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400522}
523
Jamie Madillf75ab352015-03-16 10:46:52 -0400524void State::setDepthClearValue(float depth)
Shannon Woods53a94a82014-06-24 15:20:36 -0400525{
526 mDepthClearValue = depth;
Jamie Madill1b94d432015-08-07 13:23:23 -0400527 mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
Shannon Woods53a94a82014-06-24 15:20:36 -0400528}
529
Jamie Madillf75ab352015-03-16 10:46:52 -0400530void State::setStencilClearValue(int stencil)
Shannon Woods53a94a82014-06-24 15:20:36 -0400531{
532 mStencilClearValue = stencil;
Jamie Madill1b94d432015-08-07 13:23:23 -0400533 mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
Shannon Woods53a94a82014-06-24 15:20:36 -0400534}
535
Shannon Woods53a94a82014-06-24 15:20:36 -0400536void State::setColorMask(bool red, bool green, bool blue, bool alpha)
537{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700538 mBlend.colorMaskRed = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400539 mBlend.colorMaskGreen = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700540 mBlend.colorMaskBlue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400541 mBlend.colorMaskAlpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400542 mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400543}
544
545void State::setDepthMask(bool mask)
546{
547 mDepthStencil.depthMask = mask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400548 mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400549}
550
551bool State::isRasterizerDiscardEnabled() const
552{
553 return mRasterizer.rasterizerDiscard;
554}
555
556void State::setRasterizerDiscard(bool enabled)
557{
558 mRasterizer.rasterizerDiscard = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400559 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400560}
561
562bool State::isCullFaceEnabled() const
563{
564 return mRasterizer.cullFace;
565}
566
567void State::setCullFace(bool enabled)
568{
569 mRasterizer.cullFace = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400570 mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400571}
572
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400573void State::setCullMode(CullFaceMode mode)
Shannon Woods53a94a82014-06-24 15:20:36 -0400574{
575 mRasterizer.cullMode = mode;
Jamie Madill1b94d432015-08-07 13:23:23 -0400576 mDirtyBits.set(DIRTY_BIT_CULL_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400577}
578
579void State::setFrontFace(GLenum front)
580{
581 mRasterizer.frontFace = front;
Jamie Madill1b94d432015-08-07 13:23:23 -0400582 mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400583}
584
585bool State::isDepthTestEnabled() const
586{
587 return mDepthStencil.depthTest;
588}
589
590void State::setDepthTest(bool enabled)
591{
592 mDepthStencil.depthTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400593 mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400594}
595
596void State::setDepthFunc(GLenum depthFunc)
597{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700598 mDepthStencil.depthFunc = depthFunc;
599 mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
Shannon Woods53a94a82014-06-24 15:20:36 -0400600}
601
602void State::setDepthRange(float zNear, float zFar)
603{
604 mNearZ = zNear;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700605 mFarZ = zFar;
Jamie Madill1b94d432015-08-07 13:23:23 -0400606 mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400607}
608
Geoff Langd42f5b82015-04-16 14:03:29 -0400609float State::getNearPlane() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400610{
Geoff Langd42f5b82015-04-16 14:03:29 -0400611 return mNearZ;
612}
613
614float State::getFarPlane() const
615{
616 return mFarZ;
Shannon Woods53a94a82014-06-24 15:20:36 -0400617}
618
619bool State::isBlendEnabled() const
620{
621 return mBlend.blend;
622}
623
624void State::setBlend(bool enabled)
625{
626 mBlend.blend = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400627 mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400628}
629
630void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
631{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700632 mBlend.sourceBlendRGB = sourceRGB;
633 mBlend.destBlendRGB = destRGB;
Shannon Woods53a94a82014-06-24 15:20:36 -0400634 mBlend.sourceBlendAlpha = sourceAlpha;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700635 mBlend.destBlendAlpha = destAlpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400636 mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400637}
638
639void State::setBlendColor(float red, float green, float blue, float alpha)
640{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700641 mBlendColor.red = red;
Shannon Woods53a94a82014-06-24 15:20:36 -0400642 mBlendColor.green = green;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700643 mBlendColor.blue = blue;
Shannon Woods53a94a82014-06-24 15:20:36 -0400644 mBlendColor.alpha = alpha;
Jamie Madill1b94d432015-08-07 13:23:23 -0400645 mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400646}
647
648void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
649{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700650 mBlend.blendEquationRGB = rgbEquation;
Shannon Woods53a94a82014-06-24 15:20:36 -0400651 mBlend.blendEquationAlpha = alphaEquation;
Jamie Madill1b94d432015-08-07 13:23:23 -0400652 mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
Shannon Woods53a94a82014-06-24 15:20:36 -0400653}
654
655const ColorF &State::getBlendColor() const
656{
657 return mBlendColor;
658}
659
660bool State::isStencilTestEnabled() const
661{
662 return mDepthStencil.stencilTest;
663}
664
665void State::setStencilTest(bool enabled)
666{
667 mDepthStencil.stencilTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400668 mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400669}
670
671void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
672{
673 mDepthStencil.stencilFunc = stencilFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700674 mStencilRef = (stencilRef > 0) ? stencilRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400675 mDepthStencil.stencilMask = stencilMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400676 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400677}
678
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700679void State::setStencilBackParams(GLenum stencilBackFunc,
680 GLint stencilBackRef,
681 GLuint stencilBackMask)
Shannon Woods53a94a82014-06-24 15:20:36 -0400682{
683 mDepthStencil.stencilBackFunc = stencilBackFunc;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700684 mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
Shannon Woods53a94a82014-06-24 15:20:36 -0400685 mDepthStencil.stencilBackMask = stencilBackMask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400686 mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400687}
688
689void State::setStencilWritemask(GLuint stencilWritemask)
690{
691 mDepthStencil.stencilWritemask = stencilWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400692 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400693}
694
695void State::setStencilBackWritemask(GLuint stencilBackWritemask)
696{
697 mDepthStencil.stencilBackWritemask = stencilBackWritemask;
Jamie Madill1b94d432015-08-07 13:23:23 -0400698 mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400699}
700
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700701void State::setStencilOperations(GLenum stencilFail,
702 GLenum stencilPassDepthFail,
703 GLenum stencilPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400704{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700705 mDepthStencil.stencilFail = stencilFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400706 mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
707 mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400708 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
Shannon Woods53a94a82014-06-24 15:20:36 -0400709}
710
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700711void State::setStencilBackOperations(GLenum stencilBackFail,
712 GLenum stencilBackPassDepthFail,
713 GLenum stencilBackPassDepthPass)
Shannon Woods53a94a82014-06-24 15:20:36 -0400714{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700715 mDepthStencil.stencilBackFail = stencilBackFail;
Shannon Woods53a94a82014-06-24 15:20:36 -0400716 mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
717 mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
Jamie Madill1b94d432015-08-07 13:23:23 -0400718 mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
Shannon Woods53a94a82014-06-24 15:20:36 -0400719}
720
721GLint State::getStencilRef() const
722{
723 return mStencilRef;
724}
725
726GLint State::getStencilBackRef() const
727{
728 return mStencilBackRef;
729}
730
731bool State::isPolygonOffsetFillEnabled() const
732{
733 return mRasterizer.polygonOffsetFill;
734}
735
736void State::setPolygonOffsetFill(bool enabled)
737{
Jamie Madill1b94d432015-08-07 13:23:23 -0400738 mRasterizer.polygonOffsetFill = enabled;
739 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400740}
741
742void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
743{
744 // An application can pass NaN values here, so handle this gracefully
745 mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700746 mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
Jamie Madill1b94d432015-08-07 13:23:23 -0400747 mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
Shannon Woods53a94a82014-06-24 15:20:36 -0400748}
749
750bool State::isSampleAlphaToCoverageEnabled() const
751{
752 return mBlend.sampleAlphaToCoverage;
753}
754
755void State::setSampleAlphaToCoverage(bool enabled)
756{
757 mBlend.sampleAlphaToCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400758 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400759}
760
761bool State::isSampleCoverageEnabled() const
762{
763 return mSampleCoverage;
764}
765
766void State::setSampleCoverage(bool enabled)
767{
768 mSampleCoverage = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400769 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400770}
771
772void State::setSampleCoverageParams(GLclampf value, bool invert)
773{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700774 mSampleCoverageValue = value;
Shannon Woods53a94a82014-06-24 15:20:36 -0400775 mSampleCoverageInvert = invert;
Jamie Madill1b94d432015-08-07 13:23:23 -0400776 mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
Shannon Woods53a94a82014-06-24 15:20:36 -0400777}
778
Geoff Lang0fbb6002015-04-16 11:11:53 -0400779GLclampf State::getSampleCoverageValue() const
Shannon Woods53a94a82014-06-24 15:20:36 -0400780{
Geoff Lang0fbb6002015-04-16 11:11:53 -0400781 return mSampleCoverageValue;
782}
Shannon Woods53a94a82014-06-24 15:20:36 -0400783
Geoff Lang0fbb6002015-04-16 11:11:53 -0400784bool State::getSampleCoverageInvert() const
785{
786 return mSampleCoverageInvert;
Shannon Woods53a94a82014-06-24 15:20:36 -0400787}
788
Jiawei Shaodb342272017-09-27 10:21:45 +0800789bool State::isSampleMaskEnabled() const
790{
791 return mSampleMask;
792}
793
794void State::setSampleMaskEnabled(bool enabled)
795{
796 mSampleMask = enabled;
797 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK_ENABLED);
798}
799
800void State::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
801{
802 ASSERT(maskNumber < mMaxSampleMaskWords);
803 mSampleMaskValues[maskNumber] = mask;
Jamie Madillc67323a2017-11-02 23:11:41 -0400804 // TODO(jmadill): Use a child dirty bit if we ever use more than two words.
805 mDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
Jiawei Shaodb342272017-09-27 10:21:45 +0800806}
807
808GLbitfield State::getSampleMaskWord(GLuint maskNumber) const
809{
810 ASSERT(maskNumber < mMaxSampleMaskWords);
811 return mSampleMaskValues[maskNumber];
812}
813
814GLuint State::getMaxSampleMaskWords() const
815{
816 return mMaxSampleMaskWords;
817}
818
Sami Väisänen74c23472016-05-09 17:30:30 +0300819void State::setSampleAlphaToOne(bool enabled)
820{
821 mSampleAlphaToOne = enabled;
822 mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
823}
824
825bool State::isSampleAlphaToOneEnabled() const
826{
827 return mSampleAlphaToOne;
828}
829
830void State::setMultisampling(bool enabled)
831{
832 mMultiSampling = enabled;
833 mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
834}
835
836bool State::isMultisamplingEnabled() const
837{
838 return mMultiSampling;
839}
840
Shannon Woods53a94a82014-06-24 15:20:36 -0400841bool State::isScissorTestEnabled() const
842{
843 return mScissorTest;
844}
845
846void State::setScissorTest(bool enabled)
847{
848 mScissorTest = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400849 mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400850}
851
852void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
853{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700854 mScissor.x = x;
855 mScissor.y = y;
856 mScissor.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -0400857 mScissor.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -0400858 mDirtyBits.set(DIRTY_BIT_SCISSOR);
Shannon Woods53a94a82014-06-24 15:20:36 -0400859}
860
861const Rectangle &State::getScissor() const
862{
863 return mScissor;
864}
865
866bool State::isDitherEnabled() const
867{
868 return mBlend.dither;
869}
870
871void State::setDither(bool enabled)
872{
873 mBlend.dither = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400874 mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
Shannon Woods53a94a82014-06-24 15:20:36 -0400875}
876
Jamie Madillb4b53c52015-02-03 15:22:48 -0500877bool State::isPrimitiveRestartEnabled() const
878{
879 return mPrimitiveRestart;
880}
881
882void State::setPrimitiveRestart(bool enabled)
883{
884 mPrimitiveRestart = enabled;
Jamie Madill1b94d432015-08-07 13:23:23 -0400885 mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
Jamie Madillb4b53c52015-02-03 15:22:48 -0500886}
887
Shannon Woods53a94a82014-06-24 15:20:36 -0400888void State::setEnableFeature(GLenum feature, bool enabled)
889{
890 switch (feature)
891 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700892 case GL_MULTISAMPLE_EXT:
893 setMultisampling(enabled);
894 break;
895 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
896 setSampleAlphaToOne(enabled);
897 break;
898 case GL_CULL_FACE:
899 setCullFace(enabled);
900 break;
901 case GL_POLYGON_OFFSET_FILL:
902 setPolygonOffsetFill(enabled);
903 break;
904 case GL_SAMPLE_ALPHA_TO_COVERAGE:
905 setSampleAlphaToCoverage(enabled);
906 break;
907 case GL_SAMPLE_COVERAGE:
908 setSampleCoverage(enabled);
909 break;
910 case GL_SCISSOR_TEST:
911 setScissorTest(enabled);
912 break;
913 case GL_STENCIL_TEST:
914 setStencilTest(enabled);
915 break;
916 case GL_DEPTH_TEST:
917 setDepthTest(enabled);
918 break;
919 case GL_BLEND:
920 setBlend(enabled);
921 break;
922 case GL_DITHER:
923 setDither(enabled);
924 break;
925 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
926 setPrimitiveRestart(enabled);
927 break;
928 case GL_RASTERIZER_DISCARD:
929 setRasterizerDiscard(enabled);
930 break;
931 case GL_SAMPLE_MASK:
932 setSampleMaskEnabled(enabled);
933 break;
934 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
935 mDebug.setOutputSynchronous(enabled);
936 break;
937 case GL_DEBUG_OUTPUT:
938 mDebug.setOutputEnabled(enabled);
939 break;
940 case GL_FRAMEBUFFER_SRGB_EXT:
941 setFramebufferSRGB(enabled);
942 break;
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700943
944 // GLES1 emulation
945 case GL_ALPHA_TEST:
946 mGLES1State.mAlphaTestEnabled = enabled;
947 break;
Lingfeng Yang23dc90b2018-04-23 09:01:49 -0700948 case GL_TEXTURE_2D:
949 mGLES1State.mTexUnitEnables[mActiveSampler].set(TextureType::_2D, enabled);
950 break;
951 case GL_TEXTURE_CUBE_MAP:
952 mGLES1State.mTexUnitEnables[mActiveSampler].set(TextureType::CubeMap, enabled);
953 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -0700954 case GL_LIGHTING:
955 mGLES1State.mLightingEnabled = enabled;
956 break;
957 case GL_LIGHT0:
958 case GL_LIGHT1:
959 case GL_LIGHT2:
960 case GL_LIGHT3:
961 case GL_LIGHT4:
962 case GL_LIGHT5:
963 case GL_LIGHT6:
964 case GL_LIGHT7:
965 mGLES1State.mLights[feature - GL_LIGHT0].enabled = enabled;
966 break;
967 case GL_NORMALIZE:
968 mGLES1State.mNormalizeEnabled = enabled;
969 break;
970 case GL_RESCALE_NORMAL:
971 mGLES1State.mRescaleNormalEnabled = enabled;
972 break;
973 case GL_COLOR_MATERIAL:
974 mGLES1State.mColorMaterialEnabled = enabled;
975 break;
Lingfeng Yang060088a2018-05-30 20:40:57 -0700976 case GL_CLIP_PLANE0:
977 case GL_CLIP_PLANE1:
978 case GL_CLIP_PLANE2:
979 case GL_CLIP_PLANE3:
980 case GL_CLIP_PLANE4:
981 case GL_CLIP_PLANE5:
982 mGLES1State.mClipPlanes[feature - GL_CLIP_PLANE0].enabled = enabled;
983 break;
Lingfeng Yang7ba3f422018-06-01 09:43:04 -0700984 case GL_FOG:
985 mGLES1State.mFogEnabled = enabled;
986 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -0700987 case GL_POINT_SMOOTH:
988 mGLES1State.mPointSmoothEnabled = enabled;
989 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700990 case GL_LINE_SMOOTH:
991 mGLES1State.mLineSmoothEnabled = enabled;
992 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -0700993 case GL_POINT_SPRITE_OES:
994 mGLES1State.mPointSpriteEnabled = enabled;
995 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700996 case GL_COLOR_LOGIC_OP:
997 mGLES1State.mLogicOpEnabled = enabled;
998 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -0700999 default:
1000 UNREACHABLE();
Shannon Woods53a94a82014-06-24 15:20:36 -04001001 }
1002}
1003
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001004bool State::getEnableFeature(GLenum feature) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001005{
1006 switch (feature)
1007 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001008 case GL_MULTISAMPLE_EXT:
1009 return isMultisamplingEnabled();
1010 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1011 return isSampleAlphaToOneEnabled();
1012 case GL_CULL_FACE:
1013 return isCullFaceEnabled();
1014 case GL_POLYGON_OFFSET_FILL:
1015 return isPolygonOffsetFillEnabled();
1016 case GL_SAMPLE_ALPHA_TO_COVERAGE:
1017 return isSampleAlphaToCoverageEnabled();
1018 case GL_SAMPLE_COVERAGE:
1019 return isSampleCoverageEnabled();
1020 case GL_SCISSOR_TEST:
1021 return isScissorTestEnabled();
1022 case GL_STENCIL_TEST:
1023 return isStencilTestEnabled();
1024 case GL_DEPTH_TEST:
1025 return isDepthTestEnabled();
1026 case GL_BLEND:
1027 return isBlendEnabled();
1028 case GL_DITHER:
1029 return isDitherEnabled();
1030 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1031 return isPrimitiveRestartEnabled();
1032 case GL_RASTERIZER_DISCARD:
1033 return isRasterizerDiscardEnabled();
1034 case GL_SAMPLE_MASK:
1035 return isSampleMaskEnabled();
1036 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1037 return mDebug.isOutputSynchronous();
1038 case GL_DEBUG_OUTPUT:
1039 return mDebug.isOutputEnabled();
1040 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1041 return isBindGeneratesResourceEnabled();
1042 case GL_CLIENT_ARRAYS_ANGLE:
1043 return areClientArraysEnabled();
1044 case GL_FRAMEBUFFER_SRGB_EXT:
1045 return getFramebufferSRGB();
1046 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1047 return mRobustResourceInit;
1048 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1049 return mProgramBinaryCacheEnabled;
Jamie Madillc43be722017-07-13 16:22:14 -04001050
Lingfeng Yang13b708f2018-03-21 12:14:10 -07001051 // GLES1 emulation
1052 case GL_ALPHA_TEST:
1053 return mGLES1State.mAlphaTestEnabled;
Lingfeng Yang01074432018-04-16 10:19:51 -07001054 case GL_VERTEX_ARRAY:
1055 return mGLES1State.mVertexArrayEnabled;
1056 case GL_NORMAL_ARRAY:
1057 return mGLES1State.mNormalArrayEnabled;
1058 case GL_COLOR_ARRAY:
1059 return mGLES1State.mColorArrayEnabled;
1060 case GL_POINT_SIZE_ARRAY_OES:
1061 return mGLES1State.mPointSizeArrayEnabled;
1062 case GL_TEXTURE_COORD_ARRAY:
1063 return mGLES1State.mTexCoordArrayEnabled[mGLES1State.mClientActiveTexture];
Lingfeng Yang23dc90b2018-04-23 09:01:49 -07001064 case GL_TEXTURE_2D:
1065 return mGLES1State.mTexUnitEnables[mActiveSampler].test(TextureType::_2D);
1066 case GL_TEXTURE_CUBE_MAP:
1067 return mGLES1State.mTexUnitEnables[mActiveSampler].test(TextureType::CubeMap);
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001068 case GL_LIGHTING:
1069 return mGLES1State.mLightingEnabled;
1070 case GL_LIGHT0:
1071 case GL_LIGHT1:
1072 case GL_LIGHT2:
1073 case GL_LIGHT3:
1074 case GL_LIGHT4:
1075 case GL_LIGHT5:
1076 case GL_LIGHT6:
1077 case GL_LIGHT7:
1078 return mGLES1State.mLights[feature - GL_LIGHT0].enabled;
1079 case GL_NORMALIZE:
1080 return mGLES1State.mNormalizeEnabled;
1081 case GL_RESCALE_NORMAL:
1082 return mGLES1State.mRescaleNormalEnabled;
1083 case GL_COLOR_MATERIAL:
1084 return mGLES1State.mColorMaterialEnabled;
Lingfeng Yang060088a2018-05-30 20:40:57 -07001085 case GL_CLIP_PLANE0:
1086 case GL_CLIP_PLANE1:
1087 case GL_CLIP_PLANE2:
1088 case GL_CLIP_PLANE3:
1089 case GL_CLIP_PLANE4:
1090 case GL_CLIP_PLANE5:
1091 return mGLES1State.mClipPlanes[feature - GL_CLIP_PLANE0].enabled;
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07001092 case GL_FOG:
1093 return mGLES1State.mFogEnabled;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001094 case GL_POINT_SMOOTH:
1095 return mGLES1State.mPointSmoothEnabled;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001096 case GL_LINE_SMOOTH:
1097 return mGLES1State.mLineSmoothEnabled;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07001098 case GL_POINT_SPRITE_OES:
1099 return mGLES1State.mPointSpriteEnabled;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07001100 case GL_COLOR_LOGIC_OP:
1101 return mGLES1State.mLogicOpEnabled;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001102 default:
1103 UNREACHABLE();
1104 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001105 }
1106}
1107
1108void State::setLineWidth(GLfloat width)
1109{
1110 mLineWidth = width;
Jamie Madill1b94d432015-08-07 13:23:23 -04001111 mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
Shannon Woods53a94a82014-06-24 15:20:36 -04001112}
1113
Geoff Lang4b3f4162015-04-16 13:22:05 -04001114float State::getLineWidth() const
1115{
1116 return mLineWidth;
1117}
1118
Shannon Woods53a94a82014-06-24 15:20:36 -04001119void State::setGenerateMipmapHint(GLenum hint)
1120{
1121 mGenerateMipmapHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -04001122 mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001123}
1124
1125void State::setFragmentShaderDerivativeHint(GLenum hint)
1126{
1127 mFragmentShaderDerivativeHint = hint;
Jamie Madill1b94d432015-08-07 13:23:23 -04001128 mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001129 // TODO: Propagate the hint to shader translator so we can write
1130 // ddx, ddx_coarse, or ddx_fine depending on the hint.
1131 // Ignore for now. It is valid for implementations to ignore hint.
1132}
1133
Geoff Langfeb8c682017-02-13 16:07:35 -05001134bool State::areClientArraysEnabled() const
1135{
1136 return mClientArraysEnabled;
1137}
1138
Shannon Woods53a94a82014-06-24 15:20:36 -04001139void State::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
1140{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001141 mViewport.x = x;
1142 mViewport.y = y;
1143 mViewport.width = width;
Shannon Woods53a94a82014-06-24 15:20:36 -04001144 mViewport.height = height;
Jamie Madill1b94d432015-08-07 13:23:23 -04001145 mDirtyBits.set(DIRTY_BIT_VIEWPORT);
Shannon Woods53a94a82014-06-24 15:20:36 -04001146}
1147
1148const Rectangle &State::getViewport() const
1149{
1150 return mViewport;
1151}
1152
1153void State::setActiveSampler(unsigned int active)
1154{
1155 mActiveSampler = active;
1156}
1157
1158unsigned int State::getActiveSampler() const
1159{
Cooper Partin4d61f7e2015-08-12 10:56:50 -07001160 return static_cast<unsigned int>(mActiveSampler);
Shannon Woods53a94a82014-06-24 15:20:36 -04001161}
1162
Jamie Madill14246812018-10-03 17:51:16 -04001163Error State::setSamplerTexture(const Context *context, TextureType type, Texture *texture)
Shannon Woods53a94a82014-06-24 15:20:36 -04001164{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001165 mSamplerTextures[type][mActiveSampler].set(context, texture);
Jamie Madill14246812018-10-03 17:51:16 -04001166
1167 if (mProgram && mProgram->getActiveSamplersMask()[mActiveSampler] &&
1168 mProgram->getActiveSamplerTypes()[mActiveSampler] == type)
1169 {
1170 ANGLE_TRY(updateActiveTexture(context, mActiveSampler, texture));
1171 }
1172
Jamie Madill81c2e252017-09-09 23:32:46 -04001173 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Jamie Madill14246812018-10-03 17:51:16 -04001174
1175 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04001176}
1177
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001178Texture *State::getTargetTexture(TextureType type) const
Jamie Madillc29968b2016-01-20 11:17:23 -05001179{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001180 return getSamplerTexture(static_cast<unsigned int>(mActiveSampler), type);
Jamie Madillc29968b2016-01-20 11:17:23 -05001181}
1182
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001183GLuint State::getSamplerTextureId(unsigned int sampler, TextureType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001184{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001185 ASSERT(sampler < mSamplerTextures[type].size());
1186 return mSamplerTextures[type][sampler].id();
Shannon Woods53a94a82014-06-24 15:20:36 -04001187}
1188
Jamie Madilla02315b2017-02-23 14:14:47 -05001189void State::detachTexture(const Context *context, const TextureMap &zeroTextures, GLuint texture)
Shannon Woods53a94a82014-06-24 15:20:36 -04001190{
1191 // Textures have a detach method on State rather than a simple
1192 // removeBinding, because the zero/null texture objects are managed
1193 // separately, and don't have to go through the Context's maps or
1194 // the ResourceManager.
1195
1196 // [OpenGL ES 2.0.24] section 3.8 page 84:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001197 // If a texture object is deleted, it is as if all texture units which are bound to that texture
1198 // object are rebound to texture object zero
Shannon Woods53a94a82014-06-24 15:20:36 -04001199
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001200 for (TextureType type : angle::AllEnums<TextureType>())
Shannon Woods53a94a82014-06-24 15:20:36 -04001201 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001202 TextureBindingVector &textureVector = mSamplerTextures[type];
Jamie Madill81c2e252017-09-09 23:32:46 -04001203 for (BindingPointer<Texture> &binding : textureVector)
Shannon Woods53a94a82014-06-24 15:20:36 -04001204 {
Geoff Lang76b10c92014-09-05 16:28:14 -04001205 if (binding.id() == texture)
Shannon Woods53a94a82014-06-24 15:20:36 -04001206 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001207 Texture *zeroTexture = zeroTextures[type].get();
1208 ASSERT(zeroTexture != nullptr);
Jamie Madille6382c32014-11-07 15:05:26 -05001209 // Zero textures are the "default" textures instead of NULL
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001210 binding.set(context, zeroTexture);
Jamie Madill81c2e252017-09-09 23:32:46 -04001211 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -04001212 }
1213 }
1214 }
1215
Xinghua Cao65ec0b22017-03-28 16:10:52 +08001216 for (auto &bindingImageUnit : mImageUnits)
1217 {
1218 if (bindingImageUnit.texture.id() == texture)
1219 {
1220 bindingImageUnit.texture.set(context, nullptr);
1221 bindingImageUnit.level = 0;
1222 bindingImageUnit.layered = false;
1223 bindingImageUnit.layer = 0;
1224 bindingImageUnit.access = GL_READ_ONLY;
1225 bindingImageUnit.format = GL_R32UI;
1226 break;
1227 }
1228 }
1229
Shannon Woods53a94a82014-06-24 15:20:36 -04001230 // [OpenGL ES 2.0.24] section 4.4 page 112:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001231 // If a texture object is deleted while its image is attached to the currently bound
1232 // framebuffer, then it is as if Texture2DAttachment had been called, with a texture of 0, for
1233 // each attachment point to which this image was attached in the currently bound framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -04001234
Jamie Madill8693bdb2017-09-02 15:32:14 -04001235 if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -04001236 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001237 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001238 }
1239
Jamie Madill8693bdb2017-09-02 15:32:14 -04001240 if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
Shannon Woods53a94a82014-06-24 15:20:36 -04001241 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001242 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001243 }
1244}
1245
Jamie Madill4928b7c2017-06-20 12:57:39 -04001246void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
Jamie Madille6382c32014-11-07 15:05:26 -05001247{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001248 for (TextureType type : angle::AllEnums<TextureType>())
Jamie Madille6382c32014-11-07 15:05:26 -05001249 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001250 for (size_t textureUnit = 0; textureUnit < mSamplerTextures[type].size(); ++textureUnit)
Jamie Madille6382c32014-11-07 15:05:26 -05001251 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001252 mSamplerTextures[type][textureUnit].set(context, zeroTextures[type].get());
Jamie Madille6382c32014-11-07 15:05:26 -05001253 }
1254 }
1255}
1256
Jamie Madill4928b7c2017-06-20 12:57:39 -04001257void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -04001258{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001259 mSamplers[textureUnit].set(context, sampler);
Jamie Madill81c2e252017-09-09 23:32:46 -04001260 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
1261 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -04001262 // This is overly conservative as it assumes the sampler has never been bound.
1263 setSamplerDirty(textureUnit);
Shannon Woods53a94a82014-06-24 15:20:36 -04001264}
1265
1266GLuint State::getSamplerId(GLuint textureUnit) const
1267{
Geoff Lang76b10c92014-09-05 16:28:14 -04001268 ASSERT(textureUnit < mSamplers.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001269 return mSamplers[textureUnit].id();
1270}
1271
Jamie Madill4928b7c2017-06-20 12:57:39 -04001272void State::detachSampler(const Context *context, GLuint sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -04001273{
1274 // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
1275 // If a sampler object that is currently bound to one or more texture units is
1276 // deleted, it is as though BindSampler is called once for each texture unit to
1277 // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
Jamie Madill81c2e252017-09-09 23:32:46 -04001278 for (BindingPointer<Sampler> &samplerBinding : mSamplers)
Shannon Woods53a94a82014-06-24 15:20:36 -04001279 {
Geoff Lang76b10c92014-09-05 16:28:14 -04001280 if (samplerBinding.id() == sampler)
Shannon Woods53a94a82014-06-24 15:20:36 -04001281 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001282 samplerBinding.set(context, nullptr);
Jamie Madill81c2e252017-09-09 23:32:46 -04001283 mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
Shannon Woods53a94a82014-06-24 15:20:36 -04001284 }
1285 }
1286}
1287
Jamie Madill4928b7c2017-06-20 12:57:39 -04001288void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001289{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001290 mRenderbuffer.set(context, renderbuffer);
Jamie Madill8693bdb2017-09-02 15:32:14 -04001291 mDirtyBits.set(DIRTY_BIT_RENDERBUFFER_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001292}
1293
1294GLuint State::getRenderbufferId() const
1295{
1296 return mRenderbuffer.id();
1297}
1298
Jamie Madilldfde6ab2016-06-09 07:07:18 -07001299Renderbuffer *State::getCurrentRenderbuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001300{
1301 return mRenderbuffer.get();
1302}
1303
Jamie Madilla02315b2017-02-23 14:14:47 -05001304void State::detachRenderbuffer(const Context *context, GLuint renderbuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001305{
1306 // [OpenGL ES 2.0.24] section 4.4 page 109:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001307 // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though
1308 // BindRenderbuffer had been executed with the target RENDERBUFFER and name of zero.
Shannon Woods53a94a82014-06-24 15:20:36 -04001309
1310 if (mRenderbuffer.id() == renderbuffer)
1311 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001312 setRenderbufferBinding(context, nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001313 }
1314
1315 // [OpenGL ES 2.0.24] section 4.4 page 111:
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001316 // If a renderbuffer object is deleted while its image is attached to the currently bound
1317 // framebuffer, then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of
1318 // 0, for each attachment point to which this image was attached in the currently bound
1319 // framebuffer.
Shannon Woods53a94a82014-06-24 15:20:36 -04001320
1321 Framebuffer *readFramebuffer = mReadFramebuffer;
1322 Framebuffer *drawFramebuffer = mDrawFramebuffer;
1323
Jamie Madill8693bdb2017-09-02 15:32:14 -04001324 if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
Shannon Woods53a94a82014-06-24 15:20:36 -04001325 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001326 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
Shannon Woods53a94a82014-06-24 15:20:36 -04001327 }
1328
1329 if (drawFramebuffer && drawFramebuffer != readFramebuffer)
1330 {
Jamie Madill8693bdb2017-09-02 15:32:14 -04001331 if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
1332 {
1333 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1334 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001335 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001336}
1337
1338void State::setReadFramebufferBinding(Framebuffer *framebuffer)
1339{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001340 if (mReadFramebuffer == framebuffer)
1341 return;
1342
Shannon Woods53a94a82014-06-24 15:20:36 -04001343 mReadFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001344 mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
1345
1346 if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
1347 {
1348 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
1349 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001350}
1351
1352void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
1353{
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001354 if (mDrawFramebuffer == framebuffer)
1355 return;
1356
Shannon Woods53a94a82014-06-24 15:20:36 -04001357 mDrawFramebuffer = framebuffer;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001358 mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
1359
1360 if (mDrawFramebuffer && mDrawFramebuffer->hasAnyDirtyBit())
1361 {
1362 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1363 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001364}
1365
1366Framebuffer *State::getTargetFramebuffer(GLenum target) const
1367{
1368 switch (target)
1369 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001370 case GL_READ_FRAMEBUFFER_ANGLE:
1371 return mReadFramebuffer;
1372 case GL_DRAW_FRAMEBUFFER_ANGLE:
1373 case GL_FRAMEBUFFER:
1374 return mDrawFramebuffer;
1375 default:
1376 UNREACHABLE();
Yunchao Hef81ce4a2017-04-24 10:49:17 +08001377 return nullptr;
Shannon Woods53a94a82014-06-24 15:20:36 -04001378 }
1379}
1380
Jamie Madill51f40ec2016-06-15 14:06:00 -04001381Framebuffer *State::getReadFramebuffer() const
Shannon Woods53a94a82014-06-24 15:20:36 -04001382{
1383 return mReadFramebuffer;
1384}
1385
Shannon Woods53a94a82014-06-24 15:20:36 -04001386bool State::removeReadFramebufferBinding(GLuint framebuffer)
1387{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001388 if (mReadFramebuffer != nullptr && mReadFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001389 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001390 setReadFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001391 return true;
1392 }
1393
1394 return false;
1395}
1396
1397bool State::removeDrawFramebufferBinding(GLuint framebuffer)
1398{
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07001399 if (mReadFramebuffer != nullptr && mDrawFramebuffer->id() == framebuffer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001400 {
Jamie Madill60ec6ea2016-01-22 15:27:19 -05001401 setDrawFramebufferBinding(nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001402 return true;
1403 }
1404
1405 return false;
1406}
1407
Jamie Madill7267aa62018-04-17 15:28:21 -04001408void State::setVertexArrayBinding(const Context *context, VertexArray *vertexArray)
Shannon Woods53a94a82014-06-24 15:20:36 -04001409{
James Darpiniane8a93c62018-01-04 18:02:24 -08001410 if (mVertexArray == vertexArray)
1411 return;
1412 if (mVertexArray)
Jamie Madillbf5177d2018-08-21 12:58:20 -04001413 mVertexArray->onBindingChanged(context, -1);
Shannon Woods53a94a82014-06-24 15:20:36 -04001414 mVertexArray = vertexArray;
James Darpiniane8a93c62018-01-04 18:02:24 -08001415 if (vertexArray)
Jamie Madillbf5177d2018-08-21 12:58:20 -04001416 vertexArray->onBindingChanged(context, 1);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001417 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001418
1419 if (mVertexArray && mVertexArray->hasAnyDirtyBit())
1420 {
1421 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1422 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001423}
1424
1425GLuint State::getVertexArrayId() const
1426{
Yunchao He4f285442017-04-21 12:15:49 +08001427 ASSERT(mVertexArray != nullptr);
Shannon Woods53a94a82014-06-24 15:20:36 -04001428 return mVertexArray->id();
1429}
1430
Jamie Madill7267aa62018-04-17 15:28:21 -04001431bool State::removeVertexArrayBinding(const Context *context, GLuint vertexArray)
Shannon Woods53a94a82014-06-24 15:20:36 -04001432{
James Darpiniane8a93c62018-01-04 18:02:24 -08001433 if (mVertexArray && mVertexArray->id() == vertexArray)
Shannon Woods53a94a82014-06-24 15:20:36 -04001434 {
Jamie Madillbf5177d2018-08-21 12:58:20 -04001435 mVertexArray->onBindingChanged(context, -1);
Yunchao Hed7297bf2017-04-19 15:27:10 +08001436 mVertexArray = nullptr;
Jamie Madill0b9e9032015-08-17 11:51:52 +00001437 mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001438 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001439 return true;
1440 }
1441
1442 return false;
1443}
1444
Jamie Madill4928b7c2017-06-20 12:57:39 -04001445void State::bindVertexBuffer(const Context *context,
1446 GLuint bindingIndex,
Shao80957d92017-02-20 21:25:59 +08001447 Buffer *boundBuffer,
1448 GLintptr offset,
1449 GLsizei stride)
1450{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001451 getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
Shao80957d92017-02-20 21:25:59 +08001452 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1453}
1454
Shaodde78e82017-05-22 14:13:27 +08001455void State::setVertexAttribBinding(const Context *context, GLuint attribIndex, GLuint bindingIndex)
Shao80957d92017-02-20 21:25:59 +08001456{
Shaodde78e82017-05-22 14:13:27 +08001457 getVertexArray()->setVertexAttribBinding(context, attribIndex, bindingIndex);
Shao80957d92017-02-20 21:25:59 +08001458 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1459}
1460
1461void State::setVertexAttribFormat(GLuint attribIndex,
1462 GLint size,
1463 GLenum type,
1464 bool normalized,
1465 bool pureInteger,
1466 GLuint relativeOffset)
1467{
1468 getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
1469 relativeOffset);
1470 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1471}
1472
1473void State::setVertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
1474{
1475 getVertexArray()->setVertexBindingDivisor(bindingIndex, divisor);
1476 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
1477}
1478
Jamie Madill6f755b22018-10-09 12:48:54 -04001479angle::Result State::setProgram(const Context *context, Program *newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001480{
Geoff Lang7dd2e102014-11-10 15:19:26 -05001481 if (mProgram != newProgram)
Shannon Woods53a94a82014-06-24 15:20:36 -04001482 {
Geoff Lang7dd2e102014-11-10 15:19:26 -05001483 if (mProgram)
1484 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04001485 unsetActiveTextures(mProgram->getActiveSamplersMask());
Jamie Madill6c1f6712017-02-14 19:08:04 -05001486 mProgram->release(context);
Geoff Lang7dd2e102014-11-10 15:19:26 -05001487 }
1488
1489 mProgram = newProgram;
1490
1491 if (mProgram)
1492 {
1493 newProgram->addRef();
Jamie Madille3bb6b72018-10-03 17:51:15 -04001494 ANGLE_TRY(onProgramExecutableChange(context, newProgram));
Geoff Lang7dd2e102014-11-10 15:19:26 -05001495 }
Jamie Madilldf836ff2018-10-01 10:36:24 -04001496
1497 // Note that rendering is undefined if glUseProgram(0) is called. But ANGLE will generate
1498 // an error if the app tries to draw in this case.
1499
Jamie Madilla779b612017-07-24 11:46:05 -04001500 mDirtyBits.set(DIRTY_BIT_PROGRAM_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001501 }
Jamie Madille3bb6b72018-10-03 17:51:15 -04001502
Jamie Madill6f755b22018-10-09 12:48:54 -04001503 return angle::Result::Continue();
Shannon Woods53a94a82014-06-24 15:20:36 -04001504}
1505
Jamie Madill4928b7c2017-06-20 12:57:39 -04001506void State::setTransformFeedbackBinding(const Context *context,
1507 TransformFeedback *transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001508{
James Darpiniane8a93c62018-01-04 18:02:24 -08001509 if (transformFeedback == mTransformFeedback.get())
1510 return;
1511 if (mTransformFeedback.get())
Jamie Madill7267aa62018-04-17 15:28:21 -04001512 mTransformFeedback->onBindingChanged(context, false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001513 mTransformFeedback.set(context, transformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08001514 if (mTransformFeedback.get())
Jamie Madill7267aa62018-04-17 15:28:21 -04001515 mTransformFeedback->onBindingChanged(context, true);
Geoff Langded79232017-11-28 15:21:11 -05001516 mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
Shannon Woods53a94a82014-06-24 15:20:36 -04001517}
1518
Jamie Madill4928b7c2017-06-20 12:57:39 -04001519bool State::removeTransformFeedbackBinding(const Context *context, GLuint transformFeedback)
Shannon Woods53a94a82014-06-24 15:20:36 -04001520{
1521 if (mTransformFeedback.id() == transformFeedback)
1522 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001523 if (mTransformFeedback.get())
Jamie Madill7267aa62018-04-17 15:28:21 -04001524 mTransformFeedback->onBindingChanged(context, false);
Jamie Madill4928b7c2017-06-20 12:57:39 -04001525 mTransformFeedback.set(context, nullptr);
Corentin Walleza2257da2016-04-19 16:43:12 -04001526 return true;
Shannon Woods53a94a82014-06-24 15:20:36 -04001527 }
Corentin Walleza2257da2016-04-19 16:43:12 -04001528
1529 return false;
Shannon Woods53a94a82014-06-24 15:20:36 -04001530}
1531
Yunchao Hea336b902017-08-02 16:05:21 +08001532void State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
1533{
1534 mProgramPipeline.set(context, pipeline);
1535}
1536
1537void State::detachProgramPipeline(const Context *context, GLuint pipeline)
1538{
1539 mProgramPipeline.set(context, nullptr);
1540}
1541
Corentin Wallezad3ae902018-03-09 13:40:42 -05001542bool State::isQueryActive(QueryType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001543{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001544 const Query *query = mActiveQueries[type].get();
1545 if (query != nullptr)
Shannon Woods53a94a82014-06-24 15:20:36 -04001546 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001547 return true;
1548 }
1549
1550 QueryType alternativeType;
1551 if (GetAlternativeQueryType(type, &alternativeType))
1552 {
1553 query = mActiveQueries[alternativeType].get();
1554 return query != nullptr;
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001555 }
1556
1557 return false;
1558}
1559
1560bool State::isQueryActive(Query *query) const
1561{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001562 for (auto &queryPointer : mActiveQueries)
Ian Ewell3ffd78b2016-01-22 16:09:42 -05001563 {
Corentin Wallezad3ae902018-03-09 13:40:42 -05001564 if (queryPointer.get() == query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001565 {
1566 return true;
1567 }
1568 }
1569
1570 return false;
1571}
1572
Corentin Wallezad3ae902018-03-09 13:40:42 -05001573void State::setActiveQuery(const Context *context, QueryType type, Query *query)
Shannon Woods53a94a82014-06-24 15:20:36 -04001574{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001575 mActiveQueries[type].set(context, query);
Shannon Woods53a94a82014-06-24 15:20:36 -04001576}
1577
Corentin Wallezad3ae902018-03-09 13:40:42 -05001578GLuint State::getActiveQueryId(QueryType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001579{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001580 const Query *query = getActiveQuery(type);
Shannon Woods53a94a82014-06-24 15:20:36 -04001581 return (query ? query->id() : 0u);
1582}
1583
Corentin Wallezad3ae902018-03-09 13:40:42 -05001584Query *State::getActiveQuery(QueryType type) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001585{
Corentin Wallezad3ae902018-03-09 13:40:42 -05001586 return mActiveQueries[type].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001587}
1588
Corentin Wallez336129f2017-10-17 15:55:40 -04001589void State::setIndexedBufferBinding(const Context *context,
1590 BufferBinding target,
1591 GLuint index,
1592 Buffer *buffer,
1593 GLintptr offset,
1594 GLsizeiptr size)
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001595{
Corentin Wallez336129f2017-10-17 15:55:40 -04001596 setBufferBinding(context, target, buffer);
Jiajia Qin9d7d0b12016-11-29 16:30:31 +08001597
Corentin Wallez336129f2017-10-17 15:55:40 -04001598 switch (target)
1599 {
1600 case BufferBinding::TransformFeedback:
1601 mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size);
James Darpiniane8a93c62018-01-04 18:02:24 -08001602 setBufferBinding(context, target, buffer);
Corentin Wallez336129f2017-10-17 15:55:40 -04001603 break;
1604 case BufferBinding::Uniform:
Jamie Madillbf5177d2018-08-21 12:58:20 -04001605 UpdateIndexedBufferBinding(context, &mUniformBuffers[index], buffer, target, offset,
1606 size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001607 break;
1608 case BufferBinding::AtomicCounter:
Jamie Madillbf5177d2018-08-21 12:58:20 -04001609 UpdateIndexedBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target,
1610 offset, size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001611 break;
1612 case BufferBinding::ShaderStorage:
Jamie Madillbf5177d2018-08-21 12:58:20 -04001613 UpdateIndexedBufferBinding(context, &mShaderStorageBuffers[index], buffer, target,
1614 offset, size);
Corentin Wallez336129f2017-10-17 15:55:40 -04001615 break;
1616 default:
1617 UNREACHABLE();
1618 break;
1619 }
Shannon Woods53a94a82014-06-24 15:20:36 -04001620}
1621
Geoff Lang5d124a62015-09-15 13:03:27 -04001622const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001623{
Shannon Woodsf3acaf92014-09-23 18:07:11 -04001624 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
Geoff Lang5d124a62015-09-15 13:03:27 -04001625 return mUniformBuffers[index];
Gregoire Payen de La Garanderie68694e92015-03-24 14:03:37 +00001626}
1627
Jiajia Qin6eafb042016-12-27 17:04:07 +08001628const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
1629{
1630 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
1631 return mAtomicCounterBuffers[index];
1632}
1633
Jiajia Qinf546e7d2017-03-27 14:12:59 +08001634const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
1635{
1636 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
1637 return mShaderStorageBuffers[index];
1638}
1639
Corentin Wallez336129f2017-10-17 15:55:40 -04001640Buffer *State::getTargetBuffer(BufferBinding target) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001641{
1642 switch (target)
1643 {
Corentin Wallez336129f2017-10-17 15:55:40 -04001644 case BufferBinding::ElementArray:
Jamie Madillcd0a0a32018-10-18 18:41:57 -04001645 return getVertexArray()->getElementArrayBuffer();
Corentin Wallez336129f2017-10-17 15:55:40 -04001646 default:
1647 return mBoundBuffers[target].get();
Shannon Woods53a94a82014-06-24 15:20:36 -04001648 }
1649}
1650
James Darpinian4d9d4832018-03-13 12:43:28 -07001651void State::detachBuffer(const Context *context, const Buffer *buffer)
Yuly Novikov5807a532015-12-03 13:01:22 -05001652{
James Darpinian4d9d4832018-03-13 12:43:28 -07001653 if (!buffer->isBound())
1654 {
1655 return;
1656 }
1657 GLuint bufferName = buffer->id();
James Darpiniane8a93c62018-01-04 18:02:24 -08001658 for (auto target : angle::AllEnums<BufferBinding>())
Yuly Novikov5807a532015-12-03 13:01:22 -05001659 {
James Darpiniane8a93c62018-01-04 18:02:24 -08001660 if (mBoundBuffers[target].id() == bufferName)
Yuly Novikov5807a532015-12-03 13:01:22 -05001661 {
Jamie Madillbf5177d2018-08-21 12:58:20 -04001662 UpdateBufferBinding(context, &mBoundBuffers[target], nullptr, target);
Yuly Novikov5807a532015-12-03 13:01:22 -05001663 }
1664 }
1665
1666 TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
1667 if (curTransformFeedback)
1668 {
Jamie Madill4928b7c2017-06-20 12:57:39 -04001669 curTransformFeedback->detachBuffer(context, bufferName);
Yuly Novikov5807a532015-12-03 13:01:22 -05001670 }
1671
Jamie Madill4928b7c2017-06-20 12:57:39 -04001672 getVertexArray()->detachBuffer(context, bufferName);
James Darpiniane8a93c62018-01-04 18:02:24 -08001673
1674 for (auto &buf : mUniformBuffers)
1675 {
1676 if (buf.id() == bufferName)
1677 {
Jamie Madillbf5177d2018-08-21 12:58:20 -04001678 UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::Uniform, 0, 0);
James Darpiniane8a93c62018-01-04 18:02:24 -08001679 }
1680 }
1681
1682 for (auto &buf : mAtomicCounterBuffers)
1683 {
1684 if (buf.id() == bufferName)
1685 {
Jamie Madillbf5177d2018-08-21 12:58:20 -04001686 UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
James Darpiniane8a93c62018-01-04 18:02:24 -08001687 }
1688 }
1689
1690 for (auto &buf : mShaderStorageBuffers)
1691 {
1692 if (buf.id() == bufferName)
1693 {
Jamie Madillbf5177d2018-08-21 12:58:20 -04001694 UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage, 0, 0);
James Darpiniane8a93c62018-01-04 18:02:24 -08001695 }
1696 }
Yuly Novikov5807a532015-12-03 13:01:22 -05001697}
1698
Shannon Woods53a94a82014-06-24 15:20:36 -04001699void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
1700{
1701 getVertexArray()->enableAttribute(attribNum, enabled);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001702 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001703}
1704
1705void State::setVertexAttribf(GLuint index, const GLfloat values[4])
1706{
Shannon Woods23e05002014-09-22 19:07:27 -04001707 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001708 mVertexAttribCurrentValues[index].setFloatValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001709 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1710 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001711 mCurrentValuesTypeMask.setIndex(GL_FLOAT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001712}
1713
1714void State::setVertexAttribu(GLuint index, const GLuint values[4])
1715{
Shannon Woods23e05002014-09-22 19:07:27 -04001716 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001717 mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001718 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1719 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001720 mCurrentValuesTypeMask.setIndex(GL_UNSIGNED_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001721}
1722
1723void State::setVertexAttribi(GLuint index, const GLint values[4])
1724{
Shannon Woods23e05002014-09-22 19:07:27 -04001725 ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001726 mVertexAttribCurrentValues[index].setIntValues(values);
Jamie Madillc67323a2017-11-02 23:11:41 -04001727 mDirtyBits.set(DIRTY_BIT_CURRENT_VALUES);
1728 mDirtyCurrentValues.set(index);
Brandon Jonesc405ae72017-12-06 14:15:03 -08001729 mCurrentValuesTypeMask.setIndex(GL_INT, index);
Shannon Woods53a94a82014-06-24 15:20:36 -04001730}
1731
Shaodde78e82017-05-22 14:13:27 +08001732void State::setVertexAttribPointer(const Context *context,
1733 unsigned int attribNum,
1734 Buffer *boundBuffer,
1735 GLint size,
1736 GLenum type,
1737 bool normalized,
1738 bool pureInteger,
1739 GLsizei stride,
1740 const void *pointer)
Shannon Woods53a94a82014-06-24 15:20:36 -04001741{
Shaodde78e82017-05-22 14:13:27 +08001742 getVertexArray()->setVertexAttribPointer(context, attribNum, boundBuffer, size, type,
1743 normalized, pureInteger, stride, pointer);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001744 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Jamie Madill0b9e9032015-08-17 11:51:52 +00001745}
1746
Shaodde78e82017-05-22 14:13:27 +08001747void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
Jamie Madill0b9e9032015-08-17 11:51:52 +00001748{
Shaodde78e82017-05-22 14:13:27 +08001749 getVertexArray()->setVertexAttribDivisor(context, index, divisor);
Jamie Madillc9d442d2016-01-20 11:17:24 -05001750 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
Shannon Woods53a94a82014-06-24 15:20:36 -04001751}
1752
Jamie Madill6de51852017-04-12 09:53:01 -04001753const VertexAttribCurrentValueData &State::getVertexAttribCurrentValue(size_t attribNum) const
Shannon Woods53a94a82014-06-24 15:20:36 -04001754{
Jamie Madill6de51852017-04-12 09:53:01 -04001755 ASSERT(attribNum < mVertexAttribCurrentValues.size());
Shannon Woods53a94a82014-06-24 15:20:36 -04001756 return mVertexAttribCurrentValues[attribNum];
1757}
1758
Jamie Madillcac94a92017-11-10 10:09:32 -05001759const std::vector<VertexAttribCurrentValueData> &State::getVertexAttribCurrentValues() const
1760{
1761 return mVertexAttribCurrentValues;
1762}
1763
Shannon Woods53a94a82014-06-24 15:20:36 -04001764const void *State::getVertexAttribPointer(unsigned int attribNum) const
1765{
1766 return getVertexArray()->getVertexAttribute(attribNum).pointer;
1767}
1768
1769void State::setPackAlignment(GLint alignment)
1770{
1771 mPack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001772 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001773}
1774
1775GLint State::getPackAlignment() const
1776{
1777 return mPack.alignment;
1778}
1779
1780void State::setPackReverseRowOrder(bool reverseRowOrder)
1781{
1782 mPack.reverseRowOrder = reverseRowOrder;
Jamie Madillc67323a2017-11-02 23:11:41 -04001783 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001784}
1785
1786bool State::getPackReverseRowOrder() const
1787{
1788 return mPack.reverseRowOrder;
1789}
1790
Minmin Gongadff67b2015-10-14 10:34:45 -04001791void State::setPackRowLength(GLint rowLength)
1792{
1793 mPack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001794 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001795}
1796
1797GLint State::getPackRowLength() const
1798{
1799 return mPack.rowLength;
1800}
1801
1802void State::setPackSkipRows(GLint skipRows)
1803{
1804 mPack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001805 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001806}
1807
1808GLint State::getPackSkipRows() const
1809{
1810 return mPack.skipRows;
1811}
1812
1813void State::setPackSkipPixels(GLint skipPixels)
1814{
1815 mPack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001816 mDirtyBits.set(DIRTY_BIT_PACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001817}
1818
1819GLint State::getPackSkipPixels() const
1820{
1821 return mPack.skipPixels;
1822}
1823
Shannon Woods53a94a82014-06-24 15:20:36 -04001824const PixelPackState &State::getPackState() const
1825{
1826 return mPack;
1827}
1828
Jamie Madill87de3622015-03-16 10:41:44 -04001829PixelPackState &State::getPackState()
1830{
1831 return mPack;
1832}
1833
Shannon Woods53a94a82014-06-24 15:20:36 -04001834void State::setUnpackAlignment(GLint alignment)
1835{
1836 mUnpack.alignment = alignment;
Jamie Madillc67323a2017-11-02 23:11:41 -04001837 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Shannon Woods53a94a82014-06-24 15:20:36 -04001838}
1839
1840GLint State::getUnpackAlignment() const
1841{
1842 return mUnpack.alignment;
1843}
1844
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001845void State::setUnpackRowLength(GLint rowLength)
1846{
1847 mUnpack.rowLength = rowLength;
Jamie Madillc67323a2017-11-02 23:11:41 -04001848 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongb8aee3b2015-01-27 14:42:36 -08001849}
1850
1851GLint State::getUnpackRowLength() const
1852{
1853 return mUnpack.rowLength;
1854}
1855
Minmin Gongadff67b2015-10-14 10:34:45 -04001856void State::setUnpackImageHeight(GLint imageHeight)
1857{
1858 mUnpack.imageHeight = imageHeight;
Jamie Madillc67323a2017-11-02 23:11:41 -04001859 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001860}
1861
1862GLint State::getUnpackImageHeight() const
1863{
1864 return mUnpack.imageHeight;
1865}
1866
1867void State::setUnpackSkipImages(GLint skipImages)
1868{
1869 mUnpack.skipImages = skipImages;
Jamie Madillc67323a2017-11-02 23:11:41 -04001870 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001871}
1872
1873GLint State::getUnpackSkipImages() const
1874{
1875 return mUnpack.skipImages;
1876}
1877
1878void State::setUnpackSkipRows(GLint skipRows)
1879{
1880 mUnpack.skipRows = skipRows;
Jamie Madillc67323a2017-11-02 23:11:41 -04001881 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001882}
1883
1884GLint State::getUnpackSkipRows() const
1885{
1886 return mUnpack.skipRows;
1887}
1888
1889void State::setUnpackSkipPixels(GLint skipPixels)
1890{
1891 mUnpack.skipPixels = skipPixels;
Jamie Madillc67323a2017-11-02 23:11:41 -04001892 mDirtyBits.set(DIRTY_BIT_UNPACK_STATE);
Minmin Gongadff67b2015-10-14 10:34:45 -04001893}
1894
1895GLint State::getUnpackSkipPixels() const
1896{
1897 return mUnpack.skipPixels;
1898}
1899
Shannon Woods53a94a82014-06-24 15:20:36 -04001900const PixelUnpackState &State::getUnpackState() const
1901{
1902 return mUnpack;
1903}
1904
Jamie Madill67102f02015-03-16 10:41:42 -04001905PixelUnpackState &State::getUnpackState()
1906{
1907 return mUnpack;
1908}
1909
Geoff Lang70d0f492015-12-10 17:45:46 -05001910const Debug &State::getDebug() const
1911{
1912 return mDebug;
1913}
1914
1915Debug &State::getDebug()
1916{
1917 return mDebug;
1918}
1919
Sami Väisänena797e062016-05-12 15:23:40 +03001920void State::setCoverageModulation(GLenum components)
1921{
1922 mCoverageModulation = components;
1923 mDirtyBits.set(DIRTY_BIT_COVERAGE_MODULATION);
1924}
1925
1926GLenum State::getCoverageModulation() const
1927{
1928 return mCoverageModulation;
1929}
1930
Sami Väisänene45e53b2016-05-25 10:36:04 +03001931void State::loadPathRenderingMatrix(GLenum matrixMode, const GLfloat *matrix)
1932{
1933 if (matrixMode == GL_PATH_MODELVIEW_CHROMIUM)
1934 {
1935 memcpy(mPathMatrixMV, matrix, 16 * sizeof(GLfloat));
jchen10bb2f2c42018-09-16 09:47:38 +08001936 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001937 }
1938 else if (matrixMode == GL_PATH_PROJECTION_CHROMIUM)
1939 {
1940 memcpy(mPathMatrixProj, matrix, 16 * sizeof(GLfloat));
jchen10bb2f2c42018-09-16 09:47:38 +08001941 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001942 }
1943 else
1944 {
1945 UNREACHABLE();
1946 }
1947}
1948
1949const GLfloat *State::getPathRenderingMatrix(GLenum which) const
1950{
1951 if (which == GL_PATH_MODELVIEW_MATRIX_CHROMIUM)
1952 {
1953 return mPathMatrixMV;
1954 }
1955 else if (which == GL_PATH_PROJECTION_MATRIX_CHROMIUM)
1956 {
1957 return mPathMatrixProj;
1958 }
1959
1960 UNREACHABLE();
1961 return nullptr;
1962}
1963
1964void State::setPathStencilFunc(GLenum func, GLint ref, GLuint mask)
1965{
1966 mPathStencilFunc = func;
1967 mPathStencilRef = ref;
1968 mPathStencilMask = mask;
jchen10bb2f2c42018-09-16 09:47:38 +08001969 mDirtyBits.set(DIRTY_BIT_PATH_RENDERING);
Sami Väisänene45e53b2016-05-25 10:36:04 +03001970}
1971
1972GLenum State::getPathStencilFunc() const
1973{
1974 return mPathStencilFunc;
1975}
1976
1977GLint State::getPathStencilRef() const
1978{
1979 return mPathStencilRef;
1980}
1981
1982GLuint State::getPathStencilMask() const
1983{
1984 return mPathStencilMask;
1985}
1986
Geoff Lang1d2c41d2016-10-19 16:14:46 -07001987void State::setFramebufferSRGB(bool sRGB)
1988{
1989 mFramebufferSRGB = sRGB;
1990 mDirtyBits.set(DIRTY_BIT_FRAMEBUFFER_SRGB);
1991}
1992
1993bool State::getFramebufferSRGB() const
1994{
1995 return mFramebufferSRGB;
1996}
1997
jchen1082af6202018-06-22 10:59:52 +08001998void State::setMaxShaderCompilerThreads(GLuint count)
1999{
2000 mMaxShaderCompilerThreads = count;
2001}
2002
2003GLuint State::getMaxShaderCompilerThreads() const
2004{
2005 return mMaxShaderCompilerThreads;
2006}
2007
Shannon Woods53a94a82014-06-24 15:20:36 -04002008void State::getBooleanv(GLenum pname, GLboolean *params)
2009{
2010 switch (pname)
2011 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002012 case GL_SAMPLE_COVERAGE_INVERT:
2013 *params = mSampleCoverageInvert;
2014 break;
2015 case GL_DEPTH_WRITEMASK:
2016 *params = mDepthStencil.depthMask;
2017 break;
2018 case GL_COLOR_WRITEMASK:
2019 params[0] = mBlend.colorMaskRed;
2020 params[1] = mBlend.colorMaskGreen;
2021 params[2] = mBlend.colorMaskBlue;
2022 params[3] = mBlend.colorMaskAlpha;
2023 break;
2024 case GL_CULL_FACE:
2025 *params = mRasterizer.cullFace;
2026 break;
2027 case GL_POLYGON_OFFSET_FILL:
2028 *params = mRasterizer.polygonOffsetFill;
2029 break;
2030 case GL_SAMPLE_ALPHA_TO_COVERAGE:
2031 *params = mBlend.sampleAlphaToCoverage;
2032 break;
2033 case GL_SAMPLE_COVERAGE:
2034 *params = mSampleCoverage;
2035 break;
2036 case GL_SAMPLE_MASK:
2037 *params = mSampleMask;
2038 break;
2039 case GL_SCISSOR_TEST:
2040 *params = mScissorTest;
2041 break;
2042 case GL_STENCIL_TEST:
2043 *params = mDepthStencil.stencilTest;
2044 break;
2045 case GL_DEPTH_TEST:
2046 *params = mDepthStencil.depthTest;
2047 break;
2048 case GL_BLEND:
2049 *params = mBlend.blend;
2050 break;
2051 case GL_DITHER:
2052 *params = mBlend.dither;
2053 break;
2054 case GL_TRANSFORM_FEEDBACK_ACTIVE:
2055 *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE;
2056 break;
2057 case GL_TRANSFORM_FEEDBACK_PAUSED:
2058 *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE;
2059 break;
2060 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
2061 *params = mPrimitiveRestart;
2062 break;
2063 case GL_RASTERIZER_DISCARD:
2064 *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
2065 break;
2066 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
2067 *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
2068 break;
2069 case GL_DEBUG_OUTPUT:
2070 *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
2071 break;
2072 case GL_MULTISAMPLE_EXT:
2073 *params = mMultiSampling;
2074 break;
2075 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2076 *params = mSampleAlphaToOne;
2077 break;
2078 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
2079 *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
2080 break;
2081 case GL_CLIENT_ARRAYS_ANGLE:
2082 *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
2083 break;
2084 case GL_FRAMEBUFFER_SRGB_EXT:
2085 *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
2086 break;
2087 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2088 *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
2089 break;
2090 case GL_PROGRAM_CACHE_ENABLED_ANGLE:
2091 *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
2092 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002093 case GL_LIGHT_MODEL_TWO_SIDE:
2094 *params = IsLightModelTwoSided(&mGLES1State);
2095 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002096 default:
2097 UNREACHABLE();
2098 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002099 }
2100}
2101
2102void State::getFloatv(GLenum pname, GLfloat *params)
2103{
2104 // Please note: DEPTH_CLEAR_VALUE is included in our internal getFloatv implementation
2105 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
2106 // GetIntegerv as its native query function. As it would require conversion in any
2107 // case, this should make no difference to the calling application.
2108 switch (pname)
2109 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002110 case GL_LINE_WIDTH:
2111 *params = mLineWidth;
2112 break;
2113 case GL_SAMPLE_COVERAGE_VALUE:
2114 *params = mSampleCoverageValue;
2115 break;
2116 case GL_DEPTH_CLEAR_VALUE:
2117 *params = mDepthClearValue;
2118 break;
2119 case GL_POLYGON_OFFSET_FACTOR:
2120 *params = mRasterizer.polygonOffsetFactor;
2121 break;
2122 case GL_POLYGON_OFFSET_UNITS:
2123 *params = mRasterizer.polygonOffsetUnits;
2124 break;
2125 case GL_DEPTH_RANGE:
2126 params[0] = mNearZ;
2127 params[1] = mFarZ;
2128 break;
2129 case GL_COLOR_CLEAR_VALUE:
2130 params[0] = mColorClearValue.red;
2131 params[1] = mColorClearValue.green;
2132 params[2] = mColorClearValue.blue;
2133 params[3] = mColorClearValue.alpha;
2134 break;
2135 case GL_BLEND_COLOR:
2136 params[0] = mBlendColor.red;
2137 params[1] = mBlendColor.green;
2138 params[2] = mBlendColor.blue;
2139 params[3] = mBlendColor.alpha;
2140 break;
2141 case GL_MULTISAMPLE_EXT:
2142 *params = static_cast<GLfloat>(mMultiSampling);
2143 break;
2144 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2145 *params = static_cast<GLfloat>(mSampleAlphaToOne);
2146 break;
2147 case GL_COVERAGE_MODULATION_CHROMIUM:
2148 params[0] = static_cast<GLfloat>(mCoverageModulation);
2149 break;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07002150 case GL_ALPHA_TEST_REF:
2151 *params = mGLES1State.mAlphaTestRef;
2152 break;
Lingfeng Yanga43994c2018-03-29 07:21:41 -07002153 case GL_CURRENT_COLOR:
2154 {
2155 const auto &color = mGLES1State.mCurrentColor;
2156 params[0] = color.red;
2157 params[1] = color.green;
2158 params[2] = color.blue;
2159 params[3] = color.alpha;
2160 break;
2161 }
Lingfeng Yang5a7e61b2018-03-29 16:50:32 -07002162 case GL_CURRENT_NORMAL:
2163 {
2164 const auto &normal = mGLES1State.mCurrentNormal;
2165 params[0] = normal[0];
2166 params[1] = normal[1];
2167 params[2] = normal[2];
2168 break;
2169 }
Lingfeng Yang038dd532018-03-29 17:31:52 -07002170 case GL_CURRENT_TEXTURE_COORDS:
2171 {
2172 const auto &texcoord = mGLES1State.mCurrentTextureCoords[mActiveSampler];
2173 params[0] = texcoord.s;
2174 params[1] = texcoord.t;
2175 params[2] = texcoord.r;
2176 params[3] = texcoord.q;
2177 break;
2178 }
Lingfeng Yang3a41af62018-04-09 07:28:56 -07002179 case GL_MODELVIEW_MATRIX:
2180 memcpy(params, mGLES1State.mModelviewMatrices.back().data(), 16 * sizeof(GLfloat));
2181 break;
2182 case GL_PROJECTION_MATRIX:
2183 memcpy(params, mGLES1State.mProjectionMatrices.back().data(), 16 * sizeof(GLfloat));
2184 break;
2185 case GL_TEXTURE_MATRIX:
2186 memcpy(params, mGLES1State.mTextureMatrices[mActiveSampler].back().data(),
2187 16 * sizeof(GLfloat));
2188 break;
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002189 case GL_LIGHT_MODEL_AMBIENT:
2190 GetLightModelParameters(&mGLES1State, pname, params);
2191 break;
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002192 case GL_FOG_MODE:
2193 case GL_FOG_DENSITY:
2194 case GL_FOG_START:
2195 case GL_FOG_END:
2196 case GL_FOG_COLOR:
2197 GetFogParameters(&mGLES1State, pname, params);
2198 break;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002199 case GL_POINT_SIZE:
2200 GetPointSize(&mGLES1State, params);
2201 break;
2202 case GL_POINT_SIZE_MIN:
2203 case GL_POINT_SIZE_MAX:
2204 case GL_POINT_FADE_THRESHOLD_SIZE:
2205 case GL_POINT_DISTANCE_ATTENUATION:
2206 GetPointParameter(&mGLES1State, FromGLenum<PointParameter>(pname), params);
2207 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002208 default:
2209 UNREACHABLE();
2210 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002211 }
2212}
2213
Jamie Madille98b1b52018-03-08 09:47:23 -05002214Error State::getIntegerv(const Context *context, GLenum pname, GLint *params)
Shannon Woods53a94a82014-06-24 15:20:36 -04002215{
2216 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
2217 {
2218 unsigned int colorAttachment = (pname - GL_DRAW_BUFFER0_EXT);
Shannon Woods2df6a602014-09-26 16:12:07 -04002219 ASSERT(colorAttachment < mMaxDrawBuffers);
Shannon Woods53a94a82014-06-24 15:20:36 -04002220 Framebuffer *framebuffer = mDrawFramebuffer;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002221 *params = framebuffer->getDrawBufferState(colorAttachment);
Jamie Madille98b1b52018-03-08 09:47:23 -05002222 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04002223 }
2224
2225 // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
2226 // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
2227 // GetIntegerv as its native query function. As it would require conversion in any
2228 // case, this should make no difference to the calling application. You may find it in
2229 // State::getFloatv.
2230 switch (pname)
2231 {
Corentin Wallez336129f2017-10-17 15:55:40 -04002232 case GL_ARRAY_BUFFER_BINDING:
2233 *params = mBoundBuffers[BufferBinding::Array].id();
2234 break;
2235 case GL_DRAW_INDIRECT_BUFFER_BINDING:
2236 *params = mBoundBuffers[BufferBinding::DrawIndirect].id();
2237 break;
2238 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
Jamie Madillcd0a0a32018-10-18 18:41:57 -04002239 {
2240 Buffer *elementArrayBuffer = getVertexArray()->getElementArrayBuffer();
2241 *params = elementArrayBuffer ? elementArrayBuffer->id() : 0;
Corentin Wallez336129f2017-10-17 15:55:40 -04002242 break;
Jamie Madillcd0a0a32018-10-18 18:41:57 -04002243 }
Jamie Madill690c8eb2018-03-12 15:20:03 -04002244 case GL_DRAW_FRAMEBUFFER_BINDING:
2245 static_assert(GL_DRAW_FRAMEBUFFER_BINDING == GL_DRAW_FRAMEBUFFER_BINDING_ANGLE,
2246 "Enum mismatch");
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002247 *params = mDrawFramebuffer->id();
2248 break;
Jamie Madill690c8eb2018-03-12 15:20:03 -04002249 case GL_READ_FRAMEBUFFER_BINDING:
2250 static_assert(GL_READ_FRAMEBUFFER_BINDING == GL_READ_FRAMEBUFFER_BINDING_ANGLE,
2251 "Enum mismatch");
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002252 *params = mReadFramebuffer->id();
2253 break;
2254 case GL_RENDERBUFFER_BINDING:
2255 *params = mRenderbuffer.id();
2256 break;
2257 case GL_VERTEX_ARRAY_BINDING:
2258 *params = mVertexArray->id();
2259 break;
2260 case GL_CURRENT_PROGRAM:
2261 *params = mProgram ? mProgram->id() : 0;
2262 break;
2263 case GL_PACK_ALIGNMENT:
2264 *params = mPack.alignment;
2265 break;
2266 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
2267 *params = mPack.reverseRowOrder;
2268 break;
2269 case GL_PACK_ROW_LENGTH:
2270 *params = mPack.rowLength;
2271 break;
2272 case GL_PACK_SKIP_ROWS:
2273 *params = mPack.skipRows;
2274 break;
2275 case GL_PACK_SKIP_PIXELS:
2276 *params = mPack.skipPixels;
2277 break;
2278 case GL_UNPACK_ALIGNMENT:
2279 *params = mUnpack.alignment;
2280 break;
2281 case GL_UNPACK_ROW_LENGTH:
2282 *params = mUnpack.rowLength;
2283 break;
2284 case GL_UNPACK_IMAGE_HEIGHT:
2285 *params = mUnpack.imageHeight;
2286 break;
2287 case GL_UNPACK_SKIP_IMAGES:
2288 *params = mUnpack.skipImages;
2289 break;
2290 case GL_UNPACK_SKIP_ROWS:
2291 *params = mUnpack.skipRows;
2292 break;
2293 case GL_UNPACK_SKIP_PIXELS:
2294 *params = mUnpack.skipPixels;
2295 break;
2296 case GL_GENERATE_MIPMAP_HINT:
2297 *params = mGenerateMipmapHint;
2298 break;
2299 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
2300 *params = mFragmentShaderDerivativeHint;
2301 break;
2302 case GL_ACTIVE_TEXTURE:
2303 *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
2304 break;
2305 case GL_STENCIL_FUNC:
2306 *params = mDepthStencil.stencilFunc;
2307 break;
2308 case GL_STENCIL_REF:
2309 *params = mStencilRef;
2310 break;
2311 case GL_STENCIL_VALUE_MASK:
2312 *params = CastMaskValue(context, mDepthStencil.stencilMask);
2313 break;
2314 case GL_STENCIL_BACK_FUNC:
2315 *params = mDepthStencil.stencilBackFunc;
2316 break;
2317 case GL_STENCIL_BACK_REF:
2318 *params = mStencilBackRef;
2319 break;
2320 case GL_STENCIL_BACK_VALUE_MASK:
2321 *params = CastMaskValue(context, mDepthStencil.stencilBackMask);
2322 break;
2323 case GL_STENCIL_FAIL:
2324 *params = mDepthStencil.stencilFail;
2325 break;
2326 case GL_STENCIL_PASS_DEPTH_FAIL:
2327 *params = mDepthStencil.stencilPassDepthFail;
2328 break;
2329 case GL_STENCIL_PASS_DEPTH_PASS:
2330 *params = mDepthStencil.stencilPassDepthPass;
2331 break;
2332 case GL_STENCIL_BACK_FAIL:
2333 *params = mDepthStencil.stencilBackFail;
2334 break;
2335 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
2336 *params = mDepthStencil.stencilBackPassDepthFail;
2337 break;
2338 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
2339 *params = mDepthStencil.stencilBackPassDepthPass;
2340 break;
2341 case GL_DEPTH_FUNC:
2342 *params = mDepthStencil.depthFunc;
2343 break;
2344 case GL_BLEND_SRC_RGB:
2345 *params = mBlend.sourceBlendRGB;
2346 break;
2347 case GL_BLEND_SRC_ALPHA:
2348 *params = mBlend.sourceBlendAlpha;
2349 break;
2350 case GL_BLEND_DST_RGB:
2351 *params = mBlend.destBlendRGB;
2352 break;
2353 case GL_BLEND_DST_ALPHA:
2354 *params = mBlend.destBlendAlpha;
2355 break;
2356 case GL_BLEND_EQUATION_RGB:
2357 *params = mBlend.blendEquationRGB;
2358 break;
2359 case GL_BLEND_EQUATION_ALPHA:
2360 *params = mBlend.blendEquationAlpha;
2361 break;
2362 case GL_STENCIL_WRITEMASK:
2363 *params = CastMaskValue(context, mDepthStencil.stencilWritemask);
2364 break;
2365 case GL_STENCIL_BACK_WRITEMASK:
2366 *params = CastMaskValue(context, mDepthStencil.stencilBackWritemask);
2367 break;
2368 case GL_STENCIL_CLEAR_VALUE:
2369 *params = mStencilClearValue;
2370 break;
2371 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
Jamie Madill690c8eb2018-03-12 15:20:03 -04002372 ANGLE_TRY(mReadFramebuffer->getImplementationColorReadType(
2373 context, reinterpret_cast<GLenum *>(params)));
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002374 break;
2375 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
Jamie Madill690c8eb2018-03-12 15:20:03 -04002376 ANGLE_TRY(mReadFramebuffer->getImplementationColorReadFormat(
2377 context, reinterpret_cast<GLenum *>(params)));
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002378 break;
2379 case GL_SAMPLE_BUFFERS:
2380 case GL_SAMPLES:
Shannon Woods53a94a82014-06-24 15:20:36 -04002381 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002382 Framebuffer *framebuffer = mDrawFramebuffer;
Jamie Madill427064d2018-04-13 16:20:34 -04002383 if (framebuffer->isComplete(context))
Shannon Woods53a94a82014-06-24 15:20:36 -04002384 {
Jamie Madill427064d2018-04-13 16:20:34 -04002385 GLint samples = framebuffer->getSamples(context);
Shannon Woods53a94a82014-06-24 15:20:36 -04002386 switch (pname)
2387 {
Jamie Madilla0016b72017-07-14 14:30:46 -04002388 case GL_SAMPLE_BUFFERS:
Jamie Madille98b1b52018-03-08 09:47:23 -05002389 if (samples != 0)
Jamie Madilla0016b72017-07-14 14:30:46 -04002390 {
2391 *params = 1;
2392 }
2393 else
2394 {
2395 *params = 0;
2396 }
2397 break;
2398 case GL_SAMPLES:
Jamie Madille98b1b52018-03-08 09:47:23 -05002399 *params = samples;
Jamie Madilla0016b72017-07-14 14:30:46 -04002400 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002401 }
2402 }
2403 else
2404 {
2405 *params = 0;
2406 }
2407 }
2408 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002409 case GL_VIEWPORT:
2410 params[0] = mViewport.x;
2411 params[1] = mViewport.y;
2412 params[2] = mViewport.width;
2413 params[3] = mViewport.height;
2414 break;
2415 case GL_SCISSOR_BOX:
2416 params[0] = mScissor.x;
2417 params[1] = mScissor.y;
2418 params[2] = mScissor.width;
2419 params[3] = mScissor.height;
2420 break;
2421 case GL_CULL_FACE_MODE:
2422 *params = ToGLenum(mRasterizer.cullMode);
2423 break;
2424 case GL_FRONT_FACE:
2425 *params = mRasterizer.frontFace;
2426 break;
2427 case GL_RED_BITS:
2428 case GL_GREEN_BITS:
2429 case GL_BLUE_BITS:
2430 case GL_ALPHA_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002431 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002432 Framebuffer *framebuffer = getDrawFramebuffer();
2433 const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002434
2435 if (colorbuffer)
2436 {
2437 switch (pname)
2438 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002439 case GL_RED_BITS:
2440 *params = colorbuffer->getRedSize();
2441 break;
2442 case GL_GREEN_BITS:
2443 *params = colorbuffer->getGreenSize();
2444 break;
2445 case GL_BLUE_BITS:
2446 *params = colorbuffer->getBlueSize();
2447 break;
2448 case GL_ALPHA_BITS:
2449 *params = colorbuffer->getAlphaSize();
2450 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002451 }
2452 }
2453 else
2454 {
2455 *params = 0;
2456 }
2457 }
2458 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002459 case GL_DEPTH_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002460 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002461 const Framebuffer *framebuffer = getDrawFramebuffer();
2462 const FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002463
2464 if (depthbuffer)
2465 {
2466 *params = depthbuffer->getDepthSize();
2467 }
2468 else
2469 {
2470 *params = 0;
2471 }
2472 }
2473 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002474 case GL_STENCIL_BITS:
Shannon Woods53a94a82014-06-24 15:20:36 -04002475 {
Jamie Madill81c2e252017-09-09 23:32:46 -04002476 const Framebuffer *framebuffer = getDrawFramebuffer();
2477 const FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
Shannon Woods53a94a82014-06-24 15:20:36 -04002478
2479 if (stencilbuffer)
2480 {
2481 *params = stencilbuffer->getStencilSize();
2482 }
2483 else
2484 {
2485 *params = 0;
2486 }
2487 }
2488 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002489 case GL_TEXTURE_BINDING_2D:
2490 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2491 *params =
2492 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2D);
2493 break;
2494 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
2495 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2496 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2497 TextureType::Rectangle);
2498 break;
2499 case GL_TEXTURE_BINDING_CUBE_MAP:
2500 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2501 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2502 TextureType::CubeMap);
2503 break;
2504 case GL_TEXTURE_BINDING_3D:
2505 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2506 *params =
2507 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_3D);
2508 break;
2509 case GL_TEXTURE_BINDING_2D_ARRAY:
2510 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2511 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2512 TextureType::_2DArray);
2513 break;
2514 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2515 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2516 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2517 TextureType::_2DMultisample);
2518 break;
Olli Etuahodff32a02018-08-28 14:35:50 +03002519 case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
2520 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2521 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2522 TextureType::_2DMultisampleArray);
2523 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002524 case GL_TEXTURE_BINDING_EXTERNAL_OES:
2525 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2526 *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
2527 TextureType::External);
2528 break;
2529 case GL_UNIFORM_BUFFER_BINDING:
2530 *params = mBoundBuffers[BufferBinding::Uniform].id();
2531 break;
2532 case GL_TRANSFORM_FEEDBACK_BINDING:
2533 *params = mTransformFeedback.id();
2534 break;
2535 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2536 *params = mBoundBuffers[BufferBinding::TransformFeedback].id();
2537 break;
2538 case GL_COPY_READ_BUFFER_BINDING:
2539 *params = mBoundBuffers[BufferBinding::CopyRead].id();
2540 break;
2541 case GL_COPY_WRITE_BUFFER_BINDING:
2542 *params = mBoundBuffers[BufferBinding::CopyWrite].id();
2543 break;
2544 case GL_PIXEL_PACK_BUFFER_BINDING:
2545 *params = mBoundBuffers[BufferBinding::PixelPack].id();
2546 break;
2547 case GL_PIXEL_UNPACK_BUFFER_BINDING:
2548 *params = mBoundBuffers[BufferBinding::PixelUnpack].id();
2549 break;
2550 case GL_READ_BUFFER:
2551 *params = mReadFramebuffer->getReadBufferState();
2552 break;
2553 case GL_SAMPLER_BINDING:
2554 ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
2555 *params = getSamplerId(static_cast<GLuint>(mActiveSampler));
2556 break;
2557 case GL_DEBUG_LOGGED_MESSAGES:
2558 *params = static_cast<GLint>(mDebug.getMessageCount());
2559 break;
2560 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
2561 *params = static_cast<GLint>(mDebug.getNextMessageLength());
2562 break;
2563 case GL_DEBUG_GROUP_STACK_DEPTH:
2564 *params = static_cast<GLint>(mDebug.getGroupStackDepth());
2565 break;
2566 case GL_MULTISAMPLE_EXT:
2567 *params = static_cast<GLint>(mMultiSampling);
2568 break;
2569 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2570 *params = static_cast<GLint>(mSampleAlphaToOne);
2571 break;
2572 case GL_COVERAGE_MODULATION_CHROMIUM:
2573 *params = static_cast<GLint>(mCoverageModulation);
2574 break;
2575 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2576 *params = mBoundBuffers[BufferBinding::AtomicCounter].id();
2577 break;
2578 case GL_SHADER_STORAGE_BUFFER_BINDING:
2579 *params = mBoundBuffers[BufferBinding::ShaderStorage].id();
2580 break;
2581 case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
2582 *params = mBoundBuffers[BufferBinding::DispatchIndirect].id();
2583 break;
Lingfeng Yang13b708f2018-03-21 12:14:10 -07002584 case GL_ALPHA_TEST_FUNC:
2585 *params = ToGLenum(mGLES1State.mAlphaTestFunc);
2586 break;
Lingfeng Yang96310cd2018-03-28 11:56:28 -07002587 case GL_CLIENT_ACTIVE_TEXTURE:
2588 *params = mGLES1State.mClientActiveTexture + GL_TEXTURE0;
2589 break;
Lingfeng Yangd2488ab2018-04-04 09:25:48 -07002590 case GL_MATRIX_MODE:
2591 *params = ToGLenum(mGLES1State.mMatrixMode);
2592 break;
Lingfeng Yanga0cfa872018-05-30 21:12:17 -07002593 case GL_SHADE_MODEL:
2594 *params = ToGLenum(mGLES1State.mShadeModel);
2595 break;
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07002596 case GL_MODELVIEW_STACK_DEPTH:
2597 case GL_PROJECTION_STACK_DEPTH:
2598 case GL_TEXTURE_STACK_DEPTH:
2599 *params = mGLES1State.getCurrentMatrixStackDepth(pname);
2600 break;
2601 case GL_LOGIC_OP_MODE:
2602 *params = ToGLenum(mGLES1State.mLogicOp);
2603 break;
2604 case GL_BLEND_SRC:
2605 *params = mBlend.sourceBlendRGB;
2606 break;
2607 case GL_BLEND_DST:
2608 *params = mBlend.destBlendRGB;
2609 break;
2610 case GL_PERSPECTIVE_CORRECTION_HINT:
2611 case GL_POINT_SMOOTH_HINT:
2612 case GL_LINE_SMOOTH_HINT:
2613 case GL_FOG_HINT:
2614 *params = mGLES1State.getHint(pname);
2615 break;
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002616 default:
2617 UNREACHABLE();
2618 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002619 }
Jamie Madille98b1b52018-03-08 09:47:23 -05002620
2621 return NoError();
Shannon Woods53a94a82014-06-24 15:20:36 -04002622}
2623
Lingfeng Yangabb09f12018-04-16 10:43:53 -07002624void State::getPointerv(const Context *context, GLenum pname, void **params) const
Geoff Lang70d0f492015-12-10 17:45:46 -05002625{
2626 switch (pname)
2627 {
2628 case GL_DEBUG_CALLBACK_FUNCTION:
2629 *params = reinterpret_cast<void *>(mDebug.getCallback());
2630 break;
2631 case GL_DEBUG_CALLBACK_USER_PARAM:
2632 *params = const_cast<void *>(mDebug.getUserParam());
2633 break;
Lingfeng Yangabb09f12018-04-16 10:43:53 -07002634 case GL_VERTEX_ARRAY_POINTER:
2635 case GL_NORMAL_ARRAY_POINTER:
2636 case GL_COLOR_ARRAY_POINTER:
2637 case GL_TEXTURE_COORD_ARRAY_POINTER:
2638 case GL_POINT_SIZE_ARRAY_POINTER_OES:
2639 QueryVertexAttribPointerv(getVertexArray()->getVertexAttribute(
2640 context->vertexArrayIndex(ParamToVertexArrayType(pname))),
2641 GL_VERTEX_ATTRIB_ARRAY_POINTER, params);
2642 return;
Geoff Lang70d0f492015-12-10 17:45:46 -05002643 default:
2644 UNREACHABLE();
2645 break;
2646 }
2647}
2648
Martin Radev66fb8202016-07-28 11:45:20 +03002649void State::getIntegeri_v(GLenum target, GLuint index, GLint *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002650{
2651 switch (target)
2652 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002653 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2654 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2655 *data = mTransformFeedback->getIndexedBuffer(index).id();
2656 break;
2657 case GL_UNIFORM_BUFFER_BINDING:
2658 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2659 *data = mUniformBuffers[index].id();
2660 break;
2661 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2662 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2663 *data = mAtomicCounterBuffers[index].id();
2664 break;
2665 case GL_SHADER_STORAGE_BUFFER_BINDING:
2666 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2667 *data = mShaderStorageBuffers[index].id();
2668 break;
2669 case GL_VERTEX_BINDING_BUFFER:
2670 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2671 *data = mVertexArray->getVertexBinding(index).getBuffer().id();
2672 break;
2673 case GL_VERTEX_BINDING_DIVISOR:
2674 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2675 *data = mVertexArray->getVertexBinding(index).getDivisor();
2676 break;
2677 case GL_VERTEX_BINDING_OFFSET:
2678 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2679 *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
2680 break;
2681 case GL_VERTEX_BINDING_STRIDE:
2682 ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
2683 *data = mVertexArray->getVertexBinding(index).getStride();
2684 break;
2685 case GL_SAMPLE_MASK_VALUE:
2686 ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2687 *data = mSampleMaskValues[index];
2688 break;
2689 case GL_IMAGE_BINDING_NAME:
2690 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2691 *data = mImageUnits[index].texture.id();
2692 break;
2693 case GL_IMAGE_BINDING_LEVEL:
2694 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2695 *data = mImageUnits[index].level;
2696 break;
2697 case GL_IMAGE_BINDING_LAYER:
2698 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2699 *data = mImageUnits[index].layer;
2700 break;
2701 case GL_IMAGE_BINDING_ACCESS:
2702 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2703 *data = mImageUnits[index].access;
2704 break;
2705 case GL_IMAGE_BINDING_FORMAT:
2706 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2707 *data = mImageUnits[index].format;
2708 break;
2709 default:
2710 UNREACHABLE();
2711 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002712 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002713}
2714
Martin Radev66fb8202016-07-28 11:45:20 +03002715void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data)
Shannon Woods53a94a82014-06-24 15:20:36 -04002716{
2717 switch (target)
2718 {
Lingfeng Yang54ef3ad2018-03-12 08:31:12 -07002719 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
2720 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2721 *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
2722 break;
2723 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
2724 ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
2725 *data = mTransformFeedback->getIndexedBuffer(index).getSize();
2726 break;
2727 case GL_UNIFORM_BUFFER_START:
2728 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2729 *data = mUniformBuffers[index].getOffset();
2730 break;
2731 case GL_UNIFORM_BUFFER_SIZE:
2732 ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
2733 *data = mUniformBuffers[index].getSize();
2734 break;
2735 case GL_ATOMIC_COUNTER_BUFFER_START:
2736 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2737 *data = mAtomicCounterBuffers[index].getOffset();
2738 break;
2739 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2740 ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
2741 *data = mAtomicCounterBuffers[index].getSize();
2742 break;
2743 case GL_SHADER_STORAGE_BUFFER_START:
2744 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2745 *data = mShaderStorageBuffers[index].getOffset();
2746 break;
2747 case GL_SHADER_STORAGE_BUFFER_SIZE:
2748 ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
2749 *data = mShaderStorageBuffers[index].getSize();
2750 break;
2751 default:
2752 UNREACHABLE();
2753 break;
Shannon Woods53a94a82014-06-24 15:20:36 -04002754 }
Martin Radev66fb8202016-07-28 11:45:20 +03002755}
Shannon Woods53a94a82014-06-24 15:20:36 -04002756
Martin Radev66fb8202016-07-28 11:45:20 +03002757void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data)
2758{
Xinghua Cao9c8e1a32017-12-06 17:59:58 +08002759 switch (target)
2760 {
2761 case GL_IMAGE_BINDING_LAYERED:
2762 ASSERT(static_cast<size_t>(index) < mImageUnits.size());
2763 *data = mImageUnits[index].layered;
2764 break;
2765 default:
2766 UNREACHABLE();
2767 break;
2768 }
Shannon Woods53a94a82014-06-24 15:20:36 -04002769}
2770
Jamie Madill6f755b22018-10-09 12:48:54 -04002771angle::Result State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002772{
Jiajia Qin5ae6ee42018-03-06 17:39:42 +08002773 const DirtyObjects &dirtyObjects = mDirtyObjects & bitset;
2774 for (auto dirtyObject : dirtyObjects)
Jamie Madillc9d442d2016-01-20 11:17:24 -05002775 {
2776 switch (dirtyObject)
2777 {
2778 case DIRTY_OBJECT_READ_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002779 ASSERT(mReadFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002780 ANGLE_TRY(mReadFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002781 break;
2782 case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002783 ASSERT(mDrawFramebuffer);
Jamie Madill19fa1c62018-03-08 09:47:21 -05002784 ANGLE_TRY(mDrawFramebuffer->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002785 break;
2786 case DIRTY_OBJECT_VERTEX_ARRAY:
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002787 ASSERT(mVertexArray);
Frank Henigman0af5b862018-03-27 20:19:33 -04002788 ANGLE_TRY(mVertexArray->syncState(context));
Jamie Madillc9d442d2016-01-20 11:17:24 -05002789 break;
Jamie Madille25b8002018-09-20 13:39:49 -04002790 case DIRTY_OBJECT_SAMPLERS:
2791 syncSamplers(context);
2792 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002793 case DIRTY_OBJECT_PROGRAM_TEXTURES:
Luc Ferron4bba74f2018-04-19 14:40:45 -04002794 ANGLE_TRY(syncProgramTextures(context));
Jamie Madill81c2e252017-09-09 23:32:46 -04002795 break;
Jamie Madill70aeda42018-08-20 12:17:40 -04002796 case DIRTY_OBJECT_PROGRAM:
2797 ANGLE_TRY(mProgram->syncState(context));
2798 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002799
Jamie Madillc9d442d2016-01-20 11:17:24 -05002800 default:
2801 UNREACHABLE();
2802 break;
2803 }
2804 }
2805
Jiajia Qin5ae6ee42018-03-06 17:39:42 +08002806 mDirtyObjects &= ~dirtyObjects;
Jamie Madill6f755b22018-10-09 12:48:54 -04002807 return angle::Result::Continue();
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002808}
2809
Jamie Madille25b8002018-09-20 13:39:49 -04002810void State::syncSamplers(const Context *context)
2811{
2812 if (mDirtySamplers.none())
2813 return;
2814
2815 // This could be optimized by tracking which samplers are dirty.
2816 for (size_t samplerIndex : mDirtySamplers)
2817 {
2818 BindingPointer<Sampler> &sampler = mSamplers[samplerIndex];
2819 if (sampler.get())
2820 {
2821 sampler->syncState(context);
2822 }
2823 }
2824
2825 mDirtySamplers.reset();
2826}
2827
Jamie Madill6f755b22018-10-09 12:48:54 -04002828angle::Result State::syncProgramTextures(const Context *context)
Jamie Madill81c2e252017-09-09 23:32:46 -04002829{
Jamie Madill81c2e252017-09-09 23:32:46 -04002830 // TODO(jmadill): Fine-grained updates.
2831 if (!mProgram)
2832 {
Jamie Madill6f755b22018-10-09 12:48:54 -04002833 return angle::Result::Continue();
Jamie Madill81c2e252017-09-09 23:32:46 -04002834 }
2835
2836 ASSERT(mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
2837 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2838
Jamie Madill0f80ed82017-09-19 00:24:56 -04002839 ActiveTextureMask newActiveTextures;
2840
Geoff Lange51ba632017-11-21 11:45:25 -05002841 // Initialize to the 'Initialized' state and set to 'MayNeedInit' if any texture is not
2842 // initialized.
Yizhou Jiang7818a852018-09-06 15:02:04 +08002843 mCachedTexturesInitState = InitState::Initialized;
Qin Jiajia47f6dd02018-08-10 13:36:32 +08002844 mCachedImageTexturesInitState = InitState::Initialized;
Geoff Lange51ba632017-11-21 11:45:25 -05002845
Jamie Madill7e4eff12018-08-08 15:49:26 -04002846 const ActiveTextureMask &activeTextures = mProgram->getActiveSamplersMask();
2847 const ActiveTextureArray<TextureType> &textureTypes = mProgram->getActiveSamplerTypes();
2848
2849 for (size_t textureUnitIndex : activeTextures)
Jamie Madill81c2e252017-09-09 23:32:46 -04002850 {
Jamie Madill7e4eff12018-08-08 15:49:26 -04002851 TextureType textureType = textureTypes[textureUnitIndex];
Jamie Madill81c2e252017-09-09 23:32:46 -04002852
jchen1090f466a2018-08-13 15:05:25 +08002853 Texture *texture =
2854 getSamplerTexture(static_cast<unsigned int>(textureUnitIndex), textureType);
Jamie Madill7e4eff12018-08-08 15:49:26 -04002855 ASSERT(static_cast<size_t>(textureUnitIndex) < newActiveTextures.size());
2856
2857 ASSERT(texture);
2858
Jamie Madill7e4eff12018-08-08 15:49:26 -04002859 newActiveTextures.set(textureUnitIndex);
Jamie Madille3bb6b72018-10-03 17:51:15 -04002860 ANGLE_TRY(updateActiveTexture(context, textureUnitIndex, texture));
Jamie Madill81c2e252017-09-09 23:32:46 -04002861 }
Jamie Madill0f80ed82017-09-19 00:24:56 -04002862
2863 // Unset now missing textures.
Jamie Madill7e4eff12018-08-08 15:49:26 -04002864 ActiveTextureMask negativeMask = activeTextures & ~newActiveTextures;
Jamie Madill0f80ed82017-09-19 00:24:56 -04002865 if (negativeMask.any())
2866 {
Jamie Madille3bb6b72018-10-03 17:51:15 -04002867 unsetActiveTextures(negativeMask);
Jamie Madill0f80ed82017-09-19 00:24:56 -04002868 }
Luc Ferron4bba74f2018-04-19 14:40:45 -04002869
Qin Jiajia47f6dd02018-08-10 13:36:32 +08002870 for (size_t imageUnitIndex : mProgram->getActiveImagesMask())
2871 {
2872 Texture *texture = mImageUnits[imageUnitIndex].texture.get();
2873 if (!texture)
2874 {
2875 continue;
2876 }
Jamie Madillf668a4b2018-09-23 17:01:20 -04002877 if (texture->hasAnyDirtyBit())
2878 {
2879 ANGLE_TRY(texture->syncState(context));
2880 }
Qin Jiajia47f6dd02018-08-10 13:36:32 +08002881 if (texture->initState() == InitState::MayNeedInit)
2882 {
2883 mCachedImageTexturesInitState = InitState::MayNeedInit;
2884 }
2885 }
2886
Jamie Madill6f755b22018-10-09 12:48:54 -04002887 return angle::Result::Continue();
Jamie Madill81c2e252017-09-09 23:32:46 -04002888}
2889
Jamie Madill6f755b22018-10-09 12:48:54 -04002890angle::Result State::syncDirtyObject(const Context *context, GLenum target)
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002891{
2892 DirtyObjects localSet;
2893
2894 switch (target)
2895 {
2896 case GL_READ_FRAMEBUFFER:
2897 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2898 break;
2899 case GL_DRAW_FRAMEBUFFER:
2900 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2901 break;
2902 case GL_FRAMEBUFFER:
2903 localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2904 localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2905 break;
2906 case GL_VERTEX_ARRAY:
2907 localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
2908 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002909 case GL_TEXTURE:
Jamie Madille25b8002018-09-20 13:39:49 -04002910 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2911 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002912 case GL_SAMPLER:
Jamie Madill70aeda42018-08-20 12:17:40 -04002913 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madille25b8002018-09-20 13:39:49 -04002914 localSet.set(DIRTY_OBJECT_SAMPLERS);
Jamie Madill70aeda42018-08-20 12:17:40 -04002915 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002916 case GL_PROGRAM:
2917 localSet.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -04002918 localSet.set(DIRTY_OBJECT_PROGRAM);
Jamie Madill81c2e252017-09-09 23:32:46 -04002919 break;
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002920 }
2921
Jamie Madillbc918e72018-03-08 09:47:21 -05002922 return syncDirtyObjects(context, localSet);
Jamie Madill60ec6ea2016-01-22 15:27:19 -05002923}
2924
2925void State::setObjectDirty(GLenum target)
2926{
2927 switch (target)
2928 {
2929 case GL_READ_FRAMEBUFFER:
2930 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2931 break;
2932 case GL_DRAW_FRAMEBUFFER:
2933 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2934 break;
2935 case GL_FRAMEBUFFER:
2936 mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
2937 mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2938 break;
2939 case GL_VERTEX_ARRAY:
2940 mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
2941 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002942 case GL_TEXTURE:
Jamie Madill70aeda42018-08-20 12:17:40 -04002943 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
2944 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2945 break;
Jamie Madill81c2e252017-09-09 23:32:46 -04002946 case GL_PROGRAM:
2947 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Jamie Madill70aeda42018-08-20 12:17:40 -04002948 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
Jamie Madill81c2e252017-09-09 23:32:46 -04002949 mDirtyBits.set(DIRTY_BIT_TEXTURE_BINDINGS);
2950 break;
Jamie Madilla779b612017-07-24 11:46:05 -04002951 }
2952}
2953
Jamie Madill6f755b22018-10-09 12:48:54 -04002954angle::Result State::onProgramExecutableChange(const Context *context, Program *program)
Jamie Madilla779b612017-07-24 11:46:05 -04002955{
2956 // OpenGL Spec:
2957 // "If LinkProgram or ProgramBinary successfully re-links a program object
2958 // that was already in use as a result of a previous call to UseProgram, then the
2959 // generated executable code will be installed as part of the current rendering state."
Jamie Madilldf836ff2018-10-01 10:36:24 -04002960 ASSERT(program->isLinked());
2961
2962 mDirtyBits.set(DIRTY_BIT_PROGRAM_EXECUTABLE);
Jamie Madill956ab4d2018-10-10 16:13:03 -04002963
2964 if (program->hasAnyDirtyBit())
2965 {
2966 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
2967 }
Jamie Madille3bb6b72018-10-03 17:51:15 -04002968
2969 // Set any bound textures.
2970 const ActiveTextureTypeArray &textureTypes = program->getActiveSamplerTypes();
2971 for (size_t textureIndex : program->getActiveSamplersMask())
2972 {
2973 TextureType type = textureTypes[textureIndex];
2974
2975 // This can happen if there is a conflicting texture type.
2976 if (type == TextureType::InvalidEnum)
2977 continue;
2978
2979 Texture *texture = mSamplerTextures[type][textureIndex].get();
2980 ANGLE_TRY(updateActiveTexture(context, textureIndex, texture));
2981 }
2982
2983 for (size_t imageUnitIndex : program->getActiveImagesMask())
2984 {
2985 Texture *image = mImageUnits[imageUnitIndex].texture.get();
2986 if (!image)
2987 continue;
2988
2989 if (image->hasAnyDirtyBit())
2990 {
2991 ANGLE_TRY(image->syncState(context));
2992 }
2993
2994 if (image->initState() == InitState::MayNeedInit)
2995 {
2996 mCachedImageTexturesInitState = InitState::MayNeedInit;
2997 }
2998 }
2999
Jamie Madill6f755b22018-10-09 12:48:54 -04003000 return angle::Result::Continue();
Shannon Woods53a94a82014-06-24 15:20:36 -04003001}
Jamie Madillc9d442d2016-01-20 11:17:24 -05003002
Jamie Madille25b8002018-09-20 13:39:49 -04003003void State::setSamplerDirty(size_t samplerIndex)
3004{
3005 mDirtyObjects.set(DIRTY_OBJECT_SAMPLERS);
3006 mDirtySamplers.set(samplerIndex);
3007}
3008
Xinghua Cao65ec0b22017-03-28 16:10:52 +08003009void State::setImageUnit(const Context *context,
Will Harris63aa0e52018-09-05 16:15:46 -07003010 size_t unit,
Xinghua Cao65ec0b22017-03-28 16:10:52 +08003011 Texture *texture,
3012 GLint level,
3013 GLboolean layered,
3014 GLint layer,
3015 GLenum access,
3016 GLenum format)
3017{
3018 mImageUnits[unit].texture.set(context, texture);
3019 mImageUnits[unit].level = level;
3020 mImageUnits[unit].layered = layered;
3021 mImageUnits[unit].layer = layer;
3022 mImageUnits[unit].access = access;
3023 mImageUnits[unit].format = format;
jchen1099118c12018-09-10 16:28:51 +08003024 mDirtyBits.set(DIRTY_BIT_IMAGE_BINDINGS);
Xinghua Cao65ec0b22017-03-28 16:10:52 +08003025}
3026
Will Harris63aa0e52018-09-05 16:15:46 -07003027const ImageUnit &State::getImageUnit(size_t unit) const
Xinghua Cao65ec0b22017-03-28 16:10:52 +08003028{
3029 return mImageUnits[unit];
3030}
3031
Jamie Madill81c2e252017-09-09 23:32:46 -04003032// Handle a dirty texture event.
Jamie Madill6c43a012018-08-08 15:49:27 -04003033void State::onActiveTextureStateChange(size_t textureIndex)
Jamie Madill81c2e252017-09-09 23:32:46 -04003034{
3035 // Conservatively assume all textures are dirty.
3036 // TODO(jmadill): More fine-grained update.
3037 mDirtyObjects.set(DIRTY_OBJECT_PROGRAM_TEXTURES);
Geoff Lange51ba632017-11-21 11:45:25 -05003038
Jamie Madill6c43a012018-08-08 15:49:27 -04003039 if (!mActiveTexturesCache[textureIndex] ||
3040 mActiveTexturesCache[textureIndex]->initState() == InitState::MayNeedInit)
Geoff Lange51ba632017-11-21 11:45:25 -05003041 {
3042 mCachedTexturesInitState = InitState::MayNeedInit;
3043 }
Jamie Madill81c2e252017-09-09 23:32:46 -04003044}
3045
Jamie Madill6d32cef2018-08-14 02:34:28 -04003046void State::onUniformBufferStateChange(size_t uniformBufferIndex)
3047{
3048 // This could be represented by a different dirty bit. Using the same one keeps it simple.
3049 mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
3050}
3051
Jamie Madill6f755b22018-10-09 12:48:54 -04003052angle::Result State::clearUnclearedActiveTextures(const Context *context)
Jamie Madill05b35b22017-10-03 09:01:44 -04003053{
Jamie Madilla59fc192017-11-02 12:57:58 -04003054 ASSERT(mRobustResourceInit);
Geoff Lang9bf86f02018-07-26 11:46:34 -04003055 ASSERT(!mDirtyObjects[DIRTY_OBJECT_PROGRAM_TEXTURES]);
Geoff Langd4fff502017-09-22 11:28:28 -04003056
Jamie Madill7e4eff12018-08-08 15:49:26 -04003057 if (!mProgram)
Jamie Madill6f755b22018-10-09 12:48:54 -04003058 return angle::Result::Continue();
Jamie Madill7e4eff12018-08-08 15:49:26 -04003059
Qin Jiajia47f6dd02018-08-10 13:36:32 +08003060 if (mCachedTexturesInitState != InitState::Initialized)
Jamie Madill05b35b22017-10-03 09:01:44 -04003061 {
Qin Jiajia47f6dd02018-08-10 13:36:32 +08003062 for (size_t textureUnitIndex : mProgram->getActiveSamplersMask())
Jamie Madill05b35b22017-10-03 09:01:44 -04003063 {
Qin Jiajia47f6dd02018-08-10 13:36:32 +08003064 Texture *texture = mActiveTexturesCache[textureUnitIndex];
3065 if (texture)
3066 {
3067 ANGLE_TRY(texture->ensureInitialized(context));
3068 }
Jamie Madill05b35b22017-10-03 09:01:44 -04003069 }
Qin Jiajia47f6dd02018-08-10 13:36:32 +08003070 mCachedTexturesInitState = InitState::Initialized;
Jamie Madill05b35b22017-10-03 09:01:44 -04003071 }
Qin Jiajia47f6dd02018-08-10 13:36:32 +08003072 if (mCachedImageTexturesInitState != InitState::Initialized)
3073 {
3074 for (size_t imageUnitIndex : mProgram->getActiveImagesMask())
3075 {
3076 Texture *texture = mImageUnits[imageUnitIndex].texture.get();
3077 if (texture)
3078 {
3079 ANGLE_TRY(texture->ensureInitialized(context));
3080 }
3081 }
3082 mCachedImageTexturesInitState = InitState::Initialized;
3083 }
Jamie Madill6f755b22018-10-09 12:48:54 -04003084 return angle::Result::Continue();
Jamie Madill05b35b22017-10-03 09:01:44 -04003085}
3086
Jamie Madillc67323a2017-11-02 23:11:41 -04003087AttributesMask State::getAndResetDirtyCurrentValues() const
3088{
3089 AttributesMask retVal = mDirtyCurrentValues;
3090 mDirtyCurrentValues.reset();
3091 return retVal;
3092}
3093
James Darpiniane8a93c62018-01-04 18:02:24 -08003094bool State::isCurrentTransformFeedback(const TransformFeedback *tf) const
3095{
3096 return tf == mTransformFeedback.get();
3097}
Jamie Madillc9d442d2016-01-20 11:17:24 -05003098} // namespace gl