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