Bicubic bump map filtering.
[blender.git] / source / blender / gpu / GPU_extensions.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_extensions.h
29  *  \ingroup gpu
30  */
31
32 #ifndef GPU_EXTENSIONS_H
33 #define GPU_EXTENSIONS_H
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 struct Image;
40 struct ImageUser;
41
42 struct GPUTexture;
43 typedef struct GPUTexture GPUTexture;
44
45 struct GPUFrameBuffer;
46 typedef struct GPUFrameBuffer GPUFrameBuffer;
47
48 struct GPUOffScreen;
49 typedef struct GPUOffScreen GPUOffScreen;
50
51 struct GPUShader;
52 typedef struct GPUShader GPUShader;
53
54 /* GPU extensions support */
55
56 void GPU_extensions_disable(void);
57 void GPU_extensions_init(void); /* call this before running any of the functions below */
58 void GPU_extensions_exit(void);
59 int GPU_print_error(const char *str);
60
61 int GPU_glsl_support(void);
62 int GPU_non_power_of_two_support(void);
63 int GPU_color_depth(void);
64 void GPU_code_generate_glsl_lib(void);
65 int GPU_bicubic_bump_support(void);
66
67 /* GPU Types */
68
69 typedef enum GPUDeviceType {
70         GPU_DEVICE_NVIDIA =             (1<<0),
71         GPU_DEVICE_ATI =                (1<<1),
72         GPU_DEVICE_INTEL =              (1<<2),
73         GPU_DEVICE_SOFTWARE =   (1<<3),
74         GPU_DEVICE_UNKNOWN =    (1<<4),
75         GPU_DEVICE_ANY =                (0xff)
76 } GPUDeviceType;
77
78 typedef enum GPUOSType {
79         GPU_OS_WIN =                    (1<<8),
80         GPU_OS_MAC =                    (1<<9),
81         GPU_OS_UNIX =                   (1<<10),
82         GPU_OS_ANY =                    (0xff00)
83 } GPUOSType;
84
85 typedef enum GPUDriverType {
86         GPU_DRIVER_OFFICIAL =   (1<<16),
87         GPU_DRIVER_OPENSOURCE = (1<<17),
88         GPU_DRIVER_SOFTWARE =   (1<<18),
89         GPU_DRIVER_ANY =                (0xff0000)
90 } GPUDriverType;
91
92 int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver);
93
94 /* GPU Texture
95    - always returns unsigned char RGBA textures
96    - if texture with non square dimensions is created, depending on the
97          graphics card capabilities the texture may actually be stored in a
98          larger texture with power of two dimensions. the actual dimensions
99          may be queried with GPU_texture_opengl_width/height. GPU_texture_coord_2f
100          calls glTexCoord2f with the coordinates adjusted for this.
101    - can use reference counting:
102            - reference counter after GPU_texture_create is 1
103            - GPU_texture_ref increases by one
104            - GPU_texture_free decreases by one, and frees if 0
105         - if created with from_blender, will not free the texture
106 */
107
108 GPUTexture *GPU_texture_create_1D(int w, float *pixels, char err_out[256]);
109 GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels, char err_out[256]);
110 GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels);
111 GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256]);
112 GPUTexture *GPU_texture_from_blender(struct Image *ima,
113         struct ImageUser *iuser, double time, int mipmap);
114 void GPU_texture_free(GPUTexture *tex);
115
116 void GPU_texture_ref(GPUTexture *tex);
117
118 void GPU_texture_bind(GPUTexture *tex, int number);
119 void GPU_texture_unbind(GPUTexture *tex);
120
121 GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex);
122
123 int GPU_texture_target(GPUTexture *tex);
124 int GPU_texture_opengl_width(GPUTexture *tex);
125 int GPU_texture_opengl_height(GPUTexture *tex);
126 int GPU_texture_opengl_bindcode(GPUTexture *tex);
127
128 /* GPU Framebuffer
129    - this is a wrapper for an OpenGL framebuffer object (FBO). in practice
130          multiple FBO's may be created, to get around limitations on the number
131          of attached textures and the dimension requirements.
132    - after any of the GPU_framebuffer_* functions, GPU_framebuffer_restore must
133          be called before rendering to the window framebuffer again */
134
135 GPUFrameBuffer *GPU_framebuffer_create(void);
136 int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char err_out[256]);
137 void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex);
138 void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex, int w, int h);
139 void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex);
140 void GPU_framebuffer_free(GPUFrameBuffer *fb);
141
142 void GPU_framebuffer_restore(void);
143
144 /* GPU OffScreen
145    - wrapper around framebuffer and texture for simple offscreen drawing 
146    - changes size if graphics card can't support it */
147
148 GPUOffScreen *GPU_offscreen_create(int width, int height, char err_out[256]);
149 void GPU_offscreen_free(GPUOffScreen *ofs);
150 void GPU_offscreen_bind(GPUOffScreen *ofs);
151 void GPU_offscreen_unbind(GPUOffScreen *ofs);
152 void GPU_offscreen_read_pixels(GPUOffScreen *ofs, int type, void *pixels);
153
154 /* GPU Shader
155    - only for fragment shaders now
156    - must call texture bind before setting a texture as uniform! */
157
158 GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *libcode); /*GPUShader *lib);*/
159 /*GPUShader *GPU_shader_create_lib(const char *code);*/
160 void GPU_shader_free(GPUShader *shader);
161
162 void GPU_shader_bind(GPUShader *shader);
163 void GPU_shader_unbind(GPUShader *shader);
164
165 int GPU_shader_get_uniform(GPUShader *shader, const char *name);
166 void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
167         int arraysize, float *value);
168 void GPU_shader_uniform_texture(GPUShader *shader, int location, GPUTexture *tex);
169
170 int GPU_shader_get_attribute(GPUShader *shader, char *name);
171
172 /* Vertex attributes for shaders */
173
174 #define GPU_MAX_ATTRIB          32
175
176 typedef struct GPUVertexAttribs {
177         struct {
178                 int type;
179                 int glindex;
180                 int gltexco;
181                 int attribid;
182                 char name[32];
183         } layer[GPU_MAX_ATTRIB];
184
185         int totlayer;
186 } GPUVertexAttribs;
187
188 #ifdef __cplusplus
189 }
190 #endif
191
192 #endif
193