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 "GrGLRenderTarget.h" 14 15 /** 16 * A ref counted tex id that deletes the texture in its destructor. 17 */ 18 class GrGLTexID : public SkRefCnt { 19 public: 20 SK_DECLARE_INST_COUNT(GrGLTexID) 21 22 GrGLTexID(const GrGLInterface* gl, GrGLuint texID, bool isWrapped) 23 : fGL(gl) 24 , fTexID(texID) 25 , fIsWrapped(isWrapped) { 26 } 27 28 virtual ~GrGLTexID() { 29 if (0 != fTexID && !fIsWrapped) { 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 fIsWrapped; 41 42 typedef SkRefCnt INHERITED; 43 }; 44 45 //////////////////////////////////////////////////////////////////////////////// 46 47 48 class GrGLTexture : public GrTexture { 49 50 public: 51 struct TexParams { 52 GrGLenum fMinFilter; 53 GrGLenum fMagFilter; 54 GrGLenum fWrapS; 55 GrGLenum fWrapT; 56 GrGLenum fSwizzleRGBA[4]; 57 void invalidate() { memset(this, 0xff, sizeof(TexParams)); } 58 }; 59 60 struct Desc : public GrTextureDesc { 61 GrGLuint fTextureID; 62 bool fIsWrapped; 63 }; 64 65 // creates a texture that is also an RT 66 GrGLTexture(GrGpuGL* gpu, 67 const Desc& textureDesc, 68 const GrGLRenderTarget::Desc& rtDesc); 69 70 // creates a non-RT texture 71 GrGLTexture(GrGpuGL* gpu, 72 const Desc& textureDesc); 73 74 virtual ~GrGLTexture() { this->release(); } 75 76 virtual GrBackendObject getTextureHandle() const SK_OVERRIDE; 77 78 virtual void invalidateCachedState() SK_OVERRIDE { fTexParams.invalidate(); } 79 80 // These functions are used to track the texture parameters associated with the texture. 81 const TexParams& getCachedTexParams(GrGpu::ResetTimestamp* timestamp) const { 82 *timestamp = fTexParamsTimestamp; 83 return fTexParams; 84 } 85 86 void setCachedTexParams(const TexParams& texParams, 87 GrGpu::ResetTimestamp timestamp) { 88 fTexParams = texParams; 89 fTexParamsTimestamp = timestamp; 90 } 91 92 GrGLuint textureID() const { return (NULL != fTexIDObj.get()) ? fTexIDObj->id() : 0; } 93 94 protected: 95 // overrides of GrTexture 96 virtual void onAbandon() SK_OVERRIDE; 97 virtual void onRelease() SK_OVERRIDE; 98 99 private: 100 TexParams fTexParams; 101 GrGpu::ResetTimestamp fTexParamsTimestamp; 102 SkAutoTUnref<GrGLTexID> fTexIDObj; 103 104 void init(GrGpuGL* gpu, 105 const Desc& textureDesc, 106 const GrGLRenderTarget::Desc* rtDesc); 107 108 typedef GrTexture INHERITED; 109 }; 110 111 #endif 112