X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=flow.h;h=08b25904356ab61265835e46cf219105c5ae88d2;hb=c786b9e247c7169e7a8097b37259dfa6ecd5a953;hp=2e4546861d8c3abbe7157fb9ea6d3537675a6322;hpb=728b20a90b39b96eb5ac5ecd17cd5c3cbaac7009;p=nageru diff --git a/flow.h b/flow.h index 2e45468..08b2590 100644 --- a/flow.h +++ b/flow.h @@ -5,12 +5,13 @@ // in-between frames. The main user interface is the DISComputeFlow and Interpolate // classes (also GrayscaleConversion can be useful). -#include -#include #include +#include #include -#include +#include +#include #include +#include class ScopedTimer; @@ -78,6 +79,8 @@ static constexpr OperatingPoint operating_point4 = { 8.0f // Splat size (pixels). }; +int find_num_levels(int width, int height); + // A class that caches FBOs that render to a given set of textures. // It never frees anything, so it is only suitable for rendering to // the same (small) set of textures over and over again. @@ -108,7 +111,6 @@ private: std::map, GLuint> fbos; }; - // Same, but with a depth texture. template class PersistentFBOSetWithDepth { @@ -381,6 +383,7 @@ private: GLuint uniform_scale_factor; }; +// All operations, except construction and destruction, are thread-safe. class TexturePool { public: GLuint get_texture(GLenum format, GLuint width, GLuint height, GLuint num_layers = 0); @@ -396,7 +399,8 @@ private: bool in_use = false; bool is_renderbuffer = false; }; - std::vector textures; + std::mutex mu; + std::vector textures; // Under mu. }; class DISComputeFlow { @@ -417,7 +421,8 @@ public: // after use. GLuint exec(GLuint tex, FlowDirection flow_direction, ResizeStrategy resize_strategy); - void release_texture(GLuint tex) { + void release_texture(GLuint tex) + { pool.release_texture(tex); } @@ -448,7 +453,7 @@ public: Splat(const OperatingPoint &op); // alpha is the time of the interpolated frame (0..1). - void exec(GLuint image_tex, GLuint bidirectional_flow_tex, GLuint flow_tex, GLuint depth_rb, int width, int height, float alpha); + void exec(GLuint gray_tex, GLuint bidirectional_flow_tex, GLuint flow_tex, GLuint depth_rb, int width, int height, float alpha); private: const OperatingPoint op; @@ -459,7 +464,7 @@ private: GLuint splat_program; GLuint uniform_splat_size, uniform_alpha; - GLuint uniform_image_tex, uniform_flow_tex; + GLuint uniform_gray_tex, uniform_flow_tex; GLuint uniform_inv_flow_size; }; @@ -517,11 +522,15 @@ private: class Blend { public: - Blend(); - void exec(GLuint image_tex, GLuint flow_tex, GLuint output_tex, int width, int height, float alpha); + Blend(bool split_ycbcr_output); + + // output2_tex is only used if split_ycbcr_output was true. + void exec(GLuint image_tex, GLuint flow_tex, GLuint output_tex, GLuint output2_tex, int width, int height, float alpha); private: + bool split_ycbcr_output; PersistentFBOSet<1> fbos; + PersistentFBOSet<2> fbos_split; GLuint blend_vs_obj; GLuint blend_fs_obj; GLuint blend_program; @@ -532,22 +541,23 @@ private: class Interpolate { public: - Interpolate(int width, int height, const OperatingPoint &op); + Interpolate(const OperatingPoint &op, bool split_ycbcr_output); - // Returns a texture that must be released with release_texture() - // after use. image_tex must be a two-layer RGBA8 texture with mipmaps - // (unless flow_level == 0). - GLuint exec(GLuint image_tex, GLuint bidirectional_flow_tex, GLuint width, GLuint height, float alpha); + // Returns a texture (or two, if split_ycbcr_output is true) that must + // be released with release_texture() after use. image_tex must be a + // two-layer RGBA8 texture with mipmaps (unless flow_level == 0). + std::pair exec(GLuint image_tex, GLuint gray_tex, GLuint bidirectional_flow_tex, GLuint width, GLuint height, float alpha); - void release_texture(GLuint tex) { + void release_texture(GLuint tex) + { pool.release_texture(tex); } private: - int width, height, flow_level; + int flow_level; GLuint vertex_vbo, vao; TexturePool pool; - const OperatingPoint op; + const bool split_ycbcr_output; Splat splat; HoleFill hole_fill;