1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLOpsRenderPass.h"
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLFunctions.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLInterface.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCpuBuffer.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawIndirectCommand.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramInfo.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLCaps.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLDefines.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLProgram.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLRenderTarget.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLUtil.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLVertexArray.h"
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm>
31*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker #define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X)
34*c8dee2aaSAndroid Build Coastguard Worker
set(GrRenderTarget * rt,bool useMSAASurface,const SkIRect & contentBounds,GrSurfaceOrigin origin,const LoadAndStoreInfo & colorInfo,const StencilLoadAndStoreInfo & stencilInfo)35*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::set(GrRenderTarget* rt, bool useMSAASurface, const SkIRect& contentBounds,
36*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin origin, const LoadAndStoreInfo& colorInfo,
37*c8dee2aaSAndroid Build Coastguard Worker const StencilLoadAndStoreInfo& stencilInfo) {
38*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu);
39*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fRenderTarget);
40*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu == rt->getContext()->priv().getGpu());
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker this->INHERITED::set(rt, origin);
43*c8dee2aaSAndroid Build Coastguard Worker fUseMultisampleFBO = useMSAASurface;
44*c8dee2aaSAndroid Build Coastguard Worker fContentBounds = contentBounds;
45*c8dee2aaSAndroid Build Coastguard Worker fColorLoadAndStoreInfo = colorInfo;
46*c8dee2aaSAndroid Build Coastguard Worker fStencilLoadAndStoreInfo = stencilInfo;
47*c8dee2aaSAndroid Build Coastguard Worker }
48*c8dee2aaSAndroid Build Coastguard Worker
dmsaaLoadStoreBounds() const49*c8dee2aaSAndroid Build Coastguard Worker GrNativeRect GrGLOpsRenderPass::dmsaaLoadStoreBounds() const {
50*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().framebufferResolvesMustBeFullSize()) {
51*c8dee2aaSAndroid Build Coastguard Worker // If frambeffer resolves have to be full size, then resolve the entire render target during
52*c8dee2aaSAndroid Build Coastguard Worker // load and store both, even if we will be doing so with a draw. We do this because we will
53*c8dee2aaSAndroid Build Coastguard Worker // have no other choice than to do a full size resolve at the end of the render pass, so the
54*c8dee2aaSAndroid Build Coastguard Worker // full DMSAA attachment needs to have valid content.
55*c8dee2aaSAndroid Build Coastguard Worker return GrNativeRect::MakeRelativeTo(fOrigin, fRenderTarget->height(),
56*c8dee2aaSAndroid Build Coastguard Worker SkIRect::MakeSize(fRenderTarget->dimensions()));
57*c8dee2aaSAndroid Build Coastguard Worker } else {
58*c8dee2aaSAndroid Build Coastguard Worker return GrNativeRect::MakeRelativeTo(fOrigin, fRenderTarget->height(), fContentBounds);
59*c8dee2aaSAndroid Build Coastguard Worker }
60*c8dee2aaSAndroid Build Coastguard Worker }
61*c8dee2aaSAndroid Build Coastguard Worker
onBegin()62*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onBegin() {
63*c8dee2aaSAndroid Build Coastguard Worker auto glRT = static_cast<GrGLRenderTarget*>(fRenderTarget);
64*c8dee2aaSAndroid Build Coastguard Worker if (fUseMultisampleFBO &&
65*c8dee2aaSAndroid Build Coastguard Worker fColorLoadAndStoreInfo.fLoadOp == GrLoadOp::kLoad &&
66*c8dee2aaSAndroid Build Coastguard Worker glRT->hasDynamicMSAAAttachment()) {
67*c8dee2aaSAndroid Build Coastguard Worker // Load the single sample fbo into the dmsaa attachment.
68*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().canResolveSingleToMSAA()) {
69*c8dee2aaSAndroid Build Coastguard Worker fGpu->resolveRenderFBOs(glRT, this->dmsaaLoadStoreBounds().asSkIRect(),
70*c8dee2aaSAndroid Build Coastguard Worker GrGLGpu::ResolveDirection::kSingleToMSAA);
71*c8dee2aaSAndroid Build Coastguard Worker } else {
72*c8dee2aaSAndroid Build Coastguard Worker fGpu->drawSingleIntoMSAAFBO(glRT, this->dmsaaLoadStoreBounds().asSkIRect());
73*c8dee2aaSAndroid Build Coastguard Worker }
74*c8dee2aaSAndroid Build Coastguard Worker }
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard Worker fGpu->beginCommandBuffer(glRT, fUseMultisampleFBO, fContentBounds, fOrigin,
77*c8dee2aaSAndroid Build Coastguard Worker fColorLoadAndStoreInfo, fStencilLoadAndStoreInfo);
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker
onEnd()80*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onEnd() {
81*c8dee2aaSAndroid Build Coastguard Worker auto glRT = static_cast<GrGLRenderTarget*>(fRenderTarget);
82*c8dee2aaSAndroid Build Coastguard Worker fGpu->endCommandBuffer(glRT, fUseMultisampleFBO, fColorLoadAndStoreInfo,
83*c8dee2aaSAndroid Build Coastguard Worker fStencilLoadAndStoreInfo);
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker if (fUseMultisampleFBO &&
86*c8dee2aaSAndroid Build Coastguard Worker fColorLoadAndStoreInfo.fStoreOp == GrStoreOp::kStore &&
87*c8dee2aaSAndroid Build Coastguard Worker glRT->hasDynamicMSAAAttachment()) {
88*c8dee2aaSAndroid Build Coastguard Worker // Blit the msaa attachment into the single sample fbo.
89*c8dee2aaSAndroid Build Coastguard Worker fGpu->resolveRenderFBOs(glRT, this->dmsaaLoadStoreBounds().asSkIRect(),
90*c8dee2aaSAndroid Build Coastguard Worker GrGLGpu::ResolveDirection::kMSAAToSingle,
91*c8dee2aaSAndroid Build Coastguard Worker true /*invalidateReadBufferAfterBlit*/);
92*c8dee2aaSAndroid Build Coastguard Worker }
93*c8dee2aaSAndroid Build Coastguard Worker }
94*c8dee2aaSAndroid Build Coastguard Worker
onBindPipeline(const GrProgramInfo & programInfo,const SkRect & drawBounds)95*c8dee2aaSAndroid Build Coastguard Worker bool GrGLOpsRenderPass::onBindPipeline(const GrProgramInfo& programInfo,
96*c8dee2aaSAndroid Build Coastguard Worker const SkRect& drawBounds) {
97*c8dee2aaSAndroid Build Coastguard Worker fPrimitiveType = programInfo.primitiveType();
98*c8dee2aaSAndroid Build Coastguard Worker return fGpu->flushGLState(fRenderTarget, fUseMultisampleFBO, programInfo);
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker
onSetScissorRect(const SkIRect & scissor)101*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onSetScissorRect(const SkIRect& scissor) {
102*c8dee2aaSAndroid Build Coastguard Worker fGpu->flushScissorRect(scissor, fRenderTarget->height(), fOrigin);
103*c8dee2aaSAndroid Build Coastguard Worker }
104*c8dee2aaSAndroid Build Coastguard Worker
onBindTextures(const GrGeometryProcessor & geomProc,const GrSurfaceProxy * const geomProcTextures[],const GrPipeline & pipeline)105*c8dee2aaSAndroid Build Coastguard Worker bool GrGLOpsRenderPass::onBindTextures(const GrGeometryProcessor& geomProc,
106*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* const geomProcTextures[],
107*c8dee2aaSAndroid Build Coastguard Worker const GrPipeline& pipeline) {
108*c8dee2aaSAndroid Build Coastguard Worker GrGLProgram* program = fGpu->currentProgram();
109*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(program);
110*c8dee2aaSAndroid Build Coastguard Worker program->bindTextures(geomProc, geomProcTextures, pipeline);
111*c8dee2aaSAndroid Build Coastguard Worker return true;
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker
onBindBuffers(sk_sp<const GrBuffer> indexBuffer,sk_sp<const GrBuffer> instanceBuffer,sk_sp<const GrBuffer> vertexBuffer,GrPrimitiveRestart primitiveRestart)114*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onBindBuffers(sk_sp<const GrBuffer> indexBuffer,
115*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer> instanceBuffer,
116*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer> vertexBuffer,
117*c8dee2aaSAndroid Build Coastguard Worker GrPrimitiveRestart primitiveRestart) {
118*c8dee2aaSAndroid Build Coastguard Worker SkASSERT((primitiveRestart == GrPrimitiveRestart::kNo) || indexBuffer);
119*c8dee2aaSAndroid Build Coastguard Worker GrGLProgram* program = fGpu->currentProgram();
120*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(program);
121*c8dee2aaSAndroid Build Coastguard Worker
122*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
123*c8dee2aaSAndroid Build Coastguard Worker fDidBindInstanceBuffer = false;
124*c8dee2aaSAndroid Build Coastguard Worker fDidBindVertexBuffer = false;
125*c8dee2aaSAndroid Build Coastguard Worker #endif
126*c8dee2aaSAndroid Build Coastguard Worker
127*c8dee2aaSAndroid Build Coastguard Worker int numAttribs = program->numVertexAttributes() + program->numInstanceAttributes();
128*c8dee2aaSAndroid Build Coastguard Worker fAttribArrayState = fGpu->bindInternalVertexArray(indexBuffer.get(), numAttribs,
129*c8dee2aaSAndroid Build Coastguard Worker primitiveRestart);
130*c8dee2aaSAndroid Build Coastguard Worker
131*c8dee2aaSAndroid Build Coastguard Worker if (indexBuffer) {
132*c8dee2aaSAndroid Build Coastguard Worker if (indexBuffer->isCpuBuffer()) {
133*c8dee2aaSAndroid Build Coastguard Worker auto* cpuIndexBuffer = static_cast<const GrCpuBuffer*>(indexBuffer.get());
134*c8dee2aaSAndroid Build Coastguard Worker fIndexPointer = reinterpret_cast<const uint16_t*>(cpuIndexBuffer->data());
135*c8dee2aaSAndroid Build Coastguard Worker } else {
136*c8dee2aaSAndroid Build Coastguard Worker fIndexPointer = nullptr;
137*c8dee2aaSAndroid Build Coastguard Worker }
138*c8dee2aaSAndroid Build Coastguard Worker }
139*c8dee2aaSAndroid Build Coastguard Worker
140*c8dee2aaSAndroid Build Coastguard Worker // If this platform does not support baseInstance, defer binding of the instance buffer.
141*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().baseVertexBaseInstanceSupport()) {
142*c8dee2aaSAndroid Build Coastguard Worker this->bindInstanceBuffer(instanceBuffer.get(), 0);
143*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fDidBindInstanceBuffer = true;)
144*c8dee2aaSAndroid Build Coastguard Worker }
145*c8dee2aaSAndroid Build Coastguard Worker fActiveInstanceBuffer = std::move(instanceBuffer);
146*c8dee2aaSAndroid Build Coastguard Worker
147*c8dee2aaSAndroid Build Coastguard Worker // We differ binding the vertex buffer for one of two situations:
148*c8dee2aaSAndroid Build Coastguard Worker // 1) This platform does not support baseVertex with indexed draws.
149*c8dee2aaSAndroid Build Coastguard Worker // 2) There is a driver bug affecting glDrawArrays.
150*c8dee2aaSAndroid Build Coastguard Worker if ((indexBuffer && fGpu->glCaps().baseVertexBaseInstanceSupport()) ||
151*c8dee2aaSAndroid Build Coastguard Worker (!indexBuffer && !fGpu->glCaps().drawArraysBaseVertexIsBroken())) {
152*c8dee2aaSAndroid Build Coastguard Worker this->bindVertexBuffer(vertexBuffer.get(), 0);
153*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fDidBindVertexBuffer = true;)
154*c8dee2aaSAndroid Build Coastguard Worker }
155*c8dee2aaSAndroid Build Coastguard Worker fActiveVertexBuffer = std::move(vertexBuffer);
156*c8dee2aaSAndroid Build Coastguard Worker fActiveIndexBuffer = std::move(indexBuffer);
157*c8dee2aaSAndroid Build Coastguard Worker }
158*c8dee2aaSAndroid Build Coastguard Worker
bindInstanceBuffer(const GrBuffer * instanceBuffer,int baseInstance)159*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::bindInstanceBuffer(const GrBuffer* instanceBuffer, int baseInstance) {
160*c8dee2aaSAndroid Build Coastguard Worker GrGLProgram* program = fGpu->currentProgram();
161*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(program);
162*c8dee2aaSAndroid Build Coastguard Worker if (int instanceStride = program->instanceStride()) {
163*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(instanceBuffer);
164*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(instanceBuffer->isCpuBuffer() ||
165*c8dee2aaSAndroid Build Coastguard Worker !static_cast<const GrGpuBuffer*>(instanceBuffer)->isMapped());
166*c8dee2aaSAndroid Build Coastguard Worker size_t bufferOffset = baseInstance * static_cast<size_t>(instanceStride);
167*c8dee2aaSAndroid Build Coastguard Worker int attribIdx = program->numVertexAttributes();
168*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < program->numInstanceAttributes(); ++i, ++attribIdx) {
169*c8dee2aaSAndroid Build Coastguard Worker const auto& attrib = program->instanceAttribute(i);
170*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kDivisor = 1;
171*c8dee2aaSAndroid Build Coastguard Worker fAttribArrayState->set(fGpu, attrib.fLocation, instanceBuffer, attrib.fCPUType,
172*c8dee2aaSAndroid Build Coastguard Worker attrib.fGPUType, instanceStride, bufferOffset + attrib.fOffset,
173*c8dee2aaSAndroid Build Coastguard Worker kDivisor);
174*c8dee2aaSAndroid Build Coastguard Worker }
175*c8dee2aaSAndroid Build Coastguard Worker }
176*c8dee2aaSAndroid Build Coastguard Worker }
177*c8dee2aaSAndroid Build Coastguard Worker
bindVertexBuffer(const GrBuffer * vertexBuffer,int baseVertex)178*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::bindVertexBuffer(const GrBuffer* vertexBuffer, int baseVertex) {
179*c8dee2aaSAndroid Build Coastguard Worker GrGLProgram* program = fGpu->currentProgram();
180*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(program);
181*c8dee2aaSAndroid Build Coastguard Worker if (int vertexStride = program->vertexStride()) {
182*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(vertexBuffer);
183*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(vertexBuffer->isCpuBuffer() ||
184*c8dee2aaSAndroid Build Coastguard Worker !static_cast<const GrGpuBuffer*>(vertexBuffer)->isMapped());
185*c8dee2aaSAndroid Build Coastguard Worker size_t bufferOffset = baseVertex * static_cast<size_t>(vertexStride);
186*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < program->numVertexAttributes(); ++i) {
187*c8dee2aaSAndroid Build Coastguard Worker const auto& attrib = program->vertexAttribute(i);
188*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kDivisor = 0;
189*c8dee2aaSAndroid Build Coastguard Worker fAttribArrayState->set(fGpu, attrib.fLocation, vertexBuffer, attrib.fCPUType,
190*c8dee2aaSAndroid Build Coastguard Worker attrib.fGPUType, vertexStride, bufferOffset + attrib.fOffset,
191*c8dee2aaSAndroid Build Coastguard Worker kDivisor);
192*c8dee2aaSAndroid Build Coastguard Worker }
193*c8dee2aaSAndroid Build Coastguard Worker }
194*c8dee2aaSAndroid Build Coastguard Worker }
195*c8dee2aaSAndroid Build Coastguard Worker
onDraw(int vertexCount,int baseVertex)196*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onDraw(int vertexCount, int baseVertex) {
197*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindVertexBuffer || fGpu->glCaps().drawArraysBaseVertexIsBroken());
198*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
199*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().drawArraysBaseVertexIsBroken()) {
200*c8dee2aaSAndroid Build Coastguard Worker this->bindVertexBuffer(fActiveVertexBuffer.get(), baseVertex);
201*c8dee2aaSAndroid Build Coastguard Worker baseVertex = 0;
202*c8dee2aaSAndroid Build Coastguard Worker }
203*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawArrays(glPrimType, baseVertex, vertexCount));
204*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
205*c8dee2aaSAndroid Build Coastguard Worker }
206*c8dee2aaSAndroid Build Coastguard Worker
onDrawIndexed(int indexCount,int baseIndex,uint16_t minIndexValue,uint16_t maxIndexValue,int baseVertex)207*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onDrawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue,
208*c8dee2aaSAndroid Build Coastguard Worker uint16_t maxIndexValue, int baseVertex) {
209*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
210*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().baseVertexBaseInstanceSupport()) {
211*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu->glCaps().drawInstancedSupport());
212*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindVertexBuffer);
213*c8dee2aaSAndroid Build Coastguard Worker if (baseVertex != 0) {
214*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawElementsInstancedBaseVertexBaseInstance(
215*c8dee2aaSAndroid Build Coastguard Worker glPrimType, indexCount, GR_GL_UNSIGNED_SHORT,
216*c8dee2aaSAndroid Build Coastguard Worker this->offsetForBaseIndex(baseIndex), 1, baseVertex, 0));
217*c8dee2aaSAndroid Build Coastguard Worker return;
218*c8dee2aaSAndroid Build Coastguard Worker }
219*c8dee2aaSAndroid Build Coastguard Worker } else {
220*c8dee2aaSAndroid Build Coastguard Worker this->bindVertexBuffer(fActiveVertexBuffer.get(), baseVertex);
221*c8dee2aaSAndroid Build Coastguard Worker }
222*c8dee2aaSAndroid Build Coastguard Worker
223*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().drawRangeElementsSupport()) {
224*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawRangeElements(glPrimType, minIndexValue, maxIndexValue, indexCount,
225*c8dee2aaSAndroid Build Coastguard Worker GR_GL_UNSIGNED_SHORT, this->offsetForBaseIndex(baseIndex)));
226*c8dee2aaSAndroid Build Coastguard Worker } else {
227*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawElements(glPrimType, indexCount, GR_GL_UNSIGNED_SHORT,
228*c8dee2aaSAndroid Build Coastguard Worker this->offsetForBaseIndex(baseIndex)));
229*c8dee2aaSAndroid Build Coastguard Worker }
230*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
231*c8dee2aaSAndroid Build Coastguard Worker }
232*c8dee2aaSAndroid Build Coastguard Worker
onDrawInstanced(int instanceCount,int baseInstance,int vertexCount,int baseVertex)233*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onDrawInstanced(int instanceCount, int baseInstance, int vertexCount,
234*c8dee2aaSAndroid Build Coastguard Worker int baseVertex) {
235*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindVertexBuffer || fGpu->glCaps().drawArraysBaseVertexIsBroken());
236*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().drawArraysBaseVertexIsBroken()) {
237*c8dee2aaSAndroid Build Coastguard Worker // We weren't able to bind the vertex buffer during onBindBuffers because of a driver bug
238*c8dee2aaSAndroid Build Coastguard Worker // affecting glDrawArrays.
239*c8dee2aaSAndroid Build Coastguard Worker this->bindVertexBuffer(fActiveVertexBuffer.get(), 0);
240*c8dee2aaSAndroid Build Coastguard Worker }
241*c8dee2aaSAndroid Build Coastguard Worker int maxInstances = fGpu->glCaps().maxInstancesPerDrawWithoutCrashing(instanceCount);
242*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < instanceCount; i += maxInstances) {
243*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
244*c8dee2aaSAndroid Build Coastguard Worker int instanceCountForDraw = std::min(instanceCount - i, maxInstances);
245*c8dee2aaSAndroid Build Coastguard Worker int baseInstanceForDraw = baseInstance + i;
246*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().baseVertexBaseInstanceSupport()) {
247*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindInstanceBuffer);
248*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawArraysInstancedBaseInstance(glPrimType, baseVertex, vertexCount,
249*c8dee2aaSAndroid Build Coastguard Worker instanceCountForDraw, baseInstanceForDraw));
250*c8dee2aaSAndroid Build Coastguard Worker } else {
251*c8dee2aaSAndroid Build Coastguard Worker this->bindInstanceBuffer(fActiveInstanceBuffer.get(), baseInstanceForDraw);
252*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawArraysInstanced(glPrimType, baseVertex, vertexCount, instanceCountForDraw));
253*c8dee2aaSAndroid Build Coastguard Worker }
254*c8dee2aaSAndroid Build Coastguard Worker }
255*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
256*c8dee2aaSAndroid Build Coastguard Worker }
257*c8dee2aaSAndroid Build Coastguard Worker
onDrawIndexedInstanced(int indexCount,int baseIndex,int instanceCount,int baseInstance,int baseVertex)258*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onDrawIndexedInstanced(int indexCount, int baseIndex, int instanceCount,
259*c8dee2aaSAndroid Build Coastguard Worker int baseInstance, int baseVertex) {
260*c8dee2aaSAndroid Build Coastguard Worker int maxInstances = fGpu->glCaps().maxInstancesPerDrawWithoutCrashing(instanceCount);
261*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < instanceCount; i += maxInstances) {
262*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
263*c8dee2aaSAndroid Build Coastguard Worker int instanceCountForDraw = std::min(instanceCount - i, maxInstances);
264*c8dee2aaSAndroid Build Coastguard Worker int baseInstanceForDraw = baseInstance + i;
265*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().baseVertexBaseInstanceSupport()) {
266*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindInstanceBuffer);
267*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindVertexBuffer);
268*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawElementsInstancedBaseVertexBaseInstance(
269*c8dee2aaSAndroid Build Coastguard Worker glPrimType, indexCount, GR_GL_UNSIGNED_SHORT,
270*c8dee2aaSAndroid Build Coastguard Worker this->offsetForBaseIndex(baseIndex), instanceCountForDraw, baseVertex,
271*c8dee2aaSAndroid Build Coastguard Worker baseInstanceForDraw));
272*c8dee2aaSAndroid Build Coastguard Worker } else {
273*c8dee2aaSAndroid Build Coastguard Worker this->bindInstanceBuffer(fActiveInstanceBuffer.get(), baseInstanceForDraw);
274*c8dee2aaSAndroid Build Coastguard Worker this->bindVertexBuffer(fActiveVertexBuffer.get(), baseVertex);
275*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawElementsInstanced(glPrimType, indexCount, GR_GL_UNSIGNED_SHORT,
276*c8dee2aaSAndroid Build Coastguard Worker this->offsetForBaseIndex(baseIndex), instanceCountForDraw));
277*c8dee2aaSAndroid Build Coastguard Worker }
278*c8dee2aaSAndroid Build Coastguard Worker }
279*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
280*c8dee2aaSAndroid Build Coastguard Worker }
281*c8dee2aaSAndroid Build Coastguard Worker
buffer_offset_to_gl_address(const GrBuffer * drawIndirectBuffer,size_t offset)282*c8dee2aaSAndroid Build Coastguard Worker static const void* buffer_offset_to_gl_address(const GrBuffer* drawIndirectBuffer, size_t offset) {
283*c8dee2aaSAndroid Build Coastguard Worker if (drawIndirectBuffer->isCpuBuffer()) {
284*c8dee2aaSAndroid Build Coastguard Worker return static_cast<const GrCpuBuffer*>(drawIndirectBuffer)->data() + offset;
285*c8dee2aaSAndroid Build Coastguard Worker } else {
286*c8dee2aaSAndroid Build Coastguard Worker return (offset) ? reinterpret_cast<const void*>(offset) : nullptr;
287*c8dee2aaSAndroid Build Coastguard Worker }
288*c8dee2aaSAndroid Build Coastguard Worker }
289*c8dee2aaSAndroid Build Coastguard Worker
onDrawIndirect(const GrBuffer * drawIndirectBuffer,size_t offset,int drawCount)290*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onDrawIndirect(const GrBuffer* drawIndirectBuffer, size_t offset,
291*c8dee2aaSAndroid Build Coastguard Worker int drawCount) {
292*c8dee2aaSAndroid Build Coastguard Worker using MultiDrawType = GrGLCaps::MultiDrawType;
293*c8dee2aaSAndroid Build Coastguard Worker
294*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu->caps()->nativeDrawIndirectSupport());
295*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu->glCaps().baseVertexBaseInstanceSupport());
296*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindVertexBuffer || fGpu->glCaps().drawArraysBaseVertexIsBroken());
297*c8dee2aaSAndroid Build Coastguard Worker
298*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().drawArraysBaseVertexIsBroken()) {
299*c8dee2aaSAndroid Build Coastguard Worker // We weren't able to bind the vertex buffer during onBindBuffers because of a driver bug
300*c8dee2aaSAndroid Build Coastguard Worker // affecting glDrawArrays.
301*c8dee2aaSAndroid Build Coastguard Worker this->bindVertexBuffer(fActiveVertexBuffer.get(), 0);
302*c8dee2aaSAndroid Build Coastguard Worker }
303*c8dee2aaSAndroid Build Coastguard Worker
304*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().multiDrawType() == MultiDrawType::kANGLEOrWebGL) {
305*c8dee2aaSAndroid Build Coastguard Worker // ANGLE and WebGL don't support glDrawElementsIndirect. We draw everything as a multi draw.
306*c8dee2aaSAndroid Build Coastguard Worker this->multiDrawArraysANGLEOrWebGL(drawIndirectBuffer, offset, drawCount);
307*c8dee2aaSAndroid Build Coastguard Worker return;
308*c8dee2aaSAndroid Build Coastguard Worker }
309*c8dee2aaSAndroid Build Coastguard Worker
310*c8dee2aaSAndroid Build Coastguard Worker fGpu->bindBuffer(GrGpuBufferType::kDrawIndirect, drawIndirectBuffer);
311*c8dee2aaSAndroid Build Coastguard Worker
312*c8dee2aaSAndroid Build Coastguard Worker if (drawCount > 1 && fGpu->glCaps().multiDrawType() == MultiDrawType::kMultiDrawIndirect) {
313*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
314*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(MultiDrawArraysIndirect(glPrimType,
315*c8dee2aaSAndroid Build Coastguard Worker buffer_offset_to_gl_address(drawIndirectBuffer, offset),
316*c8dee2aaSAndroid Build Coastguard Worker drawCount, sizeof(GrDrawIndirectCommand)));
317*c8dee2aaSAndroid Build Coastguard Worker return;
318*c8dee2aaSAndroid Build Coastguard Worker }
319*c8dee2aaSAndroid Build Coastguard Worker
320*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < drawCount; ++i) {
321*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
322*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawArraysIndirect(glPrimType,
323*c8dee2aaSAndroid Build Coastguard Worker buffer_offset_to_gl_address(drawIndirectBuffer, offset)));
324*c8dee2aaSAndroid Build Coastguard Worker offset += sizeof(GrDrawIndirectCommand);
325*c8dee2aaSAndroid Build Coastguard Worker }
326*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
327*c8dee2aaSAndroid Build Coastguard Worker }
328*c8dee2aaSAndroid Build Coastguard Worker
multiDrawArraysANGLEOrWebGL(const GrBuffer * drawIndirectBuffer,size_t offset,int drawCount)329*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::multiDrawArraysANGLEOrWebGL(const GrBuffer* drawIndirectBuffer,
330*c8dee2aaSAndroid Build Coastguard Worker size_t offset, int drawCount) {
331*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu->glCaps().multiDrawType() == GrGLCaps::MultiDrawType::kANGLEOrWebGL);
332*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(drawIndirectBuffer->isCpuBuffer());
333*c8dee2aaSAndroid Build Coastguard Worker
334*c8dee2aaSAndroid Build Coastguard Worker constexpr static int kMaxDrawCountPerBatch = 128;
335*c8dee2aaSAndroid Build Coastguard Worker GrGLint fFirsts[kMaxDrawCountPerBatch];
336*c8dee2aaSAndroid Build Coastguard Worker GrGLsizei fCounts[kMaxDrawCountPerBatch];
337*c8dee2aaSAndroid Build Coastguard Worker GrGLsizei fInstanceCounts[kMaxDrawCountPerBatch];
338*c8dee2aaSAndroid Build Coastguard Worker GrGLuint fBaseInstances[kMaxDrawCountPerBatch];
339*c8dee2aaSAndroid Build Coastguard Worker
340*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
341*c8dee2aaSAndroid Build Coastguard Worker auto* cpuBuffer = static_cast<const GrCpuBuffer*>(drawIndirectBuffer);
342*c8dee2aaSAndroid Build Coastguard Worker auto* cmds = reinterpret_cast<const GrDrawIndirectCommand*>(cpuBuffer->data() + offset);
343*c8dee2aaSAndroid Build Coastguard Worker
344*c8dee2aaSAndroid Build Coastguard Worker while (drawCount) {
345*c8dee2aaSAndroid Build Coastguard Worker int countInBatch = std::min(drawCount, kMaxDrawCountPerBatch);
346*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < countInBatch; ++i) {
347*c8dee2aaSAndroid Build Coastguard Worker auto [vertexCount, instanceCount, baseVertex, baseInstance] = cmds[i];
348*c8dee2aaSAndroid Build Coastguard Worker fFirsts[i] = baseVertex;
349*c8dee2aaSAndroid Build Coastguard Worker fCounts[i] = vertexCount;
350*c8dee2aaSAndroid Build Coastguard Worker fInstanceCounts[i] = instanceCount;
351*c8dee2aaSAndroid Build Coastguard Worker fBaseInstances[i] = baseInstance;
352*c8dee2aaSAndroid Build Coastguard Worker }
353*c8dee2aaSAndroid Build Coastguard Worker if (countInBatch == 1) {
354*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawArraysInstancedBaseInstance(glPrimType, fFirsts[0], fCounts[0],
355*c8dee2aaSAndroid Build Coastguard Worker fInstanceCounts[0], fBaseInstances[0]));
356*c8dee2aaSAndroid Build Coastguard Worker } else {
357*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(MultiDrawArraysInstancedBaseInstance(glPrimType, fFirsts, fCounts,
358*c8dee2aaSAndroid Build Coastguard Worker fInstanceCounts, fBaseInstances,
359*c8dee2aaSAndroid Build Coastguard Worker countInBatch));
360*c8dee2aaSAndroid Build Coastguard Worker }
361*c8dee2aaSAndroid Build Coastguard Worker drawCount -= countInBatch;
362*c8dee2aaSAndroid Build Coastguard Worker cmds += countInBatch;
363*c8dee2aaSAndroid Build Coastguard Worker }
364*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
365*c8dee2aaSAndroid Build Coastguard Worker }
366*c8dee2aaSAndroid Build Coastguard Worker
onDrawIndexedIndirect(const GrBuffer * drawIndirectBuffer,size_t offset,int drawCount)367*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onDrawIndexedIndirect(const GrBuffer* drawIndirectBuffer, size_t offset,
368*c8dee2aaSAndroid Build Coastguard Worker int drawCount) {
369*c8dee2aaSAndroid Build Coastguard Worker using MultiDrawType = GrGLCaps::MultiDrawType;
370*c8dee2aaSAndroid Build Coastguard Worker
371*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu->caps()->nativeDrawIndirectSupport());
372*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fGpu->caps()->nativeDrawIndexedIndirectIsBroken());
373*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu->glCaps().baseVertexBaseInstanceSupport());
374*c8dee2aaSAndroid Build Coastguard Worker // The vertex buffer should have already gotten bound (as opposed us stashing it away during
375*c8dee2aaSAndroid Build Coastguard Worker // onBindBuffers and not expecting to bind it until this point).
376*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fDidBindVertexBuffer);
377*c8dee2aaSAndroid Build Coastguard Worker
378*c8dee2aaSAndroid Build Coastguard Worker if (fGpu->glCaps().multiDrawType() == MultiDrawType::kANGLEOrWebGL) {
379*c8dee2aaSAndroid Build Coastguard Worker // ANGLE and WebGL don't support glDrawElementsIndirect. We draw everything as a multi draw.
380*c8dee2aaSAndroid Build Coastguard Worker this->multiDrawElementsANGLEOrWebGL(drawIndirectBuffer, offset, drawCount);
381*c8dee2aaSAndroid Build Coastguard Worker return;
382*c8dee2aaSAndroid Build Coastguard Worker }
383*c8dee2aaSAndroid Build Coastguard Worker
384*c8dee2aaSAndroid Build Coastguard Worker fGpu->bindBuffer(GrGpuBufferType::kDrawIndirect, drawIndirectBuffer);
385*c8dee2aaSAndroid Build Coastguard Worker
386*c8dee2aaSAndroid Build Coastguard Worker if (drawCount > 1 && fGpu->glCaps().multiDrawType() == MultiDrawType::kMultiDrawIndirect) {
387*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
388*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(MultiDrawElementsIndirect(glPrimType, GR_GL_UNSIGNED_SHORT,
389*c8dee2aaSAndroid Build Coastguard Worker buffer_offset_to_gl_address(drawIndirectBuffer, offset),
390*c8dee2aaSAndroid Build Coastguard Worker drawCount, sizeof(GrDrawIndexedIndirectCommand)));
391*c8dee2aaSAndroid Build Coastguard Worker return;
392*c8dee2aaSAndroid Build Coastguard Worker }
393*c8dee2aaSAndroid Build Coastguard Worker
394*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < drawCount; ++i) {
395*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
396*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawElementsIndirect(glPrimType, GR_GL_UNSIGNED_SHORT,
397*c8dee2aaSAndroid Build Coastguard Worker buffer_offset_to_gl_address(drawIndirectBuffer, offset)));
398*c8dee2aaSAndroid Build Coastguard Worker offset += sizeof(GrDrawIndexedIndirectCommand);
399*c8dee2aaSAndroid Build Coastguard Worker }
400*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
401*c8dee2aaSAndroid Build Coastguard Worker }
402*c8dee2aaSAndroid Build Coastguard Worker
multiDrawElementsANGLEOrWebGL(const GrBuffer * drawIndirectBuffer,size_t offset,int drawCount)403*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::multiDrawElementsANGLEOrWebGL(const GrBuffer* drawIndirectBuffer,
404*c8dee2aaSAndroid Build Coastguard Worker size_t offset, int drawCount) {
405*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGpu->glCaps().multiDrawType() == GrGLCaps::MultiDrawType::kANGLEOrWebGL);
406*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(drawIndirectBuffer->isCpuBuffer());
407*c8dee2aaSAndroid Build Coastguard Worker
408*c8dee2aaSAndroid Build Coastguard Worker constexpr static int kMaxDrawCountPerBatch = 128;
409*c8dee2aaSAndroid Build Coastguard Worker GrGLint fCounts[kMaxDrawCountPerBatch];
410*c8dee2aaSAndroid Build Coastguard Worker const void* fIndices[kMaxDrawCountPerBatch];
411*c8dee2aaSAndroid Build Coastguard Worker GrGLsizei fInstanceCounts[kMaxDrawCountPerBatch];
412*c8dee2aaSAndroid Build Coastguard Worker GrGLint fBaseVertices[kMaxDrawCountPerBatch];
413*c8dee2aaSAndroid Build Coastguard Worker GrGLuint fBaseInstances[kMaxDrawCountPerBatch];
414*c8dee2aaSAndroid Build Coastguard Worker
415*c8dee2aaSAndroid Build Coastguard Worker GrGLenum glPrimType = fGpu->prepareToDraw(fPrimitiveType);
416*c8dee2aaSAndroid Build Coastguard Worker auto* cpuBuffer = static_cast<const GrCpuBuffer*>(drawIndirectBuffer);
417*c8dee2aaSAndroid Build Coastguard Worker auto* cmds = reinterpret_cast<const GrDrawIndexedIndirectCommand*>(cpuBuffer->data() + offset);
418*c8dee2aaSAndroid Build Coastguard Worker
419*c8dee2aaSAndroid Build Coastguard Worker while (drawCount) {
420*c8dee2aaSAndroid Build Coastguard Worker int countInBatch = std::min(drawCount, kMaxDrawCountPerBatch);
421*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < countInBatch; ++i) {
422*c8dee2aaSAndroid Build Coastguard Worker auto [indexCount, instanceCount, baseIndex, baseVertex, baseInstance] = cmds[i];
423*c8dee2aaSAndroid Build Coastguard Worker fCounts[i] = indexCount;
424*c8dee2aaSAndroid Build Coastguard Worker fIndices[i] = this->offsetForBaseIndex(baseIndex);
425*c8dee2aaSAndroid Build Coastguard Worker fInstanceCounts[i] = instanceCount;
426*c8dee2aaSAndroid Build Coastguard Worker fBaseVertices[i] = baseVertex;
427*c8dee2aaSAndroid Build Coastguard Worker fBaseInstances[i] = baseInstance;
428*c8dee2aaSAndroid Build Coastguard Worker }
429*c8dee2aaSAndroid Build Coastguard Worker if (countInBatch == 1) {
430*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(DrawElementsInstancedBaseVertexBaseInstance(glPrimType, fCounts[0],
431*c8dee2aaSAndroid Build Coastguard Worker GR_GL_UNSIGNED_SHORT, fIndices[0],
432*c8dee2aaSAndroid Build Coastguard Worker fInstanceCounts[0],
433*c8dee2aaSAndroid Build Coastguard Worker fBaseVertices[0],
434*c8dee2aaSAndroid Build Coastguard Worker fBaseInstances[0]));
435*c8dee2aaSAndroid Build Coastguard Worker } else {
436*c8dee2aaSAndroid Build Coastguard Worker GL_CALL(MultiDrawElementsInstancedBaseVertexBaseInstance(glPrimType, fCounts,
437*c8dee2aaSAndroid Build Coastguard Worker GR_GL_UNSIGNED_SHORT, fIndices,
438*c8dee2aaSAndroid Build Coastguard Worker fInstanceCounts, fBaseVertices,
439*c8dee2aaSAndroid Build Coastguard Worker fBaseInstances, countInBatch));
440*c8dee2aaSAndroid Build Coastguard Worker }
441*c8dee2aaSAndroid Build Coastguard Worker drawCount -= countInBatch;
442*c8dee2aaSAndroid Build Coastguard Worker cmds += countInBatch;
443*c8dee2aaSAndroid Build Coastguard Worker }
444*c8dee2aaSAndroid Build Coastguard Worker fGpu->didDrawTo(fRenderTarget);
445*c8dee2aaSAndroid Build Coastguard Worker }
446*c8dee2aaSAndroid Build Coastguard Worker
onClear(const GrScissorState & scissor,std::array<float,4> color)447*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onClear(const GrScissorState& scissor, std::array<float, 4> color) {
448*c8dee2aaSAndroid Build Coastguard Worker fGpu->clear(scissor, color, fRenderTarget, fUseMultisampleFBO, fOrigin);
449*c8dee2aaSAndroid Build Coastguard Worker }
450*c8dee2aaSAndroid Build Coastguard Worker
onClearStencilClip(const GrScissorState & scissor,bool insideStencilMask)451*c8dee2aaSAndroid Build Coastguard Worker void GrGLOpsRenderPass::onClearStencilClip(const GrScissorState& scissor, bool insideStencilMask) {
452*c8dee2aaSAndroid Build Coastguard Worker fGpu->clearStencilClip(scissor, insideStencilMask, fRenderTarget, fUseMultisampleFBO, fOrigin);
453*c8dee2aaSAndroid Build Coastguard Worker }
454