blob: ba0c4d51cd4607b1eefb64ad5d9cbcb3ae169a2c [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Texture.h: Defines the abstract Texture class and its concrete derived
16// classes Texture2D and TextureCubeMap. Implements GL texture objects and
17// related functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
18
19#ifndef LIBGLES_CM_TEXTURE_H_
20#define LIBGLES_CM_TEXTURE_H_
21
22#include "Renderbuffer.h"
23#include "common/Object.hpp"
24#include "utilities.h"
25#include "libEGL/Texture.hpp"
26#include "common/debug.h"
27
28#include <GLES/gl.h>
29
30#include <vector>
31
32namespace egl
33{
34class Surface;
35class Config;
36}
37
38namespace es1
39{
40class Framebuffer;
41
42enum
43{
44 IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,
45 IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),
46 IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),
47 IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION,
48};
49
50class Texture : public egl::Texture
51{
52public:
53 explicit Texture(GLuint name);
54
55 sw::Resource *getResource() const;
56
57 virtual void addProxyRef(const Renderbuffer *proxy) = 0;
58 virtual void releaseProxy(const Renderbuffer *proxy) = 0;
59
60 virtual GLenum getTarget() const = 0;
61
62 bool setMinFilter(GLenum filter);
63 bool setMagFilter(GLenum filter);
64 bool setWrapS(GLenum wrap);
65 bool setWrapT(GLenum wrap);
66 bool setMaxAnisotropy(GLfloat textureMaxAnisotropy);
67 void setGenerateMipmap(GLboolean enable);
68 void setCropRect(GLint u, GLint v, GLint w, GLint h);
69
70 GLenum getMinFilter() const;
71 GLenum getMagFilter() const;
72 GLenum getWrapS() const;
73 GLenum getWrapT() const;
74 GLfloat getMaxAnisotropy() const;
75 GLboolean getGenerateMipmap() const;
76 GLint getCropRectU() const;
77 GLint getCropRectV() const;
78 GLint getCropRectW() const;
79 GLint getCropRectH() const;
80
81 virtual GLsizei getWidth(GLenum target, GLint level) const = 0;
82 virtual GLsizei getHeight(GLenum target, GLint level) const = 0;
83 virtual GLenum getFormat(GLenum target, GLint level) const = 0;
84 virtual GLenum getType(GLenum target, GLint level) const = 0;
85 virtual sw::Format getInternalFormat(GLenum target, GLint level) const = 0;
86 virtual int getLevelCount() const = 0;
87
88 virtual bool isSamplerComplete() const = 0;
89 virtual bool isCompressed(GLenum target, GLint level) const = 0;
90 virtual bool isDepth(GLenum target, GLint level) const = 0;
91
92 virtual Renderbuffer *getRenderbuffer(GLenum target) = 0;
93 virtual egl::Image *getRenderTarget(GLenum target, unsigned int level) = 0;
94 virtual egl::Image *createSharedImage(GLenum target, unsigned int level);
95 virtual bool isShared(GLenum target, unsigned int level) const = 0;
96
97 virtual void generateMipmaps() = 0;
98 virtual void autoGenerateMipmaps() = 0;
99
100 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0;
101
102protected:
103 virtual ~Texture();
104
105 void setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image);
106 void subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image);
107 void setCompressedImage(GLsizei imageSize, const void *pixels, egl::Image *image);
108 void subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, egl::Image *image);
109
110 bool copy(egl::Image *source, const sw::Rect &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, egl::Image *dest);
111
112 bool isMipmapFiltered() const;
113
114 GLenum mMinFilter;
115 GLenum mMagFilter;
116 GLenum mWrapS;
117 GLenum mWrapT;
118 GLfloat mMaxAnisotropy;
119 GLboolean generateMipmap;
120 GLint cropRectU;
121 GLint cropRectV;
122 GLint cropRectW;
123 GLint cropRectH;
124
125 sw::Resource *resource;
126};
127
128class Texture2D : public Texture
129{
130public:
131 explicit Texture2D(GLuint name);
132
133 void addProxyRef(const Renderbuffer *proxy) override;
134 void releaseProxy(const Renderbuffer *proxy) override;
135 void sweep() override;
136
137 virtual GLenum getTarget() const;
138
139 virtual GLsizei getWidth(GLenum target, GLint level) const;
140 virtual GLsizei getHeight(GLenum target, GLint level) const;
141 virtual GLenum getFormat(GLenum target, GLint level) const;
142 virtual GLenum getType(GLenum target, GLint level) const;
143 virtual sw::Format getInternalFormat(GLenum target, GLint level) const;
144 virtual int getLevelCount() const;
145
146 void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
147 void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
148 void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
149 void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
150 void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
151 void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
152
Nicolas Capens58df2f62016-06-07 14:48:56 -0400153 void setSharedImage(egl::Image *image);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400154
155 virtual bool isSamplerComplete() const;
156 virtual bool isCompressed(GLenum target, GLint level) const;
157 virtual bool isDepth(GLenum target, GLint level) const;
158 virtual void bindTexImage(egl::Surface *surface);
159 virtual void releaseTexImage();
160
161 virtual void generateMipmaps();
162 virtual void autoGenerateMipmaps();
163
164 virtual Renderbuffer *getRenderbuffer(GLenum target);
165 virtual egl::Image *getRenderTarget(GLenum target, unsigned int level);
166 virtual bool isShared(GLenum target, unsigned int level) const;
167
168 egl::Image *getImage(unsigned int level);
169
170protected:
171 virtual ~Texture2D();
172
173 bool isMipmapComplete() const;
174
175 egl::Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
176
177 egl::Surface *mSurface;
178
179 // A specific internal reference count is kept for colorbuffer proxy references,
180 // because, as the renderbuffer acting as proxy will maintain a binding pointer
181 // back to this texture, there would be a circular reference if we used a binding
182 // pointer here. This reference count will cause the pointer to be set to null if
183 // the count drops to zero, but will not cause deletion of the Renderbuffer.
184 Renderbuffer *mColorbufferProxy;
185 unsigned int mProxyRefs;
186};
187
188class TextureExternal : public Texture2D
189{
190public:
191 explicit TextureExternal(GLuint name);
192
193 virtual GLenum getTarget() const;
194
195protected:
196 virtual ~TextureExternal();
197};
198}
199
200#endif // LIBGLES_CM_TEXTURE_H_