Home | History | Annotate | Download | only in gpu
      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 "GrPathRenderer.h"
     12 #include "GrPathRendererChain.h"
     13 #include "GrRenderTargetOpList.h"
     14 #include "GrResourceCache.h"
     15 #include "SkTArray.h"
     16 #include "text/GrAtlasTextContext.h"
     17 
     18 class GrContext;
     19 class GrCoverageCountingPathRenderer;
     20 class GrOnFlushCallbackObject;
     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 
     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                                                          bool managedOpList = true);
     44     sk_sp<GrTextureContext> makeTextureContext(sk_sp<GrSurfaceProxy>, sk_sp<SkColorSpace>);
     45 
     46     // The caller automatically gets a ref on the returned opList. It must
     47     // be balanced by an unref call.
     48     // A managed opList is controlled by the drawing manager (i.e., sorted & flushed with the
     49     // other). An unmanaged one is created and used by the onFlushCallback.
     50     sk_sp<GrRenderTargetOpList> newRTOpList(GrRenderTargetProxy* rtp, bool managedOpList);
     51     sk_sp<GrTextureOpList> newTextureOpList(GrTextureProxy* textureProxy);
     52 
     53     GrContext* getContext() { return fContext; }
     54 
     55     GrAtlasTextContext* getAtlasTextContext();
     56 
     57     GrPathRenderer* getPathRenderer(const GrPathRenderer::CanDrawPathArgs& args,
     58                                     bool allowSW,
     59                                     GrPathRendererChain::DrawType drawType,
     60                                     GrPathRenderer::StencilSupport* stencilSupport = nullptr);
     61 
     62     // Returns a direct pointer to the coverage counting path renderer, or null if it is not
     63     // supported and turned on.
     64     GrCoverageCountingPathRenderer* getCoverageCountingPathRenderer();
     65 
     66     void flushIfNecessary() {
     67         GrResourceCache* resourceCache = fContext->contextPriv().getResourceCache();
     68         if (resourceCache && resourceCache->requestsFlush()) {
     69             this->internalFlush(nullptr, GrResourceCache::kCacheRequested, 0, nullptr);
     70         }
     71     }
     72 
     73     static bool ProgramUnitTest(GrContext* context, int maxStages, int maxLevels);
     74 
     75     GrSemaphoresSubmitted prepareSurfaceForExternalIO(GrSurfaceProxy*,
     76                                                       int numSemaphores,
     77                                                       GrBackendSemaphore backendSemaphores[]);
     78 
     79     void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
     80     void testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject*);
     81 
     82     void moveOpListsToDDL(SkDeferredDisplayList* ddl);
     83     void copyOpListsFromDDL(const SkDeferredDisplayList*, GrRenderTargetProxy* newDest);
     84 
     85 private:
     86     GrDrawingManager(GrContext* context,
     87                      const GrPathRendererChain::Options& optionsForPathRendererChain,
     88                      const GrAtlasTextContext::Options& optionsForAtlasTextContext,
     89                      GrSingleOwner* singleOwner)
     90             : fContext(context)
     91             , fOptionsForPathRendererChain(optionsForPathRendererChain)
     92             , fOptionsForAtlasTextContext(optionsForAtlasTextContext)
     93             , fSingleOwner(singleOwner)
     94             , fAbandoned(false)
     95             , fAtlasTextContext(nullptr)
     96             , fPathRendererChain(nullptr)
     97             , fSoftwarePathRenderer(nullptr)
     98             , fFlushing(false) {}
     99 
    100     void abandon();
    101     void cleanup();
    102 
    103     // return true if any opLists were actually executed; false otherwise
    104     bool executeOpLists(int startIndex, int stopIndex, GrOpFlushState*);
    105 
    106     GrSemaphoresSubmitted flush(GrSurfaceProxy* proxy,
    107                                 int numSemaphores = 0,
    108                                 GrBackendSemaphore backendSemaphores[] = nullptr) {
    109         return this->internalFlush(proxy, GrResourceCache::FlushType::kExternal,
    110                                    numSemaphores, backendSemaphores);
    111     }
    112     GrSemaphoresSubmitted internalFlush(GrSurfaceProxy*,
    113                                         GrResourceCache::FlushType,
    114                                         int numSemaphores,
    115                                         GrBackendSemaphore backendSemaphores[]);
    116 
    117     friend class GrContext;  // for access to: ctor, abandon, reset & flush
    118     friend class GrContextPriv; // access to: flush
    119     friend class GrOnFlushResourceProvider; // this is just a shallow wrapper around this class
    120 
    121     static const int kNumPixelGeometries = 5; // The different pixel geometries
    122     static const int kNumDFTOptions = 2;      // DFT or no DFT
    123 
    124     GrContext*                        fContext;
    125     GrPathRendererChain::Options      fOptionsForPathRendererChain;
    126     GrAtlasTextContext::Options       fOptionsForAtlasTextContext;
    127 
    128     // In debug builds we guard against improper thread handling
    129     GrSingleOwner*                    fSingleOwner;
    130 
    131     bool                              fAbandoned;
    132     SkTArray<sk_sp<GrOpList>>         fOpLists;
    133     // These are the IDs of the opLists currently being flushed (in internalFlush)
    134     SkSTArray<8, uint32_t, true>      fFlushingOpListIDs;
    135     // These are the new opLists generated by the onFlush CBs
    136     SkSTArray<8, sk_sp<GrOpList>>     fOnFlushCBOpLists;
    137 
    138     std::unique_ptr<GrAtlasTextContext> fAtlasTextContext;
    139 
    140     GrPathRendererChain*              fPathRendererChain;
    141     GrSoftwarePathRenderer*           fSoftwarePathRenderer;
    142 
    143     GrTokenTracker                    fTokenTracker;
    144     bool                              fFlushing;
    145 
    146     SkTArray<GrOnFlushCallbackObject*> fOnFlushCBObjects;
    147 };
    148 
    149 #endif
    150