X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=resample_effect.h;h=cf5f3bbd74e83aedccfa939dd5c82ad3d8919e13;hp=4cde466c2d85de4a4b81bb5880399c197a11d63e;hb=b90558ce2296b46758be80d447f36bb0ed1be70a;hpb=39b6975420669958ed9f4013440aea415134a902 diff --git a/resample_effect.h b/resample_effect.h index 4cde466..cf5f3bb 100644 --- a/resample_effect.h +++ b/resample_effect.h @@ -44,7 +44,24 @@ struct ScalingWeights { std::unique_ptr[]> bilinear_weights_fp16; std::unique_ptr[]> bilinear_weights_fp32; }; -ScalingWeights calculate_scaling_weights(unsigned src_size, unsigned dst_size, float zoom, float offset); +ScalingWeights calculate_bilinear_scaling_weights(unsigned src_size, unsigned dst_size, float zoom, float offset); + +// A simple manager for support data stored in a 2D texture. +// Consider moving it to a shared location of more classes +// should need similar functionality. +class Support2DTexture { +public: + Support2DTexture(); + ~Support2DTexture(); + + void update(GLint width, GLint height, GLenum internal_format, GLenum format, GLenum type, const GLvoid * data); + GLint get_texnum() const { return texnum; } + +private: + GLuint texnum = 0; + GLint last_texture_width = -1, last_texture_height = -1; + GLenum last_texture_internal_format = GL_INVALID_ENUM; +}; class ResampleEffect : public Effect { public: @@ -53,11 +70,6 @@ public: std::string effect_type_id() const override { return "ResampleEffect"; } - // We want this for the same reason as ResizeEffect; we could end up scaling - // down quite a lot. - bool needs_texture_bounce() const override { return true; } - bool needs_srgb_primaries() const override { return false; } - void inform_input_size(unsigned input_num, unsigned width, unsigned height) override; std::string output_fragment_shader() override { @@ -76,8 +88,8 @@ private: // Both of these are owned by us if owns_effects is true (before finalize()), // and otherwise owned by the EffectChain. - bool owns_effects; - SingleResamplePassEffect *hpass, *vpass; + std::unique_ptr hpass_owner, vpass_owner; + SingleResamplePassEffect *hpass = nullptr, *vpass = nullptr; int input_width, input_height, output_width, output_height; float offset_x, offset_y; @@ -100,6 +112,10 @@ public: bool needs_srgb_primaries() const override { return false; } AlphaHandling alpha_handling() const override { return INPUT_PREMULTIPLIED_ALPHA_KEEP_BLANK; } + // We specifically do not want mipmaps on the input texture; + // they break minification. + MipmapRequirements needs_mipmaps() const override { return CANNOT_ACCEPT_MIPMAPS; } + void inform_added(EffectChain *chain) override { this->chain = chain; } void inform_input_size(unsigned input_num, unsigned width, unsigned height) override { if (parent != nullptr) { @@ -124,7 +140,6 @@ private: ResampleEffect *parent; EffectChain *chain; Direction direction; - GLuint texnum; GLint uniform_sample_tex; float uniform_num_loops, uniform_slice_height, uniform_sample_x_scale, uniform_sample_x_offset; float uniform_whole_pixel_offset; @@ -136,8 +151,7 @@ private: float last_offset, last_zoom; int src_bilinear_samples, num_loops; float slice_height; - int last_texture_width, last_texture_height; - GLuint last_texture_internal_format; + Support2DTexture tex; }; } // namespace movit