llvmpipe: maintain fragment shader state for draw module
This commit is contained in:
@@ -886,6 +886,7 @@ static void *
|
||||
llvmpipe_create_fs_state(struct pipe_context *pipe,
|
||||
const struct pipe_shader_state *templ)
|
||||
{
|
||||
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
|
||||
struct lp_fragment_shader *shader;
|
||||
int nr_samplers;
|
||||
|
||||
@@ -902,6 +903,12 @@ llvmpipe_create_fs_state(struct pipe_context *pipe,
|
||||
/* we need to keep a local copy of the tokens */
|
||||
shader->base.tokens = tgsi_dup_tokens(templ->tokens);
|
||||
|
||||
shader->draw_data = draw_create_fragment_shader(llvmpipe->draw, templ);
|
||||
if (shader->draw_data == NULL) {
|
||||
FREE((void *) shader->base.tokens);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nr_samplers = shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
|
||||
|
||||
shader->variant_key_size = Offset(struct lp_fragment_shader_variant_key,
|
||||
@@ -938,6 +945,9 @@ llvmpipe_bind_fs_state(struct pipe_context *pipe, void *fs)
|
||||
|
||||
draw_flush(llvmpipe->draw);
|
||||
|
||||
draw_bind_fragment_shader(llvmpipe->draw,
|
||||
(llvmpipe->fs ? llvmpipe->fs->draw_data : NULL));
|
||||
|
||||
llvmpipe->fs = fs;
|
||||
|
||||
llvmpipe->dirty |= LP_NEW_FS;
|
||||
@@ -995,6 +1005,8 @@ llvmpipe_delete_fs_state(struct pipe_context *pipe, void *fs)
|
||||
li = next;
|
||||
}
|
||||
|
||||
draw_delete_fragment_shader(llvmpipe->draw, shader->draw_data);
|
||||
|
||||
assert(shader->variants_cached == 0);
|
||||
FREE((void *) shader->base.tokens);
|
||||
FREE(shader);
|
||||
|
||||
@@ -100,6 +100,8 @@ struct lp_fragment_shader
|
||||
|
||||
struct lp_fs_variant_list_item variants;
|
||||
|
||||
struct draw_fragment_shader *draw_data;
|
||||
|
||||
/* For debugging/profiling purposes */
|
||||
unsigned variant_key_size;
|
||||
unsigned no;
|
||||
|
||||
Reference in New Issue
Block a user