michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #ifndef GrGLTexture_DEFINED michael@0: #define GrGLTexture_DEFINED michael@0: michael@0: #include "GrGpu.h" michael@0: #include "GrGLRenderTarget.h" michael@0: michael@0: /** michael@0: * A ref counted tex id that deletes the texture in its destructor. michael@0: */ michael@0: class GrGLTexID : public SkRefCnt { michael@0: public: michael@0: SK_DECLARE_INST_COUNT(GrGLTexID) michael@0: michael@0: GrGLTexID(const GrGLInterface* gl, GrGLuint texID, bool isWrapped) michael@0: : fGL(gl) michael@0: , fTexID(texID) michael@0: , fIsWrapped(isWrapped) { michael@0: } michael@0: michael@0: virtual ~GrGLTexID() { michael@0: if (0 != fTexID && !fIsWrapped) { michael@0: GR_GL_CALL(fGL, DeleteTextures(1, &fTexID)); michael@0: } michael@0: } michael@0: michael@0: void abandon() { fTexID = 0; } michael@0: GrGLuint id() const { return fTexID; } michael@0: michael@0: private: michael@0: const GrGLInterface* fGL; michael@0: GrGLuint fTexID; michael@0: bool fIsWrapped; michael@0: michael@0: typedef SkRefCnt INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: michael@0: class GrGLTexture : public GrTexture { michael@0: michael@0: public: michael@0: struct TexParams { michael@0: GrGLenum fMinFilter; michael@0: GrGLenum fMagFilter; michael@0: GrGLenum fWrapS; michael@0: GrGLenum fWrapT; michael@0: GrGLenum fSwizzleRGBA[4]; michael@0: void invalidate() { memset(this, 0xff, sizeof(TexParams)); } michael@0: }; michael@0: michael@0: struct Desc : public GrTextureDesc { michael@0: GrGLuint fTextureID; michael@0: bool fIsWrapped; michael@0: }; michael@0: michael@0: // creates a texture that is also an RT michael@0: GrGLTexture(GrGpuGL* gpu, michael@0: const Desc& textureDesc, michael@0: const GrGLRenderTarget::Desc& rtDesc); michael@0: michael@0: // creates a non-RT texture michael@0: GrGLTexture(GrGpuGL* gpu, michael@0: const Desc& textureDesc); michael@0: michael@0: virtual ~GrGLTexture() { this->release(); } michael@0: michael@0: virtual GrBackendObject getTextureHandle() const SK_OVERRIDE; michael@0: michael@0: virtual void invalidateCachedState() SK_OVERRIDE { fTexParams.invalidate(); } michael@0: michael@0: // These functions are used to track the texture parameters associated with the texture. michael@0: const TexParams& getCachedTexParams(GrGpu::ResetTimestamp* timestamp) const { michael@0: *timestamp = fTexParamsTimestamp; michael@0: return fTexParams; michael@0: } michael@0: michael@0: void setCachedTexParams(const TexParams& texParams, michael@0: GrGpu::ResetTimestamp timestamp) { michael@0: fTexParams = texParams; michael@0: fTexParamsTimestamp = timestamp; michael@0: } michael@0: michael@0: GrGLuint textureID() const { return (NULL != fTexIDObj.get()) ? fTexIDObj->id() : 0; } michael@0: michael@0: protected: michael@0: // overrides of GrTexture michael@0: virtual void onAbandon() SK_OVERRIDE; michael@0: virtual void onRelease() SK_OVERRIDE; michael@0: michael@0: private: michael@0: TexParams fTexParams; michael@0: GrGpu::ResetTimestamp fTexParamsTimestamp; michael@0: SkAutoTUnref fTexIDObj; michael@0: michael@0: void init(GrGpuGL* gpu, michael@0: const Desc& textureDesc, michael@0: const GrGLRenderTarget::Desc* rtDesc); michael@0: michael@0: typedef GrTexture INHERITED; michael@0: }; michael@0: michael@0: #endif