mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
llvmpipe: reduce size of fragment shader variant key
Don't spend as much time comparing them.
This commit is contained in:
parent
49a2ea082b
commit
3d4b60f1f7
2 changed files with 22 additions and 6 deletions
|
|
@ -808,7 +808,7 @@ generate_variant(struct llvmpipe_context *lp,
|
|||
variant->list_item_local.base = variant;
|
||||
variant->no = shader->variants_created++;
|
||||
|
||||
memcpy(&variant->key, key, sizeof *key);
|
||||
memcpy(&variant->key, key, shader->variant_key_size);
|
||||
|
||||
if (gallivm_debug & GALLIVM_DEBUG_IR) {
|
||||
debug_printf("llvmpipe: Creating fragment shader #%u variant #%u:\n",
|
||||
|
|
@ -840,6 +840,7 @@ llvmpipe_create_fs_state(struct pipe_context *pipe,
|
|||
const struct pipe_shader_state *templ)
|
||||
{
|
||||
struct lp_fragment_shader *shader;
|
||||
int nr_samplers;
|
||||
|
||||
shader = CALLOC_STRUCT(lp_fragment_shader);
|
||||
if (!shader)
|
||||
|
|
@ -854,6 +855,11 @@ 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);
|
||||
|
||||
nr_samplers = shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
|
||||
|
||||
shader->variant_key_size = Offset(struct lp_fragment_shader_variant_key,
|
||||
sampler[nr_samplers]);
|
||||
|
||||
if (LP_DEBUG & DEBUG_TGSI) {
|
||||
unsigned attrib;
|
||||
debug_printf("llvmpipe: Create fragment shader #%u %p:\n", shader->no, (void *) shader);
|
||||
|
|
@ -1027,7 +1033,7 @@ make_variant_key(struct llvmpipe_context *lp,
|
|||
{
|
||||
unsigned i;
|
||||
|
||||
memset(key, 0, sizeof *key);
|
||||
memset(key, 0, shader->variant_key_size);
|
||||
|
||||
if (lp->framebuffer.zsbuf) {
|
||||
if (lp->depth_stencil->depth.enabled) {
|
||||
|
|
@ -1097,9 +1103,17 @@ make_variant_key(struct llvmpipe_context *lp,
|
|||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < PIPE_MAX_SAMPLERS; ++i)
|
||||
if(shader->info.file_mask[TGSI_FILE_SAMPLER] & (1 << i))
|
||||
lp_sampler_static_state(&key->sampler[i], lp->fragment_sampler_views[i], lp->sampler[i]);
|
||||
/* This value will be the same for all the variants of a given shader:
|
||||
*/
|
||||
key->nr_samplers = shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
|
||||
|
||||
for(i = 0; i < key->nr_samplers; ++i) {
|
||||
if(shader->info.file_mask[TGSI_FILE_SAMPLER] & (1 << i)) {
|
||||
lp_sampler_static_state(&key->sampler[i],
|
||||
lp->fragment_sampler_views[i],
|
||||
lp->sampler[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1118,7 +1132,7 @@ llvmpipe_update_fs(struct llvmpipe_context *lp)
|
|||
|
||||
li = first_elem(&shader->variants);
|
||||
while(!at_end(&shader->variants, li)) {
|
||||
if(memcmp(&li->base->key, &key, sizeof key) == 0) {
|
||||
if(memcmp(&li->base->key, &key, shader->variant_key_size) == 0) {
|
||||
variant = li->base;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ struct lp_fragment_shader_variant_key
|
|||
struct pipe_blend_state blend;
|
||||
enum pipe_format zsbuf_format;
|
||||
unsigned nr_cbufs:8;
|
||||
unsigned nr_samplers:8; /* actually derivable from just the shader */
|
||||
unsigned flatshade:1;
|
||||
unsigned occlusion_count:1;
|
||||
|
||||
|
|
@ -93,6 +94,7 @@ struct lp_fragment_shader
|
|||
struct lp_fs_variant_list_item variants;
|
||||
|
||||
/* For debugging/profiling purposes */
|
||||
unsigned variant_key_size;
|
||||
unsigned no;
|
||||
unsigned variants_created;
|
||||
unsigned variants_cached;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue