1 #ifndef LP_STATE_SETUP_H
2 #define LP_STATE_SETUP_H
4 #include "lp_bld_interp.h"
7 struct llvmpipe_context
;
8 struct lp_setup_variant
;
10 struct lp_setup_variant_list_item
12 struct lp_setup_variant
*base
;
13 struct lp_setup_variant_list_item
*next
, *prev
;
17 struct lp_setup_variant_key
{
19 unsigned num_inputs
:8;
20 unsigned color_slot
:8;
21 unsigned bcolor_slot
:8;
23 unsigned bspec_slot
:8;
24 unsigned flatshade_first
:1;
25 unsigned pixel_center_half
:1;
27 unsigned floating_point_depth
:1;
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
];
38 typedef void (*lp_jit_setup_triangle
)( const float (*v0
)[4],
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
55 struct lp_setup_variant
{
56 struct lp_setup_variant_key key
;
58 struct lp_setup_variant_list_item list_item_global
;
60 struct gallivm_state
*gallivm
;
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
67 LLVMValueRef function
;
69 /* The actual generated setup function:
71 lp_jit_setup_triangle jit_function
;
76 void lp_delete_setup_variants(struct llvmpipe_context
*lp
);
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]);