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 GrRefCnt { 19 public: SK_DECLARE_INST_COUNT(GrGLTexID)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 ~GrGLTexID()28 virtual ~GrGLTexID() { 29 if (0 != fTexID && !fIsWrapped) { 30 GR_GL_CALL(fGL, DeleteTextures(1, &fTexID)); 31 } 32 } 33 abandon()34 void abandon() { fTexID = 0; } id()35 GrGLuint id() const { return fTexID; } 36 37 private: 38 const GrGLInterface* fGL; 39 GrGLuint fTexID; 40 bool fIsWrapped; 41 42 typedef GrRefCnt INHERITED; 43 }; 44 45 //////////////////////////////////////////////////////////////////////////////// 46 47 48 class GrGLTexture : public GrTexture { 49 50 public: 51 struct TexParams { 52 GrGLenum fFilter; 53 GrGLenum fWrapS; 54 GrGLenum fWrapT; 55 GrGLenum fSwizzleRGBA[4]; invalidateTexParams56 void invalidate() { memset(this, 0xff, sizeof(TexParams)); } 57 }; 58 59 struct Desc : public GrTextureDesc { 60 GrGLuint fTextureID; 61 bool fIsWrapped; 62 GrSurfaceOrigin fOrigin; 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 ~GrGLTexture()75 virtual ~GrGLTexture() { this->release(); } 76 77 virtual GrBackendObject getTextureHandle() const SK_OVERRIDE; 78 invalidateCachedState()79 virtual void invalidateCachedState() SK_OVERRIDE { fTexParams.invalidate(); } 80 81 // these functions getCachedTexParams(GrGpu::ResetTimestamp * timestamp)82 const TexParams& getCachedTexParams(GrGpu::ResetTimestamp* timestamp) const { 83 *timestamp = fTexParamsTimestamp; 84 return fTexParams; 85 } setCachedTexParams(const TexParams & texParams,GrGpu::ResetTimestamp timestamp)86 void setCachedTexParams(const TexParams& texParams, 87 GrGpu::ResetTimestamp timestamp) { 88 fTexParams = texParams; 89 fTexParamsTimestamp = timestamp; 90 } textureID()91 GrGLuint textureID() const { return fTexIDObj->id(); } 92 93 protected: 94 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 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