10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License.
50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at
60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software
100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and
130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License.
140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Texture.h: Defines the abstract Texture class and its concrete derived
160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// classes Texture2D and TextureCubeMap. Implements GL texture objects and
170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// related functionality.
180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#ifndef LIBGL_TEXTURE_H_
200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define LIBGL_TEXTURE_H_
210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Renderbuffer.h"
230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "common/Object.hpp"
240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "utilities.h"
250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "common/debug.h"
260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define _GDI32_
280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <windows.h>
290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <GL/GL.h>
300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <GL/glext.h>
310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <vector>
330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace gl
350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Surface;
370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Config;
380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Framebuffer;
390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensenum
410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,
430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),
440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),
450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION,
460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Texture : public NamedObject
490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	explicit Texture(GLuint name);
520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~Texture();
540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	sw::Resource *getResource() const;
560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void addProxyRef(const Renderbuffer *proxy) = 0;
580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void releaseProxy(const Renderbuffer *proxy) = 0;
590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getTarget() const = 0;
610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool setMinFilter(GLenum filter);
630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool setMagFilter(GLenum filter);
640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool setWrapS(GLenum wrap);
650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool setWrapT(GLenum wrap);
660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool setMaxAnisotropy(GLfloat textureMaxAnisotropy);
670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool setMaxLevel(int level);
680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum getMinFilter() const;
700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum getMagFilter() const;
710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum getWrapS() const;
720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum getWrapT() const;
730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLfloat getMaxAnisotropy() const;
740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getWidth(GLenum target, GLint level) const = 0;
760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getHeight(GLenum target, GLint level) const = 0;
770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getFormat(GLenum target, GLint level) const = 0;
780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getType(GLenum target, GLint level) const = 0;
790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual sw::Format getInternalFormat(GLenum target, GLint level) const = 0;
80b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens	virtual int getTopLevel() const = 0;
810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isSamplerComplete() const = 0;
830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isCompressed(GLenum target, GLint level) const = 0;
840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isDepth(GLenum target, GLint level) const = 0;
850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual Renderbuffer *getRenderbuffer(GLenum target) = 0;
870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual Image *getRenderTarget(GLenum target, unsigned int level) = 0;
880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void generateMipmaps() = 0;
900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0;
910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprotected:
930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image);
940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image);
950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setCompressedImage(GLsizei imageSize, const void *pixels, Image *image);
960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *image);
970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool copy(Image *source, const sw::Rect &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, Image *dest);
990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool isMipmapFiltered() const;
1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum mMinFilter;
1030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum mMagFilter;
1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum mWrapS;
1050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum mWrapT;
1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLfloat mMaxAnisotropy;
1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLint mMaxLevel;
1080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	sw::Resource *resource;
1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Texture2D : public Texture
1130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	explicit Texture2D(GLuint name);
1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~Texture2D();
1180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void addProxyRef(const Renderbuffer *proxy);
1200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void releaseProxy(const Renderbuffer *proxy);
1210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getTarget() const;
1230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getWidth(GLenum target, GLint level) const;
1250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getHeight(GLenum target, GLint level) const;
1260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getFormat(GLenum target, GLint level) const;
1270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getType(GLenum target, GLint level) const;
1280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual sw::Format getInternalFormat(GLenum target, GLint level) const;
129b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens	virtual int getTopLevel() const;
1300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
1320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
1330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
1340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
1350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
1360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
1370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setImage(Image *image);
1390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isSamplerComplete() const;
1410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isCompressed(GLenum target, GLint level) const;
1420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isDepth(GLenum target, GLint level) const;
1430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void generateMipmaps();
1450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual Renderbuffer *getRenderbuffer(GLenum target);
1470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual Image *getRenderTarget(GLenum target, unsigned int level);
1480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Image *getImage(unsigned int level);
1500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprotected:
1520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool isMipmapComplete() const;
1530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
1550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// A specific internal reference count is kept for colorbuffer proxy references,
1570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// because, as the renderbuffer acting as proxy will maintain a binding pointer
1580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// back to this texture, there would be a circular reference if we used a binding
1590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// pointer here. This reference count will cause the pointer to be set to null if
1600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// the count drops to zero, but will not cause deletion of the Renderbuffer.
1610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Renderbuffer *mColorbufferProxy;
1620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	unsigned int mProxyRefs;
1630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass TextureCubeMap : public Texture
1660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
1670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
1680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	explicit TextureCubeMap(GLuint name);
1690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~TextureCubeMap();
1710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void addProxyRef(const Renderbuffer *proxy);
1730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void releaseProxy(const Renderbuffer *proxy);
1740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getTarget() const;
1760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getWidth(GLenum target, GLint level) const;
1780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getHeight(GLenum target, GLint level) const;
1790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getFormat(GLenum target, GLint level) const;
1800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLenum getType(GLenum target, GLint level) const;
1810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual sw::Format getInternalFormat(GLenum target, GLint level) const;
182b3f54e844c7bb9bc7b070ede7b574c373d4f67f1Nicolas Capens	virtual int getTopLevel() const;
1830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
1850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
1880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
1890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
1900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
1910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isSamplerComplete() const;
1930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isCompressed(GLenum target, GLint level) const;
1940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual bool isDepth(GLenum target, GLint level) const;
1950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void generateMipmaps();
1970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual Renderbuffer *getRenderbuffer(GLenum target);
1990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual Image *getRenderTarget(GLenum target, unsigned int level);
2000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Image *getImage(int face, unsigned int level);
2020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprivate:
2040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool isCubeComplete() const;
2050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	bool isMipmapCubeComplete() const;
2060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// face is one of the GL_TEXTURE_CUBE_MAP_* enumerants. Returns nullptr on failure.
2080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Image *getImage(GLenum face, unsigned int level);
2090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Image *image[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
2110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// A specific internal reference count is kept for colorbuffer proxy references,
2130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// because, as the renderbuffer acting as proxy will maintain a binding pointer
2140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// back to this texture, there would be a circular reference if we used a binding
2150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// pointer here. This reference count will cause the pointer to be set to null if
2160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// the count drops to zero, but will not cause deletion of the Renderbuffer.
2170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Renderbuffer *mFaceProxies[6];
2180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	unsigned int mFaceProxyRefs[6];
2190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
2200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens}
2220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif   // LIBGL_TEXTURE_H_
224