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*, const GrPathRendererChain::Options&,
     87                      const GrAtlasTextContext::Options&, GrSingleOwner*,
     88                      GrContextOptions::Enable sortRenderTargets);
     89 
     90     void abandon();
     91     void cleanup();
     92 
     93     // return true if any opLists were actually executed; false otherwise
     94     bool executeOpLists(int startIndex, int stopIndex, GrOpFlushState*);
     95 
     96     GrSemaphoresSubmitted flush(GrSurfaceProxy* proxy,
     97                                 int numSemaphores = 0,
     98                                 GrBackendSemaphore backendSemaphores[] = nullptr) {
     99         return this->internalFlush(proxy, GrResourceCache::FlushType::kExternal,
    100                                    numSemaphores, backendSemaphores);
    101     }
    102     GrSemaphoresSubmitted internalFlush(GrSurfaceProxy*,
    103                                         GrResourceCache::FlushType,
    104                                         int numSemaphores,
    105                                         GrBackendSemaphore backendSemaphores[]);
    106 
    107     friend class GrContext;  // for access to: ctor, abandon, reset & flush
    108     friend class GrContextPriv; // access to: flush
    109     friend class GrOnFlushResourceProvider; // this is just a shallow wrapper around this class
    110 
    111     static const int kNumPixelGeometries = 5; // The different pixel geometries
    112     static const int kNumDFTOptions = 2;      // DFT or no DFT
    113 
    114     GrContext*                        fContext;
    115     GrPathRendererChain::Options      fOptionsForPathRendererChain;
    116     GrAtlasTextContext::Options       fOptionsForAtlasTextContext;
    117 
    118     // In debug builds we guard against improper thread handling
    119     GrSingleOwner*                    fSingleOwner;
    120 
    121     bool                              fAbandoned;
    122     SkTArray<sk_sp<GrOpList>>         fOpLists;
    123     // These are the IDs of the opLists currently being flushed (in internalFlush)
    124     SkSTArray<8, uint32_t, true>      fFlushingOpListIDs;
    125     // These are the new opLists generated by the onFlush CBs
    126     SkSTArray<8, sk_sp<GrOpList>>     fOnFlushCBOpLists;
    127 
    128     std::unique_ptr<GrAtlasTextContext> fAtlasTextContext;
    129 
    130     GrPathRendererChain*              fPathRendererChain;
    131     GrSoftwarePathRenderer*           fSoftwarePathRenderer;
    132 
    133     GrTokenTracker                    fTokenTracker;
    134     bool                              fFlushing;
    135     bool                              fSortRenderTargets;
    136 
    137     SkTArray<GrOnFlushCallbackObject*> fOnFlushCBObjects;
    138 };
    139 
    140 #endif
    141