1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 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/GrOpFlushState.h"
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkAlphaType.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDataUtils.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageInfo.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPixmap.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramInfo.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSimpleMesh.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxy.h"
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
27*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
30*c8dee2aaSAndroid Build Coastguard Worker
GrOpFlushState(GrGpu * gpu,GrResourceProvider * resourceProvider,skgpu::TokenTracker * tokenTracker,sk_sp<GrBufferAllocPool::CpuBufferCache> cpuBufferCache)31*c8dee2aaSAndroid Build Coastguard Worker GrOpFlushState::GrOpFlushState(GrGpu* gpu, GrResourceProvider* resourceProvider,
32*c8dee2aaSAndroid Build Coastguard Worker skgpu::TokenTracker* tokenTracker,
33*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrBufferAllocPool::CpuBufferCache> cpuBufferCache)
34*c8dee2aaSAndroid Build Coastguard Worker : fVertexPool(gpu, cpuBufferCache)
35*c8dee2aaSAndroid Build Coastguard Worker , fIndexPool(gpu, cpuBufferCache)
36*c8dee2aaSAndroid Build Coastguard Worker , fDrawIndirectPool(gpu, std::move(cpuBufferCache))
37*c8dee2aaSAndroid Build Coastguard Worker , fGpu(gpu)
38*c8dee2aaSAndroid Build Coastguard Worker , fResourceProvider(resourceProvider)
39*c8dee2aaSAndroid Build Coastguard Worker , fTokenTracker(tokenTracker) {}
40*c8dee2aaSAndroid Build Coastguard Worker
caps() const41*c8dee2aaSAndroid Build Coastguard Worker const GrCaps& GrOpFlushState::caps() const {
42*c8dee2aaSAndroid Build Coastguard Worker return *fGpu->caps();
43*c8dee2aaSAndroid Build Coastguard Worker }
44*c8dee2aaSAndroid Build Coastguard Worker
threadSafeCache() const45*c8dee2aaSAndroid Build Coastguard Worker GrThreadSafeCache* GrOpFlushState::threadSafeCache() const {
46*c8dee2aaSAndroid Build Coastguard Worker return fGpu->getContext()->priv().threadSafeCache();
47*c8dee2aaSAndroid Build Coastguard Worker }
48*c8dee2aaSAndroid Build Coastguard Worker
executeDrawsAndUploadsForMeshDrawOp(const GrOp * op,const SkRect & chainBounds,const GrPipeline * pipeline,const GrUserStencilSettings * userStencilSettings)49*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::executeDrawsAndUploadsForMeshDrawOp(
50*c8dee2aaSAndroid Build Coastguard Worker const GrOp* op, const SkRect& chainBounds, const GrPipeline* pipeline,
51*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings* userStencilSettings) {
52*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->opsRenderPass());
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Worker while (fCurrDraw != fDraws.end() && fCurrDraw->fOp == op) {
55*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasToken drawToken = fTokenTracker->nextFlushToken();
56*c8dee2aaSAndroid Build Coastguard Worker while (fCurrUpload != fInlineUploads.end() &&
57*c8dee2aaSAndroid Build Coastguard Worker fCurrUpload->fUploadBeforeToken == drawToken) {
58*c8dee2aaSAndroid Build Coastguard Worker this->opsRenderPass()->inlineUpload(this, fCurrUpload->fUpload);
59*c8dee2aaSAndroid Build Coastguard Worker ++fCurrUpload;
60*c8dee2aaSAndroid Build Coastguard Worker }
61*c8dee2aaSAndroid Build Coastguard Worker
62*c8dee2aaSAndroid Build Coastguard Worker GrProgramInfo programInfo(this->caps(),
63*c8dee2aaSAndroid Build Coastguard Worker this->writeView(),
64*c8dee2aaSAndroid Build Coastguard Worker this->usesMSAASurface(),
65*c8dee2aaSAndroid Build Coastguard Worker pipeline,
66*c8dee2aaSAndroid Build Coastguard Worker userStencilSettings,
67*c8dee2aaSAndroid Build Coastguard Worker fCurrDraw->fGeometryProcessor,
68*c8dee2aaSAndroid Build Coastguard Worker fCurrDraw->fPrimitiveType,
69*c8dee2aaSAndroid Build Coastguard Worker this->renderPassBarriers(),
70*c8dee2aaSAndroid Build Coastguard Worker this->colorLoadOp());
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker this->bindPipelineAndScissorClip(programInfo, chainBounds);
73*c8dee2aaSAndroid Build Coastguard Worker this->bindTextures(programInfo.geomProc(), fCurrDraw->fGeomProcProxies,
74*c8dee2aaSAndroid Build Coastguard Worker programInfo.pipeline());
75*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fCurrDraw->fMeshCnt; ++i) {
76*c8dee2aaSAndroid Build Coastguard Worker this->drawMesh(fCurrDraw->fMeshes[i]);
77*c8dee2aaSAndroid Build Coastguard Worker }
78*c8dee2aaSAndroid Build Coastguard Worker
79*c8dee2aaSAndroid Build Coastguard Worker fTokenTracker->issueFlushToken();
80*c8dee2aaSAndroid Build Coastguard Worker ++fCurrDraw;
81*c8dee2aaSAndroid Build Coastguard Worker }
82*c8dee2aaSAndroid Build Coastguard Worker }
83*c8dee2aaSAndroid Build Coastguard Worker
preExecuteDraws()84*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::preExecuteDraws() {
85*c8dee2aaSAndroid Build Coastguard Worker fVertexPool.unmap();
86*c8dee2aaSAndroid Build Coastguard Worker fIndexPool.unmap();
87*c8dee2aaSAndroid Build Coastguard Worker fDrawIndirectPool.unmap();
88*c8dee2aaSAndroid Build Coastguard Worker for (auto& upload : fASAPUploads) {
89*c8dee2aaSAndroid Build Coastguard Worker this->doUpload(upload);
90*c8dee2aaSAndroid Build Coastguard Worker }
91*c8dee2aaSAndroid Build Coastguard Worker // Setup execution iterators.
92*c8dee2aaSAndroid Build Coastguard Worker fCurrDraw = fDraws.begin();
93*c8dee2aaSAndroid Build Coastguard Worker fCurrUpload = fInlineUploads.begin();
94*c8dee2aaSAndroid Build Coastguard Worker fGpu->willExecute();
95*c8dee2aaSAndroid Build Coastguard Worker }
96*c8dee2aaSAndroid Build Coastguard Worker
reset()97*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::reset() {
98*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fCurrDraw == fDraws.end());
99*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fCurrUpload == fInlineUploads.end());
100*c8dee2aaSAndroid Build Coastguard Worker fVertexPool.reset();
101*c8dee2aaSAndroid Build Coastguard Worker fIndexPool.reset();
102*c8dee2aaSAndroid Build Coastguard Worker fDrawIndirectPool.reset();
103*c8dee2aaSAndroid Build Coastguard Worker fArena.reset();
104*c8dee2aaSAndroid Build Coastguard Worker fASAPUploads.reset();
105*c8dee2aaSAndroid Build Coastguard Worker fInlineUploads.reset();
106*c8dee2aaSAndroid Build Coastguard Worker fDraws.reset();
107*c8dee2aaSAndroid Build Coastguard Worker fBaseDrawToken = skgpu::AtlasToken::InvalidToken();
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker
doUpload(GrDeferredTextureUploadFn & upload,bool shouldPrepareSurfaceForSampling)110*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::doUpload(GrDeferredTextureUploadFn& upload,
111*c8dee2aaSAndroid Build Coastguard Worker bool shouldPrepareSurfaceForSampling) {
112*c8dee2aaSAndroid Build Coastguard Worker GrDeferredTextureUploadWritePixelsFn wp = [this, shouldPrepareSurfaceForSampling](
113*c8dee2aaSAndroid Build Coastguard Worker GrTextureProxy* dstProxy,
114*c8dee2aaSAndroid Build Coastguard Worker SkIRect rect,
115*c8dee2aaSAndroid Build Coastguard Worker GrColorType colorType,
116*c8dee2aaSAndroid Build Coastguard Worker const void* buffer,
117*c8dee2aaSAndroid Build Coastguard Worker size_t rowBytes) {
118*c8dee2aaSAndroid Build Coastguard Worker GrSurface* dstSurface = dstProxy->peekSurface();
119*c8dee2aaSAndroid Build Coastguard Worker if (!fGpu->caps()->surfaceSupportsWritePixels(dstSurface)) {
120*c8dee2aaSAndroid Build Coastguard Worker return false;
121*c8dee2aaSAndroid Build Coastguard Worker }
122*c8dee2aaSAndroid Build Coastguard Worker GrCaps::SupportedWrite supportedWrite = fGpu->caps()->supportedWritePixelsColorType(
123*c8dee2aaSAndroid Build Coastguard Worker colorType, dstSurface->backendFormat(), colorType);
124*c8dee2aaSAndroid Build Coastguard Worker size_t tightRB = rect.width()*GrColorTypeBytesPerPixel(supportedWrite.fColorType);
125*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(rowBytes >= tightRB);
126*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<char[]> tmpPixels;
127*c8dee2aaSAndroid Build Coastguard Worker if (supportedWrite.fColorType != colorType ||
128*c8dee2aaSAndroid Build Coastguard Worker (!fGpu->caps()->writePixelsRowBytesSupport() && rowBytes != tightRB)) {
129*c8dee2aaSAndroid Build Coastguard Worker tmpPixels.reset(new char[rect.height()*tightRB]);
130*c8dee2aaSAndroid Build Coastguard Worker // Use kUnknown to ensure no alpha type conversions or clamping occur.
131*c8dee2aaSAndroid Build Coastguard Worker static constexpr auto kAT = kUnknown_SkAlphaType;
132*c8dee2aaSAndroid Build Coastguard Worker GrImageInfo srcInfo(colorType, kAT, nullptr, rect.size());
133*c8dee2aaSAndroid Build Coastguard Worker GrImageInfo tmpInfo(supportedWrite.fColorType, kAT, nullptr, rect.size());
134*c8dee2aaSAndroid Build Coastguard Worker if (!GrConvertPixels( GrPixmap(tmpInfo, tmpPixels.get(), tightRB ),
135*c8dee2aaSAndroid Build Coastguard Worker GrCPixmap(srcInfo, buffer, rowBytes))) {
136*c8dee2aaSAndroid Build Coastguard Worker return false;
137*c8dee2aaSAndroid Build Coastguard Worker }
138*c8dee2aaSAndroid Build Coastguard Worker rowBytes = tightRB;
139*c8dee2aaSAndroid Build Coastguard Worker buffer = tmpPixels.get();
140*c8dee2aaSAndroid Build Coastguard Worker }
141*c8dee2aaSAndroid Build Coastguard Worker return this->fGpu->writePixels(dstSurface,
142*c8dee2aaSAndroid Build Coastguard Worker rect,
143*c8dee2aaSAndroid Build Coastguard Worker colorType,
144*c8dee2aaSAndroid Build Coastguard Worker supportedWrite.fColorType,
145*c8dee2aaSAndroid Build Coastguard Worker buffer,
146*c8dee2aaSAndroid Build Coastguard Worker rowBytes,
147*c8dee2aaSAndroid Build Coastguard Worker shouldPrepareSurfaceForSampling);
148*c8dee2aaSAndroid Build Coastguard Worker };
149*c8dee2aaSAndroid Build Coastguard Worker upload(wp);
150*c8dee2aaSAndroid Build Coastguard Worker }
151*c8dee2aaSAndroid Build Coastguard Worker
addInlineUpload(GrDeferredTextureUploadFn && upload)152*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasToken GrOpFlushState::addInlineUpload(GrDeferredTextureUploadFn&& upload) {
153*c8dee2aaSAndroid Build Coastguard Worker return fInlineUploads.append(&fArena, std::move(upload), fTokenTracker->nextDrawToken())
154*c8dee2aaSAndroid Build Coastguard Worker .fUploadBeforeToken;
155*c8dee2aaSAndroid Build Coastguard Worker }
156*c8dee2aaSAndroid Build Coastguard Worker
addASAPUpload(GrDeferredTextureUploadFn && upload)157*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasToken GrOpFlushState::addASAPUpload(GrDeferredTextureUploadFn&& upload) {
158*c8dee2aaSAndroid Build Coastguard Worker fASAPUploads.append(&fArena, std::move(upload));
159*c8dee2aaSAndroid Build Coastguard Worker return fTokenTracker->nextFlushToken();
160*c8dee2aaSAndroid Build Coastguard Worker }
161*c8dee2aaSAndroid Build Coastguard Worker
recordDraw(const GrGeometryProcessor * geomProc,const GrSimpleMesh meshes[],int meshCnt,const GrSurfaceProxy * const geomProcProxies[],GrPrimitiveType primitiveType)162*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::recordDraw(
163*c8dee2aaSAndroid Build Coastguard Worker const GrGeometryProcessor* geomProc,
164*c8dee2aaSAndroid Build Coastguard Worker const GrSimpleMesh meshes[],
165*c8dee2aaSAndroid Build Coastguard Worker int meshCnt,
166*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* const geomProcProxies[],
167*c8dee2aaSAndroid Build Coastguard Worker GrPrimitiveType primitiveType) {
168*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fOpArgs);
169*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fOpArgs->validate());
170*c8dee2aaSAndroid Build Coastguard Worker bool firstDraw = fDraws.begin() == fDraws.end();
171*c8dee2aaSAndroid Build Coastguard Worker auto& draw = fDraws.append(&fArena);
172*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasToken token = fTokenTracker->issueDrawToken();
173*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < geomProc->numTextureSamplers(); ++i) {
174*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(geomProcProxies && geomProcProxies[i]);
175*c8dee2aaSAndroid Build Coastguard Worker geomProcProxies[i]->ref();
176*c8dee2aaSAndroid Build Coastguard Worker }
177*c8dee2aaSAndroid Build Coastguard Worker draw.fGeometryProcessor = geomProc;
178*c8dee2aaSAndroid Build Coastguard Worker draw.fGeomProcProxies = geomProcProxies;
179*c8dee2aaSAndroid Build Coastguard Worker draw.fMeshes = meshes;
180*c8dee2aaSAndroid Build Coastguard Worker draw.fMeshCnt = meshCnt;
181*c8dee2aaSAndroid Build Coastguard Worker draw.fOp = fOpArgs->op();
182*c8dee2aaSAndroid Build Coastguard Worker draw.fPrimitiveType = primitiveType;
183*c8dee2aaSAndroid Build Coastguard Worker if (firstDraw) {
184*c8dee2aaSAndroid Build Coastguard Worker fBaseDrawToken = token;
185*c8dee2aaSAndroid Build Coastguard Worker }
186*c8dee2aaSAndroid Build Coastguard Worker }
187*c8dee2aaSAndroid Build Coastguard Worker
makeVertexSpace(size_t vertexSize,int vertexCount,sk_sp<const GrBuffer> * buffer,int * startVertex)188*c8dee2aaSAndroid Build Coastguard Worker void* GrOpFlushState::makeVertexSpace(size_t vertexSize, int vertexCount,
189*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>* buffer, int* startVertex) {
190*c8dee2aaSAndroid Build Coastguard Worker return fVertexPool.makeSpace(vertexSize, vertexCount, buffer, startVertex);
191*c8dee2aaSAndroid Build Coastguard Worker }
192*c8dee2aaSAndroid Build Coastguard Worker
makeIndexSpace(int indexCount,sk_sp<const GrBuffer> * buffer,int * startIndex)193*c8dee2aaSAndroid Build Coastguard Worker uint16_t* GrOpFlushState::makeIndexSpace(int indexCount, sk_sp<const GrBuffer>* buffer,
194*c8dee2aaSAndroid Build Coastguard Worker int* startIndex) {
195*c8dee2aaSAndroid Build Coastguard Worker return reinterpret_cast<uint16_t*>(fIndexPool.makeSpace(indexCount, buffer, startIndex));
196*c8dee2aaSAndroid Build Coastguard Worker }
197*c8dee2aaSAndroid Build Coastguard Worker
makeVertexSpaceAtLeast(size_t vertexSize,int minVertexCount,int fallbackVertexCount,sk_sp<const GrBuffer> * buffer,int * startVertex,int * actualVertexCount)198*c8dee2aaSAndroid Build Coastguard Worker void* GrOpFlushState::makeVertexSpaceAtLeast(size_t vertexSize, int minVertexCount,
199*c8dee2aaSAndroid Build Coastguard Worker int fallbackVertexCount, sk_sp<const GrBuffer>* buffer,
200*c8dee2aaSAndroid Build Coastguard Worker int* startVertex, int* actualVertexCount) {
201*c8dee2aaSAndroid Build Coastguard Worker return fVertexPool.makeSpaceAtLeast(vertexSize, minVertexCount, fallbackVertexCount, buffer,
202*c8dee2aaSAndroid Build Coastguard Worker startVertex, actualVertexCount);
203*c8dee2aaSAndroid Build Coastguard Worker }
204*c8dee2aaSAndroid Build Coastguard Worker
makeIndexSpaceAtLeast(int minIndexCount,int fallbackIndexCount,sk_sp<const GrBuffer> * buffer,int * startIndex,int * actualIndexCount)205*c8dee2aaSAndroid Build Coastguard Worker uint16_t* GrOpFlushState::makeIndexSpaceAtLeast(int minIndexCount, int fallbackIndexCount,
206*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>* buffer, int* startIndex,
207*c8dee2aaSAndroid Build Coastguard Worker int* actualIndexCount) {
208*c8dee2aaSAndroid Build Coastguard Worker return reinterpret_cast<uint16_t*>(fIndexPool.makeSpaceAtLeast(
209*c8dee2aaSAndroid Build Coastguard Worker minIndexCount, fallbackIndexCount, buffer, startIndex, actualIndexCount));
210*c8dee2aaSAndroid Build Coastguard Worker }
211*c8dee2aaSAndroid Build Coastguard Worker
putBackIndices(int indexCount)212*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::putBackIndices(int indexCount) {
213*c8dee2aaSAndroid Build Coastguard Worker fIndexPool.putBack(indexCount * sizeof(uint16_t));
214*c8dee2aaSAndroid Build Coastguard Worker }
215*c8dee2aaSAndroid Build Coastguard Worker
putBackVertices(int vertices,size_t vertexStride)216*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::putBackVertices(int vertices, size_t vertexStride) {
217*c8dee2aaSAndroid Build Coastguard Worker fVertexPool.putBack(vertices * vertexStride);
218*c8dee2aaSAndroid Build Coastguard Worker }
219*c8dee2aaSAndroid Build Coastguard Worker
detachAppliedClip()220*c8dee2aaSAndroid Build Coastguard Worker GrAppliedClip GrOpFlushState::detachAppliedClip() {
221*c8dee2aaSAndroid Build Coastguard Worker return fOpArgs->appliedClip() ? std::move(*fOpArgs->appliedClip()) : GrAppliedClip::Disabled();
222*c8dee2aaSAndroid Build Coastguard Worker }
223*c8dee2aaSAndroid Build Coastguard Worker
strikeCache() const224*c8dee2aaSAndroid Build Coastguard Worker sktext::gpu::StrikeCache* GrOpFlushState::strikeCache() const {
225*c8dee2aaSAndroid Build Coastguard Worker return fGpu->getContext()->priv().getStrikeCache();
226*c8dee2aaSAndroid Build Coastguard Worker }
227*c8dee2aaSAndroid Build Coastguard Worker
atlasManager() const228*c8dee2aaSAndroid Build Coastguard Worker GrAtlasManager* GrOpFlushState::atlasManager() const {
229*c8dee2aaSAndroid Build Coastguard Worker return fGpu->getContext()->priv().getAtlasManager();
230*c8dee2aaSAndroid Build Coastguard Worker }
231*c8dee2aaSAndroid Build Coastguard Worker
232*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE)
smallPathAtlasManager() const233*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SmallPathAtlasMgr* GrOpFlushState::smallPathAtlasManager() const {
234*c8dee2aaSAndroid Build Coastguard Worker return fGpu->getContext()->priv().getSmallPathAtlasMgr();
235*c8dee2aaSAndroid Build Coastguard Worker }
236*c8dee2aaSAndroid Build Coastguard Worker #endif
237*c8dee2aaSAndroid Build Coastguard Worker
drawMesh(const GrSimpleMesh & mesh)238*c8dee2aaSAndroid Build Coastguard Worker void GrOpFlushState::drawMesh(const GrSimpleMesh& mesh) {
239*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(mesh.fIsInitialized);
240*c8dee2aaSAndroid Build Coastguard Worker if (!mesh.fIndexBuffer) {
241*c8dee2aaSAndroid Build Coastguard Worker this->bindBuffers(nullptr, nullptr, mesh.fVertexBuffer);
242*c8dee2aaSAndroid Build Coastguard Worker this->draw(mesh.fVertexCount, mesh.fBaseVertex);
243*c8dee2aaSAndroid Build Coastguard Worker } else {
244*c8dee2aaSAndroid Build Coastguard Worker this->bindBuffers(mesh.fIndexBuffer, nullptr, mesh.fVertexBuffer, mesh.fPrimitiveRestart);
245*c8dee2aaSAndroid Build Coastguard Worker if (0 == mesh.fPatternRepeatCount) {
246*c8dee2aaSAndroid Build Coastguard Worker this->drawIndexed(mesh.fIndexCount, mesh.fBaseIndex, mesh.fMinIndexValue,
247*c8dee2aaSAndroid Build Coastguard Worker mesh.fMaxIndexValue, mesh.fBaseVertex);
248*c8dee2aaSAndroid Build Coastguard Worker } else {
249*c8dee2aaSAndroid Build Coastguard Worker this->drawIndexPattern(mesh.fIndexCount, mesh.fPatternRepeatCount,
250*c8dee2aaSAndroid Build Coastguard Worker mesh.fMaxPatternRepetitionsInIndexBuffer, mesh.fVertexCount,
251*c8dee2aaSAndroid Build Coastguard Worker mesh.fBaseVertex);
252*c8dee2aaSAndroid Build Coastguard Worker }
253*c8dee2aaSAndroid Build Coastguard Worker }
254*c8dee2aaSAndroid Build Coastguard Worker }
255*c8dee2aaSAndroid Build Coastguard Worker
256*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
257*c8dee2aaSAndroid Build Coastguard Worker
~Draw()258*c8dee2aaSAndroid Build Coastguard Worker GrOpFlushState::Draw::~Draw() {
259*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fGeometryProcessor->numTextureSamplers(); ++i) {
260*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fGeomProcProxies && fGeomProcProxies[i]);
261*c8dee2aaSAndroid Build Coastguard Worker fGeomProcProxies[i]->unref();
262*c8dee2aaSAndroid Build Coastguard Worker }
263*c8dee2aaSAndroid Build Coastguard Worker }
264