xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrOpFlushState.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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