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