1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrDrawingManager_DEFINED 9 #define GrDrawingManager_DEFINED 10 11 #include "GrOpFlushState.h" 12 #include "GrPathRenderer.h" 13 #include "GrPathRendererChain.h" 14 #include "GrPreFlushResourceProvider.h" 15 #include "GrRenderTargetOpList.h" 16 #include "GrResourceCache.h" 17 #include "SkTArray.h" 18 #include "text/GrAtlasTextContext.h" 19 20 class GrContext; 21 class GrRenderTargetContext; 22 class GrRenderTargetProxy; 23 class GrSingleOWner; 24 class GrSoftwarePathRenderer; 25 class GrTextureContext; 26 class GrTextureOpList; 27 28 // The GrDrawingManager allocates a new GrRenderTargetContext for each GrRenderTarget 29 // but all of them still land in the same GrOpList! 30 // 31 // In the future this class will allocate a new GrRenderTargetContext for 32 // each GrRenderTarget/GrOpList and manage the DAG. 33 class GrDrawingManager { 34 public: 35 ~GrDrawingManager(); 36 wasAbandoned()37 bool wasAbandoned() const { return fAbandoned; } 38 void freeGpuResources(); 39 40 sk_sp<GrRenderTargetContext> makeRenderTargetContext(sk_sp<GrSurfaceProxy>, 41 sk_sp<SkColorSpace>, 42 const SkSurfaceProps*); 43 sk_sp<GrTextureContext> makeTextureContext(sk_sp<GrSurfaceProxy>, sk_sp<SkColorSpace>); 44 45 // The caller automatically gets a ref on the returned opList. It must 46 // be balanced by an unref call. 47 GrRenderTargetOpList* newOpList(GrRenderTargetProxy* rtp); 48 GrTextureOpList* newOpList(GrTextureProxy* textureProxy); 49 getContext()50 GrContext* getContext() { return fContext; } 51 52 GrAtlasTextContext* getAtlasTextContext(); 53 54 GrPathRenderer* getPathRenderer(const GrPathRenderer::CanDrawPathArgs& args, 55 bool allowSW, 56 GrPathRendererChain::DrawType drawType, 57 GrPathRenderer::StencilSupport* stencilSupport = NULL); 58 flushIfNecessary()59 void flushIfNecessary() { 60 if (fContext->getResourceCache()->requestsFlush()) { 61 this->internalFlush(GrResourceCache::kCacheRequested); 62 } else if (fIsImmediateMode) { 63 this->internalFlush(GrResourceCache::kImmediateMode); 64 } 65 } 66 67 static bool ProgramUnitTest(GrContext* context, int maxStages); 68 69 void prepareSurfaceForExternalIO(GrSurface*); 70 71 void addPreFlushCallbackObject(sk_sp<GrPreFlushCallbackObject> preFlushCBObject); 72 73 private: GrDrawingManager(GrContext * context,const GrRenderTargetOpList::Options & optionsForOpLists,const GrPathRendererChain::Options & optionsForPathRendererChain,bool isImmediateMode,GrSingleOwner * singleOwner)74 GrDrawingManager(GrContext* context, 75 const GrRenderTargetOpList::Options& optionsForOpLists, 76 const GrPathRendererChain::Options& optionsForPathRendererChain, 77 bool isImmediateMode, GrSingleOwner* singleOwner) 78 : fContext(context) 79 , fOptionsForOpLists(optionsForOpLists) 80 , fOptionsForPathRendererChain(optionsForPathRendererChain) 81 , fSingleOwner(singleOwner) 82 , fAbandoned(false) 83 , fAtlasTextContext(nullptr) 84 , fPathRendererChain(nullptr) 85 , fSoftwarePathRenderer(nullptr) 86 , fFlushState(context->getGpu(), context->resourceProvider()) 87 , fFlushing(false) 88 , fIsImmediateMode(isImmediateMode) { 89 } 90 91 void abandon(); 92 void cleanup(); 93 void reset(); flush()94 void flush() { this->internalFlush(GrResourceCache::FlushType::kExternal); } 95 void internalFlush(GrResourceCache::FlushType); 96 97 friend class GrContext; // for access to: ctor, abandon, reset & flush 98 friend class GrPreFlushResourceProvider; // this is just a shallow wrapper around this class 99 100 static const int kNumPixelGeometries = 5; // The different pixel geometries 101 static const int kNumDFTOptions = 2; // DFT or no DFT 102 103 GrContext* fContext; 104 GrRenderTargetOpList::Options fOptionsForOpLists; 105 GrPathRendererChain::Options fOptionsForPathRendererChain; 106 107 // In debug builds we guard against improper thread handling 108 GrSingleOwner* fSingleOwner; 109 110 bool fAbandoned; 111 SkTDArray<GrOpList*> fOpLists; 112 113 std::unique_ptr<GrAtlasTextContext> fAtlasTextContext; 114 115 GrPathRendererChain* fPathRendererChain; 116 GrSoftwarePathRenderer* fSoftwarePathRenderer; 117 118 GrOpFlushState fFlushState; 119 bool fFlushing; 120 121 bool fIsImmediateMode; 122 123 SkTArray<sk_sp<GrPreFlushCallbackObject>> fPreFlushCBObjects; 124 }; 125 126 #endif 127