Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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 */
  306.