0,0 → 1,85 |
#ifndef LP_STATE_SETUP_H |
#define LP_STATE_SETUP_H |
|
#include "lp_bld_interp.h" |
|
|
struct llvmpipe_context; |
struct lp_setup_variant; |
|
struct lp_setup_variant_list_item |
{ |
struct lp_setup_variant *base; |
struct lp_setup_variant_list_item *next, *prev; |
}; |
|
|
struct lp_setup_variant_key { |
unsigned size:16; |
unsigned num_inputs:8; |
int color_slot:8; |
|
int bcolor_slot:8; |
int spec_slot:8; |
int bspec_slot:8; |
unsigned flatshade_first:1; |
unsigned pixel_center_half:1; |
unsigned twoside:1; |
unsigned floating_point_depth:1; |
unsigned pad:4; |
|
/* TODO: get those floats out of the key and use a jit_context for setup */ |
float pgon_offset_units; |
float pgon_offset_scale; |
float pgon_offset_clamp; |
struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS]; |
}; |
|
|
typedef void (*lp_jit_setup_triangle)( const float (*v0)[4], |
const float (*v1)[4], |
const float (*v2)[4], |
boolean front_facing, |
float (*a0)[4], |
float (*dadx)[4], |
float (*dady)[4] ); |
|
|
|
|
/* At this stage, for a given variant key, we create a |
* draw_vertex_info struct telling the draw module how to format the |
* vertices, and an llvm-generated function which calculates the |
* attribute interpolants (a0, dadx, dady) from three of those |
* vertices. |
*/ |
struct lp_setup_variant { |
struct lp_setup_variant_key key; |
|
struct lp_setup_variant_list_item list_item_global; |
|
struct gallivm_state *gallivm; |
|
/* XXX: this is a pointer to the LLVM IR. Once jit_function is |
* generated, we never need to use the IR again - need to find a |
* way to release this data without destroying the generated |
* assembly. |
*/ |
LLVMValueRef function; |
|
/* The actual generated setup function: |
*/ |
lp_jit_setup_triangle jit_function; |
|
unsigned no; |
}; |
|
void lp_delete_setup_variants(struct llvmpipe_context *lp); |
|
void |
lp_dump_setup_coef( const struct lp_setup_variant_key *key, |
const float (*sa0)[4], |
const float (*sdadx)[4], |
const float (*sdady)[4]); |
|
#endif |