]> git.sesse.net Git - movit/blobdiff - effect_chain.h
Make effect_id phase-local instead of global.
[movit] / effect_chain.h
index 2199a5d8b28d56a1a0fe54c85cc2ae9505ede61d..6cd689d7c38f0b8386deb007d88ad1449a0f18cf 100644 (file)
@@ -1,5 +1,21 @@
-#ifndef _EFFECT_CHAIN_H
-#define _EFFECT_CHAIN_H 1
+#ifndef _MOVIT_EFFECT_CHAIN_H
+#define _MOVIT_EFFECT_CHAIN_H 1
+
+// An EffectChain is the largest basic entity in Movit; it contains everything
+// needed to connects a series of effects, from inputs to outputs, and render
+// them. Generally you set up your effect chain once and then call its render
+// functions once per frame; setting one up can be relatively expensive,
+// but rendering is fast.
+//
+// Threading considerations: EffectChain is “thread-compatible”; you can use
+// different EffectChains in multiple threads at the same time (assuming the
+// threads do not use the same OpenGL context, but this is a good idea anyway),
+// but you may not use one EffectChain from multiple threads simultaneously.
+// You _are_ allowed to use one EffectChain from multiple threads as long as
+// you only use it from one at a time (possibly by doing your own locking),
+// but if so, the threads' contexts need to be set up to share resources, since
+// the EffectChain holds textures and other OpenGL objects that are tied to the
+// context.
 
 #include <GL/glew.h>
 #include <stdio.h>
 #include <string>
 #include <vector>
 
-#include "effect.h"
 #include "image_format.h"
-#include "input.h"
 
 class Effect;
-class EffectChain;
 class Input;
 struct Phase;
+class ResourcePool;
 
 // For internal use within Node.
 enum AlphaType {
@@ -43,9 +57,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.
@@ -70,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);
@@ -79,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:
@@ -232,12 +253,13 @@ private:
        Effect *dither_effect;
 
        std::vector<Input *> inputs;  // Also contained in nodes.
-
-       GLuint fbo;
        std::vector<Phase *> phases;
 
        unsigned num_dither_bits;
        bool finalized;
+
+       ResourcePool *resource_pool;
+       bool owns_resource_pool;
 };
 
-#endif // !defined(_EFFECT_CHAIN_H)
+#endif // !defined(_MOVIT_EFFECT_CHAIN_H)