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 GrTextureProvider_DEFINED
      9 #define GrTextureProvider_DEFINED
     10 
     11 #include "GrTexture.h"
     12 #include "SkImageFilter.h"
     13 
     14 class GrSingleOwner;
     15 
     16 class SK_API GrTextureProvider {
     17 public:
     18     ///////////////////////////////////////////////////////////////////////////
     19     // Textures
     20 
     21     /**
     22      * Creates a new texture in the resource cache and returns it. The caller owns a
     23      * ref on the returned texture which must be balanced by a call to unref.
     24      *
     25      * @param desc      Description of the texture properties.
     26      * @param budgeted  Does the texture count against the resource cache budget?
     27      * @param srcData   Pointer to the pixel values (optional).
     28      * @param rowBytes  The number of bytes between rows of the texture. Zero
     29      *                  implies tightly packed rows. For compressed pixel configs, this
     30      *                  field is ignored.
     31      */
     32     GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, const void* srcData,
     33                              size_t rowBytes);
     34 
     35     /** Shortcut for creating a texture with no initial data to upload. */
     36     GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted) {
     37         return this->createTexture(desc, budgeted, NULL, 0);
     38     }
     39 
     40     /** Assigns a unique key to the texture. The texture will be findable via this key using
     41         findTextureByUniqueKey(). If an existing texture has this key, it's key will be removed. */
     42     void assignUniqueKeyToTexture(const GrUniqueKey& key, GrTexture* texture) {
     43         this->assignUniqueKeyToResource(key, texture);
     44     }
     45 
     46     /** Finds a texture by unique key. If the texture is found it is ref'ed and returned. */
     47     GrTexture* findAndRefTextureByUniqueKey(const GrUniqueKey& key);
     48 
     49     /**
     50      * Determines whether a texture is associated with the unique key. If the texture is found it
     51      * will not be locked or returned. This call does not affect the priority of the resource for
     52      * deletion.
     53      */
     54     bool existsTextureWithUniqueKey(const GrUniqueKey& key) const {
     55         return this->existsResourceWithUniqueKey(key);
     56     }
     57 
     58     /**
     59      * Finds a texture that approximately matches the descriptor. Will be at least as large in width
     60      * and height as desc specifies. If desc specifies that the texture should be a render target
     61      * then result will be a render target. Format and sample count will always match the request.
     62      * The contents of the texture are undefined. The caller owns a ref on the returned texture and
     63      * must balance with a call to unref.
     64      */
     65     GrTexture* createApproxTexture(const GrSurfaceDesc&);
     66 
     67     /** Legacy function that no longer should be used. */
     68     enum ScratchTexMatch {
     69         kExact_ScratchTexMatch,
     70         kApprox_ScratchTexMatch
     71     };
     72     GrTexture* refScratchTexture(const GrSurfaceDesc& desc, ScratchTexMatch match) {
     73         if (kApprox_ScratchTexMatch == match) {
     74             return this->createApproxTexture(desc);
     75         } else {
     76             return this->createTexture(desc, SkBudgeted::kYes);
     77         }
     78     }
     79 
     80     ///////////////////////////////////////////////////////////////////////////
     81     // Wrapped Backend Surfaces
     82 
     83     /**
     84      * Wraps an existing texture with a GrTexture object.
     85      *
     86      * OpenGL: if the object is a texture Gr may change its GL texture params
     87      *         when it is drawn.
     88      *
     89      * @return GrTexture object or NULL on failure.
     90      */
     91     GrTexture* wrapBackendTexture(const GrBackendTextureDesc& desc,
     92                                   GrWrapOwnership = kBorrow_GrWrapOwnership);
     93 
     94     /**
     95      * Wraps an existing render target with a GrRenderTarget object. It is
     96      * similar to wrapBackendTexture but can be used to draw into surfaces
     97      * that are not also textures (e.g. FBO 0 in OpenGL, or an MSAA buffer that
     98      * the client will resolve to a texture). Currently wrapped render targets
     99      * always use the kBorrow_GrWrapOwnership semantics.
    100      *
    101      * @return GrRenderTarget object or NULL on failure.
    102      */
    103      GrRenderTarget* wrapBackendRenderTarget(const GrBackendRenderTargetDesc& desc);
    104 
    105 protected:
    106     GrTextureProvider(GrGpu* gpu, GrResourceCache* cache, GrSingleOwner* singleOwner);
    107 
    108     /**
    109      * Assigns a unique key to a resource. If the key is associated with another resource that
    110      * association is removed and replaced by this resource.
    111      */
    112     void assignUniqueKeyToResource(const GrUniqueKey&, GrGpuResource*);
    113 
    114     /**
    115      * Finds a resource in the cache, based on the specified key. This is intended for use in
    116      * conjunction with addResourceToCache(). The return value will be NULL if not found. The
    117      * caller must balance with a call to unref().
    118      */
    119     GrGpuResource* findAndRefResourceByUniqueKey(const GrUniqueKey&);
    120 
    121     /**
    122      * Determines whether a resource is in the cache. If the resource is found it
    123      * will not be locked or returned. This call does not affect the priority of
    124      * the resource for deletion.
    125      */
    126     bool existsResourceWithUniqueKey(const GrUniqueKey& key) const;
    127 
    128     enum ScratchTextureFlags {
    129         kExact_ScratchTextureFlag           = 0x1,
    130         kNoPendingIO_ScratchTextureFlag     = 0x2, // (http://skbug.com/4156)
    131         kNoCreate_ScratchTextureFlag        = 0x4,
    132     };
    133 
    134     /** A common impl for GrTextureProvider and GrResourceProvider variants. */
    135     GrTexture* internalCreateApproxTexture(const GrSurfaceDesc& desc, uint32_t scratchTextureFlags);
    136 
    137     GrTexture* refScratchTexture(const GrSurfaceDesc&, uint32_t scratchTextureFlags);
    138 
    139     void abandon() {
    140         fCache = NULL;
    141         fGpu = NULL;
    142     }
    143 
    144     GrResourceCache* cache() { return fCache; }
    145     const GrResourceCache* cache() const { return fCache; }
    146 
    147     GrGpu* gpu() { return fGpu; }
    148     const GrGpu* gpu() const { return fGpu; }
    149 
    150     bool isAbandoned() const {
    151         SkASSERT(SkToBool(fGpu) == SkToBool(fCache));
    152         return !SkToBool(fCache);
    153     }
    154 
    155 private:
    156     GrResourceCache* fCache;
    157     GrGpu* fGpu;
    158 
    159     // In debug builds we guard against improper thread handling
    160     SkDEBUGCODE(mutable GrSingleOwner* fSingleOwner;)
    161 };
    162 
    163 #endif
    164