blob: cb50a1ead5771002f647b2f4caab0f9d0c444ac9 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
bsalomon@google.com1da07462011-03-10 14:51:57 +00002 Copyright 2011 Google Inc.
reed@google.comac10a2d2010-12-22 21:39:39 +00003
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
reed@google.comac10a2d2010-12-22 21:39:39 +000017#ifndef GrGLTexture_DEFINED
18#define GrGLTexture_DEFINED
19
reed@google.comac10a2d2010-12-22 21:39:39 +000020#include "GrTexture.h"
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000021#include "GrScalar.h"
22#include "GrGLIRect.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000023
24class GrGpuGL;
25class GrGLTexture;
26
bsalomon@google.com1da07462011-03-10 14:51:57 +000027/**
28 * A ref counted tex id that deletes the texture in its destructor.
29 */
30class GrGLTexID : public GrRefCnt {
bsalomon@google.com8fe72472011-03-30 21:26:44 +000031
bsalomon@google.com1da07462011-03-10 14:51:57 +000032public:
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000033 GrGLTexID(GrGLuint texID, bool ownsID) : fTexID(texID), fOwnsID(ownsID) {}
bsalomon@google.com1da07462011-03-10 14:51:57 +000034
35 virtual ~GrGLTexID() {
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000036 if (0 != fTexID && fOwnsID) {
bsalomon@google.com1da07462011-03-10 14:51:57 +000037 GR_GL(DeleteTextures(1, &fTexID));
38 }
39 }
40
41 void abandon() { fTexID = 0; }
twiz@google.com0f31ca72011-03-18 17:38:11 +000042 GrGLuint id() const { return fTexID; }
bsalomon@google.com1da07462011-03-10 14:51:57 +000043
44private:
twiz@google.com0f31ca72011-03-18 17:38:11 +000045 GrGLuint fTexID;
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000046 bool fOwnsID;
bsalomon@google.com1da07462011-03-10 14:51:57 +000047};
48
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000049////////////////////////////////////////////////////////////////////////////////
50
reed@google.comac10a2d2010-12-22 21:39:39 +000051class GrGLRenderTarget : public GrRenderTarget {
bsalomon@google.com8fe72472011-03-30 21:26:44 +000052
reed@google.comac10a2d2010-12-22 21:39:39 +000053public:
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000054 // set fTexFBOID to this value to indicate that it is multisampled but
55 // Gr doesn't know how to resolve it.
56 enum { kUnresolvableFBOID = 0 };
bsalomon@google.com8fe72472011-03-30 21:26:44 +000057
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000058 struct GLRenderTargetIDs {
twiz@google.com0f31ca72011-03-18 17:38:11 +000059 GrGLuint fRTFBOID;
60 GrGLuint fTexFBOID;
61 GrGLuint fStencilRenderbufferID;
62 GrGLuint fMSColorRenderbufferID;
bsalomon@google.comf954d8d2011-04-06 17:50:02 +000063 bool fOwnIDs;
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000064 void reset() { memset(this, 0, sizeof(GLRenderTargetIDs)); }
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000065 };
bsalomon@google.com8fe72472011-03-30 21:26:44 +000066
67 GrGLRenderTarget(GrGpuGL* gpu,
68 const GLRenderTargetIDs& ids,
bsalomon@google.com1da07462011-03-10 14:51:57 +000069 GrGLTexID* texID,
twiz@google.com0f31ca72011-03-18 17:38:11 +000070 GrGLuint stencilBits,
bsalomon@google.comf954d8d2011-04-06 17:50:02 +000071 bool isMultisampled,
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000072 const GrGLIRect& fViewport,
bsalomon@google.com8fe72472011-03-30 21:26:44 +000073 GrGLTexture* texture);
74
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000075 virtual ~GrGLRenderTarget() { this->release(); }
76
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000077 void setViewport(const GrGLIRect& rect) { fViewport = rect; }
bsalomon@google.comd302f142011-03-03 13:54:13 +000078 const GrGLIRect& getViewport() const { return fViewport; }
bsalomon@google.com8fe72472011-03-30 21:26:44 +000079
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000080 // The following two functions return the same ID when a
81 // texture-rendertarget is multisampled, and different IDs when
82 // it is.
83 // FBO ID used to render into
84 GrGLuint renderFBOID() const { return fRTFBOID; }
85 // FBO ID that has texture ID attached.
86 GrGLuint textureFBOID() const { return fTexFBOID; }
87
88 // override of GrRenderTarget
89 virtual ResolveType getResolveType() const {
90 if (fRTFBOID == fTexFBOID) {
91 // catches FBO 0 and non MSAA case
92 return kAutoResolves_ResolveType;
93 } else if (kUnresolvableFBOID == fTexFBOID) {
94 return kCantResolve_ResolveType;
95 } else {
96 return kCanResolve_ResolveType;
97 }
98 }
99
100protected:
101 // override of GrResource
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000102 virtual void onAbandon();
103 virtual void onRelease();
104
reed@google.comac10a2d2010-12-22 21:39:39 +0000105private:
twiz@google.com0f31ca72011-03-18 17:38:11 +0000106 GrGLuint fRTFBOID;
107 GrGLuint fTexFBOID;
108 GrGLuint fStencilRenderbufferID;
109 GrGLuint fMSColorRenderbufferID;
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000110
reed@google.comac10a2d2010-12-22 21:39:39 +0000111 // Should this object delete IDs when it is destroyed or does someone
112 // else own them.
113 bool fOwnIDs;
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000114
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000115 // when we switch to this rendertarget we want to set the viewport to
reed@google.comac10a2d2010-12-22 21:39:39 +0000116 // only render to to content area (as opposed to the whole allocation) and
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000117 // we want the rendering to be at top left (GL has origin in bottom left)
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000118 GrGLIRect fViewport;
bsalomon@google.com1da07462011-03-10 14:51:57 +0000119
120 // non-NULL if this RT was created by Gr with an associated GrGLTexture.
121 GrGLTexID* fTexIDObj;
122
reed@google.comac10a2d2010-12-22 21:39:39 +0000123 typedef GrRenderTarget INHERITED;
124};
125
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000126////////////////////////////////////////////////////////////////////////////////
127
reed@google.comac10a2d2010-12-22 21:39:39 +0000128class GrGLTexture : public GrTexture {
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000129
reed@google.comac10a2d2010-12-22 21:39:39 +0000130public:
131 enum Orientation {
132 kBottomUp_Orientation,
133 kTopDown_Orientation,
134 };
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000135
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000136 struct TexParams {
twiz@google.com0f31ca72011-03-18 17:38:11 +0000137 GrGLenum fFilter;
138 GrGLenum fWrapS;
139 GrGLenum fWrapT;
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000140 void invalidate() { memset(this, 0xff, sizeof(TexParams)); }
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000141 };
reed@google.comac10a2d2010-12-22 21:39:39 +0000142
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000143 struct GLTextureDesc {
144 uint32_t fContentWidth;
145 uint32_t fContentHeight;
146 uint32_t fAllocWidth;
147 uint32_t fAllocHeight;
148 GrPixelConfig fFormat;
149 GrGLuint fTextureID;
150 bool fOwnsID;
151 GrGLenum fUploadFormat;
152 GrGLenum fUploadByteCount;
153 GrGLenum fUploadType;
154 GrGLuint fStencilBits;
155 Orientation fOrientation;
156 };
157
158 typedef GrGLRenderTarget::GLRenderTargetIDs GLRenderTargetIDs;
159
160 GrGLTexture(GrGpuGL* gpu,
161 const GLTextureDesc& textureDesc,
162 const GLRenderTargetIDs& rtIDs,
163 const TexParams& initialTexParams);
164
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000165 virtual ~GrGLTexture() { this->release(); }
reed@google.comac10a2d2010-12-22 21:39:39 +0000166
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000167 // overrides of GrTexture
reed@google.comac10a2d2010-12-22 21:39:39 +0000168 virtual void uploadTextureData(uint32_t x,
169 uint32_t y,
170 uint32_t width,
171 uint32_t height,
172 const void* srcData);
173 virtual intptr_t getTextureHandle();
174
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000175 const TexParams& getTexParams() const { return fTexParams; }
176 void setTexParams(const TexParams& texParams) { fTexParams = texParams; }
twiz@google.com0f31ca72011-03-18 17:38:11 +0000177 GrGLuint textureID() const { return fTexIDObj->id(); }
reed@google.comac10a2d2010-12-22 21:39:39 +0000178
twiz@google.com0f31ca72011-03-18 17:38:11 +0000179 GrGLenum uploadFormat() const { return fUploadFormat; }
180 GrGLenum uploadByteCount() const { return fUploadByteCount; }
181 GrGLenum uploadType() const { return fUploadType; }
reed@google.comac10a2d2010-12-22 21:39:39 +0000182
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000183 /**
184 * Retrieves the texture width actually allocated in texels.
185 *
186 * @return the width in texels
187 */
188 int allocWidth() const { return fAllocWidth; }
189
190 /**
191 * Retrieves the texture height actually allocated in texels.
192 *
193 * @return the height in texels
194 */
195 int allocHeight() const { return fAllocHeight; }
196
197 /**
198 * @return width() / allocWidth()
199 */
200 GrScalar contentScaleX() const { return fScaleX; }
201
202 /**
203 * @return height() / allocHeight()
204 */
205 GrScalar contentScaleY() const { return fScaleY; }
206
reed@google.comac10a2d2010-12-22 21:39:39 +0000207 // Ganesh assumes texture coordinates have their origin
208 // in the top-left corner of the image. OpenGL, however,
209 // has the origin in the lower-left corner. For content that
210 // is loaded by Ganesh we just push the content "upside down"
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000211 // (by GL's understanding of the world ) in glTex*Image and the
212 // addressing just works out. However, content generated by GL
213 // (FBO or externally imported texture) will be updside down
reed@google.comac10a2d2010-12-22 21:39:39 +0000214 // and it is up to the GrGpuGL derivative to handle y-mirroing.
215 Orientation orientation() const { return fOrientation; }
216
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000217 static const GrGLenum* WrapMode2GLWrap();
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000218
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000219protected:
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000220
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000221 // overrides of GrTexture
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000222 virtual void onAbandon();
223 virtual void onRelease();
224
reed@google.comac10a2d2010-12-22 21:39:39 +0000225private:
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000226 TexParams fTexParams;
bsalomon@google.com1da07462011-03-10 14:51:57 +0000227 GrGLTexID* fTexIDObj;
twiz@google.com0f31ca72011-03-18 17:38:11 +0000228 GrGLenum fUploadFormat;
229 GrGLenum fUploadByteCount;
230 GrGLenum fUploadType;
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000231 int fAllocWidth;
232 int fAllocHeight;
233 // precomputed content / alloc ratios
234 GrScalar fScaleX;
235 GrScalar fScaleY;
reed@google.comac10a2d2010-12-22 21:39:39 +0000236 Orientation fOrientation;
reed@google.comac10a2d2010-12-22 21:39:39 +0000237 GrGpuGL* fGpuGL;
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000238
reed@google.comac10a2d2010-12-22 21:39:39 +0000239 typedef GrTexture INHERITED;
240};
241
242#endif