xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/ContextGL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 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 // ContextGL:
7*8975f5c5SAndroid Build Coastguard Worker //   OpenGL-specific functionality associated with a GL Context.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ContextGL.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.inl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/PixelLocalStorage.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/OverlayImpl.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/BufferGL.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/CompilerGL.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/FenceNVGL.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/FramebufferGL.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/FunctionsGL.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/MemoryObjectGL.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ProgramExecutableGL.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ProgramGL.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ProgramPipelineGL.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/QueryGL.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/RenderbufferGL.h"
27*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/RendererGL.h"
28*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/SamplerGL.h"
29*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/SemaphoreGL.h"
30*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ShaderGL.h"
31*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/StateManagerGL.h"
32*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/SyncGL.h"
33*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/TextureGL.h"
34*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/TransformFeedbackGL.h"
35*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/VertexArrayGL.h"
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker namespace rx
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker namespace
40*8975f5c5SAndroid Build Coastguard Worker {
GetDrawAdjustedInstanceCount(const gl::ProgramExecutable * executable)41*8975f5c5SAndroid Build Coastguard Worker GLsizei GetDrawAdjustedInstanceCount(const gl::ProgramExecutable *executable)
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     const bool usesMultiview = executable->usesMultiview();
44*8975f5c5SAndroid Build Coastguard Worker     return usesMultiview ? executable->getNumViews() : 0;
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker 
GetInstancedDrawAdjustedInstanceCount(const gl::ProgramExecutable * executable,GLsizei instanceCount)47*8975f5c5SAndroid Build Coastguard Worker GLsizei GetInstancedDrawAdjustedInstanceCount(const gl::ProgramExecutable *executable,
48*8975f5c5SAndroid Build Coastguard Worker                                               GLsizei instanceCount)
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker     GLsizei adjustedInstanceCount = instanceCount;
51*8975f5c5SAndroid Build Coastguard Worker     if (executable->usesMultiview())
52*8975f5c5SAndroid Build Coastguard Worker     {
53*8975f5c5SAndroid Build Coastguard Worker         adjustedInstanceCount *= executable->getNumViews();
54*8975f5c5SAndroid Build Coastguard Worker     }
55*8975f5c5SAndroid Build Coastguard Worker     return adjustedInstanceCount;
56*8975f5c5SAndroid Build Coastguard Worker }
57*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
58*8975f5c5SAndroid Build Coastguard Worker 
ContextGL(const gl::State & state,gl::ErrorSet * errorSet,const std::shared_ptr<RendererGL> & renderer,RobustnessVideoMemoryPurgeStatus robustnessVideoMemoryPurgeStatus)59*8975f5c5SAndroid Build Coastguard Worker ContextGL::ContextGL(const gl::State &state,
60*8975f5c5SAndroid Build Coastguard Worker                      gl::ErrorSet *errorSet,
61*8975f5c5SAndroid Build Coastguard Worker                      const std::shared_ptr<RendererGL> &renderer,
62*8975f5c5SAndroid Build Coastguard Worker                      RobustnessVideoMemoryPurgeStatus robustnessVideoMemoryPurgeStatus)
63*8975f5c5SAndroid Build Coastguard Worker     : ContextImpl(state, errorSet),
64*8975f5c5SAndroid Build Coastguard Worker       mRenderer(renderer),
65*8975f5c5SAndroid Build Coastguard Worker       mRobustnessVideoMemoryPurgeStatus(robustnessVideoMemoryPurgeStatus)
66*8975f5c5SAndroid Build Coastguard Worker {}
67*8975f5c5SAndroid Build Coastguard Worker 
~ContextGL()68*8975f5c5SAndroid Build Coastguard Worker ContextGL::~ContextGL() {}
69*8975f5c5SAndroid Build Coastguard Worker 
initialize(const angle::ImageLoadContext & imageLoadContext)70*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::initialize(const angle::ImageLoadContext &imageLoadContext)
71*8975f5c5SAndroid Build Coastguard Worker {
72*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
73*8975f5c5SAndroid Build Coastguard Worker }
74*8975f5c5SAndroid Build Coastguard Worker 
createCompiler()75*8975f5c5SAndroid Build Coastguard Worker CompilerImpl *ContextGL::createCompiler()
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker     return new CompilerGL(this);
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker 
createShader(const gl::ShaderState & data)80*8975f5c5SAndroid Build Coastguard Worker ShaderImpl *ContextGL::createShader(const gl::ShaderState &data)
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
83*8975f5c5SAndroid Build Coastguard Worker     GLuint shader                = functions->createShader(ToGLenum(data.getShaderType()));
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     return new ShaderGL(data, shader);
86*8975f5c5SAndroid Build Coastguard Worker }
87*8975f5c5SAndroid Build Coastguard Worker 
createProgram(const gl::ProgramState & data)88*8975f5c5SAndroid Build Coastguard Worker ProgramImpl *ContextGL::createProgram(const gl::ProgramState &data)
89*8975f5c5SAndroid Build Coastguard Worker {
90*8975f5c5SAndroid Build Coastguard Worker     return new ProgramGL(data, getFunctions(), getFeaturesGL(), getStateManager(), mRenderer);
91*8975f5c5SAndroid Build Coastguard Worker }
92*8975f5c5SAndroid Build Coastguard Worker 
createProgramExecutable(const gl::ProgramExecutable * executable)93*8975f5c5SAndroid Build Coastguard Worker ProgramExecutableImpl *ContextGL::createProgramExecutable(const gl::ProgramExecutable *executable)
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker     return new ProgramExecutableGL(executable);
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker 
createFramebuffer(const gl::FramebufferState & data)98*8975f5c5SAndroid Build Coastguard Worker FramebufferImpl *ContextGL::createFramebuffer(const gl::FramebufferState &data)
99*8975f5c5SAndroid Build Coastguard Worker {
100*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *funcs = getFunctions();
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker     GLuint fbo = 0;
103*8975f5c5SAndroid Build Coastguard Worker     if (!data.isDefault())
104*8975f5c5SAndroid Build Coastguard Worker     {
105*8975f5c5SAndroid Build Coastguard Worker         funcs->genFramebuffers(1, &fbo);
106*8975f5c5SAndroid Build Coastguard Worker     }
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     return new FramebufferGL(data, fbo, false);
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
createTexture(const gl::TextureState & state)111*8975f5c5SAndroid Build Coastguard Worker TextureImpl *ContextGL::createTexture(const gl::TextureState &state)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
114*8975f5c5SAndroid Build Coastguard Worker     StateManagerGL *stateManager = getStateManager();
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker     GLuint texture = 0;
117*8975f5c5SAndroid Build Coastguard Worker     functions->genTextures(1, &texture);
118*8975f5c5SAndroid Build Coastguard Worker     stateManager->bindTexture(state.getType(), texture);
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     return new TextureGL(state, texture);
121*8975f5c5SAndroid Build Coastguard Worker }
122*8975f5c5SAndroid Build Coastguard Worker 
createRenderbuffer(const gl::RenderbufferState & state)123*8975f5c5SAndroid Build Coastguard Worker RenderbufferImpl *ContextGL::createRenderbuffer(const gl::RenderbufferState &state)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
126*8975f5c5SAndroid Build Coastguard Worker     StateManagerGL *stateManager = getStateManager();
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     GLuint renderbuffer = 0;
129*8975f5c5SAndroid Build Coastguard Worker     functions->genRenderbuffers(1, &renderbuffer);
130*8975f5c5SAndroid Build Coastguard Worker     stateManager->bindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker     return new RenderbufferGL(state, renderbuffer);
133*8975f5c5SAndroid Build Coastguard Worker }
134*8975f5c5SAndroid Build Coastguard Worker 
createBuffer(const gl::BufferState & state)135*8975f5c5SAndroid Build Coastguard Worker BufferImpl *ContextGL::createBuffer(const gl::BufferState &state)
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker     GLuint buffer = 0;
140*8975f5c5SAndroid Build Coastguard Worker     functions->genBuffers(1, &buffer);
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     return new BufferGL(state, buffer);
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
createVertexArray(const gl::VertexArrayState & data)145*8975f5c5SAndroid Build Coastguard Worker VertexArrayImpl *ContextGL::createVertexArray(const gl::VertexArrayState &data)
146*8975f5c5SAndroid Build Coastguard Worker {
147*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions      = getFunctions();
148*8975f5c5SAndroid Build Coastguard Worker     const angle::FeaturesGL &features = getFeaturesGL();
149*8975f5c5SAndroid Build Coastguard Worker 
150*8975f5c5SAndroid Build Coastguard Worker     // Use the shared default vertex array when forced to for workarounds
151*8975f5c5SAndroid Build Coastguard Worker     // (syncAllVertexArraysToDefault) or for the frontend default vertex array so that client data
152*8975f5c5SAndroid Build Coastguard Worker     // can be used directly
153*8975f5c5SAndroid Build Coastguard Worker     // Disable on external contexts so that the default VAO is not modified by both ANGLE and the
154*8975f5c5SAndroid Build Coastguard Worker     // external user.
155*8975f5c5SAndroid Build Coastguard Worker     if (features.syncAllVertexArraysToDefault.enabled ||
156*8975f5c5SAndroid Build Coastguard Worker         (features.syncDefaultVertexArraysToDefault.enabled && data.isDefault() &&
157*8975f5c5SAndroid Build Coastguard Worker          mState.areClientArraysEnabled()))
158*8975f5c5SAndroid Build Coastguard Worker     {
159*8975f5c5SAndroid Build Coastguard Worker         StateManagerGL *stateManager = getStateManager();
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker         return new VertexArrayGL(data, stateManager->getDefaultVAO(),
162*8975f5c5SAndroid Build Coastguard Worker                                  stateManager->getDefaultVAOState());
163*8975f5c5SAndroid Build Coastguard Worker     }
164*8975f5c5SAndroid Build Coastguard Worker     else
165*8975f5c5SAndroid Build Coastguard Worker     {
166*8975f5c5SAndroid Build Coastguard Worker         GLuint vao = 0;
167*8975f5c5SAndroid Build Coastguard Worker         functions->genVertexArrays(1, &vao);
168*8975f5c5SAndroid Build Coastguard Worker         return new VertexArrayGL(data, vao);
169*8975f5c5SAndroid Build Coastguard Worker     }
170*8975f5c5SAndroid Build Coastguard Worker }
171*8975f5c5SAndroid Build Coastguard Worker 
createQuery(gl::QueryType type)172*8975f5c5SAndroid Build Coastguard Worker QueryImpl *ContextGL::createQuery(gl::QueryType type)
173*8975f5c5SAndroid Build Coastguard Worker {
174*8975f5c5SAndroid Build Coastguard Worker     switch (type)
175*8975f5c5SAndroid Build Coastguard Worker     {
176*8975f5c5SAndroid Build Coastguard Worker         case gl::QueryType::CommandsCompleted:
177*8975f5c5SAndroid Build Coastguard Worker             return new SyncQueryGL(type, getFunctions());
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker         default:
180*8975f5c5SAndroid Build Coastguard Worker             return new StandardQueryGL(type, getFunctions(), getStateManager());
181*8975f5c5SAndroid Build Coastguard Worker     }
182*8975f5c5SAndroid Build Coastguard Worker }
183*8975f5c5SAndroid Build Coastguard Worker 
createFenceNV()184*8975f5c5SAndroid Build Coastguard Worker FenceNVImpl *ContextGL::createFenceNV()
185*8975f5c5SAndroid Build Coastguard Worker {
186*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
187*8975f5c5SAndroid Build Coastguard Worker     if (FenceNVGL::Supported(functions))
188*8975f5c5SAndroid Build Coastguard Worker     {
189*8975f5c5SAndroid Build Coastguard Worker         return new FenceNVGL(functions);
190*8975f5c5SAndroid Build Coastguard Worker     }
191*8975f5c5SAndroid Build Coastguard Worker     else
192*8975f5c5SAndroid Build Coastguard Worker     {
193*8975f5c5SAndroid Build Coastguard Worker         ASSERT(FenceNVSyncGL::Supported(functions));
194*8975f5c5SAndroid Build Coastguard Worker         return new FenceNVSyncGL(functions);
195*8975f5c5SAndroid Build Coastguard Worker     }
196*8975f5c5SAndroid Build Coastguard Worker }
197*8975f5c5SAndroid Build Coastguard Worker 
createSync()198*8975f5c5SAndroid Build Coastguard Worker SyncImpl *ContextGL::createSync()
199*8975f5c5SAndroid Build Coastguard Worker {
200*8975f5c5SAndroid Build Coastguard Worker     return new SyncGL(getFunctions());
201*8975f5c5SAndroid Build Coastguard Worker }
202*8975f5c5SAndroid Build Coastguard Worker 
createTransformFeedback(const gl::TransformFeedbackState & state)203*8975f5c5SAndroid Build Coastguard Worker TransformFeedbackImpl *ContextGL::createTransformFeedback(const gl::TransformFeedbackState &state)
204*8975f5c5SAndroid Build Coastguard Worker {
205*8975f5c5SAndroid Build Coastguard Worker     return new TransformFeedbackGL(state, getFunctions(), getStateManager());
206*8975f5c5SAndroid Build Coastguard Worker }
207*8975f5c5SAndroid Build Coastguard Worker 
createSampler(const gl::SamplerState & state)208*8975f5c5SAndroid Build Coastguard Worker SamplerImpl *ContextGL::createSampler(const gl::SamplerState &state)
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker     return new SamplerGL(state, getFunctions(), getStateManager());
211*8975f5c5SAndroid Build Coastguard Worker }
212*8975f5c5SAndroid Build Coastguard Worker 
createProgramPipeline(const gl::ProgramPipelineState & data)213*8975f5c5SAndroid Build Coastguard Worker ProgramPipelineImpl *ContextGL::createProgramPipeline(const gl::ProgramPipelineState &data)
214*8975f5c5SAndroid Build Coastguard Worker {
215*8975f5c5SAndroid Build Coastguard Worker     return new ProgramPipelineGL(data, getFunctions());
216*8975f5c5SAndroid Build Coastguard Worker }
217*8975f5c5SAndroid Build Coastguard Worker 
createMemoryObject()218*8975f5c5SAndroid Build Coastguard Worker MemoryObjectImpl *ContextGL::createMemoryObject()
219*8975f5c5SAndroid Build Coastguard Worker {
220*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker     GLuint memoryObject = 0;
223*8975f5c5SAndroid Build Coastguard Worker     functions->createMemoryObjectsEXT(1, &memoryObject);
224*8975f5c5SAndroid Build Coastguard Worker 
225*8975f5c5SAndroid Build Coastguard Worker     return new MemoryObjectGL(memoryObject);
226*8975f5c5SAndroid Build Coastguard Worker }
227*8975f5c5SAndroid Build Coastguard Worker 
createSemaphore()228*8975f5c5SAndroid Build Coastguard Worker SemaphoreImpl *ContextGL::createSemaphore()
229*8975f5c5SAndroid Build Coastguard Worker {
230*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     GLuint semaphore = 0;
233*8975f5c5SAndroid Build Coastguard Worker     functions->genSemaphoresEXT(1, &semaphore);
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker     return new SemaphoreGL(semaphore);
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker 
createOverlay(const gl::OverlayState & state)238*8975f5c5SAndroid Build Coastguard Worker OverlayImpl *ContextGL::createOverlay(const gl::OverlayState &state)
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker     // Not implemented.
241*8975f5c5SAndroid Build Coastguard Worker     return new OverlayImpl(state);
242*8975f5c5SAndroid Build Coastguard Worker }
243*8975f5c5SAndroid Build Coastguard Worker 
flush(const gl::Context * context)244*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::flush(const gl::Context *context)
245*8975f5c5SAndroid Build Coastguard Worker {
246*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->flush();
247*8975f5c5SAndroid Build Coastguard Worker }
248*8975f5c5SAndroid Build Coastguard Worker 
finish(const gl::Context * context)249*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::finish(const gl::Context *context)
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->finish();
252*8975f5c5SAndroid Build Coastguard Worker }
253*8975f5c5SAndroid Build Coastguard Worker 
setDrawArraysState(const gl::Context * context,GLint first,GLsizei count,GLsizei instanceCount)254*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result ContextGL::setDrawArraysState(const gl::Context *context,
255*8975f5c5SAndroid Build Coastguard Worker                                                          GLint first,
256*8975f5c5SAndroid Build Coastguard Worker                                                          GLsizei count,
257*8975f5c5SAndroid Build Coastguard Worker                                                          GLsizei instanceCount)
258*8975f5c5SAndroid Build Coastguard Worker {
259*8975f5c5SAndroid Build Coastguard Worker     const angle::FeaturesGL &features = getFeaturesGL();
260*8975f5c5SAndroid Build Coastguard Worker     if (context->getStateCache().hasAnyActiveClientAttrib() ||
261*8975f5c5SAndroid Build Coastguard Worker         (features.shiftInstancedArrayDataWithOffset.enabled && first > 0))
262*8975f5c5SAndroid Build Coastguard Worker     {
263*8975f5c5SAndroid Build Coastguard Worker         const gl::State &glState                = context->getState();
264*8975f5c5SAndroid Build Coastguard Worker         const gl::ProgramExecutable *executable = getState().getProgramExecutable();
265*8975f5c5SAndroid Build Coastguard Worker         const gl::VertexArray *vao              = glState.getVertexArray();
266*8975f5c5SAndroid Build Coastguard Worker         const VertexArrayGL *vaoGL              = GetImplAs<VertexArrayGL>(vao);
267*8975f5c5SAndroid Build Coastguard Worker 
268*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(vaoGL->syncClientSideData(context, executable->getActiveAttribLocationsMask(),
269*8975f5c5SAndroid Build Coastguard Worker                                             first, count, instanceCount));
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_STATE_VALIDATION_ENABLED)
272*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(vaoGL->validateState(context));
273*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_STATE_VALIDATION_ENABLED
274*8975f5c5SAndroid Build Coastguard Worker     }
275*8975f5c5SAndroid Build Coastguard Worker     else if (features.shiftInstancedArrayDataWithOffset.enabled && first == 0)
276*8975f5c5SAndroid Build Coastguard Worker     {
277*8975f5c5SAndroid Build Coastguard Worker         // There could be previous draw call that has modified the attributes
278*8975f5c5SAndroid Build Coastguard Worker         // Instead of forcefully streaming attributes, we just rebind the original ones
279*8975f5c5SAndroid Build Coastguard Worker         const gl::State &glState   = context->getState();
280*8975f5c5SAndroid Build Coastguard Worker         const gl::VertexArray *vao = glState.getVertexArray();
281*8975f5c5SAndroid Build Coastguard Worker         const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
282*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(vaoGL->recoverForcedStreamingAttributesForDrawArraysInstanced(context));
283*8975f5c5SAndroid Build Coastguard Worker     }
284*8975f5c5SAndroid Build Coastguard Worker 
285*8975f5c5SAndroid Build Coastguard Worker     if (features.setPrimitiveRestartFixedIndexForDrawArrays.enabled)
286*8975f5c5SAndroid Build Coastguard Worker     {
287*8975f5c5SAndroid Build Coastguard Worker         StateManagerGL *stateManager           = getStateManager();
288*8975f5c5SAndroid Build Coastguard Worker         constexpr GLuint primitiveRestartIndex = gl::GetPrimitiveRestartIndexFromType<GLuint>();
289*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(stateManager->setPrimitiveRestartIndex(context, primitiveRestartIndex));
290*8975f5c5SAndroid Build Coastguard Worker     }
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
293*8975f5c5SAndroid Build Coastguard Worker }
294*8975f5c5SAndroid Build Coastguard Worker 
setDrawElementsState(const gl::Context * context,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instanceCount,const void ** outIndices)295*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result ContextGL::setDrawElementsState(const gl::Context *context,
296*8975f5c5SAndroid Build Coastguard Worker                                                            GLsizei count,
297*8975f5c5SAndroid Build Coastguard Worker                                                            gl::DrawElementsType type,
298*8975f5c5SAndroid Build Coastguard Worker                                                            const void *indices,
299*8975f5c5SAndroid Build Coastguard Worker                                                            GLsizei instanceCount,
300*8975f5c5SAndroid Build Coastguard Worker                                                            const void **outIndices)
301*8975f5c5SAndroid Build Coastguard Worker {
302*8975f5c5SAndroid Build Coastguard Worker     const gl::State &glState                = context->getState();
303*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = getState().getProgramExecutable();
304*8975f5c5SAndroid Build Coastguard Worker     const gl::VertexArray *vao              = glState.getVertexArray();
305*8975f5c5SAndroid Build Coastguard Worker     const gl::StateCache &stateCache        = context->getStateCache();
306*8975f5c5SAndroid Build Coastguard Worker 
307*8975f5c5SAndroid Build Coastguard Worker     const angle::FeaturesGL &features = getFeaturesGL();
308*8975f5c5SAndroid Build Coastguard Worker     if (features.shiftInstancedArrayDataWithOffset.enabled)
309*8975f5c5SAndroid Build Coastguard Worker     {
310*8975f5c5SAndroid Build Coastguard Worker         // There might be instanced arrays that are forced streaming for drawArraysInstanced
311*8975f5c5SAndroid Build Coastguard Worker         // They cannot be ELEMENT_ARRAY_BUFFER
312*8975f5c5SAndroid Build Coastguard Worker         const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
313*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(vaoGL->recoverForcedStreamingAttributesForDrawArraysInstanced(context));
314*8975f5c5SAndroid Build Coastguard Worker     }
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker     if (stateCache.hasAnyActiveClientAttrib() || vao->getElementArrayBuffer() == nullptr)
317*8975f5c5SAndroid Build Coastguard Worker     {
318*8975f5c5SAndroid Build Coastguard Worker         const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
319*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(vaoGL->syncDrawElementsState(context, executable->getActiveAttribLocationsMask(),
320*8975f5c5SAndroid Build Coastguard Worker                                                count, type, indices, instanceCount,
321*8975f5c5SAndroid Build Coastguard Worker                                                glState.isPrimitiveRestartEnabled(), outIndices));
322*8975f5c5SAndroid Build Coastguard Worker     }
323*8975f5c5SAndroid Build Coastguard Worker     else
324*8975f5c5SAndroid Build Coastguard Worker     {
325*8975f5c5SAndroid Build Coastguard Worker         *outIndices = indices;
326*8975f5c5SAndroid Build Coastguard Worker     }
327*8975f5c5SAndroid Build Coastguard Worker 
328*8975f5c5SAndroid Build Coastguard Worker     if (glState.isPrimitiveRestartEnabled() && features.emulatePrimitiveRestartFixedIndex.enabled)
329*8975f5c5SAndroid Build Coastguard Worker     {
330*8975f5c5SAndroid Build Coastguard Worker         StateManagerGL *stateManager = getStateManager();
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker         GLuint primitiveRestartIndex = gl::GetPrimitiveRestartIndex(type);
333*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(stateManager->setPrimitiveRestartIndex(context, primitiveRestartIndex));
334*8975f5c5SAndroid Build Coastguard Worker     }
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_STATE_VALIDATION_ENABLED)
337*8975f5c5SAndroid Build Coastguard Worker     const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
338*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(vaoGL->validateState(context));
339*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_STATE_VALIDATION_ENABLED
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
342*8975f5c5SAndroid Build Coastguard Worker }
343*8975f5c5SAndroid Build Coastguard Worker 
drawArrays(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count)344*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawArrays(const gl::Context *context,
345*8975f5c5SAndroid Build Coastguard Worker                                     gl::PrimitiveMode mode,
346*8975f5c5SAndroid Build Coastguard Worker                                     GLint first,
347*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei count)
348*8975f5c5SAndroid Build Coastguard Worker {
349*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = context->getState().getProgramExecutable();
350*8975f5c5SAndroid Build Coastguard Worker     const GLsizei instanceCount             = GetDrawAdjustedInstanceCount(executable);
351*8975f5c5SAndroid Build Coastguard Worker 
352*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_STATE_VALIDATION_ENABLED)
353*8975f5c5SAndroid Build Coastguard Worker     validateState();
354*8975f5c5SAndroid Build Coastguard Worker #endif
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawArraysState(context, first, count, instanceCount));
357*8975f5c5SAndroid Build Coastguard Worker     if (!executable->usesMultiview())
358*8975f5c5SAndroid Build Coastguard Worker     {
359*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawArrays(ToGLenum(mode), first, count));
360*8975f5c5SAndroid Build Coastguard Worker     }
361*8975f5c5SAndroid Build Coastguard Worker     else
362*8975f5c5SAndroid Build Coastguard Worker     {
363*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawArraysInstanced(ToGLenum(mode), first, count,
364*8975f5c5SAndroid Build Coastguard Worker                                                                   instanceCount));
365*8975f5c5SAndroid Build Coastguard Worker     }
366*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
367*8975f5c5SAndroid Build Coastguard Worker 
368*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
369*8975f5c5SAndroid Build Coastguard Worker }
370*8975f5c5SAndroid Build Coastguard Worker 
drawArraysInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount)371*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawArraysInstanced(const gl::Context *context,
372*8975f5c5SAndroid Build Coastguard Worker                                              gl::PrimitiveMode mode,
373*8975f5c5SAndroid Build Coastguard Worker                                              GLint first,
374*8975f5c5SAndroid Build Coastguard Worker                                              GLsizei count,
375*8975f5c5SAndroid Build Coastguard Worker                                              GLsizei instanceCount)
376*8975f5c5SAndroid Build Coastguard Worker {
377*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = context->getState().getProgramExecutable();
378*8975f5c5SAndroid Build Coastguard Worker     const GLsizei adjustedInstanceCount =
379*8975f5c5SAndroid Build Coastguard Worker         GetInstancedDrawAdjustedInstanceCount(executable, instanceCount);
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawArraysState(context, first, count, adjustedInstanceCount));
382*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY(context, getFunctions()->drawArraysInstanced(ToGLenum(mode), first, count,
383*8975f5c5SAndroid Build Coastguard Worker                                                               adjustedInstanceCount));
384*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
385*8975f5c5SAndroid Build Coastguard Worker 
386*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
387*8975f5c5SAndroid Build Coastguard Worker }
388*8975f5c5SAndroid Build Coastguard Worker 
updateAttributesForBaseInstance(GLuint baseInstance)389*8975f5c5SAndroid Build Coastguard Worker gl::AttributesMask ContextGL::updateAttributesForBaseInstance(GLuint baseInstance)
390*8975f5c5SAndroid Build Coastguard Worker {
391*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = getState().getProgramExecutable();
392*8975f5c5SAndroid Build Coastguard Worker     gl::AttributesMask attribToUpdateMask;
393*8975f5c5SAndroid Build Coastguard Worker 
394*8975f5c5SAndroid Build Coastguard Worker     if (baseInstance != 0)
395*8975f5c5SAndroid Build Coastguard Worker     {
396*8975f5c5SAndroid Build Coastguard Worker         const FunctionsGL *functions = getFunctions();
397*8975f5c5SAndroid Build Coastguard Worker         const auto &attribs          = mState.getVertexArray()->getVertexAttributes();
398*8975f5c5SAndroid Build Coastguard Worker         const auto &bindings         = mState.getVertexArray()->getVertexBindings();
399*8975f5c5SAndroid Build Coastguard Worker         for (GLuint attribIndex = 0; attribIndex < attribs.size(); attribIndex++)
400*8975f5c5SAndroid Build Coastguard Worker         {
401*8975f5c5SAndroid Build Coastguard Worker             const gl::VertexAttribute &attrib = attribs[attribIndex];
402*8975f5c5SAndroid Build Coastguard Worker             const gl::VertexBinding &binding  = bindings[attrib.bindingIndex];
403*8975f5c5SAndroid Build Coastguard Worker             if (executable->isAttribLocationActive(attribIndex) && binding.getDivisor() != 0)
404*8975f5c5SAndroid Build Coastguard Worker             {
405*8975f5c5SAndroid Build Coastguard Worker                 attribToUpdateMask.set(attribIndex);
406*8975f5c5SAndroid Build Coastguard Worker                 const char *p             = static_cast<const char *>(attrib.pointer);
407*8975f5c5SAndroid Build Coastguard Worker                 const size_t sourceStride = gl::ComputeVertexAttributeStride(attrib, binding);
408*8975f5c5SAndroid Build Coastguard Worker                 const void *newPointer    = p + sourceStride * baseInstance;
409*8975f5c5SAndroid Build Coastguard Worker 
410*8975f5c5SAndroid Build Coastguard Worker                 const BufferGL *buffer = GetImplAs<BufferGL>(binding.getBuffer().get());
411*8975f5c5SAndroid Build Coastguard Worker                 // We often stream data from scratch buffers when client side data is being used
412*8975f5c5SAndroid Build Coastguard Worker                 // and that information is in VertexArrayGL.
413*8975f5c5SAndroid Build Coastguard Worker                 // Assert that the buffer is non-null because this case isn't handled.
414*8975f5c5SAndroid Build Coastguard Worker                 ASSERT(buffer);
415*8975f5c5SAndroid Build Coastguard Worker                 getStateManager()->bindBuffer(gl::BufferBinding::Array, buffer->getBufferID());
416*8975f5c5SAndroid Build Coastguard Worker                 if (attrib.format->isPureInt())
417*8975f5c5SAndroid Build Coastguard Worker                 {
418*8975f5c5SAndroid Build Coastguard Worker                     functions->vertexAttribIPointer(attribIndex, attrib.format->channelCount,
419*8975f5c5SAndroid Build Coastguard Worker                                                     gl::ToGLenum(attrib.format->vertexAttribType),
420*8975f5c5SAndroid Build Coastguard Worker                                                     attrib.vertexAttribArrayStride, newPointer);
421*8975f5c5SAndroid Build Coastguard Worker                 }
422*8975f5c5SAndroid Build Coastguard Worker                 else
423*8975f5c5SAndroid Build Coastguard Worker                 {
424*8975f5c5SAndroid Build Coastguard Worker                     functions->vertexAttribPointer(attribIndex, attrib.format->channelCount,
425*8975f5c5SAndroid Build Coastguard Worker                                                    gl::ToGLenum(attrib.format->vertexAttribType),
426*8975f5c5SAndroid Build Coastguard Worker                                                    attrib.format->isNorm(),
427*8975f5c5SAndroid Build Coastguard Worker                                                    attrib.vertexAttribArrayStride, newPointer);
428*8975f5c5SAndroid Build Coastguard Worker                 }
429*8975f5c5SAndroid Build Coastguard Worker             }
430*8975f5c5SAndroid Build Coastguard Worker         }
431*8975f5c5SAndroid Build Coastguard Worker     }
432*8975f5c5SAndroid Build Coastguard Worker 
433*8975f5c5SAndroid Build Coastguard Worker     return attribToUpdateMask;
434*8975f5c5SAndroid Build Coastguard Worker }
435*8975f5c5SAndroid Build Coastguard Worker 
resetUpdatedAttributes(gl::AttributesMask attribMask)436*8975f5c5SAndroid Build Coastguard Worker void ContextGL::resetUpdatedAttributes(gl::AttributesMask attribMask)
437*8975f5c5SAndroid Build Coastguard Worker {
438*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
439*8975f5c5SAndroid Build Coastguard Worker     for (size_t attribIndex : attribMask)
440*8975f5c5SAndroid Build Coastguard Worker     {
441*8975f5c5SAndroid Build Coastguard Worker         const gl::VertexAttribute &attrib =
442*8975f5c5SAndroid Build Coastguard Worker             mState.getVertexArray()->getVertexAttributes()[attribIndex];
443*8975f5c5SAndroid Build Coastguard Worker         const gl::VertexBinding &binding =
444*8975f5c5SAndroid Build Coastguard Worker             (mState.getVertexArray()->getVertexBindings())[attrib.bindingIndex];
445*8975f5c5SAndroid Build Coastguard Worker         getStateManager()->bindBuffer(
446*8975f5c5SAndroid Build Coastguard Worker             gl::BufferBinding::Array,
447*8975f5c5SAndroid Build Coastguard Worker             GetImplAs<BufferGL>(binding.getBuffer().get())->getBufferID());
448*8975f5c5SAndroid Build Coastguard Worker         if (attrib.format->isPureInt())
449*8975f5c5SAndroid Build Coastguard Worker         {
450*8975f5c5SAndroid Build Coastguard Worker             functions->vertexAttribIPointer(static_cast<GLuint>(attribIndex),
451*8975f5c5SAndroid Build Coastguard Worker                                             attrib.format->channelCount,
452*8975f5c5SAndroid Build Coastguard Worker                                             gl::ToGLenum(attrib.format->vertexAttribType),
453*8975f5c5SAndroid Build Coastguard Worker                                             attrib.vertexAttribArrayStride, attrib.pointer);
454*8975f5c5SAndroid Build Coastguard Worker         }
455*8975f5c5SAndroid Build Coastguard Worker         else
456*8975f5c5SAndroid Build Coastguard Worker         {
457*8975f5c5SAndroid Build Coastguard Worker             functions->vertexAttribPointer(
458*8975f5c5SAndroid Build Coastguard Worker                 static_cast<GLuint>(attribIndex), attrib.format->channelCount,
459*8975f5c5SAndroid Build Coastguard Worker                 gl::ToGLenum(attrib.format->vertexAttribType), attrib.format->isNorm(),
460*8975f5c5SAndroid Build Coastguard Worker                 attrib.vertexAttribArrayStride, attrib.pointer);
461*8975f5c5SAndroid Build Coastguard Worker         }
462*8975f5c5SAndroid Build Coastguard Worker     }
463*8975f5c5SAndroid Build Coastguard Worker }
464*8975f5c5SAndroid Build Coastguard Worker 
drawArraysInstancedBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount,GLuint baseInstance)465*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawArraysInstancedBaseInstance(const gl::Context *context,
466*8975f5c5SAndroid Build Coastguard Worker                                                          gl::PrimitiveMode mode,
467*8975f5c5SAndroid Build Coastguard Worker                                                          GLint first,
468*8975f5c5SAndroid Build Coastguard Worker                                                          GLsizei count,
469*8975f5c5SAndroid Build Coastguard Worker                                                          GLsizei instanceCount,
470*8975f5c5SAndroid Build Coastguard Worker                                                          GLuint baseInstance)
471*8975f5c5SAndroid Build Coastguard Worker {
472*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = context->getState().getProgramExecutable();
473*8975f5c5SAndroid Build Coastguard Worker     const GLsizei adjustedInstanceCount =
474*8975f5c5SAndroid Build Coastguard Worker         GetInstancedDrawAdjustedInstanceCount(executable, instanceCount);
475*8975f5c5SAndroid Build Coastguard Worker 
476*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawArraysState(context, first, count, adjustedInstanceCount));
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
479*8975f5c5SAndroid Build Coastguard Worker 
480*8975f5c5SAndroid Build Coastguard Worker     if (functions->drawArraysInstancedBaseInstance)
481*8975f5c5SAndroid Build Coastguard Worker     {
482*8975f5c5SAndroid Build Coastguard Worker         // GL 4.2+ or GL_EXT_base_instance
483*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context,
484*8975f5c5SAndroid Build Coastguard Worker                      functions->drawArraysInstancedBaseInstance(
485*8975f5c5SAndroid Build Coastguard Worker                          ToGLenum(mode), first, count, adjustedInstanceCount, baseInstance));
486*8975f5c5SAndroid Build Coastguard Worker     }
487*8975f5c5SAndroid Build Coastguard Worker     else
488*8975f5c5SAndroid Build Coastguard Worker     {
489*8975f5c5SAndroid Build Coastguard Worker         // GL 3.3+ or GLES 3.2+
490*8975f5c5SAndroid Build Coastguard Worker         // TODO(http://anglebug.com/42262554): This is a temporary solution by setting and resetting
491*8975f5c5SAndroid Build Coastguard Worker         // pointer offset calling vertexAttribPointer Will refactor stateCache and pass baseInstance
492*8975f5c5SAndroid Build Coastguard Worker         // to setDrawArraysState to set pointer offset
493*8975f5c5SAndroid Build Coastguard Worker 
494*8975f5c5SAndroid Build Coastguard Worker         gl::AttributesMask attribToResetMask = updateAttributesForBaseInstance(baseInstance);
495*8975f5c5SAndroid Build Coastguard Worker 
496*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, functions->drawArraysInstanced(ToGLenum(mode), first, count,
497*8975f5c5SAndroid Build Coastguard Worker                                                              adjustedInstanceCount));
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker         resetUpdatedAttributes(attribToResetMask);
500*8975f5c5SAndroid Build Coastguard Worker     }
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
503*8975f5c5SAndroid Build Coastguard Worker 
504*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
505*8975f5c5SAndroid Build Coastguard Worker }
506*8975f5c5SAndroid Build Coastguard Worker 
drawElements(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices)507*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawElements(const gl::Context *context,
508*8975f5c5SAndroid Build Coastguard Worker                                       gl::PrimitiveMode mode,
509*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei count,
510*8975f5c5SAndroid Build Coastguard Worker                                       gl::DrawElementsType type,
511*8975f5c5SAndroid Build Coastguard Worker                                       const void *indices)
512*8975f5c5SAndroid Build Coastguard Worker {
513*8975f5c5SAndroid Build Coastguard Worker     const gl::State &glState                = context->getState();
514*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = glState.getProgramExecutable();
515*8975f5c5SAndroid Build Coastguard Worker     const GLsizei instanceCount             = GetDrawAdjustedInstanceCount(executable);
516*8975f5c5SAndroid Build Coastguard Worker     const void *drawIndexPtr                = nullptr;
517*8975f5c5SAndroid Build Coastguard Worker 
518*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_STATE_VALIDATION_ENABLED)
519*8975f5c5SAndroid Build Coastguard Worker     validateState();
520*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_STATE_VALIDATION_ENABLED
521*8975f5c5SAndroid Build Coastguard Worker 
522*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawElementsState(context, count, type, indices, instanceCount, &drawIndexPtr));
523*8975f5c5SAndroid Build Coastguard Worker     if (!executable->usesMultiview())
524*8975f5c5SAndroid Build Coastguard Worker     {
525*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawElements(ToGLenum(mode), count, ToGLenum(type),
526*8975f5c5SAndroid Build Coastguard Worker                                                            drawIndexPtr));
527*8975f5c5SAndroid Build Coastguard Worker     }
528*8975f5c5SAndroid Build Coastguard Worker     else
529*8975f5c5SAndroid Build Coastguard Worker     {
530*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context,
531*8975f5c5SAndroid Build Coastguard Worker                      getFunctions()->drawElementsInstanced(ToGLenum(mode), count, ToGLenum(type),
532*8975f5c5SAndroid Build Coastguard Worker                                                            drawIndexPtr, instanceCount));
533*8975f5c5SAndroid Build Coastguard Worker     }
534*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
535*8975f5c5SAndroid Build Coastguard Worker 
536*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
537*8975f5c5SAndroid Build Coastguard Worker }
538*8975f5c5SAndroid Build Coastguard Worker 
drawElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)539*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawElementsBaseVertex(const gl::Context *context,
540*8975f5c5SAndroid Build Coastguard Worker                                                 gl::PrimitiveMode mode,
541*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei count,
542*8975f5c5SAndroid Build Coastguard Worker                                                 gl::DrawElementsType type,
543*8975f5c5SAndroid Build Coastguard Worker                                                 const void *indices,
544*8975f5c5SAndroid Build Coastguard Worker                                                 GLint baseVertex)
545*8975f5c5SAndroid Build Coastguard Worker {
546*8975f5c5SAndroid Build Coastguard Worker     const gl::State &glState                = context->getState();
547*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = glState.getProgramExecutable();
548*8975f5c5SAndroid Build Coastguard Worker     const GLsizei instanceCount             = GetDrawAdjustedInstanceCount(executable);
549*8975f5c5SAndroid Build Coastguard Worker     const void *drawIndexPtr                = nullptr;
550*8975f5c5SAndroid Build Coastguard Worker 
551*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_STATE_VALIDATION_ENABLED)
552*8975f5c5SAndroid Build Coastguard Worker     validateState();
553*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_STATE_VALIDATION_ENABLED
554*8975f5c5SAndroid Build Coastguard Worker 
555*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawElementsState(context, count, type, indices, instanceCount, &drawIndexPtr));
556*8975f5c5SAndroid Build Coastguard Worker     if (!executable->usesMultiview())
557*8975f5c5SAndroid Build Coastguard Worker     {
558*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawElementsBaseVertex(
559*8975f5c5SAndroid Build Coastguard Worker                                   ToGLenum(mode), count, ToGLenum(type), drawIndexPtr, baseVertex));
560*8975f5c5SAndroid Build Coastguard Worker     }
561*8975f5c5SAndroid Build Coastguard Worker     else
562*8975f5c5SAndroid Build Coastguard Worker     {
563*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawElementsInstancedBaseVertex(
564*8975f5c5SAndroid Build Coastguard Worker                                   ToGLenum(mode), count, ToGLenum(type), drawIndexPtr,
565*8975f5c5SAndroid Build Coastguard Worker                                   instanceCount, baseVertex));
566*8975f5c5SAndroid Build Coastguard Worker     }
567*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
568*8975f5c5SAndroid Build Coastguard Worker 
569*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
570*8975f5c5SAndroid Build Coastguard Worker }
571*8975f5c5SAndroid Build Coastguard Worker 
drawElementsInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances)572*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawElementsInstanced(const gl::Context *context,
573*8975f5c5SAndroid Build Coastguard Worker                                                gl::PrimitiveMode mode,
574*8975f5c5SAndroid Build Coastguard Worker                                                GLsizei count,
575*8975f5c5SAndroid Build Coastguard Worker                                                gl::DrawElementsType type,
576*8975f5c5SAndroid Build Coastguard Worker                                                const void *indices,
577*8975f5c5SAndroid Build Coastguard Worker                                                GLsizei instances)
578*8975f5c5SAndroid Build Coastguard Worker {
579*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = context->getState().getProgramExecutable();
580*8975f5c5SAndroid Build Coastguard Worker     const GLsizei adjustedInstanceCount =
581*8975f5c5SAndroid Build Coastguard Worker         GetInstancedDrawAdjustedInstanceCount(executable, instances);
582*8975f5c5SAndroid Build Coastguard Worker     const void *drawIndexPointer = nullptr;
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawElementsState(context, count, type, indices, adjustedInstanceCount,
585*8975f5c5SAndroid Build Coastguard Worker                                    &drawIndexPointer));
586*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY(context,
587*8975f5c5SAndroid Build Coastguard Worker                  getFunctions()->drawElementsInstanced(ToGLenum(mode), count, ToGLenum(type),
588*8975f5c5SAndroid Build Coastguard Worker                                                        drawIndexPointer, adjustedInstanceCount));
589*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
590*8975f5c5SAndroid Build Coastguard Worker }
591*8975f5c5SAndroid Build Coastguard Worker 
drawElementsInstancedBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex)592*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawElementsInstancedBaseVertex(const gl::Context *context,
593*8975f5c5SAndroid Build Coastguard Worker                                                          gl::PrimitiveMode mode,
594*8975f5c5SAndroid Build Coastguard Worker                                                          GLsizei count,
595*8975f5c5SAndroid Build Coastguard Worker                                                          gl::DrawElementsType type,
596*8975f5c5SAndroid Build Coastguard Worker                                                          const void *indices,
597*8975f5c5SAndroid Build Coastguard Worker                                                          GLsizei instances,
598*8975f5c5SAndroid Build Coastguard Worker                                                          GLint baseVertex)
599*8975f5c5SAndroid Build Coastguard Worker {
600*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = context->getState().getProgramExecutable();
601*8975f5c5SAndroid Build Coastguard Worker     const GLsizei adjustedInstanceCount =
602*8975f5c5SAndroid Build Coastguard Worker         GetInstancedDrawAdjustedInstanceCount(executable, instances);
603*8975f5c5SAndroid Build Coastguard Worker     const void *drawIndexPointer = nullptr;
604*8975f5c5SAndroid Build Coastguard Worker 
605*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawElementsState(context, count, type, indices, adjustedInstanceCount,
606*8975f5c5SAndroid Build Coastguard Worker                                    &drawIndexPointer));
607*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY(context, getFunctions()->drawElementsInstancedBaseVertex(
608*8975f5c5SAndroid Build Coastguard Worker                               ToGLenum(mode), count, ToGLenum(type), drawIndexPointer,
609*8975f5c5SAndroid Build Coastguard Worker                               adjustedInstanceCount, baseVertex));
610*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
611*8975f5c5SAndroid Build Coastguard Worker 
612*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
613*8975f5c5SAndroid Build Coastguard Worker }
614*8975f5c5SAndroid Build Coastguard Worker 
drawElementsInstancedBaseVertexBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex,GLuint baseInstance)615*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
616*8975f5c5SAndroid Build Coastguard Worker                                                                      gl::PrimitiveMode mode,
617*8975f5c5SAndroid Build Coastguard Worker                                                                      GLsizei count,
618*8975f5c5SAndroid Build Coastguard Worker                                                                      gl::DrawElementsType type,
619*8975f5c5SAndroid Build Coastguard Worker                                                                      const void *indices,
620*8975f5c5SAndroid Build Coastguard Worker                                                                      GLsizei instances,
621*8975f5c5SAndroid Build Coastguard Worker                                                                      GLint baseVertex,
622*8975f5c5SAndroid Build Coastguard Worker                                                                      GLuint baseInstance)
623*8975f5c5SAndroid Build Coastguard Worker {
624*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = context->getState().getProgramExecutable();
625*8975f5c5SAndroid Build Coastguard Worker     const GLsizei adjustedInstanceCount =
626*8975f5c5SAndroid Build Coastguard Worker         GetInstancedDrawAdjustedInstanceCount(executable, instances);
627*8975f5c5SAndroid Build Coastguard Worker     const void *drawIndexPointer = nullptr;
628*8975f5c5SAndroid Build Coastguard Worker 
629*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setDrawElementsState(context, count, type, indices, adjustedInstanceCount,
630*8975f5c5SAndroid Build Coastguard Worker                                    &drawIndexPointer));
631*8975f5c5SAndroid Build Coastguard Worker 
632*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
633*8975f5c5SAndroid Build Coastguard Worker 
634*8975f5c5SAndroid Build Coastguard Worker     if (functions->drawElementsInstancedBaseVertexBaseInstance)
635*8975f5c5SAndroid Build Coastguard Worker     {
636*8975f5c5SAndroid Build Coastguard Worker         // GL 4.2+ or GL_EXT_base_instance
637*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, functions->drawElementsInstancedBaseVertexBaseInstance(
638*8975f5c5SAndroid Build Coastguard Worker                                   ToGLenum(mode), count, ToGLenum(type), drawIndexPointer,
639*8975f5c5SAndroid Build Coastguard Worker                                   adjustedInstanceCount, baseVertex, baseInstance));
640*8975f5c5SAndroid Build Coastguard Worker     }
641*8975f5c5SAndroid Build Coastguard Worker     else
642*8975f5c5SAndroid Build Coastguard Worker     {
643*8975f5c5SAndroid Build Coastguard Worker         // GL 3.3+ or GLES 3.2+
644*8975f5c5SAndroid Build Coastguard Worker         // TODO(http://anglebug.com/42262554): same as above
645*8975f5c5SAndroid Build Coastguard Worker         gl::AttributesMask attribToResetMask = updateAttributesForBaseInstance(baseInstance);
646*8975f5c5SAndroid Build Coastguard Worker 
647*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, functions->drawElementsInstancedBaseVertex(
648*8975f5c5SAndroid Build Coastguard Worker                                   ToGLenum(mode), count, ToGLenum(type), drawIndexPointer,
649*8975f5c5SAndroid Build Coastguard Worker                                   adjustedInstanceCount, baseVertex));
650*8975f5c5SAndroid Build Coastguard Worker 
651*8975f5c5SAndroid Build Coastguard Worker         resetUpdatedAttributes(attribToResetMask);
652*8975f5c5SAndroid Build Coastguard Worker     }
653*8975f5c5SAndroid Build Coastguard Worker 
654*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
657*8975f5c5SAndroid Build Coastguard Worker }
658*8975f5c5SAndroid Build Coastguard Worker 
drawRangeElements(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices)659*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawRangeElements(const gl::Context *context,
660*8975f5c5SAndroid Build Coastguard Worker                                            gl::PrimitiveMode mode,
661*8975f5c5SAndroid Build Coastguard Worker                                            GLuint start,
662*8975f5c5SAndroid Build Coastguard Worker                                            GLuint end,
663*8975f5c5SAndroid Build Coastguard Worker                                            GLsizei count,
664*8975f5c5SAndroid Build Coastguard Worker                                            gl::DrawElementsType type,
665*8975f5c5SAndroid Build Coastguard Worker                                            const void *indices)
666*8975f5c5SAndroid Build Coastguard Worker {
667*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = mState.getProgramExecutable();
668*8975f5c5SAndroid Build Coastguard Worker     const GLsizei instanceCount             = GetDrawAdjustedInstanceCount(executable);
669*8975f5c5SAndroid Build Coastguard Worker     const void *drawIndexPointer            = nullptr;
670*8975f5c5SAndroid Build Coastguard Worker 
671*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(
672*8975f5c5SAndroid Build Coastguard Worker         setDrawElementsState(context, count, type, indices, instanceCount, &drawIndexPointer));
673*8975f5c5SAndroid Build Coastguard Worker     if (!executable->usesMultiview())
674*8975f5c5SAndroid Build Coastguard Worker     {
675*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawRangeElements(ToGLenum(mode), start, end, count,
676*8975f5c5SAndroid Build Coastguard Worker                                                                 ToGLenum(type), drawIndexPointer));
677*8975f5c5SAndroid Build Coastguard Worker     }
678*8975f5c5SAndroid Build Coastguard Worker     else
679*8975f5c5SAndroid Build Coastguard Worker     {
680*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context,
681*8975f5c5SAndroid Build Coastguard Worker                      getFunctions()->drawElementsInstanced(ToGLenum(mode), count, ToGLenum(type),
682*8975f5c5SAndroid Build Coastguard Worker                                                            drawIndexPointer, instanceCount));
683*8975f5c5SAndroid Build Coastguard Worker     }
684*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
685*8975f5c5SAndroid Build Coastguard Worker 
686*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
687*8975f5c5SAndroid Build Coastguard Worker }
688*8975f5c5SAndroid Build Coastguard Worker 
drawRangeElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)689*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawRangeElementsBaseVertex(const gl::Context *context,
690*8975f5c5SAndroid Build Coastguard Worker                                                      gl::PrimitiveMode mode,
691*8975f5c5SAndroid Build Coastguard Worker                                                      GLuint start,
692*8975f5c5SAndroid Build Coastguard Worker                                                      GLuint end,
693*8975f5c5SAndroid Build Coastguard Worker                                                      GLsizei count,
694*8975f5c5SAndroid Build Coastguard Worker                                                      gl::DrawElementsType type,
695*8975f5c5SAndroid Build Coastguard Worker                                                      const void *indices,
696*8975f5c5SAndroid Build Coastguard Worker                                                      GLint baseVertex)
697*8975f5c5SAndroid Build Coastguard Worker {
698*8975f5c5SAndroid Build Coastguard Worker     const gl::ProgramExecutable *executable = mState.getProgramExecutable();
699*8975f5c5SAndroid Build Coastguard Worker     const GLsizei instanceCount             = GetDrawAdjustedInstanceCount(executable);
700*8975f5c5SAndroid Build Coastguard Worker     const void *drawIndexPointer            = nullptr;
701*8975f5c5SAndroid Build Coastguard Worker 
702*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(
703*8975f5c5SAndroid Build Coastguard Worker         setDrawElementsState(context, count, type, indices, instanceCount, &drawIndexPointer));
704*8975f5c5SAndroid Build Coastguard Worker     if (!executable->usesMultiview())
705*8975f5c5SAndroid Build Coastguard Worker     {
706*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawRangeElementsBaseVertex(
707*8975f5c5SAndroid Build Coastguard Worker                                   ToGLenum(mode), start, end, count, ToGLenum(type),
708*8975f5c5SAndroid Build Coastguard Worker                                   drawIndexPointer, baseVertex));
709*8975f5c5SAndroid Build Coastguard Worker     }
710*8975f5c5SAndroid Build Coastguard Worker     else
711*8975f5c5SAndroid Build Coastguard Worker     {
712*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY(context, getFunctions()->drawElementsInstancedBaseVertex(
713*8975f5c5SAndroid Build Coastguard Worker                                   ToGLenum(mode), count, ToGLenum(type), drawIndexPointer,
714*8975f5c5SAndroid Build Coastguard Worker                                   instanceCount, baseVertex));
715*8975f5c5SAndroid Build Coastguard Worker     }
716*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
717*8975f5c5SAndroid Build Coastguard Worker 
718*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
719*8975f5c5SAndroid Build Coastguard Worker }
720*8975f5c5SAndroid Build Coastguard Worker 
drawArraysIndirect(const gl::Context * context,gl::PrimitiveMode mode,const void * indirect)721*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawArraysIndirect(const gl::Context *context,
722*8975f5c5SAndroid Build Coastguard Worker                                             gl::PrimitiveMode mode,
723*8975f5c5SAndroid Build Coastguard Worker                                             const void *indirect)
724*8975f5c5SAndroid Build Coastguard Worker {
725*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY(context, getFunctions()->drawArraysIndirect(ToGLenum(mode), indirect));
726*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
727*8975f5c5SAndroid Build Coastguard Worker 
728*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
729*8975f5c5SAndroid Build Coastguard Worker }
730*8975f5c5SAndroid Build Coastguard Worker 
drawElementsIndirect(const gl::Context * context,gl::PrimitiveMode mode,gl::DrawElementsType type,const void * indirect)731*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::drawElementsIndirect(const gl::Context *context,
732*8975f5c5SAndroid Build Coastguard Worker                                               gl::PrimitiveMode mode,
733*8975f5c5SAndroid Build Coastguard Worker                                               gl::DrawElementsType type,
734*8975f5c5SAndroid Build Coastguard Worker                                               const void *indirect)
735*8975f5c5SAndroid Build Coastguard Worker {
736*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY(context,
737*8975f5c5SAndroid Build Coastguard Worker                  getFunctions()->drawElementsIndirect(ToGLenum(mode), ToGLenum(type), indirect));
738*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
739*8975f5c5SAndroid Build Coastguard Worker }
740*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArrays(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,GLsizei drawcount)741*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawArrays(const gl::Context *context,
742*8975f5c5SAndroid Build Coastguard Worker                                          gl::PrimitiveMode mode,
743*8975f5c5SAndroid Build Coastguard Worker                                          const GLint *firsts,
744*8975f5c5SAndroid Build Coastguard Worker                                          const GLsizei *counts,
745*8975f5c5SAndroid Build Coastguard Worker                                          GLsizei drawcount)
746*8975f5c5SAndroid Build Coastguard Worker {
747*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
748*8975f5c5SAndroid Build Coastguard Worker 
749*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawArraysGeneral(this, context, mode, firsts, counts, drawcount);
750*8975f5c5SAndroid Build Coastguard Worker }
751*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArraysInstanced(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,GLsizei drawcount)752*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawArraysInstanced(const gl::Context *context,
753*8975f5c5SAndroid Build Coastguard Worker                                                   gl::PrimitiveMode mode,
754*8975f5c5SAndroid Build Coastguard Worker                                                   const GLint *firsts,
755*8975f5c5SAndroid Build Coastguard Worker                                                   const GLsizei *counts,
756*8975f5c5SAndroid Build Coastguard Worker                                                   const GLsizei *instanceCounts,
757*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei drawcount)
758*8975f5c5SAndroid Build Coastguard Worker {
759*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
760*8975f5c5SAndroid Build Coastguard Worker 
761*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawArraysInstancedGeneral(this, context, mode, firsts, counts, instanceCounts,
762*8975f5c5SAndroid Build Coastguard Worker                                                drawcount);
763*8975f5c5SAndroid Build Coastguard Worker }
764*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArraysIndirect(const gl::Context * context,gl::PrimitiveMode mode,const void * indirect,GLsizei drawcount,GLsizei stride)765*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawArraysIndirect(const gl::Context *context,
766*8975f5c5SAndroid Build Coastguard Worker                                                  gl::PrimitiveMode mode,
767*8975f5c5SAndroid Build Coastguard Worker                                                  const void *indirect,
768*8975f5c5SAndroid Build Coastguard Worker                                                  GLsizei drawcount,
769*8975f5c5SAndroid Build Coastguard Worker                                                  GLsizei stride)
770*8975f5c5SAndroid Build Coastguard Worker {
771*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
772*8975f5c5SAndroid Build Coastguard Worker 
773*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawArraysIndirectGeneral(this, context, mode, indirect, drawcount, stride);
774*8975f5c5SAndroid Build Coastguard Worker }
775*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElements(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,GLsizei drawcount)776*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawElements(const gl::Context *context,
777*8975f5c5SAndroid Build Coastguard Worker                                            gl::PrimitiveMode mode,
778*8975f5c5SAndroid Build Coastguard Worker                                            const GLsizei *counts,
779*8975f5c5SAndroid Build Coastguard Worker                                            gl::DrawElementsType type,
780*8975f5c5SAndroid Build Coastguard Worker                                            const GLvoid *const *indices,
781*8975f5c5SAndroid Build Coastguard Worker                                            GLsizei drawcount)
782*8975f5c5SAndroid Build Coastguard Worker {
783*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
784*8975f5c5SAndroid Build Coastguard Worker 
785*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawElementsGeneral(this, context, mode, counts, type, indices, drawcount);
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElementsInstanced(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,const GLsizei * instanceCounts,GLsizei drawcount)788*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawElementsInstanced(const gl::Context *context,
789*8975f5c5SAndroid Build Coastguard Worker                                                     gl::PrimitiveMode mode,
790*8975f5c5SAndroid Build Coastguard Worker                                                     const GLsizei *counts,
791*8975f5c5SAndroid Build Coastguard Worker                                                     gl::DrawElementsType type,
792*8975f5c5SAndroid Build Coastguard Worker                                                     const GLvoid *const *indices,
793*8975f5c5SAndroid Build Coastguard Worker                                                     const GLsizei *instanceCounts,
794*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei drawcount)
795*8975f5c5SAndroid Build Coastguard Worker {
796*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
797*8975f5c5SAndroid Build Coastguard Worker 
798*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawElementsInstancedGeneral(this, context, mode, counts, type, indices,
799*8975f5c5SAndroid Build Coastguard Worker                                                  instanceCounts, drawcount);
800*8975f5c5SAndroid Build Coastguard Worker }
801*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElementsIndirect(const gl::Context * context,gl::PrimitiveMode mode,gl::DrawElementsType type,const void * indirect,GLsizei drawcount,GLsizei stride)802*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawElementsIndirect(const gl::Context *context,
803*8975f5c5SAndroid Build Coastguard Worker                                                    gl::PrimitiveMode mode,
804*8975f5c5SAndroid Build Coastguard Worker                                                    gl::DrawElementsType type,
805*8975f5c5SAndroid Build Coastguard Worker                                                    const void *indirect,
806*8975f5c5SAndroid Build Coastguard Worker                                                    GLsizei drawcount,
807*8975f5c5SAndroid Build Coastguard Worker                                                    GLsizei stride)
808*8975f5c5SAndroid Build Coastguard Worker {
809*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
810*8975f5c5SAndroid Build Coastguard Worker 
811*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawElementsIndirectGeneral(this, context, mode, type, indirect, drawcount,
812*8975f5c5SAndroid Build Coastguard Worker                                                 stride);
813*8975f5c5SAndroid Build Coastguard Worker }
814*8975f5c5SAndroid Build Coastguard Worker 
multiDrawArraysInstancedBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,const GLuint * baseInstances,GLsizei drawcount)815*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawArraysInstancedBaseInstance(const gl::Context *context,
816*8975f5c5SAndroid Build Coastguard Worker                                                               gl::PrimitiveMode mode,
817*8975f5c5SAndroid Build Coastguard Worker                                                               const GLint *firsts,
818*8975f5c5SAndroid Build Coastguard Worker                                                               const GLsizei *counts,
819*8975f5c5SAndroid Build Coastguard Worker                                                               const GLsizei *instanceCounts,
820*8975f5c5SAndroid Build Coastguard Worker                                                               const GLuint *baseInstances,
821*8975f5c5SAndroid Build Coastguard Worker                                                               GLsizei drawcount)
822*8975f5c5SAndroid Build Coastguard Worker {
823*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
824*8975f5c5SAndroid Build Coastguard Worker 
825*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawArraysInstancedBaseInstanceGeneral(
826*8975f5c5SAndroid Build Coastguard Worker         this, context, mode, firsts, counts, instanceCounts, baseInstances, drawcount);
827*8975f5c5SAndroid Build Coastguard Worker }
828*8975f5c5SAndroid Build Coastguard Worker 
multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,const GLsizei * instanceCounts,const GLint * baseVertices,const GLuint * baseInstances,GLsizei drawcount)829*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::multiDrawElementsInstancedBaseVertexBaseInstance(
830*8975f5c5SAndroid Build Coastguard Worker     const gl::Context *context,
831*8975f5c5SAndroid Build Coastguard Worker     gl::PrimitiveMode mode,
832*8975f5c5SAndroid Build Coastguard Worker     const GLsizei *counts,
833*8975f5c5SAndroid Build Coastguard Worker     gl::DrawElementsType type,
834*8975f5c5SAndroid Build Coastguard Worker     const GLvoid *const *indices,
835*8975f5c5SAndroid Build Coastguard Worker     const GLsizei *instanceCounts,
836*8975f5c5SAndroid Build Coastguard Worker     const GLint *baseVertices,
837*8975f5c5SAndroid Build Coastguard Worker     const GLuint *baseInstances,
838*8975f5c5SAndroid Build Coastguard Worker     GLsizei drawcount)
839*8975f5c5SAndroid Build Coastguard Worker {
840*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
841*8975f5c5SAndroid Build Coastguard Worker 
842*8975f5c5SAndroid Build Coastguard Worker     return rx::MultiDrawElementsInstancedBaseVertexBaseInstanceGeneral(
843*8975f5c5SAndroid Build Coastguard Worker         this, context, mode, counts, type, indices, instanceCounts, baseVertices, baseInstances,
844*8975f5c5SAndroid Build Coastguard Worker         drawcount);
845*8975f5c5SAndroid Build Coastguard Worker }
846*8975f5c5SAndroid Build Coastguard Worker 
getResetStatus()847*8975f5c5SAndroid Build Coastguard Worker gl::GraphicsResetStatus ContextGL::getResetStatus()
848*8975f5c5SAndroid Build Coastguard Worker {
849*8975f5c5SAndroid Build Coastguard Worker     gl::GraphicsResetStatus resetStatus = mRenderer->getResetStatus();
850*8975f5c5SAndroid Build Coastguard Worker     if (resetStatus == gl::GraphicsResetStatus::PurgedContextResetNV)
851*8975f5c5SAndroid Build Coastguard Worker     {
852*8975f5c5SAndroid Build Coastguard Worker         if (mRobustnessVideoMemoryPurgeStatus == RobustnessVideoMemoryPurgeStatus::NOT_REQUESTED)
853*8975f5c5SAndroid Build Coastguard Worker         {
854*8975f5c5SAndroid Build Coastguard Worker             resetStatus = gl::GraphicsResetStatus::UnknownContextReset;
855*8975f5c5SAndroid Build Coastguard Worker         }
856*8975f5c5SAndroid Build Coastguard Worker     }
857*8975f5c5SAndroid Build Coastguard Worker     return resetStatus;
858*8975f5c5SAndroid Build Coastguard Worker }
859*8975f5c5SAndroid Build Coastguard Worker 
insertEventMarker(GLsizei length,const char * marker)860*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::insertEventMarker(GLsizei length, const char *marker)
861*8975f5c5SAndroid Build Coastguard Worker {
862*8975f5c5SAndroid Build Coastguard Worker     mRenderer->insertEventMarker(length, marker);
863*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
864*8975f5c5SAndroid Build Coastguard Worker }
865*8975f5c5SAndroid Build Coastguard Worker 
pushGroupMarker(GLsizei length,const char * marker)866*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::pushGroupMarker(GLsizei length, const char *marker)
867*8975f5c5SAndroid Build Coastguard Worker {
868*8975f5c5SAndroid Build Coastguard Worker     mRenderer->pushGroupMarker(length, marker);
869*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
870*8975f5c5SAndroid Build Coastguard Worker }
871*8975f5c5SAndroid Build Coastguard Worker 
popGroupMarker()872*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::popGroupMarker()
873*8975f5c5SAndroid Build Coastguard Worker {
874*8975f5c5SAndroid Build Coastguard Worker     mRenderer->popGroupMarker();
875*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
876*8975f5c5SAndroid Build Coastguard Worker }
877*8975f5c5SAndroid Build Coastguard Worker 
pushDebugGroup(const gl::Context * context,GLenum source,GLuint id,const std::string & message)878*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::pushDebugGroup(const gl::Context *context,
879*8975f5c5SAndroid Build Coastguard Worker                                         GLenum source,
880*8975f5c5SAndroid Build Coastguard Worker                                         GLuint id,
881*8975f5c5SAndroid Build Coastguard Worker                                         const std::string &message)
882*8975f5c5SAndroid Build Coastguard Worker {
883*8975f5c5SAndroid Build Coastguard Worker     mRenderer->pushDebugGroup(source, id, message);
884*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
885*8975f5c5SAndroid Build Coastguard Worker }
886*8975f5c5SAndroid Build Coastguard Worker 
popDebugGroup(const gl::Context * context)887*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::popDebugGroup(const gl::Context *context)
888*8975f5c5SAndroid Build Coastguard Worker {
889*8975f5c5SAndroid Build Coastguard Worker     mRenderer->popDebugGroup();
890*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
891*8975f5c5SAndroid Build Coastguard Worker }
892*8975f5c5SAndroid Build Coastguard Worker 
syncState(const gl::Context * context,const gl::state::DirtyBits dirtyBits,const gl::state::DirtyBits bitMask,const gl::state::ExtendedDirtyBits extendedDirtyBits,const gl::state::ExtendedDirtyBits extendedBitMask,gl::Command command)893*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::syncState(const gl::Context *context,
894*8975f5c5SAndroid Build Coastguard Worker                                    const gl::state::DirtyBits dirtyBits,
895*8975f5c5SAndroid Build Coastguard Worker                                    const gl::state::DirtyBits bitMask,
896*8975f5c5SAndroid Build Coastguard Worker                                    const gl::state::ExtendedDirtyBits extendedDirtyBits,
897*8975f5c5SAndroid Build Coastguard Worker                                    const gl::state::ExtendedDirtyBits extendedBitMask,
898*8975f5c5SAndroid Build Coastguard Worker                                    gl::Command command)
899*8975f5c5SAndroid Build Coastguard Worker {
900*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getStateManager()->syncState(context, dirtyBits, bitMask, extendedDirtyBits,
901*8975f5c5SAndroid Build Coastguard Worker                                                    extendedBitMask);
902*8975f5c5SAndroid Build Coastguard Worker }
903*8975f5c5SAndroid Build Coastguard Worker 
getGPUDisjoint()904*8975f5c5SAndroid Build Coastguard Worker GLint ContextGL::getGPUDisjoint()
905*8975f5c5SAndroid Build Coastguard Worker {
906*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getGPUDisjoint();
907*8975f5c5SAndroid Build Coastguard Worker }
908*8975f5c5SAndroid Build Coastguard Worker 
getTimestamp()909*8975f5c5SAndroid Build Coastguard Worker GLint64 ContextGL::getTimestamp()
910*8975f5c5SAndroid Build Coastguard Worker {
911*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getTimestamp();
912*8975f5c5SAndroid Build Coastguard Worker }
913*8975f5c5SAndroid Build Coastguard Worker 
onMakeCurrent(const gl::Context * context)914*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::onMakeCurrent(const gl::Context *context)
915*8975f5c5SAndroid Build Coastguard Worker {
916*8975f5c5SAndroid Build Coastguard Worker     // Queries need to be paused/resumed on context switches
917*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getStateManager()->onMakeCurrent(context);
918*8975f5c5SAndroid Build Coastguard Worker }
919*8975f5c5SAndroid Build Coastguard Worker 
onUnMakeCurrent(const gl::Context * context)920*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::onUnMakeCurrent(const gl::Context *context)
921*8975f5c5SAndroid Build Coastguard Worker {
922*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(flush(context));
923*8975f5c5SAndroid Build Coastguard Worker     if (getFeaturesGL().unbindFBOBeforeSwitchingContext.enabled)
924*8975f5c5SAndroid Build Coastguard Worker     {
925*8975f5c5SAndroid Build Coastguard Worker         mRenderer->getStateManager()->bindFramebuffer(GL_FRAMEBUFFER, 0);
926*8975f5c5SAndroid Build Coastguard Worker     }
927*8975f5c5SAndroid Build Coastguard Worker     return ContextImpl::onUnMakeCurrent(context);
928*8975f5c5SAndroid Build Coastguard Worker }
929*8975f5c5SAndroid Build Coastguard Worker 
getNativeCaps() const930*8975f5c5SAndroid Build Coastguard Worker gl::Caps ContextGL::getNativeCaps() const
931*8975f5c5SAndroid Build Coastguard Worker {
932*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getNativeCaps();
933*8975f5c5SAndroid Build Coastguard Worker }
934*8975f5c5SAndroid Build Coastguard Worker 
getNativeTextureCaps() const935*8975f5c5SAndroid Build Coastguard Worker const gl::TextureCapsMap &ContextGL::getNativeTextureCaps() const
936*8975f5c5SAndroid Build Coastguard Worker {
937*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getNativeTextureCaps();
938*8975f5c5SAndroid Build Coastguard Worker }
939*8975f5c5SAndroid Build Coastguard Worker 
getNativeExtensions() const940*8975f5c5SAndroid Build Coastguard Worker const gl::Extensions &ContextGL::getNativeExtensions() const
941*8975f5c5SAndroid Build Coastguard Worker {
942*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getNativeExtensions();
943*8975f5c5SAndroid Build Coastguard Worker }
944*8975f5c5SAndroid Build Coastguard Worker 
getNativeLimitations() const945*8975f5c5SAndroid Build Coastguard Worker const gl::Limitations &ContextGL::getNativeLimitations() const
946*8975f5c5SAndroid Build Coastguard Worker {
947*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getNativeLimitations();
948*8975f5c5SAndroid Build Coastguard Worker }
949*8975f5c5SAndroid Build Coastguard Worker 
getNativePixelLocalStorageOptions() const950*8975f5c5SAndroid Build Coastguard Worker const ShPixelLocalStorageOptions &ContextGL::getNativePixelLocalStorageOptions() const
951*8975f5c5SAndroid Build Coastguard Worker {
952*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getNativePixelLocalStorageOptions();
953*8975f5c5SAndroid Build Coastguard Worker }
954*8975f5c5SAndroid Build Coastguard Worker 
getStateManager()955*8975f5c5SAndroid Build Coastguard Worker StateManagerGL *ContextGL::getStateManager()
956*8975f5c5SAndroid Build Coastguard Worker {
957*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getStateManager();
958*8975f5c5SAndroid Build Coastguard Worker }
959*8975f5c5SAndroid Build Coastguard Worker 
getFeaturesGL() const960*8975f5c5SAndroid Build Coastguard Worker const angle::FeaturesGL &ContextGL::getFeaturesGL() const
961*8975f5c5SAndroid Build Coastguard Worker {
962*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getFeatures();
963*8975f5c5SAndroid Build Coastguard Worker }
964*8975f5c5SAndroid Build Coastguard Worker 
getBlitter() const965*8975f5c5SAndroid Build Coastguard Worker BlitGL *ContextGL::getBlitter() const
966*8975f5c5SAndroid Build Coastguard Worker {
967*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getBlitter();
968*8975f5c5SAndroid Build Coastguard Worker }
969*8975f5c5SAndroid Build Coastguard Worker 
getMultiviewClearer() const970*8975f5c5SAndroid Build Coastguard Worker ClearMultiviewGL *ContextGL::getMultiviewClearer() const
971*8975f5c5SAndroid Build Coastguard Worker {
972*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getMultiviewClearer();
973*8975f5c5SAndroid Build Coastguard Worker }
974*8975f5c5SAndroid Build Coastguard Worker 
dispatchCompute(const gl::Context * context,GLuint numGroupsX,GLuint numGroupsY,GLuint numGroupsZ)975*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::dispatchCompute(const gl::Context *context,
976*8975f5c5SAndroid Build Coastguard Worker                                          GLuint numGroupsX,
977*8975f5c5SAndroid Build Coastguard Worker                                          GLuint numGroupsY,
978*8975f5c5SAndroid Build Coastguard Worker                                          GLuint numGroupsZ)
979*8975f5c5SAndroid Build Coastguard Worker {
980*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->dispatchCompute(context, numGroupsX, numGroupsY, numGroupsZ);
981*8975f5c5SAndroid Build Coastguard Worker }
982*8975f5c5SAndroid Build Coastguard Worker 
dispatchComputeIndirect(const gl::Context * context,GLintptr indirect)983*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
984*8975f5c5SAndroid Build Coastguard Worker {
985*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->dispatchComputeIndirect(context, indirect);
986*8975f5c5SAndroid Build Coastguard Worker }
987*8975f5c5SAndroid Build Coastguard Worker 
memoryBarrier(const gl::Context * context,GLbitfield barriers)988*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::memoryBarrier(const gl::Context *context, GLbitfield barriers)
989*8975f5c5SAndroid Build Coastguard Worker {
990*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->memoryBarrier(barriers);
991*8975f5c5SAndroid Build Coastguard Worker }
memoryBarrierByRegion(const gl::Context * context,GLbitfield barriers)992*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers)
993*8975f5c5SAndroid Build Coastguard Worker {
994*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->memoryBarrierByRegion(barriers);
995*8975f5c5SAndroid Build Coastguard Worker }
996*8975f5c5SAndroid Build Coastguard Worker 
framebufferFetchBarrier()997*8975f5c5SAndroid Build Coastguard Worker void ContextGL::framebufferFetchBarrier()
998*8975f5c5SAndroid Build Coastguard Worker {
999*8975f5c5SAndroid Build Coastguard Worker     mRenderer->framebufferFetchBarrier();
1000*8975f5c5SAndroid Build Coastguard Worker }
1001*8975f5c5SAndroid Build Coastguard Worker 
startTiling(const gl::Context * context,const gl::Rectangle & area,GLbitfield preserveMask)1002*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::startTiling(const gl::Context *context,
1003*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Rectangle &area,
1004*8975f5c5SAndroid Build Coastguard Worker                                      GLbitfield preserveMask)
1005*8975f5c5SAndroid Build Coastguard Worker {
1006*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
1007*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY(context,
1008*8975f5c5SAndroid Build Coastguard Worker                  functions->startTilingQCOM(area.x, area.y, area.width, area.height, preserveMask));
1009*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1010*8975f5c5SAndroid Build Coastguard Worker }
1011*8975f5c5SAndroid Build Coastguard Worker 
endTiling(const gl::Context * context,GLbitfield preserveMask)1012*8975f5c5SAndroid Build Coastguard Worker angle::Result ContextGL::endTiling(const gl::Context *context, GLbitfield preserveMask)
1013*8975f5c5SAndroid Build Coastguard Worker {
1014*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions = getFunctions();
1015*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY(context, functions->endTilingQCOM(preserveMask));
1016*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
1017*8975f5c5SAndroid Build Coastguard Worker }
1018*8975f5c5SAndroid Build Coastguard Worker 
setMaxShaderCompilerThreads(GLuint count)1019*8975f5c5SAndroid Build Coastguard Worker void ContextGL::setMaxShaderCompilerThreads(GLuint count)
1020*8975f5c5SAndroid Build Coastguard Worker {
1021*8975f5c5SAndroid Build Coastguard Worker     mRenderer->setMaxShaderCompilerThreads(count);
1022*8975f5c5SAndroid Build Coastguard Worker }
1023*8975f5c5SAndroid Build Coastguard Worker 
invalidateTexture(gl::TextureType target)1024*8975f5c5SAndroid Build Coastguard Worker void ContextGL::invalidateTexture(gl::TextureType target)
1025*8975f5c5SAndroid Build Coastguard Worker {
1026*8975f5c5SAndroid Build Coastguard Worker     mRenderer->getStateManager()->invalidateTexture(target);
1027*8975f5c5SAndroid Build Coastguard Worker }
1028*8975f5c5SAndroid Build Coastguard Worker 
validateState() const1029*8975f5c5SAndroid Build Coastguard Worker void ContextGL::validateState() const
1030*8975f5c5SAndroid Build Coastguard Worker {
1031*8975f5c5SAndroid Build Coastguard Worker     const StateManagerGL *stateManager = mRenderer->getStateManager();
1032*8975f5c5SAndroid Build Coastguard Worker     stateManager->validateState();
1033*8975f5c5SAndroid Build Coastguard Worker }
1034*8975f5c5SAndroid Build Coastguard Worker 
setNeedsFlushBeforeDeleteTextures()1035*8975f5c5SAndroid Build Coastguard Worker void ContextGL::setNeedsFlushBeforeDeleteTextures()
1036*8975f5c5SAndroid Build Coastguard Worker {
1037*8975f5c5SAndroid Build Coastguard Worker     mRenderer->setNeedsFlushBeforeDeleteTextures();
1038*8975f5c5SAndroid Build Coastguard Worker }
1039*8975f5c5SAndroid Build Coastguard Worker 
flushIfNecessaryBeforeDeleteTextures()1040*8975f5c5SAndroid Build Coastguard Worker void ContextGL::flushIfNecessaryBeforeDeleteTextures()
1041*8975f5c5SAndroid Build Coastguard Worker {
1042*8975f5c5SAndroid Build Coastguard Worker     mRenderer->flushIfNecessaryBeforeDeleteTextures();
1043*8975f5c5SAndroid Build Coastguard Worker }
1044*8975f5c5SAndroid Build Coastguard Worker 
markWorkSubmitted()1045*8975f5c5SAndroid Build Coastguard Worker void ContextGL::markWorkSubmitted()
1046*8975f5c5SAndroid Build Coastguard Worker {
1047*8975f5c5SAndroid Build Coastguard Worker     mRenderer->markWorkSubmitted();
1048*8975f5c5SAndroid Build Coastguard Worker }
1049*8975f5c5SAndroid Build Coastguard Worker 
getMultiviewImplementationType() const1050*8975f5c5SAndroid Build Coastguard Worker MultiviewImplementationTypeGL ContextGL::getMultiviewImplementationType() const
1051*8975f5c5SAndroid Build Coastguard Worker {
1052*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getMultiviewImplementationType();
1053*8975f5c5SAndroid Build Coastguard Worker }
1054*8975f5c5SAndroid Build Coastguard Worker 
hasNativeParallelCompile()1055*8975f5c5SAndroid Build Coastguard Worker bool ContextGL::hasNativeParallelCompile()
1056*8975f5c5SAndroid Build Coastguard Worker {
1057*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->hasNativeParallelCompile();
1058*8975f5c5SAndroid Build Coastguard Worker }
1059*8975f5c5SAndroid Build Coastguard Worker 
1060*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
1061