Subversion Repositories Kolibri OS

Rev

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

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
  4.  * 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
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28.  /*
  29.   * Authors:
  30.   *   Keith Whitwell <keith@tungstengraphics.com>
  31.   */
  32.    
  33.  
  34. #ifndef ST_PROGRAM_H
  35. #define ST_PROGRAM_H
  36.  
  37. #include "main/mtypes.h"
  38. #include "program/program.h"
  39. #include "pipe/p_state.h"
  40. #include "st_context.h"
  41. #include "st_glsl_to_tgsi.h"
  42.  
  43.  
  44. /** Fragment program variant key */
  45. struct st_fp_variant_key
  46. {
  47.    struct st_context *st;         /**< variants are per-context */
  48.  
  49.    /** for glBitmap */
  50.    GLuint bitmap:1;               /**< glBitmap variant? */
  51.  
  52.    /** for glDrawPixels */
  53.    GLuint drawpixels:1;           /**< glDrawPixels variant */
  54.    GLuint scaleAndBias:1;         /**< glDrawPixels w/ scale and/or bias? */
  55.    GLuint pixelMaps:1;            /**< glDrawPixels w/ pixel lookup map? */
  56.    GLuint drawpixels_z:1;         /**< glDrawPixels(GL_DEPTH) */
  57.    GLuint drawpixels_stencil:1;   /**< glDrawPixels(GL_STENCIL) */
  58.  
  59.    /** for ARB_color_buffer_float */
  60.    GLuint clamp_color:1;
  61. };
  62.  
  63.  
  64. /**
  65.  * Variant of a fragment program.
  66.  */
  67. struct st_fp_variant
  68. {
  69.    /** Parameters which generated this version of fragment program */
  70.    struct st_fp_variant_key key;
  71.  
  72.    struct pipe_shader_state tgsi;
  73.  
  74.    /** Driver's compiled shader */
  75.    void *driver_shader;
  76.  
  77.    /** For glBitmap variants */
  78.    struct gl_program_parameter_list *parameters;
  79.    uint bitmap_sampler;
  80.  
  81.    /** next in linked list */
  82.    struct st_fp_variant *next;
  83. };
  84.  
  85.  
  86. /**
  87.  * Derived from Mesa gl_fragment_program:
  88.  */
  89. struct st_fragment_program
  90. {
  91.    struct gl_fragment_program Base;
  92.    struct glsl_to_tgsi_visitor* glsl_to_tgsi;
  93.  
  94.    struct st_fp_variant *variants;
  95. };
  96.  
  97.  
  98.  
  99. /** Vertex program variant key */
  100. struct st_vp_variant_key
  101. {
  102.    struct st_context *st;          /**< variants are per-context */
  103.    boolean passthrough_edgeflags;
  104.  
  105.    /** for ARB_color_buffer_float */
  106.    boolean clamp_color;
  107. };
  108.  
  109.  
  110. /**
  111.  * This represents a vertex program, especially translated to match
  112.  * the inputs of a particular fragment shader.
  113.  */
  114. struct st_vp_variant
  115. {
  116.    /* Parameters which generated this translated version of a vertex
  117.     * shader:
  118.     */
  119.    struct st_vp_variant_key key;
  120.  
  121.    /**
  122.     * TGSI tokens (to later generate a 'draw' module shader for
  123.     * selection/feedback/rasterpos)
  124.     */
  125.    struct pipe_shader_state tgsi;
  126.  
  127.    /** Driver's compiled shader */
  128.    void *driver_shader;
  129.  
  130.    /** For using our private draw module (glRasterPos) */
  131.    struct draw_vertex_shader *draw_shader;
  132.  
  133.    /** Next in linked list */
  134.    struct st_vp_variant *next;  
  135.  
  136.    /** similar to that in st_vertex_program, but with edgeflags info too */
  137.    GLuint num_inputs;
  138. };
  139.  
  140.  
  141. /**
  142.  * Derived from Mesa gl_fragment_program:
  143.  */
  144. struct st_vertex_program
  145. {
  146.    struct gl_vertex_program Base;  /**< The Mesa vertex program */
  147.    struct glsl_to_tgsi_visitor* glsl_to_tgsi;
  148.  
  149.    /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */
  150.    GLuint input_to_index[VERT_ATTRIB_MAX];
  151.    /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */
  152.    GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
  153.    GLuint num_inputs;
  154.  
  155.    /** Maps VARYING_SLOT_x to slot */
  156.    GLuint result_to_output[VARYING_SLOT_MAX];
  157.    ubyte output_semantic_name[VARYING_SLOT_MAX];
  158.    ubyte output_semantic_index[VARYING_SLOT_MAX];
  159.    GLuint num_outputs;
  160.  
  161.    /** List of translated variants of this vertex program.
  162.     */
  163.    struct st_vp_variant *variants;
  164. };
  165.  
  166.  
  167.  
  168. /** Geometry program variant key */
  169. struct st_gp_variant_key
  170. {
  171.    struct st_context *st;          /**< variants are per-context */
  172.    /* no other fields yet */
  173. };
  174.  
  175.  
  176. /**
  177.  * Geometry program variant.
  178.  */
  179. struct st_gp_variant
  180. {
  181.    /* Parameters which generated this translated version of a vertex */
  182.    struct st_gp_variant_key key;
  183.  
  184.    void *driver_shader;
  185.  
  186.    struct st_gp_variant *next;
  187. };
  188.  
  189.  
  190. /**
  191.  * Derived from Mesa gl_geometry_program:
  192.  */
  193. struct st_geometry_program
  194. {
  195.    struct gl_geometry_program Base;  /**< The Mesa geometry program */
  196.    struct glsl_to_tgsi_visitor* glsl_to_tgsi;
  197.  
  198.    /** map GP input back to VP output */
  199.    GLuint input_map[PIPE_MAX_SHADER_INPUTS];
  200.  
  201.    /** maps a Mesa VARYING_SLOT_x to a packed TGSI input index */
  202.    GLuint input_to_index[VARYING_SLOT_MAX];
  203.    /** maps a TGSI input index back to a Mesa VARYING_SLOT_x */
  204.    GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
  205.  
  206.    GLuint num_inputs;
  207.  
  208.    GLuint input_to_slot[VARYING_SLOT_MAX];  /**< Maps VARYING_SLOT_x to slot */
  209.    GLuint num_input_slots;
  210.  
  211.    ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
  212.    ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
  213.  
  214.    struct pipe_shader_state tgsi;
  215.  
  216.    struct st_gp_variant *variants;
  217. };
  218.  
  219.  
  220.  
  221. static INLINE struct st_fragment_program *
  222. st_fragment_program( struct gl_fragment_program *fp )
  223. {
  224.    return (struct st_fragment_program *)fp;
  225. }
  226.  
  227.  
  228. static INLINE struct st_vertex_program *
  229. st_vertex_program( struct gl_vertex_program *vp )
  230. {
  231.    return (struct st_vertex_program *)vp;
  232. }
  233.  
  234. static INLINE struct st_geometry_program *
  235. st_geometry_program( struct gl_geometry_program *gp )
  236. {
  237.    return (struct st_geometry_program *)gp;
  238. }
  239.  
  240. static INLINE void
  241. st_reference_vertprog(struct st_context *st,
  242.                       struct st_vertex_program **ptr,
  243.                       struct st_vertex_program *prog)
  244. {
  245.    _mesa_reference_program(st->ctx,
  246.                            (struct gl_program **) ptr,
  247.                            (struct gl_program *) prog);
  248. }
  249.  
  250. static INLINE void
  251. st_reference_geomprog(struct st_context *st,
  252.                       struct st_geometry_program **ptr,
  253.                       struct st_geometry_program *prog)
  254. {
  255.    _mesa_reference_program(st->ctx,
  256.                            (struct gl_program **) ptr,
  257.                            (struct gl_program *) prog);
  258. }
  259.  
  260. static INLINE void
  261. st_reference_fragprog(struct st_context *st,
  262.                       struct st_fragment_program **ptr,
  263.                       struct st_fragment_program *prog)
  264. {
  265.    _mesa_reference_program(st->ctx,
  266.                            (struct gl_program **) ptr,
  267.                            (struct gl_program *) prog);
  268. }
  269.  
  270.  
  271. extern struct st_vp_variant *
  272. st_get_vp_variant(struct st_context *st,
  273.                   struct st_vertex_program *stvp,
  274.                   const struct st_vp_variant_key *key);
  275.  
  276.  
  277. extern struct st_fp_variant *
  278. st_get_fp_variant(struct st_context *st,
  279.                   struct st_fragment_program *stfp,
  280.                   const struct st_fp_variant_key *key);
  281.  
  282.  
  283. extern struct st_gp_variant *
  284. st_get_gp_variant(struct st_context *st,
  285.                   struct st_geometry_program *stgp,
  286.                   const struct st_gp_variant_key *key);
  287.  
  288.  
  289. extern void
  290. st_prepare_vertex_program(struct gl_context *ctx,
  291.                           struct st_vertex_program *stvp);
  292.  
  293. extern GLboolean
  294. st_prepare_fragment_program(struct gl_context *ctx,
  295.                             struct st_fragment_program *stfp);
  296.  
  297.  
  298. extern void
  299. st_release_vp_variants( struct st_context *st,
  300.                         struct st_vertex_program *stvp );
  301.  
  302. extern void
  303. st_release_fp_variants( struct st_context *st,
  304.                         struct st_fragment_program *stfp );
  305.  
  306. extern void
  307. st_release_gp_variants(struct st_context *st,
  308.                        struct st_geometry_program *stgp);
  309.  
  310.  
  311. extern void
  312. st_print_shaders(struct gl_context *ctx);
  313.  
  314. extern void
  315. st_destroy_program_variants(struct st_context *st);
  316.  
  317.  
  318. extern void
  319. st_print_current_vertex_program(void);
  320.  
  321.  
  322. #endif
  323.