#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;
struct lp_fragment_shader_variant
{
-
+ struct pipe_reference reference;
boolean opaque;
struct gallivm_state *gallivm;
{
struct pipe_shader_state base;
+ struct pipe_reference reference;
struct lp_tgsi_info info;
struct lp_fs_variant_list_item variants;
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_ */