GrGLTexture.h revision c6cf72381b212eb21e61d5c5e14247b483a77753
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Copyright 2010 Google Inc. 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Licensed under the Apache License, Version 2.0 (the "License"); 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown you may not use this file except in compliance with the License. 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown You may obtain a copy of the License at 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown http://www.apache.org/licenses/LICENSE-2.0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Unless required by applicable law or agreed to in writing, software 1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown distributed under the License is distributed on an "AS IS" BASIS, 1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown See the License for the specific language governing permissions and 1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown limitations under the License. 1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 174532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#ifndef GrGLTexture_DEFINED 19ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown#define GrGLTexture_DEFINED 20cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown 2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include "GrGLConfig.h" 224ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown#include "GrGpu.h" 234ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown#include "GrTexture.h" 2489ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown#include "GrRect.h" 2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass GrGpuGL; 2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass GrGLTexture; 28a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown 29cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brownclass GrGLRenderTarget : public GrRenderTarget { 30cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brownprotected: 31cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown 325bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown struct GLRenderTargetIDs { 335bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown GLuint fRTFBOID; 346ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown GLuint fTexFBOID; 359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown GLuint fStencilRenderbufferID; 3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GLuint fMSColorRenderbufferID; 379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown bool fOwnIDs; 386ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown }; 399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 408ebac231966e27364e5d463b63540a0527d40c4bMichael Wright GrGLRenderTarget(const GLRenderTargetIDs& ids, 41349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown const GrIRect& fViewport, 429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown GrGLTexture* texture, 439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown GrGpuGL* gl); 449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 456ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown void setViewport(const GrIRect& rect) { GrAssert(rect.height() <= 0); 469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown fViewport = rect;} 479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 481a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown virtual uint32_t width() const { return fViewport.width(); } 494ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown virtual uint32_t height() const { return -fViewport.height(); } 50af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 51c9c9a48e7bafae63cb35a9aa69255e80aba83988Svetoslav Ganovpublic: 52fb290df3c9a6f37ec050163029e25844de2f8590RoboErik virtual ~GrGLRenderTarget(); 53ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown 544ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown bool resolveable() const { return fRTFBOID != fTexFBOID; } 559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown bool needsResolve() const { return fNeedsResolve; } 56d6396d67201fb2b64d13070324bb115c9c23b08aJason Gerecke void setDirty(bool dirty) { fNeedsResolve = resolveable() && dirty; } 574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown GLuint renderFBOID() const { return fRTFBOID; } 5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GLuint textureFBOID() const { return fTexFBOID; } 604532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 61af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown const GrIRect& viewport() const { return fViewport; } 62a9d131c30878cacdaeacb4f43a82a7cc5b872453Jeff Brown void abandon(); 63af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 6405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownprivate: 65ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown GrGpuGL* fGL; 66af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown GLuint fRTFBOID; 6750cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn GLuint fTexFBOID; 681a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown GLuint fStencilRenderbufferID; 691a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown GLuint fMSColorRenderbufferID; 709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown 7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // Should this object delete IDs when it is destroyed or does someone 72af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown // else own them. 7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown bool fOwnIDs; 74c9c9a48e7bafae63cb35a9aa69255e80aba83988Svetoslav Ganov 75c9c9a48e7bafae63cb35a9aa69255e80aba83988Svetoslav Ganov // If there separate Texture and RenderTarget FBO IDs then the rendertarget 7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown // must be resolved to the texture FBO before it is used as a texture. 778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown bool fNeedsResolve; 786ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown 791f2451007c660091b7b090c1ea332f9044515d2dJeff Brown // when we switch to this rendertarget we want to set the viewport to 802352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown // only render to to content area (as opposed to the whole allocation) and 81d52207423225bcd99e94276e9d0fc2cb5f905602Jason Gerecke // we want the rendering to be at top left (GL has origin in bottom left) 82a454767b09ecb7d25d00beae0e5a1fdd48605c63Jeff Brown GrIRect fViewport; 830029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 84cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown friend class GrGpuGL; 8546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown friend class GrGLTexture; 8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown typedef GrRenderTarget INHERITED; 8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 8946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass GrGLTexture : public GrTexture { 916ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brownpublic: 9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown enum Orientation { 9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown kBottomUp_Orientation, 949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown kTopDown_Orientation, 95cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown }; 96a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown 976ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown struct TexParams { 98a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown GLenum fFilter; 9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GLenum fWrapS; 10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown GLenum fWrapT; 10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown }; 10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 103d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brownprotected: 1044ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown struct GLTextureDesc { 10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown uint32_t fContentWidth; 1061b9ba578f1d2acf86c75110e89ae3d2e0434483aJeff Brown uint32_t fContentHeight; 1074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown uint32_t fAllocWidth; 1084532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown uint32_t fAllocHeight; 1094532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown PixelConfig fFormat; 110af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown GLuint fTextureID; 111cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown GLenum fUploadFormat; 112cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown GLenum fUploadByteCount; 113cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown GLenum fUploadType; 114cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown Orientation fOrientation; 115af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown }; 1164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown typedef GrGLRenderTarget::GLRenderTargetIDs GLRenderTargetIDs; 1177e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat GrGLTexture(const GLTextureDesc& textureDesc, 118b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown const GLRenderTargetIDs& rtIDs, 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown const TexParams& initialTexParams, 120af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown GrGpuGL* gl); 121a9d131c30878cacdaeacb4f43a82a7cc5b872453Jeff Brown 122a9d131c30878cacdaeacb4f43a82a7cc5b872453Jeff Brownpublic: 1232f39e9f8333183312b7f7d423c2ea60a93a25e32Craig Mautner virtual ~GrGLTexture(); 1246ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 125cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown // overloads of GrTexture 126af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual void abandon(); 127a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown virtual bool isRenderTarget() const; 128a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown virtual GrRenderTarget* asRenderTarget(); 129af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual void removeRenderTarget(); 130af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual void uploadTextureData(uint32_t x, 131af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown uint32_t y, 132af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown uint32_t width, 133af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown uint32_t height, 134af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown const void* srcData); 135af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual intptr_t getTextureHandle(); 136af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 137af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown const TexParams& getTexParams() const { return fTexParams; } 138af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown void setTexParams(const TexParams& texParams) { fTexParams = texParams; } 139cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown GLuint textureID() const { return fTextureID; } 140cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown 141cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown GLenum uploadFormat() const { return fUploadFormat; } 142cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown GLenum uploadByteCount() const { return fUploadByteCount; } 143cf39bdf3dff5e29447f6ce734b76dc3490385e58Jeff Brown GLenum uploadType() const { return fUploadType; } 144af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 145a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown /** 146a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown * Retrieves the texture width actually allocated in texels. 147a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown * 148a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown * @return the width in texels 149a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown */ 150a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown int allocWidth() const { return fAllocWidth; } 151af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 152af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown /** 153c9c9a48e7bafae63cb35a9aa69255e80aba83988Svetoslav Ganov * Retrieves the texture height actually allocated in texels. 154af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown * 1554532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown * @return the height in texels 1567e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat */ 1574532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown int allocHeight() const { return fAllocHeight; } 1587e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat 1597e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat /** 160d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown * @return width() / allocWidth() 161d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown */ 16283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown GrScalar contentScaleX() const { return fScaleX; } 16383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown 164d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown /** 1657e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat * @return height() / allocHeight() 1664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown */ 1677e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat GrScalar contentScaleY() const { return fScaleY; } 1684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 1697e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat // Ganesh assumes texture coordinates have their origin 1704532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown // in the top-left corner of the image. OpenGL, however, 1717e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat // has the origin in the lower-left corner. For content that 1724532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown // is loaded by Ganesh we just push the content "upside down" 1737e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat // (by GL's understanding of the world ) in glTex*Image and the 174928e054931d357326613c78e62f4d850b7c442ffJeff Brown // addressing just works out. However, content generated by GL 1757e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat // (FBO or externally imported texture) will be updside down 1767e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat // and it is up to the GrGpuGL derivative to handle y-mirroing. 177ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown Orientation orientation() const { return fOrientation; } 1780029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 1790029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brownprivate: 1807e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat TexParams fTexParams; 1817e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat GLuint fTextureID; 1827e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat GLenum fUploadFormat; 1837e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat GLenum fUploadByteCount; 1844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown GLenum fUploadType; 1857e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat int fAllocWidth; 1864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown int fAllocHeight; 1877e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat // precomputed content / alloc ratios 1887e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat GrScalar fScaleX; 189037c33eae74bee2774897d969d48947f9abe254fJeff Brown GrScalar fScaleY; 190857aa7be880c53d78f72a9f227cbdf72ee68d587Jason Gerecke Orientation fOrientation; 1917e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat GrGLRenderTarget* fRenderTarget; 192a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown GrGpuGL* fGpuGL; 1937e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat 1947e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat static const GLenum gWrapMode2GLWrap[]; 1957e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat 1967e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat friend class GrGpuGL; 1977e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat 198ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown typedef GrTexture INHERITED; 1997fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown}; 200ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown 201ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown#endif 202ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown