]> git.sesse.net Git - movit/blobdiff - effect_chain.h
Add an effect to do re-slicing of the image, for overlap/discard.
[movit] / effect_chain.h
index db3b87006100b09820687efab1ba0bca6c699484..642f079201f037219b1ead3c02aebf3e85bfb28d 100644 (file)
 
 #include "image_format.h"
 
+namespace movit {
+
 class Effect;
 class Input;
 struct Phase;
+class ResourcePool;
 
 // For internal use within Node.
 enum AlphaType {
@@ -56,9 +59,6 @@ public:
        std::vector<Node *> incoming_links;
 
 private:
-       // Identifier used to create unique variables in GLSL.
-       std::string effect_id;
-
        // Logical size of the output of this effect, ie. the resolution
        // you would get if you sampled it as a texture. If it is undefined
        // (since the inputs differ in resolution), it will be 0x0.
@@ -66,11 +66,9 @@ 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;
 
        // Used during the building of the effect chain.
@@ -83,7 +81,7 @@ private:
 
 // A rendering phase; a single GLSL program rendering a single quad.
 struct Phase {
-       GLint glsl_program_num, vertex_shader, fragment_shader;
+       GLuint glsl_program_num;  // Owned by the resource_pool.
        bool input_needs_mipmaps;
 
        // Inputs are only inputs from other phases (ie., those that come from RTT);
@@ -92,11 +90,21 @@ struct Phase {
 
        std::vector<Node *> effects;  // In order.
        unsigned output_width, output_height, virtual_output_width, virtual_output_height;
+
+       // Identifier used to create unique variables in GLSL.
+       // Unique per-phase to increase cacheability of compiled shaders.
+       std::map<Node *, std::string> effect_ids;
 };
 
 class EffectChain {
 public:
-       EffectChain(float aspect_nom, float aspect_denom);  // E.g., 16.0f, 9.0f for 16:9.
+       // Aspect: e.g. 16.0f, 9.0f for 16:9.
+       // resource_pool is a pointer to a ResourcePool with which to share shaders
+       // and other resources (see resource_pool.h). If NULL (the default),
+       // will create its own that is not shared with anything else. Does not take
+       // ownership of the passed-in ResourcePool, but will naturally take ownership
+       // of its own internal one if created.
+       EffectChain(float aspect_nom, float aspect_denom, ResourcePool *resource_pool = NULL);
        ~EffectChain();
 
        // User API:
@@ -166,6 +174,12 @@ public:
        void replace_sender(Node *new_sender, Node *receiver);
        void insert_node_between(Node *sender, Node *middle, Node *receiver);
 
+       // 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
        // the given input rectangle in both dimensions, and is of the
@@ -249,6 +263,11 @@ private:
 
        unsigned num_dither_bits;
        bool finalized;
+
+       ResourcePool *resource_pool;
+       bool owns_resource_pool;
 };
 
+}  // namespace movit
+
 #endif // !defined(_MOVIT_EFFECT_CHAIN_H)