X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fllvmpipe%2Flp_scene.h;h=622c522f11a01bc72ae84e55a37078b57b255b49;hb=437ab1d6df7282770ee869180446db36c2dbdfa8;hp=fff849fe5180b5d7356c164d29edb2f5a832eec5;hpb=3ad3cbfb120efa74e77f838d9fd3f1212dd0e47b;p=mesa.git diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h index fff849fe518..622c522f11a 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.h +++ b/src/gallium/drivers/llvmpipe/lp_scene.h @@ -41,6 +41,7 @@ #include "lp_debug.h" struct lp_scene_queue; +struct lp_rast_state; /* We're limited to 2K by 2K for 32bit fixed point rasterization. * Will need a 64-bit version for larger framebuffers. @@ -50,7 +51,7 @@ struct lp_scene_queue; #define CMD_BLOCK_MAX 128 -#define DATA_BLOCK_SIZE (64 * 1024 - 2 * sizeof(void *)) +#define DATA_BLOCK_SIZE (64 * 1024) /* Scene temporary storage is clamped to this size: */ @@ -94,6 +95,7 @@ struct data_block { struct cmd_bin { ushort x; ushort y; + const struct lp_rast_state *last_state; /* most recent state set in bin */ struct cmd_block *head; struct cmd_block *tail; }; @@ -207,7 +209,7 @@ lp_scene_alloc( struct lp_scene *scene, unsigned size) assert(block != NULL); if (LP_DEBUG & DEBUG_MEM) - debug_printf("alloc %u block %u/%lu tot %u/%u\n", + debug_printf("alloc %u block %u/%u tot %u/%u\n", size, block->used, DATA_BLOCK_SIZE, scene->scene_size, LP_SCENE_MAX_SIZE); @@ -240,7 +242,7 @@ lp_scene_alloc_aligned( struct lp_scene *scene, unsigned size, assert(block != NULL); if (LP_DEBUG & DEBUG_MEM) - debug_printf("alloc %u block %u/%lu tot %u/%u\n", + debug_printf("alloc %u block %u/%u tot %u/%u\n", size + alignment - 1, block->used, DATA_BLOCK_SIZE, scene->scene_size, LP_SCENE_MAX_SIZE); @@ -297,7 +299,7 @@ lp_scene_bin_command( struct lp_scene *scene, assert(x < scene->tiles_x); assert(y < scene->tiles_y); - assert(cmd <= LP_RAST_OP_END_QUERY); + assert(cmd < LP_RAST_OP_MAX); if (tail == NULL || tail->count == CMD_BLOCK_MAX) { tail = lp_scene_new_cmd_block( scene, bin ); @@ -318,6 +320,30 @@ lp_scene_bin_command( struct lp_scene *scene, } +static INLINE boolean +lp_scene_bin_cmd_with_state( struct lp_scene *scene, + unsigned x, unsigned y, + const struct lp_rast_state *state, + unsigned cmd, + union lp_rast_cmd_arg arg ) +{ + struct cmd_bin *bin = lp_scene_get_bin(scene, x, y); + + if (state != bin->last_state) { + bin->last_state = state; + if (!lp_scene_bin_command(scene, x, y, + LP_RAST_OP_SET_STATE, + lp_rast_arg_state(state))) + return FALSE; + } + + if (!lp_scene_bin_command( scene, x, y, cmd, arg )) + return FALSE; + + return TRUE; +} + + /* Add a command to all active bins. */ static INLINE boolean