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