Home | History | Annotate | Download | only in gl
      1 /*
      2  * Copyright 2011 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 
      9 #ifndef GrGLTexture_DEFINED
     10 #define GrGLTexture_DEFINED
     11 
     12 #include "GrGpu.h"
     13 #include "GrTexture.h"
     14 #include "GrGLUtil.h"
     15 
     16 class GrGLGpu;
     17 
     18 class GrGLTexture : public GrTexture {
     19 public:
     20     struct TexParams {
     21         GrGLenum fMinFilter;
     22         GrGLenum fMagFilter;
     23         GrGLenum fWrapS;
     24         GrGLenum fWrapT;
     25         GrGLenum fMaxMipMapLevel;
     26         GrGLenum fSwizzleRGBA[4];
     27         GrGLenum fSRGBDecode;
     28         void invalidate() { memset(this, 0xff, sizeof(TexParams)); }
     29     };
     30 
     31     struct IDDesc {
     32         GrGLTextureInfo             fInfo;
     33         GrBackendObjectOwnership    fOwnership;
     34     };
     35     GrGLTexture(GrGLGpu*, SkBudgeted, const GrSurfaceDesc&, const IDDesc&);
     36     GrGLTexture(GrGLGpu*, SkBudgeted, const GrSurfaceDesc&, const IDDesc&,
     37                 bool wasMipMapDataProvided);
     38 
     39     ~GrGLTexture() override {
     40         // check that invokeReleaseProc has been called (if needed)
     41         SkASSERT(!fReleaseProc);
     42     }
     43 
     44     GrBackendObject getTextureHandle() const override;
     45 
     46     void textureParamsModified() override { fTexParams.invalidate(); }
     47 
     48     void setRelease(ReleaseProc proc, ReleaseCtx ctx) override {
     49         fReleaseProc = proc;
     50         fReleaseCtx = ctx;
     51     }
     52 
     53     // These functions are used to track the texture parameters associated with the texture.
     54     const TexParams& getCachedTexParams(GrGpu::ResetTimestamp* timestamp) const {
     55         *timestamp = fTexParamsTimestamp;
     56         return fTexParams;
     57     }
     58 
     59     void setCachedTexParams(const TexParams& texParams,
     60                             GrGpu::ResetTimestamp timestamp) {
     61         fTexParams = texParams;
     62         fTexParamsTimestamp = timestamp;
     63     }
     64 
     65     GrGLuint textureID() const { return fInfo.fID; }
     66 
     67     GrGLenum target() const { return fInfo.fTarget; }
     68 
     69     bool hasBaseLevelBeenBoundToFBO() const { return fBaseLevelHasBeenBoundToFBO; }
     70     void baseLevelWasBoundToFBO() { fBaseLevelHasBeenBoundToFBO = true; }
     71 
     72     static sk_sp<GrGLTexture> MakeWrapped(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&);
     73 
     74 protected:
     75     // Constructor for subclasses.
     76     GrGLTexture(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&, bool wasMipMapDataProvided);
     77 
     78     enum Wrapped { kWrapped };
     79     // Constructor for instances wrapping backend objects.
     80     GrGLTexture(GrGLGpu*, Wrapped, const GrSurfaceDesc&, const IDDesc&);
     81 
     82     void init(const GrSurfaceDesc&, const IDDesc&);
     83 
     84     void onAbandon() override;
     85     void onRelease() override;
     86     void setMemoryBacking(SkTraceMemoryDump* traceMemoryDump,
     87                           const SkString& dumpName) const override;
     88 
     89 private:
     90     void invokeReleaseProc() {
     91         if (fReleaseProc) {
     92             fReleaseProc(fReleaseCtx);
     93             fReleaseProc = nullptr;
     94         }
     95     }
     96 
     97     TexParams                       fTexParams;
     98     GrGpu::ResetTimestamp           fTexParamsTimestamp;
     99     // Holds the texture target and ID. A pointer to this may be shared to external clients for
    100     // direct interaction with the GL object.
    101     GrGLTextureInfo                 fInfo;
    102     GrBackendObjectOwnership        fTextureIDOwnership;
    103     bool                            fBaseLevelHasBeenBoundToFBO = false;
    104 
    105     ReleaseProc                     fReleaseProc = nullptr;
    106     ReleaseCtx                      fReleaseCtx = nullptr;
    107 
    108     typedef GrTexture INHERITED;
    109 };
    110 
    111 #endif
    112