Home | History | Annotate | Download | only in llvmpipe
      1 #ifndef LP_STATE_SETUP_H
      2 #define LP_STATE_SETUP_H
      3 
      4 #include "lp_bld_interp.h"
      5 
      6 
      7 struct llvmpipe_context;
      8 struct lp_setup_variant;
      9 
     10 struct lp_setup_variant_list_item
     11 {
     12    struct lp_setup_variant *base;
     13    struct lp_setup_variant_list_item *next, *prev;
     14 };
     15 
     16 
     17 struct lp_setup_variant_key {
     18    unsigned size:16;
     19    unsigned num_inputs:8;
     20    int color_slot:8;
     21    int bcolor_slot:8;
     22    int spec_slot:8;
     23    int bspec_slot:8;
     24    unsigned flatshade_first:1;
     25    unsigned pixel_center_half:1;
     26    unsigned twoside:1;
     27    unsigned floating_point_depth:1;
     28    unsigned pad:4;
     29 
     30    /* TODO: get those floats out of the key and use a jit_context for setup */
     31    float pgon_offset_units;
     32    float pgon_offset_scale;
     33    float pgon_offset_clamp;
     34    struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS];
     35 };
     36 
     37 
     38 typedef void (*lp_jit_setup_triangle)( const float (*v0)[4],
     39 				       const float (*v1)[4],
     40 				       const float (*v2)[4],
     41 				       boolean front_facing,
     42 				       float (*a0)[4],
     43 				       float (*dadx)[4],
     44 				       float (*dady)[4] );
     45 
     46 
     47 
     48 
     49 /* At this stage, for a given variant key, we create a
     50  * draw_vertex_info struct telling the draw module how to format the
     51  * vertices, and an llvm-generated function which calculates the
     52  * attribute interpolants (a0, dadx, dady) from three of those
     53  * vertices.
     54  */
     55 struct lp_setup_variant {
     56    struct lp_setup_variant_key key;
     57 
     58    struct lp_setup_variant_list_item list_item_global;
     59 
     60    struct gallivm_state *gallivm;
     61 
     62    /* XXX: this is a pointer to the LLVM IR.  Once jit_function is
     63     * generated, we never need to use the IR again - need to find a
     64     * way to release this data without destroying the generated
     65     * assembly.
     66     */
     67    LLVMValueRef function;
     68 
     69    /* The actual generated setup function:
     70     */
     71    lp_jit_setup_triangle jit_function;
     72 
     73    unsigned no;
     74 };
     75 
     76 void lp_delete_setup_variants(struct llvmpipe_context *lp);
     77 
     78 void
     79 lp_dump_setup_coef( const struct lp_setup_variant_key *key,
     80 		    const float (*sa0)[4],
     81 		    const float (*sdadx)[4],
     82 		    const float (*sdady)[4]);
     83 
     84 #endif
     85