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 #ifndef GrTexture_DEFINED 10 #define GrTexture_DEFINED 11 12 #include "GrSurface.h" 13 #include "SkPoint.h" 14 #include "GrRenderTarget.h" 15 16 class GrResourceKey; 17 class GrTextureParams; 18 19 class GrTexture : public GrSurface { 20 21 public: 22 SK_DECLARE_INST_COUNT(GrTexture) 23 // from GrResource 24 /** 25 * Informational texture flags 26 */ 27 enum FlagBits { 28 kFirstBit = (kLastPublic_GrTextureFlagBit << 1), 29 30 /** 31 * This texture should be returned to the texture cache when 32 * it is no longer reffed 33 */ 34 kReturnToCache_FlagBit = kFirstBit, 35 }; 36 37 void setFlag(GrTextureFlags flags) { 38 fDesc.fFlags = fDesc.fFlags | flags; 39 } 40 void resetFlag(GrTextureFlags flags) { 41 fDesc.fFlags = fDesc.fFlags & ~flags; 42 } 43 bool isSetFlag(GrTextureFlags flags) const { 44 return 0 != (fDesc.fFlags & flags); 45 } 46 47 void dirtyMipMaps(bool mipMapsDirty) { 48 fMipMapsDirty = mipMapsDirty; 49 } 50 51 bool mipMapsAreDirty() const { 52 return fMipMapsDirty; 53 } 54 55 /** 56 * Approximate number of bytes used by the texture 57 */ 58 virtual size_t sizeInBytes() const SK_OVERRIDE { 59 return (size_t) fDesc.fWidth * 60 fDesc.fHeight * 61 GrBytesPerPixel(fDesc.fConfig); 62 } 63 64 // GrSurface overrides 65 virtual bool readPixels(int left, int top, int width, int height, 66 GrPixelConfig config, 67 void* buffer, 68 size_t rowBytes = 0, 69 uint32_t pixelOpsFlags = 0) SK_OVERRIDE; 70 71 virtual void writePixels(int left, int top, int width, int height, 72 GrPixelConfig config, 73 const void* buffer, 74 size_t rowBytes = 0, 75 uint32_t pixelOpsFlags = 0) SK_OVERRIDE; 76 77 /** 78 * @return this texture 79 */ 80 virtual GrTexture* asTexture() SK_OVERRIDE { return this; } 81 virtual const GrTexture* asTexture() const SK_OVERRIDE { return this; } 82 83 /** 84 * Retrieves the render target underlying this texture that can be passed to 85 * GrGpu::setRenderTarget(). 86 * 87 * @return handle to render target or NULL if the texture is not a 88 * render target 89 */ 90 virtual GrRenderTarget* asRenderTarget() SK_OVERRIDE { 91 return fRenderTarget.get(); 92 } 93 virtual const GrRenderTarget* asRenderTarget() const SK_OVERRIDE { 94 return fRenderTarget.get(); 95 } 96 97 // GrTexture 98 /** 99 * Convert from texels to normalized texture coords for POT textures 100 * only. 101 */ 102 GrFixed normalizeFixedX(GrFixed x) const { 103 SkASSERT(GrIsPow2(fDesc.fWidth)); 104 return x >> fShiftFixedX; 105 } 106 GrFixed normalizeFixedY(GrFixed y) const { 107 SkASSERT(GrIsPow2(fDesc.fHeight)); 108 return y >> fShiftFixedY; 109 } 110 111 /** 112 * Return the native ID or handle to the texture, depending on the 113 * platform. e.g. on OpenGL, return the texture ID. 114 */ 115 virtual GrBackendObject getTextureHandle() const = 0; 116 117 /** 118 * Call this when the state of the native API texture object is 119 * altered directly, without being tracked by skia. 120 */ 121 virtual void invalidateCachedState() = 0; 122 123 #ifdef SK_DEBUG 124 void validate() const { 125 this->INHERITED::validate(); 126 127 this->validateDesc(); 128 } 129 #endif 130 131 static GrResourceKey ComputeKey(const GrGpu* gpu, 132 const GrTextureParams* params, 133 const GrTextureDesc& desc, 134 const GrCacheID& cacheID); 135 static GrResourceKey ComputeScratchKey(const GrTextureDesc& desc); 136 static bool NeedsResizing(const GrResourceKey& key); 137 static bool NeedsBilerp(const GrResourceKey& key); 138 139 protected: 140 // A texture refs its rt representation but not vice-versa. It is up to 141 // the subclass constructor to initialize this pointer. 142 SkAutoTUnref<GrRenderTarget> fRenderTarget; 143 144 GrTexture(GrGpu* gpu, bool isWrapped, const GrTextureDesc& desc) 145 : INHERITED(gpu, isWrapped, desc) 146 , fRenderTarget(NULL) 147 , fMipMapsDirty(true) { 148 149 // only make sense if alloc size is pow2 150 fShiftFixedX = 31 - SkCLZ(fDesc.fWidth); 151 fShiftFixedY = 31 - SkCLZ(fDesc.fHeight); 152 } 153 virtual ~GrTexture(); 154 155 // GrResource overrides 156 virtual void onRelease() SK_OVERRIDE; 157 virtual void onAbandon() SK_OVERRIDE; 158 159 void validateDesc() const; 160 161 private: 162 // these two shift a fixed-point value into normalized coordinates 163 // for this texture if the texture is power of two sized. 164 int fShiftFixedX; 165 int fShiftFixedY; 166 167 bool fMipMapsDirty; 168 169 virtual void internal_dispose() const SK_OVERRIDE; 170 171 typedef GrSurface INHERITED; 172 }; 173 174 /** 175 * Represents a texture that is intended to be accessed in device coords with an offset. 176 */ 177 class GrDeviceCoordTexture { 178 public: 179 GrDeviceCoordTexture() { fOffset.set(0, 0); } 180 181 GrDeviceCoordTexture(const GrDeviceCoordTexture& other) { 182 *this = other; 183 } 184 185 GrDeviceCoordTexture(GrTexture* texture, const SkIPoint& offset) 186 : fTexture(SkSafeRef(texture)) 187 , fOffset(offset) { 188 } 189 190 GrDeviceCoordTexture& operator=(const GrDeviceCoordTexture& other) { 191 fTexture.reset(SkSafeRef(other.fTexture.get())); 192 fOffset = other.fOffset; 193 return *this; 194 } 195 196 const SkIPoint& offset() const { return fOffset; } 197 198 void setOffset(const SkIPoint& offset) { fOffset = offset; } 199 void setOffset(int ox, int oy) { fOffset.set(ox, oy); } 200 201 GrTexture* texture() const { return fTexture.get(); } 202 203 GrTexture* setTexture(GrTexture* texture) { 204 fTexture.reset(SkSafeRef(texture)); 205 return texture; 206 } 207 private: 208 SkAutoTUnref<GrTexture> fTexture; 209 SkIPoint fOffset; 210 }; 211 212 #endif 213