X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fllvmpipe%2Flp_state_fs.h;h=4dd48db356e75cb3517e580dc8e83d1e47ed22c5;hb=99330e50c9e08532f5d9c3568be938c7e9d8fd93;hp=555bacff4ec60793a6bfdc17eb7ffbc25560758e;hpb=8a83db420401fd3a29cae7a8b6a49b67fd2ddf58;p=mesa.git diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h index 555bacff4ec..4dd48db356e 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.h +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h @@ -36,7 +36,7 @@ #include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */ #include "gallivm/lp_bld_tgsi.h" /* for lp_tgsi_info */ #include "lp_bld_interp.h" /* for struct lp_shader_input */ - +#include "util/u_inlines.h" struct tgsi_token; struct lp_fragment_shader; @@ -128,7 +128,7 @@ struct lp_fs_variant_list_item struct lp_fragment_shader_variant { - + struct pipe_reference reference; boolean opaque; struct gallivm_state *gallivm; @@ -160,6 +160,7 @@ struct lp_fragment_shader { struct pipe_shader_state base; + struct pipe_reference reference; struct lp_tgsi_info info; struct lp_fs_variant_list_item variants; @@ -180,4 +181,36 @@ struct lp_fragment_shader void lp_debug_fs_variant(struct lp_fragment_shader_variant *variant); +void +llvmpipe_destroy_fs(struct llvmpipe_context *llvmpipe, + struct lp_fragment_shader *shader); + +static inline void +lp_fs_reference(struct llvmpipe_context *llvmpipe, + struct lp_fragment_shader **ptr, + struct lp_fragment_shader *shader) +{ + struct lp_fragment_shader *old_ptr = *ptr; + if (pipe_reference(old_ptr ? &(*ptr)->reference : NULL, shader ? &shader->reference : NULL)) { + llvmpipe_destroy_fs(llvmpipe, old_ptr); + } + *ptr = shader; +} + +void +llvmpipe_destroy_shader_variant(struct llvmpipe_context *lp, + struct lp_fragment_shader_variant *variant); + +static inline void +lp_fs_variant_reference(struct llvmpipe_context *llvmpipe, + struct lp_fragment_shader_variant **ptr, + struct lp_fragment_shader_variant *variant) +{ + struct lp_fragment_shader_variant *old_ptr = *ptr; + if (pipe_reference(old_ptr ? &(*ptr)->reference : NULL, variant ? &variant->reference : NULL)) { + llvmpipe_destroy_shader_variant(llvmpipe, old_ptr); + } + *ptr = variant; +} + #endif /* LP_STATE_FS_H_ */