195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com//
2e2e9798bbcf01eb94375432dacd7a54617532dc2shannon.woods@transgaming.com// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// found in the LICENSE file.
595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com//
695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// Texture.h: Defines the abstract gl::Texture class and its concrete derived
895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// classes Texture2D and TextureCubeMap. Implements GL texture objects and
995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// related functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
1095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
1195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#ifndef LIBGLESV2_TEXTURE_H_
1295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#define LIBGLESV2_TEXTURE_H_
1395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
1495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#include <vector>
1595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
1695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#define GL_APICALL
1795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#include <GLES2/gl2.h>
1895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
1995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#include "common/debug.h"
2095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#include "common/RefCountObject.h"
218bc304a1c6297dba9c17985e1dbab6a0ece437efdaniel@transgaming.com#include "libGLESv2/angletypes.h"
2295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
2395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comnamespace egl
2495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
2595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comclass Surface;
2695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
2795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
28370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.comnamespace rx
29370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com{
30370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.comclass Renderer;
31486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass TextureStorageInterface;
32486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass TextureStorageInterface2D;
33486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass TextureStorageInterfaceCube;
34486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass RenderTarget;
35486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Image;
36370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com}
37370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com
3895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comnamespace gl
3995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
4095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comclass Framebuffer;
41486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Renderbuffer;
4295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
4395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comenum
4495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
4595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // These are the maximums the implementation can support
4695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // The actual GL caps are limited by the device caps
4795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // and should be queried from the Context
4895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    IMPLEMENTATION_MAX_TEXTURE_SIZE = 16384,
4995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384,
5095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
5195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15   // 1+log2 of MAX_TEXTURE_SIZE
5295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com};
5395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
5495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comclass Texture : public RefCountObject
5595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
5695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  public:
57370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com    Texture(rx::Renderer *renderer, GLuint id);
5895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
5995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual ~Texture();
6095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
6195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void addProxyRef(const Renderbuffer *proxy) = 0;
6295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void releaseProxy(const Renderbuffer *proxy) = 0;
6395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
6495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual GLenum getTarget() const = 0;
6595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
6695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool setMinFilter(GLenum filter);
6795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool setMagFilter(GLenum filter);
6895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool setWrapS(GLenum wrap);
6995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool setWrapT(GLenum wrap);
7007ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com    bool setMaxAnisotropy(float textureMaxAnisotropy, float contextMaxAnisotropy);
7195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool setUsage(GLenum usage);
7295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
7395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum getMinFilter() const;
7495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum getMagFilter() const;
7595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum getWrapS() const;
7695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum getWrapT() const;
7707ab841a88e2779dec5d5a347a8403c7d84f28e8daniel@transgaming.com    float getMaxAnisotropy() const;
78ebf139fe6f43719ea599457776209f3064fabb95daniel@transgaming.com    int getLodOffset();
79ebf139fe6f43719ea599457776209f3064fabb95daniel@transgaming.com    void getSamplerState(SamplerState *sampler);
8095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum getUsage() const;
81ca9a3c87be69e0e35f107288d2a9d3b11a2ac0f1daniel@transgaming.com    bool isMipmapFiltered() const;
8295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
8395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual bool isSamplerComplete() const = 0;
8495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
8587705f8292857d1446f0967c43b7fac66a70d9c2daniel@transgaming.com    rx::TextureStorageInterface *getNativeTexture();
8695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual Renderbuffer *getRenderbuffer(GLenum target) = 0;
8795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
8895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void generateMipmaps() = 0;
8995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0;
9095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
9195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool hasDirtyParameters() const;
9295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool hasDirtyImages() const;
9395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void resetDirty();
9495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    unsigned int getTextureSerial();
9595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    unsigned int getRenderTargetSerial(GLenum target);
9695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
9795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool isImmutable() const;
9895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
9995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    static const GLuint INCOMPLETE_TEXTURE_ID = static_cast<GLuint>(-1);   // Every texture takes an id at creation time. The value is arbitrary because it is never registered with the resource manager.
10095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
10195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  protected:
10231b13e1ff922519d727c151e7ee3eb93d453e5eadaniel@transgaming.com    void setImage(GLint unpackAlignment, const void *pixels, rx::Image *image);
10331b13e1ff922519d727c151e7ee3eb93d453e5eadaniel@transgaming.com    bool subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, rx::Image *image);
10431b13e1ff922519d727c151e7ee3eb93d453e5eadaniel@transgaming.com    void setCompressedImage(GLsizei imageSize, const void *pixels, rx::Image *image);
10531b13e1ff922519d727c151e7ee3eb93d453e5eadaniel@transgaming.com    bool subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, rx::Image *image);
10695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
10795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLint creationLevels(GLsizei width, GLsizei height) const;
10895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLint creationLevels(GLsizei size) const;
10995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
11095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void createTexture() = 0;
11195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void updateTexture() = 0;
11295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void convertToRenderTarget() = 0;
113d186dc7febccce89bda20a00f511977deff0f434daniel@transgaming.com    virtual rx::RenderTarget *getRenderTarget(GLenum target) = 0;
11495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
115690d8aeaf674d181c82b6067ddbad3ebe687cd10daniel@transgaming.com    virtual int levelCount() = 0;
11695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
117370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com    rx::Renderer *mRenderer;
118370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com
119ebf139fe6f43719ea599457776209f3064fabb95daniel@transgaming.com    SamplerState mSamplerState;
12095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum mUsage;
12195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
12295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool mDirtyImages;
12395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
12495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool mImmutable;
12595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
12695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  private:
12795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(Texture);
12895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
12987705f8292857d1446f0967c43b7fac66a70d9c2daniel@transgaming.com    virtual rx::TextureStorageInterface *getStorage(bool renderTarget) = 0;
13095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com};
13195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
13295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comclass Texture2D : public Texture
13395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
13495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  public:
135370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com    Texture2D(rx::Renderer *renderer, GLuint id);
13695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
13795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    ~Texture2D();
13895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
13995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void addProxyRef(const Renderbuffer *proxy);
14095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void releaseProxy(const Renderbuffer *proxy);
14195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
14295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual GLenum getTarget() const;
14395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
14495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLsizei getWidth(GLint level) const;
14595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLsizei getHeight(GLint level) const;
14695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum getInternalFormat(GLint level) const;
14720d36667199abc703cddff58ebdfd5eef726a51cdaniel@transgaming.com    GLenum getActualFormat(GLint level) const;
14895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool isCompressed(GLint level) const;
14995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool isDepth(GLint level) const;
15095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
15195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
15295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
15395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
15495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
15595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
15695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
15795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
15895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
15995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual bool isSamplerComplete() const;
16095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void bindTexImage(egl::Surface *surface);
16195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void releaseTexImage();
16295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
16395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void generateMipmaps();
16495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
16595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual Renderbuffer *getRenderbuffer(GLenum target);
16695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
16795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  protected:
16895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    friend class RenderbufferTexture2D;
169d186dc7febccce89bda20a00f511977deff0f434daniel@transgaming.com    virtual rx::RenderTarget *getRenderTarget(GLenum target);
170d186dc7febccce89bda20a00f511977deff0f434daniel@transgaming.com    virtual rx::RenderTarget *getDepthStencil(GLenum target);
171690d8aeaf674d181c82b6067ddbad3ebe687cd10daniel@transgaming.com    virtual int levelCount();
17295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
17395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  private:
17495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(Texture2D);
17595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
17695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void createTexture();
17795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void updateTexture();
17895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void convertToRenderTarget();
17987705f8292857d1446f0967c43b7fac66a70d9c2daniel@transgaming.com    virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
18095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
18195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool isMipmapComplete() const;
18295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
183e2e9798bbcf01eb94375432dacd7a54617532dc2shannon.woods@transgaming.com    void redefineImage(GLint level, GLint internalformat, GLsizei width, GLsizei height);
18495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
18595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
186d9ec902281ce1efe9a1905a43d86f2f4a3495ae5daniel@transgaming.com    rx::Image *mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
18795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
18887705f8292857d1446f0967c43b7fac66a70d9c2daniel@transgaming.com    rx::TextureStorageInterface2D *mTexStorage;
18995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    egl::Surface *mSurface;
19095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
19195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // A specific internal reference count is kept for colorbuffer proxy references,
19295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // because, as the renderbuffer acting as proxy will maintain a binding pointer
19395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // back to this texture, there would be a circular reference if we used a binding
19495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // pointer here. This reference count will cause the pointer to be set to NULL if
19595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // the count drops to zero, but will not cause deletion of the Renderbuffer.
19695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    Renderbuffer *mColorbufferProxy;
19795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    unsigned int mProxyRefs;
19895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com};
19995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
20095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comclass TextureCubeMap : public Texture
20195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
20295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  public:
203370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com    TextureCubeMap(rx::Renderer *renderer, GLuint id);
20495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
20595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    ~TextureCubeMap();
20695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
20795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void addProxyRef(const Renderbuffer *proxy);
20895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void releaseProxy(const Renderbuffer *proxy);
20995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
21095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual GLenum getTarget() const;
21195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
21295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLsizei getWidth(GLenum target, GLint level) const;
21395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLsizei getHeight(GLenum target, GLint level) const;
21495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    GLenum getInternalFormat(GLenum target, GLint level) const;
21520d36667199abc703cddff58ebdfd5eef726a51cdaniel@transgaming.com    GLenum getActualFormat(GLenum target, GLint level) const;
21695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool isCompressed(GLenum target, GLint level) const;
21795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
21895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
21995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImageNegX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
22095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImagePosY(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
22195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImageNegY(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
22295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImagePosZ(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
22395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImageNegZ(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
22495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
22595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setCompressedImage(GLenum face, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
22695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
22795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
22895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
22995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
23095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
23195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void storage(GLsizei levels, GLenum internalformat, GLsizei size);
23295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
23395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual bool isSamplerComplete() const;
23495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
23595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void generateMipmaps();
23695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
23795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual Renderbuffer *getRenderbuffer(GLenum target);
23895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
23995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    static unsigned int faceIndex(GLenum face);
24095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
24195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  protected:
24295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    friend class RenderbufferTextureCubeMap;
243d186dc7febccce89bda20a00f511977deff0f434daniel@transgaming.com    virtual rx::RenderTarget *getRenderTarget(GLenum target);
244690d8aeaf674d181c82b6067ddbad3ebe687cd10daniel@transgaming.com    virtual int levelCount();
24595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
24695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com  private:
24795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(TextureCubeMap);
24895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
24995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void createTexture();
25095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void updateTexture();
25195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    virtual void convertToRenderTarget();
25287705f8292857d1446f0967c43b7fac66a70d9c2daniel@transgaming.com    virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
25395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
25495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool isCubeComplete() const;
25595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    bool isMipmapCubeComplete() const;
25695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
25795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
25895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    void commitRect(int faceIndex, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
259e2e9798bbcf01eb94375432dacd7a54617532dc2shannon.woods@transgaming.com    void redefineImage(int faceIndex, GLint level, GLint internalformat, GLsizei width, GLsizei height);
26095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
261d9ec902281ce1efe9a1905a43d86f2f4a3495ae5daniel@transgaming.com    rx::Image *mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
26295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
26387705f8292857d1446f0967c43b7fac66a70d9c2daniel@transgaming.com    rx::TextureStorageInterfaceCube *mTexStorage;
26495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
26595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // A specific internal reference count is kept for colorbuffer proxy references,
26695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // because, as the renderbuffer acting as proxy will maintain a binding pointer
26795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // back to this texture, there would be a circular reference if we used a binding
26895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // pointer here. This reference count will cause the pointer to be set to NULL if
26995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    // the count drops to zero, but will not cause deletion of the Renderbuffer.
27095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    Renderbuffer *mFaceProxies[6];
27195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    unsigned int *mFaceProxyRefs[6];
27295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com};
27395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
27495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
275687152872868ca57915af8859d77b6b13fe229c0jbauman@chromium.org#endif   // LIBGLESV2_TEXTURE_H_
276