2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
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:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
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.
27 * Vertex and fragment program support functions.
33 * \mainpage Mesa vertex and fragment program module
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
43 #include "main/compiler.h"
44 #include "main/mtypes.h"
51 extern struct gl_program _mesa_DummyProgram
;
55 _mesa_init_program(struct gl_context
*ctx
);
58 _mesa_free_program_data(struct gl_context
*ctx
);
61 _mesa_update_default_objects_program(struct gl_context
*ctx
);
64 _mesa_set_program_error(struct gl_context
*ctx
, GLint pos
, const char *string
);
66 extern struct gl_program
*
67 _mesa_init_vertex_program(struct gl_context
*ctx
,
68 struct gl_vertex_program
*prog
,
69 GLenum target
, GLuint id
);
71 extern struct gl_program
*
72 _mesa_init_fragment_program(struct gl_context
*ctx
,
73 struct gl_fragment_program
*prog
,
74 GLenum target
, GLuint id
);
76 extern struct gl_program
*
77 _mesa_init_tess_ctrl_program(struct gl_context
*ctx
,
78 struct gl_tess_ctrl_program
*prog
,
79 GLenum target
, GLuint id
);
81 extern struct gl_program
*
82 _mesa_init_tess_eval_program(struct gl_context
*ctx
,
83 struct gl_tess_eval_program
*prog
,
84 GLenum target
, GLuint id
);
86 extern struct gl_program
*
87 _mesa_init_geometry_program(struct gl_context
*ctx
,
88 struct gl_geometry_program
*prog
,
89 GLenum target
, GLuint id
);
91 extern struct gl_program
*
92 _mesa_init_compute_program(struct gl_context
*ctx
,
93 struct gl_compute_program
*prog
,
94 GLenum target
, GLuint id
);
96 extern struct gl_program
*
97 _mesa_new_program(struct gl_context
*ctx
, GLenum target
, GLuint id
);
100 _mesa_delete_program(struct gl_context
*ctx
, struct gl_program
*prog
);
102 extern struct gl_program
*
103 _mesa_lookup_program(struct gl_context
*ctx
, GLuint id
);
106 _mesa_reference_program_(struct gl_context
*ctx
,
107 struct gl_program
**ptr
,
108 struct gl_program
*prog
);
111 _mesa_reference_program(struct gl_context
*ctx
,
112 struct gl_program
**ptr
,
113 struct gl_program
*prog
)
116 _mesa_reference_program_(ctx
, ptr
, prog
);
120 _mesa_reference_vertprog(struct gl_context
*ctx
,
121 struct gl_vertex_program
**ptr
,
122 struct gl_vertex_program
*prog
)
124 _mesa_reference_program(ctx
, (struct gl_program
**) ptr
,
125 (struct gl_program
*) prog
);
129 _mesa_reference_fragprog(struct gl_context
*ctx
,
130 struct gl_fragment_program
**ptr
,
131 struct gl_fragment_program
*prog
)
133 _mesa_reference_program(ctx
, (struct gl_program
**) ptr
,
134 (struct gl_program
*) prog
);
138 _mesa_reference_geomprog(struct gl_context
*ctx
,
139 struct gl_geometry_program
**ptr
,
140 struct gl_geometry_program
*prog
)
142 _mesa_reference_program(ctx
, (struct gl_program
**) ptr
,
143 (struct gl_program
*) prog
);
147 _mesa_reference_compprog(struct gl_context
*ctx
,
148 struct gl_compute_program
**ptr
,
149 struct gl_compute_program
*prog
)
151 _mesa_reference_program(ctx
, (struct gl_program
**) ptr
,
152 (struct gl_program
*) prog
);
157 _mesa_reference_tesscprog(struct gl_context
*ctx
,
158 struct gl_tess_ctrl_program
**ptr
,
159 struct gl_tess_ctrl_program
*prog
)
161 _mesa_reference_program(ctx
, (struct gl_program
**) ptr
,
162 (struct gl_program
*) prog
);
166 _mesa_reference_tesseprog(struct gl_context
*ctx
,
167 struct gl_tess_eval_program
**ptr
,
168 struct gl_tess_eval_program
*prog
)
170 _mesa_reference_program(ctx
, (struct gl_program
**) ptr
,
171 (struct gl_program
*) prog
);
174 extern struct gl_program
*
175 _mesa_clone_program(struct gl_context
*ctx
, const struct gl_program
*prog
);
177 static inline struct gl_vertex_program
*
178 _mesa_clone_vertex_program(struct gl_context
*ctx
,
179 const struct gl_vertex_program
*prog
)
181 return (struct gl_vertex_program
*) _mesa_clone_program(ctx
, &prog
->Base
);
184 static inline struct gl_tess_ctrl_program
*
185 _mesa_clone_tess_ctrl_program(struct gl_context
*ctx
,
186 const struct gl_tess_ctrl_program
*prog
)
188 return (struct gl_tess_ctrl_program
*) _mesa_clone_program(ctx
, &prog
->Base
);
191 static inline struct gl_tess_eval_program
*
192 _mesa_clone_tess_eval_program(struct gl_context
*ctx
,
193 const struct gl_tess_eval_program
*prog
)
195 return (struct gl_tess_eval_program
*) _mesa_clone_program(ctx
, &prog
->Base
);
198 static inline struct gl_geometry_program
*
199 _mesa_clone_geometry_program(struct gl_context
*ctx
,
200 const struct gl_geometry_program
*prog
)
202 return (struct gl_geometry_program
*) _mesa_clone_program(ctx
, &prog
->Base
);
205 static inline struct gl_fragment_program
*
206 _mesa_clone_fragment_program(struct gl_context
*ctx
,
207 const struct gl_fragment_program
*prog
)
209 return (struct gl_fragment_program
*) _mesa_clone_program(ctx
, &prog
->Base
);
214 _mesa_insert_instructions(struct gl_program
*prog
, GLuint start
, GLuint count
);
217 _mesa_delete_instructions(struct gl_program
*prog
, GLuint start
, GLuint count
);
219 extern struct gl_program
*
220 _mesa_combine_programs(struct gl_context
*ctx
,
221 const struct gl_program
*progA
,
222 const struct gl_program
*progB
);
225 _mesa_find_used_registers(const struct gl_program
*prog
,
226 gl_register_file file
,
227 GLboolean used
[], GLuint usedSize
);
230 _mesa_find_free_register(const GLboolean used
[],
231 GLuint maxRegs
, GLuint firstReg
);
235 _mesa_valid_register_index(const struct gl_context
*ctx
,
236 gl_shader_stage shaderType
,
237 gl_register_file file
, GLint index
);
240 _mesa_postprocess_program(struct gl_context
*ctx
, struct gl_program
*prog
);
243 _mesa_get_min_invocations_per_fragment(struct gl_context
*ctx
,
244 const struct gl_fragment_program
*prog
,
245 bool ignore_sample_qualifier
);
248 _mesa_program_enum_to_shader_stage(GLenum v
)
251 case GL_VERTEX_PROGRAM_ARB
:
252 return MESA_SHADER_VERTEX
;
253 case GL_FRAGMENT_PROGRAM_ARB
:
254 return MESA_SHADER_FRAGMENT
;
255 case GL_GEOMETRY_PROGRAM_NV
:
256 return MESA_SHADER_GEOMETRY
;
257 case GL_TESS_CONTROL_PROGRAM_NV
:
258 return MESA_SHADER_TESS_CTRL
;
259 case GL_TESS_EVALUATION_PROGRAM_NV
:
260 return MESA_SHADER_TESS_EVAL
;
261 case GL_COMPUTE_PROGRAM_NV
:
262 return MESA_SHADER_COMPUTE
;
271 _mesa_shader_stage_to_program(unsigned stage
)
274 case MESA_SHADER_VERTEX
:
275 return GL_VERTEX_PROGRAM_ARB
;
276 case MESA_SHADER_FRAGMENT
:
277 return GL_FRAGMENT_PROGRAM_ARB
;
278 case MESA_SHADER_GEOMETRY
:
279 return GL_GEOMETRY_PROGRAM_NV
;
280 case MESA_SHADER_TESS_CTRL
:
281 return GL_TESS_CONTROL_PROGRAM_NV
;
282 case MESA_SHADER_TESS_EVAL
:
283 return GL_TESS_EVALUATION_PROGRAM_NV
;
284 case MESA_SHADER_COMPUTE
:
285 return GL_COMPUTE_PROGRAM_NV
;
288 assert(!"Unexpected shader stage in _mesa_shader_stage_to_program");
289 return GL_VERTEX_PROGRAM_ARB
;
293 /* Cast wrappers from gl_program to derived program types.
294 * (e.g. gl_vertex_program)
297 static inline struct gl_fragment_program
*
298 gl_fragment_program(struct gl_program
*prog
)
300 return (struct gl_fragment_program
*) prog
;
303 static inline const struct gl_fragment_program
*
304 gl_fragment_program_const(const struct gl_program
*prog
)
306 return (const struct gl_fragment_program
*) prog
;
310 static inline struct gl_vertex_program
*
311 gl_vertex_program(struct gl_program
*prog
)
313 return (struct gl_vertex_program
*) prog
;
316 static inline const struct gl_vertex_program
*
317 gl_vertex_program_const(const struct gl_program
*prog
)
319 return (const struct gl_vertex_program
*) prog
;
323 static inline struct gl_geometry_program
*
324 gl_geometry_program(struct gl_program
*prog
)
326 return (struct gl_geometry_program
*) prog
;
329 static inline const struct gl_geometry_program
*
330 gl_geometry_program_const(const struct gl_program
*prog
)
332 return (const struct gl_geometry_program
*) prog
;
336 static inline struct gl_compute_program
*
337 gl_compute_program(struct gl_program
*prog
)
339 return (struct gl_compute_program
*) prog
;
342 static inline const struct gl_compute_program
*
343 gl_compute_program_const(const struct gl_program
*prog
)
345 return (const struct gl_compute_program
*) prog
;
348 static inline struct gl_tess_ctrl_program
*
349 gl_tess_ctrl_program(struct gl_program
*prog
)
351 return (struct gl_tess_ctrl_program
*) prog
;
354 static inline const struct gl_tess_ctrl_program
*
355 gl_tess_ctrl_program_const(const struct gl_program
*prog
)
357 return (const struct gl_tess_ctrl_program
*) prog
;
361 static inline struct gl_tess_eval_program
*
362 gl_tess_eval_program(struct gl_program
*prog
)
364 return (struct gl_tess_eval_program
*) prog
;
367 static inline const struct gl_tess_eval_program
*
368 gl_tess_eval_program_const(const struct gl_program
*prog
)
370 return (const struct gl_tess_eval_program
*) prog
;
378 #endif /* PROGRAM_H */