e58d5d9283185b40c51c47021e8886ab7d76cd96
[blender.git] / source / blender / gpu / GPU_texture.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Brecht Van Lommel.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file GPU_texture.h
29  *  \ingroup gpu
30  */
31
32 #ifndef __GPU_TEXTURE_H__
33 #define __GPU_TEXTURE_H__
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 struct Image;
40 struct ImageUser;
41 struct PreviewImage;
42 struct Gwn_VertBuf;
43
44 struct GPUFrameBuffer;
45 typedef struct GPUTexture GPUTexture;
46
47 /* GPU Texture
48  * - always returns unsigned char RGBA textures
49  * - if texture with non square dimensions is created, depending on the
50  *   graphics card capabilities the texture may actually be stored in a
51  *   larger texture with power of two dimensions.
52  * - can use reference counting:
53  *     - reference counter after GPU_texture_create is 1
54  *     - GPU_texture_ref increases by one
55  *     - GPU_texture_free decreases by one, and frees if 0
56  *  - if created with from_blender, will not free the texture
57  */
58
59 /* Wrapper to supported OpenGL/Vulkan texture internal storage
60  * If you need a type just uncomment it. Be aware that some formats
61  * are not supported by renderbuffers. All of the following formats
62  * are part of the OpenGL 3.3 core
63  * specification. */
64 typedef enum GPUTextureFormat {
65         /* Formats texture & renderbuffer */
66         GPU_RGBA8UI,
67         GPU_RGBA8I,
68         GPU_RGBA8,
69         GPU_RGBA32UI,
70         GPU_RGBA32I,
71         GPU_RGBA32F,
72         GPU_RGBA16UI,
73         GPU_RGBA16I,
74         GPU_RGBA16F,
75         GPU_RGBA16,
76         GPU_RG8UI,
77         GPU_RG8I,
78         GPU_RG8,
79         GPU_RG32UI,
80         GPU_RG32I,
81         GPU_RG32F,
82         GPU_RG16UI,
83         GPU_RG16I,
84         GPU_RG16F,
85         GPU_RG16,
86         GPU_R8UI,
87         GPU_R8I,
88         GPU_R8,
89         GPU_R32UI,
90         GPU_R32I,
91         GPU_R32F,
92         GPU_R16UI,
93         GPU_R16I,
94         GPU_R16F,
95         GPU_R16, /* Max texture buffer format. */
96
97         /* Special formats texture & renderbuffer */
98 #if 0
99         GPU_RGB10_A2,
100         GPU_RGB10_A2UI,
101         GPU_DEPTH32F_STENCIL8,
102 #endif
103         GPU_R11F_G11F_B10F,
104         GPU_DEPTH24_STENCIL8,
105
106         /* Texture only format */
107         GPU_RGB16F,
108 #if 0
109         GPU_RGBA16_SNORM,
110         GPU_RGBA8_SNORM,
111         GPU_RGB32F,
112         GPU_RGB32I,
113         GPU_RGB32UI,
114         GPU_RGB16_SNORM,
115         GPU_RGB16I,
116         GPU_RGB16UI,
117         GPU_RGB16,
118         GPU_RGB8_SNORM,
119         GPU_RGB8,
120         GPU_RGB8I,
121         GPU_RGB8UI,
122         GPU_RG16_SNORM,
123         GPU_RG8_SNORM,
124         GPU_R16_SNORM,
125         GPU_R8_SNORM,
126 #endif
127
128         /* Special formats texture only */
129 #if 0
130         GPU_SRGB8_A8,
131         GPU_SRGB8,
132         GPU_RGB9_E5,
133         GPU_COMPRESSED_RG_RGTC2,
134         GPU_COMPRESSED_SIGNED_RG_RGTC2,
135         GPU_COMPRESSED_RED_RGTC1,
136         GPU_COMPRESSED_SIGNED_RED_RGTC1,
137 #endif
138
139         /* Depth Formats */
140         GPU_DEPTH_COMPONENT32F,
141         GPU_DEPTH_COMPONENT24,
142         GPU_DEPTH_COMPONENT16,
143 } GPUTextureFormat;
144
145 unsigned int GPU_texture_memory_usage_get(void);
146
147 GPUTexture *GPU_texture_create_1D(
148         int w, GPUTextureFormat data_type, const float *pixels, char err_out[256]);
149 GPUTexture *GPU_texture_create_2D(
150         int w, int h, GPUTextureFormat data_type, const float *pixels, char err_out[256]);
151 GPUTexture *GPU_texture_create_2D_multisample(
152         int w, int h, GPUTextureFormat data_type, const float *pixels, int samples, char err_out[256]);
153 GPUTexture *GPU_texture_create_2D_array(
154         int w, int h, int d, GPUTextureFormat data_type, const float *pixels, char err_out[256]);
155 GPUTexture *GPU_texture_create_3D(
156         int w, int h, int d, GPUTextureFormat data_type, const float *pixels, char err_out[256]);
157 GPUTexture *GPU_texture_create_cube(
158         int w, GPUTextureFormat data_type, const float *pixels, char err_out[256]);
159 GPUTexture *GPU_texture_create_from_vertbuf(
160         struct Gwn_VertBuf *vert);
161 GPUTexture *GPU_texture_create_buffer(
162         GPUTextureFormat data_type, const uint buffer);
163
164 GPUTexture *GPU_texture_from_bindcode(int textarget, int bindcode);
165 GPUTexture *GPU_texture_from_blender(
166         struct Image *ima, struct ImageUser *iuser, int textarget, bool is_data, double time, int mipmap);
167 GPUTexture *GPU_texture_from_preview(struct PreviewImage *prv, int mipmap);
168
169 void GPU_texture_update(GPUTexture *tex, const float *pixels);
170
171 void GPU_invalid_tex_init(void);
172 void GPU_invalid_tex_bind(int mode);
173 void GPU_invalid_tex_free(void);
174
175 void GPU_texture_free(GPUTexture *tex);
176
177 void GPU_texture_orphans_init(void);
178 void GPU_texture_orphans_exit(void);
179 /* This has to be called from a thread with an ogl context bound. */
180 void GPU_texture_orphans_delete(void);
181
182 void GPU_texture_ref(GPUTexture *tex);
183 void GPU_texture_bind(GPUTexture *tex, int number);
184 void GPU_texture_unbind(GPUTexture *tex);
185 int GPU_texture_bound_number(GPUTexture *tex);
186
187 void GPU_texture_generate_mipmap(GPUTexture *tex);
188 void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare);
189 void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter);
190 void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter);
191 void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat);
192
193 void GPU_texture_attach_framebuffer(GPUTexture *tex, struct GPUFrameBuffer *fb, int attachment);
194 int GPU_texture_detach_framebuffer(GPUTexture *tex, struct GPUFrameBuffer *fb);
195
196 int GPU_texture_target(const GPUTexture *tex);
197 int GPU_texture_width(const GPUTexture *tex);
198 int GPU_texture_height(const GPUTexture *tex);
199 GPUTextureFormat GPU_texture_format(const GPUTexture *tex);
200 int GPU_texture_samples(const GPUTexture *tex);
201 bool GPU_texture_cube(const GPUTexture *tex);
202 bool GPU_texture_depth(const GPUTexture *tex);
203 bool GPU_texture_stencil(const GPUTexture *tex);
204 bool GPU_texture_integer(const GPUTexture *tex);
205 int GPU_texture_opengl_bindcode(const GPUTexture *tex);
206
207 #ifdef __cplusplus
208 }
209 #endif
210
211 #endif  /* __GPU_TEXTURE_H__ */