add option WITH_BUILTIN_GLEW, so linux packagers can disable to use their own glew...
[blender.git] / source / blender / gpu / GPU_extensions.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This shader is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This shader is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this shader; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22  *
23  * The Original Code is Copyright (C) 2005 Blender Foundation.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): Brecht Van Lommel.
29  *
30  * ***** END GPL LICENSE BLOCK *****
31  */
32
33 /** \file GPU_extensions.h
34  *  \ingroup gpu
35  */
36
37 #ifndef GPU_EXTENSIONS_H
38 #define GPU_EXTENSIONS_H
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 struct Image;
45 struct ImageUser;
46
47 struct GPUTexture;
48 typedef struct GPUTexture GPUTexture;
49
50 struct GPUFrameBuffer;
51 typedef struct GPUFrameBuffer GPUFrameBuffer;
52
53 struct GPUOffScreen;
54 typedef struct GPUOffScreen GPUOffScreen;
55
56 struct GPUShader;
57 typedef struct GPUShader GPUShader;
58
59 /* GPU extensions support */
60
61 void GPU_extensions_disable(void);
62 void GPU_extensions_init(void); /* call this before running any of the functions below */
63 void GPU_extensions_exit(void);
64 int GPU_print_error(const char *str);
65
66 int GPU_glsl_support(void);
67 int GPU_non_power_of_two_support(void);
68 int GPU_color_depth(void);
69
70 /* GPU Types */
71
72 typedef enum GPUDeviceType {
73         GPU_DEVICE_NVIDIA =             (1<<0),
74         GPU_DEVICE_ATI =                (1<<1),
75         GPU_DEVICE_INTEL =              (1<<2),
76         GPU_DEVICE_SOFTWARE =   (1<<3),
77         GPU_DEVICE_UNKNOWN =    (1<<4),
78         GPU_DEVICE_ANY =                (0xff)
79 } GPUDeviceType;
80
81 typedef enum GPUOSType {
82         GPU_OS_WIN =                    (1<<8),
83         GPU_OS_MAC =                    (1<<9),
84         GPU_OS_UNIX =                   (1<<10),
85         GPU_OS_ANY =                    (0xff00)
86 } GPUOSType;
87
88 typedef enum GPUDriverType {
89         GPU_DRIVER_OFFICIAL =   (1<<16),
90         GPU_DRIVER_OPENSOURCE = (1<<17),
91         GPU_DRIVER_SOFTWARE =   (1<<18),
92         GPU_DRIVER_ANY =                (0xff0000)
93 } GPUDriverType;
94
95 int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver);
96
97 /* GPU Texture
98    - always returns unsigned char RGBA textures
99    - if texture with non square dimensions is created, depending on the
100          graphics card capabilities the texture may actually be stored in a
101          larger texture with power of two dimensions. the actual dimensions
102          may be queried with GPU_texture_opengl_width/height. GPU_texture_coord_2f
103          calls glTexCoord2f with the coordinates adjusted for this.
104    - can use reference counting:
105            - reference counter after GPU_texture_create is 1
106            - GPU_texture_ref increases by one
107            - GPU_texture_free decreases by one, and frees if 0
108         - if created with from_blender, will not free the texture
109 */
110
111 GPUTexture *GPU_texture_create_1D(int w, float *pixels, char err_out[256]);
112 GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels, char err_out[256]);
113 GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels);
114 GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256]);
115 GPUTexture *GPU_texture_from_blender(struct Image *ima,
116         struct ImageUser *iuser, double time, int mipmap);
117 void GPU_texture_free(GPUTexture *tex);
118
119 void GPU_texture_ref(GPUTexture *tex);
120
121 void GPU_texture_bind(GPUTexture *tex, int number);
122 void GPU_texture_unbind(GPUTexture *tex);
123
124 GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex);
125
126 int GPU_texture_target(GPUTexture *tex);
127 int GPU_texture_opengl_width(GPUTexture *tex);
128 int GPU_texture_opengl_height(GPUTexture *tex);
129
130 /* GPU Framebuffer
131    - this is a wrapper for an OpenGL framebuffer object (FBO). in practice
132          multiple FBO's may be created, to get around limitations on the number
133          of attached textures and the dimension requirements.
134    - after any of the GPU_framebuffer_* functions, GPU_framebuffer_restore must
135          be called before rendering to the window framebuffer again */
136
137 GPUFrameBuffer *GPU_framebuffer_create(void);
138 int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char err_out[256]);
139 void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex);
140 void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex);
141 void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex);
142 void GPU_framebuffer_free(GPUFrameBuffer *fb);
143
144 void GPU_framebuffer_restore(void);
145
146 /* GPU OffScreen
147    - wrapper around framebuffer and texture for simple offscreen drawing 
148    - changes size if graphics card can't support it */
149
150 GPUOffScreen *GPU_offscreen_create(int *width, int *height, char err_out[256]);
151 void GPU_offscreen_free(GPUOffScreen *ofs);
152 void GPU_offscreen_bind(GPUOffScreen *ofs);
153 void GPU_offscreen_unbind(GPUOffScreen *ofs);
154
155 /* GPU Shader
156    - only for fragment shaders now
157    - must call texture bind before setting a texture as uniform! */
158
159 GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *libcode); /*GPUShader *lib);*/
160 /*GPUShader *GPU_shader_create_lib(const char *code);*/
161 void GPU_shader_free(GPUShader *shader);
162
163 void GPU_shader_bind(GPUShader *shader);
164 void GPU_shader_unbind(GPUShader *shader);
165
166 int GPU_shader_get_uniform(GPUShader *shader, const char *name);
167 void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
168         int arraysize, float *value);
169 void GPU_shader_uniform_texture(GPUShader *shader, int location, GPUTexture *tex);
170
171 int GPU_shader_get_attribute(GPUShader *shader, char *name);
172
173 /* Vertex attributes for shaders */
174
175 #define GPU_MAX_ATTRIB          32
176
177 typedef struct GPUVertexAttribs {
178         struct {
179                 int type;
180                 int glindex;
181                 char name[32];
182         } layer[GPU_MAX_ATTRIB];
183
184         int totlayer;
185 } GPUVertexAttribs;
186
187 #ifdef __cplusplus
188 }
189 #endif
190
191 #endif
192