1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License.
5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at
6d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software
10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and
13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License.
14d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Texture.h: Defines the abstract Texture class and its concrete derived
16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// classes Texture2D and TextureCubeMap. Implements GL texture objects and
17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// related functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef LIBGLESV2_TEXTURE_H_
20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define LIBGLESV2_TEXTURE_H_
21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Renderbuffer.h"
23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "common/Object.hpp"
24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "utilities.h"
25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "libEGL/Texture.hpp"
26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "common/debug.h"
27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <GLES2/gl2.h>
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <vector>
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace egl
33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Surface;
35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Config;
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace es2
39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Framebuffer;
41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensenum
43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,
45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),
46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),
47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION,
48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture : public egl::Texture
51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	explicit Texture(GLuint name);
54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual sw::Resource *getResource() const;
56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void addProxyRef(const Renderbuffer *proxy) = 0;
58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void releaseProxy(const Renderbuffer *proxy) = 0;
59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTarget() const = 0;
61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setMinFilter(GLenum filter);
63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setMagFilter(GLenum filter);
64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setWrapS(GLenum wrap);
65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setWrapT(GLenum wrap);
66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setWrapR(GLenum wrap);
67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setMaxAnisotropy(GLfloat textureMaxAnisotropy);
68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setBaseLevel(GLint baseLevel);
69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setCompareFunc(GLenum compareFunc);
70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setCompareMode(GLenum compareMode);
71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void makeImmutable(GLsizei levels);
72d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setMaxLevel(GLint maxLevel);
73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setMaxLOD(GLfloat maxLOD);
74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setMinLOD(GLfloat minLOD);
75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setSwizzleR(GLenum swizzleR);
76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setSwizzleG(GLenum swizzleG);
77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setSwizzleB(GLenum swizzleB);
78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool setSwizzleA(GLenum swizzleA);
79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getMinFilter() const;
81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getMagFilter() const;
82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getWrapS() const;
83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getWrapT() const;
84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getWrapR() const;
85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLfloat getMaxAnisotropy() const;
86d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLint getBaseLevel() const;
87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getCompareFunc() const;
88d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getCompareMode() const;
89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLboolean getImmutableFormat() const;
90d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLsizei getImmutableLevels() const;
91d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLint getMaxLevel() const;
92d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLfloat getMaxLOD() const;
93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLfloat getMinLOD() const;
94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getSwizzleR() const;
95d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getSwizzleG() const;
96d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getSwizzleB() const;
97d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum getSwizzleA() const;
98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
99d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getWidth(GLenum target, GLint level) const = 0;
100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getHeight(GLenum target, GLint level) const = 0;
101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getDepth(GLenum target, GLint level) const;
102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getFormat(GLenum target, GLint level) const = 0;
103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getType(GLenum target, GLint level) const = 0;
104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual sw::Format getInternalFormat(GLenum target, GLint level) const = 0;
105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual int getLevelCount() const = 0;
106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isSamplerComplete() const = 0;
108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isCompressed(GLenum target, GLint level) const = 0;
109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isDepth(GLenum target, GLint level) const = 0;
110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer) = 0;
112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual egl::Image *getRenderTarget(GLenum target, unsigned int level) = 0;
113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual egl::Image *createSharedImage(GLenum target, unsigned int level);
114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isShared(GLenum target, unsigned int level) const = 0;
115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void generateMipmaps() = 0;
117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0;
118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected:
120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~Texture();
121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setImage(GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image);
123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image);
124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setCompressedImage(GLsizei imageSize, const void *pixels, egl::Image *image);
125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels, egl::Image *image);
126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool copy(egl::Image *source, const sw::SliceRect &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, GLint zoffset, egl::Image *dest);
128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool isMipmapFiltered() const;
130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mMinFilter;
132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mMagFilter;
133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mWrapS;
134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mWrapT;
135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mWrapR;
136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLfloat mMaxAnisotropy;
137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLint mBaseLevel;
138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mCompareFunc;
139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mCompareMode;
140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLboolean mImmutableFormat;
141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLsizei mImmutableLevels;
142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLint mMaxLevel;
143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLfloat mMaxLOD;
144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLfloat mMinLOD;
145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mSwizzleR;
146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mSwizzleG;
147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mSwizzleB;
148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mSwizzleA;
149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	sw::Resource *resource;
151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture2D : public Texture
154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	explicit Texture2D(GLuint name);
157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void addProxyRef(const Renderbuffer *proxy) override;
159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void releaseProxy(const Renderbuffer *proxy) override;
160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void sweep() override;
161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTarget() const;
163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getWidth(GLenum target, GLint level) const;
165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getHeight(GLenum target, GLint level) const;
166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getFormat(GLenum target, GLint level) const;
167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getType(GLenum target, GLint level) const;
168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual sw::Format getInternalFormat(GLenum target, GLint level) const;
169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual int getLevelCount() const;
170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setImage(egl::Image *image);
179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isSamplerComplete() const;
181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isCompressed(GLenum target, GLint level) const;
182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isDepth(GLenum target, GLint level) const;
183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void bindTexImage(egl::Surface *surface);
184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void releaseTexImage();
185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void generateMipmaps();
187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer);
189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual egl::Image *getRenderTarget(GLenum target, unsigned int level);
190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isShared(GLenum target, unsigned int level) const;
191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Image *getImage(unsigned int level);
193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected:
195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~Texture2D();
196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool isMipmapComplete() const;
198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Surface *mSurface;
202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// A specific internal reference count is kept for colorbuffer proxy references,
204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// because, as the renderbuffer acting as proxy will maintain a binding pointer
205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// back to this texture, there would be a circular reference if we used a binding
206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// pointer here. This reference count will cause the pointer to be set to null if
207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// the count drops to zero, but will not cause deletion of the Renderbuffer.
208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Renderbuffer *mColorbufferProxy;
209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int mProxyRefs;
210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass TextureCubeMap : public Texture
213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	explicit TextureCubeMap(GLuint name);
216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void addProxyRef(const Renderbuffer *proxy) override;
218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void releaseProxy(const Renderbuffer *proxy) override;
219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void sweep() override;
220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTarget() const;
222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getWidth(GLenum target, GLint level) const;
224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getHeight(GLenum target, GLint level) const;
225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getFormat(GLenum target, GLint level) const;
226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getType(GLenum target, GLint level) const;
227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual sw::Format getInternalFormat(GLenum target, GLint level) const;
228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual int getLevelCount() const;
229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isSamplerComplete() const;
239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isCompressed(GLenum target, GLint level) const;
240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isDepth(GLenum target, GLint level) const;
241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void releaseTexImage();
242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void generateMipmaps();
244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer);
246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual egl::Image *getRenderTarget(GLenum target, unsigned int level);
247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isShared(GLenum target, unsigned int level) const;
248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Image *getImage(int face, unsigned int level);
250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected:
252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~TextureCubeMap();
253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprivate:
255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool isCubeComplete() const;
256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool isMipmapCubeComplete() const;
257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// face is one of the GL_TEXTURE_CUBE_MAP_* enumerants. Returns nullptr on failure.
259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Image *getImage(GLenum face, unsigned int level);
260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Image *image[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// A specific internal reference count is kept for colorbuffer proxy references,
264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// because, as the renderbuffer acting as proxy will maintain a binding pointer
265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// back to this texture, there would be a circular reference if we used a binding
266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// pointer here. This reference count will cause the pointer to be set to null if
267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// the count drops to zero, but will not cause deletion of the Renderbuffer.
268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Renderbuffer *mFaceProxies[6];
269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int mFaceProxyRefs[6];
270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture3D : public Texture
273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	explicit Texture3D(GLuint name);
276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void addProxyRef(const Renderbuffer *proxy) override;
278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void releaseProxy(const Renderbuffer *proxy) override;
279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void sweep() override;
280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTarget() const;
282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getWidth(GLenum target, GLint level) const;
284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getHeight(GLenum target, GLint level) const;
285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLsizei getDepth(GLenum target, GLint level) const;
286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getFormat(GLenum target, GLint level) const;
287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getType(GLenum target, GLint level) const;
288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual sw::Format getInternalFormat(GLenum target, GLint level) const;
289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual int getLevelCount() const;
290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels);
293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels);
295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Framebuffer *source);
296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setImage(egl::Image *image);
299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isSamplerComplete() const;
301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isCompressed(GLenum target, GLint level) const;
302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isDepth(GLenum target, GLint level) const;
303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void bindTexImage(egl::Surface *surface);
304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void releaseTexImage();
305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void generateMipmaps();
307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer);
309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual egl::Image *getRenderTarget(GLenum target, unsigned int level);
310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual bool isShared(GLenum target, unsigned int level) const;
311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Image *getImage(unsigned int level);
313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected:
315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~Texture3D();
316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool isMipmapComplete() const;
318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	egl::Surface *mSurface;
322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// A specific internal reference count is kept for colorbuffer proxy references,
324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// because, as the renderbuffer acting as proxy will maintain a binding pointer
325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// back to this texture, there would be a circular reference if we used a binding
326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// pointer here. This reference count will cause the pointer to be set to null if
327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	// the count drops to zero, but will not cause deletion of the Renderbuffer.
328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Renderbuffer *mColorbufferProxy;
329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int mProxyRefs;
330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture2DArray : public Texture3D
333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	explicit Texture2DArray(GLuint name);
336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTarget() const;
338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual void generateMipmaps();
339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected:
341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~Texture2DArray();
342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass TextureExternal : public Texture2D
345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	explicit TextureExternal(GLuint name);
348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTarget() const;
350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected:
352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~TextureExternal();
353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif   // LIBGLESV2_TEXTURE_H_
357