#include <epoxy/gl.h>
#include <array>
#include <map>
+#include <mutex>
#include <vector>
#include <utility>
unsigned search_iterations; // Halved from the paper.
unsigned patch_size_pixels;
float patch_overlap_ratio;
- bool variational_refinement; // TODO: Actually disabling this is not implemented yet!
+ bool variational_refinement;
// Not part of the original paper; used for interpolation.
// NOTE: Values much larger than 1.0 seems to trigger Haswell's “PMA stall”;
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.
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);
bool in_use = false;
bool is_renderbuffer = false;
};
- std::vector<Texture> textures;
+ std::mutex mu;
+ std::vector<Texture> textures; // Under mu.
};
class DISComputeFlow {
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;
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;
};
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;
class Interpolate {
public:
- Interpolate(int width, int height, const OperatingPoint &op);
+ Interpolate(int width, int height, 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<GLuint, GLuint> exec(GLuint image_tex, GLuint gray_tex, GLuint bidirectional_flow_tex, GLuint width, GLuint height, float alpha);
void release_texture(GLuint tex) {
pool.release_texture(tex);
GLuint vertex_vbo, vao;
TexturePool pool;
const OperatingPoint op;
+ const bool split_ycbcr_output;
Splat splat;
HoleFill hole_fill;