Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2017 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 GrSurfaceProxyPriv_DEFINED
      9 #define GrSurfaceProxyPriv_DEFINED
     10 
     11 #include "GrSurfaceProxy.h"
     12 
     13 #include "GrResourceProvider.h"
     14 
     15 /** Class that adds methods to GrSurfaceProxy that are only intended for use internal to Skia.
     16     This class is purely a privileged window into GrSurfaceProxy. It should never have additional
     17     data members or virtual methods. */
     18 class GrSurfaceProxyPriv {
     19 public:
     20     bool isInstantiated() const { return SkToBool(fProxy->fTarget); }
     21 
     22     // This should only be called after a successful call to instantiate
     23     GrSurface* peekSurface() const {
     24         SkASSERT(fProxy->fTarget);
     25         return fProxy->fTarget;
     26     }
     27 
     28     // If the proxy is already instantiated, return its backing GrTexture; if not,
     29     // return null
     30     GrTexture* peekTexture() const {
     31         return fProxy->fTarget ? fProxy->fTarget->asTexture() : nullptr;
     32     }
     33 
     34     // This should only be called after a successful call to instantiate
     35     GrRenderTarget* peekRenderTarget() const {
     36         SkASSERT(fProxy->fTarget && fProxy->fTarget->asRenderTarget());
     37         return fProxy->fTarget ? fProxy->fTarget->asRenderTarget() : nullptr;
     38     }
     39 
     40     // Beware! This call is only guaranteed to tell you if the proxy in question has
     41     // any pending IO in its current state. It won't tell you about the IO state in the
     42     // future when the proxy is actually used/instantiated.
     43     bool hasPendingIO() const { return fProxy->hasPendingIO(); }
     44 
     45     // Beware! This call is only guaranteed to tell you if the proxy in question has
     46     // any pending writes in its current state. It won't tell you about the IO state in the
     47     // future when the proxy is actually used/instantiated.
     48     bool hasPendingWrite() const { return fProxy->hasPendingWrite(); }
     49 
     50     void computeScratchKey(GrScratchKey* key) const { return fProxy->computeScratchKey(key); }
     51 
     52     // Create a GrSurface-derived class that meets the requirements (i.e, desc, renderability)
     53     // of the GrSurfaceProxy.
     54     sk_sp<GrSurface> createSurface(GrResourceProvider* resourceProvider) const {
     55         return fProxy->createSurface(resourceProvider);
     56     }
     57 
     58     // Assign this proxy the provided GrSurface as its backing surface
     59     void assign(sk_sp<GrSurface> surface) { fProxy->assign(std::move(surface)); }
     60 
     61     bool requiresNoPendingIO() const {
     62         return fProxy->fFlags & GrResourceProvider::kNoPendingIO_Flag;
     63     }
     64 
     65     // Don't abuse this call!!!!!!!
     66     bool isExact() const { return SkBackingFit::kExact == fProxy->fFit; }
     67 
     68     // Don't. Just don't.
     69     void exactify();
     70 
     71     bool doLazyInstantiation(GrResourceProvider*);
     72 
     73     GrSurfaceProxy::LazyInstantiationType lazyInstantiationType() const {
     74         return fProxy->fLazyInstantiationType;
     75     }
     76 
     77     void testingOnly_setLazyInstantiationType(GrSurfaceProxy::LazyInstantiationType lazyType) {
     78         fProxy->fLazyInstantiationType = lazyType;
     79     }
     80 
     81     static bool AttachStencilIfNeeded(GrResourceProvider*, GrSurface*, bool needsStencil);
     82 
     83 private:
     84     explicit GrSurfaceProxyPriv(GrSurfaceProxy* proxy) : fProxy(proxy) {}
     85     GrSurfaceProxyPriv(const GrSurfaceProxyPriv&) {} // unimpl
     86     GrSurfaceProxyPriv& operator=(const GrSurfaceProxyPriv&); // unimpl
     87 
     88     // No taking addresses of this type.
     89     const GrSurfaceProxyPriv* operator&() const;
     90     GrSurfaceProxyPriv* operator&();
     91 
     92     GrSurfaceProxy* fProxy;
     93 
     94     friend class GrSurfaceProxy; // to construct/copy this type.
     95 };
     96 
     97 inline GrSurfaceProxyPriv GrSurfaceProxy::priv() { return GrSurfaceProxyPriv(this); }
     98 
     99 inline const GrSurfaceProxyPriv GrSurfaceProxy::priv () const {
    100     return GrSurfaceProxyPriv(const_cast<GrSurfaceProxy*>(this));
    101 }
    102 
    103 #endif
    104