]> git.sesse.net Git - movit/blobdiff - effect_chain.h
Formalize the notion of messing with sampler state.
[movit] / effect_chain.h
index 6cd689d7c38f0b8386deb007d88ad1449a0f18cf..4417de912f9f979a8308f96e6291246c3c73841c 100644 (file)
@@ -26,6 +26,8 @@
 
 #include "image_format.h"
 
+namespace movit {
+
 class Effect;
 class Input;
 struct Phase;
@@ -64,13 +66,20 @@ private:
        // they will be equal.
        unsigned output_width, output_height;
 
-       // If output goes to RTT (otherwise, none of these are set).
-       // The Phase pointer is a but ugly; we should probably fix so
-       // that Phase takes other phases as inputs, instead of Node.
-       GLuint output_texture;
-       unsigned output_texture_width, output_texture_height;
+       // If output goes to RTT, which phase it is in (otherwise unset).
+       // This is a bit ugly; we should probably fix so that Phase takes other
+       // phases as inputs, instead of Node.
        Phase *phase;
 
+       // If the effect has is_single_texture(), or if the output went to RTT
+       // and that texture has been bound to a sampler, the sampler number
+       // will be stored here.
+       //
+       // TODO: Can an RTT texture be used as inputs to multiple effects
+       // within the same phase? If so, we have a problem with modifying
+       // sampler state here.
+       int bound_sampler_num;
+
        // Used during the building of the effect chain.
        Colorspace output_color_space;
        GammaCurve output_gamma_curve;
@@ -173,6 +182,22 @@ public:
        void replace_receiver(Node *old_receiver, Node *new_receiver);
        void replace_sender(Node *new_sender, Node *receiver);
        void insert_node_between(Node *sender, Node *middle, Node *receiver);
+       Node *find_node_for_effect(Effect *effect) { return node_map[effect]; }
+
+       // Get the OpenGL sampler (GL_TEXTURE0, GL_TEXTURE1, etc.) for the
+       // input of the given node, so that one can modify the sampler state
+       // directly. Only valid to call during set_gl_state().
+       //
+       // Also, for this to be allowed, <node>'s effect must have
+       // needs_texture_bounce() set, so that it samples directly from a
+       // single-sampler input, or from an RTT texture.
+       GLenum get_input_sampler(Node *node, unsigned input_num) const;
+
+       // Get the current resource pool assigned to this EffectChain.
+       // Primarily to let effects allocate textures as needed.
+       // Any resources you get from the pool must be returned to the pool
+       // no later than in the Effect's destructor.
+       ResourcePool *get_resource_pool() { return resource_pool; }
 
 private:
        // Make sure the output rectangle is at least large enough to hold
@@ -262,4 +287,6 @@ private:
        bool owns_resource_pool;
 };
 
+}  // namespace movit
+
 #endif // !defined(_MOVIT_EFFECT_CHAIN_H)