xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrDrawingManager.h (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 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrDrawingManager_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrDrawingManager_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/AtlasTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBufferAllocPool.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrHashMapWithCache.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/PathRenderer.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/PathRendererChain.h"
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
25*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
26*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
27*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker // Enabling this will print out which path renderers are being chosen
30*c8dee2aaSAndroid Build Coastguard Worker #define GR_PATH_RENDERER_SPEW 0
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker class GrArenas;
33*c8dee2aaSAndroid Build Coastguard Worker class GrDeferredDisplayList;
34*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext;
35*c8dee2aaSAndroid Build Coastguard Worker class GrGpuBuffer;
36*c8dee2aaSAndroid Build Coastguard Worker class GrOnFlushCallbackObject;
37*c8dee2aaSAndroid Build Coastguard Worker class GrOpFlushState;
38*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
39*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy;
40*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTask;
41*c8dee2aaSAndroid Build Coastguard Worker class GrResourceAllocator;
42*c8dee2aaSAndroid Build Coastguard Worker class GrSemaphore;
43*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView;
44*c8dee2aaSAndroid Build Coastguard Worker class GrTextureResolveRenderTask;
45*c8dee2aaSAndroid Build Coastguard Worker class SkData;
46*c8dee2aaSAndroid Build Coastguard Worker enum GrSurfaceOrigin : int;
47*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType;
48*c8dee2aaSAndroid Build Coastguard Worker enum class GrSemaphoresSubmitted : bool;
49*c8dee2aaSAndroid Build Coastguard Worker struct GrFlushInfo;
50*c8dee2aaSAndroid Build Coastguard Worker struct GrMipLevel;
51*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect;
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker namespace SkSurfaces {
54*c8dee2aaSAndroid Build Coastguard Worker enum class BackendSurfaceAccess;
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
57*c8dee2aaSAndroid Build Coastguard Worker class MutableTextureState;
58*c8dee2aaSAndroid Build Coastguard Worker namespace ganesh {
59*c8dee2aaSAndroid Build Coastguard Worker class AtlasPathRenderer;
60*c8dee2aaSAndroid Build Coastguard Worker class OpsTask;
61*c8dee2aaSAndroid Build Coastguard Worker class SoftwarePathRenderer;
62*c8dee2aaSAndroid Build Coastguard Worker }  // namespace ganesh
63*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker class GrDrawingManager {
66*c8dee2aaSAndroid Build Coastguard Worker public:
67*c8dee2aaSAndroid Build Coastguard Worker     ~GrDrawingManager();
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker     void freeGpuResources();
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     // OpsTasks created at flush time are stored and handled different from the others.
72*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::ganesh::OpsTask> newOpsTask(GrSurfaceProxyView, sk_sp<GrArenas> arenas);
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     // Adds 'atlasTask' to the DAG and leaves it open.
75*c8dee2aaSAndroid Build Coastguard Worker     //
76*c8dee2aaSAndroid Build Coastguard Worker     // If 'previousAtlasTask' is provided, closes it and configures dependencies to guarantee
77*c8dee2aaSAndroid Build Coastguard Worker     // previousAtlasTask and all its users are completely out of service before atlasTask executes.
78*c8dee2aaSAndroid Build Coastguard Worker     void addAtlasTask(sk_sp<GrRenderTask> atlasTask, GrRenderTask* previousAtlasTask);
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     // Create a render task that can resolve MSAA and/or regenerate mipmap levels on proxies. This
81*c8dee2aaSAndroid Build Coastguard Worker     // method will only add the new render task to the list. However, it adds the task before the
82*c8dee2aaSAndroid Build Coastguard Worker     // last task in the list. It is up to the caller to call addProxy() on the returned object.
83*c8dee2aaSAndroid Build Coastguard Worker     GrTextureResolveRenderTask* newTextureResolveRenderTaskBefore(const GrCaps&);
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker     // Creates a render task that can resolve MSAA and/or regenerate mimap levels on the passed in
86*c8dee2aaSAndroid Build Coastguard Worker     // proxy. The task is appended to the end of the current list of tasks.
87*c8dee2aaSAndroid Build Coastguard Worker     void newTextureResolveRenderTask(sk_sp<GrSurfaceProxy> proxy,
88*c8dee2aaSAndroid Build Coastguard Worker                                      GrSurfaceProxy::ResolveFlags,
89*c8dee2aaSAndroid Build Coastguard Worker                                      const GrCaps&);
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     // Create a new render task that will cause the gpu to wait on semaphores before executing any
92*c8dee2aaSAndroid Build Coastguard Worker     // more RenderTasks that target proxy. It is possible for this wait to also block additional
93*c8dee2aaSAndroid Build Coastguard Worker     // work (even to other proxies) that has already been recorded or will be recorded later. The
94*c8dee2aaSAndroid Build Coastguard Worker     // only guarantee is that future work to the passed in proxy will wait on the semaphores to be
95*c8dee2aaSAndroid Build Coastguard Worker     // signaled.
96*c8dee2aaSAndroid Build Coastguard Worker     void newWaitRenderTask(const sk_sp<GrSurfaceProxy>& proxy,
97*c8dee2aaSAndroid Build Coastguard Worker                            std::unique_ptr<std::unique_ptr<GrSemaphore>[]>,
98*c8dee2aaSAndroid Build Coastguard Worker                            int numSemaphores);
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker     // Create a new render task which copies the pixels from the srcProxy into the dstBuffer. This
101*c8dee2aaSAndroid Build Coastguard Worker     // is used to support the asynchronous readback API. The srcRect is the region of the srcProxy
102*c8dee2aaSAndroid Build Coastguard Worker     // to be copied. The surfaceColorType says how we should interpret the data when reading back
103*c8dee2aaSAndroid Build Coastguard Worker     // from the source. DstColorType describes how the data should be stored in the dstBuffer.
104*c8dee2aaSAndroid Build Coastguard Worker     // DstOffset is the offset into the dstBuffer where we will start writing data.
105*c8dee2aaSAndroid Build Coastguard Worker     void newTransferFromRenderTask(const sk_sp<GrSurfaceProxy>& srcProxy, const SkIRect& srcRect,
106*c8dee2aaSAndroid Build Coastguard Worker                                    GrColorType surfaceColorType, GrColorType dstColorType,
107*c8dee2aaSAndroid Build Coastguard Worker                                    sk_sp<GrGpuBuffer> dstBuffer, size_t dstOffset);
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker     // Creates a new render task which copies a pixel rectangle from srcView into dstView. The src
110*c8dee2aaSAndroid Build Coastguard Worker     // pixels copied are specified by srcRect. They are copied to the dstRect in dstProxy. Some
111*c8dee2aaSAndroid Build Coastguard Worker     // backends and formats may require dstRect to have the same size as srcRect. Regardless,
112*c8dee2aaSAndroid Build Coastguard Worker     // srcRect must be contained by src's dimensions and dstRect must be contained by dst's
113*c8dee2aaSAndroid Build Coastguard Worker     // dimensions. Any clipping, aspect-ratio adjustment, etc. must be handled prior to this call.
114*c8dee2aaSAndroid Build Coastguard Worker     //
115*c8dee2aaSAndroid Build Coastguard Worker     // This method is not guaranteed to succeed depending on the type of surface, formats, etc, and
116*c8dee2aaSAndroid Build Coastguard Worker     // the backend-specific limitations. On success the task is returned so that the caller may mark
117*c8dee2aaSAndroid Build Coastguard Worker     // it skippable if the copy is later deemed unnecessary.
118*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTask> newCopyRenderTask(sk_sp<GrSurfaceProxy> dst,
119*c8dee2aaSAndroid Build Coastguard Worker                                           SkIRect dstRect,
120*c8dee2aaSAndroid Build Coastguard Worker                                           const sk_sp<GrSurfaceProxy>& src,
121*c8dee2aaSAndroid Build Coastguard Worker                                           SkIRect srcRect,
122*c8dee2aaSAndroid Build Coastguard Worker                                           GrSamplerState::Filter filter,
123*c8dee2aaSAndroid Build Coastguard Worker                                           GrSurfaceOrigin);
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker     // Adds a render task that copies the range [srcOffset, srcOffset + size] from src to
126*c8dee2aaSAndroid Build Coastguard Worker     // [dstOffset, dstOffset + size] in dst. The src buffer must have type kXferCpuToGpu and the
127*c8dee2aaSAndroid Build Coastguard Worker     // dst must NOT have type kXferCpuToGpu. Neither buffer may be mapped when this executes.
128*c8dee2aaSAndroid Build Coastguard Worker     // Because this is used to insert transfers to vertex/index buffers between draws and we don't
129*c8dee2aaSAndroid Build Coastguard Worker     // track dependencies with buffers, this task is a hard boundary for task reordering.
130*c8dee2aaSAndroid Build Coastguard Worker     void newBufferTransferTask(sk_sp<GrGpuBuffer> src,
131*c8dee2aaSAndroid Build Coastguard Worker                                size_t srcOffset,
132*c8dee2aaSAndroid Build Coastguard Worker                                sk_sp<GrGpuBuffer> dst,
133*c8dee2aaSAndroid Build Coastguard Worker                                size_t dstOffset,
134*c8dee2aaSAndroid Build Coastguard Worker                                size_t size);
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker     // Adds a render task that copies the src SkData to [dstOffset, dstOffset + src->size()] in dst.
137*c8dee2aaSAndroid Build Coastguard Worker     // The dst must not have type kXferCpuToGpu and must not be mapped. Because this is used to
138*c8dee2aaSAndroid Build Coastguard Worker     // insert updata to vertex/index buffers between draws and we don't track dependencies with
139*c8dee2aaSAndroid Build Coastguard Worker     // buffers, this task is a hard boundary for task reordering.
140*c8dee2aaSAndroid Build Coastguard Worker     void newBufferUpdateTask(sk_sp<SkData> src, sk_sp<GrGpuBuffer> dst, size_t dstOffset);
141*c8dee2aaSAndroid Build Coastguard Worker 
142*c8dee2aaSAndroid Build Coastguard Worker     // Adds a task that writes the data from the passed GrMipLevels to dst. The lifetime of the
143*c8dee2aaSAndroid Build Coastguard Worker     // pixel data in the levels should be tied to the passed SkData or the caller must flush the
144*c8dee2aaSAndroid Build Coastguard Worker     // context before the data may become invalid. srcColorType is the color type of the
145*c8dee2aaSAndroid Build Coastguard Worker     // GrMipLevels. dstColorType is the color type being used with dst and must be compatible with
146*c8dee2aaSAndroid Build Coastguard Worker     // dst's format according to GrCaps::areColorTypeAndFormatCompatible().
147*c8dee2aaSAndroid Build Coastguard Worker     bool newWritePixelsTask(sk_sp<GrSurfaceProxy> dst,
148*c8dee2aaSAndroid Build Coastguard Worker                             SkIRect rect,
149*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType srcColorType,
150*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType dstColorType,
151*c8dee2aaSAndroid Build Coastguard Worker                             const GrMipLevel[],
152*c8dee2aaSAndroid Build Coastguard Worker                             int levelCount);
153*c8dee2aaSAndroid Build Coastguard Worker 
getContext()154*c8dee2aaSAndroid Build Coastguard Worker     GrRecordingContext* getContext() { return fContext; }
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker     using PathRenderer = skgpu::ganesh::PathRenderer;
157*c8dee2aaSAndroid Build Coastguard Worker     using PathRendererChain = skgpu::ganesh::PathRendererChain;
158*c8dee2aaSAndroid Build Coastguard Worker 
159*c8dee2aaSAndroid Build Coastguard Worker     PathRenderer* getPathRenderer(const PathRenderer::CanDrawPathArgs&,
160*c8dee2aaSAndroid Build Coastguard Worker                                   bool allowSW,
161*c8dee2aaSAndroid Build Coastguard Worker                                   PathRendererChain::DrawType,
162*c8dee2aaSAndroid Build Coastguard Worker                                   PathRenderer::StencilSupport* = nullptr);
163*c8dee2aaSAndroid Build Coastguard Worker 
164*c8dee2aaSAndroid Build Coastguard Worker     PathRenderer* getSoftwarePathRenderer();
165*c8dee2aaSAndroid Build Coastguard Worker 
166*c8dee2aaSAndroid Build Coastguard Worker     // Returns a direct pointer to the atlas path renderer, or null if it is not supported and
167*c8dee2aaSAndroid Build Coastguard Worker     // turned on.
168*c8dee2aaSAndroid Build Coastguard Worker     skgpu::ganesh::AtlasPathRenderer* getAtlasPathRenderer();
169*c8dee2aaSAndroid Build Coastguard Worker 
170*c8dee2aaSAndroid Build Coastguard Worker     // Returns a direct pointer to the tessellation path renderer, or null if it is not supported
171*c8dee2aaSAndroid Build Coastguard Worker     // and turned on.
172*c8dee2aaSAndroid Build Coastguard Worker     PathRenderer* getTessellationPathRenderer();
173*c8dee2aaSAndroid Build Coastguard Worker 
174*c8dee2aaSAndroid Build Coastguard Worker     void flushIfNecessary();
175*c8dee2aaSAndroid Build Coastguard Worker 
176*c8dee2aaSAndroid Build Coastguard Worker     static bool ProgramUnitTest(GrDirectContext*, int maxStages, int maxLevels);
177*c8dee2aaSAndroid Build Coastguard Worker 
178*c8dee2aaSAndroid Build Coastguard Worker     GrSemaphoresSubmitted flushSurfaces(SkSpan<GrSurfaceProxy*>,
179*c8dee2aaSAndroid Build Coastguard Worker                                         SkSurfaces::BackendSurfaceAccess,
180*c8dee2aaSAndroid Build Coastguard Worker                                         const GrFlushInfo&,
181*c8dee2aaSAndroid Build Coastguard Worker                                         const skgpu::MutableTextureState* newState);
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
186*c8dee2aaSAndroid Build Coastguard Worker     void testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject*);
testingOnly_getOptionsForPathRendererChain()187*c8dee2aaSAndroid Build Coastguard Worker     PathRendererChain::Options testingOnly_getOptionsForPathRendererChain() {
188*c8dee2aaSAndroid Build Coastguard Worker         return fOptionsForPathRendererChain;
189*c8dee2aaSAndroid Build Coastguard Worker     }
190*c8dee2aaSAndroid Build Coastguard Worker #endif
191*c8dee2aaSAndroid Build Coastguard Worker 
192*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTask* getLastRenderTask(const GrSurfaceProxy*) const;
193*c8dee2aaSAndroid Build Coastguard Worker     skgpu::ganesh::OpsTask* getLastOpsTask(const GrSurfaceProxy*) const;
194*c8dee2aaSAndroid Build Coastguard Worker     void setLastRenderTask(const GrSurfaceProxy*, GrRenderTask*);
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     void moveRenderTasksToDDL(GrDeferredDisplayList* ddl);
197*c8dee2aaSAndroid Build Coastguard Worker     void createDDLTask(sk_sp<const GrDeferredDisplayList>,
198*c8dee2aaSAndroid Build Coastguard Worker                        sk_sp<GrRenderTargetProxy> newDest);
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker     // This is public so it can be called by an SkImage factory (in SkImages namespace).
201*c8dee2aaSAndroid Build Coastguard Worker     // It is not meant to be directly called in other situations.
202*c8dee2aaSAndroid Build Coastguard Worker     bool flush(SkSpan<GrSurfaceProxy*> proxies,
203*c8dee2aaSAndroid Build Coastguard Worker                SkSurfaces::BackendSurfaceAccess access,
204*c8dee2aaSAndroid Build Coastguard Worker                const GrFlushInfo&,
205*c8dee2aaSAndroid Build Coastguard Worker                const skgpu::MutableTextureState* newState);
206*c8dee2aaSAndroid Build Coastguard Worker 
207*c8dee2aaSAndroid Build Coastguard Worker private:
208*c8dee2aaSAndroid Build Coastguard Worker     GrDrawingManager(GrRecordingContext*,
209*c8dee2aaSAndroid Build Coastguard Worker                      const PathRendererChain::Options&,
210*c8dee2aaSAndroid Build Coastguard Worker                      bool reduceOpsTaskSplitting);
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker     bool wasAbandoned() const;
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker     void closeActiveOpsTask();
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker     // return true if any GrRenderTasks were actually executed; false otherwise
217*c8dee2aaSAndroid Build Coastguard Worker     bool executeRenderTasks(GrOpFlushState*);
218*c8dee2aaSAndroid Build Coastguard Worker 
219*c8dee2aaSAndroid Build Coastguard Worker     void removeRenderTasks();
220*c8dee2aaSAndroid Build Coastguard Worker 
221*c8dee2aaSAndroid Build Coastguard Worker     void sortTasks();
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker     // Attempt to reorder tasks to reduce render passes, and check the memory budget of the
224*c8dee2aaSAndroid Build Coastguard Worker     // resulting intervals. Returns whether the reordering was successful & the memory budget
225*c8dee2aaSAndroid Build Coastguard Worker     // acceptable. If it returns true, fDAG has been updated to reflect the reordered tasks.
226*c8dee2aaSAndroid Build Coastguard Worker     bool reorderTasks(GrResourceAllocator*);
227*c8dee2aaSAndroid Build Coastguard Worker 
228*c8dee2aaSAndroid Build Coastguard Worker     void closeAllTasks();
229*c8dee2aaSAndroid Build Coastguard Worker 
230*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTask* appendTask(sk_sp<GrRenderTask>);
231*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTask* insertTaskBeforeLast(sk_sp<GrRenderTask>);
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker     bool submitToGpu();
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(void validate() const;)
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker     friend class GrDirectContext; // access to: flush & cleanup
238*c8dee2aaSAndroid Build Coastguard Worker     friend class GrOnFlushResourceProvider; // this is just a shallow wrapper around this class
239*c8dee2aaSAndroid Build Coastguard Worker     friend class GrRecordingContext;  // access to: ctor
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker     static const int kNumPixelGeometries = 5; // The different pixel geometries
242*c8dee2aaSAndroid Build Coastguard Worker     static const int kNumDFTOptions = 2;      // DFT or no DFT
243*c8dee2aaSAndroid Build Coastguard Worker 
244*c8dee2aaSAndroid Build Coastguard Worker     GrRecordingContext*                        fContext;
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker     // This cache is used by both the vertex and index pools. It reuses memory across multiple
247*c8dee2aaSAndroid Build Coastguard Worker     // flushes.
248*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrBufferAllocPool::CpuBufferCache>   fCpuBufferCache;
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<sk_sp<GrRenderTask>>  fDAG;
251*c8dee2aaSAndroid Build Coastguard Worker     std::vector<int>                           fReorderBlockerTaskIndices;
252*c8dee2aaSAndroid Build Coastguard Worker     skgpu::ganesh::OpsTask*                    fActiveOpsTask = nullptr;
253*c8dee2aaSAndroid Build Coastguard Worker 
254*c8dee2aaSAndroid Build Coastguard Worker     PathRendererChain::Options                 fOptionsForPathRendererChain;
255*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<PathRendererChain>         fPathRendererChain;
256*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::ganesh::SoftwarePathRenderer> fSoftwarePathRenderer;
257*c8dee2aaSAndroid Build Coastguard Worker 
258*c8dee2aaSAndroid Build Coastguard Worker     skgpu::TokenTracker                        fTokenTracker;
259*c8dee2aaSAndroid Build Coastguard Worker     bool                                       fFlushing = false;
260*c8dee2aaSAndroid Build Coastguard Worker     const bool                                 fReduceOpsTaskSplitting;
261*c8dee2aaSAndroid Build Coastguard Worker 
262*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<GrOnFlushCallbackObject*> fOnFlushCBObjects;
263*c8dee2aaSAndroid Build Coastguard Worker 
264*c8dee2aaSAndroid Build Coastguard Worker     struct SurfaceIDKeyTraits {
GetInvalidKeySurfaceIDKeyTraits265*c8dee2aaSAndroid Build Coastguard Worker         static uint32_t GetInvalidKey() {
266*c8dee2aaSAndroid Build Coastguard Worker             return GrSurfaceProxy::UniqueID::InvalidID().asUInt();
267*c8dee2aaSAndroid Build Coastguard Worker         }
268*c8dee2aaSAndroid Build Coastguard Worker     };
269*c8dee2aaSAndroid Build Coastguard Worker 
270*c8dee2aaSAndroid Build Coastguard Worker     GrHashMapWithCache<uint32_t, GrRenderTask*, SurfaceIDKeyTraits, GrCheapHash> fLastRenderTasks;
271*c8dee2aaSAndroid Build Coastguard Worker };
272*c8dee2aaSAndroid Build Coastguard Worker 
273*c8dee2aaSAndroid Build Coastguard Worker #endif
274