Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  * Version:  6.5.3
  4.  *
  5.  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  21.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  22.  * CONNECTION WITH THE SOFTWARE OR THE USE OR 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. extern struct gl_program _mesa_DummyProgram;
  48.  
  49.  
  50. extern void
  51. _mesa_init_program(struct gl_context *ctx);
  52.  
  53. extern void
  54. _mesa_free_program_data(struct gl_context *ctx);
  55.  
  56. extern void
  57. _mesa_update_default_objects_program(struct gl_context *ctx);
  58.  
  59. extern void
  60. _mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string);
  61.  
  62. extern const GLubyte *
  63. _mesa_find_line_column(const GLubyte *string, const GLubyte *pos,
  64.                        GLint *line, GLint *col);
  65.  
  66.  
  67. extern struct gl_program *
  68. _mesa_init_vertex_program(struct gl_context *ctx,
  69.                           struct gl_vertex_program *prog,
  70.                           GLenum target, GLuint id);
  71.  
  72. extern struct gl_program *
  73. _mesa_init_fragment_program(struct gl_context *ctx,
  74.                             struct gl_fragment_program *prog,
  75.                             GLenum target, GLuint id);
  76.  
  77. extern struct gl_program *
  78. _mesa_init_geometry_program(struct gl_context *ctx,
  79.                             struct gl_geometry_program *prog,
  80.                             GLenum target, GLuint id);
  81.  
  82. extern struct gl_program *
  83. _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id);
  84.  
  85. extern void
  86. _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog);
  87.  
  88. extern struct gl_program *
  89. _mesa_lookup_program(struct gl_context *ctx, GLuint id);
  90.  
  91. extern void
  92. _mesa_reference_program(struct gl_context *ctx,
  93.                         struct gl_program **ptr,
  94.                         struct gl_program *prog);
  95.  
  96. static INLINE void
  97. _mesa_reference_vertprog(struct gl_context *ctx,
  98.                          struct gl_vertex_program **ptr,
  99.                          struct gl_vertex_program *prog)
  100. {
  101.    _mesa_reference_program(ctx, (struct gl_program **) ptr,
  102.                            (struct gl_program *) prog);
  103. }
  104.  
  105. static INLINE void
  106. _mesa_reference_fragprog(struct gl_context *ctx,
  107.                          struct gl_fragment_program **ptr,
  108.                          struct gl_fragment_program *prog)
  109. {
  110.    _mesa_reference_program(ctx, (struct gl_program **) ptr,
  111.                            (struct gl_program *) prog);
  112. }
  113.  
  114. static INLINE void
  115. _mesa_reference_geomprog(struct gl_context *ctx,
  116.                          struct gl_geometry_program **ptr,
  117.                          struct gl_geometry_program *prog)
  118. {
  119.    _mesa_reference_program(ctx, (struct gl_program **) ptr,
  120.                            (struct gl_program *) prog);
  121. }
  122.  
  123. extern struct gl_program *
  124. _mesa_clone_program(struct gl_context *ctx, const struct gl_program *prog);
  125.  
  126. static INLINE struct gl_vertex_program *
  127. _mesa_clone_vertex_program(struct gl_context *ctx,
  128.                            const struct gl_vertex_program *prog)
  129. {
  130.    return (struct gl_vertex_program *) _mesa_clone_program(ctx, &prog->Base);
  131. }
  132.  
  133. static INLINE struct gl_geometry_program *
  134. _mesa_clone_geometry_program(struct gl_context *ctx,
  135.                              const struct gl_geometry_program *prog)
  136. {
  137.    return (struct gl_geometry_program *) _mesa_clone_program(ctx, &prog->Base);
  138. }
  139.  
  140. static INLINE struct gl_fragment_program *
  141. _mesa_clone_fragment_program(struct gl_context *ctx,
  142.                              const struct gl_fragment_program *prog)
  143. {
  144.    return (struct gl_fragment_program *) _mesa_clone_program(ctx, &prog->Base);
  145. }
  146.  
  147.  
  148. extern  GLboolean
  149. _mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count);
  150.  
  151. extern  GLboolean
  152. _mesa_delete_instructions(struct gl_program *prog, GLuint start, GLuint count);
  153.  
  154. extern struct gl_program *
  155. _mesa_combine_programs(struct gl_context *ctx,
  156.                        const struct gl_program *progA,
  157.                        const struct gl_program *progB);
  158.  
  159. extern void
  160. _mesa_find_used_registers(const struct gl_program *prog,
  161.                           gl_register_file file,
  162.                           GLboolean used[], GLuint usedSize);
  163.  
  164. extern GLint
  165. _mesa_find_free_register(const GLboolean used[],
  166.                          GLuint maxRegs, GLuint firstReg);
  167.  
  168.  
  169. extern GLboolean
  170. _mesa_valid_register_index(const struct gl_context *ctx,
  171.                            gl_shader_type shaderType,
  172.                            gl_register_file file, GLint index);
  173.  
  174. extern void
  175. _mesa_postprocess_program(struct gl_context *ctx, struct gl_program *prog);
  176.  
  177. /* keep these in the same order as TGSI_PROCESSOR_* */
  178.  
  179. static INLINE GLuint
  180. _mesa_program_target_to_index(GLenum v)
  181. {
  182.    switch(v)
  183.    {
  184.    case GL_VERTEX_PROGRAM_ARB:
  185.       return MESA_SHADER_VERTEX;
  186.    case GL_FRAGMENT_PROGRAM_ARB:
  187.       return MESA_SHADER_FRAGMENT;
  188.    case GL_GEOMETRY_PROGRAM_NV:
  189.       return MESA_SHADER_GEOMETRY;
  190.    default:
  191.       ASSERT(0);
  192.       return ~0;
  193.    }
  194. }
  195.  
  196. static INLINE GLenum
  197. _mesa_program_index_to_target(GLuint i)
  198. {
  199.    GLenum enums[MESA_SHADER_TYPES] = {
  200.          GL_VERTEX_PROGRAM_ARB,
  201.          GL_FRAGMENT_PROGRAM_ARB,
  202.          GL_GEOMETRY_PROGRAM_NV,
  203.    };
  204.    if(i >= MESA_SHADER_TYPES)
  205.       return 0;
  206.    else
  207.       return enums[i];
  208. }
  209.  
  210. #endif /* PROGRAM_H */
  211.