• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
asTexture()40     virtual GrTexture* asTexture() SK_OVERRIDE { return this; }
asTexture()41     virtual const GrTexture* asTexture() const SK_OVERRIDE { return this; }
asRenderTarget()42     virtual GrRenderTarget* asRenderTarget() SK_OVERRIDE { return fRenderTarget.get(); }
asRenderTarget()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      */
normalizeFixedX(SkFixed x)49     SkFixed normalizeFixedX(SkFixed x) const {
50         SkASSERT(SkIsPow2(fDesc.fWidth));
51         return x >> fShiftFixedX;
52     }
normalizeFixedY(SkFixed y)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.")
invalidateCachedState()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 
resetFlag(GrTextureFlags flags)85     void resetFlag(GrTextureFlags flags) {
86         fDesc.fFlags = fDesc.fFlags & ~flags;
87     }
88 
89 #ifdef SK_DEBUG
validate()90     void validate() const {
91         this->INHERITED::validate();
92 
93         this->validateDesc();
94     }
95 #endif
96 
impl()97     GrTextureImpl* impl() { return reinterpret_cast<GrTextureImpl*>(this); }
impl()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 
GrTexture(GrGpu * gpu,bool isWrapped,const GrTextureDesc & desc)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:
SK_DECLARE_INST_COUNT(GrTextureImpl)134     SK_DECLARE_INST_COUNT(GrTextureImpl)
135 
136     void setFlag(GrTextureFlags flags) {
137         fDesc.fFlags = fDesc.fFlags | flags;
138     }
resetFlag(GrTextureFlags flags)139     void resetFlag(GrTextureFlags flags) {
140         fDesc.fFlags = fDesc.fFlags & ~flags;
141     }
isSetFlag(GrTextureFlags flags)142     bool isSetFlag(GrTextureFlags flags) const {
143         return 0 != (fDesc.fFlags & flags);
144     }
145 
146     void dirtyMipMaps(bool mipMapsDirty);
147 
mipMapsAreDirty()148     bool mipMapsAreDirty() const {
149         return kValid_MipMapsStatus != fMipMapsStatus;
150     }
151 
hasMipMaps()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:
GrTextureImpl(GrGpu * gpu,bool isWrapped,const GrTextureDesc & desc)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:
GrDeviceCoordTexture()187     GrDeviceCoordTexture() { fOffset.set(0, 0); }
188 
GrDeviceCoordTexture(const GrDeviceCoordTexture & other)189     GrDeviceCoordTexture(const GrDeviceCoordTexture& other) {
190         *this = other;
191     }
192 
GrDeviceCoordTexture(GrTexture * texture,const SkIPoint & offset)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 
offset()204     const SkIPoint& offset() const { return fOffset; }
205 
setOffset(const SkIPoint & offset)206     void setOffset(const SkIPoint& offset) { fOffset = offset; }
setOffset(int ox,int oy)207     void setOffset(int ox, int oy) { fOffset.set(ox, oy); }
208 
texture()209     GrTexture* texture() const { return fTexture.get(); }
210 
setTexture(GrTexture * texture)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