Home | History | Annotate | Download | only in gl
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #ifndef GrGLTexture_DEFINED
     11 #define GrGLTexture_DEFINED
     12 
     13 #include "../GrGpu.h"
     14 #include "GrGLRenderTarget.h"
     15 
     16 /**
     17  * A ref counted tex id that deletes the texture in its destructor.
     18  */
     19 class GrGLTexID : public GrRefCnt {
     20 
     21 public:
     22     GrGLTexID(const GrGLInterface* gl, GrGLuint texID, bool ownsID)
     23         : fGL(gl)
     24         , fTexID(texID)
     25         , fOwnsID(ownsID) {
     26     }
     27 
     28     virtual ~GrGLTexID() {
     29         if (0 != fTexID && fOwnsID) {
     30             GR_GL_CALL(fGL, DeleteTextures(1, &fTexID));
     31         }
     32     }
     33 
     34     void abandon() { fTexID = 0; }
     35     GrGLuint id() const { return fTexID; }
     36 
     37 private:
     38     const GrGLInterface* fGL;
     39     GrGLuint             fTexID;
     40     bool                 fOwnsID;
     41 };
     42 
     43 ////////////////////////////////////////////////////////////////////////////////
     44 
     45 
     46 class GrGLTexture : public GrTexture {
     47 
     48 public:
     49     enum Orientation {
     50         kBottomUp_Orientation,
     51         kTopDown_Orientation,
     52     };
     53 
     54     struct TexParams {
     55         GrGLenum fFilter;
     56         GrGLenum fWrapS;
     57         GrGLenum fWrapT;
     58         GrGLenum fSwizzleRGBA[4];
     59         void invalidate() { memset(this, 0xff, sizeof(TexParams)); }
     60     };
     61 
     62     struct Desc {
     63         int             fWidth;
     64         int             fHeight;
     65         GrPixelConfig   fConfig;
     66         GrGLuint        fTextureID;
     67         bool            fOwnsID;
     68         Orientation     fOrientation;
     69     };
     70 
     71     // creates a texture that is also an RT
     72     GrGLTexture(GrGpuGL* gpu,
     73                 const Desc& textureDesc,
     74                 const GrGLRenderTarget::Desc& rtDesc);
     75 
     76     // creates a non-RT texture
     77     GrGLTexture(GrGpuGL* gpu,
     78                 const Desc& textureDesc);
     79 
     80 
     81     virtual ~GrGLTexture() { this->release(); }
     82 
     83     virtual intptr_t getTextureHandle() const;
     84 
     85     // these functions
     86     const TexParams& getCachedTexParams(GrGpu::ResetTimestamp* timestamp) const {
     87         *timestamp = fTexParamsTimestamp;
     88         return fTexParams;
     89     }
     90     void setCachedTexParams(const TexParams& texParams,
     91                             GrGpu::ResetTimestamp timestamp) {
     92         fTexParams = texParams;
     93         fTexParamsTimestamp = timestamp;
     94     }
     95     GrGLuint textureID() const { return fTexIDObj->id(); }
     96 
     97     // Ganesh assumes texture coordinates have their origin
     98     // in the top-left corner of the image. OpenGL, however,
     99     // has the origin in the lower-left corner. For content that
    100     // is loaded by Ganesh we just push the content "upside down"
    101     // (by GL's understanding of the world) in glTex*Image and the
    102     // addressing just works out. However, content generated by GL
    103     // (FBO or externally imported texture) will be updside down
    104     // and it is up to the GrGpuGL derivative to handle y-mirroing.
    105     Orientation orientation() const { return fOrientation; }
    106 
    107     static const GrGLenum* WrapMode2GLWrap();
    108 
    109 protected:
    110 
    111     // overrides of GrTexture
    112     virtual void onAbandon();
    113     virtual void onRelease();
    114 
    115 private:
    116     TexParams                       fTexParams;
    117     GrGpu::ResetTimestamp           fTexParamsTimestamp;
    118     GrGLTexID*                      fTexIDObj;
    119     Orientation                     fOrientation;
    120 
    121     void init(GrGpuGL* gpu,
    122               const Desc& textureDesc,
    123               const GrGLRenderTarget::Desc* rtDesc);
    124 
    125     typedef GrTexture INHERITED;
    126 };
    127 
    128 #endif
    129