X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=resource_pool.h;h=f919536ec0cbdacd3a652f6ebed8f21756fab8e1;hb=2d8043bb837b45c9ae509450b3e1b1eb545e44b9;hp=8503b29b6e0020d0111e83c459905a57694e9cd3;hpb=7ff8195d27166151be38d637ae4b2633d4b39556;p=movit diff --git a/resource_pool.h b/resource_pool.h index 8503b29..f919536 100644 --- a/resource_pool.h +++ b/resource_pool.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +50,8 @@ public: // twice this estimate or more. ResourcePool(size_t program_freelist_max_length = 100, size_t texture_freelist_max_bytes = 100 << 20, // 100 MB. - size_t fbo_freelist_max_length = 100); // Per context. + size_t fbo_freelist_max_length = 100, // Per context. + size_t vao_freelist_max_length = 100); // Per context. ~ResourcePool(); // All remaining functions are intended for calls from EffectChain only. @@ -104,6 +106,19 @@ public: GLuint texture3_num = 0); void release_fbo(GLuint fbo_num); + // Create a VAO of a very specific form: All the given attribute indices + // are bound to start of the given VBO and contain two-component floats. + // Keeps ownership of the VAO; you must call release_vec2_vao() of deleting + // it when you no longer want it. VAOs are not sharable across contexts. + // + // These are not cached primarily for performance, but rather to work + // around an NVIDIA driver bug where glVertexAttribPointer() is thread-hostile + // (ie., simultaneous GL work in unrelated contexts can cause the driver + // to free() memory that was never malloc()-ed). + GLuint create_vec2_vao(const std::set &attribute_indices, + GLuint vbo_num); + void release_vec2_vao(const GLuint vao_num); + // Informs the ResourcePool that the current context is going away soon, // and that any resources held for it in the freelist should be deleted. // @@ -123,6 +138,9 @@ private: // is no more than elements long. void shrink_fbo_freelist(void *context, size_t max_length); + // Same, for VAOs. + void shrink_vao_freelist(void *context, size_t max_length); + // Link the given vertex and fragment shaders into a full GLSL program. // See compile_glsl_program() for explanation of . static GLuint link_program(GLuint vs_obj, @@ -132,7 +150,7 @@ private: // Protects all the other elements in the class. pthread_mutex_t lock; - size_t program_freelist_max_length, texture_freelist_max_bytes, fbo_freelist_max_length; + size_t program_freelist_max_length, texture_freelist_max_bytes, fbo_freelist_max_length, vao_freelist_max_length; // A mapping from vertex/fragment shader source strings to compiled program number. std::map, GLuint> programs; @@ -204,6 +222,16 @@ private: // We store iterators directly into for efficiency. std::map > fbo_freelist; + // Very similar, for VAOs. + struct VAO { + GLuint vao_num; + std::set attribute_indices; + GLuint vbo_num; + }; + std::map, VAO> vao_formats; + typedef std::map, VAO>::iterator VAOFormatIterator; + std::map > vao_freelist; + // See the caveats at the constructor. static size_t estimate_texture_size(const Texture2D &texture_format); };