]> git.sesse.net Git - movit/blobdiff - effect_chain.h
Add ycbcr.h to HDRS.
[movit] / effect_chain.h
index 1ecee63d660cbac4d2565e846c908cc26efad0b0..358deedbb5e34064e4d2c52119db4c4c30413dca 100644 (file)
 // 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.
+//
+// Memory management (only relevant if you use multiple contexts):
+// See corresponding comment in resource_pool.h. This holds even if you don't
+// allocate your own ResourcePool, but let EffectChain hold its own.
 
 #include <epoxy/gl.h>
 #include <stdio.h>
@@ -79,6 +83,7 @@ private:
        Colorspace output_color_space;
        GammaCurve output_gamma_curve;
        AlphaType output_alpha_type;
+       bool needs_mipmaps;  // Directly or indirectly.
 
        friend class EffectChain;
 };
@@ -99,13 +104,6 @@ struct Phase {
        // Identifier used to create unique variables in GLSL.
        // Unique per-phase to increase cacheability of compiled shaders.
        std::map<Node *, std::string> effect_ids;
-
-       // The geometry needed to draw this quad, bound to the vertex array
-       // object. (Seemingly it's actually a win not to upload geometry every
-       // frame, even for something as small as a quad, due to fewer state
-       // changes.)
-       GLuint vao;
-       GLuint position_vbo, texcoord_vbo;
 };
 
 class EffectChain {
@@ -235,6 +233,13 @@ private:
        // as the last effect. Also pushes all phases in order onto <phases>.
        Phase *construct_phase(Node *output, std::map<Node *, Phase *> *completed_effects);
 
+       // Execute one phase, ie. set up all inputs, effects and outputs, and render the quad.
+       void execute_phase(Phase *phase, bool last_phase, std::map<Phase *, GLuint> *output_textures, std::set<Phase *> *generated_mipmaps);
+
+       // Set up the given sampler number for sampling from an RTT texture,
+       // and bind it to "tex_" plus the given GLSL variable.
+       void setup_rtt_sampler(GLuint glsl_program_num, int sampler_num, const std::string &effect_id, bool use_mipmaps);
+
        // Output the current graph to the given file in a Graphviz-compatible format;
        // only useful for debugging.
        void output_dot(const char *filename);
@@ -287,7 +292,6 @@ private:
        std::map<Effect *, Node *> node_map;
        Effect *dither_effect;
 
-       std::map<void *, GLuint> fbos;  // One for each OpenGL context.
        std::vector<Input *> inputs;  // Also contained in nodes.
        std::vector<Phase *> phases;