llvmpipe,draw,gallivm: Ensure we don't walk beyond the end of the shader variant list.
u_simple_list.h uses a sentinel element, and not a NULL element. So ensure list is not empty when reducing the list of shader variants. Something I noticed while trying to free variants more aggressively. Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
24e6484909
commit
f32c7232a8
|
@ -160,8 +160,13 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
|
|||
* XXX: should we flush here ?
|
||||
*/
|
||||
for (i = 0; i < DRAW_MAX_SHADER_VARIANTS / 4; i++) {
|
||||
struct draw_llvm_variant_list_item *item =
|
||||
last_elem(&fpme->llvm->vs_variants_list);
|
||||
struct draw_llvm_variant_list_item *item;
|
||||
if (is_empty_list(&fpme->llvm->vs_variants_list)) {
|
||||
break;
|
||||
}
|
||||
item = last_elem(&fpme->llvm->vs_variants_list);
|
||||
assert(item);
|
||||
assert(item->base);
|
||||
draw_llvm_destroy_variant(item->base);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1373,10 +1373,12 @@ llvmpipe_update_fs(struct llvmpipe_context *lp)
|
|||
if (lp->nr_fs_variants >= LP_MAX_SHADER_VARIANTS) {
|
||||
for (i = 0; i < LP_MAX_SHADER_VARIANTS / 4; i++) {
|
||||
struct lp_fs_variant_list_item *item;
|
||||
item = last_elem(&lp->fs_variants_list);
|
||||
if (!item) {
|
||||
if (is_empty_list(&lp->fs_variants_list)) {
|
||||
break;
|
||||
}
|
||||
item = last_elem(&lp->fs_variants_list);
|
||||
assert(item);
|
||||
assert(item->base);
|
||||
llvmpipe_remove_shader_variant(lp, item->base);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -837,7 +837,13 @@ cull_setup_variants(struct llvmpipe_context *lp)
|
|||
llvmpipe_finish(pipe, __FUNCTION__);
|
||||
|
||||
for (i = 0; i < LP_MAX_SETUP_VARIANTS / 4; i++) {
|
||||
struct lp_setup_variant_list_item *item = last_elem(&lp->setup_variants_list);
|
||||
struct lp_setup_variant_list_item *item;
|
||||
if (is_empty_list(&lp->setup_variants_list)) {
|
||||
break;
|
||||
}
|
||||
item = last_elem(&lp->setup_variants_list);
|
||||
assert(item);
|
||||
assert(item->base);
|
||||
remove_setup_variant(lp, item->base);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue