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