Home | History | Annotate | Download | only in state_tracker
      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 (at) 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 VERT_RESULT_x to slot */
    156    GLuint result_to_output[VERT_RESULT_MAX];
    157    ubyte output_semantic_name[VERT_RESULT_MAX];
    158    ubyte output_semantic_index[VERT_RESULT_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 GEOM_ATTRIB_x to a packed TGSI input index */
    202    GLuint input_to_index[GEOM_ATTRIB_MAX];
    203    /** maps a TGSI input index back to a Mesa GEOM_ATTRIB_x */
    204    GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
    205 
    206    GLuint num_inputs;
    207 
    208    GLuint input_to_slot[GEOM_ATTRIB_MAX];  /**< Maps GEOM_ATTRIB_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