Merge branch 'master' into blender2.8
[blender.git] / source / blender / gpu / GPU_shader.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_shader.h
29  *  \ingroup gpu
30  */
31
32 #ifndef __GPU_SHADER_H__
33 #define __GPU_SHADER_H__
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 typedef struct GPUShader GPUShader;
40 struct GPUTexture;
41 struct GPUUniformBuffer;
42
43 /* GPU Shader
44  * - only for fragment shaders now
45  * - must call texture bind before setting a texture as uniform! */
46
47 enum {
48         GPU_SHADER_FLAGS_NONE = 0,
49         GPU_SHADER_FLAGS_SPECIAL_OPENSUBDIV = (1 << 0),
50         GPU_SHADER_FLAGS_NEW_SHADING        = (1 << 1),
51 };
52
53 GPUShader *GPU_shader_create(
54         const char *vertexcode,
55         const char *fragcode,
56         const char *geocode,
57         const char *libcode,
58         const char *defines);
59 GPUShader *GPU_shader_create_ex(
60         const char *vertexcode,
61         const char *fragcode,
62         const char *geocode,
63         const char *libcode,
64         const char *defines,
65         const int flags);
66 void GPU_shader_free(GPUShader *shader);
67
68 void GPU_shader_bind(GPUShader *shader);
69 void GPU_shader_unbind(void);
70
71 int GPU_shader_get_program(GPUShader *shader);
72
73 void *GPU_shader_get_interface(GPUShader *shader);
74
75 int GPU_shader_get_uniform(GPUShader *shader, const char *name);
76 int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin);
77 int GPU_shader_get_uniform_block(GPUShader *shader, const char *name);
78 void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
79         int arraysize, const float *value);
80 void GPU_shader_uniform_vector_int(GPUShader *shader, int location, int length,
81         int arraysize, const int *value);
82
83 void GPU_shader_uniform_buffer(GPUShader *shader, int location, struct GPUUniformBuffer *ubo);
84 void GPU_shader_uniform_texture(GPUShader *shader, int location, struct GPUTexture *tex);
85 void GPU_shader_uniform_int(GPUShader *shader, int location, int value);
86 void GPU_shader_geometry_stage_primitive_io(GPUShader *shader, int input, int output, int number);
87
88 int GPU_shader_get_attribute(GPUShader *shader, const char *name);
89
90 /* Builtin/Non-generated shaders */
91 typedef enum GPUBuiltinShader {
92         GPU_SHADER_VSM_STORE,
93         GPU_SHADER_SEP_GAUSSIAN_BLUR,
94         GPU_SHADER_SMOKE,
95         GPU_SHADER_SMOKE_FIRE,
96         GPU_SHADER_SMOKE_COBA,
97
98         /* specialized drawing */
99         GPU_SHADER_TEXT,
100         GPU_SHADER_TEXT_SIMPLE,
101         GPU_SHADER_EDGES_FRONT_BACK_PERSP,
102         GPU_SHADER_EDGES_FRONT_BACK_ORTHO,
103         GPU_SHADER_EDGES_OVERLAY_SIMPLE,
104         GPU_SHADER_EDGES_OVERLAY,
105         GPU_SHADER_KEYFRAME_DIAMOND,
106         GPU_SHADER_SIMPLE_LIGHTING,
107         GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR,
108         GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR,
109         GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA,
110         /* for simple 2D drawing */
111         GPU_SHADER_2D_UNIFORM_COLOR,
112         GPU_SHADER_2D_FLAT_COLOR,
113         GPU_SHADER_2D_SMOOTH_COLOR,
114         GPU_SHADER_2D_SMOOTH_COLOR_DITHER,
115         GPU_SHADER_2D_IMAGE,
116         GPU_SHADER_2D_IMAGE_COLOR,
117         GPU_SHADER_2D_IMAGE_DESATURATE_COLOR,
118         GPU_SHADER_2D_IMAGE_ALPHA_COLOR,
119         GPU_SHADER_2D_IMAGE_ALPHA,
120         GPU_SHADER_2D_IMAGE_RECT_COLOR,
121         GPU_SHADER_2D_IMAGE_MULTI_RECT_COLOR,
122         GPU_SHADER_2D_IMAGE_MULTISAMPLE_2,
123         GPU_SHADER_2D_IMAGE_MULTISAMPLE_4,
124         GPU_SHADER_2D_IMAGE_MULTISAMPLE_8,
125         GPU_SHADER_2D_IMAGE_MULTISAMPLE_16,
126         GPU_SHADER_2D_CHECKER,
127         GPU_SHADER_2D_DIAG_STRIPES,
128         /* for simple 3D drawing */
129         GPU_SHADER_3D_UNIFORM_COLOR,
130         GPU_SHADER_3D_UNIFORM_COLOR_U32,
131         GPU_SHADER_3D_UNIFORM_COLOR_INSTANCE,
132         GPU_SHADER_3D_FLAT_COLOR,
133         GPU_SHADER_3D_FLAT_COLOR_U32,  /* use for select-id's */
134         GPU_SHADER_3D_SMOOTH_COLOR,
135         GPU_SHADER_3D_DEPTH_ONLY,
136         GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR,
137         /* basic image drawing */
138         GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB,
139         GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR,
140         GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR,
141         GPU_SHADER_3D_IMAGE_MODULATE_ALPHA,
142         GPU_SHADER_3D_IMAGE_DEPTH,
143         GPU_SHADER_3D_IMAGE_DEPTH_COPY,
144         /* stereo 3d */
145         GPU_SHADER_2D_IMAGE_INTERLACE,
146         /* points */
147         GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR,
148         GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA,
149         GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA,
150         GPU_SHADER_2D_POINT_UNIFORM_SIZE_VARYING_COLOR_OUTLINE_AA,
151         GPU_SHADER_2D_POINT_VARYING_SIZE_VARYING_COLOR,
152         GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR,
153         GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR,
154         GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA,
155         GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA,
156         GPU_SHADER_3D_POINT_VARYING_SIZE_UNIFORM_COLOR,
157         GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR,
158         /* lines */
159         GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR,
160         GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR,
161         /* lamp drawing */
162         GPU_SHADER_3D_GROUNDPOINT,
163         GPU_SHADER_3D_GROUNDLINE,
164         GPU_SHADER_3D_SCREENSPACE_VARIYING_COLOR,
165         /* bone drawing */
166         GPU_SHADER_3D_OBJECTSPACE_VARIYING_COLOR,
167         GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR,
168         /* camera drawing */
169         GPU_SHADER_CAMERA,
170         /* distance in front of objects */
171         GPU_SHADER_DISTANCE_LINES,
172         /* axis name */
173         GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS,
174         GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED,
175         /* instance */
176         GPU_SHADER_INSTANCE_UNIFORM_COLOR,
177         GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE, /* Uniformly scaled */
178         GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE, /* Uniformly scaled */
179         GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE,
180         GPU_SHADER_INSTANCE_EDGES_VARIYING_COLOR,
181         /* specialized for UI drawing */
182         GPU_SHADER_2D_WIDGET_BASE,
183         GPU_SHADER_2D_WIDGET_BASE_INST,
184         GPU_SHADER_2D_WIDGET_SHADOW,
185         GPU_SHADER_2D_NODELINK,
186         GPU_SHADER_2D_NODELINK_INST,
187
188         GPU_NUM_BUILTIN_SHADERS /* (not an actual shader) */
189 } GPUBuiltinShader;
190
191 /* Keep these in sync with:
192  *  gpu_shader_image_interlace_frag.glsl
193  *  gpu_shader_image_rect_interlace_frag.glsl
194  **/
195 typedef enum GPUInterlaceShader {
196         GPU_SHADER_INTERLACE_ROW               = 0,
197         GPU_SHADER_INTERLACE_COLUMN            = 1,
198         GPU_SHADER_INTERLACE_CHECKER           = 2,
199 } GPUInterlaceShader;
200
201 GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);
202
203 void GPU_shader_free_builtin_shaders(void);
204
205 /* Vertex attributes for shaders */
206
207 #define GPU_MAX_ATTRIB 32
208
209 typedef struct GPUVertexAttribs {
210         struct {
211                 int type;
212                 int glindex;
213                 int glinfoindoex;
214                 int gltexco;
215                 int attribid;
216                 char name[64];  /* MAX_CUSTOMDATA_LAYER_NAME */
217         } layer[GPU_MAX_ATTRIB];
218
219         int totlayer;
220 } GPUVertexAttribs;
221
222 #ifdef __cplusplus
223 }
224 #endif
225
226 #endif  /* __GPU_SHADER_H__ */