GrGLTexture.h revision c6cf72381b212eb21e61d5c5e14247b483a77753
1ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/* 2ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Copyright 2010 Google Inc. 3ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 4ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Licensed under the Apache License, Version 2.0 (the "License"); 5ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com you may not use this file except in compliance with the License. 6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com You may obtain a copy of the License at 7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com http://www.apache.org/licenses/LICENSE-2.0 9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Unless required by applicable law or agreed to in writing, software 11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com distributed under the License is distributed on an "AS IS" BASIS, 12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com See the License for the specific language governing permissions and 14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com limitations under the License. 15ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifndef GrGLTexture_DEFINED 19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrGLTexture_DEFINED 20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrGLConfig.h" 22ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrGpu.h" 23ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTexture.h" 24ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrRect.h" 25ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 26ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrGpuGL; 27ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrGLTexture; 28ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 29ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrGLRenderTarget : public GrRenderTarget { 30ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected: 31ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 32ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com struct GLRenderTargetIDs { 33ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fRTFBOID; 34ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fTexFBOID; 35ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fStencilRenderbufferID; 36ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fMSColorRenderbufferID; 37ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool fOwnIDs; 38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 40ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGLRenderTarget(const GLRenderTargetIDs& ids, 41ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com const GrIRect& fViewport, 42ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGLTexture* texture, 43ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGpuGL* gl); 44ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 45ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void setViewport(const GrIRect& rect) { GrAssert(rect.height() <= 0); 46ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fViewport = rect;} 47ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 48ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual uint32_t width() const { return fViewport.width(); } 49ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual uint32_t height() const { return -fViewport.height(); } 50ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 52ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual ~GrGLRenderTarget(); 53ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 54ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool resolveable() const { return fRTFBOID != fTexFBOID; } 55ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool needsResolve() const { return fNeedsResolve; } 56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void setDirty(bool dirty) { fNeedsResolve = resolveable() && dirty; } 57ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 58ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint renderFBOID() const { return fRTFBOID; } 59ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint textureFBOID() const { return fTexFBOID; } 60ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 61ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com const GrIRect& viewport() const { return fViewport; } 62ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void abandon(); 63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprivate: 65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGpuGL* fGL; 66ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fRTFBOID; 67ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fTexFBOID; 68ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fStencilRenderbufferID; 69ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fMSColorRenderbufferID; 70ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 71ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // Should this object delete IDs when it is destroyed or does someone 72ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // else own them. 73ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool fOwnIDs; 74ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 75ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // If there separate Texture and RenderTarget FBO IDs then the rendertarget 76ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // must be resolved to the texture FBO before it is used as a texture. 77ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool fNeedsResolve; 78ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 79ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // when we switch to this rendertarget we want to set the viewport to 80ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // only render to to content area (as opposed to the whole allocation) and 81ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // we want the rendering to be at top left (GL has origin in bottom left) 82ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrIRect fViewport; 83ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 84ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com friend class GrGpuGL; 85ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com friend class GrGLTexture; 86ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 87ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com typedef GrRenderTarget INHERITED; 88ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}; 89ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 90ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrGLTexture : public GrTexture { 91ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 92ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com enum Orientation { 93ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com kBottomUp_Orientation, 94ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com kTopDown_Orientation, 95ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 96da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com 97da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com struct TexParams { 98da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com GLenum fFilter; 99da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com GLenum fWrapS; 100da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com GLenum fWrapT; 101da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com }; 102ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 103ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected: 104ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com struct GLTextureDesc { 105ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t fContentWidth; 106ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t fContentHeight; 107ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t fAllocWidth; 108da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com uint32_t fAllocHeight; 109ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com PixelConfig fFormat; 110ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fTextureID; 111ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum fUploadFormat; 112ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum fUploadByteCount; 113ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum fUploadType; 114ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Orientation fOrientation; 115ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 116ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com typedef GrGLRenderTarget::GLRenderTargetIDs GLRenderTargetIDs; 117ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGLTexture(const GLTextureDesc& textureDesc, 118ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com const GLRenderTargetIDs& rtIDs, 119da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com const TexParams& initialTexParams, 120ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGpuGL* gl); 121ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 122ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 123ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual ~GrGLTexture(); 124ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 125ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // overloads of GrTexture 126ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual void abandon(); 127ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual bool isRenderTarget() const; 128ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual GrRenderTarget* asRenderTarget(); 129ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual void removeRenderTarget(); 130ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual void uploadTextureData(uint32_t x, 131ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t y, 132ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t width, 133ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t height, 134ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com const void* srcData); 135ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual intptr_t getTextureHandle(); 136ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 137da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com const TexParams& getTexParams() const { return fTexParams; } 138da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com void setTexParams(const TexParams& texParams) { fTexParams = texParams; } 139ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint textureID() const { return fTextureID; } 140ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 141ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum uploadFormat() const { return fUploadFormat; } 142ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum uploadByteCount() const { return fUploadByteCount; } 143ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum uploadType() const { return fUploadType; } 144ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 145c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com /** 146c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * Retrieves the texture width actually allocated in texels. 147c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * 148c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @return the width in texels 149c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com */ 150c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com int allocWidth() const { return fAllocWidth; } 151c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com 152c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com /** 153c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * Retrieves the texture height actually allocated in texels. 154c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * 155c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @return the height in texels 156c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com */ 157c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com int allocHeight() const { return fAllocHeight; } 158c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com 159c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com /** 160c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @return width() / allocWidth() 161c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com */ 162c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrScalar contentScaleX() const { return fScaleX; } 163c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com 164c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com /** 165c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @return height() / allocHeight() 166c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com */ 167c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrScalar contentScaleY() const { return fScaleY; } 168c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com 169ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // Ganesh assumes texture coordinates have their origin 170ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // in the top-left corner of the image. OpenGL, however, 171ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // has the origin in the lower-left corner. For content that 172ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // is loaded by Ganesh we just push the content "upside down" 173ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // (by GL's understanding of the world ) in glTex*Image and the 174ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // addressing just works out. However, content generated by GL 175ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // (FBO or externally imported texture) will be updside down 176ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // and it is up to the GrGpuGL derivative to handle y-mirroing. 177ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Orientation orientation() const { return fOrientation; } 178ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 179ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprivate: 180da96ea01fe2a7f4237712c68fae2b96d3523b0f5bsalomon@google.com TexParams fTexParams; 181ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLuint fTextureID; 182ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum fUploadFormat; 183ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum fUploadByteCount; 184ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GLenum fUploadType; 185c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com int fAllocWidth; 186c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com int fAllocHeight; 187c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com // precomputed content / alloc ratios 188c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrScalar fScaleX; 189c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrScalar fScaleY; 190ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Orientation fOrientation; 191c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrGLRenderTarget* fRenderTarget; 192ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGpuGL* fGpuGL; 193c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com 194ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com static const GLenum gWrapMode2GLWrap[]; 195ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 196ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com friend class GrGpuGL; 197ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 198ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com typedef GrTexture INHERITED; 199ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}; 200ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 201ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 202