blob: 53dcd22e606e4dc06b7a8776bca51c474d19a766 [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,
bsalomon@google.comcee661a2011-07-26 12:32:36 +000070 GrPixelConfig config,
twiz@google.com0f31ca72011-03-18 17:38:11 +000071 GrGLuint stencilBits,
bsalomon@google.comf954d8d2011-04-06 17:50:02 +000072 bool isMultisampled,
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000073 const GrGLIRect& fViewport,
bsalomon@google.com8fe72472011-03-30 21:26:44 +000074 GrGLTexture* texture);
75
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000076 virtual ~GrGLRenderTarget() { this->release(); }
77
bsalomon@google.com8895a7a2011-02-18 16:09:55 +000078 void setViewport(const GrGLIRect& rect) { fViewport = rect; }
bsalomon@google.comd302f142011-03-03 13:54:13 +000079 const GrGLIRect& getViewport() const { return fViewport; }
bsalomon@google.com8fe72472011-03-30 21:26:44 +000080
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000081 // The following two functions return the same ID when a
82 // texture-rendertarget is multisampled, and different IDs when
83 // it is.
84 // FBO ID used to render into
85 GrGLuint renderFBOID() const { return fRTFBOID; }
86 // FBO ID that has texture ID attached.
87 GrGLuint textureFBOID() const { return fTexFBOID; }
88
89 // override of GrRenderTarget
bsalomon@google.com0b96a842011-07-13 21:53:49 +000090 virtual intptr_t getRenderTargetHandle() const {
91 return this->renderFBOID();
92 }
93 virtual intptr_t getRenderTargetResolvedHandle() const {
94 return this->textureFBOID();
95 }
bsalomon@google.com5877ffd2011-04-11 17:58:48 +000096 virtual ResolveType getResolveType() const {
97 if (fRTFBOID == fTexFBOID) {
98 // catches FBO 0 and non MSAA case
99 return kAutoResolves_ResolveType;
100 } else if (kUnresolvableFBOID == fTexFBOID) {
101 return kCantResolve_ResolveType;
102 } else {
103 return kCanResolve_ResolveType;
104 }
105 }
106
107protected:
108 // override of GrResource
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000109 virtual void onAbandon();
110 virtual void onRelease();
111
reed@google.comac10a2d2010-12-22 21:39:39 +0000112private:
twiz@google.com0f31ca72011-03-18 17:38:11 +0000113 GrGLuint fRTFBOID;
114 GrGLuint fTexFBOID;
115 GrGLuint fStencilRenderbufferID;
116 GrGLuint fMSColorRenderbufferID;
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000117
reed@google.comac10a2d2010-12-22 21:39:39 +0000118 // Should this object delete IDs when it is destroyed or does someone
119 // else own them.
120 bool fOwnIDs;
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000121
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000122 // when we switch to this rendertarget we want to set the viewport to
reed@google.comac10a2d2010-12-22 21:39:39 +0000123 // only render to to content area (as opposed to the whole allocation) and
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000124 // we want the rendering to be at top left (GL has origin in bottom left)
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000125 GrGLIRect fViewport;
bsalomon@google.com1da07462011-03-10 14:51:57 +0000126
127 // non-NULL if this RT was created by Gr with an associated GrGLTexture.
128 GrGLTexID* fTexIDObj;
129
reed@google.comac10a2d2010-12-22 21:39:39 +0000130 typedef GrRenderTarget INHERITED;
131};
132
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000133////////////////////////////////////////////////////////////////////////////////
134
reed@google.comac10a2d2010-12-22 21:39:39 +0000135class GrGLTexture : public GrTexture {
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000136
reed@google.comac10a2d2010-12-22 21:39:39 +0000137public:
138 enum Orientation {
139 kBottomUp_Orientation,
140 kTopDown_Orientation,
141 };
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000142
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000143 struct TexParams {
twiz@google.com0f31ca72011-03-18 17:38:11 +0000144 GrGLenum fFilter;
145 GrGLenum fWrapS;
146 GrGLenum fWrapT;
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000147 void invalidate() { memset(this, 0xff, sizeof(TexParams)); }
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000148 };
reed@google.comac10a2d2010-12-22 21:39:39 +0000149
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000150 struct GLTextureDesc {
bsalomon@google.com79d2dbe2011-06-13 19:28:02 +0000151 int fContentWidth;
152 int fContentHeight;
153 int fAllocWidth;
154 int fAllocHeight;
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000155 GrPixelConfig fFormat;
156 GrGLuint fTextureID;
157 bool fOwnsID;
158 GrGLenum fUploadFormat;
159 GrGLenum fUploadByteCount;
160 GrGLenum fUploadType;
161 GrGLuint fStencilBits;
162 Orientation fOrientation;
163 };
164
165 typedef GrGLRenderTarget::GLRenderTargetIDs GLRenderTargetIDs;
166
167 GrGLTexture(GrGpuGL* gpu,
168 const GLTextureDesc& textureDesc,
169 const GLRenderTargetIDs& rtIDs,
170 const TexParams& initialTexParams);
171
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000172 virtual ~GrGLTexture() { this->release(); }
reed@google.comac10a2d2010-12-22 21:39:39 +0000173
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000174 // overrides of GrTexture
bsalomon@google.com79d2dbe2011-06-13 19:28:02 +0000175 virtual void uploadTextureData(int x,
176 int y,
177 int width,
178 int height,
junov@google.com4ee7ae52011-06-30 17:30:49 +0000179 const void* srcData,
180 size_t rowBytes);
bsalomon@google.comcee661a2011-07-26 12:32:36 +0000181 virtual intptr_t getTextureHandle() const;
reed@google.comac10a2d2010-12-22 21:39:39 +0000182
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000183 const TexParams& getTexParams() const { return fTexParams; }
184 void setTexParams(const TexParams& texParams) { fTexParams = texParams; }
twiz@google.com0f31ca72011-03-18 17:38:11 +0000185 GrGLuint textureID() const { return fTexIDObj->id(); }
reed@google.comac10a2d2010-12-22 21:39:39 +0000186
twiz@google.com0f31ca72011-03-18 17:38:11 +0000187 GrGLenum uploadFormat() const { return fUploadFormat; }
188 GrGLenum uploadByteCount() const { return fUploadByteCount; }
189 GrGLenum uploadType() const { return fUploadType; }
reed@google.comac10a2d2010-12-22 21:39:39 +0000190
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000191 /**
192 * Retrieves the texture width actually allocated in texels.
193 *
194 * @return the width in texels
195 */
196 int allocWidth() const { return fAllocWidth; }
197
198 /**
199 * Retrieves the texture height actually allocated in texels.
200 *
201 * @return the height in texels
202 */
203 int allocHeight() const { return fAllocHeight; }
204
205 /**
206 * @return width() / allocWidth()
207 */
208 GrScalar contentScaleX() const { return fScaleX; }
209
210 /**
211 * @return height() / allocHeight()
212 */
213 GrScalar contentScaleY() const { return fScaleY; }
214
reed@google.comac10a2d2010-12-22 21:39:39 +0000215 // Ganesh assumes texture coordinates have their origin
216 // in the top-left corner of the image. OpenGL, however,
217 // has the origin in the lower-left corner. For content that
218 // is loaded by Ganesh we just push the content "upside down"
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000219 // (by GL's understanding of the world ) in glTex*Image and the
220 // addressing just works out. However, content generated by GL
221 // (FBO or externally imported texture) will be updside down
reed@google.comac10a2d2010-12-22 21:39:39 +0000222 // and it is up to the GrGpuGL derivative to handle y-mirroing.
223 Orientation orientation() const { return fOrientation; }
224
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000225 static const GrGLenum* WrapMode2GLWrap();
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000226
bsalomon@google.com5877ffd2011-04-11 17:58:48 +0000227protected:
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000228
bsalomon@google.com6dcf4992011-04-05 21:16:14 +0000229 // overrides of GrTexture
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000230 virtual void onAbandon();
231 virtual void onRelease();
232
reed@google.comac10a2d2010-12-22 21:39:39 +0000233private:
bsalomon@google.comda96ea02010-12-23 16:53:57 +0000234 TexParams fTexParams;
bsalomon@google.com1da07462011-03-10 14:51:57 +0000235 GrGLTexID* fTexIDObj;
twiz@google.com0f31ca72011-03-18 17:38:11 +0000236 GrGLenum fUploadFormat;
237 GrGLenum fUploadByteCount;
238 GrGLenum fUploadType;
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000239 int fAllocWidth;
240 int fAllocHeight;
241 // precomputed content / alloc ratios
242 GrScalar fScaleX;
243 GrScalar fScaleY;
reed@google.comac10a2d2010-12-22 21:39:39 +0000244 Orientation fOrientation;
reed@google.comac10a2d2010-12-22 21:39:39 +0000245 GrGpuGL* fGpuGL;
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000246
reed@google.comac10a2d2010-12-22 21:39:39 +0000247 typedef GrTexture INHERITED;
248};
249
250#endif