#ifndef LP_RAST_H #define LP_RAST_H /* Initially create and program a single rasterizer directly. Later * will want multiple of these, one or two per core. At that stage * will probably pass command buffers into the rasterizers rather than * individual function calls like this. */ struct lp_rasterizer; struct lp_rast_state { /* State for the shader: */ struct lp_jit_context jc; /* The shader itself. Probably we also need to pass a pointer to * the tile color/z/stencil data somehow: */ void (*run)( struct lp_jit_context *jc, struct quad_header **quads, unsigned nr ); }; /* Coefficients necessary to run the shader at a given location: */ struct lp_rast_shader_inputs { /* Current rasterizer state: */ const struct lp_rast_state *state; /* Attribute interpolation: */ struct tgsi_interp_coef position_coef; struct tgsi_interp_coef *coef; }; /* Rasterization information for a triangle known to be in this bin, * plus inputs to run the shader: */ struct lp_rast_triangle { /* one-pixel sized trivial accept offsets for each plane */ float ei1; float ei2; float ei3; /* one-pixel sized trivial reject offsets for each plane */ float eo1; float eo2; float eo3; /* y deltas for vertex pairs */ float dy12; float dy23; float dy31; /* x deltas for vertex pairs */ float dx12; float dx23; float dx31; /* State to run the shader: */ struct lp_rast_shader_inputs inputs; }; struct lp_rasterizer *lp_rast_create( void ); void lp_rast_bind_surfaces( struct lp_rasterizer *, struct pipe_surface *color, struct pipe_surface *zstencil, const float *clear_color, double clear_depth, unsigned clear_stencil); /* Begining of each tile: */ void lp_rast_start_tile( struct lp_rasterizer *, unsigned x, unsigned y ); union lp_rast_cmd_arg { const struct lp_rast_shader_inputs *shade_tile; const struct lp_rast_triangle *triangle; const struct lp_rast_state *set_state; }; /* Binnable Commands: */ void lp_rast_clear_color( struct lp_rasterizer *, const union lp_rast_cmd_arg *); void lp_rast_clear_zstencil( struct lp_rasterizer *, const union lp_rast_cmd_arg *); void lp_rast_load_color( struct lp_rasterizer *, const union lp_rast_cmd_arg *); void lp_rast_load_zstencil( struct lp_rasterizer *, const union lp_rast_cmd_arg *); void lp_rast_set_state( struct lp_rasterizer *, const union lp_rast_cmd_arg * ); void lp_rast_triangle( struct lp_rasterizer *, const union lp_rast_cmd_arg * ); void lp_rast_shade_tile( struct lp_rasterizer *, const union lp_rast_cmd_arg * ); void lp_rast_store_color( struct lp_rasterizer *, const union lp_rast_cmd_arg *); void lp_rast_store_zstencil( struct lp_rasterizer *, const union lp_rast_cmd_arg *); /* Shutdown: */ void lp_rast_destroy( struct lp_rasterizer * ); #endif