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