xref: /aosp_15_r20/external/angle/src/libANGLE/State.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // State.cpp: Implements the State class, encapsulating raw GL state.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/State.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include <string.h>
12*8975f5c5SAndroid Build Coastguard Worker #include <limits>
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "common/bitset_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "common/matrix_utils.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Buffer.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Caps.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Debug.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Framebuffer.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/FramebufferAttachment.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/PixelLocalStorage.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Query.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/VertexArray.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
27*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/queryconversions.h"
28*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/queryutils.h"
29*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ContextImpl.h"
30*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/TextureImpl.h"
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker namespace gl
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker namespace
36*8975f5c5SAndroid Build Coastguard Worker {
GetAlternativeQueryType(QueryType type,QueryType * alternativeType)37*8975f5c5SAndroid Build Coastguard Worker bool GetAlternativeQueryType(QueryType type, QueryType *alternativeType)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker     switch (type)
40*8975f5c5SAndroid Build Coastguard Worker     {
41*8975f5c5SAndroid Build Coastguard Worker         case QueryType::AnySamples:
42*8975f5c5SAndroid Build Coastguard Worker             *alternativeType = QueryType::AnySamplesConservative;
43*8975f5c5SAndroid Build Coastguard Worker             return true;
44*8975f5c5SAndroid Build Coastguard Worker         case QueryType::AnySamplesConservative:
45*8975f5c5SAndroid Build Coastguard Worker             *alternativeType = QueryType::AnySamples;
46*8975f5c5SAndroid Build Coastguard Worker             return true;
47*8975f5c5SAndroid Build Coastguard Worker         default:
48*8975f5c5SAndroid Build Coastguard Worker             return false;
49*8975f5c5SAndroid Build Coastguard Worker     }
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker // Mapping from a buffer binding type to a dirty bit type.
53*8975f5c5SAndroid Build Coastguard Worker constexpr angle::PackedEnumMap<BufferBinding, size_t> kBufferBindingDirtyBits = {{
54*8975f5c5SAndroid Build Coastguard Worker     {BufferBinding::AtomicCounter, state::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING},
55*8975f5c5SAndroid Build Coastguard Worker     {BufferBinding::DispatchIndirect, state::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING},
56*8975f5c5SAndroid Build Coastguard Worker     {BufferBinding::DrawIndirect, state::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING},
57*8975f5c5SAndroid Build Coastguard Worker     {BufferBinding::PixelPack, state::DIRTY_BIT_PACK_BUFFER_BINDING},
58*8975f5c5SAndroid Build Coastguard Worker     {BufferBinding::PixelUnpack, state::DIRTY_BIT_UNPACK_BUFFER_BINDING},
59*8975f5c5SAndroid Build Coastguard Worker     {BufferBinding::ShaderStorage, state::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING},
60*8975f5c5SAndroid Build Coastguard Worker     {BufferBinding::Uniform, state::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS},
61*8975f5c5SAndroid Build Coastguard Worker }};
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker // Returns a buffer binding function depending on if a dirty bit is set.
64*8975f5c5SAndroid Build Coastguard Worker template <BufferBinding Target>
GetBufferBindingSetter()65*8975f5c5SAndroid Build Coastguard Worker constexpr std::pair<BufferBinding, State::BufferBindingSetter> GetBufferBindingSetter()
66*8975f5c5SAndroid Build Coastguard Worker {
67*8975f5c5SAndroid Build Coastguard Worker     return std::make_pair(Target, kBufferBindingDirtyBits[Target] != 0
68*8975f5c5SAndroid Build Coastguard Worker                                       ? &State::setGenericBufferBindingWithBit<Target>
69*8975f5c5SAndroid Build Coastguard Worker                                       : &State::setGenericBufferBinding<Target>);
70*8975f5c5SAndroid Build Coastguard Worker }
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker template <typename T>
73*8975f5c5SAndroid Build Coastguard Worker using ContextStateMember = T *(State::*);
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker template <typename T>
AllocateOrGetSharedResourceManager(const State * shareContextState,ContextStateMember<T> member,T * shareResources=nullptr)76*8975f5c5SAndroid Build Coastguard Worker T *AllocateOrGetSharedResourceManager(const State *shareContextState,
77*8975f5c5SAndroid Build Coastguard Worker                                       ContextStateMember<T> member,
78*8975f5c5SAndroid Build Coastguard Worker                                       T *shareResources = nullptr)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker     if (shareContextState)
81*8975f5c5SAndroid Build Coastguard Worker     {
82*8975f5c5SAndroid Build Coastguard Worker         T *resourceManager = (*shareContextState).*member;
83*8975f5c5SAndroid Build Coastguard Worker         ASSERT(!resourceManager || resourceManager == shareResources || !shareResources);
84*8975f5c5SAndroid Build Coastguard Worker         resourceManager->addRef();
85*8975f5c5SAndroid Build Coastguard Worker         return resourceManager;
86*8975f5c5SAndroid Build Coastguard Worker     }
87*8975f5c5SAndroid Build Coastguard Worker     else if (shareResources)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         shareResources->addRef();
90*8975f5c5SAndroid Build Coastguard Worker         return shareResources;
91*8975f5c5SAndroid Build Coastguard Worker     }
92*8975f5c5SAndroid Build Coastguard Worker     else
93*8975f5c5SAndroid Build Coastguard Worker     {
94*8975f5c5SAndroid Build Coastguard Worker         return new T();
95*8975f5c5SAndroid Build Coastguard Worker     }
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker // TODO(https://anglebug.com/42262534): Remove this helper function after blink and chromium part
99*8975f5c5SAndroid Build Coastguard Worker // refactory done.
IsTextureCompatibleWithSampler(TextureType texture,TextureType sampler)100*8975f5c5SAndroid Build Coastguard Worker bool IsTextureCompatibleWithSampler(TextureType texture, TextureType sampler)
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     if (sampler == texture)
103*8975f5c5SAndroid Build Coastguard Worker     {
104*8975f5c5SAndroid Build Coastguard Worker         return true;
105*8975f5c5SAndroid Build Coastguard Worker     }
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker     if (sampler == TextureType::VideoImage)
108*8975f5c5SAndroid Build Coastguard Worker     {
109*8975f5c5SAndroid Build Coastguard Worker         if (texture == TextureType::VideoImage || texture == TextureType::_2D)
110*8975f5c5SAndroid Build Coastguard Worker         {
111*8975f5c5SAndroid Build Coastguard Worker             return true;
112*8975f5c5SAndroid Build Coastguard Worker         }
113*8975f5c5SAndroid Build Coastguard Worker     }
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     return false;
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker uint32_t gIDCounter = 1;
119*8975f5c5SAndroid Build Coastguard Worker }  // namespace
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker template <typename BindingT, typename... ArgsT>
UpdateNonTFBufferBindingWebGL(const Context * context,BindingT * binding,Buffer * buffer,ArgsT...args)122*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void UpdateNonTFBufferBindingWebGL(const Context *context,
123*8975f5c5SAndroid Build Coastguard Worker                                                 BindingT *binding,
124*8975f5c5SAndroid Build Coastguard Worker                                                 Buffer *buffer,
125*8975f5c5SAndroid Build Coastguard Worker                                                 ArgsT... args)
126*8975f5c5SAndroid Build Coastguard Worker {
127*8975f5c5SAndroid Build Coastguard Worker     Buffer *oldBuffer = binding->get();
128*8975f5c5SAndroid Build Coastguard Worker     if (oldBuffer)
129*8975f5c5SAndroid Build Coastguard Worker     {
130*8975f5c5SAndroid Build Coastguard Worker         oldBuffer->onNonTFBindingChanged(-1);
131*8975f5c5SAndroid Build Coastguard Worker         oldBuffer->release(context);
132*8975f5c5SAndroid Build Coastguard Worker     }
133*8975f5c5SAndroid Build Coastguard Worker     binding->assign(buffer, args...);
134*8975f5c5SAndroid Build Coastguard Worker     if (buffer)
135*8975f5c5SAndroid Build Coastguard Worker     {
136*8975f5c5SAndroid Build Coastguard Worker         buffer->addRef();
137*8975f5c5SAndroid Build Coastguard Worker         buffer->onNonTFBindingChanged(1);
138*8975f5c5SAndroid Build Coastguard Worker     }
139*8975f5c5SAndroid Build Coastguard Worker }
140*8975f5c5SAndroid Build Coastguard Worker 
141*8975f5c5SAndroid Build Coastguard Worker template <typename BindingT, typename... ArgsT>
UpdateTFBufferBindingWebGL(const Context * context,BindingT * binding,bool indexed,ArgsT...args)142*8975f5c5SAndroid Build Coastguard Worker void UpdateTFBufferBindingWebGL(const Context *context,
143*8975f5c5SAndroid Build Coastguard Worker                                 BindingT *binding,
144*8975f5c5SAndroid Build Coastguard Worker                                 bool indexed,
145*8975f5c5SAndroid Build Coastguard Worker                                 ArgsT... args)
146*8975f5c5SAndroid Build Coastguard Worker {
147*8975f5c5SAndroid Build Coastguard Worker     if (binding->get())
148*8975f5c5SAndroid Build Coastguard Worker         (*binding)->onTFBindingChanged(context, false, indexed);
149*8975f5c5SAndroid Build Coastguard Worker     binding->set(context, args...);
150*8975f5c5SAndroid Build Coastguard Worker     if (binding->get())
151*8975f5c5SAndroid Build Coastguard Worker         (*binding)->onTFBindingChanged(context, true, indexed);
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker 
UpdateBufferBinding(const Context * context,BindingPointer<Buffer> * binding,Buffer * buffer,BufferBinding target)154*8975f5c5SAndroid Build Coastguard Worker void UpdateBufferBinding(const Context *context,
155*8975f5c5SAndroid Build Coastguard Worker                          BindingPointer<Buffer> *binding,
156*8975f5c5SAndroid Build Coastguard Worker                          Buffer *buffer,
157*8975f5c5SAndroid Build Coastguard Worker                          BufferBinding target)
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker     if (context->isWebGL())
160*8975f5c5SAndroid Build Coastguard Worker     {
161*8975f5c5SAndroid Build Coastguard Worker         if (target == BufferBinding::TransformFeedback)
162*8975f5c5SAndroid Build Coastguard Worker         {
163*8975f5c5SAndroid Build Coastguard Worker             UpdateTFBufferBindingWebGL(context, binding, false, buffer);
164*8975f5c5SAndroid Build Coastguard Worker         }
165*8975f5c5SAndroid Build Coastguard Worker         else
166*8975f5c5SAndroid Build Coastguard Worker         {
167*8975f5c5SAndroid Build Coastguard Worker             UpdateNonTFBufferBindingWebGL(context, binding, buffer);
168*8975f5c5SAndroid Build Coastguard Worker         }
169*8975f5c5SAndroid Build Coastguard Worker     }
170*8975f5c5SAndroid Build Coastguard Worker     else
171*8975f5c5SAndroid Build Coastguard Worker     {
172*8975f5c5SAndroid Build Coastguard Worker         binding->set(context, buffer);
173*8975f5c5SAndroid Build Coastguard Worker     }
174*8975f5c5SAndroid Build Coastguard Worker }
175*8975f5c5SAndroid Build Coastguard Worker 
UpdateIndexedBufferBinding(const Context * context,OffsetBindingPointer<Buffer> * binding,Buffer * buffer,BufferBinding target,GLintptr offset,GLsizeiptr size)176*8975f5c5SAndroid Build Coastguard Worker void UpdateIndexedBufferBinding(const Context *context,
177*8975f5c5SAndroid Build Coastguard Worker                                 OffsetBindingPointer<Buffer> *binding,
178*8975f5c5SAndroid Build Coastguard Worker                                 Buffer *buffer,
179*8975f5c5SAndroid Build Coastguard Worker                                 BufferBinding target,
180*8975f5c5SAndroid Build Coastguard Worker                                 GLintptr offset,
181*8975f5c5SAndroid Build Coastguard Worker                                 GLsizeiptr size)
182*8975f5c5SAndroid Build Coastguard Worker {
183*8975f5c5SAndroid Build Coastguard Worker     if (context->isWebGL())
184*8975f5c5SAndroid Build Coastguard Worker     {
185*8975f5c5SAndroid Build Coastguard Worker         if (target == BufferBinding::TransformFeedback)
186*8975f5c5SAndroid Build Coastguard Worker         {
187*8975f5c5SAndroid Build Coastguard Worker             UpdateTFBufferBindingWebGL(context, binding, true, buffer, offset, size);
188*8975f5c5SAndroid Build Coastguard Worker         }
189*8975f5c5SAndroid Build Coastguard Worker         else
190*8975f5c5SAndroid Build Coastguard Worker         {
191*8975f5c5SAndroid Build Coastguard Worker             UpdateNonTFBufferBindingWebGL(context, binding, buffer, offset, size);
192*8975f5c5SAndroid Build Coastguard Worker         }
193*8975f5c5SAndroid Build Coastguard Worker     }
194*8975f5c5SAndroid Build Coastguard Worker     else
195*8975f5c5SAndroid Build Coastguard Worker     {
196*8975f5c5SAndroid Build Coastguard Worker         binding->set(context, buffer, offset, size);
197*8975f5c5SAndroid Build Coastguard Worker     }
198*8975f5c5SAndroid Build Coastguard Worker }
199*8975f5c5SAndroid Build Coastguard Worker 
200*8975f5c5SAndroid Build Coastguard Worker // These template functions must be defined before they are instantiated in kBufferSetters.
201*8975f5c5SAndroid Build Coastguard Worker template <BufferBinding Target>
setGenericBufferBindingWithBit(const Context * context,Buffer * buffer)202*8975f5c5SAndroid Build Coastguard Worker void State::setGenericBufferBindingWithBit(const Context *context, Buffer *buffer)
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     if (context->isWebGL())
205*8975f5c5SAndroid Build Coastguard Worker     {
206*8975f5c5SAndroid Build Coastguard Worker         UpdateNonTFBufferBindingWebGL(context, &mBoundBuffers[Target], buffer);
207*8975f5c5SAndroid Build Coastguard Worker     }
208*8975f5c5SAndroid Build Coastguard Worker     else
209*8975f5c5SAndroid Build Coastguard Worker     {
210*8975f5c5SAndroid Build Coastguard Worker         mBoundBuffers[Target].set(context, buffer);
211*8975f5c5SAndroid Build Coastguard Worker     }
212*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(kBufferBindingDirtyBits[Target]);
213*8975f5c5SAndroid Build Coastguard Worker }
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker template <BufferBinding Target>
setGenericBufferBinding(const Context * context,Buffer * buffer)216*8975f5c5SAndroid Build Coastguard Worker void State::setGenericBufferBinding(const Context *context, Buffer *buffer)
217*8975f5c5SAndroid Build Coastguard Worker {
218*8975f5c5SAndroid Build Coastguard Worker     if (context->isWebGL())
219*8975f5c5SAndroid Build Coastguard Worker     {
220*8975f5c5SAndroid Build Coastguard Worker         UpdateNonTFBufferBindingWebGL(context, &mBoundBuffers[Target], buffer);
221*8975f5c5SAndroid Build Coastguard Worker     }
222*8975f5c5SAndroid Build Coastguard Worker     else
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         mBoundBuffers[Target].set(context, buffer);
225*8975f5c5SAndroid Build Coastguard Worker     }
226*8975f5c5SAndroid Build Coastguard Worker }
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker template <>
setGenericBufferBinding(const Context * context,Buffer * buffer)229*8975f5c5SAndroid Build Coastguard Worker void State::setGenericBufferBinding<BufferBinding::TransformFeedback>(const Context *context,
230*8975f5c5SAndroid Build Coastguard Worker                                                                       Buffer *buffer)
231*8975f5c5SAndroid Build Coastguard Worker {
232*8975f5c5SAndroid Build Coastguard Worker     if (context->isWebGL())
233*8975f5c5SAndroid Build Coastguard Worker     {
234*8975f5c5SAndroid Build Coastguard Worker         UpdateTFBufferBindingWebGL(context, &mBoundBuffers[BufferBinding::TransformFeedback], false,
235*8975f5c5SAndroid Build Coastguard Worker                                    buffer);
236*8975f5c5SAndroid Build Coastguard Worker     }
237*8975f5c5SAndroid Build Coastguard Worker     else
238*8975f5c5SAndroid Build Coastguard Worker     {
239*8975f5c5SAndroid Build Coastguard Worker         mBoundBuffers[BufferBinding::TransformFeedback].set(context, buffer);
240*8975f5c5SAndroid Build Coastguard Worker     }
241*8975f5c5SAndroid Build Coastguard Worker }
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker template <>
setGenericBufferBinding(const Context * context,Buffer * buffer)244*8975f5c5SAndroid Build Coastguard Worker void State::setGenericBufferBinding<BufferBinding::ElementArray>(const Context *context,
245*8975f5c5SAndroid Build Coastguard Worker                                                                  Buffer *buffer)
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker     Buffer *oldBuffer = mVertexArray->mState.mElementArrayBuffer.get();
248*8975f5c5SAndroid Build Coastguard Worker     if (oldBuffer)
249*8975f5c5SAndroid Build Coastguard Worker     {
250*8975f5c5SAndroid Build Coastguard Worker         oldBuffer->removeObserver(&mVertexArray->mState.mElementArrayBuffer);
251*8975f5c5SAndroid Build Coastguard Worker         oldBuffer->removeContentsObserver(mVertexArray, kElementArrayBufferIndex);
252*8975f5c5SAndroid Build Coastguard Worker         if (context->isWebGL())
253*8975f5c5SAndroid Build Coastguard Worker         {
254*8975f5c5SAndroid Build Coastguard Worker             oldBuffer->onNonTFBindingChanged(-1);
255*8975f5c5SAndroid Build Coastguard Worker         }
256*8975f5c5SAndroid Build Coastguard Worker         oldBuffer->release(context);
257*8975f5c5SAndroid Build Coastguard Worker     }
258*8975f5c5SAndroid Build Coastguard Worker     mVertexArray->mState.mElementArrayBuffer.assign(buffer);
259*8975f5c5SAndroid Build Coastguard Worker     if (buffer)
260*8975f5c5SAndroid Build Coastguard Worker     {
261*8975f5c5SAndroid Build Coastguard Worker         buffer->addObserver(&mVertexArray->mState.mElementArrayBuffer);
262*8975f5c5SAndroid Build Coastguard Worker         buffer->addContentsObserver(mVertexArray, kElementArrayBufferIndex);
263*8975f5c5SAndroid Build Coastguard Worker         if (context->isWebGL())
264*8975f5c5SAndroid Build Coastguard Worker         {
265*8975f5c5SAndroid Build Coastguard Worker             buffer->onNonTFBindingChanged(1);
266*8975f5c5SAndroid Build Coastguard Worker         }
267*8975f5c5SAndroid Build Coastguard Worker         buffer->addRef();
268*8975f5c5SAndroid Build Coastguard Worker     }
269*8975f5c5SAndroid Build Coastguard Worker     mVertexArray->mDirtyBits.set(VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
270*8975f5c5SAndroid Build Coastguard Worker     mVertexArray->mIndexRangeCache.invalidate();
271*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
272*8975f5c5SAndroid Build Coastguard Worker }
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker const angle::PackedEnumMap<BufferBinding, State::BufferBindingSetter> State::kBufferSetters = {{
275*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::Array>(),
276*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::AtomicCounter>(),
277*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::CopyRead>(),
278*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::CopyWrite>(),
279*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::DispatchIndirect>(),
280*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::DrawIndirect>(),
281*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::ElementArray>(),
282*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::PixelPack>(),
283*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::PixelUnpack>(),
284*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::ShaderStorage>(),
285*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::Texture>(),
286*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::TransformFeedback>(),
287*8975f5c5SAndroid Build Coastguard Worker     GetBufferBindingSetter<BufferBinding::Uniform>(),
288*8975f5c5SAndroid Build Coastguard Worker }};
289*8975f5c5SAndroid Build Coastguard Worker 
ActiveTexturesCache()290*8975f5c5SAndroid Build Coastguard Worker ActiveTexturesCache::ActiveTexturesCache() : mTextures{} {}
291*8975f5c5SAndroid Build Coastguard Worker 
~ActiveTexturesCache()292*8975f5c5SAndroid Build Coastguard Worker ActiveTexturesCache::~ActiveTexturesCache()
293*8975f5c5SAndroid Build Coastguard Worker {
294*8975f5c5SAndroid Build Coastguard Worker     ASSERT(empty());
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker 
clear()297*8975f5c5SAndroid Build Coastguard Worker void ActiveTexturesCache::clear()
298*8975f5c5SAndroid Build Coastguard Worker {
299*8975f5c5SAndroid Build Coastguard Worker     for (size_t textureIndex = 0; textureIndex < mTextures.size(); ++textureIndex)
300*8975f5c5SAndroid Build Coastguard Worker     {
301*8975f5c5SAndroid Build Coastguard Worker         reset(textureIndex);
302*8975f5c5SAndroid Build Coastguard Worker     }
303*8975f5c5SAndroid Build Coastguard Worker }
304*8975f5c5SAndroid Build Coastguard Worker 
empty() const305*8975f5c5SAndroid Build Coastguard Worker bool ActiveTexturesCache::empty() const
306*8975f5c5SAndroid Build Coastguard Worker {
307*8975f5c5SAndroid Build Coastguard Worker     for (Texture *texture : mTextures)
308*8975f5c5SAndroid Build Coastguard Worker     {
309*8975f5c5SAndroid Build Coastguard Worker         if (texture)
310*8975f5c5SAndroid Build Coastguard Worker         {
311*8975f5c5SAndroid Build Coastguard Worker             return false;
312*8975f5c5SAndroid Build Coastguard Worker         }
313*8975f5c5SAndroid Build Coastguard Worker     }
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     return true;
316*8975f5c5SAndroid Build Coastguard Worker }
317*8975f5c5SAndroid Build Coastguard Worker 
reset(size_t textureIndex)318*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void ActiveTexturesCache::reset(size_t textureIndex)
319*8975f5c5SAndroid Build Coastguard Worker {
320*8975f5c5SAndroid Build Coastguard Worker     if (mTextures[textureIndex])
321*8975f5c5SAndroid Build Coastguard Worker     {
322*8975f5c5SAndroid Build Coastguard Worker         mTextures[textureIndex] = nullptr;
323*8975f5c5SAndroid Build Coastguard Worker     }
324*8975f5c5SAndroid Build Coastguard Worker }
325*8975f5c5SAndroid Build Coastguard Worker 
set(size_t textureIndex,Texture * texture)326*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void ActiveTexturesCache::set(size_t textureIndex, Texture *texture)
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker     ASSERT(texture);
329*8975f5c5SAndroid Build Coastguard Worker     mTextures[textureIndex] = texture;
330*8975f5c5SAndroid Build Coastguard Worker }
331*8975f5c5SAndroid Build Coastguard Worker 
PrivateState(const Version & clientVersion,bool debug,bool bindGeneratesResourceCHROMIUM,bool clientArraysEnabled,bool robustResourceInit,bool programBinaryCacheEnabled,bool isExternal)332*8975f5c5SAndroid Build Coastguard Worker PrivateState::PrivateState(const Version &clientVersion,
333*8975f5c5SAndroid Build Coastguard Worker                            bool debug,
334*8975f5c5SAndroid Build Coastguard Worker                            bool bindGeneratesResourceCHROMIUM,
335*8975f5c5SAndroid Build Coastguard Worker                            bool clientArraysEnabled,
336*8975f5c5SAndroid Build Coastguard Worker                            bool robustResourceInit,
337*8975f5c5SAndroid Build Coastguard Worker                            bool programBinaryCacheEnabled,
338*8975f5c5SAndroid Build Coastguard Worker                            bool isExternal)
339*8975f5c5SAndroid Build Coastguard Worker     : mClientVersion(clientVersion),
340*8975f5c5SAndroid Build Coastguard Worker       mIsExternal(isExternal),
341*8975f5c5SAndroid Build Coastguard Worker       mDepthClearValue(0),
342*8975f5c5SAndroid Build Coastguard Worker       mStencilClearValue(0),
343*8975f5c5SAndroid Build Coastguard Worker       mScissorTest(false),
344*8975f5c5SAndroid Build Coastguard Worker       mSampleAlphaToCoverage(false),
345*8975f5c5SAndroid Build Coastguard Worker       mSampleCoverage(false),
346*8975f5c5SAndroid Build Coastguard Worker       mSampleCoverageValue(0),
347*8975f5c5SAndroid Build Coastguard Worker       mSampleCoverageInvert(false),
348*8975f5c5SAndroid Build Coastguard Worker       mSampleMask(false),
349*8975f5c5SAndroid Build Coastguard Worker       mMaxSampleMaskWords(0),
350*8975f5c5SAndroid Build Coastguard Worker       mIsSampleShadingEnabled(false),
351*8975f5c5SAndroid Build Coastguard Worker       mMinSampleShading(0.0f),
352*8975f5c5SAndroid Build Coastguard Worker       mStencilRef(0),
353*8975f5c5SAndroid Build Coastguard Worker       mStencilBackRef(0),
354*8975f5c5SAndroid Build Coastguard Worker       mLineWidth(0),
355*8975f5c5SAndroid Build Coastguard Worker       mGenerateMipmapHint(GL_NONE),
356*8975f5c5SAndroid Build Coastguard Worker       mFragmentShaderDerivativeHint(GL_NONE),
357*8975f5c5SAndroid Build Coastguard Worker       mNearZ(0),
358*8975f5c5SAndroid Build Coastguard Worker       mFarZ(0),
359*8975f5c5SAndroid Build Coastguard Worker       mProvokingVertex(gl::ProvokingVertexConvention::LastVertexConvention),
360*8975f5c5SAndroid Build Coastguard Worker       mActiveSampler(0),
361*8975f5c5SAndroid Build Coastguard Worker       mPrimitiveRestart(false),
362*8975f5c5SAndroid Build Coastguard Worker       mMultiSampling(false),
363*8975f5c5SAndroid Build Coastguard Worker       mSampleAlphaToOne(false),
364*8975f5c5SAndroid Build Coastguard Worker       mFramebufferSRGB(true),
365*8975f5c5SAndroid Build Coastguard Worker       mTextureRectangleEnabled(true),
366*8975f5c5SAndroid Build Coastguard Worker       mLogicOpEnabled(false),
367*8975f5c5SAndroid Build Coastguard Worker       mLogicOp(LogicalOperation::Copy),
368*8975f5c5SAndroid Build Coastguard Worker       mPatchVertices(3),
369*8975f5c5SAndroid Build Coastguard Worker       mPixelLocalStorageActivePlanes(0),
370*8975f5c5SAndroid Build Coastguard Worker       mNoSimultaneousConstantColorAndAlphaBlendFunc(false),
371*8975f5c5SAndroid Build Coastguard Worker       mSetBlendIndexedInvoked(false),
372*8975f5c5SAndroid Build Coastguard Worker       mSetBlendFactorsIndexedInvoked(false),
373*8975f5c5SAndroid Build Coastguard Worker       mSetBlendEquationsIndexedInvoked(false),
374*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMinX(-1.0f),
375*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMinY(-1.0f),
376*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMinZ(-1.0f),
377*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMinW(1.0f),
378*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMaxX(1.0f),
379*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMaxY(1.0f),
380*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMaxZ(1.0f),
381*8975f5c5SAndroid Build Coastguard Worker       mBoundingBoxMaxW(1.0f),
382*8975f5c5SAndroid Build Coastguard Worker       mShadingRatePreserveAspectRatio(false),
383*8975f5c5SAndroid Build Coastguard Worker       mShadingRate(ShadingRate::Undefined),
384*8975f5c5SAndroid Build Coastguard Worker       mFetchPerSample(false),
385*8975f5c5SAndroid Build Coastguard Worker       mIsPerfMonitorActive(false),
386*8975f5c5SAndroid Build Coastguard Worker       mTiledRendering(false),
387*8975f5c5SAndroid Build Coastguard Worker       mBindGeneratesResource(bindGeneratesResourceCHROMIUM),
388*8975f5c5SAndroid Build Coastguard Worker       mClientArraysEnabled(clientArraysEnabled),
389*8975f5c5SAndroid Build Coastguard Worker       mRobustResourceInit(robustResourceInit),
390*8975f5c5SAndroid Build Coastguard Worker       mProgramBinaryCacheEnabled(programBinaryCacheEnabled),
391*8975f5c5SAndroid Build Coastguard Worker       mDebug(debug)
392*8975f5c5SAndroid Build Coastguard Worker {}
393*8975f5c5SAndroid Build Coastguard Worker 
394*8975f5c5SAndroid Build Coastguard Worker PrivateState::~PrivateState() = default;
395*8975f5c5SAndroid Build Coastguard Worker 
initialize(Context * context)396*8975f5c5SAndroid Build Coastguard Worker void PrivateState::initialize(Context *context)
397*8975f5c5SAndroid Build Coastguard Worker {
398*8975f5c5SAndroid Build Coastguard Worker     mBlendStateExt = BlendStateExt(mCaps.maxDrawBuffers);
399*8975f5c5SAndroid Build Coastguard Worker 
400*8975f5c5SAndroid Build Coastguard Worker     setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
401*8975f5c5SAndroid Build Coastguard Worker 
402*8975f5c5SAndroid Build Coastguard Worker     mDepthClearValue   = 1.0f;
403*8975f5c5SAndroid Build Coastguard Worker     mStencilClearValue = 0;
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker     mScissorTest    = false;
406*8975f5c5SAndroid Build Coastguard Worker     mScissor.x      = 0;
407*8975f5c5SAndroid Build Coastguard Worker     mScissor.y      = 0;
408*8975f5c5SAndroid Build Coastguard Worker     mScissor.width  = 0;
409*8975f5c5SAndroid Build Coastguard Worker     mScissor.height = 0;
410*8975f5c5SAndroid Build Coastguard Worker 
411*8975f5c5SAndroid Build Coastguard Worker     mBlendColor.red   = 0;
412*8975f5c5SAndroid Build Coastguard Worker     mBlendColor.green = 0;
413*8975f5c5SAndroid Build Coastguard Worker     mBlendColor.blue  = 0;
414*8975f5c5SAndroid Build Coastguard Worker     mBlendColor.alpha = 0;
415*8975f5c5SAndroid Build Coastguard Worker 
416*8975f5c5SAndroid Build Coastguard Worker     mStencilRef     = 0;
417*8975f5c5SAndroid Build Coastguard Worker     mStencilBackRef = 0;
418*8975f5c5SAndroid Build Coastguard Worker 
419*8975f5c5SAndroid Build Coastguard Worker     mSampleCoverage       = false;
420*8975f5c5SAndroid Build Coastguard Worker     mSampleCoverageValue  = 1.0f;
421*8975f5c5SAndroid Build Coastguard Worker     mSampleCoverageInvert = false;
422*8975f5c5SAndroid Build Coastguard Worker 
423*8975f5c5SAndroid Build Coastguard Worker     mMaxSampleMaskWords = static_cast<GLuint>(mCaps.maxSampleMaskWords);
424*8975f5c5SAndroid Build Coastguard Worker     mSampleMask         = false;
425*8975f5c5SAndroid Build Coastguard Worker     mSampleMaskValues.fill(~GLbitfield(0));
426*8975f5c5SAndroid Build Coastguard Worker 
427*8975f5c5SAndroid Build Coastguard Worker     mGenerateMipmapHint           = GL_DONT_CARE;
428*8975f5c5SAndroid Build Coastguard Worker     mFragmentShaderDerivativeHint = GL_DONT_CARE;
429*8975f5c5SAndroid Build Coastguard Worker 
430*8975f5c5SAndroid Build Coastguard Worker     mLineWidth = 1.0f;
431*8975f5c5SAndroid Build Coastguard Worker 
432*8975f5c5SAndroid Build Coastguard Worker     mViewport.x      = 0;
433*8975f5c5SAndroid Build Coastguard Worker     mViewport.y      = 0;
434*8975f5c5SAndroid Build Coastguard Worker     mViewport.width  = 0;
435*8975f5c5SAndroid Build Coastguard Worker     mViewport.height = 0;
436*8975f5c5SAndroid Build Coastguard Worker     mNearZ           = 0.0f;
437*8975f5c5SAndroid Build Coastguard Worker     mFarZ            = 1.0f;
438*8975f5c5SAndroid Build Coastguard Worker 
439*8975f5c5SAndroid Build Coastguard Worker     mClipOrigin    = ClipOrigin::LowerLeft;
440*8975f5c5SAndroid Build Coastguard Worker     mClipDepthMode = ClipDepthMode::NegativeOneToOne;
441*8975f5c5SAndroid Build Coastguard Worker 
442*8975f5c5SAndroid Build Coastguard Worker     mActiveSampler = 0;
443*8975f5c5SAndroid Build Coastguard Worker 
444*8975f5c5SAndroid Build Coastguard Worker     mVertexAttribCurrentValues.resize(mCaps.maxVertexAttributes);
445*8975f5c5SAndroid Build Coastguard Worker 
446*8975f5c5SAndroid Build Coastguard Worker     // Set all indexes in state attributes type mask to float (default)
447*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
448*8975f5c5SAndroid Build Coastguard Worker     {
449*8975f5c5SAndroid Build Coastguard Worker         SetComponentTypeMask(ComponentType::Float, i, &mCurrentValuesTypeMask);
450*8975f5c5SAndroid Build Coastguard Worker     }
451*8975f5c5SAndroid Build Coastguard Worker 
452*8975f5c5SAndroid Build Coastguard Worker     mAllAttribsMask = AttributesMask(angle::BitMask<uint32_t>(mCaps.maxVertexAttributes));
453*8975f5c5SAndroid Build Coastguard Worker 
454*8975f5c5SAndroid Build Coastguard Worker     mMultiSampling    = true;
455*8975f5c5SAndroid Build Coastguard Worker     mSampleAlphaToOne = false;
456*8975f5c5SAndroid Build Coastguard Worker 
457*8975f5c5SAndroid Build Coastguard Worker     mCoverageModulation = GL_NONE;
458*8975f5c5SAndroid Build Coastguard Worker 
459*8975f5c5SAndroid Build Coastguard Worker     // This coherent blending is enabled by default, but can be enabled or disabled by calling
460*8975f5c5SAndroid Build Coastguard Worker     // glEnable() or glDisable() with the symbolic constant GL_BLEND_ADVANCED_COHERENT_KHR.
461*8975f5c5SAndroid Build Coastguard Worker     mBlendAdvancedCoherent = context->getExtensions().blendEquationAdvancedCoherentKHR;
462*8975f5c5SAndroid Build Coastguard Worker 
463*8975f5c5SAndroid Build Coastguard Worker     mPrimitiveRestart = false;
464*8975f5c5SAndroid Build Coastguard Worker 
465*8975f5c5SAndroid Build Coastguard Worker     mNoSimultaneousConstantColorAndAlphaBlendFunc =
466*8975f5c5SAndroid Build Coastguard Worker         context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc ||
467*8975f5c5SAndroid Build Coastguard Worker         context->getExtensions().webglCompatibilityANGLE;
468*8975f5c5SAndroid Build Coastguard Worker 
469*8975f5c5SAndroid Build Coastguard Worker     mNoUnclampedBlendColor = context->getLimitations().noUnclampedBlendColor;
470*8975f5c5SAndroid Build Coastguard Worker 
471*8975f5c5SAndroid Build Coastguard Worker     // GLES1 emulation: Initialize state for GLES1 if version applies
472*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientVersion() < Version(2, 0))
473*8975f5c5SAndroid Build Coastguard Worker     {
474*8975f5c5SAndroid Build Coastguard Worker         mGLES1State.initialize(context, this);
475*8975f5c5SAndroid Build Coastguard Worker     }
476*8975f5c5SAndroid Build Coastguard Worker }
477*8975f5c5SAndroid Build Coastguard Worker 
initializeForCapture(const Context * context)478*8975f5c5SAndroid Build Coastguard Worker void PrivateState::initializeForCapture(const Context *context)
479*8975f5c5SAndroid Build Coastguard Worker {
480*8975f5c5SAndroid Build Coastguard Worker     mCaps       = context->getCaps();
481*8975f5c5SAndroid Build Coastguard Worker     mExtensions = context->getExtensions();
482*8975f5c5SAndroid Build Coastguard Worker }
483*8975f5c5SAndroid Build Coastguard Worker 
reset()484*8975f5c5SAndroid Build Coastguard Worker void PrivateState::reset()
485*8975f5c5SAndroid Build Coastguard Worker {
486*8975f5c5SAndroid Build Coastguard Worker     mClipDistancesEnabled.reset();
487*8975f5c5SAndroid Build Coastguard Worker }
488*8975f5c5SAndroid Build Coastguard Worker 
setColorClearValue(float red,float green,float blue,float alpha)489*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setColorClearValue(float red, float green, float blue, float alpha)
490*8975f5c5SAndroid Build Coastguard Worker {
491*8975f5c5SAndroid Build Coastguard Worker     mColorClearValue.red   = red;
492*8975f5c5SAndroid Build Coastguard Worker     mColorClearValue.green = green;
493*8975f5c5SAndroid Build Coastguard Worker     mColorClearValue.blue  = blue;
494*8975f5c5SAndroid Build Coastguard Worker     mColorClearValue.alpha = alpha;
495*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_CLEAR_COLOR);
496*8975f5c5SAndroid Build Coastguard Worker }
497*8975f5c5SAndroid Build Coastguard Worker 
setDepthClearValue(float depth)498*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setDepthClearValue(float depth)
499*8975f5c5SAndroid Build Coastguard Worker {
500*8975f5c5SAndroid Build Coastguard Worker     mDepthClearValue = depth;
501*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_CLEAR_DEPTH);
502*8975f5c5SAndroid Build Coastguard Worker }
503*8975f5c5SAndroid Build Coastguard Worker 
setStencilClearValue(int stencil)504*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilClearValue(int stencil)
505*8975f5c5SAndroid Build Coastguard Worker {
506*8975f5c5SAndroid Build Coastguard Worker     mStencilClearValue = stencil;
507*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_CLEAR_STENCIL);
508*8975f5c5SAndroid Build Coastguard Worker }
509*8975f5c5SAndroid Build Coastguard Worker 
setColorMask(bool red,bool green,bool blue,bool alpha)510*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setColorMask(bool red, bool green, bool blue, bool alpha)
511*8975f5c5SAndroid Build Coastguard Worker {
512*8975f5c5SAndroid Build Coastguard Worker     GLint firstPLSDrawBuffer;
513*8975f5c5SAndroid Build Coastguard Worker     if (hasActivelyOverriddenPLSDrawBuffers(&firstPLSDrawBuffer))
514*8975f5c5SAndroid Build Coastguard Worker     {
515*8975f5c5SAndroid Build Coastguard Worker         // Some draw buffers are currently overridden by pixel local storage. Update only the
516*8975f5c5SAndroid Build Coastguard Worker         // buffers that are still visible to the client.
517*8975f5c5SAndroid Build Coastguard Worker         assert(firstPLSDrawBuffer < mCaps.maxDrawBuffers);
518*8975f5c5SAndroid Build Coastguard Worker         for (GLint i = 0; i < firstPLSDrawBuffer; ++i)
519*8975f5c5SAndroid Build Coastguard Worker         {
520*8975f5c5SAndroid Build Coastguard Worker             ASSERT(mExtensions.drawBuffersIndexedAny());
521*8975f5c5SAndroid Build Coastguard Worker             setColorMaskIndexed(red, green, blue, alpha, i);
522*8975f5c5SAndroid Build Coastguard Worker         }
523*8975f5c5SAndroid Build Coastguard Worker         return;
524*8975f5c5SAndroid Build Coastguard Worker     }
525*8975f5c5SAndroid Build Coastguard Worker 
526*8975f5c5SAndroid Build Coastguard Worker     mBlendState.colorMaskRed   = red;
527*8975f5c5SAndroid Build Coastguard Worker     mBlendState.colorMaskGreen = green;
528*8975f5c5SAndroid Build Coastguard Worker     mBlendState.colorMaskBlue  = blue;
529*8975f5c5SAndroid Build Coastguard Worker     mBlendState.colorMaskAlpha = alpha;
530*8975f5c5SAndroid Build Coastguard Worker 
531*8975f5c5SAndroid Build Coastguard Worker     mBlendStateExt.setColorMask(red, green, blue, alpha);
532*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_COLOR_MASK);
533*8975f5c5SAndroid Build Coastguard Worker }
534*8975f5c5SAndroid Build Coastguard Worker 
setColorMaskIndexed(bool red,bool green,bool blue,bool alpha,GLuint index)535*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setColorMaskIndexed(bool red, bool green, bool blue, bool alpha, GLuint index)
536*8975f5c5SAndroid Build Coastguard Worker {
537*8975f5c5SAndroid Build Coastguard Worker     if (isActivelyOverriddenPLSDrawBuffer(index))
538*8975f5c5SAndroid Build Coastguard Worker     {
539*8975f5c5SAndroid Build Coastguard Worker         // The indexed draw buffer is currently overridden by pixel local storage. Setting the color
540*8975f5c5SAndroid Build Coastguard Worker         // mask has no effect.
541*8975f5c5SAndroid Build Coastguard Worker         return;
542*8975f5c5SAndroid Build Coastguard Worker     }
543*8975f5c5SAndroid Build Coastguard Worker 
544*8975f5c5SAndroid Build Coastguard Worker     mBlendStateExt.setColorMaskIndexed(index, red, green, blue, alpha);
545*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_COLOR_MASK);
546*8975f5c5SAndroid Build Coastguard Worker }
547*8975f5c5SAndroid Build Coastguard Worker 
setDepthMask(bool mask)548*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setDepthMask(bool mask)
549*8975f5c5SAndroid Build Coastguard Worker {
550*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.depthMask != mask)
551*8975f5c5SAndroid Build Coastguard Worker     {
552*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.depthMask = mask;
553*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_DEPTH_MASK);
554*8975f5c5SAndroid Build Coastguard Worker     }
555*8975f5c5SAndroid Build Coastguard Worker }
556*8975f5c5SAndroid Build Coastguard Worker 
setRasterizerDiscard(bool enabled)557*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setRasterizerDiscard(bool enabled)
558*8975f5c5SAndroid Build Coastguard Worker {
559*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.rasterizerDiscard != enabled)
560*8975f5c5SAndroid Build Coastguard Worker     {
561*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.rasterizerDiscard = enabled;
562*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
563*8975f5c5SAndroid Build Coastguard Worker     }
564*8975f5c5SAndroid Build Coastguard Worker }
565*8975f5c5SAndroid Build Coastguard Worker 
setPrimitiveRestart(bool enabled)566*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPrimitiveRestart(bool enabled)
567*8975f5c5SAndroid Build Coastguard Worker {
568*8975f5c5SAndroid Build Coastguard Worker     if (mPrimitiveRestart != enabled)
569*8975f5c5SAndroid Build Coastguard Worker     {
570*8975f5c5SAndroid Build Coastguard Worker         mPrimitiveRestart = enabled;
571*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
572*8975f5c5SAndroid Build Coastguard Worker     }
573*8975f5c5SAndroid Build Coastguard Worker }
574*8975f5c5SAndroid Build Coastguard Worker 
setCullFace(bool enabled)575*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setCullFace(bool enabled)
576*8975f5c5SAndroid Build Coastguard Worker {
577*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.cullFace != enabled)
578*8975f5c5SAndroid Build Coastguard Worker     {
579*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.cullFace = enabled;
580*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_CULL_FACE_ENABLED);
581*8975f5c5SAndroid Build Coastguard Worker     }
582*8975f5c5SAndroid Build Coastguard Worker }
583*8975f5c5SAndroid Build Coastguard Worker 
setCullMode(CullFaceMode mode)584*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setCullMode(CullFaceMode mode)
585*8975f5c5SAndroid Build Coastguard Worker {
586*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.cullMode != mode)
587*8975f5c5SAndroid Build Coastguard Worker     {
588*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.cullMode = mode;
589*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_CULL_FACE);
590*8975f5c5SAndroid Build Coastguard Worker     }
591*8975f5c5SAndroid Build Coastguard Worker }
592*8975f5c5SAndroid Build Coastguard Worker 
setFrontFace(GLenum front)593*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setFrontFace(GLenum front)
594*8975f5c5SAndroid Build Coastguard Worker {
595*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.frontFace != front)
596*8975f5c5SAndroid Build Coastguard Worker     {
597*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.frontFace = front;
598*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_FRONT_FACE);
599*8975f5c5SAndroid Build Coastguard Worker     }
600*8975f5c5SAndroid Build Coastguard Worker }
601*8975f5c5SAndroid Build Coastguard Worker 
setDepthClamp(bool enabled)602*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setDepthClamp(bool enabled)
603*8975f5c5SAndroid Build Coastguard Worker {
604*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.depthClamp != enabled)
605*8975f5c5SAndroid Build Coastguard Worker     {
606*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.depthClamp = enabled;
607*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
608*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_DEPTH_CLAMP_ENABLED);
609*8975f5c5SAndroid Build Coastguard Worker     }
610*8975f5c5SAndroid Build Coastguard Worker }
611*8975f5c5SAndroid Build Coastguard Worker 
setDepthTest(bool enabled)612*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setDepthTest(bool enabled)
613*8975f5c5SAndroid Build Coastguard Worker {
614*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.depthTest != enabled)
615*8975f5c5SAndroid Build Coastguard Worker     {
616*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.depthTest = enabled;
617*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_DEPTH_TEST_ENABLED);
618*8975f5c5SAndroid Build Coastguard Worker     }
619*8975f5c5SAndroid Build Coastguard Worker }
620*8975f5c5SAndroid Build Coastguard Worker 
setDepthFunc(GLenum depthFunc)621*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setDepthFunc(GLenum depthFunc)
622*8975f5c5SAndroid Build Coastguard Worker {
623*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.depthFunc != depthFunc)
624*8975f5c5SAndroid Build Coastguard Worker     {
625*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.depthFunc = depthFunc;
626*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_DEPTH_FUNC);
627*8975f5c5SAndroid Build Coastguard Worker     }
628*8975f5c5SAndroid Build Coastguard Worker }
629*8975f5c5SAndroid Build Coastguard Worker 
setDepthRange(float zNear,float zFar)630*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setDepthRange(float zNear, float zFar)
631*8975f5c5SAndroid Build Coastguard Worker {
632*8975f5c5SAndroid Build Coastguard Worker     if (mNearZ != zNear || mFarZ != zFar)
633*8975f5c5SAndroid Build Coastguard Worker     {
634*8975f5c5SAndroid Build Coastguard Worker         mNearZ = zNear;
635*8975f5c5SAndroid Build Coastguard Worker         mFarZ  = zFar;
636*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_DEPTH_RANGE);
637*8975f5c5SAndroid Build Coastguard Worker     }
638*8975f5c5SAndroid Build Coastguard Worker }
639*8975f5c5SAndroid Build Coastguard Worker 
setClipControl(ClipOrigin origin,ClipDepthMode depth)640*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setClipControl(ClipOrigin origin, ClipDepthMode depth)
641*8975f5c5SAndroid Build Coastguard Worker {
642*8975f5c5SAndroid Build Coastguard Worker     bool updated = false;
643*8975f5c5SAndroid Build Coastguard Worker     if (mClipOrigin != origin)
644*8975f5c5SAndroid Build Coastguard Worker     {
645*8975f5c5SAndroid Build Coastguard Worker         mClipOrigin = origin;
646*8975f5c5SAndroid Build Coastguard Worker         updated     = true;
647*8975f5c5SAndroid Build Coastguard Worker     }
648*8975f5c5SAndroid Build Coastguard Worker 
649*8975f5c5SAndroid Build Coastguard Worker     if (mClipDepthMode != depth)
650*8975f5c5SAndroid Build Coastguard Worker     {
651*8975f5c5SAndroid Build Coastguard Worker         mClipDepthMode = depth;
652*8975f5c5SAndroid Build Coastguard Worker         updated        = true;
653*8975f5c5SAndroid Build Coastguard Worker     }
654*8975f5c5SAndroid Build Coastguard Worker 
655*8975f5c5SAndroid Build Coastguard Worker     if (updated)
656*8975f5c5SAndroid Build Coastguard Worker     {
657*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
658*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_CLIP_CONTROL);
659*8975f5c5SAndroid Build Coastguard Worker     }
660*8975f5c5SAndroid Build Coastguard Worker }
661*8975f5c5SAndroid Build Coastguard Worker 
setBlend(bool enabled)662*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlend(bool enabled)
663*8975f5c5SAndroid Build Coastguard Worker {
664*8975f5c5SAndroid Build Coastguard Worker     GLint firstPLSDrawBuffer;
665*8975f5c5SAndroid Build Coastguard Worker     if (hasActivelyOverriddenPLSDrawBuffers(&firstPLSDrawBuffer))
666*8975f5c5SAndroid Build Coastguard Worker     {
667*8975f5c5SAndroid Build Coastguard Worker         // Some draw buffers are currently overridden by pixel local storage. Update only the
668*8975f5c5SAndroid Build Coastguard Worker         // buffers that are still visible to the client.
669*8975f5c5SAndroid Build Coastguard Worker         assert(firstPLSDrawBuffer < mCaps.maxDrawBuffers);
670*8975f5c5SAndroid Build Coastguard Worker         for (GLint i = 0; i < firstPLSDrawBuffer; ++i)
671*8975f5c5SAndroid Build Coastguard Worker         {
672*8975f5c5SAndroid Build Coastguard Worker             ASSERT(mExtensions.drawBuffersIndexedAny());
673*8975f5c5SAndroid Build Coastguard Worker             setBlendIndexed(enabled, i);
674*8975f5c5SAndroid Build Coastguard Worker         }
675*8975f5c5SAndroid Build Coastguard Worker         return;
676*8975f5c5SAndroid Build Coastguard Worker     }
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker     if (mSetBlendIndexedInvoked || mBlendState.blend != enabled)
679*8975f5c5SAndroid Build Coastguard Worker     {
680*8975f5c5SAndroid Build Coastguard Worker         mBlendState.blend = enabled;
681*8975f5c5SAndroid Build Coastguard Worker 
682*8975f5c5SAndroid Build Coastguard Worker         mSetBlendIndexedInvoked = false;
683*8975f5c5SAndroid Build Coastguard Worker         mBlendStateExt.setEnabled(enabled);
684*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_BLEND_ENABLED);
685*8975f5c5SAndroid Build Coastguard Worker     }
686*8975f5c5SAndroid Build Coastguard Worker }
687*8975f5c5SAndroid Build Coastguard Worker 
setBlendIndexed(bool enabled,GLuint index)688*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlendIndexed(bool enabled, GLuint index)
689*8975f5c5SAndroid Build Coastguard Worker {
690*8975f5c5SAndroid Build Coastguard Worker     if (isActivelyOverriddenPLSDrawBuffer(index))
691*8975f5c5SAndroid Build Coastguard Worker     {
692*8975f5c5SAndroid Build Coastguard Worker         // The indexed draw buffer is currently overridden by pixel local storage. Enabling
693*8975f5c5SAndroid Build Coastguard Worker         // blend has no effect.
694*8975f5c5SAndroid Build Coastguard Worker         return;
695*8975f5c5SAndroid Build Coastguard Worker     }
696*8975f5c5SAndroid Build Coastguard Worker 
697*8975f5c5SAndroid Build Coastguard Worker     mSetBlendIndexedInvoked = true;
698*8975f5c5SAndroid Build Coastguard Worker     mBlendStateExt.setEnabledIndexed(index, enabled);
699*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_BLEND_ENABLED);
700*8975f5c5SAndroid Build Coastguard Worker }
701*8975f5c5SAndroid Build Coastguard Worker 
hasConstantColor(GLenum sourceRGB,GLenum destRGB) const702*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool PrivateState::hasConstantColor(GLenum sourceRGB, GLenum destRGB) const
703*8975f5c5SAndroid Build Coastguard Worker {
704*8975f5c5SAndroid Build Coastguard Worker     return sourceRGB == GL_CONSTANT_COLOR || sourceRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
705*8975f5c5SAndroid Build Coastguard Worker            destRGB == GL_CONSTANT_COLOR || destRGB == GL_ONE_MINUS_CONSTANT_COLOR;
706*8975f5c5SAndroid Build Coastguard Worker }
707*8975f5c5SAndroid Build Coastguard Worker 
hasConstantAlpha(GLenum sourceRGB,GLenum destRGB) const708*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool PrivateState::hasConstantAlpha(GLenum sourceRGB, GLenum destRGB) const
709*8975f5c5SAndroid Build Coastguard Worker {
710*8975f5c5SAndroid Build Coastguard Worker     return sourceRGB == GL_CONSTANT_ALPHA || sourceRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
711*8975f5c5SAndroid Build Coastguard Worker            destRGB == GL_CONSTANT_ALPHA || destRGB == GL_ONE_MINUS_CONSTANT_ALPHA;
712*8975f5c5SAndroid Build Coastguard Worker }
713*8975f5c5SAndroid Build Coastguard Worker 
setBlendFactors(GLenum sourceRGB,GLenum destRGB,GLenum sourceAlpha,GLenum destAlpha)714*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlendFactors(GLenum sourceRGB,
715*8975f5c5SAndroid Build Coastguard Worker                                    GLenum destRGB,
716*8975f5c5SAndroid Build Coastguard Worker                                    GLenum sourceAlpha,
717*8975f5c5SAndroid Build Coastguard Worker                                    GLenum destAlpha)
718*8975f5c5SAndroid Build Coastguard Worker {
719*8975f5c5SAndroid Build Coastguard Worker     if (!mSetBlendFactorsIndexedInvoked && mBlendState.sourceBlendRGB == sourceRGB &&
720*8975f5c5SAndroid Build Coastguard Worker         mBlendState.destBlendRGB == destRGB && mBlendState.sourceBlendAlpha == sourceAlpha &&
721*8975f5c5SAndroid Build Coastguard Worker         mBlendState.destBlendAlpha == destAlpha)
722*8975f5c5SAndroid Build Coastguard Worker     {
723*8975f5c5SAndroid Build Coastguard Worker         return;
724*8975f5c5SAndroid Build Coastguard Worker     }
725*8975f5c5SAndroid Build Coastguard Worker 
726*8975f5c5SAndroid Build Coastguard Worker     mBlendState.sourceBlendRGB   = sourceRGB;
727*8975f5c5SAndroid Build Coastguard Worker     mBlendState.destBlendRGB     = destRGB;
728*8975f5c5SAndroid Build Coastguard Worker     mBlendState.sourceBlendAlpha = sourceAlpha;
729*8975f5c5SAndroid Build Coastguard Worker     mBlendState.destBlendAlpha   = destAlpha;
730*8975f5c5SAndroid Build Coastguard Worker 
731*8975f5c5SAndroid Build Coastguard Worker     if (mNoSimultaneousConstantColorAndAlphaBlendFunc)
732*8975f5c5SAndroid Build Coastguard Worker     {
733*8975f5c5SAndroid Build Coastguard Worker         if (hasConstantColor(sourceRGB, destRGB))
734*8975f5c5SAndroid Build Coastguard Worker         {
735*8975f5c5SAndroid Build Coastguard Worker             mBlendFuncConstantColorDrawBuffers.set();
736*8975f5c5SAndroid Build Coastguard Worker         }
737*8975f5c5SAndroid Build Coastguard Worker         else
738*8975f5c5SAndroid Build Coastguard Worker         {
739*8975f5c5SAndroid Build Coastguard Worker             mBlendFuncConstantColorDrawBuffers.reset();
740*8975f5c5SAndroid Build Coastguard Worker         }
741*8975f5c5SAndroid Build Coastguard Worker 
742*8975f5c5SAndroid Build Coastguard Worker         if (hasConstantAlpha(sourceRGB, destRGB))
743*8975f5c5SAndroid Build Coastguard Worker         {
744*8975f5c5SAndroid Build Coastguard Worker             mBlendFuncConstantAlphaDrawBuffers.set();
745*8975f5c5SAndroid Build Coastguard Worker         }
746*8975f5c5SAndroid Build Coastguard Worker         else
747*8975f5c5SAndroid Build Coastguard Worker         {
748*8975f5c5SAndroid Build Coastguard Worker             mBlendFuncConstantAlphaDrawBuffers.reset();
749*8975f5c5SAndroid Build Coastguard Worker         }
750*8975f5c5SAndroid Build Coastguard Worker     }
751*8975f5c5SAndroid Build Coastguard Worker 
752*8975f5c5SAndroid Build Coastguard Worker     mSetBlendFactorsIndexedInvoked = false;
753*8975f5c5SAndroid Build Coastguard Worker     mBlendStateExt.setFactors(sourceRGB, destRGB, sourceAlpha, destAlpha);
754*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_BLEND_FUNCS);
755*8975f5c5SAndroid Build Coastguard Worker }
756*8975f5c5SAndroid Build Coastguard Worker 
setBlendFactorsIndexed(GLenum sourceRGB,GLenum destRGB,GLenum sourceAlpha,GLenum destAlpha,GLuint index)757*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlendFactorsIndexed(GLenum sourceRGB,
758*8975f5c5SAndroid Build Coastguard Worker                                           GLenum destRGB,
759*8975f5c5SAndroid Build Coastguard Worker                                           GLenum sourceAlpha,
760*8975f5c5SAndroid Build Coastguard Worker                                           GLenum destAlpha,
761*8975f5c5SAndroid Build Coastguard Worker                                           GLuint index)
762*8975f5c5SAndroid Build Coastguard Worker {
763*8975f5c5SAndroid Build Coastguard Worker     if (mNoSimultaneousConstantColorAndAlphaBlendFunc)
764*8975f5c5SAndroid Build Coastguard Worker     {
765*8975f5c5SAndroid Build Coastguard Worker         mBlendFuncConstantColorDrawBuffers.set(index, hasConstantColor(sourceRGB, destRGB));
766*8975f5c5SAndroid Build Coastguard Worker         mBlendFuncConstantAlphaDrawBuffers.set(index, hasConstantAlpha(sourceRGB, destRGB));
767*8975f5c5SAndroid Build Coastguard Worker     }
768*8975f5c5SAndroid Build Coastguard Worker 
769*8975f5c5SAndroid Build Coastguard Worker     mSetBlendFactorsIndexedInvoked = true;
770*8975f5c5SAndroid Build Coastguard Worker     mBlendStateExt.setFactorsIndexed(index, sourceRGB, destRGB, sourceAlpha, destAlpha);
771*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_BLEND_FUNCS);
772*8975f5c5SAndroid Build Coastguard Worker }
773*8975f5c5SAndroid Build Coastguard Worker 
setBlendColor(float red,float green,float blue,float alpha)774*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlendColor(float red, float green, float blue, float alpha)
775*8975f5c5SAndroid Build Coastguard Worker {
776*8975f5c5SAndroid Build Coastguard Worker     // In ES2 without render-to-float extensions, BlendColor clamps to [0,1] on store.
777*8975f5c5SAndroid Build Coastguard Worker     // On ES3+, or with render-to-float exts enabled, it does not clamp on store.
778*8975f5c5SAndroid Build Coastguard Worker     const bool isES2 = mClientVersion.major == 2;
779*8975f5c5SAndroid Build Coastguard Worker     const bool hasFloatBlending =
780*8975f5c5SAndroid Build Coastguard Worker         mExtensions.colorBufferFloatEXT || mExtensions.colorBufferHalfFloatEXT ||
781*8975f5c5SAndroid Build Coastguard Worker         mExtensions.colorBufferFloatRgbCHROMIUM || mExtensions.colorBufferFloatRgbaCHROMIUM;
782*8975f5c5SAndroid Build Coastguard Worker     if ((isES2 && !hasFloatBlending) || mNoUnclampedBlendColor)
783*8975f5c5SAndroid Build Coastguard Worker     {
784*8975f5c5SAndroid Build Coastguard Worker         red   = clamp01(red);
785*8975f5c5SAndroid Build Coastguard Worker         green = clamp01(green);
786*8975f5c5SAndroid Build Coastguard Worker         blue  = clamp01(blue);
787*8975f5c5SAndroid Build Coastguard Worker         alpha = clamp01(alpha);
788*8975f5c5SAndroid Build Coastguard Worker     }
789*8975f5c5SAndroid Build Coastguard Worker 
790*8975f5c5SAndroid Build Coastguard Worker     if (mBlendColor.red != red || mBlendColor.green != green || mBlendColor.blue != blue ||
791*8975f5c5SAndroid Build Coastguard Worker         mBlendColor.alpha != alpha)
792*8975f5c5SAndroid Build Coastguard Worker     {
793*8975f5c5SAndroid Build Coastguard Worker         mBlendColor.red   = red;
794*8975f5c5SAndroid Build Coastguard Worker         mBlendColor.green = green;
795*8975f5c5SAndroid Build Coastguard Worker         mBlendColor.blue  = blue;
796*8975f5c5SAndroid Build Coastguard Worker         mBlendColor.alpha = alpha;
797*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_BLEND_COLOR);
798*8975f5c5SAndroid Build Coastguard Worker     }
799*8975f5c5SAndroid Build Coastguard Worker }
800*8975f5c5SAndroid Build Coastguard Worker 
setBlendEquation(GLenum rgbEquation,GLenum alphaEquation)801*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
802*8975f5c5SAndroid Build Coastguard Worker {
803*8975f5c5SAndroid Build Coastguard Worker     if (mSetBlendEquationsIndexedInvoked || mBlendState.blendEquationRGB != rgbEquation ||
804*8975f5c5SAndroid Build Coastguard Worker         mBlendState.blendEquationAlpha != alphaEquation)
805*8975f5c5SAndroid Build Coastguard Worker     {
806*8975f5c5SAndroid Build Coastguard Worker         mBlendState.blendEquationRGB   = rgbEquation;
807*8975f5c5SAndroid Build Coastguard Worker         mBlendState.blendEquationAlpha = alphaEquation;
808*8975f5c5SAndroid Build Coastguard Worker 
809*8975f5c5SAndroid Build Coastguard Worker         mSetBlendEquationsIndexedInvoked = false;
810*8975f5c5SAndroid Build Coastguard Worker         mBlendStateExt.setEquations(rgbEquation, alphaEquation);
811*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_BLEND_EQUATIONS);
812*8975f5c5SAndroid Build Coastguard Worker     }
813*8975f5c5SAndroid Build Coastguard Worker }
814*8975f5c5SAndroid Build Coastguard Worker 
setBlendEquationIndexed(GLenum rgbEquation,GLenum alphaEquation,GLuint index)815*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlendEquationIndexed(GLenum rgbEquation, GLenum alphaEquation, GLuint index)
816*8975f5c5SAndroid Build Coastguard Worker {
817*8975f5c5SAndroid Build Coastguard Worker     mSetBlendEquationsIndexedInvoked = true;
818*8975f5c5SAndroid Build Coastguard Worker     mBlendStateExt.setEquationsIndexed(index, rgbEquation, alphaEquation);
819*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_BLEND_EQUATIONS);
820*8975f5c5SAndroid Build Coastguard Worker }
821*8975f5c5SAndroid Build Coastguard Worker 
setStencilTest(bool enabled)822*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilTest(bool enabled)
823*8975f5c5SAndroid Build Coastguard Worker {
824*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.stencilTest != enabled)
825*8975f5c5SAndroid Build Coastguard Worker     {
826*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilTest = enabled;
827*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_STENCIL_TEST_ENABLED);
828*8975f5c5SAndroid Build Coastguard Worker     }
829*8975f5c5SAndroid Build Coastguard Worker }
830*8975f5c5SAndroid Build Coastguard Worker 
setStencilParams(GLenum stencilFunc,GLint stencilRef,GLuint stencilMask)831*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
832*8975f5c5SAndroid Build Coastguard Worker {
833*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.stencilFunc != stencilFunc || mStencilRef != stencilRef ||
834*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilMask != stencilMask)
835*8975f5c5SAndroid Build Coastguard Worker     {
836*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilFunc = stencilFunc;
837*8975f5c5SAndroid Build Coastguard Worker         mStencilRef               = stencilRef;
838*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilMask = stencilMask;
839*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_STENCIL_FUNCS_FRONT);
840*8975f5c5SAndroid Build Coastguard Worker     }
841*8975f5c5SAndroid Build Coastguard Worker }
842*8975f5c5SAndroid Build Coastguard Worker 
setStencilBackParams(GLenum stencilBackFunc,GLint stencilBackRef,GLuint stencilBackMask)843*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilBackParams(GLenum stencilBackFunc,
844*8975f5c5SAndroid Build Coastguard Worker                                         GLint stencilBackRef,
845*8975f5c5SAndroid Build Coastguard Worker                                         GLuint stencilBackMask)
846*8975f5c5SAndroid Build Coastguard Worker {
847*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.stencilBackFunc != stencilBackFunc || mStencilBackRef != stencilBackRef ||
848*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackMask != stencilBackMask)
849*8975f5c5SAndroid Build Coastguard Worker     {
850*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackFunc = stencilBackFunc;
851*8975f5c5SAndroid Build Coastguard Worker         mStencilBackRef               = stencilBackRef;
852*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackMask = stencilBackMask;
853*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_STENCIL_FUNCS_BACK);
854*8975f5c5SAndroid Build Coastguard Worker     }
855*8975f5c5SAndroid Build Coastguard Worker }
856*8975f5c5SAndroid Build Coastguard Worker 
setStencilWritemask(GLuint stencilWritemask)857*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilWritemask(GLuint stencilWritemask)
858*8975f5c5SAndroid Build Coastguard Worker {
859*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.stencilWritemask != stencilWritemask)
860*8975f5c5SAndroid Build Coastguard Worker     {
861*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilWritemask = stencilWritemask;
862*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
863*8975f5c5SAndroid Build Coastguard Worker     }
864*8975f5c5SAndroid Build Coastguard Worker }
865*8975f5c5SAndroid Build Coastguard Worker 
setStencilBackWritemask(GLuint stencilBackWritemask)866*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilBackWritemask(GLuint stencilBackWritemask)
867*8975f5c5SAndroid Build Coastguard Worker {
868*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.stencilBackWritemask != stencilBackWritemask)
869*8975f5c5SAndroid Build Coastguard Worker     {
870*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackWritemask = stencilBackWritemask;
871*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
872*8975f5c5SAndroid Build Coastguard Worker     }
873*8975f5c5SAndroid Build Coastguard Worker }
874*8975f5c5SAndroid Build Coastguard Worker 
setStencilOperations(GLenum stencilFail,GLenum stencilPassDepthFail,GLenum stencilPassDepthPass)875*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilOperations(GLenum stencilFail,
876*8975f5c5SAndroid Build Coastguard Worker                                         GLenum stencilPassDepthFail,
877*8975f5c5SAndroid Build Coastguard Worker                                         GLenum stencilPassDepthPass)
878*8975f5c5SAndroid Build Coastguard Worker {
879*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.stencilFail != stencilFail ||
880*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilPassDepthFail != stencilPassDepthFail ||
881*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilPassDepthPass != stencilPassDepthPass)
882*8975f5c5SAndroid Build Coastguard Worker     {
883*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilFail          = stencilFail;
884*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
885*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
886*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_STENCIL_OPS_FRONT);
887*8975f5c5SAndroid Build Coastguard Worker     }
888*8975f5c5SAndroid Build Coastguard Worker }
889*8975f5c5SAndroid Build Coastguard Worker 
setStencilBackOperations(GLenum stencilBackFail,GLenum stencilBackPassDepthFail,GLenum stencilBackPassDepthPass)890*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setStencilBackOperations(GLenum stencilBackFail,
891*8975f5c5SAndroid Build Coastguard Worker                                             GLenum stencilBackPassDepthFail,
892*8975f5c5SAndroid Build Coastguard Worker                                             GLenum stencilBackPassDepthPass)
893*8975f5c5SAndroid Build Coastguard Worker {
894*8975f5c5SAndroid Build Coastguard Worker     if (mDepthStencil.stencilBackFail != stencilBackFail ||
895*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackPassDepthFail != stencilBackPassDepthFail ||
896*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackPassDepthPass != stencilBackPassDepthPass)
897*8975f5c5SAndroid Build Coastguard Worker     {
898*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackFail          = stencilBackFail;
899*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
900*8975f5c5SAndroid Build Coastguard Worker         mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
901*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_STENCIL_OPS_BACK);
902*8975f5c5SAndroid Build Coastguard Worker     }
903*8975f5c5SAndroid Build Coastguard Worker }
904*8975f5c5SAndroid Build Coastguard Worker 
setPolygonMode(PolygonMode mode)905*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPolygonMode(PolygonMode mode)
906*8975f5c5SAndroid Build Coastguard Worker {
907*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.polygonMode != mode)
908*8975f5c5SAndroid Build Coastguard Worker     {
909*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.polygonMode = mode;
910*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
911*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_POLYGON_MODE);
912*8975f5c5SAndroid Build Coastguard Worker     }
913*8975f5c5SAndroid Build Coastguard Worker }
914*8975f5c5SAndroid Build Coastguard Worker 
setPolygonOffsetPoint(bool enabled)915*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPolygonOffsetPoint(bool enabled)
916*8975f5c5SAndroid Build Coastguard Worker {
917*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.polygonOffsetPoint != enabled)
918*8975f5c5SAndroid Build Coastguard Worker     {
919*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.polygonOffsetPoint = enabled;
920*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
921*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_POLYGON_OFFSET_POINT_ENABLED);
922*8975f5c5SAndroid Build Coastguard Worker     }
923*8975f5c5SAndroid Build Coastguard Worker }
924*8975f5c5SAndroid Build Coastguard Worker 
setPolygonOffsetLine(bool enabled)925*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPolygonOffsetLine(bool enabled)
926*8975f5c5SAndroid Build Coastguard Worker {
927*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.polygonOffsetLine != enabled)
928*8975f5c5SAndroid Build Coastguard Worker     {
929*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.polygonOffsetLine = enabled;
930*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
931*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_POLYGON_OFFSET_LINE_ENABLED);
932*8975f5c5SAndroid Build Coastguard Worker     }
933*8975f5c5SAndroid Build Coastguard Worker }
934*8975f5c5SAndroid Build Coastguard Worker 
setPolygonOffsetFill(bool enabled)935*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPolygonOffsetFill(bool enabled)
936*8975f5c5SAndroid Build Coastguard Worker {
937*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.polygonOffsetFill != enabled)
938*8975f5c5SAndroid Build Coastguard Worker     {
939*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.polygonOffsetFill = enabled;
940*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
941*8975f5c5SAndroid Build Coastguard Worker     }
942*8975f5c5SAndroid Build Coastguard Worker }
943*8975f5c5SAndroid Build Coastguard Worker 
setPolygonOffsetParams(GLfloat factor,GLfloat units,GLfloat clamp)944*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPolygonOffsetParams(GLfloat factor, GLfloat units, GLfloat clamp)
945*8975f5c5SAndroid Build Coastguard Worker {
946*8975f5c5SAndroid Build Coastguard Worker     // An application can pass NaN values here, so handle this gracefully
947*8975f5c5SAndroid Build Coastguard Worker     mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
948*8975f5c5SAndroid Build Coastguard Worker     mRasterizer.polygonOffsetUnits  = units != units ? 0.0f : units;
949*8975f5c5SAndroid Build Coastguard Worker     mRasterizer.polygonOffsetClamp  = clamp != clamp ? 0.0f : clamp;
950*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_POLYGON_OFFSET);
951*8975f5c5SAndroid Build Coastguard Worker }
952*8975f5c5SAndroid Build Coastguard Worker 
setSampleAlphaToCoverage(bool enabled)953*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setSampleAlphaToCoverage(bool enabled)
954*8975f5c5SAndroid Build Coastguard Worker {
955*8975f5c5SAndroid Build Coastguard Worker     if (mSampleAlphaToCoverage != enabled)
956*8975f5c5SAndroid Build Coastguard Worker     {
957*8975f5c5SAndroid Build Coastguard Worker         mSampleAlphaToCoverage = enabled;
958*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
959*8975f5c5SAndroid Build Coastguard Worker     }
960*8975f5c5SAndroid Build Coastguard Worker }
961*8975f5c5SAndroid Build Coastguard Worker 
setSampleCoverage(bool enabled)962*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setSampleCoverage(bool enabled)
963*8975f5c5SAndroid Build Coastguard Worker {
964*8975f5c5SAndroid Build Coastguard Worker     if (mSampleCoverage != enabled)
965*8975f5c5SAndroid Build Coastguard Worker     {
966*8975f5c5SAndroid Build Coastguard Worker         mSampleCoverage = enabled;
967*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
968*8975f5c5SAndroid Build Coastguard Worker     }
969*8975f5c5SAndroid Build Coastguard Worker }
970*8975f5c5SAndroid Build Coastguard Worker 
setSampleCoverageParams(GLclampf value,bool invert)971*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setSampleCoverageParams(GLclampf value, bool invert)
972*8975f5c5SAndroid Build Coastguard Worker {
973*8975f5c5SAndroid Build Coastguard Worker     mSampleCoverageValue  = value;
974*8975f5c5SAndroid Build Coastguard Worker     mSampleCoverageInvert = invert;
975*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_SAMPLE_COVERAGE);
976*8975f5c5SAndroid Build Coastguard Worker }
977*8975f5c5SAndroid Build Coastguard Worker 
setSampleMaskEnabled(bool enabled)978*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setSampleMaskEnabled(bool enabled)
979*8975f5c5SAndroid Build Coastguard Worker {
980*8975f5c5SAndroid Build Coastguard Worker     if (mSampleMask != enabled)
981*8975f5c5SAndroid Build Coastguard Worker     {
982*8975f5c5SAndroid Build Coastguard Worker         mSampleMask = enabled;
983*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SAMPLE_MASK_ENABLED);
984*8975f5c5SAndroid Build Coastguard Worker     }
985*8975f5c5SAndroid Build Coastguard Worker }
986*8975f5c5SAndroid Build Coastguard Worker 
setSampleMaskParams(GLuint maskNumber,GLbitfield mask)987*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setSampleMaskParams(GLuint maskNumber, GLbitfield mask)
988*8975f5c5SAndroid Build Coastguard Worker {
989*8975f5c5SAndroid Build Coastguard Worker     ASSERT(maskNumber < mMaxSampleMaskWords);
990*8975f5c5SAndroid Build Coastguard Worker     mSampleMaskValues[maskNumber] = mask;
991*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_SAMPLE_MASK);
992*8975f5c5SAndroid Build Coastguard Worker }
993*8975f5c5SAndroid Build Coastguard Worker 
setSampleAlphaToOne(bool enabled)994*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setSampleAlphaToOne(bool enabled)
995*8975f5c5SAndroid Build Coastguard Worker {
996*8975f5c5SAndroid Build Coastguard Worker     if (mSampleAlphaToOne != enabled)
997*8975f5c5SAndroid Build Coastguard Worker     {
998*8975f5c5SAndroid Build Coastguard Worker         mSampleAlphaToOne = enabled;
999*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SAMPLE_ALPHA_TO_ONE);
1000*8975f5c5SAndroid Build Coastguard Worker     }
1001*8975f5c5SAndroid Build Coastguard Worker }
1002*8975f5c5SAndroid Build Coastguard Worker 
setBlendAdvancedCoherent(bool enabled)1003*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBlendAdvancedCoherent(bool enabled)
1004*8975f5c5SAndroid Build Coastguard Worker {
1005*8975f5c5SAndroid Build Coastguard Worker     if (mBlendAdvancedCoherent != enabled)
1006*8975f5c5SAndroid Build Coastguard Worker     {
1007*8975f5c5SAndroid Build Coastguard Worker         mBlendAdvancedCoherent = enabled;
1008*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::EXTENDED_DIRTY_BIT_BLEND_ADVANCED_COHERENT);
1009*8975f5c5SAndroid Build Coastguard Worker     }
1010*8975f5c5SAndroid Build Coastguard Worker }
1011*8975f5c5SAndroid Build Coastguard Worker 
setMultisampling(bool enabled)1012*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setMultisampling(bool enabled)
1013*8975f5c5SAndroid Build Coastguard Worker {
1014*8975f5c5SAndroid Build Coastguard Worker     if (mMultiSampling != enabled)
1015*8975f5c5SAndroid Build Coastguard Worker     {
1016*8975f5c5SAndroid Build Coastguard Worker         mMultiSampling = enabled;
1017*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_MULTISAMPLING);
1018*8975f5c5SAndroid Build Coastguard Worker     }
1019*8975f5c5SAndroid Build Coastguard Worker }
1020*8975f5c5SAndroid Build Coastguard Worker 
setSampleShading(bool enabled)1021*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setSampleShading(bool enabled)
1022*8975f5c5SAndroid Build Coastguard Worker {
1023*8975f5c5SAndroid Build Coastguard Worker     if (mIsSampleShadingEnabled != enabled)
1024*8975f5c5SAndroid Build Coastguard Worker     {
1025*8975f5c5SAndroid Build Coastguard Worker         mIsSampleShadingEnabled = enabled;
1026*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SAMPLE_SHADING);
1027*8975f5c5SAndroid Build Coastguard Worker     }
1028*8975f5c5SAndroid Build Coastguard Worker }
1029*8975f5c5SAndroid Build Coastguard Worker 
setMinSampleShading(float value)1030*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setMinSampleShading(float value)
1031*8975f5c5SAndroid Build Coastguard Worker {
1032*8975f5c5SAndroid Build Coastguard Worker     value = gl::clamp01(value);
1033*8975f5c5SAndroid Build Coastguard Worker 
1034*8975f5c5SAndroid Build Coastguard Worker     if (mMinSampleShading != value)
1035*8975f5c5SAndroid Build Coastguard Worker     {
1036*8975f5c5SAndroid Build Coastguard Worker         mMinSampleShading = value;
1037*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SAMPLE_SHADING);
1038*8975f5c5SAndroid Build Coastguard Worker     }
1039*8975f5c5SAndroid Build Coastguard Worker }
1040*8975f5c5SAndroid Build Coastguard Worker 
setScissorTest(bool enabled)1041*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setScissorTest(bool enabled)
1042*8975f5c5SAndroid Build Coastguard Worker {
1043*8975f5c5SAndroid Build Coastguard Worker     if (mScissorTest != enabled)
1044*8975f5c5SAndroid Build Coastguard Worker     {
1045*8975f5c5SAndroid Build Coastguard Worker         mScissorTest = enabled;
1046*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SCISSOR_TEST_ENABLED);
1047*8975f5c5SAndroid Build Coastguard Worker     }
1048*8975f5c5SAndroid Build Coastguard Worker }
1049*8975f5c5SAndroid Build Coastguard Worker 
setScissorParams(GLint x,GLint y,GLsizei width,GLsizei height)1050*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
1051*8975f5c5SAndroid Build Coastguard Worker {
1052*8975f5c5SAndroid Build Coastguard Worker     // Skip if same scissor info
1053*8975f5c5SAndroid Build Coastguard Worker     if (mScissor.x != x || mScissor.y != y || mScissor.width != width || mScissor.height != height)
1054*8975f5c5SAndroid Build Coastguard Worker     {
1055*8975f5c5SAndroid Build Coastguard Worker         mScissor.x      = x;
1056*8975f5c5SAndroid Build Coastguard Worker         mScissor.y      = y;
1057*8975f5c5SAndroid Build Coastguard Worker         mScissor.width  = width;
1058*8975f5c5SAndroid Build Coastguard Worker         mScissor.height = height;
1059*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_SCISSOR);
1060*8975f5c5SAndroid Build Coastguard Worker     }
1061*8975f5c5SAndroid Build Coastguard Worker }
1062*8975f5c5SAndroid Build Coastguard Worker 
setDither(bool enabled)1063*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setDither(bool enabled)
1064*8975f5c5SAndroid Build Coastguard Worker {
1065*8975f5c5SAndroid Build Coastguard Worker     if (mRasterizer.dither != enabled)
1066*8975f5c5SAndroid Build Coastguard Worker     {
1067*8975f5c5SAndroid Build Coastguard Worker         mRasterizer.dither = enabled;
1068*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_DITHER_ENABLED);
1069*8975f5c5SAndroid Build Coastguard Worker     }
1070*8975f5c5SAndroid Build Coastguard Worker }
1071*8975f5c5SAndroid Build Coastguard Worker 
setViewportParams(GLint x,GLint y,GLsizei width,GLsizei height)1072*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setViewportParams(GLint x, GLint y, GLsizei width, GLsizei height)
1073*8975f5c5SAndroid Build Coastguard Worker {
1074*8975f5c5SAndroid Build Coastguard Worker     // [OpenGL ES 2.0.25] section 2.12.1 page 45:
1075*8975f5c5SAndroid Build Coastguard Worker     // Viewport width and height are clamped to implementation-dependent maximums when specified.
1076*8975f5c5SAndroid Build Coastguard Worker     width  = std::min(width, mCaps.maxViewportWidth);
1077*8975f5c5SAndroid Build Coastguard Worker     height = std::min(height, mCaps.maxViewportHeight);
1078*8975f5c5SAndroid Build Coastguard Worker 
1079*8975f5c5SAndroid Build Coastguard Worker     // Skip if same viewport info
1080*8975f5c5SAndroid Build Coastguard Worker     if (mViewport.x != x || mViewport.y != y || mViewport.width != width ||
1081*8975f5c5SAndroid Build Coastguard Worker         mViewport.height != height)
1082*8975f5c5SAndroid Build Coastguard Worker     {
1083*8975f5c5SAndroid Build Coastguard Worker         mViewport.x      = x;
1084*8975f5c5SAndroid Build Coastguard Worker         mViewport.y      = y;
1085*8975f5c5SAndroid Build Coastguard Worker         mViewport.width  = width;
1086*8975f5c5SAndroid Build Coastguard Worker         mViewport.height = height;
1087*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_VIEWPORT);
1088*8975f5c5SAndroid Build Coastguard Worker     }
1089*8975f5c5SAndroid Build Coastguard Worker }
1090*8975f5c5SAndroid Build Coastguard Worker 
setShadingRate(GLenum rate)1091*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setShadingRate(GLenum rate)
1092*8975f5c5SAndroid Build Coastguard Worker {
1093*8975f5c5SAndroid Build Coastguard Worker     mShadingRate = FromGLenum<ShadingRate>(rate);
1094*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
1095*8975f5c5SAndroid Build Coastguard Worker     mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_SHADING_RATE);
1096*8975f5c5SAndroid Build Coastguard Worker }
1097*8975f5c5SAndroid Build Coastguard Worker 
setPackAlignment(GLint alignment)1098*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPackAlignment(GLint alignment)
1099*8975f5c5SAndroid Build Coastguard Worker {
1100*8975f5c5SAndroid Build Coastguard Worker     mPack.alignment = alignment;
1101*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PACK_STATE);
1102*8975f5c5SAndroid Build Coastguard Worker }
1103*8975f5c5SAndroid Build Coastguard Worker 
setPackReverseRowOrder(bool reverseRowOrder)1104*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPackReverseRowOrder(bool reverseRowOrder)
1105*8975f5c5SAndroid Build Coastguard Worker {
1106*8975f5c5SAndroid Build Coastguard Worker     mPack.reverseRowOrder = reverseRowOrder;
1107*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PACK_STATE);
1108*8975f5c5SAndroid Build Coastguard Worker }
1109*8975f5c5SAndroid Build Coastguard Worker 
setPackRowLength(GLint rowLength)1110*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPackRowLength(GLint rowLength)
1111*8975f5c5SAndroid Build Coastguard Worker {
1112*8975f5c5SAndroid Build Coastguard Worker     mPack.rowLength = rowLength;
1113*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PACK_STATE);
1114*8975f5c5SAndroid Build Coastguard Worker }
1115*8975f5c5SAndroid Build Coastguard Worker 
setPackSkipRows(GLint skipRows)1116*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPackSkipRows(GLint skipRows)
1117*8975f5c5SAndroid Build Coastguard Worker {
1118*8975f5c5SAndroid Build Coastguard Worker     mPack.skipRows = skipRows;
1119*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PACK_STATE);
1120*8975f5c5SAndroid Build Coastguard Worker }
1121*8975f5c5SAndroid Build Coastguard Worker 
setPackSkipPixels(GLint skipPixels)1122*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPackSkipPixels(GLint skipPixels)
1123*8975f5c5SAndroid Build Coastguard Worker {
1124*8975f5c5SAndroid Build Coastguard Worker     mPack.skipPixels = skipPixels;
1125*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PACK_STATE);
1126*8975f5c5SAndroid Build Coastguard Worker }
1127*8975f5c5SAndroid Build Coastguard Worker 
setUnpackAlignment(GLint alignment)1128*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setUnpackAlignment(GLint alignment)
1129*8975f5c5SAndroid Build Coastguard Worker {
1130*8975f5c5SAndroid Build Coastguard Worker     mUnpack.alignment = alignment;
1131*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_UNPACK_STATE);
1132*8975f5c5SAndroid Build Coastguard Worker }
1133*8975f5c5SAndroid Build Coastguard Worker 
setUnpackRowLength(GLint rowLength)1134*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setUnpackRowLength(GLint rowLength)
1135*8975f5c5SAndroid Build Coastguard Worker {
1136*8975f5c5SAndroid Build Coastguard Worker     mUnpack.rowLength = rowLength;
1137*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_UNPACK_STATE);
1138*8975f5c5SAndroid Build Coastguard Worker }
1139*8975f5c5SAndroid Build Coastguard Worker 
setUnpackImageHeight(GLint imageHeight)1140*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setUnpackImageHeight(GLint imageHeight)
1141*8975f5c5SAndroid Build Coastguard Worker {
1142*8975f5c5SAndroid Build Coastguard Worker     mUnpack.imageHeight = imageHeight;
1143*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_UNPACK_STATE);
1144*8975f5c5SAndroid Build Coastguard Worker }
1145*8975f5c5SAndroid Build Coastguard Worker 
hasActivelyOverriddenPLSDrawBuffers(GLint * firstActivePLSDrawBuffer) const1146*8975f5c5SAndroid Build Coastguard Worker bool PrivateState::hasActivelyOverriddenPLSDrawBuffers(GLint *firstActivePLSDrawBuffer) const
1147*8975f5c5SAndroid Build Coastguard Worker {
1148*8975f5c5SAndroid Build Coastguard Worker     if (mPixelLocalStorageActivePlanes != 0)
1149*8975f5c5SAndroid Build Coastguard Worker     {
1150*8975f5c5SAndroid Build Coastguard Worker         *firstActivePLSDrawBuffer =
1151*8975f5c5SAndroid Build Coastguard Worker             PixelLocalStorage::FirstOverriddenDrawBuffer(mCaps, mPixelLocalStorageActivePlanes);
1152*8975f5c5SAndroid Build Coastguard Worker         return *firstActivePLSDrawBuffer < mCaps.maxDrawBuffers;
1153*8975f5c5SAndroid Build Coastguard Worker     }
1154*8975f5c5SAndroid Build Coastguard Worker     return false;
1155*8975f5c5SAndroid Build Coastguard Worker }
1156*8975f5c5SAndroid Build Coastguard Worker 
isActivelyOverriddenPLSDrawBuffer(GLint drawbuffer) const1157*8975f5c5SAndroid Build Coastguard Worker bool PrivateState::isActivelyOverriddenPLSDrawBuffer(GLint drawbuffer) const
1158*8975f5c5SAndroid Build Coastguard Worker {
1159*8975f5c5SAndroid Build Coastguard Worker     return mPixelLocalStorageActivePlanes != 0 &&
1160*8975f5c5SAndroid Build Coastguard Worker            drawbuffer >=
1161*8975f5c5SAndroid Build Coastguard Worker                PixelLocalStorage::FirstOverriddenDrawBuffer(mCaps, mPixelLocalStorageActivePlanes);
1162*8975f5c5SAndroid Build Coastguard Worker }
1163*8975f5c5SAndroid Build Coastguard Worker 
setUnpackSkipImages(GLint skipImages)1164*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setUnpackSkipImages(GLint skipImages)
1165*8975f5c5SAndroid Build Coastguard Worker {
1166*8975f5c5SAndroid Build Coastguard Worker     mUnpack.skipImages = skipImages;
1167*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_UNPACK_STATE);
1168*8975f5c5SAndroid Build Coastguard Worker }
1169*8975f5c5SAndroid Build Coastguard Worker 
setUnpackSkipRows(GLint skipRows)1170*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setUnpackSkipRows(GLint skipRows)
1171*8975f5c5SAndroid Build Coastguard Worker {
1172*8975f5c5SAndroid Build Coastguard Worker     mUnpack.skipRows = skipRows;
1173*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_UNPACK_STATE);
1174*8975f5c5SAndroid Build Coastguard Worker }
1175*8975f5c5SAndroid Build Coastguard Worker 
setUnpackSkipPixels(GLint skipPixels)1176*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setUnpackSkipPixels(GLint skipPixels)
1177*8975f5c5SAndroid Build Coastguard Worker {
1178*8975f5c5SAndroid Build Coastguard Worker     mUnpack.skipPixels = skipPixels;
1179*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_UNPACK_STATE);
1180*8975f5c5SAndroid Build Coastguard Worker }
1181*8975f5c5SAndroid Build Coastguard Worker 
setCoverageModulation(GLenum components)1182*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setCoverageModulation(GLenum components)
1183*8975f5c5SAndroid Build Coastguard Worker {
1184*8975f5c5SAndroid Build Coastguard Worker     if (mCoverageModulation != components)
1185*8975f5c5SAndroid Build Coastguard Worker     {
1186*8975f5c5SAndroid Build Coastguard Worker         mCoverageModulation = components;
1187*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_COVERAGE_MODULATION);
1188*8975f5c5SAndroid Build Coastguard Worker     }
1189*8975f5c5SAndroid Build Coastguard Worker }
1190*8975f5c5SAndroid Build Coastguard Worker 
setFramebufferSRGB(bool sRGB)1191*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setFramebufferSRGB(bool sRGB)
1192*8975f5c5SAndroid Build Coastguard Worker {
1193*8975f5c5SAndroid Build Coastguard Worker     if (mFramebufferSRGB != sRGB)
1194*8975f5c5SAndroid Build Coastguard Worker     {
1195*8975f5c5SAndroid Build Coastguard Worker         mFramebufferSRGB = sRGB;
1196*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_FRAMEBUFFER_SRGB_WRITE_CONTROL_MODE);
1197*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
1198*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_DRAW_ATTACHMENTS);
1199*8975f5c5SAndroid Build Coastguard Worker     }
1200*8975f5c5SAndroid Build Coastguard Worker }
1201*8975f5c5SAndroid Build Coastguard Worker 
setPatchVertices(GLuint value)1202*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPatchVertices(GLuint value)
1203*8975f5c5SAndroid Build Coastguard Worker {
1204*8975f5c5SAndroid Build Coastguard Worker     if (mPatchVertices != value)
1205*8975f5c5SAndroid Build Coastguard Worker     {
1206*8975f5c5SAndroid Build Coastguard Worker         mPatchVertices = value;
1207*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_PATCH_VERTICES);
1208*8975f5c5SAndroid Build Coastguard Worker     }
1209*8975f5c5SAndroid Build Coastguard Worker }
1210*8975f5c5SAndroid Build Coastguard Worker 
setPixelLocalStorageActivePlanes(GLsizei n)1211*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setPixelLocalStorageActivePlanes(GLsizei n)
1212*8975f5c5SAndroid Build Coastguard Worker {
1213*8975f5c5SAndroid Build Coastguard Worker     mPixelLocalStorageActivePlanes = n;
1214*8975f5c5SAndroid Build Coastguard Worker }
1215*8975f5c5SAndroid Build Coastguard Worker 
setLineWidth(GLfloat width)1216*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setLineWidth(GLfloat width)
1217*8975f5c5SAndroid Build Coastguard Worker {
1218*8975f5c5SAndroid Build Coastguard Worker     mLineWidth = width;
1219*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_LINE_WIDTH);
1220*8975f5c5SAndroid Build Coastguard Worker }
1221*8975f5c5SAndroid Build Coastguard Worker 
setGenerateMipmapHint(GLenum hint)1222*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setGenerateMipmapHint(GLenum hint)
1223*8975f5c5SAndroid Build Coastguard Worker {
1224*8975f5c5SAndroid Build Coastguard Worker     mGenerateMipmapHint = hint;
1225*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
1226*8975f5c5SAndroid Build Coastguard Worker     mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_MIPMAP_GENERATION_HINT);
1227*8975f5c5SAndroid Build Coastguard Worker }
1228*8975f5c5SAndroid Build Coastguard Worker 
setFragmentShaderDerivativeHint(GLenum hint)1229*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setFragmentShaderDerivativeHint(GLenum hint)
1230*8975f5c5SAndroid Build Coastguard Worker {
1231*8975f5c5SAndroid Build Coastguard Worker     mFragmentShaderDerivativeHint = hint;
1232*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
1233*8975f5c5SAndroid Build Coastguard Worker     mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_SHADER_DERIVATIVE_HINT);
1234*8975f5c5SAndroid Build Coastguard Worker     // Note: This hint could be propagated to shader translator so we can write ddx, ddx_coarse, or
1235*8975f5c5SAndroid Build Coastguard Worker     // ddx_fine depending on the hint.  Ignore for now. It is valid for implementations to ignore
1236*8975f5c5SAndroid Build Coastguard Worker     // the hint.
1237*8975f5c5SAndroid Build Coastguard Worker }
1238*8975f5c5SAndroid Build Coastguard Worker 
setActiveSampler(unsigned int active)1239*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setActiveSampler(unsigned int active)
1240*8975f5c5SAndroid Build Coastguard Worker {
1241*8975f5c5SAndroid Build Coastguard Worker     mActiveSampler = active;
1242*8975f5c5SAndroid Build Coastguard Worker }
1243*8975f5c5SAndroid Build Coastguard Worker 
getAndResetDirtyCurrentValues() const1244*8975f5c5SAndroid Build Coastguard Worker AttributesMask PrivateState::getAndResetDirtyCurrentValues() const
1245*8975f5c5SAndroid Build Coastguard Worker {
1246*8975f5c5SAndroid Build Coastguard Worker     AttributesMask retVal = mDirtyCurrentValues;
1247*8975f5c5SAndroid Build Coastguard Worker     mDirtyCurrentValues.reset();
1248*8975f5c5SAndroid Build Coastguard Worker     return retVal;
1249*8975f5c5SAndroid Build Coastguard Worker }
1250*8975f5c5SAndroid Build Coastguard Worker 
setClipDistanceEnable(int idx,bool enable)1251*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setClipDistanceEnable(int idx, bool enable)
1252*8975f5c5SAndroid Build Coastguard Worker {
1253*8975f5c5SAndroid Build Coastguard Worker     if (enable)
1254*8975f5c5SAndroid Build Coastguard Worker     {
1255*8975f5c5SAndroid Build Coastguard Worker         mClipDistancesEnabled.set(idx);
1256*8975f5c5SAndroid Build Coastguard Worker     }
1257*8975f5c5SAndroid Build Coastguard Worker     else
1258*8975f5c5SAndroid Build Coastguard Worker     {
1259*8975f5c5SAndroid Build Coastguard Worker         mClipDistancesEnabled.reset(idx);
1260*8975f5c5SAndroid Build Coastguard Worker     }
1261*8975f5c5SAndroid Build Coastguard Worker 
1262*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
1263*8975f5c5SAndroid Build Coastguard Worker     mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_CLIP_DISTANCES);
1264*8975f5c5SAndroid Build Coastguard Worker }
1265*8975f5c5SAndroid Build Coastguard Worker 
setBoundingBox(GLfloat minX,GLfloat minY,GLfloat minZ,GLfloat minW,GLfloat maxX,GLfloat maxY,GLfloat maxZ,GLfloat maxW)1266*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setBoundingBox(GLfloat minX,
1267*8975f5c5SAndroid Build Coastguard Worker                                   GLfloat minY,
1268*8975f5c5SAndroid Build Coastguard Worker                                   GLfloat minZ,
1269*8975f5c5SAndroid Build Coastguard Worker                                   GLfloat minW,
1270*8975f5c5SAndroid Build Coastguard Worker                                   GLfloat maxX,
1271*8975f5c5SAndroid Build Coastguard Worker                                   GLfloat maxY,
1272*8975f5c5SAndroid Build Coastguard Worker                                   GLfloat maxZ,
1273*8975f5c5SAndroid Build Coastguard Worker                                   GLfloat maxW)
1274*8975f5c5SAndroid Build Coastguard Worker {
1275*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMinX = minX;
1276*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMinY = minY;
1277*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMinZ = minZ;
1278*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMinW = minW;
1279*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMaxX = maxX;
1280*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMaxY = maxY;
1281*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMaxZ = maxZ;
1282*8975f5c5SAndroid Build Coastguard Worker     mBoundingBoxMaxW = maxW;
1283*8975f5c5SAndroid Build Coastguard Worker }
1284*8975f5c5SAndroid Build Coastguard Worker 
setLogicOpEnabled(bool enabled)1285*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setLogicOpEnabled(bool enabled)
1286*8975f5c5SAndroid Build Coastguard Worker {
1287*8975f5c5SAndroid Build Coastguard Worker     if (mLogicOpEnabled != enabled)
1288*8975f5c5SAndroid Build Coastguard Worker     {
1289*8975f5c5SAndroid Build Coastguard Worker         mLogicOpEnabled = enabled;
1290*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
1291*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_LOGIC_OP_ENABLED);
1292*8975f5c5SAndroid Build Coastguard Worker     }
1293*8975f5c5SAndroid Build Coastguard Worker }
1294*8975f5c5SAndroid Build Coastguard Worker 
setLogicOp(LogicalOperation opcode)1295*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setLogicOp(LogicalOperation opcode)
1296*8975f5c5SAndroid Build Coastguard Worker {
1297*8975f5c5SAndroid Build Coastguard Worker     if (mLogicOp != opcode)
1298*8975f5c5SAndroid Build Coastguard Worker     {
1299*8975f5c5SAndroid Build Coastguard Worker         mLogicOp = opcode;
1300*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_EXTENDED);
1301*8975f5c5SAndroid Build Coastguard Worker         mExtendedDirtyBits.set(state::EXTENDED_DIRTY_BIT_LOGIC_OP);
1302*8975f5c5SAndroid Build Coastguard Worker     }
1303*8975f5c5SAndroid Build Coastguard Worker }
1304*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribf(GLuint index,const GLfloat values[4])1305*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setVertexAttribf(GLuint index, const GLfloat values[4])
1306*8975f5c5SAndroid Build Coastguard Worker {
1307*8975f5c5SAndroid Build Coastguard Worker     ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
1308*8975f5c5SAndroid Build Coastguard Worker     mVertexAttribCurrentValues[index].setFloatValues(values);
1309*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_CURRENT_VALUES);
1310*8975f5c5SAndroid Build Coastguard Worker     mDirtyCurrentValues.set(index);
1311*8975f5c5SAndroid Build Coastguard Worker     SetComponentTypeMask(ComponentType::Float, index, &mCurrentValuesTypeMask);
1312*8975f5c5SAndroid Build Coastguard Worker }
1313*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribu(GLuint index,const GLuint values[4])1314*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setVertexAttribu(GLuint index, const GLuint values[4])
1315*8975f5c5SAndroid Build Coastguard Worker {
1316*8975f5c5SAndroid Build Coastguard Worker     ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
1317*8975f5c5SAndroid Build Coastguard Worker     mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
1318*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_CURRENT_VALUES);
1319*8975f5c5SAndroid Build Coastguard Worker     mDirtyCurrentValues.set(index);
1320*8975f5c5SAndroid Build Coastguard Worker     SetComponentTypeMask(ComponentType::UnsignedInt, index, &mCurrentValuesTypeMask);
1321*8975f5c5SAndroid Build Coastguard Worker }
1322*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribi(GLuint index,const GLint values[4])1323*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setVertexAttribi(GLuint index, const GLint values[4])
1324*8975f5c5SAndroid Build Coastguard Worker {
1325*8975f5c5SAndroid Build Coastguard Worker     ASSERT(static_cast<size_t>(index) < mVertexAttribCurrentValues.size());
1326*8975f5c5SAndroid Build Coastguard Worker     mVertexAttribCurrentValues[index].setIntValues(values);
1327*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_CURRENT_VALUES);
1328*8975f5c5SAndroid Build Coastguard Worker     mDirtyCurrentValues.set(index);
1329*8975f5c5SAndroid Build Coastguard Worker     SetComponentTypeMask(ComponentType::Int, index, &mCurrentValuesTypeMask);
1330*8975f5c5SAndroid Build Coastguard Worker }
1331*8975f5c5SAndroid Build Coastguard Worker 
setEnableFeature(GLenum feature,bool enabled)1332*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setEnableFeature(GLenum feature, bool enabled)
1333*8975f5c5SAndroid Build Coastguard Worker {
1334*8975f5c5SAndroid Build Coastguard Worker     switch (feature)
1335*8975f5c5SAndroid Build Coastguard Worker     {
1336*8975f5c5SAndroid Build Coastguard Worker         case GL_MULTISAMPLE_EXT:
1337*8975f5c5SAndroid Build Coastguard Worker             setMultisampling(enabled);
1338*8975f5c5SAndroid Build Coastguard Worker             return;
1339*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1340*8975f5c5SAndroid Build Coastguard Worker             setSampleAlphaToOne(enabled);
1341*8975f5c5SAndroid Build Coastguard Worker             return;
1342*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_ADVANCED_COHERENT_KHR:
1343*8975f5c5SAndroid Build Coastguard Worker             setBlendAdvancedCoherent(enabled);
1344*8975f5c5SAndroid Build Coastguard Worker             return;
1345*8975f5c5SAndroid Build Coastguard Worker         case GL_CULL_FACE:
1346*8975f5c5SAndroid Build Coastguard Worker             setCullFace(enabled);
1347*8975f5c5SAndroid Build Coastguard Worker             return;
1348*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_POINT_NV:
1349*8975f5c5SAndroid Build Coastguard Worker             setPolygonOffsetPoint(enabled);
1350*8975f5c5SAndroid Build Coastguard Worker             return;
1351*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_LINE_NV:
1352*8975f5c5SAndroid Build Coastguard Worker             setPolygonOffsetLine(enabled);
1353*8975f5c5SAndroid Build Coastguard Worker             return;
1354*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_FILL:
1355*8975f5c5SAndroid Build Coastguard Worker             setPolygonOffsetFill(enabled);
1356*8975f5c5SAndroid Build Coastguard Worker             return;
1357*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_CLAMP_EXT:
1358*8975f5c5SAndroid Build Coastguard Worker             setDepthClamp(enabled);
1359*8975f5c5SAndroid Build Coastguard Worker             return;
1360*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_COVERAGE:
1361*8975f5c5SAndroid Build Coastguard Worker             setSampleAlphaToCoverage(enabled);
1362*8975f5c5SAndroid Build Coastguard Worker             return;
1363*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_COVERAGE:
1364*8975f5c5SAndroid Build Coastguard Worker             setSampleCoverage(enabled);
1365*8975f5c5SAndroid Build Coastguard Worker             return;
1366*8975f5c5SAndroid Build Coastguard Worker         case GL_SCISSOR_TEST:
1367*8975f5c5SAndroid Build Coastguard Worker             setScissorTest(enabled);
1368*8975f5c5SAndroid Build Coastguard Worker             return;
1369*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_TEST:
1370*8975f5c5SAndroid Build Coastguard Worker             setStencilTest(enabled);
1371*8975f5c5SAndroid Build Coastguard Worker             return;
1372*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_TEST:
1373*8975f5c5SAndroid Build Coastguard Worker             setDepthTest(enabled);
1374*8975f5c5SAndroid Build Coastguard Worker             return;
1375*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND:
1376*8975f5c5SAndroid Build Coastguard Worker             setBlend(enabled);
1377*8975f5c5SAndroid Build Coastguard Worker             return;
1378*8975f5c5SAndroid Build Coastguard Worker         case GL_DITHER:
1379*8975f5c5SAndroid Build Coastguard Worker             setDither(enabled);
1380*8975f5c5SAndroid Build Coastguard Worker             return;
1381*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_LOGIC_OP:
1382*8975f5c5SAndroid Build Coastguard Worker             if (mClientVersion.major == 1)
1383*8975f5c5SAndroid Build Coastguard Worker             {
1384*8975f5c5SAndroid Build Coastguard Worker                 // Handle logicOp in GLES1 through the GLES1 state management and emulation.
1385*8975f5c5SAndroid Build Coastguard Worker                 // Otherwise this state could be set as part of ANGLE_logic_op.
1386*8975f5c5SAndroid Build Coastguard Worker                 break;
1387*8975f5c5SAndroid Build Coastguard Worker             }
1388*8975f5c5SAndroid Build Coastguard Worker             setLogicOpEnabled(enabled);
1389*8975f5c5SAndroid Build Coastguard Worker             return;
1390*8975f5c5SAndroid Build Coastguard Worker         case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1391*8975f5c5SAndroid Build Coastguard Worker             setPrimitiveRestart(enabled);
1392*8975f5c5SAndroid Build Coastguard Worker             return;
1393*8975f5c5SAndroid Build Coastguard Worker         case GL_RASTERIZER_DISCARD:
1394*8975f5c5SAndroid Build Coastguard Worker             setRasterizerDiscard(enabled);
1395*8975f5c5SAndroid Build Coastguard Worker             return;
1396*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_MASK:
1397*8975f5c5SAndroid Build Coastguard Worker             setSampleMaskEnabled(enabled);
1398*8975f5c5SAndroid Build Coastguard Worker             return;
1399*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1400*8975f5c5SAndroid Build Coastguard Worker             mDebug.setOutputSynchronous(enabled);
1401*8975f5c5SAndroid Build Coastguard Worker             return;
1402*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_OUTPUT:
1403*8975f5c5SAndroid Build Coastguard Worker             mDebug.setOutputEnabled(enabled);
1404*8975f5c5SAndroid Build Coastguard Worker             return;
1405*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAMEBUFFER_SRGB_EXT:
1406*8975f5c5SAndroid Build Coastguard Worker             setFramebufferSRGB(enabled);
1407*8975f5c5SAndroid Build Coastguard Worker             return;
1408*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_RECTANGLE_ANGLE:
1409*8975f5c5SAndroid Build Coastguard Worker             mTextureRectangleEnabled = enabled;
1410*8975f5c5SAndroid Build Coastguard Worker             return;
1411*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_SHADING:
1412*8975f5c5SAndroid Build Coastguard Worker             setSampleShading(enabled);
1413*8975f5c5SAndroid Build Coastguard Worker             return;
1414*8975f5c5SAndroid Build Coastguard Worker         // GL_APPLE_clip_distance / GL_EXT_clip_cull_distance / GL_ANGLE_clip_cull_distance
1415*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE0_EXT:
1416*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE1_EXT:
1417*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE2_EXT:
1418*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE3_EXT:
1419*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE4_EXT:
1420*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE5_EXT:
1421*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE6_EXT:
1422*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE7_EXT:
1423*8975f5c5SAndroid Build Coastguard Worker             // NOTE(hqle): These enums are conflicted with GLES1's enums, need
1424*8975f5c5SAndroid Build Coastguard Worker             // to do additional check here:
1425*8975f5c5SAndroid Build Coastguard Worker             if (mClientVersion.major >= 2)
1426*8975f5c5SAndroid Build Coastguard Worker             {
1427*8975f5c5SAndroid Build Coastguard Worker                 setClipDistanceEnable(feature - GL_CLIP_DISTANCE0_EXT, enabled);
1428*8975f5c5SAndroid Build Coastguard Worker                 return;
1429*8975f5c5SAndroid Build Coastguard Worker             }
1430*8975f5c5SAndroid Build Coastguard Worker             break;
1431*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADING_RATE_PRESERVE_ASPECT_RATIO_QCOM:
1432*8975f5c5SAndroid Build Coastguard Worker             mShadingRatePreserveAspectRatio = enabled;
1433*8975f5c5SAndroid Build Coastguard Worker             return;
1434*8975f5c5SAndroid Build Coastguard Worker         case GL_FETCH_PER_SAMPLE_ARM:
1435*8975f5c5SAndroid Build Coastguard Worker             mFetchPerSample = enabled;
1436*8975f5c5SAndroid Build Coastguard Worker             return;
1437*8975f5c5SAndroid Build Coastguard Worker         default:
1438*8975f5c5SAndroid Build Coastguard Worker             break;
1439*8975f5c5SAndroid Build Coastguard Worker     }
1440*8975f5c5SAndroid Build Coastguard Worker 
1441*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mClientVersion.major == 1);
1442*8975f5c5SAndroid Build Coastguard Worker 
1443*8975f5c5SAndroid Build Coastguard Worker     // GLES1 emulation. Need to separate from main switch due to conflict enum between
1444*8975f5c5SAndroid Build Coastguard Worker     // GL_CLIP_DISTANCE0_EXT & GL_CLIP_PLANE0
1445*8975f5c5SAndroid Build Coastguard Worker     switch (feature)
1446*8975f5c5SAndroid Build Coastguard Worker     {
1447*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA_TEST:
1448*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mAlphaTestEnabled = enabled;
1449*8975f5c5SAndroid Build Coastguard Worker             break;
1450*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_2D:
1451*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.setTextureEnabled(mActiveSampler, TextureType::_2D, enabled);
1452*8975f5c5SAndroid Build Coastguard Worker             break;
1453*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_CUBE_MAP:
1454*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.setTextureEnabled(mActiveSampler, TextureType::CubeMap, enabled);
1455*8975f5c5SAndroid Build Coastguard Worker             break;
1456*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHTING:
1457*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mLightingEnabled = enabled;
1458*8975f5c5SAndroid Build Coastguard Worker             break;
1459*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT0:
1460*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT1:
1461*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT2:
1462*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT3:
1463*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT4:
1464*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT5:
1465*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT6:
1466*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT7:
1467*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mLights[feature - GL_LIGHT0].enabled = enabled;
1468*8975f5c5SAndroid Build Coastguard Worker             break;
1469*8975f5c5SAndroid Build Coastguard Worker         case GL_NORMALIZE:
1470*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mNormalizeEnabled = enabled;
1471*8975f5c5SAndroid Build Coastguard Worker             break;
1472*8975f5c5SAndroid Build Coastguard Worker         case GL_RESCALE_NORMAL:
1473*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mRescaleNormalEnabled = enabled;
1474*8975f5c5SAndroid Build Coastguard Worker             break;
1475*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_MATERIAL:
1476*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mColorMaterialEnabled = enabled;
1477*8975f5c5SAndroid Build Coastguard Worker             break;
1478*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE0:
1479*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE1:
1480*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE2:
1481*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE3:
1482*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE4:
1483*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE5:
1484*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mClipPlanes[feature - GL_CLIP_PLANE0].enabled = enabled;
1485*8975f5c5SAndroid Build Coastguard Worker             break;
1486*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG:
1487*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mFogEnabled = enabled;
1488*8975f5c5SAndroid Build Coastguard Worker             break;
1489*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SMOOTH:
1490*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mPointSmoothEnabled = enabled;
1491*8975f5c5SAndroid Build Coastguard Worker             break;
1492*8975f5c5SAndroid Build Coastguard Worker         case GL_LINE_SMOOTH:
1493*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mLineSmoothEnabled = enabled;
1494*8975f5c5SAndroid Build Coastguard Worker             break;
1495*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SPRITE_OES:
1496*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.mPointSpriteEnabled = enabled;
1497*8975f5c5SAndroid Build Coastguard Worker             break;
1498*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_LOGIC_OP:
1499*8975f5c5SAndroid Build Coastguard Worker             mGLES1State.setLogicOpEnabled(enabled);
1500*8975f5c5SAndroid Build Coastguard Worker             break;
1501*8975f5c5SAndroid Build Coastguard Worker         default:
1502*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
1503*8975f5c5SAndroid Build Coastguard Worker     }
1504*8975f5c5SAndroid Build Coastguard Worker }
1505*8975f5c5SAndroid Build Coastguard Worker 
setEnableFeatureIndexed(GLenum feature,bool enabled,GLuint index)1506*8975f5c5SAndroid Build Coastguard Worker void PrivateState::setEnableFeatureIndexed(GLenum feature, bool enabled, GLuint index)
1507*8975f5c5SAndroid Build Coastguard Worker {
1508*8975f5c5SAndroid Build Coastguard Worker     switch (feature)
1509*8975f5c5SAndroid Build Coastguard Worker     {
1510*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND:
1511*8975f5c5SAndroid Build Coastguard Worker             setBlendIndexed(enabled, index);
1512*8975f5c5SAndroid Build Coastguard Worker             break;
1513*8975f5c5SAndroid Build Coastguard Worker         default:
1514*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
1515*8975f5c5SAndroid Build Coastguard Worker     }
1516*8975f5c5SAndroid Build Coastguard Worker }
1517*8975f5c5SAndroid Build Coastguard Worker 
getEnableFeature(GLenum feature) const1518*8975f5c5SAndroid Build Coastguard Worker bool PrivateState::getEnableFeature(GLenum feature) const
1519*8975f5c5SAndroid Build Coastguard Worker {
1520*8975f5c5SAndroid Build Coastguard Worker     switch (feature)
1521*8975f5c5SAndroid Build Coastguard Worker     {
1522*8975f5c5SAndroid Build Coastguard Worker         case GL_MULTISAMPLE_EXT:
1523*8975f5c5SAndroid Build Coastguard Worker             return isMultisamplingEnabled();
1524*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1525*8975f5c5SAndroid Build Coastguard Worker             return isSampleAlphaToOneEnabled();
1526*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_ADVANCED_COHERENT_KHR:
1527*8975f5c5SAndroid Build Coastguard Worker             return isBlendAdvancedCoherentEnabled();
1528*8975f5c5SAndroid Build Coastguard Worker         case GL_CULL_FACE:
1529*8975f5c5SAndroid Build Coastguard Worker             return isCullFaceEnabled();
1530*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_POINT_NV:
1531*8975f5c5SAndroid Build Coastguard Worker             return isPolygonOffsetPointEnabled();
1532*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_LINE_NV:
1533*8975f5c5SAndroid Build Coastguard Worker             return isPolygonOffsetLineEnabled();
1534*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_FILL:
1535*8975f5c5SAndroid Build Coastguard Worker             return isPolygonOffsetFillEnabled();
1536*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_CLAMP_EXT:
1537*8975f5c5SAndroid Build Coastguard Worker             return isDepthClampEnabled();
1538*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_COVERAGE:
1539*8975f5c5SAndroid Build Coastguard Worker             return isSampleAlphaToCoverageEnabled();
1540*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_COVERAGE:
1541*8975f5c5SAndroid Build Coastguard Worker             return isSampleCoverageEnabled();
1542*8975f5c5SAndroid Build Coastguard Worker         case GL_SCISSOR_TEST:
1543*8975f5c5SAndroid Build Coastguard Worker             return isScissorTestEnabled();
1544*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_TEST:
1545*8975f5c5SAndroid Build Coastguard Worker             return isStencilTestEnabled();
1546*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_TEST:
1547*8975f5c5SAndroid Build Coastguard Worker             return isDepthTestEnabled();
1548*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND:
1549*8975f5c5SAndroid Build Coastguard Worker             return isBlendEnabled();
1550*8975f5c5SAndroid Build Coastguard Worker         case GL_DITHER:
1551*8975f5c5SAndroid Build Coastguard Worker             return isDitherEnabled();
1552*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_LOGIC_OP:
1553*8975f5c5SAndroid Build Coastguard Worker             if (mClientVersion.major == 1)
1554*8975f5c5SAndroid Build Coastguard Worker             {
1555*8975f5c5SAndroid Build Coastguard Worker                 // Handle logicOp in GLES1 through the GLES1 state management and emulation.
1556*8975f5c5SAndroid Build Coastguard Worker                 break;
1557*8975f5c5SAndroid Build Coastguard Worker             }
1558*8975f5c5SAndroid Build Coastguard Worker             return isLogicOpEnabled();
1559*8975f5c5SAndroid Build Coastguard Worker         case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1560*8975f5c5SAndroid Build Coastguard Worker             return isPrimitiveRestartEnabled();
1561*8975f5c5SAndroid Build Coastguard Worker         case GL_RASTERIZER_DISCARD:
1562*8975f5c5SAndroid Build Coastguard Worker             return isRasterizerDiscardEnabled();
1563*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_MASK:
1564*8975f5c5SAndroid Build Coastguard Worker             return isSampleMaskEnabled();
1565*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1566*8975f5c5SAndroid Build Coastguard Worker             return mDebug.isOutputSynchronous();
1567*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_OUTPUT:
1568*8975f5c5SAndroid Build Coastguard Worker             return mDebug.isOutputEnabled();
1569*8975f5c5SAndroid Build Coastguard Worker         case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1570*8975f5c5SAndroid Build Coastguard Worker             return isBindGeneratesResourceEnabled();
1571*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIENT_ARRAYS_ANGLE:
1572*8975f5c5SAndroid Build Coastguard Worker             return areClientArraysEnabled();
1573*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAMEBUFFER_SRGB_EXT:
1574*8975f5c5SAndroid Build Coastguard Worker             return getFramebufferSRGB();
1575*8975f5c5SAndroid Build Coastguard Worker         case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1576*8975f5c5SAndroid Build Coastguard Worker             return mRobustResourceInit;
1577*8975f5c5SAndroid Build Coastguard Worker         case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1578*8975f5c5SAndroid Build Coastguard Worker             return mProgramBinaryCacheEnabled;
1579*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_RECTANGLE_ANGLE:
1580*8975f5c5SAndroid Build Coastguard Worker             return mTextureRectangleEnabled;
1581*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_SHADING:
1582*8975f5c5SAndroid Build Coastguard Worker             return isSampleShadingEnabled();
1583*8975f5c5SAndroid Build Coastguard Worker         // GL_APPLE_clip_distance / GL_EXT_clip_cull_distance / GL_ANGLE_clip_cull_distance
1584*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE0_EXT:
1585*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE1_EXT:
1586*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE2_EXT:
1587*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE3_EXT:
1588*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE4_EXT:
1589*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE5_EXT:
1590*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE6_EXT:
1591*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE7_EXT:
1592*8975f5c5SAndroid Build Coastguard Worker             if (mClientVersion.major >= 2)
1593*8975f5c5SAndroid Build Coastguard Worker             {
1594*8975f5c5SAndroid Build Coastguard Worker                 // If GLES version is 1, the GL_CLIP_DISTANCE0_EXT enum will be used as
1595*8975f5c5SAndroid Build Coastguard Worker                 // GL_CLIP_PLANE0 instead.
1596*8975f5c5SAndroid Build Coastguard Worker                 return mClipDistancesEnabled.test(feature - GL_CLIP_DISTANCE0_EXT);
1597*8975f5c5SAndroid Build Coastguard Worker             }
1598*8975f5c5SAndroid Build Coastguard Worker             break;
1599*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADING_RATE_PRESERVE_ASPECT_RATIO_QCOM:
1600*8975f5c5SAndroid Build Coastguard Worker             return mShadingRatePreserveAspectRatio;
1601*8975f5c5SAndroid Build Coastguard Worker         case GL_FETCH_PER_SAMPLE_ARM:
1602*8975f5c5SAndroid Build Coastguard Worker             return mFetchPerSample;
1603*8975f5c5SAndroid Build Coastguard Worker     }
1604*8975f5c5SAndroid Build Coastguard Worker 
1605*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mClientVersion.major == 1);
1606*8975f5c5SAndroid Build Coastguard Worker 
1607*8975f5c5SAndroid Build Coastguard Worker     switch (feature)
1608*8975f5c5SAndroid Build Coastguard Worker     {
1609*8975f5c5SAndroid Build Coastguard Worker         // GLES1 emulation
1610*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA_TEST:
1611*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mAlphaTestEnabled;
1612*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_ARRAY:
1613*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mVertexArrayEnabled;
1614*8975f5c5SAndroid Build Coastguard Worker         case GL_NORMAL_ARRAY:
1615*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mNormalArrayEnabled;
1616*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_ARRAY:
1617*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mColorArrayEnabled;
1618*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SIZE_ARRAY_OES:
1619*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mPointSizeArrayEnabled;
1620*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_COORD_ARRAY:
1621*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mTexCoordArrayEnabled[mGLES1State.mClientActiveTexture];
1622*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_2D:
1623*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.isTextureTargetEnabled(getActiveSampler(), TextureType::_2D);
1624*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_CUBE_MAP:
1625*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.isTextureTargetEnabled(getActiveSampler(), TextureType::CubeMap);
1626*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHTING:
1627*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mLightingEnabled;
1628*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT0:
1629*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT1:
1630*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT2:
1631*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT3:
1632*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT4:
1633*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT5:
1634*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT6:
1635*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT7:
1636*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mLights[feature - GL_LIGHT0].enabled;
1637*8975f5c5SAndroid Build Coastguard Worker         case GL_NORMALIZE:
1638*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mNormalizeEnabled;
1639*8975f5c5SAndroid Build Coastguard Worker         case GL_RESCALE_NORMAL:
1640*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mRescaleNormalEnabled;
1641*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_MATERIAL:
1642*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mColorMaterialEnabled;
1643*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE0:
1644*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE1:
1645*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE2:
1646*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE3:
1647*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE4:
1648*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_PLANE5:
1649*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mClipPlanes[feature - GL_CLIP_PLANE0].enabled;
1650*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG:
1651*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mFogEnabled;
1652*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SMOOTH:
1653*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mPointSmoothEnabled;
1654*8975f5c5SAndroid Build Coastguard Worker         case GL_LINE_SMOOTH:
1655*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mLineSmoothEnabled;
1656*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SPRITE_OES:
1657*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mPointSpriteEnabled;
1658*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_LOGIC_OP:
1659*8975f5c5SAndroid Build Coastguard Worker             return mGLES1State.mLogicOpEnabled;
1660*8975f5c5SAndroid Build Coastguard Worker         default:
1661*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
1662*8975f5c5SAndroid Build Coastguard Worker             return false;
1663*8975f5c5SAndroid Build Coastguard Worker     }
1664*8975f5c5SAndroid Build Coastguard Worker }
1665*8975f5c5SAndroid Build Coastguard Worker 
getEnableFeatureIndexed(GLenum feature,GLuint index) const1666*8975f5c5SAndroid Build Coastguard Worker bool PrivateState::getEnableFeatureIndexed(GLenum feature, GLuint index) const
1667*8975f5c5SAndroid Build Coastguard Worker {
1668*8975f5c5SAndroid Build Coastguard Worker     switch (feature)
1669*8975f5c5SAndroid Build Coastguard Worker     {
1670*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND:
1671*8975f5c5SAndroid Build Coastguard Worker             return isBlendEnabledIndexed(index);
1672*8975f5c5SAndroid Build Coastguard Worker         default:
1673*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
1674*8975f5c5SAndroid Build Coastguard Worker             return false;
1675*8975f5c5SAndroid Build Coastguard Worker     }
1676*8975f5c5SAndroid Build Coastguard Worker }
1677*8975f5c5SAndroid Build Coastguard Worker 
getBooleanv(GLenum pname,GLboolean * params) const1678*8975f5c5SAndroid Build Coastguard Worker void PrivateState::getBooleanv(GLenum pname, GLboolean *params) const
1679*8975f5c5SAndroid Build Coastguard Worker {
1680*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
1681*8975f5c5SAndroid Build Coastguard Worker     {
1682*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_COVERAGE_INVERT:
1683*8975f5c5SAndroid Build Coastguard Worker             *params = mSampleCoverageInvert;
1684*8975f5c5SAndroid Build Coastguard Worker             break;
1685*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_WRITEMASK:
1686*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.depthMask;
1687*8975f5c5SAndroid Build Coastguard Worker             break;
1688*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_WRITEMASK:
1689*8975f5c5SAndroid Build Coastguard Worker         {
1690*8975f5c5SAndroid Build Coastguard Worker             // non-indexed get returns the state of draw buffer zero
1691*8975f5c5SAndroid Build Coastguard Worker             bool r, g, b, a;
1692*8975f5c5SAndroid Build Coastguard Worker             mBlendStateExt.getColorMaskIndexed(0, &r, &g, &b, &a);
1693*8975f5c5SAndroid Build Coastguard Worker             params[0] = r;
1694*8975f5c5SAndroid Build Coastguard Worker             params[1] = g;
1695*8975f5c5SAndroid Build Coastguard Worker             params[2] = b;
1696*8975f5c5SAndroid Build Coastguard Worker             params[3] = a;
1697*8975f5c5SAndroid Build Coastguard Worker             break;
1698*8975f5c5SAndroid Build Coastguard Worker         }
1699*8975f5c5SAndroid Build Coastguard Worker         case GL_CULL_FACE:
1700*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.cullFace;
1701*8975f5c5SAndroid Build Coastguard Worker             break;
1702*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_POINT_NV:
1703*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.polygonOffsetPoint;
1704*8975f5c5SAndroid Build Coastguard Worker             break;
1705*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_LINE_NV:
1706*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.polygonOffsetLine;
1707*8975f5c5SAndroid Build Coastguard Worker             break;
1708*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_FILL:
1709*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.polygonOffsetFill;
1710*8975f5c5SAndroid Build Coastguard Worker             break;
1711*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_CLAMP_EXT:
1712*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.depthClamp;
1713*8975f5c5SAndroid Build Coastguard Worker             break;
1714*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_COVERAGE:
1715*8975f5c5SAndroid Build Coastguard Worker             *params = mSampleAlphaToCoverage;
1716*8975f5c5SAndroid Build Coastguard Worker             break;
1717*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_COVERAGE:
1718*8975f5c5SAndroid Build Coastguard Worker             *params = mSampleCoverage;
1719*8975f5c5SAndroid Build Coastguard Worker             break;
1720*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_MASK:
1721*8975f5c5SAndroid Build Coastguard Worker             *params = mSampleMask;
1722*8975f5c5SAndroid Build Coastguard Worker             break;
1723*8975f5c5SAndroid Build Coastguard Worker         case GL_SCISSOR_TEST:
1724*8975f5c5SAndroid Build Coastguard Worker             *params = mScissorTest;
1725*8975f5c5SAndroid Build Coastguard Worker             break;
1726*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_TEST:
1727*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilTest;
1728*8975f5c5SAndroid Build Coastguard Worker             break;
1729*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_TEST:
1730*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.depthTest;
1731*8975f5c5SAndroid Build Coastguard Worker             break;
1732*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND:
1733*8975f5c5SAndroid Build Coastguard Worker             // non-indexed get returns the state of draw buffer zero
1734*8975f5c5SAndroid Build Coastguard Worker             *params = mBlendStateExt.getEnabledMask().test(0);
1735*8975f5c5SAndroid Build Coastguard Worker             break;
1736*8975f5c5SAndroid Build Coastguard Worker         case GL_DITHER:
1737*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.dither;
1738*8975f5c5SAndroid Build Coastguard Worker             break;
1739*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_LOGIC_OP:
1740*8975f5c5SAndroid Build Coastguard Worker             if (mClientVersion.major == 1)
1741*8975f5c5SAndroid Build Coastguard Worker             {
1742*8975f5c5SAndroid Build Coastguard Worker                 // Handle logicOp in GLES1 through the GLES1 state management.
1743*8975f5c5SAndroid Build Coastguard Worker                 *params = getEnableFeature(pname);
1744*8975f5c5SAndroid Build Coastguard Worker             }
1745*8975f5c5SAndroid Build Coastguard Worker             else
1746*8975f5c5SAndroid Build Coastguard Worker             {
1747*8975f5c5SAndroid Build Coastguard Worker                 *params = mLogicOpEnabled;
1748*8975f5c5SAndroid Build Coastguard Worker             }
1749*8975f5c5SAndroid Build Coastguard Worker             break;
1750*8975f5c5SAndroid Build Coastguard Worker         case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1751*8975f5c5SAndroid Build Coastguard Worker             *params = mPrimitiveRestart;
1752*8975f5c5SAndroid Build Coastguard Worker             break;
1753*8975f5c5SAndroid Build Coastguard Worker         case GL_RASTERIZER_DISCARD:
1754*8975f5c5SAndroid Build Coastguard Worker             *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
1755*8975f5c5SAndroid Build Coastguard Worker             break;
1756*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1757*8975f5c5SAndroid Build Coastguard Worker             *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
1758*8975f5c5SAndroid Build Coastguard Worker             break;
1759*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_OUTPUT:
1760*8975f5c5SAndroid Build Coastguard Worker             *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
1761*8975f5c5SAndroid Build Coastguard Worker             break;
1762*8975f5c5SAndroid Build Coastguard Worker         case GL_MULTISAMPLE_EXT:
1763*8975f5c5SAndroid Build Coastguard Worker             *params = mMultiSampling;
1764*8975f5c5SAndroid Build Coastguard Worker             break;
1765*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1766*8975f5c5SAndroid Build Coastguard Worker             *params = mSampleAlphaToOne;
1767*8975f5c5SAndroid Build Coastguard Worker             break;
1768*8975f5c5SAndroid Build Coastguard Worker         case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
1769*8975f5c5SAndroid Build Coastguard Worker             *params = isBindGeneratesResourceEnabled() ? GL_TRUE : GL_FALSE;
1770*8975f5c5SAndroid Build Coastguard Worker             break;
1771*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIENT_ARRAYS_ANGLE:
1772*8975f5c5SAndroid Build Coastguard Worker             *params = areClientArraysEnabled() ? GL_TRUE : GL_FALSE;
1773*8975f5c5SAndroid Build Coastguard Worker             break;
1774*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAMEBUFFER_SRGB_EXT:
1775*8975f5c5SAndroid Build Coastguard Worker             *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
1776*8975f5c5SAndroid Build Coastguard Worker             break;
1777*8975f5c5SAndroid Build Coastguard Worker         case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1778*8975f5c5SAndroid Build Coastguard Worker             *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
1779*8975f5c5SAndroid Build Coastguard Worker             break;
1780*8975f5c5SAndroid Build Coastguard Worker         case GL_PROGRAM_CACHE_ENABLED_ANGLE:
1781*8975f5c5SAndroid Build Coastguard Worker             *params = mProgramBinaryCacheEnabled ? GL_TRUE : GL_FALSE;
1782*8975f5c5SAndroid Build Coastguard Worker             break;
1783*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_RECTANGLE_ANGLE:
1784*8975f5c5SAndroid Build Coastguard Worker             *params = mTextureRectangleEnabled ? GL_TRUE : GL_FALSE;
1785*8975f5c5SAndroid Build Coastguard Worker             break;
1786*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT_MODEL_TWO_SIDE:
1787*8975f5c5SAndroid Build Coastguard Worker             *params = IsLightModelTwoSided(&mGLES1State);
1788*8975f5c5SAndroid Build Coastguard Worker             break;
1789*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_SHADING:
1790*8975f5c5SAndroid Build Coastguard Worker             *params = mIsSampleShadingEnabled;
1791*8975f5c5SAndroid Build Coastguard Worker             break;
1792*8975f5c5SAndroid Build Coastguard Worker         case GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED:
1793*8975f5c5SAndroid Build Coastguard Worker             *params = mCaps.primitiveRestartForPatchesSupported ? GL_TRUE : GL_FALSE;
1794*8975f5c5SAndroid Build Coastguard Worker             break;
1795*8975f5c5SAndroid Build Coastguard Worker         case GL_ROBUST_FRAGMENT_SHADER_OUTPUT_ANGLE:
1796*8975f5c5SAndroid Build Coastguard Worker             *params = mExtensions.robustFragmentShaderOutputANGLE ? GL_TRUE : GL_FALSE;
1797*8975f5c5SAndroid Build Coastguard Worker             break;
1798*8975f5c5SAndroid Build Coastguard Worker         // GL_APPLE_clip_distance / GL_EXT_clip_cull_distance / GL_ANGLE_clip_cull_distance
1799*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE0_EXT:
1800*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE1_EXT:
1801*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE2_EXT:
1802*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE3_EXT:
1803*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE4_EXT:
1804*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE5_EXT:
1805*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE6_EXT:
1806*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DISTANCE7_EXT:
1807*8975f5c5SAndroid Build Coastguard Worker             if (mClientVersion.major >= 2)
1808*8975f5c5SAndroid Build Coastguard Worker             {
1809*8975f5c5SAndroid Build Coastguard Worker                 // If GLES version is 1, the GL_CLIP_DISTANCE0_EXT enum will be used as
1810*8975f5c5SAndroid Build Coastguard Worker                 // GL_CLIP_PLANE0 instead.
1811*8975f5c5SAndroid Build Coastguard Worker                 *params = mClipDistancesEnabled.test(pname - GL_CLIP_DISTANCE0_EXT);
1812*8975f5c5SAndroid Build Coastguard Worker             }
1813*8975f5c5SAndroid Build Coastguard Worker             break;
1814*8975f5c5SAndroid Build Coastguard Worker         // GL_ARM_shader_framebuffer_fetch
1815*8975f5c5SAndroid Build Coastguard Worker         case GL_FETCH_PER_SAMPLE_ARM:
1816*8975f5c5SAndroid Build Coastguard Worker             *params = mFetchPerSample;
1817*8975f5c5SAndroid Build Coastguard Worker             break;
1818*8975f5c5SAndroid Build Coastguard Worker         // GL_ARM_shader_framebuffer_fetch
1819*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM:
1820*8975f5c5SAndroid Build Coastguard Worker             *params = mCaps.fragmentShaderFramebufferFetchMRT;
1821*8975f5c5SAndroid Build Coastguard Worker             break;
1822*8975f5c5SAndroid Build Coastguard Worker         default:
1823*8975f5c5SAndroid Build Coastguard Worker             if (mClientVersion.major == 1)
1824*8975f5c5SAndroid Build Coastguard Worker             {
1825*8975f5c5SAndroid Build Coastguard Worker                 *params = getEnableFeature(pname);
1826*8975f5c5SAndroid Build Coastguard Worker             }
1827*8975f5c5SAndroid Build Coastguard Worker             else
1828*8975f5c5SAndroid Build Coastguard Worker             {
1829*8975f5c5SAndroid Build Coastguard Worker                 UNREACHABLE();
1830*8975f5c5SAndroid Build Coastguard Worker             }
1831*8975f5c5SAndroid Build Coastguard Worker             break;
1832*8975f5c5SAndroid Build Coastguard Worker     }
1833*8975f5c5SAndroid Build Coastguard Worker }
1834*8975f5c5SAndroid Build Coastguard Worker 
getFloatv(GLenum pname,GLfloat * params) const1835*8975f5c5SAndroid Build Coastguard Worker void PrivateState::getFloatv(GLenum pname, GLfloat *params) const
1836*8975f5c5SAndroid Build Coastguard Worker {
1837*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
1838*8975f5c5SAndroid Build Coastguard Worker     {
1839*8975f5c5SAndroid Build Coastguard Worker         case GL_LINE_WIDTH:
1840*8975f5c5SAndroid Build Coastguard Worker             *params = mLineWidth;
1841*8975f5c5SAndroid Build Coastguard Worker             break;
1842*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_COVERAGE_VALUE:
1843*8975f5c5SAndroid Build Coastguard Worker             *params = mSampleCoverageValue;
1844*8975f5c5SAndroid Build Coastguard Worker             break;
1845*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_CLEAR_VALUE:
1846*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthClearValue;
1847*8975f5c5SAndroid Build Coastguard Worker             break;
1848*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_FACTOR:
1849*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.polygonOffsetFactor;
1850*8975f5c5SAndroid Build Coastguard Worker             break;
1851*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_UNITS:
1852*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.polygonOffsetUnits;
1853*8975f5c5SAndroid Build Coastguard Worker             break;
1854*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_OFFSET_CLAMP_EXT:
1855*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.polygonOffsetClamp;
1856*8975f5c5SAndroid Build Coastguard Worker             break;
1857*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_RANGE:
1858*8975f5c5SAndroid Build Coastguard Worker             params[0] = mNearZ;
1859*8975f5c5SAndroid Build Coastguard Worker             params[1] = mFarZ;
1860*8975f5c5SAndroid Build Coastguard Worker             break;
1861*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_CLEAR_VALUE:
1862*8975f5c5SAndroid Build Coastguard Worker             params[0] = mColorClearValue.red;
1863*8975f5c5SAndroid Build Coastguard Worker             params[1] = mColorClearValue.green;
1864*8975f5c5SAndroid Build Coastguard Worker             params[2] = mColorClearValue.blue;
1865*8975f5c5SAndroid Build Coastguard Worker             params[3] = mColorClearValue.alpha;
1866*8975f5c5SAndroid Build Coastguard Worker             break;
1867*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_COLOR:
1868*8975f5c5SAndroid Build Coastguard Worker             params[0] = mBlendColor.red;
1869*8975f5c5SAndroid Build Coastguard Worker             params[1] = mBlendColor.green;
1870*8975f5c5SAndroid Build Coastguard Worker             params[2] = mBlendColor.blue;
1871*8975f5c5SAndroid Build Coastguard Worker             params[3] = mBlendColor.alpha;
1872*8975f5c5SAndroid Build Coastguard Worker             break;
1873*8975f5c5SAndroid Build Coastguard Worker         case GL_MULTISAMPLE_EXT:
1874*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLfloat>(mMultiSampling);
1875*8975f5c5SAndroid Build Coastguard Worker             break;
1876*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_ONE_EXT:
1877*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLfloat>(mSampleAlphaToOne);
1878*8975f5c5SAndroid Build Coastguard Worker             break;
1879*8975f5c5SAndroid Build Coastguard Worker         case GL_COVERAGE_MODULATION_CHROMIUM:
1880*8975f5c5SAndroid Build Coastguard Worker             params[0] = static_cast<GLfloat>(mCoverageModulation);
1881*8975f5c5SAndroid Build Coastguard Worker             break;
1882*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA_TEST_REF:
1883*8975f5c5SAndroid Build Coastguard Worker             *params = mGLES1State.mAlphaTestParameters.ref;
1884*8975f5c5SAndroid Build Coastguard Worker             break;
1885*8975f5c5SAndroid Build Coastguard Worker         case GL_CURRENT_COLOR:
1886*8975f5c5SAndroid Build Coastguard Worker         {
1887*8975f5c5SAndroid Build Coastguard Worker             const auto &color = mGLES1State.mCurrentColor;
1888*8975f5c5SAndroid Build Coastguard Worker             params[0]         = color.red;
1889*8975f5c5SAndroid Build Coastguard Worker             params[1]         = color.green;
1890*8975f5c5SAndroid Build Coastguard Worker             params[2]         = color.blue;
1891*8975f5c5SAndroid Build Coastguard Worker             params[3]         = color.alpha;
1892*8975f5c5SAndroid Build Coastguard Worker             break;
1893*8975f5c5SAndroid Build Coastguard Worker         }
1894*8975f5c5SAndroid Build Coastguard Worker         case GL_CURRENT_NORMAL:
1895*8975f5c5SAndroid Build Coastguard Worker         {
1896*8975f5c5SAndroid Build Coastguard Worker             const auto &normal = mGLES1State.mCurrentNormal;
1897*8975f5c5SAndroid Build Coastguard Worker             params[0]          = normal[0];
1898*8975f5c5SAndroid Build Coastguard Worker             params[1]          = normal[1];
1899*8975f5c5SAndroid Build Coastguard Worker             params[2]          = normal[2];
1900*8975f5c5SAndroid Build Coastguard Worker             break;
1901*8975f5c5SAndroid Build Coastguard Worker         }
1902*8975f5c5SAndroid Build Coastguard Worker         case GL_CURRENT_TEXTURE_COORDS:
1903*8975f5c5SAndroid Build Coastguard Worker         {
1904*8975f5c5SAndroid Build Coastguard Worker             const auto &texcoord = mGLES1State.mCurrentTextureCoords[mActiveSampler];
1905*8975f5c5SAndroid Build Coastguard Worker             params[0]            = texcoord.s;
1906*8975f5c5SAndroid Build Coastguard Worker             params[1]            = texcoord.t;
1907*8975f5c5SAndroid Build Coastguard Worker             params[2]            = texcoord.r;
1908*8975f5c5SAndroid Build Coastguard Worker             params[3]            = texcoord.q;
1909*8975f5c5SAndroid Build Coastguard Worker             break;
1910*8975f5c5SAndroid Build Coastguard Worker         }
1911*8975f5c5SAndroid Build Coastguard Worker         case GL_MODELVIEW_MATRIX:
1912*8975f5c5SAndroid Build Coastguard Worker             memcpy(params, mGLES1State.mModelviewMatrices.back().constData(), 16 * sizeof(GLfloat));
1913*8975f5c5SAndroid Build Coastguard Worker             break;
1914*8975f5c5SAndroid Build Coastguard Worker         case GL_PROJECTION_MATRIX:
1915*8975f5c5SAndroid Build Coastguard Worker             memcpy(params, mGLES1State.mProjectionMatrices.back().constData(),
1916*8975f5c5SAndroid Build Coastguard Worker                    16 * sizeof(GLfloat));
1917*8975f5c5SAndroid Build Coastguard Worker             break;
1918*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_MATRIX:
1919*8975f5c5SAndroid Build Coastguard Worker             memcpy(params, mGLES1State.mTextureMatrices[mActiveSampler].back().constData(),
1920*8975f5c5SAndroid Build Coastguard Worker                    16 * sizeof(GLfloat));
1921*8975f5c5SAndroid Build Coastguard Worker             break;
1922*8975f5c5SAndroid Build Coastguard Worker         case GL_LIGHT_MODEL_AMBIENT:
1923*8975f5c5SAndroid Build Coastguard Worker             GetLightModelParameters(&mGLES1State, pname, params);
1924*8975f5c5SAndroid Build Coastguard Worker             break;
1925*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG_MODE:
1926*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG_DENSITY:
1927*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG_START:
1928*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG_END:
1929*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG_COLOR:
1930*8975f5c5SAndroid Build Coastguard Worker             GetFogParameters(&mGLES1State, pname, params);
1931*8975f5c5SAndroid Build Coastguard Worker             break;
1932*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SIZE:
1933*8975f5c5SAndroid Build Coastguard Worker             GetPointSize(&mGLES1State, params);
1934*8975f5c5SAndroid Build Coastguard Worker             break;
1935*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SIZE_MIN:
1936*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SIZE_MAX:
1937*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_FADE_THRESHOLD_SIZE:
1938*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_DISTANCE_ATTENUATION:
1939*8975f5c5SAndroid Build Coastguard Worker             GetPointParameter(&mGLES1State, FromGLenum<PointParameter>(pname), params);
1940*8975f5c5SAndroid Build Coastguard Worker             break;
1941*8975f5c5SAndroid Build Coastguard Worker         case GL_MIN_SAMPLE_SHADING_VALUE:
1942*8975f5c5SAndroid Build Coastguard Worker             *params = mMinSampleShading;
1943*8975f5c5SAndroid Build Coastguard Worker             break;
1944*8975f5c5SAndroid Build Coastguard Worker         // GL_ARM_shader_framebuffer_fetch
1945*8975f5c5SAndroid Build Coastguard Worker         case GL_FETCH_PER_SAMPLE_ARM:
1946*8975f5c5SAndroid Build Coastguard Worker             *params = mFetchPerSample ? 1.0f : 0.0f;
1947*8975f5c5SAndroid Build Coastguard Worker             break;
1948*8975f5c5SAndroid Build Coastguard Worker         // GL_ARM_shader_framebuffer_fetch
1949*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM:
1950*8975f5c5SAndroid Build Coastguard Worker             *params = mCaps.fragmentShaderFramebufferFetchMRT ? 1.0f : 0.0f;
1951*8975f5c5SAndroid Build Coastguard Worker             break;
1952*8975f5c5SAndroid Build Coastguard Worker         default:
1953*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
1954*8975f5c5SAndroid Build Coastguard Worker             break;
1955*8975f5c5SAndroid Build Coastguard Worker     }
1956*8975f5c5SAndroid Build Coastguard Worker }
1957*8975f5c5SAndroid Build Coastguard Worker 
getIntegerv(GLenum pname,GLint * params) const1958*8975f5c5SAndroid Build Coastguard Worker void PrivateState::getIntegerv(GLenum pname, GLint *params) const
1959*8975f5c5SAndroid Build Coastguard Worker {
1960*8975f5c5SAndroid Build Coastguard Worker     // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation
1961*8975f5c5SAndroid Build Coastguard Worker     // because it is stored as a float, despite the fact that the GL ES 2.0 spec names
1962*8975f5c5SAndroid Build Coastguard Worker     // GetIntegerv as its native query function. As it would require conversion in any
1963*8975f5c5SAndroid Build Coastguard Worker     // case, this should make no difference to the calling application. You may find it in
1964*8975f5c5SAndroid Build Coastguard Worker     // State::getFloatv.
1965*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
1966*8975f5c5SAndroid Build Coastguard Worker     {
1967*8975f5c5SAndroid Build Coastguard Worker         case GL_PACK_ALIGNMENT:
1968*8975f5c5SAndroid Build Coastguard Worker             *params = mPack.alignment;
1969*8975f5c5SAndroid Build Coastguard Worker             break;
1970*8975f5c5SAndroid Build Coastguard Worker         case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
1971*8975f5c5SAndroid Build Coastguard Worker             *params = mPack.reverseRowOrder;
1972*8975f5c5SAndroid Build Coastguard Worker             break;
1973*8975f5c5SAndroid Build Coastguard Worker         case GL_PACK_ROW_LENGTH:
1974*8975f5c5SAndroid Build Coastguard Worker             *params = mPack.rowLength;
1975*8975f5c5SAndroid Build Coastguard Worker             break;
1976*8975f5c5SAndroid Build Coastguard Worker         case GL_PACK_SKIP_ROWS:
1977*8975f5c5SAndroid Build Coastguard Worker             *params = mPack.skipRows;
1978*8975f5c5SAndroid Build Coastguard Worker             break;
1979*8975f5c5SAndroid Build Coastguard Worker         case GL_PACK_SKIP_PIXELS:
1980*8975f5c5SAndroid Build Coastguard Worker             *params = mPack.skipPixels;
1981*8975f5c5SAndroid Build Coastguard Worker             break;
1982*8975f5c5SAndroid Build Coastguard Worker         case GL_UNPACK_ALIGNMENT:
1983*8975f5c5SAndroid Build Coastguard Worker             *params = mUnpack.alignment;
1984*8975f5c5SAndroid Build Coastguard Worker             break;
1985*8975f5c5SAndroid Build Coastguard Worker         case GL_UNPACK_ROW_LENGTH:
1986*8975f5c5SAndroid Build Coastguard Worker             *params = mUnpack.rowLength;
1987*8975f5c5SAndroid Build Coastguard Worker             break;
1988*8975f5c5SAndroid Build Coastguard Worker         case GL_UNPACK_IMAGE_HEIGHT:
1989*8975f5c5SAndroid Build Coastguard Worker             *params = mUnpack.imageHeight;
1990*8975f5c5SAndroid Build Coastguard Worker             break;
1991*8975f5c5SAndroid Build Coastguard Worker         case GL_UNPACK_SKIP_IMAGES:
1992*8975f5c5SAndroid Build Coastguard Worker             *params = mUnpack.skipImages;
1993*8975f5c5SAndroid Build Coastguard Worker             break;
1994*8975f5c5SAndroid Build Coastguard Worker         case GL_UNPACK_SKIP_ROWS:
1995*8975f5c5SAndroid Build Coastguard Worker             *params = mUnpack.skipRows;
1996*8975f5c5SAndroid Build Coastguard Worker             break;
1997*8975f5c5SAndroid Build Coastguard Worker         case GL_UNPACK_SKIP_PIXELS:
1998*8975f5c5SAndroid Build Coastguard Worker             *params = mUnpack.skipPixels;
1999*8975f5c5SAndroid Build Coastguard Worker             break;
2000*8975f5c5SAndroid Build Coastguard Worker         case GL_GENERATE_MIPMAP_HINT:
2001*8975f5c5SAndroid Build Coastguard Worker             *params = mGenerateMipmapHint;
2002*8975f5c5SAndroid Build Coastguard Worker             break;
2003*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
2004*8975f5c5SAndroid Build Coastguard Worker             *params = mFragmentShaderDerivativeHint;
2005*8975f5c5SAndroid Build Coastguard Worker             break;
2006*8975f5c5SAndroid Build Coastguard Worker         case GL_ACTIVE_TEXTURE:
2007*8975f5c5SAndroid Build Coastguard Worker             *params = (static_cast<GLint>(mActiveSampler) + GL_TEXTURE0);
2008*8975f5c5SAndroid Build Coastguard Worker             break;
2009*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_FUNC:
2010*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilFunc;
2011*8975f5c5SAndroid Build Coastguard Worker             break;
2012*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_REF:
2013*8975f5c5SAndroid Build Coastguard Worker             *params = mStencilRef;
2014*8975f5c5SAndroid Build Coastguard Worker             break;
2015*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_VALUE_MASK:
2016*8975f5c5SAndroid Build Coastguard Worker             *params = CastMaskValue(mDepthStencil.stencilMask);
2017*8975f5c5SAndroid Build Coastguard Worker             break;
2018*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BACK_FUNC:
2019*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilBackFunc;
2020*8975f5c5SAndroid Build Coastguard Worker             break;
2021*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BACK_REF:
2022*8975f5c5SAndroid Build Coastguard Worker             *params = mStencilBackRef;
2023*8975f5c5SAndroid Build Coastguard Worker             break;
2024*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BACK_VALUE_MASK:
2025*8975f5c5SAndroid Build Coastguard Worker             *params = CastMaskValue(mDepthStencil.stencilBackMask);
2026*8975f5c5SAndroid Build Coastguard Worker             break;
2027*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_FAIL:
2028*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilFail;
2029*8975f5c5SAndroid Build Coastguard Worker             break;
2030*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_PASS_DEPTH_FAIL:
2031*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilPassDepthFail;
2032*8975f5c5SAndroid Build Coastguard Worker             break;
2033*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_PASS_DEPTH_PASS:
2034*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilPassDepthPass;
2035*8975f5c5SAndroid Build Coastguard Worker             break;
2036*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BACK_FAIL:
2037*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilBackFail;
2038*8975f5c5SAndroid Build Coastguard Worker             break;
2039*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
2040*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilBackPassDepthFail;
2041*8975f5c5SAndroid Build Coastguard Worker             break;
2042*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BACK_PASS_DEPTH_PASS:
2043*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.stencilBackPassDepthPass;
2044*8975f5c5SAndroid Build Coastguard Worker             break;
2045*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_FUNC:
2046*8975f5c5SAndroid Build Coastguard Worker             *params = mDepthStencil.depthFunc;
2047*8975f5c5SAndroid Build Coastguard Worker             break;
2048*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_SRC_RGB:
2049*8975f5c5SAndroid Build Coastguard Worker             // non-indexed get returns the state of draw buffer zero
2050*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getSrcColorIndexed(0));
2051*8975f5c5SAndroid Build Coastguard Worker             break;
2052*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_SRC_ALPHA:
2053*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getSrcAlphaIndexed(0));
2054*8975f5c5SAndroid Build Coastguard Worker             break;
2055*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_DST_RGB:
2056*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getDstColorIndexed(0));
2057*8975f5c5SAndroid Build Coastguard Worker             break;
2058*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_DST_ALPHA:
2059*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getDstAlphaIndexed(0));
2060*8975f5c5SAndroid Build Coastguard Worker             break;
2061*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_EQUATION_RGB:
2062*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getEquationColorIndexed(0));
2063*8975f5c5SAndroid Build Coastguard Worker             break;
2064*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_EQUATION_ALPHA:
2065*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getEquationAlphaIndexed(0));
2066*8975f5c5SAndroid Build Coastguard Worker             break;
2067*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_WRITEMASK:
2068*8975f5c5SAndroid Build Coastguard Worker             *params = CastMaskValue(mDepthStencil.stencilWritemask);
2069*8975f5c5SAndroid Build Coastguard Worker             break;
2070*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BACK_WRITEMASK:
2071*8975f5c5SAndroid Build Coastguard Worker             *params = CastMaskValue(mDepthStencil.stencilBackWritemask);
2072*8975f5c5SAndroid Build Coastguard Worker             break;
2073*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_CLEAR_VALUE:
2074*8975f5c5SAndroid Build Coastguard Worker             *params = mStencilClearValue;
2075*8975f5c5SAndroid Build Coastguard Worker             break;
2076*8975f5c5SAndroid Build Coastguard Worker         case GL_VIEWPORT:
2077*8975f5c5SAndroid Build Coastguard Worker             params[0] = mViewport.x;
2078*8975f5c5SAndroid Build Coastguard Worker             params[1] = mViewport.y;
2079*8975f5c5SAndroid Build Coastguard Worker             params[2] = mViewport.width;
2080*8975f5c5SAndroid Build Coastguard Worker             params[3] = mViewport.height;
2081*8975f5c5SAndroid Build Coastguard Worker             break;
2082*8975f5c5SAndroid Build Coastguard Worker         case GL_SCISSOR_BOX:
2083*8975f5c5SAndroid Build Coastguard Worker             params[0] = mScissor.x;
2084*8975f5c5SAndroid Build Coastguard Worker             params[1] = mScissor.y;
2085*8975f5c5SAndroid Build Coastguard Worker             params[2] = mScissor.width;
2086*8975f5c5SAndroid Build Coastguard Worker             params[3] = mScissor.height;
2087*8975f5c5SAndroid Build Coastguard Worker             break;
2088*8975f5c5SAndroid Build Coastguard Worker         case GL_POLYGON_MODE_NV:
2089*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mRasterizer.polygonMode);
2090*8975f5c5SAndroid Build Coastguard Worker             break;
2091*8975f5c5SAndroid Build Coastguard Worker         case GL_CULL_FACE_MODE:
2092*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mRasterizer.cullMode);
2093*8975f5c5SAndroid Build Coastguard Worker             break;
2094*8975f5c5SAndroid Build Coastguard Worker         case GL_FRONT_FACE:
2095*8975f5c5SAndroid Build Coastguard Worker             *params = mRasterizer.frontFace;
2096*8975f5c5SAndroid Build Coastguard Worker             break;
2097*8975f5c5SAndroid Build Coastguard Worker 
2098*8975f5c5SAndroid Build Coastguard Worker         case GL_MULTISAMPLE_EXT:
2099*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLint>(mMultiSampling);
2100*8975f5c5SAndroid Build Coastguard Worker             break;
2101*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_ALPHA_TO_ONE_EXT:
2102*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLint>(mSampleAlphaToOne);
2103*8975f5c5SAndroid Build Coastguard Worker             break;
2104*8975f5c5SAndroid Build Coastguard Worker         case GL_COVERAGE_MODULATION_CHROMIUM:
2105*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLint>(mCoverageModulation);
2106*8975f5c5SAndroid Build Coastguard Worker             break;
2107*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA_TEST_FUNC:
2108*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mGLES1State.mAlphaTestParameters.func);
2109*8975f5c5SAndroid Build Coastguard Worker             break;
2110*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIENT_ACTIVE_TEXTURE:
2111*8975f5c5SAndroid Build Coastguard Worker             *params = mGLES1State.mClientActiveTexture + GL_TEXTURE0;
2112*8975f5c5SAndroid Build Coastguard Worker             break;
2113*8975f5c5SAndroid Build Coastguard Worker         case GL_MATRIX_MODE:
2114*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mGLES1State.mMatrixMode);
2115*8975f5c5SAndroid Build Coastguard Worker             break;
2116*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADE_MODEL:
2117*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mGLES1State.mShadeModel);
2118*8975f5c5SAndroid Build Coastguard Worker             break;
2119*8975f5c5SAndroid Build Coastguard Worker         case GL_MODELVIEW_STACK_DEPTH:
2120*8975f5c5SAndroid Build Coastguard Worker         case GL_PROJECTION_STACK_DEPTH:
2121*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_STACK_DEPTH:
2122*8975f5c5SAndroid Build Coastguard Worker             *params = mGLES1State.getCurrentMatrixStackDepth(pname);
2123*8975f5c5SAndroid Build Coastguard Worker             break;
2124*8975f5c5SAndroid Build Coastguard Worker         case GL_LOGIC_OP_MODE:
2125*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mGLES1State.mLogicOp);
2126*8975f5c5SAndroid Build Coastguard Worker             break;
2127*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_SRC:
2128*8975f5c5SAndroid Build Coastguard Worker             // non-indexed get returns the state of draw buffer zero
2129*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getSrcColorIndexed(0));
2130*8975f5c5SAndroid Build Coastguard Worker             break;
2131*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_DST:
2132*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mBlendStateExt.getDstColorIndexed(0));
2133*8975f5c5SAndroid Build Coastguard Worker             break;
2134*8975f5c5SAndroid Build Coastguard Worker         case GL_PERSPECTIVE_CORRECTION_HINT:
2135*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SMOOTH_HINT:
2136*8975f5c5SAndroid Build Coastguard Worker         case GL_LINE_SMOOTH_HINT:
2137*8975f5c5SAndroid Build Coastguard Worker         case GL_FOG_HINT:
2138*8975f5c5SAndroid Build Coastguard Worker             *params = mGLES1State.getHint(pname);
2139*8975f5c5SAndroid Build Coastguard Worker             break;
2140*8975f5c5SAndroid Build Coastguard Worker 
2141*8975f5c5SAndroid Build Coastguard Worker         // GL_ANGLE_provoking_vertex
2142*8975f5c5SAndroid Build Coastguard Worker         case GL_PROVOKING_VERTEX_ANGLE:
2143*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mProvokingVertex);
2144*8975f5c5SAndroid Build Coastguard Worker             break;
2145*8975f5c5SAndroid Build Coastguard Worker 
2146*8975f5c5SAndroid Build Coastguard Worker         case GL_PATCH_VERTICES:
2147*8975f5c5SAndroid Build Coastguard Worker             *params = mPatchVertices;
2148*8975f5c5SAndroid Build Coastguard Worker             break;
2149*8975f5c5SAndroid Build Coastguard Worker 
2150*8975f5c5SAndroid Build Coastguard Worker         // GL_EXT_clip_control
2151*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_ORIGIN_EXT:
2152*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mClipOrigin);
2153*8975f5c5SAndroid Build Coastguard Worker             break;
2154*8975f5c5SAndroid Build Coastguard Worker         case GL_CLIP_DEPTH_MODE_EXT:
2155*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mClipDepthMode);
2156*8975f5c5SAndroid Build Coastguard Worker             break;
2157*8975f5c5SAndroid Build Coastguard Worker 
2158*8975f5c5SAndroid Build Coastguard Worker         // GL_QCOM_shading_rate
2159*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADING_RATE_QCOM:
2160*8975f5c5SAndroid Build Coastguard Worker             *params = ToGLenum(mShadingRate);
2161*8975f5c5SAndroid Build Coastguard Worker             break;
2162*8975f5c5SAndroid Build Coastguard Worker 
2163*8975f5c5SAndroid Build Coastguard Worker         // GL_ANGLE_shader_pixel_local_storage
2164*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_STORAGE_ACTIVE_PLANES_ANGLE:
2165*8975f5c5SAndroid Build Coastguard Worker             *params = mPixelLocalStorageActivePlanes;
2166*8975f5c5SAndroid Build Coastguard Worker             break;
2167*8975f5c5SAndroid Build Coastguard Worker 
2168*8975f5c5SAndroid Build Coastguard Worker         // GL_ARM_shader_framebuffer_fetch
2169*8975f5c5SAndroid Build Coastguard Worker         case GL_FETCH_PER_SAMPLE_ARM:
2170*8975f5c5SAndroid Build Coastguard Worker             *params = mFetchPerSample ? 1 : 0;
2171*8975f5c5SAndroid Build Coastguard Worker             break;
2172*8975f5c5SAndroid Build Coastguard Worker 
2173*8975f5c5SAndroid Build Coastguard Worker         // GL_ARM_shader_framebuffer_fetch
2174*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM:
2175*8975f5c5SAndroid Build Coastguard Worker             *params = mCaps.fragmentShaderFramebufferFetchMRT ? 1 : 0;
2176*8975f5c5SAndroid Build Coastguard Worker             break;
2177*8975f5c5SAndroid Build Coastguard Worker 
2178*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_ADVANCED_COHERENT_KHR:
2179*8975f5c5SAndroid Build Coastguard Worker             *params = mBlendAdvancedCoherent ? 1 : 0;
2180*8975f5c5SAndroid Build Coastguard Worker             break;
2181*8975f5c5SAndroid Build Coastguard Worker 
2182*8975f5c5SAndroid Build Coastguard Worker         default:
2183*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
2184*8975f5c5SAndroid Build Coastguard Worker             break;
2185*8975f5c5SAndroid Build Coastguard Worker     }
2186*8975f5c5SAndroid Build Coastguard Worker }
2187*8975f5c5SAndroid Build Coastguard Worker 
getIntegeri_v(GLenum target,GLuint index,GLint * data) const2188*8975f5c5SAndroid Build Coastguard Worker void PrivateState::getIntegeri_v(GLenum target, GLuint index, GLint *data) const
2189*8975f5c5SAndroid Build Coastguard Worker {
2190*8975f5c5SAndroid Build Coastguard Worker     switch (target)
2191*8975f5c5SAndroid Build Coastguard Worker     {
2192*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_SRC_RGB:
2193*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
2194*8975f5c5SAndroid Build Coastguard Worker             *data = ToGLenum(mBlendStateExt.getSrcColorIndexed(index));
2195*8975f5c5SAndroid Build Coastguard Worker             break;
2196*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_SRC_ALPHA:
2197*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
2198*8975f5c5SAndroid Build Coastguard Worker             *data = ToGLenum(mBlendStateExt.getSrcAlphaIndexed(index));
2199*8975f5c5SAndroid Build Coastguard Worker             break;
2200*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_DST_RGB:
2201*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
2202*8975f5c5SAndroid Build Coastguard Worker             *data = ToGLenum(mBlendStateExt.getDstColorIndexed(index));
2203*8975f5c5SAndroid Build Coastguard Worker             break;
2204*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_DST_ALPHA:
2205*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
2206*8975f5c5SAndroid Build Coastguard Worker             *data = ToGLenum(mBlendStateExt.getDstAlphaIndexed(index));
2207*8975f5c5SAndroid Build Coastguard Worker             break;
2208*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_EQUATION_RGB:
2209*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
2210*8975f5c5SAndroid Build Coastguard Worker             *data = ToGLenum(mBlendStateExt.getEquationColorIndexed(index));
2211*8975f5c5SAndroid Build Coastguard Worker             break;
2212*8975f5c5SAndroid Build Coastguard Worker         case GL_BLEND_EQUATION_ALPHA:
2213*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
2214*8975f5c5SAndroid Build Coastguard Worker             *data = ToGLenum(mBlendStateExt.getEquationAlphaIndexed(index));
2215*8975f5c5SAndroid Build Coastguard Worker             break;
2216*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_MASK_VALUE:
2217*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mSampleMaskValues.size());
2218*8975f5c5SAndroid Build Coastguard Worker             *data = mSampleMaskValues[index];
2219*8975f5c5SAndroid Build Coastguard Worker             break;
2220*8975f5c5SAndroid Build Coastguard Worker         default:
2221*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
2222*8975f5c5SAndroid Build Coastguard Worker             break;
2223*8975f5c5SAndroid Build Coastguard Worker     }
2224*8975f5c5SAndroid Build Coastguard Worker }
2225*8975f5c5SAndroid Build Coastguard Worker 
getBooleani_v(GLenum target,GLuint index,GLboolean * data) const2226*8975f5c5SAndroid Build Coastguard Worker void PrivateState::getBooleani_v(GLenum target, GLuint index, GLboolean *data) const
2227*8975f5c5SAndroid Build Coastguard Worker {
2228*8975f5c5SAndroid Build Coastguard Worker     switch (target)
2229*8975f5c5SAndroid Build Coastguard Worker     {
2230*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_WRITEMASK:
2231*8975f5c5SAndroid Build Coastguard Worker         {
2232*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mBlendStateExt.getDrawBufferCount());
2233*8975f5c5SAndroid Build Coastguard Worker             bool r, g, b, a;
2234*8975f5c5SAndroid Build Coastguard Worker             mBlendStateExt.getColorMaskIndexed(index, &r, &g, &b, &a);
2235*8975f5c5SAndroid Build Coastguard Worker             data[0] = r;
2236*8975f5c5SAndroid Build Coastguard Worker             data[1] = g;
2237*8975f5c5SAndroid Build Coastguard Worker             data[2] = b;
2238*8975f5c5SAndroid Build Coastguard Worker             data[3] = a;
2239*8975f5c5SAndroid Build Coastguard Worker             break;
2240*8975f5c5SAndroid Build Coastguard Worker         }
2241*8975f5c5SAndroid Build Coastguard Worker         default:
2242*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
2243*8975f5c5SAndroid Build Coastguard Worker             break;
2244*8975f5c5SAndroid Build Coastguard Worker     }
2245*8975f5c5SAndroid Build Coastguard Worker }
2246*8975f5c5SAndroid Build Coastguard Worker 
State(const State * shareContextState,egl::ShareGroup * shareGroup,TextureManager * shareTextures,SemaphoreManager * shareSemaphores,egl::ContextMutex * contextMutex,const OverlayType * overlay,const Version & clientVersion,bool debug,bool bindGeneratesResourceCHROMIUM,bool clientArraysEnabled,bool robustResourceInit,bool programBinaryCacheEnabled,EGLenum contextPriority,bool hasRobustAccess,bool hasProtectedContent,bool isExternal)2247*8975f5c5SAndroid Build Coastguard Worker State::State(const State *shareContextState,
2248*8975f5c5SAndroid Build Coastguard Worker              egl::ShareGroup *shareGroup,
2249*8975f5c5SAndroid Build Coastguard Worker              TextureManager *shareTextures,
2250*8975f5c5SAndroid Build Coastguard Worker              SemaphoreManager *shareSemaphores,
2251*8975f5c5SAndroid Build Coastguard Worker              egl::ContextMutex *contextMutex,
2252*8975f5c5SAndroid Build Coastguard Worker              const OverlayType *overlay,
2253*8975f5c5SAndroid Build Coastguard Worker              const Version &clientVersion,
2254*8975f5c5SAndroid Build Coastguard Worker              bool debug,
2255*8975f5c5SAndroid Build Coastguard Worker              bool bindGeneratesResourceCHROMIUM,
2256*8975f5c5SAndroid Build Coastguard Worker              bool clientArraysEnabled,
2257*8975f5c5SAndroid Build Coastguard Worker              bool robustResourceInit,
2258*8975f5c5SAndroid Build Coastguard Worker              bool programBinaryCacheEnabled,
2259*8975f5c5SAndroid Build Coastguard Worker              EGLenum contextPriority,
2260*8975f5c5SAndroid Build Coastguard Worker              bool hasRobustAccess,
2261*8975f5c5SAndroid Build Coastguard Worker              bool hasProtectedContent,
2262*8975f5c5SAndroid Build Coastguard Worker              bool isExternal)
2263*8975f5c5SAndroid Build Coastguard Worker     : mID({gIDCounter++}),
2264*8975f5c5SAndroid Build Coastguard Worker       mContextPriority(contextPriority),
2265*8975f5c5SAndroid Build Coastguard Worker       mHasRobustAccess(hasRobustAccess),
2266*8975f5c5SAndroid Build Coastguard Worker       mHasProtectedContent(hasProtectedContent),
2267*8975f5c5SAndroid Build Coastguard Worker       mIsDebugContext(debug),
2268*8975f5c5SAndroid Build Coastguard Worker       mShareGroup(shareGroup),
2269*8975f5c5SAndroid Build Coastguard Worker       mContextMutex(contextMutex),
2270*8975f5c5SAndroid Build Coastguard Worker       mBufferManager(AllocateOrGetSharedResourceManager(shareContextState, &State::mBufferManager)),
2271*8975f5c5SAndroid Build Coastguard Worker       mShaderProgramManager(
2272*8975f5c5SAndroid Build Coastguard Worker           AllocateOrGetSharedResourceManager(shareContextState, &State::mShaderProgramManager)),
2273*8975f5c5SAndroid Build Coastguard Worker       mTextureManager(AllocateOrGetSharedResourceManager(shareContextState,
2274*8975f5c5SAndroid Build Coastguard Worker                                                          &State::mTextureManager,
2275*8975f5c5SAndroid Build Coastguard Worker                                                          shareTextures)),
2276*8975f5c5SAndroid Build Coastguard Worker       mRenderbufferManager(
2277*8975f5c5SAndroid Build Coastguard Worker           AllocateOrGetSharedResourceManager(shareContextState, &State::mRenderbufferManager)),
2278*8975f5c5SAndroid Build Coastguard Worker       mSamplerManager(
2279*8975f5c5SAndroid Build Coastguard Worker           AllocateOrGetSharedResourceManager(shareContextState, &State::mSamplerManager)),
2280*8975f5c5SAndroid Build Coastguard Worker       mSyncManager(AllocateOrGetSharedResourceManager(shareContextState, &State::mSyncManager)),
2281*8975f5c5SAndroid Build Coastguard Worker       mFramebufferManager(new FramebufferManager()),
2282*8975f5c5SAndroid Build Coastguard Worker       mProgramPipelineManager(new ProgramPipelineManager()),
2283*8975f5c5SAndroid Build Coastguard Worker       mMemoryObjectManager(
2284*8975f5c5SAndroid Build Coastguard Worker           AllocateOrGetSharedResourceManager(shareContextState, &State::mMemoryObjectManager)),
2285*8975f5c5SAndroid Build Coastguard Worker       mSemaphoreManager(AllocateOrGetSharedResourceManager(shareContextState,
2286*8975f5c5SAndroid Build Coastguard Worker                                                            &State::mSemaphoreManager,
2287*8975f5c5SAndroid Build Coastguard Worker                                                            shareSemaphores)),
2288*8975f5c5SAndroid Build Coastguard Worker       mReadFramebuffer(nullptr),
2289*8975f5c5SAndroid Build Coastguard Worker       mDrawFramebuffer(nullptr),
2290*8975f5c5SAndroid Build Coastguard Worker       mProgram(nullptr),
2291*8975f5c5SAndroid Build Coastguard Worker       mVertexArray(nullptr),
2292*8975f5c5SAndroid Build Coastguard Worker       mDisplayTextureShareGroup(shareTextures != nullptr),
2293*8975f5c5SAndroid Build Coastguard Worker       mMaxShaderCompilerThreads(std::numeric_limits<GLuint>::max()),
2294*8975f5c5SAndroid Build Coastguard Worker       mOverlay(overlay),
2295*8975f5c5SAndroid Build Coastguard Worker       mPrivateState(clientVersion,
2296*8975f5c5SAndroid Build Coastguard Worker                     debug,
2297*8975f5c5SAndroid Build Coastguard Worker                     bindGeneratesResourceCHROMIUM,
2298*8975f5c5SAndroid Build Coastguard Worker                     clientArraysEnabled,
2299*8975f5c5SAndroid Build Coastguard Worker                     robustResourceInit,
2300*8975f5c5SAndroid Build Coastguard Worker                     programBinaryCacheEnabled,
2301*8975f5c5SAndroid Build Coastguard Worker                     isExternal)
2302*8975f5c5SAndroid Build Coastguard Worker {}
2303*8975f5c5SAndroid Build Coastguard Worker 
~State()2304*8975f5c5SAndroid Build Coastguard Worker State::~State() {}
2305*8975f5c5SAndroid Build Coastguard Worker 
initialize(Context * context)2306*8975f5c5SAndroid Build Coastguard Worker void State::initialize(Context *context)
2307*8975f5c5SAndroid Build Coastguard Worker {
2308*8975f5c5SAndroid Build Coastguard Worker     const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
2309*8975f5c5SAndroid Build Coastguard Worker     const Version &clientVersion       = context->getClientVersion();
2310*8975f5c5SAndroid Build Coastguard Worker 
2311*8975f5c5SAndroid Build Coastguard Worker     mPrivateState.initialize(context);
2312*8975f5c5SAndroid Build Coastguard Worker 
2313*8975f5c5SAndroid Build Coastguard Worker     mUniformBuffers.resize(getCaps().maxUniformBufferBindings);
2314*8975f5c5SAndroid Build Coastguard Worker 
2315*8975f5c5SAndroid Build Coastguard Worker     mSamplerTextures[TextureType::_2D].resize(getCaps().maxCombinedTextureImageUnits);
2316*8975f5c5SAndroid Build Coastguard Worker     mSamplerTextures[TextureType::CubeMap].resize(getCaps().maxCombinedTextureImageUnits);
2317*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 0) || nativeExtensions.texture3DOES)
2318*8975f5c5SAndroid Build Coastguard Worker     {
2319*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::_3D].resize(getCaps().maxCombinedTextureImageUnits);
2320*8975f5c5SAndroid Build Coastguard Worker     }
2321*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 0))
2322*8975f5c5SAndroid Build Coastguard Worker     {
2323*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::_2DArray].resize(getCaps().maxCombinedTextureImageUnits);
2324*8975f5c5SAndroid Build Coastguard Worker     }
2325*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 1) || nativeExtensions.textureMultisampleANGLE)
2326*8975f5c5SAndroid Build Coastguard Worker     {
2327*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::_2DMultisample].resize(
2328*8975f5c5SAndroid Build Coastguard Worker             getCaps().maxCombinedTextureImageUnits);
2329*8975f5c5SAndroid Build Coastguard Worker     }
2330*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 2) || nativeExtensions.textureStorageMultisample2dArrayOES)
2331*8975f5c5SAndroid Build Coastguard Worker     {
2332*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::_2DMultisampleArray].resize(
2333*8975f5c5SAndroid Build Coastguard Worker             getCaps().maxCombinedTextureImageUnits);
2334*8975f5c5SAndroid Build Coastguard Worker     }
2335*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 1))
2336*8975f5c5SAndroid Build Coastguard Worker     {
2337*8975f5c5SAndroid Build Coastguard Worker         mAtomicCounterBuffers.resize(getCaps().maxAtomicCounterBufferBindings);
2338*8975f5c5SAndroid Build Coastguard Worker         mShaderStorageBuffers.resize(getCaps().maxShaderStorageBufferBindings);
2339*8975f5c5SAndroid Build Coastguard Worker     }
2340*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 1) ||
2341*8975f5c5SAndroid Build Coastguard Worker         (context->getImplementation()->getNativePixelLocalStorageOptions().type ==
2342*8975f5c5SAndroid Build Coastguard Worker          ShPixelLocalStorageType::ImageLoadStore))
2343*8975f5c5SAndroid Build Coastguard Worker     {
2344*8975f5c5SAndroid Build Coastguard Worker         mImageUnits.resize(getCaps().maxImageUnits);
2345*8975f5c5SAndroid Build Coastguard Worker     }
2346*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 1) || nativeExtensions.textureCubeMapArrayAny())
2347*8975f5c5SAndroid Build Coastguard Worker     {
2348*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::CubeMapArray].resize(getCaps().maxCombinedTextureImageUnits);
2349*8975f5c5SAndroid Build Coastguard Worker     }
2350*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 1) || nativeExtensions.textureCubeMapArrayAny())
2351*8975f5c5SAndroid Build Coastguard Worker     {
2352*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::Buffer].resize(getCaps().maxCombinedTextureImageUnits);
2353*8975f5c5SAndroid Build Coastguard Worker     }
2354*8975f5c5SAndroid Build Coastguard Worker     if (nativeExtensions.textureRectangleANGLE)
2355*8975f5c5SAndroid Build Coastguard Worker     {
2356*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::Rectangle].resize(getCaps().maxCombinedTextureImageUnits);
2357*8975f5c5SAndroid Build Coastguard Worker     }
2358*8975f5c5SAndroid Build Coastguard Worker     if (nativeExtensions.EGLImageExternalOES || nativeExtensions.EGLStreamConsumerExternalNV)
2359*8975f5c5SAndroid Build Coastguard Worker     {
2360*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::External].resize(getCaps().maxCombinedTextureImageUnits);
2361*8975f5c5SAndroid Build Coastguard Worker     }
2362*8975f5c5SAndroid Build Coastguard Worker     if (nativeExtensions.videoTextureWEBGL)
2363*8975f5c5SAndroid Build Coastguard Worker     {
2364*8975f5c5SAndroid Build Coastguard Worker         mSamplerTextures[TextureType::VideoImage].resize(getCaps().maxCombinedTextureImageUnits);
2365*8975f5c5SAndroid Build Coastguard Worker     }
2366*8975f5c5SAndroid Build Coastguard Worker     mCompleteTextureBindings.reserve(getCaps().maxCombinedTextureImageUnits);
2367*8975f5c5SAndroid Build Coastguard Worker     for (int32_t textureIndex = 0; textureIndex < getCaps().maxCombinedTextureImageUnits;
2368*8975f5c5SAndroid Build Coastguard Worker          ++textureIndex)
2369*8975f5c5SAndroid Build Coastguard Worker     {
2370*8975f5c5SAndroid Build Coastguard Worker         mCompleteTextureBindings.emplace_back(context, textureIndex);
2371*8975f5c5SAndroid Build Coastguard Worker     }
2372*8975f5c5SAndroid Build Coastguard Worker 
2373*8975f5c5SAndroid Build Coastguard Worker     mSamplers.resize(getCaps().maxCombinedTextureImageUnits);
2374*8975f5c5SAndroid Build Coastguard Worker 
2375*8975f5c5SAndroid Build Coastguard Worker     for (QueryType type : angle::AllEnums<QueryType>())
2376*8975f5c5SAndroid Build Coastguard Worker     {
2377*8975f5c5SAndroid Build Coastguard Worker         mActiveQueries[type].set(context, nullptr);
2378*8975f5c5SAndroid Build Coastguard Worker     }
2379*8975f5c5SAndroid Build Coastguard Worker 
2380*8975f5c5SAndroid Build Coastguard Worker     mProgram = nullptr;
2381*8975f5c5SAndroid Build Coastguard Worker     UninstallExecutable(context, &mExecutable);
2382*8975f5c5SAndroid Build Coastguard Worker 
2383*8975f5c5SAndroid Build Coastguard Worker     mReadFramebuffer = nullptr;
2384*8975f5c5SAndroid Build Coastguard Worker     mDrawFramebuffer = nullptr;
2385*8975f5c5SAndroid Build Coastguard Worker 
2386*8975f5c5SAndroid Build Coastguard Worker     getDebug().setMaxLoggedMessages(getCaps().maxDebugLoggedMessages);
2387*8975f5c5SAndroid Build Coastguard Worker }
2388*8975f5c5SAndroid Build Coastguard Worker 
reset(const Context * context)2389*8975f5c5SAndroid Build Coastguard Worker void State::reset(const Context *context)
2390*8975f5c5SAndroid Build Coastguard Worker {
2391*8975f5c5SAndroid Build Coastguard Worker     // Force a sync so clear doesn't end up dereferencing stale pointers.
2392*8975f5c5SAndroid Build Coastguard Worker     (void)syncActiveTextures(context, Command::Other);
2393*8975f5c5SAndroid Build Coastguard Worker     mActiveTexturesCache.clear();
2394*8975f5c5SAndroid Build Coastguard Worker 
2395*8975f5c5SAndroid Build Coastguard Worker     for (TextureBindingVector &bindingVec : mSamplerTextures)
2396*8975f5c5SAndroid Build Coastguard Worker     {
2397*8975f5c5SAndroid Build Coastguard Worker         for (BindingPointer<Texture> &texBinding : bindingVec)
2398*8975f5c5SAndroid Build Coastguard Worker         {
2399*8975f5c5SAndroid Build Coastguard Worker             texBinding.set(context, nullptr);
2400*8975f5c5SAndroid Build Coastguard Worker         }
2401*8975f5c5SAndroid Build Coastguard Worker     }
2402*8975f5c5SAndroid Build Coastguard Worker     for (size_t samplerIdx = 0; samplerIdx < mSamplers.size(); samplerIdx++)
2403*8975f5c5SAndroid Build Coastguard Worker     {
2404*8975f5c5SAndroid Build Coastguard Worker         mSamplers[samplerIdx].set(context, nullptr);
2405*8975f5c5SAndroid Build Coastguard Worker     }
2406*8975f5c5SAndroid Build Coastguard Worker 
2407*8975f5c5SAndroid Build Coastguard Worker     for (ImageUnit &imageUnit : mImageUnits)
2408*8975f5c5SAndroid Build Coastguard Worker     {
2409*8975f5c5SAndroid Build Coastguard Worker         imageUnit.texture.set(context, nullptr);
2410*8975f5c5SAndroid Build Coastguard Worker         imageUnit.level   = 0;
2411*8975f5c5SAndroid Build Coastguard Worker         imageUnit.layered = false;
2412*8975f5c5SAndroid Build Coastguard Worker         imageUnit.layer   = 0;
2413*8975f5c5SAndroid Build Coastguard Worker         imageUnit.access  = GL_READ_ONLY;
2414*8975f5c5SAndroid Build Coastguard Worker         imageUnit.format  = GL_R32UI;
2415*8975f5c5SAndroid Build Coastguard Worker     }
2416*8975f5c5SAndroid Build Coastguard Worker 
2417*8975f5c5SAndroid Build Coastguard Worker     mRenderbuffer.set(context, nullptr);
2418*8975f5c5SAndroid Build Coastguard Worker 
2419*8975f5c5SAndroid Build Coastguard Worker     for (BufferBinding type : angle::AllEnums<BufferBinding>())
2420*8975f5c5SAndroid Build Coastguard Worker     {
2421*8975f5c5SAndroid Build Coastguard Worker         UpdateBufferBinding(context, &mBoundBuffers[type], nullptr, type);
2422*8975f5c5SAndroid Build Coastguard Worker     }
2423*8975f5c5SAndroid Build Coastguard Worker 
2424*8975f5c5SAndroid Build Coastguard Worker     UninstallExecutable(context, &mExecutable);
2425*8975f5c5SAndroid Build Coastguard Worker     if (mProgram)
2426*8975f5c5SAndroid Build Coastguard Worker     {
2427*8975f5c5SAndroid Build Coastguard Worker         mProgram->release(context);
2428*8975f5c5SAndroid Build Coastguard Worker     }
2429*8975f5c5SAndroid Build Coastguard Worker     mProgram = nullptr;
2430*8975f5c5SAndroid Build Coastguard Worker     mProgramPipeline.set(context, nullptr);
2431*8975f5c5SAndroid Build Coastguard Worker 
2432*8975f5c5SAndroid Build Coastguard Worker     if (mTransformFeedback.get())
2433*8975f5c5SAndroid Build Coastguard Worker     {
2434*8975f5c5SAndroid Build Coastguard Worker         mTransformFeedback->onBindingChanged(context, false);
2435*8975f5c5SAndroid Build Coastguard Worker     }
2436*8975f5c5SAndroid Build Coastguard Worker     mTransformFeedback.set(context, nullptr);
2437*8975f5c5SAndroid Build Coastguard Worker 
2438*8975f5c5SAndroid Build Coastguard Worker     for (QueryType type : angle::AllEnums<QueryType>())
2439*8975f5c5SAndroid Build Coastguard Worker     {
2440*8975f5c5SAndroid Build Coastguard Worker         mActiveQueries[type].set(context, nullptr);
2441*8975f5c5SAndroid Build Coastguard Worker     }
2442*8975f5c5SAndroid Build Coastguard Worker 
2443*8975f5c5SAndroid Build Coastguard Worker     for (OffsetBindingPointer<Buffer> &buf : mUniformBuffers)
2444*8975f5c5SAndroid Build Coastguard Worker     {
2445*8975f5c5SAndroid Build Coastguard Worker         UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::Uniform, 0, 0);
2446*8975f5c5SAndroid Build Coastguard Worker     }
2447*8975f5c5SAndroid Build Coastguard Worker     mBoundUniformBuffersMask.reset();
2448*8975f5c5SAndroid Build Coastguard Worker 
2449*8975f5c5SAndroid Build Coastguard Worker     for (OffsetBindingPointer<Buffer> &buf : mAtomicCounterBuffers)
2450*8975f5c5SAndroid Build Coastguard Worker     {
2451*8975f5c5SAndroid Build Coastguard Worker         UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
2452*8975f5c5SAndroid Build Coastguard Worker     }
2453*8975f5c5SAndroid Build Coastguard Worker     mBoundAtomicCounterBuffersMask.reset();
2454*8975f5c5SAndroid Build Coastguard Worker 
2455*8975f5c5SAndroid Build Coastguard Worker     for (OffsetBindingPointer<Buffer> &buf : mShaderStorageBuffers)
2456*8975f5c5SAndroid Build Coastguard Worker     {
2457*8975f5c5SAndroid Build Coastguard Worker         UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::ShaderStorage, 0, 0);
2458*8975f5c5SAndroid Build Coastguard Worker     }
2459*8975f5c5SAndroid Build Coastguard Worker     mBoundShaderStorageBuffersMask.reset();
2460*8975f5c5SAndroid Build Coastguard Worker 
2461*8975f5c5SAndroid Build Coastguard Worker     mPrivateState.reset();
2462*8975f5c5SAndroid Build Coastguard Worker 
2463*8975f5c5SAndroid Build Coastguard Worker     setAllDirtyBits();
2464*8975f5c5SAndroid Build Coastguard Worker }
2465*8975f5c5SAndroid Build Coastguard Worker 
unsetActiveTextures(const ActiveTextureMask & textureMask)2466*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void State::unsetActiveTextures(const ActiveTextureMask &textureMask)
2467*8975f5c5SAndroid Build Coastguard Worker {
2468*8975f5c5SAndroid Build Coastguard Worker     // Unset any relevant bound textures.
2469*8975f5c5SAndroid Build Coastguard Worker     for (size_t textureIndex : textureMask)
2470*8975f5c5SAndroid Build Coastguard Worker     {
2471*8975f5c5SAndroid Build Coastguard Worker         mActiveTexturesCache.reset(textureIndex);
2472*8975f5c5SAndroid Build Coastguard Worker         mCompleteTextureBindings[textureIndex].reset();
2473*8975f5c5SAndroid Build Coastguard Worker     }
2474*8975f5c5SAndroid Build Coastguard Worker }
2475*8975f5c5SAndroid Build Coastguard Worker 
updateActiveTextureStateOnSync(const Context * context,size_t textureIndex,const Sampler * sampler,Texture * texture)2476*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void State::updateActiveTextureStateOnSync(const Context *context,
2477*8975f5c5SAndroid Build Coastguard Worker                                                         size_t textureIndex,
2478*8975f5c5SAndroid Build Coastguard Worker                                                         const Sampler *sampler,
2479*8975f5c5SAndroid Build Coastguard Worker                                                         Texture *texture)
2480*8975f5c5SAndroid Build Coastguard Worker {
2481*8975f5c5SAndroid Build Coastguard Worker     if (!texture || !texture->isSamplerComplete(context, sampler))
2482*8975f5c5SAndroid Build Coastguard Worker     {
2483*8975f5c5SAndroid Build Coastguard Worker         mActiveTexturesCache.reset(textureIndex);
2484*8975f5c5SAndroid Build Coastguard Worker     }
2485*8975f5c5SAndroid Build Coastguard Worker     else
2486*8975f5c5SAndroid Build Coastguard Worker     {
2487*8975f5c5SAndroid Build Coastguard Worker         mActiveTexturesCache.set(textureIndex, texture);
2488*8975f5c5SAndroid Build Coastguard Worker     }
2489*8975f5c5SAndroid Build Coastguard Worker 
2490*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_TEXTURE_BINDINGS);
2491*8975f5c5SAndroid Build Coastguard Worker }
2492*8975f5c5SAndroid Build Coastguard Worker 
setActiveTextureDirty(size_t textureIndex,Texture * texture)2493*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void State::setActiveTextureDirty(size_t textureIndex, Texture *texture)
2494*8975f5c5SAndroid Build Coastguard Worker {
2495*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_ACTIVE_TEXTURES);
2496*8975f5c5SAndroid Build Coastguard Worker     mDirtyActiveTextures.set(textureIndex);
2497*8975f5c5SAndroid Build Coastguard Worker 
2498*8975f5c5SAndroid Build Coastguard Worker     if (!texture)
2499*8975f5c5SAndroid Build Coastguard Worker     {
2500*8975f5c5SAndroid Build Coastguard Worker         return;
2501*8975f5c5SAndroid Build Coastguard Worker     }
2502*8975f5c5SAndroid Build Coastguard Worker 
2503*8975f5c5SAndroid Build Coastguard Worker     if (texture->hasAnyDirtyBit())
2504*8975f5c5SAndroid Build Coastguard Worker     {
2505*8975f5c5SAndroid Build Coastguard Worker         setTextureDirty(textureIndex);
2506*8975f5c5SAndroid Build Coastguard Worker     }
2507*8975f5c5SAndroid Build Coastguard Worker 
2508*8975f5c5SAndroid Build Coastguard Worker     if (isRobustResourceInitEnabled() && texture->initState() == InitState::MayNeedInit)
2509*8975f5c5SAndroid Build Coastguard Worker     {
2510*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_TEXTURES_INIT);
2511*8975f5c5SAndroid Build Coastguard Worker     }
2512*8975f5c5SAndroid Build Coastguard Worker 
2513*8975f5c5SAndroid Build Coastguard Worker     // This cache is updated immediately because we use the cache in the validation layer.
2514*8975f5c5SAndroid Build Coastguard Worker     // If we defer the update until syncState it's too late and we've already passed validation.
2515*8975f5c5SAndroid Build Coastguard Worker     if (texture && mExecutable)
2516*8975f5c5SAndroid Build Coastguard Worker     {
2517*8975f5c5SAndroid Build Coastguard Worker         // It is invalid to try to sample a non-yuv texture with a yuv sampler.
2518*8975f5c5SAndroid Build Coastguard Worker         mTexturesIncompatibleWithSamplers[textureIndex] =
2519*8975f5c5SAndroid Build Coastguard Worker             mExecutable->getActiveYUVSamplers().test(textureIndex) && !texture->isYUV();
2520*8975f5c5SAndroid Build Coastguard Worker 
2521*8975f5c5SAndroid Build Coastguard Worker         if (isWebGL())
2522*8975f5c5SAndroid Build Coastguard Worker         {
2523*8975f5c5SAndroid Build Coastguard Worker             const Sampler *sampler = mSamplers[textureIndex].get();
2524*8975f5c5SAndroid Build Coastguard Worker             const SamplerState &samplerState =
2525*8975f5c5SAndroid Build Coastguard Worker                 sampler ? sampler->getSamplerState() : texture->getSamplerState();
2526*8975f5c5SAndroid Build Coastguard Worker             if (!texture->getTextureState().compatibleWithSamplerFormatForWebGL(
2527*8975f5c5SAndroid Build Coastguard Worker                     mExecutable->getSamplerFormatForTextureUnitIndex(textureIndex), samplerState))
2528*8975f5c5SAndroid Build Coastguard Worker             {
2529*8975f5c5SAndroid Build Coastguard Worker                 mTexturesIncompatibleWithSamplers[textureIndex] = true;
2530*8975f5c5SAndroid Build Coastguard Worker             }
2531*8975f5c5SAndroid Build Coastguard Worker         }
2532*8975f5c5SAndroid Build Coastguard Worker     }
2533*8975f5c5SAndroid Build Coastguard Worker     else
2534*8975f5c5SAndroid Build Coastguard Worker     {
2535*8975f5c5SAndroid Build Coastguard Worker         mTexturesIncompatibleWithSamplers[textureIndex] = false;
2536*8975f5c5SAndroid Build Coastguard Worker     }
2537*8975f5c5SAndroid Build Coastguard Worker }
2538*8975f5c5SAndroid Build Coastguard Worker 
updateTextureBinding(const Context * context,size_t textureIndex,Texture * texture)2539*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void State::updateTextureBinding(const Context *context,
2540*8975f5c5SAndroid Build Coastguard Worker                                               size_t textureIndex,
2541*8975f5c5SAndroid Build Coastguard Worker                                               Texture *texture)
2542*8975f5c5SAndroid Build Coastguard Worker {
2543*8975f5c5SAndroid Build Coastguard Worker     mCompleteTextureBindings[textureIndex].bind(texture);
2544*8975f5c5SAndroid Build Coastguard Worker     mActiveTexturesCache.reset(textureIndex);
2545*8975f5c5SAndroid Build Coastguard Worker     setActiveTextureDirty(textureIndex, texture);
2546*8975f5c5SAndroid Build Coastguard Worker }
2547*8975f5c5SAndroid Build Coastguard Worker 
allActiveDrawBufferChannelsMasked() const2548*8975f5c5SAndroid Build Coastguard Worker bool State::allActiveDrawBufferChannelsMasked() const
2549*8975f5c5SAndroid Build Coastguard Worker {
2550*8975f5c5SAndroid Build Coastguard Worker     // Compare current color mask with all-disabled color mask, while ignoring disabled draw
2551*8975f5c5SAndroid Build Coastguard Worker     // buffers.
2552*8975f5c5SAndroid Build Coastguard Worker     return (getBlendStateExt().compareColorMask(0) & mDrawFramebuffer->getDrawBufferMask()).none();
2553*8975f5c5SAndroid Build Coastguard Worker }
2554*8975f5c5SAndroid Build Coastguard Worker 
anyActiveDrawBufferChannelMasked() const2555*8975f5c5SAndroid Build Coastguard Worker bool State::anyActiveDrawBufferChannelMasked() const
2556*8975f5c5SAndroid Build Coastguard Worker {
2557*8975f5c5SAndroid Build Coastguard Worker     // Compare current color mask with all-enabled color mask, while ignoring disabled draw
2558*8975f5c5SAndroid Build Coastguard Worker     // buffers.
2559*8975f5c5SAndroid Build Coastguard Worker     return (getBlendStateExt().compareColorMask(getBlendStateExt().getAllColorMaskBits()) &
2560*8975f5c5SAndroid Build Coastguard Worker             mDrawFramebuffer->getDrawBufferMask())
2561*8975f5c5SAndroid Build Coastguard Worker         .any();
2562*8975f5c5SAndroid Build Coastguard Worker }
2563*8975f5c5SAndroid Build Coastguard Worker 
setSamplerTexture(const Context * context,TextureType type,Texture * texture)2564*8975f5c5SAndroid Build Coastguard Worker void State::setSamplerTexture(const Context *context, TextureType type, Texture *texture)
2565*8975f5c5SAndroid Build Coastguard Worker {
2566*8975f5c5SAndroid Build Coastguard Worker     if (mExecutable && mExecutable->getActiveSamplersMask()[getActiveSampler()] &&
2567*8975f5c5SAndroid Build Coastguard Worker         IsTextureCompatibleWithSampler(type,
2568*8975f5c5SAndroid Build Coastguard Worker                                        mExecutable->getActiveSamplerTypes()[getActiveSampler()]))
2569*8975f5c5SAndroid Build Coastguard Worker     {
2570*8975f5c5SAndroid Build Coastguard Worker         updateTextureBinding(context, getActiveSampler(), texture);
2571*8975f5c5SAndroid Build Coastguard Worker     }
2572*8975f5c5SAndroid Build Coastguard Worker 
2573*8975f5c5SAndroid Build Coastguard Worker     mSamplerTextures[type][getActiveSampler()].set(context, texture);
2574*8975f5c5SAndroid Build Coastguard Worker 
2575*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_TEXTURE_BINDINGS);
2576*8975f5c5SAndroid Build Coastguard Worker }
2577*8975f5c5SAndroid Build Coastguard Worker 
getTargetTexture(TextureType type) const2578*8975f5c5SAndroid Build Coastguard Worker Texture *State::getTargetTexture(TextureType type) const
2579*8975f5c5SAndroid Build Coastguard Worker {
2580*8975f5c5SAndroid Build Coastguard Worker     return getSamplerTexture(getActiveSampler(), type);
2581*8975f5c5SAndroid Build Coastguard Worker }
2582*8975f5c5SAndroid Build Coastguard Worker 
getSamplerTextureId(unsigned int sampler,TextureType type) const2583*8975f5c5SAndroid Build Coastguard Worker TextureID State::getSamplerTextureId(unsigned int sampler, TextureType type) const
2584*8975f5c5SAndroid Build Coastguard Worker {
2585*8975f5c5SAndroid Build Coastguard Worker     ASSERT(sampler < mSamplerTextures[type].size());
2586*8975f5c5SAndroid Build Coastguard Worker     return mSamplerTextures[type][sampler].id();
2587*8975f5c5SAndroid Build Coastguard Worker }
2588*8975f5c5SAndroid Build Coastguard Worker 
detachTexture(Context * context,const TextureMap & zeroTextures,TextureID texture)2589*8975f5c5SAndroid Build Coastguard Worker void State::detachTexture(Context *context, const TextureMap &zeroTextures, TextureID texture)
2590*8975f5c5SAndroid Build Coastguard Worker {
2591*8975f5c5SAndroid Build Coastguard Worker     // Textures have a detach method on State rather than a simple
2592*8975f5c5SAndroid Build Coastguard Worker     // removeBinding, because the zero/null texture objects are managed
2593*8975f5c5SAndroid Build Coastguard Worker     // separately, and don't have to go through the Context's maps or
2594*8975f5c5SAndroid Build Coastguard Worker     // the ResourceManager.
2595*8975f5c5SAndroid Build Coastguard Worker 
2596*8975f5c5SAndroid Build Coastguard Worker     // [OpenGL ES 2.0.24] section 3.8 page 84:
2597*8975f5c5SAndroid Build Coastguard Worker     // If a texture object is deleted, it is as if all texture units which are bound to that texture
2598*8975f5c5SAndroid Build Coastguard Worker     // object are rebound to texture object zero
2599*8975f5c5SAndroid Build Coastguard Worker 
2600*8975f5c5SAndroid Build Coastguard Worker     for (TextureType type : angle::AllEnums<TextureType>())
2601*8975f5c5SAndroid Build Coastguard Worker     {
2602*8975f5c5SAndroid Build Coastguard Worker         TextureBindingVector &textureVector = mSamplerTextures[type];
2603*8975f5c5SAndroid Build Coastguard Worker 
2604*8975f5c5SAndroid Build Coastguard Worker         for (size_t bindingIndex = 0; bindingIndex < textureVector.size(); ++bindingIndex)
2605*8975f5c5SAndroid Build Coastguard Worker         {
2606*8975f5c5SAndroid Build Coastguard Worker             BindingPointer<Texture> &binding = textureVector[bindingIndex];
2607*8975f5c5SAndroid Build Coastguard Worker             if (binding.id() == texture)
2608*8975f5c5SAndroid Build Coastguard Worker             {
2609*8975f5c5SAndroid Build Coastguard Worker                 // Zero textures are the "default" textures instead of NULL
2610*8975f5c5SAndroid Build Coastguard Worker                 Texture *zeroTexture = zeroTextures[type].get();
2611*8975f5c5SAndroid Build Coastguard Worker                 ASSERT(zeroTexture != nullptr);
2612*8975f5c5SAndroid Build Coastguard Worker                 if (mCompleteTextureBindings[bindingIndex].getSubject() == binding.get())
2613*8975f5c5SAndroid Build Coastguard Worker                 {
2614*8975f5c5SAndroid Build Coastguard Worker                     updateTextureBinding(context, bindingIndex, zeroTexture);
2615*8975f5c5SAndroid Build Coastguard Worker                 }
2616*8975f5c5SAndroid Build Coastguard Worker                 binding.set(context, zeroTexture);
2617*8975f5c5SAndroid Build Coastguard Worker             }
2618*8975f5c5SAndroid Build Coastguard Worker         }
2619*8975f5c5SAndroid Build Coastguard Worker     }
2620*8975f5c5SAndroid Build Coastguard Worker 
2621*8975f5c5SAndroid Build Coastguard Worker     for (auto &bindingImageUnit : mImageUnits)
2622*8975f5c5SAndroid Build Coastguard Worker     {
2623*8975f5c5SAndroid Build Coastguard Worker         if (bindingImageUnit.texture.id() == texture)
2624*8975f5c5SAndroid Build Coastguard Worker         {
2625*8975f5c5SAndroid Build Coastguard Worker             bindingImageUnit.texture.set(context, nullptr);
2626*8975f5c5SAndroid Build Coastguard Worker             bindingImageUnit.level   = 0;
2627*8975f5c5SAndroid Build Coastguard Worker             bindingImageUnit.layered = false;
2628*8975f5c5SAndroid Build Coastguard Worker             bindingImageUnit.layer   = 0;
2629*8975f5c5SAndroid Build Coastguard Worker             bindingImageUnit.access  = GL_READ_ONLY;
2630*8975f5c5SAndroid Build Coastguard Worker             bindingImageUnit.format  = GL_R32UI;
2631*8975f5c5SAndroid Build Coastguard Worker         }
2632*8975f5c5SAndroid Build Coastguard Worker     }
2633*8975f5c5SAndroid Build Coastguard Worker 
2634*8975f5c5SAndroid Build Coastguard Worker     // [OpenGL ES 2.0.24] section 4.4 page 112:
2635*8975f5c5SAndroid Build Coastguard Worker     // If a texture object is deleted while its image is attached to the currently bound
2636*8975f5c5SAndroid Build Coastguard Worker     // framebuffer, then it is as if Texture2DAttachment had been called, with a texture of 0, for
2637*8975f5c5SAndroid Build Coastguard Worker     // each attachment point to which this image was attached in the currently bound framebuffer.
2638*8975f5c5SAndroid Build Coastguard Worker 
2639*8975f5c5SAndroid Build Coastguard Worker     if (mReadFramebuffer && mReadFramebuffer->detachTexture(context, texture))
2640*8975f5c5SAndroid Build Coastguard Worker     {
2641*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_READ_FRAMEBUFFER);
2642*8975f5c5SAndroid Build Coastguard Worker     }
2643*8975f5c5SAndroid Build Coastguard Worker 
2644*8975f5c5SAndroid Build Coastguard Worker     if (mDrawFramebuffer && mDrawFramebuffer->detachTexture(context, texture))
2645*8975f5c5SAndroid Build Coastguard Worker     {
2646*8975f5c5SAndroid Build Coastguard Worker         setDrawFramebufferDirty();
2647*8975f5c5SAndroid Build Coastguard Worker     }
2648*8975f5c5SAndroid Build Coastguard Worker }
2649*8975f5c5SAndroid Build Coastguard Worker 
initializeZeroTextures(const Context * context,const TextureMap & zeroTextures)2650*8975f5c5SAndroid Build Coastguard Worker void State::initializeZeroTextures(const Context *context, const TextureMap &zeroTextures)
2651*8975f5c5SAndroid Build Coastguard Worker {
2652*8975f5c5SAndroid Build Coastguard Worker     for (TextureType type : angle::AllEnums<TextureType>())
2653*8975f5c5SAndroid Build Coastguard Worker     {
2654*8975f5c5SAndroid Build Coastguard Worker         for (size_t textureUnit = 0; textureUnit < mSamplerTextures[type].size(); ++textureUnit)
2655*8975f5c5SAndroid Build Coastguard Worker         {
2656*8975f5c5SAndroid Build Coastguard Worker             mSamplerTextures[type][textureUnit].set(context, zeroTextures[type].get());
2657*8975f5c5SAndroid Build Coastguard Worker         }
2658*8975f5c5SAndroid Build Coastguard Worker     }
2659*8975f5c5SAndroid Build Coastguard Worker }
2660*8975f5c5SAndroid Build Coastguard Worker 
invalidateTextureBindings(TextureType type)2661*8975f5c5SAndroid Build Coastguard Worker void State::invalidateTextureBindings(TextureType type)
2662*8975f5c5SAndroid Build Coastguard Worker {
2663*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_TEXTURE_BINDINGS);
2664*8975f5c5SAndroid Build Coastguard Worker }
2665*8975f5c5SAndroid Build Coastguard Worker 
setSamplerBinding(const Context * context,GLuint textureUnit,Sampler * sampler)2666*8975f5c5SAndroid Build Coastguard Worker void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sampler *sampler)
2667*8975f5c5SAndroid Build Coastguard Worker {
2668*8975f5c5SAndroid Build Coastguard Worker     if (mSamplers[textureUnit].get() == sampler)
2669*8975f5c5SAndroid Build Coastguard Worker     {
2670*8975f5c5SAndroid Build Coastguard Worker         return;
2671*8975f5c5SAndroid Build Coastguard Worker     }
2672*8975f5c5SAndroid Build Coastguard Worker 
2673*8975f5c5SAndroid Build Coastguard Worker     mSamplers[textureUnit].set(context, sampler);
2674*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_SAMPLER_BINDINGS);
2675*8975f5c5SAndroid Build Coastguard Worker     // This is overly conservative as it assumes the sampler has never been bound.
2676*8975f5c5SAndroid Build Coastguard Worker     setSamplerDirty(textureUnit);
2677*8975f5c5SAndroid Build Coastguard Worker     onActiveTextureChange(context, textureUnit);
2678*8975f5c5SAndroid Build Coastguard Worker }
2679*8975f5c5SAndroid Build Coastguard Worker 
detachSampler(const Context * context,SamplerID sampler)2680*8975f5c5SAndroid Build Coastguard Worker void State::detachSampler(const Context *context, SamplerID sampler)
2681*8975f5c5SAndroid Build Coastguard Worker {
2682*8975f5c5SAndroid Build Coastguard Worker     // [OpenGL ES 3.0.2] section 3.8.2 pages 123-124:
2683*8975f5c5SAndroid Build Coastguard Worker     // If a sampler object that is currently bound to one or more texture units is
2684*8975f5c5SAndroid Build Coastguard Worker     // deleted, it is as though BindSampler is called once for each texture unit to
2685*8975f5c5SAndroid Build Coastguard Worker     // which the sampler is bound, with unit set to the texture unit and sampler set to zero.
2686*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < mSamplers.size(); i++)
2687*8975f5c5SAndroid Build Coastguard Worker     {
2688*8975f5c5SAndroid Build Coastguard Worker         if (mSamplers[i].id() == sampler)
2689*8975f5c5SAndroid Build Coastguard Worker         {
2690*8975f5c5SAndroid Build Coastguard Worker             setSamplerBinding(context, static_cast<GLuint>(i), nullptr);
2691*8975f5c5SAndroid Build Coastguard Worker         }
2692*8975f5c5SAndroid Build Coastguard Worker     }
2693*8975f5c5SAndroid Build Coastguard Worker }
2694*8975f5c5SAndroid Build Coastguard Worker 
setRenderbufferBinding(const Context * context,Renderbuffer * renderbuffer)2695*8975f5c5SAndroid Build Coastguard Worker void State::setRenderbufferBinding(const Context *context, Renderbuffer *renderbuffer)
2696*8975f5c5SAndroid Build Coastguard Worker {
2697*8975f5c5SAndroid Build Coastguard Worker     mRenderbuffer.set(context, renderbuffer);
2698*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_RENDERBUFFER_BINDING);
2699*8975f5c5SAndroid Build Coastguard Worker }
2700*8975f5c5SAndroid Build Coastguard Worker 
detachRenderbuffer(Context * context,RenderbufferID renderbuffer)2701*8975f5c5SAndroid Build Coastguard Worker void State::detachRenderbuffer(Context *context, RenderbufferID renderbuffer)
2702*8975f5c5SAndroid Build Coastguard Worker {
2703*8975f5c5SAndroid Build Coastguard Worker     // [OpenGL ES 2.0.24] section 4.4 page 109:
2704*8975f5c5SAndroid Build Coastguard Worker     // If a renderbuffer that is currently bound to RENDERBUFFER is deleted, it is as though
2705*8975f5c5SAndroid Build Coastguard Worker     // BindRenderbuffer had been executed with the target RENDERBUFFER and name of zero.
2706*8975f5c5SAndroid Build Coastguard Worker 
2707*8975f5c5SAndroid Build Coastguard Worker     if (mRenderbuffer.id() == renderbuffer)
2708*8975f5c5SAndroid Build Coastguard Worker     {
2709*8975f5c5SAndroid Build Coastguard Worker         setRenderbufferBinding(context, nullptr);
2710*8975f5c5SAndroid Build Coastguard Worker     }
2711*8975f5c5SAndroid Build Coastguard Worker 
2712*8975f5c5SAndroid Build Coastguard Worker     // [OpenGL ES 2.0.24] section 4.4 page 111:
2713*8975f5c5SAndroid Build Coastguard Worker     // If a renderbuffer object is deleted while its image is attached to the currently bound
2714*8975f5c5SAndroid Build Coastguard Worker     // framebuffer, then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of
2715*8975f5c5SAndroid Build Coastguard Worker     // 0, for each attachment point to which this image was attached in the currently bound
2716*8975f5c5SAndroid Build Coastguard Worker     // framebuffer.
2717*8975f5c5SAndroid Build Coastguard Worker 
2718*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *readFramebuffer = mReadFramebuffer;
2719*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *drawFramebuffer = mDrawFramebuffer;
2720*8975f5c5SAndroid Build Coastguard Worker 
2721*8975f5c5SAndroid Build Coastguard Worker     if (readFramebuffer && readFramebuffer->detachRenderbuffer(context, renderbuffer))
2722*8975f5c5SAndroid Build Coastguard Worker     {
2723*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_READ_FRAMEBUFFER);
2724*8975f5c5SAndroid Build Coastguard Worker     }
2725*8975f5c5SAndroid Build Coastguard Worker 
2726*8975f5c5SAndroid Build Coastguard Worker     if (drawFramebuffer && drawFramebuffer != readFramebuffer)
2727*8975f5c5SAndroid Build Coastguard Worker     {
2728*8975f5c5SAndroid Build Coastguard Worker         if (drawFramebuffer->detachRenderbuffer(context, renderbuffer))
2729*8975f5c5SAndroid Build Coastguard Worker         {
2730*8975f5c5SAndroid Build Coastguard Worker             setDrawFramebufferDirty();
2731*8975f5c5SAndroid Build Coastguard Worker         }
2732*8975f5c5SAndroid Build Coastguard Worker     }
2733*8975f5c5SAndroid Build Coastguard Worker }
2734*8975f5c5SAndroid Build Coastguard Worker 
setReadFramebufferBinding(Framebuffer * framebuffer)2735*8975f5c5SAndroid Build Coastguard Worker void State::setReadFramebufferBinding(Framebuffer *framebuffer)
2736*8975f5c5SAndroid Build Coastguard Worker {
2737*8975f5c5SAndroid Build Coastguard Worker     if (mReadFramebuffer == framebuffer)
2738*8975f5c5SAndroid Build Coastguard Worker         return;
2739*8975f5c5SAndroid Build Coastguard Worker 
2740*8975f5c5SAndroid Build Coastguard Worker     mReadFramebuffer = framebuffer;
2741*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
2742*8975f5c5SAndroid Build Coastguard Worker 
2743*8975f5c5SAndroid Build Coastguard Worker     if (mReadFramebuffer && mReadFramebuffer->hasAnyDirtyBit())
2744*8975f5c5SAndroid Build Coastguard Worker     {
2745*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_READ_FRAMEBUFFER);
2746*8975f5c5SAndroid Build Coastguard Worker     }
2747*8975f5c5SAndroid Build Coastguard Worker }
2748*8975f5c5SAndroid Build Coastguard Worker 
setDrawFramebufferBinding(Framebuffer * framebuffer)2749*8975f5c5SAndroid Build Coastguard Worker void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
2750*8975f5c5SAndroid Build Coastguard Worker {
2751*8975f5c5SAndroid Build Coastguard Worker     if (mDrawFramebuffer == framebuffer)
2752*8975f5c5SAndroid Build Coastguard Worker         return;
2753*8975f5c5SAndroid Build Coastguard Worker 
2754*8975f5c5SAndroid Build Coastguard Worker     mDrawFramebuffer = framebuffer;
2755*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
2756*8975f5c5SAndroid Build Coastguard Worker 
2757*8975f5c5SAndroid Build Coastguard Worker     if (mDrawFramebuffer)
2758*8975f5c5SAndroid Build Coastguard Worker     {
2759*8975f5c5SAndroid Build Coastguard Worker         mDrawFramebuffer->setWriteControlMode(getFramebufferSRGB() ? SrgbWriteControlMode::Default
2760*8975f5c5SAndroid Build Coastguard Worker                                                                    : SrgbWriteControlMode::Linear);
2761*8975f5c5SAndroid Build Coastguard Worker 
2762*8975f5c5SAndroid Build Coastguard Worker         if (mDrawFramebuffer->hasAnyDirtyBit())
2763*8975f5c5SAndroid Build Coastguard Worker         {
2764*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
2765*8975f5c5SAndroid Build Coastguard Worker         }
2766*8975f5c5SAndroid Build Coastguard Worker 
2767*8975f5c5SAndroid Build Coastguard Worker         if (isRobustResourceInitEnabled() && mDrawFramebuffer->hasResourceThatNeedsInit())
2768*8975f5c5SAndroid Build Coastguard Worker         {
2769*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_DRAW_ATTACHMENTS);
2770*8975f5c5SAndroid Build Coastguard Worker         }
2771*8975f5c5SAndroid Build Coastguard Worker     }
2772*8975f5c5SAndroid Build Coastguard Worker }
2773*8975f5c5SAndroid Build Coastguard Worker 
getTargetFramebuffer(GLenum target) const2774*8975f5c5SAndroid Build Coastguard Worker Framebuffer *State::getTargetFramebuffer(GLenum target) const
2775*8975f5c5SAndroid Build Coastguard Worker {
2776*8975f5c5SAndroid Build Coastguard Worker     switch (target)
2777*8975f5c5SAndroid Build Coastguard Worker     {
2778*8975f5c5SAndroid Build Coastguard Worker         case GL_READ_FRAMEBUFFER_ANGLE:
2779*8975f5c5SAndroid Build Coastguard Worker             return mReadFramebuffer;
2780*8975f5c5SAndroid Build Coastguard Worker         case GL_DRAW_FRAMEBUFFER_ANGLE:
2781*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAMEBUFFER:
2782*8975f5c5SAndroid Build Coastguard Worker             return mDrawFramebuffer;
2783*8975f5c5SAndroid Build Coastguard Worker         default:
2784*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
2785*8975f5c5SAndroid Build Coastguard Worker             return nullptr;
2786*8975f5c5SAndroid Build Coastguard Worker     }
2787*8975f5c5SAndroid Build Coastguard Worker }
2788*8975f5c5SAndroid Build Coastguard Worker 
getDefaultFramebuffer() const2789*8975f5c5SAndroid Build Coastguard Worker Framebuffer *State::getDefaultFramebuffer() const
2790*8975f5c5SAndroid Build Coastguard Worker {
2791*8975f5c5SAndroid Build Coastguard Worker     return mFramebufferManager->getDefaultFramebuffer();
2792*8975f5c5SAndroid Build Coastguard Worker }
2793*8975f5c5SAndroid Build Coastguard Worker 
removeReadFramebufferBinding(FramebufferID framebuffer)2794*8975f5c5SAndroid Build Coastguard Worker bool State::removeReadFramebufferBinding(FramebufferID framebuffer)
2795*8975f5c5SAndroid Build Coastguard Worker {
2796*8975f5c5SAndroid Build Coastguard Worker     if (mReadFramebuffer != nullptr && mReadFramebuffer->id() == framebuffer)
2797*8975f5c5SAndroid Build Coastguard Worker     {
2798*8975f5c5SAndroid Build Coastguard Worker         setReadFramebufferBinding(nullptr);
2799*8975f5c5SAndroid Build Coastguard Worker         return true;
2800*8975f5c5SAndroid Build Coastguard Worker     }
2801*8975f5c5SAndroid Build Coastguard Worker 
2802*8975f5c5SAndroid Build Coastguard Worker     return false;
2803*8975f5c5SAndroid Build Coastguard Worker }
2804*8975f5c5SAndroid Build Coastguard Worker 
removeDrawFramebufferBinding(FramebufferID framebuffer)2805*8975f5c5SAndroid Build Coastguard Worker bool State::removeDrawFramebufferBinding(FramebufferID framebuffer)
2806*8975f5c5SAndroid Build Coastguard Worker {
2807*8975f5c5SAndroid Build Coastguard Worker     if (mReadFramebuffer != nullptr && mDrawFramebuffer->id() == framebuffer)
2808*8975f5c5SAndroid Build Coastguard Worker     {
2809*8975f5c5SAndroid Build Coastguard Worker         setDrawFramebufferBinding(nullptr);
2810*8975f5c5SAndroid Build Coastguard Worker         return true;
2811*8975f5c5SAndroid Build Coastguard Worker     }
2812*8975f5c5SAndroid Build Coastguard Worker 
2813*8975f5c5SAndroid Build Coastguard Worker     return false;
2814*8975f5c5SAndroid Build Coastguard Worker }
2815*8975f5c5SAndroid Build Coastguard Worker 
setVertexArrayBinding(const Context * context,VertexArray * vertexArray)2816*8975f5c5SAndroid Build Coastguard Worker void State::setVertexArrayBinding(const Context *context, VertexArray *vertexArray)
2817*8975f5c5SAndroid Build Coastguard Worker {
2818*8975f5c5SAndroid Build Coastguard Worker     if (mVertexArray == vertexArray)
2819*8975f5c5SAndroid Build Coastguard Worker     {
2820*8975f5c5SAndroid Build Coastguard Worker         return;
2821*8975f5c5SAndroid Build Coastguard Worker     }
2822*8975f5c5SAndroid Build Coastguard Worker 
2823*8975f5c5SAndroid Build Coastguard Worker     if (mVertexArray)
2824*8975f5c5SAndroid Build Coastguard Worker     {
2825*8975f5c5SAndroid Build Coastguard Worker         mVertexArray->onBindingChanged(context, -1);
2826*8975f5c5SAndroid Build Coastguard Worker     }
2827*8975f5c5SAndroid Build Coastguard Worker     if (vertexArray)
2828*8975f5c5SAndroid Build Coastguard Worker     {
2829*8975f5c5SAndroid Build Coastguard Worker         vertexArray->onBindingChanged(context, 1);
2830*8975f5c5SAndroid Build Coastguard Worker     }
2831*8975f5c5SAndroid Build Coastguard Worker 
2832*8975f5c5SAndroid Build Coastguard Worker     mVertexArray = vertexArray;
2833*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_VERTEX_ARRAY_BINDING);
2834*8975f5c5SAndroid Build Coastguard Worker 
2835*8975f5c5SAndroid Build Coastguard Worker     if (mVertexArray && mVertexArray->hasAnyDirtyBit())
2836*8975f5c5SAndroid Build Coastguard Worker     {
2837*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
2838*8975f5c5SAndroid Build Coastguard Worker     }
2839*8975f5c5SAndroid Build Coastguard Worker }
2840*8975f5c5SAndroid Build Coastguard Worker 
removeVertexArrayBinding(const Context * context,VertexArrayID vertexArray)2841*8975f5c5SAndroid Build Coastguard Worker bool State::removeVertexArrayBinding(const Context *context, VertexArrayID vertexArray)
2842*8975f5c5SAndroid Build Coastguard Worker {
2843*8975f5c5SAndroid Build Coastguard Worker     if (mVertexArray && mVertexArray->id().value == vertexArray.value)
2844*8975f5c5SAndroid Build Coastguard Worker     {
2845*8975f5c5SAndroid Build Coastguard Worker         mVertexArray->onBindingChanged(context, -1);
2846*8975f5c5SAndroid Build Coastguard Worker         mVertexArray = nullptr;
2847*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_VERTEX_ARRAY_BINDING);
2848*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
2849*8975f5c5SAndroid Build Coastguard Worker         return true;
2850*8975f5c5SAndroid Build Coastguard Worker     }
2851*8975f5c5SAndroid Build Coastguard Worker 
2852*8975f5c5SAndroid Build Coastguard Worker     return false;
2853*8975f5c5SAndroid Build Coastguard Worker }
2854*8975f5c5SAndroid Build Coastguard Worker 
getVertexArrayId() const2855*8975f5c5SAndroid Build Coastguard Worker VertexArrayID State::getVertexArrayId() const
2856*8975f5c5SAndroid Build Coastguard Worker {
2857*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mVertexArray != nullptr);
2858*8975f5c5SAndroid Build Coastguard Worker     return mVertexArray->id();
2859*8975f5c5SAndroid Build Coastguard Worker }
2860*8975f5c5SAndroid Build Coastguard Worker 
bindVertexBuffer(const Context * context,GLuint bindingIndex,Buffer * boundBuffer,GLintptr offset,GLsizei stride)2861*8975f5c5SAndroid Build Coastguard Worker void State::bindVertexBuffer(const Context *context,
2862*8975f5c5SAndroid Build Coastguard Worker                              GLuint bindingIndex,
2863*8975f5c5SAndroid Build Coastguard Worker                              Buffer *boundBuffer,
2864*8975f5c5SAndroid Build Coastguard Worker                              GLintptr offset,
2865*8975f5c5SAndroid Build Coastguard Worker                              GLsizei stride)
2866*8975f5c5SAndroid Build Coastguard Worker {
2867*8975f5c5SAndroid Build Coastguard Worker     getVertexArray()->bindVertexBuffer(context, bindingIndex, boundBuffer, offset, stride);
2868*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
2869*8975f5c5SAndroid Build Coastguard Worker }
2870*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribFormat(GLuint attribIndex,GLint size,VertexAttribType type,bool normalized,bool pureInteger,GLuint relativeOffset)2871*8975f5c5SAndroid Build Coastguard Worker void State::setVertexAttribFormat(GLuint attribIndex,
2872*8975f5c5SAndroid Build Coastguard Worker                                   GLint size,
2873*8975f5c5SAndroid Build Coastguard Worker                                   VertexAttribType type,
2874*8975f5c5SAndroid Build Coastguard Worker                                   bool normalized,
2875*8975f5c5SAndroid Build Coastguard Worker                                   bool pureInteger,
2876*8975f5c5SAndroid Build Coastguard Worker                                   GLuint relativeOffset)
2877*8975f5c5SAndroid Build Coastguard Worker {
2878*8975f5c5SAndroid Build Coastguard Worker     getVertexArray()->setVertexAttribFormat(attribIndex, size, type, normalized, pureInteger,
2879*8975f5c5SAndroid Build Coastguard Worker                                             relativeOffset);
2880*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
2881*8975f5c5SAndroid Build Coastguard Worker }
2882*8975f5c5SAndroid Build Coastguard Worker 
setVertexBindingDivisor(const Context * context,GLuint bindingIndex,GLuint divisor)2883*8975f5c5SAndroid Build Coastguard Worker void State::setVertexBindingDivisor(const Context *context, GLuint bindingIndex, GLuint divisor)
2884*8975f5c5SAndroid Build Coastguard Worker {
2885*8975f5c5SAndroid Build Coastguard Worker     getVertexArray()->setVertexBindingDivisor(context, bindingIndex, divisor);
2886*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
2887*8975f5c5SAndroid Build Coastguard Worker }
2888*8975f5c5SAndroid Build Coastguard Worker 
setProgram(const Context * context,Program * newProgram)2889*8975f5c5SAndroid Build Coastguard Worker angle::Result State::setProgram(const Context *context, Program *newProgram)
2890*8975f5c5SAndroid Build Coastguard Worker {
2891*8975f5c5SAndroid Build Coastguard Worker     if (newProgram && !newProgram->isLinked())
2892*8975f5c5SAndroid Build Coastguard Worker     {
2893*8975f5c5SAndroid Build Coastguard Worker         // Protect against applications that disable validation and try to use a program that was
2894*8975f5c5SAndroid Build Coastguard Worker         // not successfully linked.
2895*8975f5c5SAndroid Build Coastguard Worker         WARN() << "Attempted to use a program that was not successfully linked";
2896*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
2897*8975f5c5SAndroid Build Coastguard Worker     }
2898*8975f5c5SAndroid Build Coastguard Worker 
2899*8975f5c5SAndroid Build Coastguard Worker     if (mProgram != newProgram)
2900*8975f5c5SAndroid Build Coastguard Worker     {
2901*8975f5c5SAndroid Build Coastguard Worker         if (mProgram)
2902*8975f5c5SAndroid Build Coastguard Worker         {
2903*8975f5c5SAndroid Build Coastguard Worker             unsetActiveTextures(mExecutable->getActiveSamplersMask());
2904*8975f5c5SAndroid Build Coastguard Worker             mProgram->release(context);
2905*8975f5c5SAndroid Build Coastguard Worker         }
2906*8975f5c5SAndroid Build Coastguard Worker 
2907*8975f5c5SAndroid Build Coastguard Worker         mProgram = newProgram;
2908*8975f5c5SAndroid Build Coastguard Worker 
2909*8975f5c5SAndroid Build Coastguard Worker         if (mProgram)
2910*8975f5c5SAndroid Build Coastguard Worker         {
2911*8975f5c5SAndroid Build Coastguard Worker             newProgram->addRef();
2912*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(installProgramExecutable(context));
2913*8975f5c5SAndroid Build Coastguard Worker         }
2914*8975f5c5SAndroid Build Coastguard Worker         else if (mProgramPipeline.get() == nullptr)
2915*8975f5c5SAndroid Build Coastguard Worker         {
2916*8975f5c5SAndroid Build Coastguard Worker             UninstallExecutable(context, &mExecutable);
2917*8975f5c5SAndroid Build Coastguard Worker         }
2918*8975f5c5SAndroid Build Coastguard Worker         else if (mProgramPipeline->isLinked())
2919*8975f5c5SAndroid Build Coastguard Worker         {
2920*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(installProgramPipelineExecutableIfNotAlready(context));
2921*8975f5c5SAndroid Build Coastguard Worker         }
2922*8975f5c5SAndroid Build Coastguard Worker 
2923*8975f5c5SAndroid Build Coastguard Worker         // Note that rendering is undefined if glUseProgram(0) is called. But ANGLE will generate
2924*8975f5c5SAndroid Build Coastguard Worker         // an error if the app tries to draw in this case.
2925*8975f5c5SAndroid Build Coastguard Worker 
2926*8975f5c5SAndroid Build Coastguard Worker         mDirtyBits.set(state::DIRTY_BIT_PROGRAM_BINDING);
2927*8975f5c5SAndroid Build Coastguard Worker     }
2928*8975f5c5SAndroid Build Coastguard Worker 
2929*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
2930*8975f5c5SAndroid Build Coastguard Worker }
2931*8975f5c5SAndroid Build Coastguard Worker 
setTransformFeedbackBinding(const Context * context,TransformFeedback * transformFeedback)2932*8975f5c5SAndroid Build Coastguard Worker void State::setTransformFeedbackBinding(const Context *context,
2933*8975f5c5SAndroid Build Coastguard Worker                                         TransformFeedback *transformFeedback)
2934*8975f5c5SAndroid Build Coastguard Worker {
2935*8975f5c5SAndroid Build Coastguard Worker     if (transformFeedback == mTransformFeedback.get())
2936*8975f5c5SAndroid Build Coastguard Worker         return;
2937*8975f5c5SAndroid Build Coastguard Worker     if (mTransformFeedback.get())
2938*8975f5c5SAndroid Build Coastguard Worker         mTransformFeedback->onBindingChanged(context, false);
2939*8975f5c5SAndroid Build Coastguard Worker     mTransformFeedback.set(context, transformFeedback);
2940*8975f5c5SAndroid Build Coastguard Worker     if (mTransformFeedback.get())
2941*8975f5c5SAndroid Build Coastguard Worker         mTransformFeedback->onBindingChanged(context, true);
2942*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
2943*8975f5c5SAndroid Build Coastguard Worker }
2944*8975f5c5SAndroid Build Coastguard Worker 
removeTransformFeedbackBinding(const Context * context,TransformFeedbackID transformFeedback)2945*8975f5c5SAndroid Build Coastguard Worker bool State::removeTransformFeedbackBinding(const Context *context,
2946*8975f5c5SAndroid Build Coastguard Worker                                            TransformFeedbackID transformFeedback)
2947*8975f5c5SAndroid Build Coastguard Worker {
2948*8975f5c5SAndroid Build Coastguard Worker     if (mTransformFeedback.id() == transformFeedback)
2949*8975f5c5SAndroid Build Coastguard Worker     {
2950*8975f5c5SAndroid Build Coastguard Worker         if (mTransformFeedback.get())
2951*8975f5c5SAndroid Build Coastguard Worker             mTransformFeedback->onBindingChanged(context, false);
2952*8975f5c5SAndroid Build Coastguard Worker         mTransformFeedback.set(context, nullptr);
2953*8975f5c5SAndroid Build Coastguard Worker         return true;
2954*8975f5c5SAndroid Build Coastguard Worker     }
2955*8975f5c5SAndroid Build Coastguard Worker 
2956*8975f5c5SAndroid Build Coastguard Worker     return false;
2957*8975f5c5SAndroid Build Coastguard Worker }
2958*8975f5c5SAndroid Build Coastguard Worker 
setProgramPipelineBinding(const Context * context,ProgramPipeline * pipeline)2959*8975f5c5SAndroid Build Coastguard Worker angle::Result State::setProgramPipelineBinding(const Context *context, ProgramPipeline *pipeline)
2960*8975f5c5SAndroid Build Coastguard Worker {
2961*8975f5c5SAndroid Build Coastguard Worker     if (mProgramPipeline.get() == pipeline)
2962*8975f5c5SAndroid Build Coastguard Worker     {
2963*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
2964*8975f5c5SAndroid Build Coastguard Worker     }
2965*8975f5c5SAndroid Build Coastguard Worker 
2966*8975f5c5SAndroid Build Coastguard Worker     if (mProgramPipeline.get())
2967*8975f5c5SAndroid Build Coastguard Worker     {
2968*8975f5c5SAndroid Build Coastguard Worker         unsetActiveTextures(mProgramPipeline->getExecutable().getActiveSamplersMask());
2969*8975f5c5SAndroid Build Coastguard Worker     }
2970*8975f5c5SAndroid Build Coastguard Worker 
2971*8975f5c5SAndroid Build Coastguard Worker     mProgramPipeline.set(context, pipeline);
2972*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PROGRAM_BINDING);
2973*8975f5c5SAndroid Build Coastguard Worker 
2974*8975f5c5SAndroid Build Coastguard Worker     // A bound Program always overrides the ProgramPipeline, so only update the
2975*8975f5c5SAndroid Build Coastguard Worker     // current ProgramExecutable if there isn't currently a Program bound.
2976*8975f5c5SAndroid Build Coastguard Worker     if (!mProgram)
2977*8975f5c5SAndroid Build Coastguard Worker     {
2978*8975f5c5SAndroid Build Coastguard Worker         if (mProgramPipeline.get() && mProgramPipeline->isLinked())
2979*8975f5c5SAndroid Build Coastguard Worker         {
2980*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(installProgramPipelineExecutableIfNotAlready(context));
2981*8975f5c5SAndroid Build Coastguard Worker         }
2982*8975f5c5SAndroid Build Coastguard Worker     }
2983*8975f5c5SAndroid Build Coastguard Worker 
2984*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
2985*8975f5c5SAndroid Build Coastguard Worker }
2986*8975f5c5SAndroid Build Coastguard Worker 
detachProgramPipeline(const Context * context,ProgramPipelineID pipeline)2987*8975f5c5SAndroid Build Coastguard Worker void State::detachProgramPipeline(const Context *context, ProgramPipelineID pipeline)
2988*8975f5c5SAndroid Build Coastguard Worker {
2989*8975f5c5SAndroid Build Coastguard Worker     mProgramPipeline.set(context, nullptr);
2990*8975f5c5SAndroid Build Coastguard Worker 
2991*8975f5c5SAndroid Build Coastguard Worker     // A bound Program always overrides the ProgramPipeline, so only update the
2992*8975f5c5SAndroid Build Coastguard Worker     // current ProgramExecutable if there isn't currently a Program bound.
2993*8975f5c5SAndroid Build Coastguard Worker     if (!mProgram)
2994*8975f5c5SAndroid Build Coastguard Worker     {
2995*8975f5c5SAndroid Build Coastguard Worker         UninstallExecutable(context, &mExecutable);
2996*8975f5c5SAndroid Build Coastguard Worker     }
2997*8975f5c5SAndroid Build Coastguard Worker }
2998*8975f5c5SAndroid Build Coastguard Worker 
isQueryActive(QueryType type) const2999*8975f5c5SAndroid Build Coastguard Worker bool State::isQueryActive(QueryType type) const
3000*8975f5c5SAndroid Build Coastguard Worker {
3001*8975f5c5SAndroid Build Coastguard Worker     const Query *query = mActiveQueries[type].get();
3002*8975f5c5SAndroid Build Coastguard Worker     if (query != nullptr)
3003*8975f5c5SAndroid Build Coastguard Worker     {
3004*8975f5c5SAndroid Build Coastguard Worker         return true;
3005*8975f5c5SAndroid Build Coastguard Worker     }
3006*8975f5c5SAndroid Build Coastguard Worker 
3007*8975f5c5SAndroid Build Coastguard Worker     QueryType alternativeType;
3008*8975f5c5SAndroid Build Coastguard Worker     if (GetAlternativeQueryType(type, &alternativeType))
3009*8975f5c5SAndroid Build Coastguard Worker     {
3010*8975f5c5SAndroid Build Coastguard Worker         query = mActiveQueries[alternativeType].get();
3011*8975f5c5SAndroid Build Coastguard Worker         return query != nullptr;
3012*8975f5c5SAndroid Build Coastguard Worker     }
3013*8975f5c5SAndroid Build Coastguard Worker 
3014*8975f5c5SAndroid Build Coastguard Worker     return false;
3015*8975f5c5SAndroid Build Coastguard Worker }
3016*8975f5c5SAndroid Build Coastguard Worker 
isQueryActive(Query * query) const3017*8975f5c5SAndroid Build Coastguard Worker bool State::isQueryActive(Query *query) const
3018*8975f5c5SAndroid Build Coastguard Worker {
3019*8975f5c5SAndroid Build Coastguard Worker     for (auto &queryPointer : mActiveQueries)
3020*8975f5c5SAndroid Build Coastguard Worker     {
3021*8975f5c5SAndroid Build Coastguard Worker         if (queryPointer.get() == query)
3022*8975f5c5SAndroid Build Coastguard Worker         {
3023*8975f5c5SAndroid Build Coastguard Worker             return true;
3024*8975f5c5SAndroid Build Coastguard Worker         }
3025*8975f5c5SAndroid Build Coastguard Worker     }
3026*8975f5c5SAndroid Build Coastguard Worker 
3027*8975f5c5SAndroid Build Coastguard Worker     return false;
3028*8975f5c5SAndroid Build Coastguard Worker }
3029*8975f5c5SAndroid Build Coastguard Worker 
setActiveQuery(const Context * context,QueryType type,Query * query)3030*8975f5c5SAndroid Build Coastguard Worker void State::setActiveQuery(const Context *context, QueryType type, Query *query)
3031*8975f5c5SAndroid Build Coastguard Worker {
3032*8975f5c5SAndroid Build Coastguard Worker     mActiveQueries[type].set(context, query);
3033*8975f5c5SAndroid Build Coastguard Worker }
3034*8975f5c5SAndroid Build Coastguard Worker 
getActiveQueryId(QueryType type) const3035*8975f5c5SAndroid Build Coastguard Worker QueryID State::getActiveQueryId(QueryType type) const
3036*8975f5c5SAndroid Build Coastguard Worker {
3037*8975f5c5SAndroid Build Coastguard Worker     const Query *query = getActiveQuery(type);
3038*8975f5c5SAndroid Build Coastguard Worker     if (query)
3039*8975f5c5SAndroid Build Coastguard Worker     {
3040*8975f5c5SAndroid Build Coastguard Worker         return query->id();
3041*8975f5c5SAndroid Build Coastguard Worker     }
3042*8975f5c5SAndroid Build Coastguard Worker     return {0};
3043*8975f5c5SAndroid Build Coastguard Worker }
3044*8975f5c5SAndroid Build Coastguard Worker 
getActiveQuery(QueryType type) const3045*8975f5c5SAndroid Build Coastguard Worker Query *State::getActiveQuery(QueryType type) const
3046*8975f5c5SAndroid Build Coastguard Worker {
3047*8975f5c5SAndroid Build Coastguard Worker     return mActiveQueries[type].get();
3048*8975f5c5SAndroid Build Coastguard Worker }
3049*8975f5c5SAndroid Build Coastguard Worker 
setIndexedBufferBinding(const Context * context,BufferBinding target,GLuint index,Buffer * buffer,GLintptr offset,GLsizeiptr size)3050*8975f5c5SAndroid Build Coastguard Worker angle::Result State::setIndexedBufferBinding(const Context *context,
3051*8975f5c5SAndroid Build Coastguard Worker                                              BufferBinding target,
3052*8975f5c5SAndroid Build Coastguard Worker                                              GLuint index,
3053*8975f5c5SAndroid Build Coastguard Worker                                              Buffer *buffer,
3054*8975f5c5SAndroid Build Coastguard Worker                                              GLintptr offset,
3055*8975f5c5SAndroid Build Coastguard Worker                                              GLsizeiptr size)
3056*8975f5c5SAndroid Build Coastguard Worker {
3057*8975f5c5SAndroid Build Coastguard Worker     setBufferBinding(context, target, buffer);
3058*8975f5c5SAndroid Build Coastguard Worker 
3059*8975f5c5SAndroid Build Coastguard Worker     switch (target)
3060*8975f5c5SAndroid Build Coastguard Worker     {
3061*8975f5c5SAndroid Build Coastguard Worker         case BufferBinding::TransformFeedback:
3062*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(mTransformFeedback->bindIndexedBuffer(context, index, buffer, offset, size));
3063*8975f5c5SAndroid Build Coastguard Worker             setBufferBinding(context, target, buffer);
3064*8975f5c5SAndroid Build Coastguard Worker             break;
3065*8975f5c5SAndroid Build Coastguard Worker         case BufferBinding::Uniform:
3066*8975f5c5SAndroid Build Coastguard Worker             mBoundUniformBuffersMask.set(index, buffer != nullptr);
3067*8975f5c5SAndroid Build Coastguard Worker             UpdateIndexedBufferBinding(context, &mUniformBuffers[index], buffer, target, offset,
3068*8975f5c5SAndroid Build Coastguard Worker                                        size);
3069*8975f5c5SAndroid Build Coastguard Worker             onUniformBufferStateChange(index);
3070*8975f5c5SAndroid Build Coastguard Worker             break;
3071*8975f5c5SAndroid Build Coastguard Worker         case BufferBinding::AtomicCounter:
3072*8975f5c5SAndroid Build Coastguard Worker             mBoundAtomicCounterBuffersMask.set(index, buffer != nullptr);
3073*8975f5c5SAndroid Build Coastguard Worker             UpdateIndexedBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target,
3074*8975f5c5SAndroid Build Coastguard Worker                                        offset, size);
3075*8975f5c5SAndroid Build Coastguard Worker             break;
3076*8975f5c5SAndroid Build Coastguard Worker         case BufferBinding::ShaderStorage:
3077*8975f5c5SAndroid Build Coastguard Worker             mBoundShaderStorageBuffersMask.set(index, buffer != nullptr);
3078*8975f5c5SAndroid Build Coastguard Worker             UpdateIndexedBufferBinding(context, &mShaderStorageBuffers[index], buffer, target,
3079*8975f5c5SAndroid Build Coastguard Worker                                        offset, size);
3080*8975f5c5SAndroid Build Coastguard Worker             break;
3081*8975f5c5SAndroid Build Coastguard Worker         default:
3082*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
3083*8975f5c5SAndroid Build Coastguard Worker             break;
3084*8975f5c5SAndroid Build Coastguard Worker     }
3085*8975f5c5SAndroid Build Coastguard Worker 
3086*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3087*8975f5c5SAndroid Build Coastguard Worker }
3088*8975f5c5SAndroid Build Coastguard Worker 
getIndexedUniformBuffer(size_t index) const3089*8975f5c5SAndroid Build Coastguard Worker const OffsetBindingPointer<Buffer> &State::getIndexedUniformBuffer(size_t index) const
3090*8975f5c5SAndroid Build Coastguard Worker {
3091*8975f5c5SAndroid Build Coastguard Worker     ASSERT(index < mUniformBuffers.size());
3092*8975f5c5SAndroid Build Coastguard Worker     return mUniformBuffers[index];
3093*8975f5c5SAndroid Build Coastguard Worker }
3094*8975f5c5SAndroid Build Coastguard Worker 
getIndexedAtomicCounterBuffer(size_t index) const3095*8975f5c5SAndroid Build Coastguard Worker const OffsetBindingPointer<Buffer> &State::getIndexedAtomicCounterBuffer(size_t index) const
3096*8975f5c5SAndroid Build Coastguard Worker {
3097*8975f5c5SAndroid Build Coastguard Worker     ASSERT(index < mAtomicCounterBuffers.size());
3098*8975f5c5SAndroid Build Coastguard Worker     return mAtomicCounterBuffers[index];
3099*8975f5c5SAndroid Build Coastguard Worker }
3100*8975f5c5SAndroid Build Coastguard Worker 
getIndexedShaderStorageBuffer(size_t index) const3101*8975f5c5SAndroid Build Coastguard Worker const OffsetBindingPointer<Buffer> &State::getIndexedShaderStorageBuffer(size_t index) const
3102*8975f5c5SAndroid Build Coastguard Worker {
3103*8975f5c5SAndroid Build Coastguard Worker     ASSERT(index < mShaderStorageBuffers.size());
3104*8975f5c5SAndroid Build Coastguard Worker     return mShaderStorageBuffers[index];
3105*8975f5c5SAndroid Build Coastguard Worker }
3106*8975f5c5SAndroid Build Coastguard Worker 
detachBuffer(Context * context,const Buffer * buffer)3107*8975f5c5SAndroid Build Coastguard Worker angle::Result State::detachBuffer(Context *context, const Buffer *buffer)
3108*8975f5c5SAndroid Build Coastguard Worker {
3109*8975f5c5SAndroid Build Coastguard Worker     BufferID bufferID = buffer->id();
3110*8975f5c5SAndroid Build Coastguard Worker     for (gl::BufferBinding target : angle::AllEnums<BufferBinding>())
3111*8975f5c5SAndroid Build Coastguard Worker     {
3112*8975f5c5SAndroid Build Coastguard Worker         if (mBoundBuffers[target].id() == bufferID)
3113*8975f5c5SAndroid Build Coastguard Worker         {
3114*8975f5c5SAndroid Build Coastguard Worker             UpdateBufferBinding(context, &mBoundBuffers[target], nullptr, target);
3115*8975f5c5SAndroid Build Coastguard Worker         }
3116*8975f5c5SAndroid Build Coastguard Worker     }
3117*8975f5c5SAndroid Build Coastguard Worker 
3118*8975f5c5SAndroid Build Coastguard Worker     TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
3119*8975f5c5SAndroid Build Coastguard Worker     if (curTransformFeedback)
3120*8975f5c5SAndroid Build Coastguard Worker     {
3121*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(curTransformFeedback->detachBuffer(context, bufferID));
3122*8975f5c5SAndroid Build Coastguard Worker         context->getStateCache().onActiveTransformFeedbackChange(context);
3123*8975f5c5SAndroid Build Coastguard Worker     }
3124*8975f5c5SAndroid Build Coastguard Worker 
3125*8975f5c5SAndroid Build Coastguard Worker     if (mVertexArray && mVertexArray->detachBuffer(context, bufferID))
3126*8975f5c5SAndroid Build Coastguard Worker     {
3127*8975f5c5SAndroid Build Coastguard Worker         mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
3128*8975f5c5SAndroid Build Coastguard Worker         context->getStateCache().onVertexArrayStateChange(context);
3129*8975f5c5SAndroid Build Coastguard Worker     }
3130*8975f5c5SAndroid Build Coastguard Worker 
3131*8975f5c5SAndroid Build Coastguard Worker     for (size_t uniformBufferIndex : mBoundUniformBuffersMask)
3132*8975f5c5SAndroid Build Coastguard Worker     {
3133*8975f5c5SAndroid Build Coastguard Worker         OffsetBindingPointer<Buffer> &binding = mUniformBuffers[uniformBufferIndex];
3134*8975f5c5SAndroid Build Coastguard Worker 
3135*8975f5c5SAndroid Build Coastguard Worker         if (binding.id() == bufferID)
3136*8975f5c5SAndroid Build Coastguard Worker         {
3137*8975f5c5SAndroid Build Coastguard Worker             UpdateIndexedBufferBinding(context, &binding, nullptr, BufferBinding::Uniform, 0, 0);
3138*8975f5c5SAndroid Build Coastguard Worker             mBoundUniformBuffersMask.reset(uniformBufferIndex);
3139*8975f5c5SAndroid Build Coastguard Worker         }
3140*8975f5c5SAndroid Build Coastguard Worker     }
3141*8975f5c5SAndroid Build Coastguard Worker 
3142*8975f5c5SAndroid Build Coastguard Worker     for (size_t atomicCounterBufferIndex : mBoundAtomicCounterBuffersMask)
3143*8975f5c5SAndroid Build Coastguard Worker     {
3144*8975f5c5SAndroid Build Coastguard Worker         OffsetBindingPointer<Buffer> &binding = mAtomicCounterBuffers[atomicCounterBufferIndex];
3145*8975f5c5SAndroid Build Coastguard Worker 
3146*8975f5c5SAndroid Build Coastguard Worker         if (binding.id() == bufferID)
3147*8975f5c5SAndroid Build Coastguard Worker         {
3148*8975f5c5SAndroid Build Coastguard Worker             UpdateIndexedBufferBinding(context, &binding, nullptr, BufferBinding::AtomicCounter, 0,
3149*8975f5c5SAndroid Build Coastguard Worker                                        0);
3150*8975f5c5SAndroid Build Coastguard Worker             mBoundAtomicCounterBuffersMask.reset(atomicCounterBufferIndex);
3151*8975f5c5SAndroid Build Coastguard Worker         }
3152*8975f5c5SAndroid Build Coastguard Worker     }
3153*8975f5c5SAndroid Build Coastguard Worker 
3154*8975f5c5SAndroid Build Coastguard Worker     for (size_t shaderStorageBufferIndex : mBoundShaderStorageBuffersMask)
3155*8975f5c5SAndroid Build Coastguard Worker     {
3156*8975f5c5SAndroid Build Coastguard Worker         OffsetBindingPointer<Buffer> &binding = mShaderStorageBuffers[shaderStorageBufferIndex];
3157*8975f5c5SAndroid Build Coastguard Worker 
3158*8975f5c5SAndroid Build Coastguard Worker         if (binding.id() == bufferID)
3159*8975f5c5SAndroid Build Coastguard Worker         {
3160*8975f5c5SAndroid Build Coastguard Worker             UpdateIndexedBufferBinding(context, &binding, nullptr, BufferBinding::ShaderStorage, 0,
3161*8975f5c5SAndroid Build Coastguard Worker                                        0);
3162*8975f5c5SAndroid Build Coastguard Worker             mBoundShaderStorageBuffersMask.reset(shaderStorageBufferIndex);
3163*8975f5c5SAndroid Build Coastguard Worker         }
3164*8975f5c5SAndroid Build Coastguard Worker     }
3165*8975f5c5SAndroid Build Coastguard Worker 
3166*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3167*8975f5c5SAndroid Build Coastguard Worker }
3168*8975f5c5SAndroid Build Coastguard Worker 
setEnableVertexAttribArray(unsigned int attribNum,bool enabled)3169*8975f5c5SAndroid Build Coastguard Worker void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
3170*8975f5c5SAndroid Build Coastguard Worker {
3171*8975f5c5SAndroid Build Coastguard Worker     getVertexArray()->enableAttribute(attribNum, enabled);
3172*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
3173*8975f5c5SAndroid Build Coastguard Worker }
3174*8975f5c5SAndroid Build Coastguard Worker 
setVertexAttribDivisor(const Context * context,GLuint index,GLuint divisor)3175*8975f5c5SAndroid Build Coastguard Worker void State::setVertexAttribDivisor(const Context *context, GLuint index, GLuint divisor)
3176*8975f5c5SAndroid Build Coastguard Worker {
3177*8975f5c5SAndroid Build Coastguard Worker     getVertexArray()->setVertexAttribDivisor(context, index, divisor);
3178*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
3179*8975f5c5SAndroid Build Coastguard Worker }
3180*8975f5c5SAndroid Build Coastguard Worker 
getVertexAttribPointer(unsigned int attribNum) const3181*8975f5c5SAndroid Build Coastguard Worker const void *State::getVertexAttribPointer(unsigned int attribNum) const
3182*8975f5c5SAndroid Build Coastguard Worker {
3183*8975f5c5SAndroid Build Coastguard Worker     return getVertexArray()->getVertexAttribute(attribNum).pointer;
3184*8975f5c5SAndroid Build Coastguard Worker }
3185*8975f5c5SAndroid Build Coastguard Worker 
getBooleanv(GLenum pname,GLboolean * params) const3186*8975f5c5SAndroid Build Coastguard Worker void State::getBooleanv(GLenum pname, GLboolean *params) const
3187*8975f5c5SAndroid Build Coastguard Worker {
3188*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
3189*8975f5c5SAndroid Build Coastguard Worker     {
3190*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK_ACTIVE:
3191*8975f5c5SAndroid Build Coastguard Worker             *params = getCurrentTransformFeedback()->isActive() ? GL_TRUE : GL_FALSE;
3192*8975f5c5SAndroid Build Coastguard Worker             break;
3193*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK_PAUSED:
3194*8975f5c5SAndroid Build Coastguard Worker             *params = getCurrentTransformFeedback()->isPaused() ? GL_TRUE : GL_FALSE;
3195*8975f5c5SAndroid Build Coastguard Worker             break;
3196*8975f5c5SAndroid Build Coastguard Worker         default:
3197*8975f5c5SAndroid Build Coastguard Worker             mPrivateState.getBooleanv(pname, params);
3198*8975f5c5SAndroid Build Coastguard Worker     }
3199*8975f5c5SAndroid Build Coastguard Worker }
3200*8975f5c5SAndroid Build Coastguard Worker 
getIntegerv(const Context * context,GLenum pname,GLint * params) const3201*8975f5c5SAndroid Build Coastguard Worker angle::Result State::getIntegerv(const Context *context, GLenum pname, GLint *params) const
3202*8975f5c5SAndroid Build Coastguard Worker {
3203*8975f5c5SAndroid Build Coastguard Worker     if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
3204*8975f5c5SAndroid Build Coastguard Worker     {
3205*8975f5c5SAndroid Build Coastguard Worker         size_t drawBuffer = (pname - GL_DRAW_BUFFER0_EXT);
3206*8975f5c5SAndroid Build Coastguard Worker         ASSERT(drawBuffer < static_cast<size_t>(getCaps().maxDrawBuffers));
3207*8975f5c5SAndroid Build Coastguard Worker         Framebuffer *framebuffer = mDrawFramebuffer;
3208*8975f5c5SAndroid Build Coastguard Worker         // The default framebuffer may have fewer draw buffer states than a user-created one. The
3209*8975f5c5SAndroid Build Coastguard Worker         // user is always allowed to query up to GL_MAX_DRAWBUFFERS so just return GL_NONE here if
3210*8975f5c5SAndroid Build Coastguard Worker         // the draw buffer is out of range for this framebuffer.
3211*8975f5c5SAndroid Build Coastguard Worker         *params = drawBuffer < framebuffer->getDrawbufferStateCount()
3212*8975f5c5SAndroid Build Coastguard Worker                       ? framebuffer->getDrawBufferState(drawBuffer)
3213*8975f5c5SAndroid Build Coastguard Worker                       : GL_NONE;
3214*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
3215*8975f5c5SAndroid Build Coastguard Worker     }
3216*8975f5c5SAndroid Build Coastguard Worker 
3217*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
3218*8975f5c5SAndroid Build Coastguard Worker     {
3219*8975f5c5SAndroid Build Coastguard Worker         case GL_ARRAY_BUFFER_BINDING:
3220*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::Array].id().value;
3221*8975f5c5SAndroid Build Coastguard Worker             break;
3222*8975f5c5SAndroid Build Coastguard Worker         case GL_DRAW_INDIRECT_BUFFER_BINDING:
3223*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::DrawIndirect].id().value;
3224*8975f5c5SAndroid Build Coastguard Worker             break;
3225*8975f5c5SAndroid Build Coastguard Worker         case GL_ELEMENT_ARRAY_BUFFER_BINDING:
3226*8975f5c5SAndroid Build Coastguard Worker         {
3227*8975f5c5SAndroid Build Coastguard Worker             Buffer *elementArrayBuffer = getVertexArray()->getElementArrayBuffer();
3228*8975f5c5SAndroid Build Coastguard Worker             *params                    = elementArrayBuffer ? elementArrayBuffer->id().value : 0;
3229*8975f5c5SAndroid Build Coastguard Worker             break;
3230*8975f5c5SAndroid Build Coastguard Worker         }
3231*8975f5c5SAndroid Build Coastguard Worker         case GL_DRAW_FRAMEBUFFER_BINDING:
3232*8975f5c5SAndroid Build Coastguard Worker             static_assert(GL_DRAW_FRAMEBUFFER_BINDING == GL_DRAW_FRAMEBUFFER_BINDING_ANGLE,
3233*8975f5c5SAndroid Build Coastguard Worker                           "Enum mismatch");
3234*8975f5c5SAndroid Build Coastguard Worker             *params = mDrawFramebuffer->id().value;
3235*8975f5c5SAndroid Build Coastguard Worker             break;
3236*8975f5c5SAndroid Build Coastguard Worker         case GL_READ_FRAMEBUFFER_BINDING:
3237*8975f5c5SAndroid Build Coastguard Worker             static_assert(GL_READ_FRAMEBUFFER_BINDING == GL_READ_FRAMEBUFFER_BINDING_ANGLE,
3238*8975f5c5SAndroid Build Coastguard Worker                           "Enum mismatch");
3239*8975f5c5SAndroid Build Coastguard Worker             *params = mReadFramebuffer->id().value;
3240*8975f5c5SAndroid Build Coastguard Worker             break;
3241*8975f5c5SAndroid Build Coastguard Worker         case GL_RENDERBUFFER_BINDING:
3242*8975f5c5SAndroid Build Coastguard Worker             *params = mRenderbuffer.id().value;
3243*8975f5c5SAndroid Build Coastguard Worker             break;
3244*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_ARRAY_BINDING:
3245*8975f5c5SAndroid Build Coastguard Worker             *params = mVertexArray->id().value;
3246*8975f5c5SAndroid Build Coastguard Worker             break;
3247*8975f5c5SAndroid Build Coastguard Worker         case GL_CURRENT_PROGRAM:
3248*8975f5c5SAndroid Build Coastguard Worker             *params = mProgram ? mProgram->id().value : 0;
3249*8975f5c5SAndroid Build Coastguard Worker             break;
3250*8975f5c5SAndroid Build Coastguard Worker         case GL_IMPLEMENTATION_COLOR_READ_TYPE:
3251*8975f5c5SAndroid Build Coastguard Worker             *params = mReadFramebuffer->getImplementationColorReadType(context);
3252*8975f5c5SAndroid Build Coastguard Worker             break;
3253*8975f5c5SAndroid Build Coastguard Worker         case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
3254*8975f5c5SAndroid Build Coastguard Worker             *params = mReadFramebuffer->getImplementationColorReadFormat(context);
3255*8975f5c5SAndroid Build Coastguard Worker             break;
3256*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLE_BUFFERS:
3257*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLES:
3258*8975f5c5SAndroid Build Coastguard Worker         {
3259*8975f5c5SAndroid Build Coastguard Worker             Framebuffer *framebuffer = mDrawFramebuffer;
3260*8975f5c5SAndroid Build Coastguard Worker             if (framebuffer->isComplete(context))
3261*8975f5c5SAndroid Build Coastguard Worker             {
3262*8975f5c5SAndroid Build Coastguard Worker                 GLint samples = framebuffer->getSamples(context);
3263*8975f5c5SAndroid Build Coastguard Worker                 switch (pname)
3264*8975f5c5SAndroid Build Coastguard Worker                 {
3265*8975f5c5SAndroid Build Coastguard Worker                     case GL_SAMPLE_BUFFERS:
3266*8975f5c5SAndroid Build Coastguard Worker                         if (samples != 0)
3267*8975f5c5SAndroid Build Coastguard Worker                         {
3268*8975f5c5SAndroid Build Coastguard Worker                             *params = 1;
3269*8975f5c5SAndroid Build Coastguard Worker                         }
3270*8975f5c5SAndroid Build Coastguard Worker                         else
3271*8975f5c5SAndroid Build Coastguard Worker                         {
3272*8975f5c5SAndroid Build Coastguard Worker                             *params = 0;
3273*8975f5c5SAndroid Build Coastguard Worker                         }
3274*8975f5c5SAndroid Build Coastguard Worker                         break;
3275*8975f5c5SAndroid Build Coastguard Worker                     case GL_SAMPLES:
3276*8975f5c5SAndroid Build Coastguard Worker                         *params = samples;
3277*8975f5c5SAndroid Build Coastguard Worker                         break;
3278*8975f5c5SAndroid Build Coastguard Worker                 }
3279*8975f5c5SAndroid Build Coastguard Worker             }
3280*8975f5c5SAndroid Build Coastguard Worker             else
3281*8975f5c5SAndroid Build Coastguard Worker             {
3282*8975f5c5SAndroid Build Coastguard Worker                 *params = 0;
3283*8975f5c5SAndroid Build Coastguard Worker             }
3284*8975f5c5SAndroid Build Coastguard Worker         }
3285*8975f5c5SAndroid Build Coastguard Worker         break;
3286*8975f5c5SAndroid Build Coastguard Worker         case GL_RED_BITS:
3287*8975f5c5SAndroid Build Coastguard Worker         case GL_GREEN_BITS:
3288*8975f5c5SAndroid Build Coastguard Worker         case GL_BLUE_BITS:
3289*8975f5c5SAndroid Build Coastguard Worker         case GL_ALPHA_BITS:
3290*8975f5c5SAndroid Build Coastguard Worker         {
3291*8975f5c5SAndroid Build Coastguard Worker             Framebuffer *framebuffer                 = getDrawFramebuffer();
3292*8975f5c5SAndroid Build Coastguard Worker             const FramebufferAttachment *colorbuffer = framebuffer->getFirstColorAttachment();
3293*8975f5c5SAndroid Build Coastguard Worker 
3294*8975f5c5SAndroid Build Coastguard Worker             if (colorbuffer)
3295*8975f5c5SAndroid Build Coastguard Worker             {
3296*8975f5c5SAndroid Build Coastguard Worker                 switch (pname)
3297*8975f5c5SAndroid Build Coastguard Worker                 {
3298*8975f5c5SAndroid Build Coastguard Worker                     case GL_RED_BITS:
3299*8975f5c5SAndroid Build Coastguard Worker                         *params = colorbuffer->getRedSize();
3300*8975f5c5SAndroid Build Coastguard Worker                         break;
3301*8975f5c5SAndroid Build Coastguard Worker                     case GL_GREEN_BITS:
3302*8975f5c5SAndroid Build Coastguard Worker                         *params = colorbuffer->getGreenSize();
3303*8975f5c5SAndroid Build Coastguard Worker                         break;
3304*8975f5c5SAndroid Build Coastguard Worker                     case GL_BLUE_BITS:
3305*8975f5c5SAndroid Build Coastguard Worker                         *params = colorbuffer->getBlueSize();
3306*8975f5c5SAndroid Build Coastguard Worker                         break;
3307*8975f5c5SAndroid Build Coastguard Worker                     case GL_ALPHA_BITS:
3308*8975f5c5SAndroid Build Coastguard Worker                         *params = colorbuffer->getAlphaSize();
3309*8975f5c5SAndroid Build Coastguard Worker                         break;
3310*8975f5c5SAndroid Build Coastguard Worker                 }
3311*8975f5c5SAndroid Build Coastguard Worker             }
3312*8975f5c5SAndroid Build Coastguard Worker             else
3313*8975f5c5SAndroid Build Coastguard Worker             {
3314*8975f5c5SAndroid Build Coastguard Worker                 *params = 0;
3315*8975f5c5SAndroid Build Coastguard Worker             }
3316*8975f5c5SAndroid Build Coastguard Worker         }
3317*8975f5c5SAndroid Build Coastguard Worker         break;
3318*8975f5c5SAndroid Build Coastguard Worker         case GL_DEPTH_BITS:
3319*8975f5c5SAndroid Build Coastguard Worker         {
3320*8975f5c5SAndroid Build Coastguard Worker             const Framebuffer *framebuffer           = getDrawFramebuffer();
3321*8975f5c5SAndroid Build Coastguard Worker             const FramebufferAttachment *depthbuffer = framebuffer->getDepthAttachment();
3322*8975f5c5SAndroid Build Coastguard Worker 
3323*8975f5c5SAndroid Build Coastguard Worker             if (depthbuffer)
3324*8975f5c5SAndroid Build Coastguard Worker             {
3325*8975f5c5SAndroid Build Coastguard Worker                 *params = depthbuffer->getDepthSize();
3326*8975f5c5SAndroid Build Coastguard Worker             }
3327*8975f5c5SAndroid Build Coastguard Worker             else
3328*8975f5c5SAndroid Build Coastguard Worker             {
3329*8975f5c5SAndroid Build Coastguard Worker                 *params = 0;
3330*8975f5c5SAndroid Build Coastguard Worker             }
3331*8975f5c5SAndroid Build Coastguard Worker         }
3332*8975f5c5SAndroid Build Coastguard Worker         break;
3333*8975f5c5SAndroid Build Coastguard Worker         case GL_STENCIL_BITS:
3334*8975f5c5SAndroid Build Coastguard Worker         {
3335*8975f5c5SAndroid Build Coastguard Worker             const Framebuffer *framebuffer             = getDrawFramebuffer();
3336*8975f5c5SAndroid Build Coastguard Worker             const FramebufferAttachment *stencilbuffer = framebuffer->getStencilAttachment();
3337*8975f5c5SAndroid Build Coastguard Worker 
3338*8975f5c5SAndroid Build Coastguard Worker             if (stencilbuffer)
3339*8975f5c5SAndroid Build Coastguard Worker             {
3340*8975f5c5SAndroid Build Coastguard Worker                 *params = stencilbuffer->getStencilSize();
3341*8975f5c5SAndroid Build Coastguard Worker             }
3342*8975f5c5SAndroid Build Coastguard Worker             else
3343*8975f5c5SAndroid Build Coastguard Worker             {
3344*8975f5c5SAndroid Build Coastguard Worker                 *params = 0;
3345*8975f5c5SAndroid Build Coastguard Worker             }
3346*8975f5c5SAndroid Build Coastguard Worker         }
3347*8975f5c5SAndroid Build Coastguard Worker         break;
3348*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_2D:
3349*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3350*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::_2D).value;
3351*8975f5c5SAndroid Build Coastguard Worker             break;
3352*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
3353*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3354*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::Rectangle).value;
3355*8975f5c5SAndroid Build Coastguard Worker             break;
3356*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_CUBE_MAP:
3357*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3358*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::CubeMap).value;
3359*8975f5c5SAndroid Build Coastguard Worker             break;
3360*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_3D:
3361*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3362*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::_3D).value;
3363*8975f5c5SAndroid Build Coastguard Worker             break;
3364*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_2D_ARRAY:
3365*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3366*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::_2DArray).value;
3367*8975f5c5SAndroid Build Coastguard Worker             break;
3368*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
3369*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3370*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::_2DMultisample).value;
3371*8975f5c5SAndroid Build Coastguard Worker             break;
3372*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
3373*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3374*8975f5c5SAndroid Build Coastguard Worker             *params =
3375*8975f5c5SAndroid Build Coastguard Worker                 getSamplerTextureId(getActiveSampler(), TextureType::_2DMultisampleArray).value;
3376*8975f5c5SAndroid Build Coastguard Worker             break;
3377*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
3378*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3379*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::CubeMapArray).value;
3380*8975f5c5SAndroid Build Coastguard Worker             break;
3381*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_EXTERNAL_OES:
3382*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3383*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::External).value;
3384*8975f5c5SAndroid Build Coastguard Worker             break;
3385*8975f5c5SAndroid Build Coastguard Worker 
3386*8975f5c5SAndroid Build Coastguard Worker         // GL_OES_texture_buffer
3387*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BINDING_BUFFER:
3388*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3389*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerTextureId(getActiveSampler(), TextureType::Buffer).value;
3390*8975f5c5SAndroid Build Coastguard Worker             break;
3391*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_BUFFER_BINDING:
3392*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::Texture].id().value;
3393*8975f5c5SAndroid Build Coastguard Worker             break;
3394*8975f5c5SAndroid Build Coastguard Worker 
3395*8975f5c5SAndroid Build Coastguard Worker         case GL_UNIFORM_BUFFER_BINDING:
3396*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::Uniform].id().value;
3397*8975f5c5SAndroid Build Coastguard Worker             break;
3398*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK_BINDING:
3399*8975f5c5SAndroid Build Coastguard Worker             *params = mTransformFeedback.id().value;
3400*8975f5c5SAndroid Build Coastguard Worker             break;
3401*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
3402*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::TransformFeedback].id().value;
3403*8975f5c5SAndroid Build Coastguard Worker             break;
3404*8975f5c5SAndroid Build Coastguard Worker         case GL_COPY_READ_BUFFER_BINDING:
3405*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::CopyRead].id().value;
3406*8975f5c5SAndroid Build Coastguard Worker             break;
3407*8975f5c5SAndroid Build Coastguard Worker         case GL_COPY_WRITE_BUFFER_BINDING:
3408*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::CopyWrite].id().value;
3409*8975f5c5SAndroid Build Coastguard Worker             break;
3410*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_PACK_BUFFER_BINDING:
3411*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::PixelPack].id().value;
3412*8975f5c5SAndroid Build Coastguard Worker             break;
3413*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_UNPACK_BUFFER_BINDING:
3414*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::PixelUnpack].id().value;
3415*8975f5c5SAndroid Build Coastguard Worker             break;
3416*8975f5c5SAndroid Build Coastguard Worker 
3417*8975f5c5SAndroid Build Coastguard Worker         case GL_READ_BUFFER:
3418*8975f5c5SAndroid Build Coastguard Worker             *params = mReadFramebuffer->getReadBufferState();
3419*8975f5c5SAndroid Build Coastguard Worker             break;
3420*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLER_BINDING:
3421*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<GLint>(getActiveSampler()) < getCaps().maxCombinedTextureImageUnits);
3422*8975f5c5SAndroid Build Coastguard Worker             *params = getSamplerId(getActiveSampler()).value;
3423*8975f5c5SAndroid Build Coastguard Worker             break;
3424*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_LOGGED_MESSAGES:
3425*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLint>(getDebug().getMessageCount());
3426*8975f5c5SAndroid Build Coastguard Worker             break;
3427*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
3428*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLint>(getDebug().getNextMessageLength());
3429*8975f5c5SAndroid Build Coastguard Worker             break;
3430*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_GROUP_STACK_DEPTH:
3431*8975f5c5SAndroid Build Coastguard Worker             *params = static_cast<GLint>(getDebug().getGroupStackDepth());
3432*8975f5c5SAndroid Build Coastguard Worker             break;
3433*8975f5c5SAndroid Build Coastguard Worker         case GL_ATOMIC_COUNTER_BUFFER_BINDING:
3434*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::AtomicCounter].id().value;
3435*8975f5c5SAndroid Build Coastguard Worker             break;
3436*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADER_STORAGE_BUFFER_BINDING:
3437*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::ShaderStorage].id().value;
3438*8975f5c5SAndroid Build Coastguard Worker             break;
3439*8975f5c5SAndroid Build Coastguard Worker         case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
3440*8975f5c5SAndroid Build Coastguard Worker             *params = mBoundBuffers[BufferBinding::DispatchIndirect].id().value;
3441*8975f5c5SAndroid Build Coastguard Worker             break;
3442*8975f5c5SAndroid Build Coastguard Worker 
3443*8975f5c5SAndroid Build Coastguard Worker         case GL_PROGRAM_PIPELINE_BINDING:
3444*8975f5c5SAndroid Build Coastguard Worker         {
3445*8975f5c5SAndroid Build Coastguard Worker             ProgramPipeline *pipeline = getProgramPipeline();
3446*8975f5c5SAndroid Build Coastguard Worker             if (pipeline)
3447*8975f5c5SAndroid Build Coastguard Worker             {
3448*8975f5c5SAndroid Build Coastguard Worker                 *params = pipeline->id().value;
3449*8975f5c5SAndroid Build Coastguard Worker             }
3450*8975f5c5SAndroid Build Coastguard Worker             else
3451*8975f5c5SAndroid Build Coastguard Worker             {
3452*8975f5c5SAndroid Build Coastguard Worker                 *params = 0;
3453*8975f5c5SAndroid Build Coastguard Worker             }
3454*8975f5c5SAndroid Build Coastguard Worker             break;
3455*8975f5c5SAndroid Build Coastguard Worker         }
3456*8975f5c5SAndroid Build Coastguard Worker 
3457*8975f5c5SAndroid Build Coastguard Worker         default:
3458*8975f5c5SAndroid Build Coastguard Worker             mPrivateState.getIntegerv(pname, params);
3459*8975f5c5SAndroid Build Coastguard Worker             break;
3460*8975f5c5SAndroid Build Coastguard Worker     }
3461*8975f5c5SAndroid Build Coastguard Worker 
3462*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3463*8975f5c5SAndroid Build Coastguard Worker }
3464*8975f5c5SAndroid Build Coastguard Worker 
getPointerv(const Context * context,GLenum pname,void ** params) const3465*8975f5c5SAndroid Build Coastguard Worker void State::getPointerv(const Context *context, GLenum pname, void **params) const
3466*8975f5c5SAndroid Build Coastguard Worker {
3467*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
3468*8975f5c5SAndroid Build Coastguard Worker     {
3469*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_CALLBACK_FUNCTION:
3470*8975f5c5SAndroid Build Coastguard Worker             *params = reinterpret_cast<void *>(getDebug().getCallback());
3471*8975f5c5SAndroid Build Coastguard Worker             break;
3472*8975f5c5SAndroid Build Coastguard Worker         case GL_DEBUG_CALLBACK_USER_PARAM:
3473*8975f5c5SAndroid Build Coastguard Worker             *params = const_cast<void *>(getDebug().getUserParam());
3474*8975f5c5SAndroid Build Coastguard Worker             break;
3475*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_ARRAY_POINTER:
3476*8975f5c5SAndroid Build Coastguard Worker         case GL_NORMAL_ARRAY_POINTER:
3477*8975f5c5SAndroid Build Coastguard Worker         case GL_COLOR_ARRAY_POINTER:
3478*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE_COORD_ARRAY_POINTER:
3479*8975f5c5SAndroid Build Coastguard Worker         case GL_POINT_SIZE_ARRAY_POINTER_OES:
3480*8975f5c5SAndroid Build Coastguard Worker             QueryVertexAttribPointerv(getVertexArray()->getVertexAttribute(
3481*8975f5c5SAndroid Build Coastguard Worker                                           context->vertexArrayIndex(ParamToVertexArrayType(pname))),
3482*8975f5c5SAndroid Build Coastguard Worker                                       GL_VERTEX_ATTRIB_ARRAY_POINTER, params);
3483*8975f5c5SAndroid Build Coastguard Worker             return;
3484*8975f5c5SAndroid Build Coastguard Worker         case GL_BLOB_CACHE_GET_FUNCTION_ANGLE:
3485*8975f5c5SAndroid Build Coastguard Worker             *params = reinterpret_cast<void *>(getBlobCacheCallbacks().getFunction);
3486*8975f5c5SAndroid Build Coastguard Worker             break;
3487*8975f5c5SAndroid Build Coastguard Worker         case GL_BLOB_CACHE_SET_FUNCTION_ANGLE:
3488*8975f5c5SAndroid Build Coastguard Worker             *params = reinterpret_cast<void *>(getBlobCacheCallbacks().setFunction);
3489*8975f5c5SAndroid Build Coastguard Worker             break;
3490*8975f5c5SAndroid Build Coastguard Worker         case GL_BLOB_CACHE_USER_PARAM_ANGLE:
3491*8975f5c5SAndroid Build Coastguard Worker             *params = const_cast<void *>(getBlobCacheCallbacks().userParam);
3492*8975f5c5SAndroid Build Coastguard Worker             break;
3493*8975f5c5SAndroid Build Coastguard Worker         default:
3494*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
3495*8975f5c5SAndroid Build Coastguard Worker             break;
3496*8975f5c5SAndroid Build Coastguard Worker     }
3497*8975f5c5SAndroid Build Coastguard Worker }
3498*8975f5c5SAndroid Build Coastguard Worker 
getIntegeri_v(const Context * context,GLenum target,GLuint index,GLint * data) const3499*8975f5c5SAndroid Build Coastguard Worker void State::getIntegeri_v(const Context *context, GLenum target, GLuint index, GLint *data) const
3500*8975f5c5SAndroid Build Coastguard Worker {
3501*8975f5c5SAndroid Build Coastguard Worker     switch (target)
3502*8975f5c5SAndroid Build Coastguard Worker     {
3503*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
3504*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
3505*8975f5c5SAndroid Build Coastguard Worker             *data = mTransformFeedback->getIndexedBuffer(index).id().value;
3506*8975f5c5SAndroid Build Coastguard Worker             break;
3507*8975f5c5SAndroid Build Coastguard Worker         case GL_UNIFORM_BUFFER_BINDING:
3508*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
3509*8975f5c5SAndroid Build Coastguard Worker             *data = mUniformBuffers[index].id().value;
3510*8975f5c5SAndroid Build Coastguard Worker             break;
3511*8975f5c5SAndroid Build Coastguard Worker         case GL_ATOMIC_COUNTER_BUFFER_BINDING:
3512*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
3513*8975f5c5SAndroid Build Coastguard Worker             *data = mAtomicCounterBuffers[index].id().value;
3514*8975f5c5SAndroid Build Coastguard Worker             break;
3515*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADER_STORAGE_BUFFER_BINDING:
3516*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
3517*8975f5c5SAndroid Build Coastguard Worker             *data = mShaderStorageBuffers[index].id().value;
3518*8975f5c5SAndroid Build Coastguard Worker             break;
3519*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_BINDING_BUFFER:
3520*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
3521*8975f5c5SAndroid Build Coastguard Worker             *data = mVertexArray->getVertexBinding(index).getBuffer().id().value;
3522*8975f5c5SAndroid Build Coastguard Worker             break;
3523*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_BINDING_DIVISOR:
3524*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
3525*8975f5c5SAndroid Build Coastguard Worker             *data = mVertexArray->getVertexBinding(index).getDivisor();
3526*8975f5c5SAndroid Build Coastguard Worker             break;
3527*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_BINDING_OFFSET:
3528*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
3529*8975f5c5SAndroid Build Coastguard Worker             *data = static_cast<GLuint>(mVertexArray->getVertexBinding(index).getOffset());
3530*8975f5c5SAndroid Build Coastguard Worker             break;
3531*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_BINDING_STRIDE:
3532*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mVertexArray->getMaxBindings());
3533*8975f5c5SAndroid Build Coastguard Worker             *data = mVertexArray->getVertexBinding(index).getStride();
3534*8975f5c5SAndroid Build Coastguard Worker             break;
3535*8975f5c5SAndroid Build Coastguard Worker         case GL_IMAGE_BINDING_NAME:
3536*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mImageUnits.size());
3537*8975f5c5SAndroid Build Coastguard Worker             *data = mImageUnits[index].texture.id().value;
3538*8975f5c5SAndroid Build Coastguard Worker             break;
3539*8975f5c5SAndroid Build Coastguard Worker         case GL_IMAGE_BINDING_LEVEL:
3540*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mImageUnits.size());
3541*8975f5c5SAndroid Build Coastguard Worker             *data = mImageUnits[index].level;
3542*8975f5c5SAndroid Build Coastguard Worker             break;
3543*8975f5c5SAndroid Build Coastguard Worker         case GL_IMAGE_BINDING_LAYER:
3544*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mImageUnits.size());
3545*8975f5c5SAndroid Build Coastguard Worker             *data = mImageUnits[index].layer;
3546*8975f5c5SAndroid Build Coastguard Worker             break;
3547*8975f5c5SAndroid Build Coastguard Worker         case GL_IMAGE_BINDING_ACCESS:
3548*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mImageUnits.size());
3549*8975f5c5SAndroid Build Coastguard Worker             *data = mImageUnits[index].access;
3550*8975f5c5SAndroid Build Coastguard Worker             break;
3551*8975f5c5SAndroid Build Coastguard Worker         case GL_IMAGE_BINDING_FORMAT:
3552*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mImageUnits.size());
3553*8975f5c5SAndroid Build Coastguard Worker             *data = mImageUnits[index].format;
3554*8975f5c5SAndroid Build Coastguard Worker             break;
3555*8975f5c5SAndroid Build Coastguard Worker         default:
3556*8975f5c5SAndroid Build Coastguard Worker             mPrivateState.getIntegeri_v(target, index, data);
3557*8975f5c5SAndroid Build Coastguard Worker             break;
3558*8975f5c5SAndroid Build Coastguard Worker     }
3559*8975f5c5SAndroid Build Coastguard Worker }
3560*8975f5c5SAndroid Build Coastguard Worker 
getInteger64i_v(GLenum target,GLuint index,GLint64 * data) const3561*8975f5c5SAndroid Build Coastguard Worker void State::getInteger64i_v(GLenum target, GLuint index, GLint64 *data) const
3562*8975f5c5SAndroid Build Coastguard Worker {
3563*8975f5c5SAndroid Build Coastguard Worker     switch (target)
3564*8975f5c5SAndroid Build Coastguard Worker     {
3565*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK_BUFFER_START:
3566*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
3567*8975f5c5SAndroid Build Coastguard Worker             *data = mTransformFeedback->getIndexedBuffer(index).getOffset();
3568*8975f5c5SAndroid Build Coastguard Worker             break;
3569*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
3570*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mTransformFeedback->getIndexedBufferCount());
3571*8975f5c5SAndroid Build Coastguard Worker             *data = mTransformFeedback->getIndexedBuffer(index).getSize();
3572*8975f5c5SAndroid Build Coastguard Worker             break;
3573*8975f5c5SAndroid Build Coastguard Worker         case GL_UNIFORM_BUFFER_START:
3574*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
3575*8975f5c5SAndroid Build Coastguard Worker             *data = mUniformBuffers[index].getOffset();
3576*8975f5c5SAndroid Build Coastguard Worker             break;
3577*8975f5c5SAndroid Build Coastguard Worker         case GL_UNIFORM_BUFFER_SIZE:
3578*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mUniformBuffers.size());
3579*8975f5c5SAndroid Build Coastguard Worker             *data = mUniformBuffers[index].getSize();
3580*8975f5c5SAndroid Build Coastguard Worker             break;
3581*8975f5c5SAndroid Build Coastguard Worker         case GL_ATOMIC_COUNTER_BUFFER_START:
3582*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
3583*8975f5c5SAndroid Build Coastguard Worker             *data = mAtomicCounterBuffers[index].getOffset();
3584*8975f5c5SAndroid Build Coastguard Worker             break;
3585*8975f5c5SAndroid Build Coastguard Worker         case GL_ATOMIC_COUNTER_BUFFER_SIZE:
3586*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mAtomicCounterBuffers.size());
3587*8975f5c5SAndroid Build Coastguard Worker             *data = mAtomicCounterBuffers[index].getSize();
3588*8975f5c5SAndroid Build Coastguard Worker             break;
3589*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADER_STORAGE_BUFFER_START:
3590*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
3591*8975f5c5SAndroid Build Coastguard Worker             *data = mShaderStorageBuffers[index].getOffset();
3592*8975f5c5SAndroid Build Coastguard Worker             break;
3593*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADER_STORAGE_BUFFER_SIZE:
3594*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mShaderStorageBuffers.size());
3595*8975f5c5SAndroid Build Coastguard Worker             *data = mShaderStorageBuffers[index].getSize();
3596*8975f5c5SAndroid Build Coastguard Worker             break;
3597*8975f5c5SAndroid Build Coastguard Worker         default:
3598*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
3599*8975f5c5SAndroid Build Coastguard Worker             break;
3600*8975f5c5SAndroid Build Coastguard Worker     }
3601*8975f5c5SAndroid Build Coastguard Worker }
3602*8975f5c5SAndroid Build Coastguard Worker 
getBooleani_v(GLenum target,GLuint index,GLboolean * data) const3603*8975f5c5SAndroid Build Coastguard Worker void State::getBooleani_v(GLenum target, GLuint index, GLboolean *data) const
3604*8975f5c5SAndroid Build Coastguard Worker {
3605*8975f5c5SAndroid Build Coastguard Worker     switch (target)
3606*8975f5c5SAndroid Build Coastguard Worker     {
3607*8975f5c5SAndroid Build Coastguard Worker         case GL_IMAGE_BINDING_LAYERED:
3608*8975f5c5SAndroid Build Coastguard Worker             ASSERT(static_cast<size_t>(index) < mImageUnits.size());
3609*8975f5c5SAndroid Build Coastguard Worker             *data = mImageUnits[index].layered;
3610*8975f5c5SAndroid Build Coastguard Worker             break;
3611*8975f5c5SAndroid Build Coastguard Worker         default:
3612*8975f5c5SAndroid Build Coastguard Worker             mPrivateState.getBooleani_v(target, index, data);
3613*8975f5c5SAndroid Build Coastguard Worker             break;
3614*8975f5c5SAndroid Build Coastguard Worker     }
3615*8975f5c5SAndroid Build Coastguard Worker }
3616*8975f5c5SAndroid Build Coastguard Worker 
3617*8975f5c5SAndroid Build Coastguard Worker // TODO(http://anglebug.com/42262534): Remove this helper function after blink and chromium part
3618*8975f5c5SAndroid Build Coastguard Worker // refactor done.
getTextureForActiveSampler(TextureType type,size_t index)3619*8975f5c5SAndroid Build Coastguard Worker Texture *State::getTextureForActiveSampler(TextureType type, size_t index)
3620*8975f5c5SAndroid Build Coastguard Worker {
3621*8975f5c5SAndroid Build Coastguard Worker     if (type != TextureType::VideoImage)
3622*8975f5c5SAndroid Build Coastguard Worker     {
3623*8975f5c5SAndroid Build Coastguard Worker         return mSamplerTextures[type][index].get();
3624*8975f5c5SAndroid Build Coastguard Worker     }
3625*8975f5c5SAndroid Build Coastguard Worker 
3626*8975f5c5SAndroid Build Coastguard Worker     ASSERT(type == TextureType::VideoImage);
3627*8975f5c5SAndroid Build Coastguard Worker 
3628*8975f5c5SAndroid Build Coastguard Worker     Texture *candidateTexture = mSamplerTextures[type][index].get();
3629*8975f5c5SAndroid Build Coastguard Worker     if (candidateTexture->getWidth(TextureTarget::VideoImage, 0) == 0 ||
3630*8975f5c5SAndroid Build Coastguard Worker         candidateTexture->getHeight(TextureTarget::VideoImage, 0) == 0 ||
3631*8975f5c5SAndroid Build Coastguard Worker         candidateTexture->getDepth(TextureTarget::VideoImage, 0) == 0)
3632*8975f5c5SAndroid Build Coastguard Worker     {
3633*8975f5c5SAndroid Build Coastguard Worker         return mSamplerTextures[TextureType::_2D][index].get();
3634*8975f5c5SAndroid Build Coastguard Worker     }
3635*8975f5c5SAndroid Build Coastguard Worker 
3636*8975f5c5SAndroid Build Coastguard Worker     return mSamplerTextures[type][index].get();
3637*8975f5c5SAndroid Build Coastguard Worker }
3638*8975f5c5SAndroid Build Coastguard Worker 
syncActiveTextures(const Context * context,Command command)3639*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncActiveTextures(const Context *context, Command command)
3640*8975f5c5SAndroid Build Coastguard Worker {
3641*8975f5c5SAndroid Build Coastguard Worker     if (mDirtyActiveTextures.none())
3642*8975f5c5SAndroid Build Coastguard Worker     {
3643*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
3644*8975f5c5SAndroid Build Coastguard Worker     }
3645*8975f5c5SAndroid Build Coastguard Worker 
3646*8975f5c5SAndroid Build Coastguard Worker     for (size_t textureUnit : mDirtyActiveTextures)
3647*8975f5c5SAndroid Build Coastguard Worker     {
3648*8975f5c5SAndroid Build Coastguard Worker         if (mExecutable)
3649*8975f5c5SAndroid Build Coastguard Worker         {
3650*8975f5c5SAndroid Build Coastguard Worker             TextureType type       = mExecutable->getActiveSamplerTypes()[textureUnit];
3651*8975f5c5SAndroid Build Coastguard Worker             Texture *activeTexture = (type != TextureType::InvalidEnum)
3652*8975f5c5SAndroid Build Coastguard Worker                                          ? getTextureForActiveSampler(type, textureUnit)
3653*8975f5c5SAndroid Build Coastguard Worker                                          : nullptr;
3654*8975f5c5SAndroid Build Coastguard Worker             const Sampler *sampler = mSamplers[textureUnit].get();
3655*8975f5c5SAndroid Build Coastguard Worker 
3656*8975f5c5SAndroid Build Coastguard Worker             updateActiveTextureStateOnSync(context, textureUnit, sampler, activeTexture);
3657*8975f5c5SAndroid Build Coastguard Worker         }
3658*8975f5c5SAndroid Build Coastguard Worker     }
3659*8975f5c5SAndroid Build Coastguard Worker 
3660*8975f5c5SAndroid Build Coastguard Worker     mDirtyActiveTextures.reset();
3661*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3662*8975f5c5SAndroid Build Coastguard Worker }
3663*8975f5c5SAndroid Build Coastguard Worker 
syncTexturesInit(const Context * context,Command command)3664*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncTexturesInit(const Context *context, Command command)
3665*8975f5c5SAndroid Build Coastguard Worker {
3666*8975f5c5SAndroid Build Coastguard Worker     ASSERT(isRobustResourceInitEnabled());
3667*8975f5c5SAndroid Build Coastguard Worker 
3668*8975f5c5SAndroid Build Coastguard Worker     if (!mProgram)
3669*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
3670*8975f5c5SAndroid Build Coastguard Worker 
3671*8975f5c5SAndroid Build Coastguard Worker     for (size_t textureUnitIndex : mExecutable->getActiveSamplersMask())
3672*8975f5c5SAndroid Build Coastguard Worker     {
3673*8975f5c5SAndroid Build Coastguard Worker         Texture *texture = mActiveTexturesCache[textureUnitIndex];
3674*8975f5c5SAndroid Build Coastguard Worker         if (texture)
3675*8975f5c5SAndroid Build Coastguard Worker         {
3676*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(texture->ensureInitialized(context));
3677*8975f5c5SAndroid Build Coastguard Worker         }
3678*8975f5c5SAndroid Build Coastguard Worker     }
3679*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3680*8975f5c5SAndroid Build Coastguard Worker }
3681*8975f5c5SAndroid Build Coastguard Worker 
syncImagesInit(const Context * context,Command command)3682*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncImagesInit(const Context *context, Command command)
3683*8975f5c5SAndroid Build Coastguard Worker {
3684*8975f5c5SAndroid Build Coastguard Worker     ASSERT(isRobustResourceInitEnabled());
3685*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mExecutable);
3686*8975f5c5SAndroid Build Coastguard Worker     for (size_t imageUnitIndex : mExecutable->getActiveImagesMask())
3687*8975f5c5SAndroid Build Coastguard Worker     {
3688*8975f5c5SAndroid Build Coastguard Worker         Texture *texture = mImageUnits[imageUnitIndex].texture.get();
3689*8975f5c5SAndroid Build Coastguard Worker         if (texture)
3690*8975f5c5SAndroid Build Coastguard Worker         {
3691*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(texture->ensureInitialized(context));
3692*8975f5c5SAndroid Build Coastguard Worker         }
3693*8975f5c5SAndroid Build Coastguard Worker     }
3694*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3695*8975f5c5SAndroid Build Coastguard Worker }
3696*8975f5c5SAndroid Build Coastguard Worker 
syncReadAttachments(const Context * context,Command command)3697*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncReadAttachments(const Context *context, Command command)
3698*8975f5c5SAndroid Build Coastguard Worker {
3699*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mReadFramebuffer);
3700*8975f5c5SAndroid Build Coastguard Worker     ASSERT(isRobustResourceInitEnabled());
3701*8975f5c5SAndroid Build Coastguard Worker     return mReadFramebuffer->ensureReadAttachmentsInitialized(context);
3702*8975f5c5SAndroid Build Coastguard Worker }
3703*8975f5c5SAndroid Build Coastguard Worker 
syncDrawAttachments(const Context * context,Command command)3704*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncDrawAttachments(const Context *context, Command command)
3705*8975f5c5SAndroid Build Coastguard Worker {
3706*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mDrawFramebuffer);
3707*8975f5c5SAndroid Build Coastguard Worker     ASSERT(isRobustResourceInitEnabled());
3708*8975f5c5SAndroid Build Coastguard Worker     return mDrawFramebuffer->ensureDrawAttachmentsInitialized(context);
3709*8975f5c5SAndroid Build Coastguard Worker }
3710*8975f5c5SAndroid Build Coastguard Worker 
syncReadFramebuffer(const Context * context,Command command)3711*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncReadFramebuffer(const Context *context, Command command)
3712*8975f5c5SAndroid Build Coastguard Worker {
3713*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mReadFramebuffer);
3714*8975f5c5SAndroid Build Coastguard Worker     return mReadFramebuffer->syncState(context, GL_READ_FRAMEBUFFER, command);
3715*8975f5c5SAndroid Build Coastguard Worker }
3716*8975f5c5SAndroid Build Coastguard Worker 
syncDrawFramebuffer(const Context * context,Command command)3717*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncDrawFramebuffer(const Context *context, Command command)
3718*8975f5c5SAndroid Build Coastguard Worker {
3719*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mDrawFramebuffer);
3720*8975f5c5SAndroid Build Coastguard Worker     mDrawFramebuffer->setWriteControlMode(context->getState().getFramebufferSRGB()
3721*8975f5c5SAndroid Build Coastguard Worker                                               ? SrgbWriteControlMode::Default
3722*8975f5c5SAndroid Build Coastguard Worker                                               : SrgbWriteControlMode::Linear);
3723*8975f5c5SAndroid Build Coastguard Worker     return mDrawFramebuffer->syncState(context, GL_DRAW_FRAMEBUFFER, command);
3724*8975f5c5SAndroid Build Coastguard Worker }
3725*8975f5c5SAndroid Build Coastguard Worker 
syncTextures(const Context * context,Command command)3726*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncTextures(const Context *context, Command command)
3727*8975f5c5SAndroid Build Coastguard Worker {
3728*8975f5c5SAndroid Build Coastguard Worker     if (mDirtyTextures.none())
3729*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
3730*8975f5c5SAndroid Build Coastguard Worker 
3731*8975f5c5SAndroid Build Coastguard Worker     for (size_t textureIndex : mDirtyTextures)
3732*8975f5c5SAndroid Build Coastguard Worker     {
3733*8975f5c5SAndroid Build Coastguard Worker         Texture *texture = mActiveTexturesCache[textureIndex];
3734*8975f5c5SAndroid Build Coastguard Worker         if (texture && texture->hasAnyDirtyBit())
3735*8975f5c5SAndroid Build Coastguard Worker         {
3736*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(texture->syncState(context, Command::Other));
3737*8975f5c5SAndroid Build Coastguard Worker         }
3738*8975f5c5SAndroid Build Coastguard Worker     }
3739*8975f5c5SAndroid Build Coastguard Worker 
3740*8975f5c5SAndroid Build Coastguard Worker     mDirtyTextures.reset();
3741*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3742*8975f5c5SAndroid Build Coastguard Worker }
3743*8975f5c5SAndroid Build Coastguard Worker 
syncImages(const Context * context,Command command)3744*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncImages(const Context *context, Command command)
3745*8975f5c5SAndroid Build Coastguard Worker {
3746*8975f5c5SAndroid Build Coastguard Worker     if (mDirtyImages.none())
3747*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
3748*8975f5c5SAndroid Build Coastguard Worker 
3749*8975f5c5SAndroid Build Coastguard Worker     for (size_t imageUnitIndex : mDirtyImages)
3750*8975f5c5SAndroid Build Coastguard Worker     {
3751*8975f5c5SAndroid Build Coastguard Worker         Texture *texture = mImageUnits[imageUnitIndex].texture.get();
3752*8975f5c5SAndroid Build Coastguard Worker         if (texture && texture->hasAnyDirtyBit())
3753*8975f5c5SAndroid Build Coastguard Worker         {
3754*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(texture->syncState(context, Command::Other));
3755*8975f5c5SAndroid Build Coastguard Worker         }
3756*8975f5c5SAndroid Build Coastguard Worker     }
3757*8975f5c5SAndroid Build Coastguard Worker 
3758*8975f5c5SAndroid Build Coastguard Worker     mDirtyImages.reset();
3759*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3760*8975f5c5SAndroid Build Coastguard Worker }
3761*8975f5c5SAndroid Build Coastguard Worker 
syncSamplers(const Context * context,Command command)3762*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncSamplers(const Context *context, Command command)
3763*8975f5c5SAndroid Build Coastguard Worker {
3764*8975f5c5SAndroid Build Coastguard Worker     if (mDirtySamplers.none())
3765*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
3766*8975f5c5SAndroid Build Coastguard Worker 
3767*8975f5c5SAndroid Build Coastguard Worker     for (size_t samplerIndex : mDirtySamplers)
3768*8975f5c5SAndroid Build Coastguard Worker     {
3769*8975f5c5SAndroid Build Coastguard Worker         BindingPointer<Sampler> &sampler = mSamplers[samplerIndex];
3770*8975f5c5SAndroid Build Coastguard Worker         if (sampler.get() && sampler->isDirty())
3771*8975f5c5SAndroid Build Coastguard Worker         {
3772*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(sampler->syncState(context));
3773*8975f5c5SAndroid Build Coastguard Worker         }
3774*8975f5c5SAndroid Build Coastguard Worker     }
3775*8975f5c5SAndroid Build Coastguard Worker 
3776*8975f5c5SAndroid Build Coastguard Worker     mDirtySamplers.reset();
3777*8975f5c5SAndroid Build Coastguard Worker 
3778*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3779*8975f5c5SAndroid Build Coastguard Worker }
3780*8975f5c5SAndroid Build Coastguard Worker 
syncVertexArray(const Context * context,Command command)3781*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncVertexArray(const Context *context, Command command)
3782*8975f5c5SAndroid Build Coastguard Worker {
3783*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mVertexArray);
3784*8975f5c5SAndroid Build Coastguard Worker     return mVertexArray->syncState(context);
3785*8975f5c5SAndroid Build Coastguard Worker }
3786*8975f5c5SAndroid Build Coastguard Worker 
syncProgramPipelineObject(const Context * context,Command command)3787*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncProgramPipelineObject(const Context *context, Command command)
3788*8975f5c5SAndroid Build Coastguard Worker {
3789*8975f5c5SAndroid Build Coastguard Worker     // If a ProgramPipeline is bound, ensure it is linked.
3790*8975f5c5SAndroid Build Coastguard Worker     if (mProgramPipeline.get())
3791*8975f5c5SAndroid Build Coastguard Worker     {
3792*8975f5c5SAndroid Build Coastguard Worker         mProgramPipeline->resolveLink(context);
3793*8975f5c5SAndroid Build Coastguard Worker     }
3794*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3795*8975f5c5SAndroid Build Coastguard Worker }
3796*8975f5c5SAndroid Build Coastguard Worker 
syncDirtyObject(const Context * context,GLenum target)3797*8975f5c5SAndroid Build Coastguard Worker angle::Result State::syncDirtyObject(const Context *context, GLenum target)
3798*8975f5c5SAndroid Build Coastguard Worker {
3799*8975f5c5SAndroid Build Coastguard Worker     state::DirtyObjects localSet;
3800*8975f5c5SAndroid Build Coastguard Worker 
3801*8975f5c5SAndroid Build Coastguard Worker     switch (target)
3802*8975f5c5SAndroid Build Coastguard Worker     {
3803*8975f5c5SAndroid Build Coastguard Worker         case GL_READ_FRAMEBUFFER:
3804*8975f5c5SAndroid Build Coastguard Worker             localSet.set(state::DIRTY_OBJECT_READ_FRAMEBUFFER);
3805*8975f5c5SAndroid Build Coastguard Worker             break;
3806*8975f5c5SAndroid Build Coastguard Worker         case GL_DRAW_FRAMEBUFFER:
3807*8975f5c5SAndroid Build Coastguard Worker             localSet.set(state::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
3808*8975f5c5SAndroid Build Coastguard Worker             break;
3809*8975f5c5SAndroid Build Coastguard Worker         default:
3810*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
3811*8975f5c5SAndroid Build Coastguard Worker             break;
3812*8975f5c5SAndroid Build Coastguard Worker     }
3813*8975f5c5SAndroid Build Coastguard Worker 
3814*8975f5c5SAndroid Build Coastguard Worker     return syncDirtyObjects(context, localSet, Command::Other);
3815*8975f5c5SAndroid Build Coastguard Worker }
3816*8975f5c5SAndroid Build Coastguard Worker 
setObjectDirty(GLenum target)3817*8975f5c5SAndroid Build Coastguard Worker void State::setObjectDirty(GLenum target)
3818*8975f5c5SAndroid Build Coastguard Worker {
3819*8975f5c5SAndroid Build Coastguard Worker     switch (target)
3820*8975f5c5SAndroid Build Coastguard Worker     {
3821*8975f5c5SAndroid Build Coastguard Worker         case GL_READ_FRAMEBUFFER:
3822*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_READ_FRAMEBUFFER);
3823*8975f5c5SAndroid Build Coastguard Worker             break;
3824*8975f5c5SAndroid Build Coastguard Worker         case GL_DRAW_FRAMEBUFFER:
3825*8975f5c5SAndroid Build Coastguard Worker             setDrawFramebufferDirty();
3826*8975f5c5SAndroid Build Coastguard Worker             break;
3827*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAMEBUFFER:
3828*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_READ_FRAMEBUFFER);
3829*8975f5c5SAndroid Build Coastguard Worker             setDrawFramebufferDirty();
3830*8975f5c5SAndroid Build Coastguard Worker             break;
3831*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_ARRAY:
3832*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_VERTEX_ARRAY);
3833*8975f5c5SAndroid Build Coastguard Worker             break;
3834*8975f5c5SAndroid Build Coastguard Worker         default:
3835*8975f5c5SAndroid Build Coastguard Worker             break;
3836*8975f5c5SAndroid Build Coastguard Worker     }
3837*8975f5c5SAndroid Build Coastguard Worker }
3838*8975f5c5SAndroid Build Coastguard Worker 
installProgramExecutable(const Context * context)3839*8975f5c5SAndroid Build Coastguard Worker angle::Result State::installProgramExecutable(const Context *context)
3840*8975f5c5SAndroid Build Coastguard Worker {
3841*8975f5c5SAndroid Build Coastguard Worker     // OpenGL Spec:
3842*8975f5c5SAndroid Build Coastguard Worker     // "If LinkProgram or ProgramBinary successfully re-links a program object
3843*8975f5c5SAndroid Build Coastguard Worker     //  that was already in use as a result of a previous call to UseProgram, then the
3844*8975f5c5SAndroid Build Coastguard Worker     //  generated executable code will be installed as part of the current rendering state."
3845*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mProgram->isLinked());
3846*8975f5c5SAndroid Build Coastguard Worker 
3847*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PROGRAM_EXECUTABLE);
3848*8975f5c5SAndroid Build Coastguard Worker 
3849*8975f5c5SAndroid Build Coastguard Worker     // Make sure the program binary is cached if needed and not already.  This is automatically done
3850*8975f5c5SAndroid Build Coastguard Worker     // on program destruction, but is done here anyway to support situations like Android apps that
3851*8975f5c5SAndroid Build Coastguard Worker     // are typically killed instead of cleanly closed.
3852*8975f5c5SAndroid Build Coastguard Worker     mProgram->cacheProgramBinaryIfNecessary(context);
3853*8975f5c5SAndroid Build Coastguard Worker 
3854*8975f5c5SAndroid Build Coastguard Worker     // The bound Program always overrides the ProgramPipeline, so install the executable regardless
3855*8975f5c5SAndroid Build Coastguard Worker     // of whether a program pipeline is bound.
3856*8975f5c5SAndroid Build Coastguard Worker     InstallExecutable(context, mProgram->getSharedExecutable(), &mExecutable);
3857*8975f5c5SAndroid Build Coastguard Worker     return onExecutableChange(context);
3858*8975f5c5SAndroid Build Coastguard Worker }
3859*8975f5c5SAndroid Build Coastguard Worker 
installProgramPipelineExecutable(const Context * context)3860*8975f5c5SAndroid Build Coastguard Worker angle::Result State::installProgramPipelineExecutable(const Context *context)
3861*8975f5c5SAndroid Build Coastguard Worker {
3862*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mProgramPipeline->isLinked());
3863*8975f5c5SAndroid Build Coastguard Worker 
3864*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_PROGRAM_EXECUTABLE);
3865*8975f5c5SAndroid Build Coastguard Worker 
3866*8975f5c5SAndroid Build Coastguard Worker     // A bound Program always overrides the ProgramPipeline, so only update the current
3867*8975f5c5SAndroid Build Coastguard Worker     // ProgramExecutable if there isn't currently a Program bound.
3868*8975f5c5SAndroid Build Coastguard Worker     if (mProgram == nullptr)
3869*8975f5c5SAndroid Build Coastguard Worker     {
3870*8975f5c5SAndroid Build Coastguard Worker         InstallExecutable(context, mProgramPipeline->getSharedExecutable(), &mExecutable);
3871*8975f5c5SAndroid Build Coastguard Worker         return onExecutableChange(context);
3872*8975f5c5SAndroid Build Coastguard Worker     }
3873*8975f5c5SAndroid Build Coastguard Worker 
3874*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3875*8975f5c5SAndroid Build Coastguard Worker }
3876*8975f5c5SAndroid Build Coastguard Worker 
installProgramPipelineExecutableIfNotAlready(const Context * context)3877*8975f5c5SAndroid Build Coastguard Worker angle::Result State::installProgramPipelineExecutableIfNotAlready(const Context *context)
3878*8975f5c5SAndroid Build Coastguard Worker {
3879*8975f5c5SAndroid Build Coastguard Worker     // If a program pipeline is bound, then unbound and bound again, its executable will still be
3880*8975f5c5SAndroid Build Coastguard Worker     // set, and there is no need to reinstall it.
3881*8975f5c5SAndroid Build Coastguard Worker     if (mExecutable.get() == mProgramPipeline->getSharedExecutable().get())
3882*8975f5c5SAndroid Build Coastguard Worker     {
3883*8975f5c5SAndroid Build Coastguard Worker         return onExecutableChange(context);
3884*8975f5c5SAndroid Build Coastguard Worker     }
3885*8975f5c5SAndroid Build Coastguard Worker     return installProgramPipelineExecutable(context);
3886*8975f5c5SAndroid Build Coastguard Worker }
3887*8975f5c5SAndroid Build Coastguard Worker 
onExecutableChange(const Context * context)3888*8975f5c5SAndroid Build Coastguard Worker angle::Result State::onExecutableChange(const Context *context)
3889*8975f5c5SAndroid Build Coastguard Worker {
3890*8975f5c5SAndroid Build Coastguard Worker     // Set any bound textures.
3891*8975f5c5SAndroid Build Coastguard Worker     const ActiveTextureTypeArray &textureTypes = mExecutable->getActiveSamplerTypes();
3892*8975f5c5SAndroid Build Coastguard Worker 
3893*8975f5c5SAndroid Build Coastguard Worker     for (size_t textureIndex : mExecutable->getActiveSamplersMask())
3894*8975f5c5SAndroid Build Coastguard Worker     {
3895*8975f5c5SAndroid Build Coastguard Worker         TextureType type = textureTypes[textureIndex];
3896*8975f5c5SAndroid Build Coastguard Worker 
3897*8975f5c5SAndroid Build Coastguard Worker         // This can happen if there is a conflicting texture type.
3898*8975f5c5SAndroid Build Coastguard Worker         if (type == TextureType::InvalidEnum)
3899*8975f5c5SAndroid Build Coastguard Worker             continue;
3900*8975f5c5SAndroid Build Coastguard Worker 
3901*8975f5c5SAndroid Build Coastguard Worker         Texture *texture = getTextureForActiveSampler(type, textureIndex);
3902*8975f5c5SAndroid Build Coastguard Worker         updateTextureBinding(context, textureIndex, texture);
3903*8975f5c5SAndroid Build Coastguard Worker     }
3904*8975f5c5SAndroid Build Coastguard Worker 
3905*8975f5c5SAndroid Build Coastguard Worker     for (size_t imageUnitIndex : mExecutable->getActiveImagesMask())
3906*8975f5c5SAndroid Build Coastguard Worker     {
3907*8975f5c5SAndroid Build Coastguard Worker         Texture *image = mImageUnits[imageUnitIndex].texture.get();
3908*8975f5c5SAndroid Build Coastguard Worker         if (!image)
3909*8975f5c5SAndroid Build Coastguard Worker             continue;
3910*8975f5c5SAndroid Build Coastguard Worker 
3911*8975f5c5SAndroid Build Coastguard Worker         if (image->hasAnyDirtyBit())
3912*8975f5c5SAndroid Build Coastguard Worker         {
3913*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(image->syncState(context, Command::Other));
3914*8975f5c5SAndroid Build Coastguard Worker         }
3915*8975f5c5SAndroid Build Coastguard Worker 
3916*8975f5c5SAndroid Build Coastguard Worker         if (isRobustResourceInitEnabled() && image->initState() == InitState::MayNeedInit)
3917*8975f5c5SAndroid Build Coastguard Worker         {
3918*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_IMAGES_INIT);
3919*8975f5c5SAndroid Build Coastguard Worker         }
3920*8975f5c5SAndroid Build Coastguard Worker     }
3921*8975f5c5SAndroid Build Coastguard Worker 
3922*8975f5c5SAndroid Build Coastguard Worker     // Mark uniform blocks as _not_ dirty. When an executable changes, the backends should already
3923*8975f5c5SAndroid Build Coastguard Worker     // reprocess all uniform blocks.  These dirty bits only track what's made dirty afterwards.
3924*8975f5c5SAndroid Build Coastguard Worker     mDirtyUniformBlocks.reset();
3925*8975f5c5SAndroid Build Coastguard Worker 
3926*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
3927*8975f5c5SAndroid Build Coastguard Worker }
3928*8975f5c5SAndroid Build Coastguard Worker 
setTextureDirty(size_t textureUnitIndex)3929*8975f5c5SAndroid Build Coastguard Worker void State::setTextureDirty(size_t textureUnitIndex)
3930*8975f5c5SAndroid Build Coastguard Worker {
3931*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_TEXTURES);
3932*8975f5c5SAndroid Build Coastguard Worker     mDirtyTextures.set(textureUnitIndex);
3933*8975f5c5SAndroid Build Coastguard Worker }
3934*8975f5c5SAndroid Build Coastguard Worker 
setSamplerDirty(size_t samplerIndex)3935*8975f5c5SAndroid Build Coastguard Worker void State::setSamplerDirty(size_t samplerIndex)
3936*8975f5c5SAndroid Build Coastguard Worker {
3937*8975f5c5SAndroid Build Coastguard Worker     mDirtyObjects.set(state::DIRTY_OBJECT_SAMPLERS);
3938*8975f5c5SAndroid Build Coastguard Worker     mDirtySamplers.set(samplerIndex);
3939*8975f5c5SAndroid Build Coastguard Worker }
3940*8975f5c5SAndroid Build Coastguard Worker 
setImageUnit(const Context * context,size_t unit,Texture * texture,GLint level,GLboolean layered,GLint layer,GLenum access,GLenum format)3941*8975f5c5SAndroid Build Coastguard Worker void State::setImageUnit(const Context *context,
3942*8975f5c5SAndroid Build Coastguard Worker                          size_t unit,
3943*8975f5c5SAndroid Build Coastguard Worker                          Texture *texture,
3944*8975f5c5SAndroid Build Coastguard Worker                          GLint level,
3945*8975f5c5SAndroid Build Coastguard Worker                          GLboolean layered,
3946*8975f5c5SAndroid Build Coastguard Worker                          GLint layer,
3947*8975f5c5SAndroid Build Coastguard Worker                          GLenum access,
3948*8975f5c5SAndroid Build Coastguard Worker                          GLenum format)
3949*8975f5c5SAndroid Build Coastguard Worker {
3950*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!mImageUnits.empty());
3951*8975f5c5SAndroid Build Coastguard Worker 
3952*8975f5c5SAndroid Build Coastguard Worker     ImageUnit &imageUnit = mImageUnits[unit];
3953*8975f5c5SAndroid Build Coastguard Worker 
3954*8975f5c5SAndroid Build Coastguard Worker     if (texture)
3955*8975f5c5SAndroid Build Coastguard Worker     {
3956*8975f5c5SAndroid Build Coastguard Worker         texture->onBindAsImageTexture();
3957*8975f5c5SAndroid Build Coastguard Worker     }
3958*8975f5c5SAndroid Build Coastguard Worker     imageUnit.texture.set(context, texture);
3959*8975f5c5SAndroid Build Coastguard Worker     imageUnit.level   = level;
3960*8975f5c5SAndroid Build Coastguard Worker     imageUnit.layered = layered;
3961*8975f5c5SAndroid Build Coastguard Worker     imageUnit.layer   = layer;
3962*8975f5c5SAndroid Build Coastguard Worker     imageUnit.access  = access;
3963*8975f5c5SAndroid Build Coastguard Worker     imageUnit.format  = format;
3964*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_IMAGE_BINDINGS);
3965*8975f5c5SAndroid Build Coastguard Worker 
3966*8975f5c5SAndroid Build Coastguard Worker     onImageStateChange(context, unit);
3967*8975f5c5SAndroid Build Coastguard Worker }
3968*8975f5c5SAndroid Build Coastguard Worker 
setMaxShaderCompilerThreads(GLuint count)3969*8975f5c5SAndroid Build Coastguard Worker void State::setMaxShaderCompilerThreads(GLuint count)
3970*8975f5c5SAndroid Build Coastguard Worker {
3971*8975f5c5SAndroid Build Coastguard Worker     mMaxShaderCompilerThreads = count;
3972*8975f5c5SAndroid Build Coastguard Worker }
3973*8975f5c5SAndroid Build Coastguard Worker 
3974*8975f5c5SAndroid Build Coastguard Worker // Handle a dirty texture event.
onActiveTextureChange(const Context * context,size_t textureUnit)3975*8975f5c5SAndroid Build Coastguard Worker void State::onActiveTextureChange(const Context *context, size_t textureUnit)
3976*8975f5c5SAndroid Build Coastguard Worker {
3977*8975f5c5SAndroid Build Coastguard Worker     if (mExecutable)
3978*8975f5c5SAndroid Build Coastguard Worker     {
3979*8975f5c5SAndroid Build Coastguard Worker         TextureType type       = mExecutable->getActiveSamplerTypes()[textureUnit];
3980*8975f5c5SAndroid Build Coastguard Worker         Texture *activeTexture = (type != TextureType::InvalidEnum)
3981*8975f5c5SAndroid Build Coastguard Worker                                      ? getTextureForActiveSampler(type, textureUnit)
3982*8975f5c5SAndroid Build Coastguard Worker                                      : nullptr;
3983*8975f5c5SAndroid Build Coastguard Worker         updateTextureBinding(context, textureUnit, activeTexture);
3984*8975f5c5SAndroid Build Coastguard Worker 
3985*8975f5c5SAndroid Build Coastguard Worker         mExecutable->onStateChange(angle::SubjectMessage::ProgramTextureOrImageBindingChanged);
3986*8975f5c5SAndroid Build Coastguard Worker     }
3987*8975f5c5SAndroid Build Coastguard Worker }
3988*8975f5c5SAndroid Build Coastguard Worker 
onActiveTextureStateChange(const Context * context,size_t textureUnit)3989*8975f5c5SAndroid Build Coastguard Worker void State::onActiveTextureStateChange(const Context *context, size_t textureUnit)
3990*8975f5c5SAndroid Build Coastguard Worker {
3991*8975f5c5SAndroid Build Coastguard Worker     if (mExecutable)
3992*8975f5c5SAndroid Build Coastguard Worker     {
3993*8975f5c5SAndroid Build Coastguard Worker         TextureType type       = mExecutable->getActiveSamplerTypes()[textureUnit];
3994*8975f5c5SAndroid Build Coastguard Worker         Texture *activeTexture = (type != TextureType::InvalidEnum)
3995*8975f5c5SAndroid Build Coastguard Worker                                      ? getTextureForActiveSampler(type, textureUnit)
3996*8975f5c5SAndroid Build Coastguard Worker                                      : nullptr;
3997*8975f5c5SAndroid Build Coastguard Worker         setActiveTextureDirty(textureUnit, activeTexture);
3998*8975f5c5SAndroid Build Coastguard Worker     }
3999*8975f5c5SAndroid Build Coastguard Worker }
4000*8975f5c5SAndroid Build Coastguard Worker 
onImageStateChange(const Context * context,size_t unit)4001*8975f5c5SAndroid Build Coastguard Worker void State::onImageStateChange(const Context *context, size_t unit)
4002*8975f5c5SAndroid Build Coastguard Worker {
4003*8975f5c5SAndroid Build Coastguard Worker     if (mExecutable)
4004*8975f5c5SAndroid Build Coastguard Worker     {
4005*8975f5c5SAndroid Build Coastguard Worker         const ImageUnit &image = mImageUnits[unit];
4006*8975f5c5SAndroid Build Coastguard Worker 
4007*8975f5c5SAndroid Build Coastguard Worker         // Have nothing to do here if no texture bound
4008*8975f5c5SAndroid Build Coastguard Worker         if (!image.texture.get())
4009*8975f5c5SAndroid Build Coastguard Worker             return;
4010*8975f5c5SAndroid Build Coastguard Worker 
4011*8975f5c5SAndroid Build Coastguard Worker         if (image.texture->hasAnyDirtyBit())
4012*8975f5c5SAndroid Build Coastguard Worker         {
4013*8975f5c5SAndroid Build Coastguard Worker             mDirtyImages.set(unit);
4014*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_IMAGES);
4015*8975f5c5SAndroid Build Coastguard Worker         }
4016*8975f5c5SAndroid Build Coastguard Worker 
4017*8975f5c5SAndroid Build Coastguard Worker         if (isRobustResourceInitEnabled() && image.texture->initState() == InitState::MayNeedInit)
4018*8975f5c5SAndroid Build Coastguard Worker         {
4019*8975f5c5SAndroid Build Coastguard Worker             mDirtyObjects.set(state::DIRTY_OBJECT_IMAGES_INIT);
4020*8975f5c5SAndroid Build Coastguard Worker         }
4021*8975f5c5SAndroid Build Coastguard Worker 
4022*8975f5c5SAndroid Build Coastguard Worker         mExecutable->onStateChange(angle::SubjectMessage::ProgramTextureOrImageBindingChanged);
4023*8975f5c5SAndroid Build Coastguard Worker     }
4024*8975f5c5SAndroid Build Coastguard Worker }
4025*8975f5c5SAndroid Build Coastguard Worker 
onUniformBufferStateChange(size_t uniformBufferIndex)4026*8975f5c5SAndroid Build Coastguard Worker void State::onUniformBufferStateChange(size_t uniformBufferIndex)
4027*8975f5c5SAndroid Build Coastguard Worker {
4028*8975f5c5SAndroid Build Coastguard Worker     if (mExecutable)
4029*8975f5c5SAndroid Build Coastguard Worker     {
4030*8975f5c5SAndroid Build Coastguard Worker         // When a buffer at a given binding changes, set all blocks mapped to it dirty.
4031*8975f5c5SAndroid Build Coastguard Worker         mDirtyUniformBlocks |=
4032*8975f5c5SAndroid Build Coastguard Worker             mExecutable->getUniformBufferBlocksMappedToBinding(uniformBufferIndex);
4033*8975f5c5SAndroid Build Coastguard Worker     }
4034*8975f5c5SAndroid Build Coastguard Worker     // This could be represented by a different dirty bit. Using the same one keeps it simple.
4035*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
4036*8975f5c5SAndroid Build Coastguard Worker }
4037*8975f5c5SAndroid Build Coastguard Worker 
onAtomicCounterBufferStateChange(size_t atomicCounterBufferIndex)4038*8975f5c5SAndroid Build Coastguard Worker void State::onAtomicCounterBufferStateChange(size_t atomicCounterBufferIndex)
4039*8975f5c5SAndroid Build Coastguard Worker {
4040*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
4041*8975f5c5SAndroid Build Coastguard Worker }
4042*8975f5c5SAndroid Build Coastguard Worker 
onShaderStorageBufferStateChange(size_t shaderStorageBufferIndex)4043*8975f5c5SAndroid Build Coastguard Worker void State::onShaderStorageBufferStateChange(size_t shaderStorageBufferIndex)
4044*8975f5c5SAndroid Build Coastguard Worker {
4045*8975f5c5SAndroid Build Coastguard Worker     mDirtyBits.set(state::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
4046*8975f5c5SAndroid Build Coastguard Worker }
4047*8975f5c5SAndroid Build Coastguard Worker 
initializeForCapture(const Context * context)4048*8975f5c5SAndroid Build Coastguard Worker void State::initializeForCapture(const Context *context)
4049*8975f5c5SAndroid Build Coastguard Worker {
4050*8975f5c5SAndroid Build Coastguard Worker     mPrivateState.initializeForCapture(context);
4051*8975f5c5SAndroid Build Coastguard Worker 
4052*8975f5c5SAndroid Build Coastguard Worker     // This little kludge gets around the frame capture "constness". It should be safe because
4053*8975f5c5SAndroid Build Coastguard Worker     // nothing in the context is modified in a non-compatible way during capture.
4054*8975f5c5SAndroid Build Coastguard Worker     Context *mutableContext = const_cast<Context *>(context);
4055*8975f5c5SAndroid Build Coastguard Worker     initialize(mutableContext);
4056*8975f5c5SAndroid Build Coastguard Worker }
4057*8975f5c5SAndroid Build Coastguard Worker 
4058*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
4059