X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fllvmpipe%2Flp_setup_context.h;h=102361cca341b7c58b3c7b03e10170eacae013d7;hb=d808f7b53ec71a7684bac7e6b536911fc27d5238;hp=b29fec8ef059811337c5658864fee1cc8ea8c432;hpb=4cdd10cb4b60d85f6c231a26739f7d5e264a05e5;p=mesa.git diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h index b29fec8ef05..102361cca34 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_context.h +++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h @@ -25,148 +25,149 @@ * **************************************************************************/ + +/** + * The setup code is concerned with point/line/triangle setup and + * putting commands/data into the bins. + */ + + #ifndef LP_SETUP_CONTEXT_H #define LP_SETUP_CONTEXT_H #include "lp_setup.h" #include "lp_rast.h" +#include "lp_tile_soa.h" /* for TILE_SIZE */ +#include "lp_scene.h" -/* We're limited to 2K by 2K for 32bit fixed point rasterization. - * Will need a 64-bit version for larger framebuffers. - */ -#define MAXHEIGHT 2048 -#define MAXWIDTH 2048 -#define TILES_X (MAXWIDTH / TILESIZE) -#define TILES_Y (MAXHEIGHT / TILESIZE) +#include "draw/draw_vbuf.h" -#define CMD_BLOCK_MAX 128 -#define DATA_BLOCK_SIZE (16 * 1024 - sizeof(unsigned) - sizeof(void *)) - +#define LP_SETUP_NEW_FS 0x01 +#define LP_SETUP_NEW_CONSTANTS 0x02 +#define LP_SETUP_NEW_BLEND_COLOR 0x04 +#define LP_SETUP_NEW_SCISSOR 0x08 -/* switch to a non-pointer value for this: - */ -typedef void (*lp_rast_cmd)( struct lp_rasterizer *, const union lp_rast_cmd_arg ); -struct cmd_block { - lp_rast_cmd cmd[CMD_BLOCK_MAX]; - union lp_rast_cmd_arg arg[CMD_BLOCK_MAX]; - unsigned count; - struct cmd_block *next; -}; +struct lp_scene_queue; -struct data_block { - ubyte data[DATA_BLOCK_SIZE]; - unsigned used; - struct data_block *next; -}; -struct cmd_block_list { - struct cmd_block *head; - struct cmd_block *tail; -}; +/** Max number of scenes */ +#define MAX_SCENES 2 + -struct data_block_list { - struct data_block *head; - struct data_block *tail; -}; - -struct setup_context { +/** + * Point/line/triangle setup context. + * Note: "stored" below indicates data which is stored in the bins, + * not arbitrary malloc'd memory. + * + * + * Subclass of vbuf_render, plugged directly into the draw module as + * the rendering backend. + */ +struct lp_setup_context +{ + struct vbuf_render base; - struct lp_rasterizer *rast; + struct vertex_info *vertex_info; + uint prim; + uint vertex_size; + uint nr_vertices; + uint vertex_buffer_size; + void *vertex_buffer; - /* When there are multiple threads, will want to double-buffer the - * bin arrays: + /* Final pipeline stage for draw module. Draw module should + * create/install this itself now. */ - struct cmd_block_list tile[TILES_X][TILES_Y]; - struct data_block_list data; + struct draw_stage *vbuf; + unsigned num_threads; + struct lp_scene *scenes[MAX_SCENES]; /**< all the scenes */ + struct lp_scene *scene; /**< current scene being built */ + struct lp_scene_queue *empty_scenes; /**< queue of empty scenes */ - unsigned tiles_x; - unsigned tiles_y; - + boolean flatshade_first; boolean ccw_is_frontface; + boolean scissor_test; unsigned cullmode; + float pixel_offset; - struct { - struct pipe_surface *cbuf; - struct pipe_surface *zsbuf; - unsigned width; - unsigned height; - } fb; + struct pipe_framebuffer_state fb; struct { unsigned flags; - union lp_rast_cmd_arg color; - union lp_rast_cmd_arg zstencil; + union lp_rast_cmd_arg color; /**< lp_rast_clear_color() cmd */ + struct lp_rast_clearzs clearzs; /**< lp_rast_clear_zstencil() cmd */ } clear; - enum { - SETUP_FLUSHED, - SETUP_CLEARED, - SETUP_ACTIVE + enum setup_state { + SETUP_FLUSHED, /**< scene is null */ + SETUP_EMPTY, /**< scene exists but has only state changes */ + SETUP_CLEARED, /**< scene exists but has only clears */ + SETUP_ACTIVE /**< scene exists and has at least one draw/query */ } state; struct { struct lp_shader_input input[PIPE_MAX_ATTRIBS]; unsigned nr_inputs; + + const struct lp_rast_state *stored; /**< what's in the scene */ + struct lp_rast_state current; /**< currently set state */ + struct pipe_resource *current_tex[PIPE_MAX_SAMPLERS]; } fs; - void (*point)( struct setup_context *, + /** fragment shader constants */ + struct { + struct pipe_resource *current; + unsigned stored_size; + const void *stored_data; + } constants; + + struct { + struct pipe_blend_color current; + uint8_t *stored; + } blend_color; + + struct { + struct pipe_scissor_state current; + } scissor; + + unsigned dirty; /**< bitmask of LP_SETUP_NEW_x bits */ + + void (*point)( struct lp_setup_context *, const float (*v0)[4]); - void (*line)( struct setup_context *, + void (*line)( struct lp_setup_context *, const float (*v0)[4], const float (*v1)[4]); - void (*triangle)( struct setup_context *, + void (*triangle)( struct lp_setup_context *, const float (*v0)[4], const float (*v1)[4], const float (*v2)[4]); }; -void lp_setup_choose_triangle( struct setup_context *setup ); -void lp_setup_choose_line( struct setup_context *setup ); -void lp_setup_choose_point( struct setup_context *setup ); - - -void lp_setup_new_data_block( struct data_block_list *list ); -void lp_setup_new_cmd_block( struct cmd_block_list *list ); - -static INLINE void *get_data( struct data_block_list *list, - unsigned size) -{ +void lp_setup_choose_triangle( struct lp_setup_context *setup ); +void lp_setup_choose_line( struct lp_setup_context *setup ); +void lp_setup_choose_point( struct lp_setup_context *setup ); - if (list->tail->used + size > DATA_BLOCK_SIZE) { - lp_setup_new_data_block( list ); - } +struct lp_scene *lp_setup_get_current_scene(struct lp_setup_context *setup); - { - struct data_block *tail = list->tail; - ubyte *data = tail->data + tail->used; - tail->used += size; - return data; - } -} +void lp_setup_init_vbuf(struct lp_setup_context *setup); -/* Add a command to a given bin. - */ -static INLINE void bin_command( struct cmd_block_list *list, - lp_rast_cmd cmd, - union lp_rast_cmd_arg arg ) -{ - if (list->tail->count == CMD_BLOCK_MAX) { - lp_setup_new_cmd_block( list ); - } +void lp_setup_update_state( struct lp_setup_context *setup ); - { - struct cmd_block *tail = list->tail; - unsigned i = tail->count; - tail->cmd[i] = cmd; - tail->arg[i] = arg; - tail->count++; - } -} +void lp_setup_destroy( struct lp_setup_context *setup ); +void +lp_setup_print_triangle(struct lp_setup_context *setup, + const float (*v0)[4], + const float (*v1)[4], + const float (*v2)[4]); +void +lp_setup_print_vertex(struct lp_setup_context *setup, + const char *name, + const float (*v)[4]); #endif +