]> git.sesse.net Git - movit/blobdiff - resource_pool.h
Explicitly bind fragment shader outputs in order.
[movit] / resource_pool.h
index b218d7ad18f6bea9666e92a96e79098ebbb2262c..5cc2e829e8f836635b04980978372973d3618639 100644 (file)
@@ -29,6 +29,7 @@
 #include <map>
 #include <string>
 #include <utility>
+#include <vector>
 
 namespace movit {
 
@@ -56,7 +57,14 @@ public:
        // compiled program from the cache if possible. Keeps ownership of the
        // program; you must call release_glsl_program() instead of deleting it
        // when you no longer want it.
-       GLuint compile_glsl_program(const std::string& vertex_shader, const std::string& fragment_shader);
+       //
+       // If <fragment_shader_outputs> contains more than one value, the given
+       // outputs will be bound to fragment shader output colors in the order
+       // they appear in the vector. Otherwise, output order is undefined and
+       // determined by the OpenGL driver.
+       GLuint compile_glsl_program(const std::string& vertex_shader,
+                                   const std::string& fragment_shader,
+                                   const std::vector<std::string>& frag_shader_outputs);
        void release_glsl_program(GLuint glsl_program_num);
 
        // Allocate a 2D texture of the given internal format and dimensions,
@@ -143,6 +151,7 @@ private:
 
        static const unsigned num_fbo_attachments = 4;
        struct FBO {
+               GLuint fbo_num;
                // GL_INVALID_INDEX means associated to a texture that has since been deleted.
                // 0 means the output isn't bound.
                GLuint texture_num[num_fbo_attachments];
@@ -152,11 +161,14 @@ private:
        // filled if the FBO is given out to a client or on the freelist, but
        // not if it is deleted from the freelist.
        std::map<std::pair<void *, GLuint>, FBO> fbo_formats;
+       typedef std::map<std::pair<void *, GLuint>, FBO>::iterator FBOFormatIterator;
 
        // For each context, a list of all FBOs that are released but not freed
        // (most recently freed first). Once this reaches <fbo_freelist_max_length>,
        // the last element will be deleted.
-       std::map<void *, std::list<GLuint> > fbo_freelist;
+       //
+       // We store iterators directly into <fbo_format> for efficiency.
+       std::map<void *, std::list<FBOFormatIterator> > fbo_freelist;
 
        // See the caveats at the constructor.
        static size_t estimate_texture_size(const Texture2D &texture_format);