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