glsl: Add GLSL_TYPE_FUNCTION to the base types enums
[mesa.git] / src / mesa / program / program.h
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25 /**
26 * \file program.c
27 * Vertex and fragment program support functions.
28 * \author Brian Paul
29 */
30
31
32 /**
33 * \mainpage Mesa vertex and fragment program module
34 *
35 * This module or directory contains most of the code for vertex and
36 * fragment programs and shaders, including state management, parsers,
37 * and (some) software routines for executing programs
38 */
39
40 #ifndef PROGRAM_H
41 #define PROGRAM_H
42
43 #include "main/compiler.h"
44 #include "main/mtypes.h"
45
46
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50
51 extern struct gl_program _mesa_DummyProgram;
52
53
54 extern void
55 _mesa_init_program(struct gl_context *ctx);
56
57 extern void
58 _mesa_free_program_data(struct gl_context *ctx);
59
60 extern void
61 _mesa_update_default_objects_program(struct gl_context *ctx);
62
63 extern void
64 _mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string);
65
66 extern const GLubyte *
67 _mesa_find_line_column(const GLubyte *string, const GLubyte *pos,
68 GLint *line, GLint *col);
69
70
71 extern struct gl_program *
72 _mesa_init_vertex_program(struct gl_context *ctx,
73 struct gl_vertex_program *prog,
74 GLenum target, GLuint id);
75
76 extern struct gl_program *
77 _mesa_init_fragment_program(struct gl_context *ctx,
78 struct gl_fragment_program *prog,
79 GLenum target, GLuint id);
80
81 extern struct gl_program *
82 _mesa_init_geometry_program(struct gl_context *ctx,
83 struct gl_geometry_program *prog,
84 GLenum target, GLuint id);
85
86 extern struct gl_program *
87 _mesa_init_compute_program(struct gl_context *ctx,
88 struct gl_compute_program *prog,
89 GLenum target, GLuint id);
90
91 extern struct gl_program *
92 _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id);
93
94 extern void
95 _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog);
96
97 extern struct gl_program *
98 _mesa_lookup_program(struct gl_context *ctx, GLuint id);
99
100 extern void
101 _mesa_reference_program_(struct gl_context *ctx,
102 struct gl_program **ptr,
103 struct gl_program *prog);
104
105 static inline void
106 _mesa_reference_program(struct gl_context *ctx,
107 struct gl_program **ptr,
108 struct gl_program *prog)
109 {
110 if (*ptr != prog)
111 _mesa_reference_program_(ctx, ptr, prog);
112 }
113
114 static inline void
115 _mesa_reference_vertprog(struct gl_context *ctx,
116 struct gl_vertex_program **ptr,
117 struct gl_vertex_program *prog)
118 {
119 _mesa_reference_program(ctx, (struct gl_program **) ptr,
120 (struct gl_program *) prog);
121 }
122
123 static inline void
124 _mesa_reference_fragprog(struct gl_context *ctx,
125 struct gl_fragment_program **ptr,
126 struct gl_fragment_program *prog)
127 {
128 _mesa_reference_program(ctx, (struct gl_program **) ptr,
129 (struct gl_program *) prog);
130 }
131
132 static inline void
133 _mesa_reference_geomprog(struct gl_context *ctx,
134 struct gl_geometry_program **ptr,
135 struct gl_geometry_program *prog)
136 {
137 _mesa_reference_program(ctx, (struct gl_program **) ptr,
138 (struct gl_program *) prog);
139 }
140
141 static inline void
142 _mesa_reference_compprog(struct gl_context *ctx,
143 struct gl_compute_program **ptr,
144 struct gl_compute_program *prog)
145 {
146 _mesa_reference_program(ctx, (struct gl_program **) ptr,
147 (struct gl_program *) prog);
148 }
149
150 extern struct gl_program *
151 _mesa_clone_program(struct gl_context *ctx, const struct gl_program *prog);
152
153 static inline struct gl_vertex_program *
154 _mesa_clone_vertex_program(struct gl_context *ctx,
155 const struct gl_vertex_program *prog)
156 {
157 return (struct gl_vertex_program *) _mesa_clone_program(ctx, &prog->Base);
158 }
159
160 static inline struct gl_geometry_program *
161 _mesa_clone_geometry_program(struct gl_context *ctx,
162 const struct gl_geometry_program *prog)
163 {
164 return (struct gl_geometry_program *) _mesa_clone_program(ctx, &prog->Base);
165 }
166
167 static inline struct gl_fragment_program *
168 _mesa_clone_fragment_program(struct gl_context *ctx,
169 const struct gl_fragment_program *prog)
170 {
171 return (struct gl_fragment_program *) _mesa_clone_program(ctx, &prog->Base);
172 }
173
174
175 extern GLboolean
176 _mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count);
177
178 extern GLboolean
179 _mesa_delete_instructions(struct gl_program *prog, GLuint start, GLuint count);
180
181 extern struct gl_program *
182 _mesa_combine_programs(struct gl_context *ctx,
183 const struct gl_program *progA,
184 const struct gl_program *progB);
185
186 extern void
187 _mesa_find_used_registers(const struct gl_program *prog,
188 gl_register_file file,
189 GLboolean used[], GLuint usedSize);
190
191 extern GLint
192 _mesa_find_free_register(const GLboolean used[],
193 GLuint maxRegs, GLuint firstReg);
194
195
196 extern GLboolean
197 _mesa_valid_register_index(const struct gl_context *ctx,
198 gl_shader_stage shaderType,
199 gl_register_file file, GLint index);
200
201 extern void
202 _mesa_postprocess_program(struct gl_context *ctx, struct gl_program *prog);
203
204 extern GLint
205 _mesa_get_min_invocations_per_fragment(struct gl_context *ctx,
206 const struct gl_fragment_program *prog,
207 bool ignore_sample_qualifier);
208
209 static inline GLuint
210 _mesa_program_enum_to_shader_stage(GLenum v)
211 {
212 switch (v) {
213 case GL_VERTEX_PROGRAM_ARB:
214 return MESA_SHADER_VERTEX;
215 case GL_FRAGMENT_PROGRAM_ARB:
216 return MESA_SHADER_FRAGMENT;
217 case GL_GEOMETRY_PROGRAM_NV:
218 return MESA_SHADER_GEOMETRY;
219 case GL_COMPUTE_PROGRAM_NV:
220 return MESA_SHADER_COMPUTE;
221 default:
222 assert(0);
223 return ~0;
224 }
225 }
226
227
228 static inline GLenum
229 _mesa_shader_stage_to_program(unsigned stage)
230 {
231 switch (stage) {
232 case MESA_SHADER_VERTEX:
233 return GL_VERTEX_PROGRAM_ARB;
234 case MESA_SHADER_FRAGMENT:
235 return GL_FRAGMENT_PROGRAM_ARB;
236 case MESA_SHADER_GEOMETRY:
237 return GL_GEOMETRY_PROGRAM_NV;
238 case MESA_SHADER_COMPUTE:
239 return GL_COMPUTE_PROGRAM_NV;
240 }
241
242 assert(!"Unexpected shader stage in _mesa_shader_stage_to_program");
243 return GL_VERTEX_PROGRAM_ARB;
244 }
245
246
247 /* Cast wrappers from gl_program to gl_vertex/geometry/fragment_program */
248
249 static inline struct gl_fragment_program *
250 gl_fragment_program(struct gl_program *prog)
251 {
252 return (struct gl_fragment_program *) prog;
253 }
254
255 static inline const struct gl_fragment_program *
256 gl_fragment_program_const(const struct gl_program *prog)
257 {
258 return (const struct gl_fragment_program *) prog;
259 }
260
261
262 static inline struct gl_vertex_program *
263 gl_vertex_program(struct gl_program *prog)
264 {
265 return (struct gl_vertex_program *) prog;
266 }
267
268 static inline const struct gl_vertex_program *
269 gl_vertex_program_const(const struct gl_program *prog)
270 {
271 return (const struct gl_vertex_program *) prog;
272 }
273
274
275 static inline struct gl_geometry_program *
276 gl_geometry_program(struct gl_program *prog)
277 {
278 return (struct gl_geometry_program *) prog;
279 }
280
281 static inline const struct gl_geometry_program *
282 gl_geometry_program_const(const struct gl_program *prog)
283 {
284 return (const struct gl_geometry_program *) prog;
285 }
286
287
288 static inline struct gl_compute_program *
289 gl_compute_program(struct gl_program *prog)
290 {
291 return (struct gl_compute_program *) prog;
292 }
293
294 static inline const struct gl_compute_program *
295 gl_compute_program_const(const struct gl_program *prog)
296 {
297 return (const struct gl_compute_program *) prog;
298 }
299
300
301 #ifdef __cplusplus
302 } /* extern "C" */
303 #endif
304
305 #endif /* PROGRAM_H */