]> git.sesse.net Git - movit/blobdiff - effect_chain.h
Convert an overly cut-and-pasted comment for AlphaDivisionEffect.
[movit] / effect_chain.h
index 6ce2332848e658a16e66068634987fd1b696adca..b87fce7e5bf651d811bd424d6386ec848c764a7a 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 <GL/glew.h>
+#include <epoxy/gl.h>
 #include <stdio.h>
 #include <map>
 #include <set>
@@ -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;
 };
@@ -100,12 +105,10 @@ struct Phase {
        // 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;
+       // For measurement of GPU time used.
+       GLuint timer_query_object;
+       uint64_t time_elapsed_ns;
+       uint64_t num_measured_iterations;
 };
 
 class EffectChain {
@@ -163,6 +166,14 @@ public:
 
        void finalize();
 
+       // Measure the GPU time used for each actual phase during rendering.
+       // Note that this is only available if GL_ARB_timer_query
+       // (or, equivalently, OpenGL 3.3) is available. Also note that measurement
+       // will incur a performance cost, as we wait for the measurements to
+       // complete at the end of rendering.
+       void enable_phase_timing(bool enable);
+       void reset_phase_timing();
+       void print_phase_timing();
 
        //void render(unsigned char *src, unsigned char *dst);
        void render_to_screen()
@@ -235,6 +246,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);
@@ -295,6 +313,8 @@ private:
 
        ResourcePool *resource_pool;
        bool owns_resource_pool;
+
+       bool do_phase_timing;
 };
 
 }  // namespace movit