llvmpipe: add reference counting to fragment shaders.
[mesa.git] / src / gallium / drivers / llvmpipe / lp_state_fs.h
index 555bacff4ec60793a6bfdc17eb7ffbc25560758e..4dd48db356e75cb3517e580dc8e83d1e47ed22c5 100644 (file)
@@ -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_ */