mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-02 10:08:08 +02:00
llvmpipe: Allocate the blend color from the data store, and ensure it's aligned.
This commit is contained in:
parent
269342d916
commit
f2be08ae0e
2 changed files with 50 additions and 12 deletions
|
|
@ -105,6 +105,7 @@ static void reset_context( struct setup_context *setup )
|
|||
pipe_buffer_reference(&setup->constants.current, NULL);
|
||||
setup->constants.stored_size = 0;
|
||||
setup->constants.stored_data = NULL;
|
||||
setup->dirty = ~0;
|
||||
|
||||
/* Free all but last binner command lists:
|
||||
*/
|
||||
|
|
@ -453,20 +454,14 @@ void
|
|||
lp_setup_set_blend_color( struct setup_context *setup,
|
||||
const struct pipe_blend_color *blend_color )
|
||||
{
|
||||
unsigned i, j;
|
||||
|
||||
SETUP_DEBUG("%s\n", __FUNCTION__);
|
||||
|
||||
if(!setup->fs.current.jit_context.blend_color)
|
||||
setup->fs.current.jit_context.blend_color = align_malloc(4 * 16, 16);
|
||||
assert(blend_color);
|
||||
|
||||
for (i = 0; i < 4; ++i) {
|
||||
uint8_t c = float_to_ubyte(blend_color->color[i]);
|
||||
for (j = 0; j < 16; ++j)
|
||||
setup->fs.current.jit_context.blend_color[i*4 + j] = c;
|
||||
if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) {
|
||||
memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color);
|
||||
setup->dirty |= LP_SETUP_NEW_BLEND_COLOR;
|
||||
}
|
||||
|
||||
setup->dirty |= LP_SETUP_NEW_FS;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -522,6 +517,25 @@ lp_setup_update_shader_state( struct setup_context *setup )
|
|||
|
||||
assert(setup->fs.current.jit_function);
|
||||
|
||||
if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) {
|
||||
uint8_t *stored;
|
||||
unsigned i, j;
|
||||
|
||||
stored = get_data_aligned(&setup->data, 4 * 16, 16);
|
||||
|
||||
for (i = 0; i < 4; ++i) {
|
||||
uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]);
|
||||
for (j = 0; j < 16; ++j)
|
||||
stored[i*4 + j] = c;
|
||||
}
|
||||
|
||||
setup->blend_color.stored = stored;
|
||||
|
||||
setup->fs.current.jit_context.blend_color = setup->blend_color.stored;
|
||||
setup->dirty |= LP_SETUP_NEW_FS;
|
||||
}
|
||||
|
||||
|
||||
if(setup->dirty & LP_SETUP_NEW_CONSTANTS) {
|
||||
struct pipe_buffer *buffer = setup->constants.current;
|
||||
|
||||
|
|
|
|||
|
|
@ -43,8 +43,9 @@
|
|||
#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_FS 0x01
|
||||
#define LP_SETUP_NEW_CONSTANTS 0x02
|
||||
#define LP_SETUP_NEW_BLEND_COLOR 0x04
|
||||
|
||||
|
||||
/* switch to a non-pointer value for this:
|
||||
|
|
@ -124,6 +125,11 @@ struct setup_context {
|
|||
const void *stored_data;
|
||||
} constants;
|
||||
|
||||
struct {
|
||||
struct pipe_blend_color current;
|
||||
uint8_t *stored;
|
||||
} blend_color;
|
||||
|
||||
unsigned dirty;
|
||||
|
||||
void (*point)( struct setup_context *,
|
||||
|
|
@ -163,6 +169,24 @@ static INLINE void *get_data( struct data_block_list *list,
|
|||
}
|
||||
}
|
||||
|
||||
static INLINE void *get_data_aligned( struct data_block_list *list,
|
||||
unsigned size,
|
||||
unsigned alignment )
|
||||
{
|
||||
|
||||
if (list->tail->used + size + alignment - 1 > DATA_BLOCK_SIZE) {
|
||||
lp_setup_new_data_block( list );
|
||||
}
|
||||
|
||||
{
|
||||
struct data_block *tail = list->tail;
|
||||
ubyte *data = tail->data + tail->used;
|
||||
unsigned offset = (((uintptr_t)data + alignment - 1) & ~(alignment - 1)) - (uintptr_t)data;
|
||||
tail->used += offset + size;
|
||||
return data + offset;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add a command to a given bin.
|
||||
*/
|
||||
static INLINE void bin_command( struct cmd_block_list *list,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue