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