X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=resample_effect.cpp;h=1f6c47c9d236a56ec688ff52d21452083600fc95;hb=3306a4a0d2300767eeef71ab877fdf1587d13475;hp=1722356b72ac0f02adcacb006bf27fbab5aa4088;hpb=b63de2b092ee08427d4547164c3d4b1a5a1003e9;p=movit diff --git a/resample_effect.cpp b/resample_effect.cpp index 1722356..1f6c47c 100644 --- a/resample_effect.cpp +++ b/resample_effect.cpp @@ -300,8 +300,7 @@ double compute_sum_sq_error(const Tap* weights, unsigned num_weights, } // namespace ResampleEffect::ResampleEffect() - : owns_effects(true), - input_width(1280), + : input_width(1280), input_height(720), offset_x(0.0f), offset_y(0.0f), zoom_x(1.0f), zoom_y(1.0f), @@ -311,9 +310,11 @@ ResampleEffect::ResampleEffect() register_int("height", &output_height); // The first blur pass will forward resolution information to us. - hpass = new SingleResamplePassEffect(this); + hpass_owner.reset(new SingleResamplePassEffect(this)); + hpass = hpass_owner.get(); CHECK(hpass->set_int("direction", SingleResamplePassEffect::HORIZONTAL)); - vpass = new SingleResamplePassEffect(nullptr); + vpass_owner.reset(new SingleResamplePassEffect(this)); + vpass = vpass_owner.get(); CHECK(vpass->set_int("direction", SingleResamplePassEffect::VERTICAL)); update_size(); @@ -321,21 +322,16 @@ ResampleEffect::ResampleEffect() ResampleEffect::~ResampleEffect() { - if (owns_effects) { - delete hpass; - delete vpass; - } } void ResampleEffect::rewrite_graph(EffectChain *graph, Node *self) { - Node *hpass_node = graph->add_node(hpass); - Node *vpass_node = graph->add_node(vpass); + Node *hpass_node = graph->add_node(hpass_owner.release()); + Node *vpass_node = graph->add_node(vpass_owner.release()); graph->connect_nodes(hpass_node, vpass_node); graph->replace_receiver(self, hpass_node); graph->replace_sender(self, vpass_node); self->disabled = true; - owns_effects = false; } // We get this information forwarded from the first blur pass, @@ -448,8 +444,7 @@ SingleResamplePassEffect::SingleResamplePassEffect(ResampleEffect *parent) last_output_width(-1), last_output_height(-1), last_offset(0.0 / 0.0), // NaN. - last_zoom(0.0 / 0.0), // NaN. - last_texture_width(-1), last_texture_height(-1) + last_zoom(0.0 / 0.0) // NaN. { register_int("direction", (int *)&direction); register_int("input_width", &input_width); @@ -466,14 +461,11 @@ SingleResamplePassEffect::SingleResamplePassEffect(ResampleEffect *parent) register_uniform_float("sample_x_offset", &uniform_sample_x_offset); register_uniform_float("whole_pixel_offset", &uniform_whole_pixel_offset); - glGenTextures(1, &texnum); - call_once(lanczos_table_init_done, init_lanczos_table); } SingleResamplePassEffect::~SingleResamplePassEffect() { - glDeleteTextures(1, &texnum); } string SingleResamplePassEffect::output_fragment_shader() @@ -518,17 +510,8 @@ void SingleResamplePassEffect::update_texture(GLuint glsl_program_num, const str // Encode as a two-component texture. Note the GL_REPEAT. glActiveTexture(GL_TEXTURE0 + *sampler_num); check_error(); - glBindTexture(GL_TEXTURE_2D, texnum); + glBindTexture(GL_TEXTURE_2D, tex.get_texnum()); check_error(); - if (last_texture_width == -1) { - // Need to set this state the first time. - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - check_error(); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - check_error(); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - check_error(); - } GLenum type, internal_format; void *pixels; @@ -543,19 +526,7 @@ void SingleResamplePassEffect::update_texture(GLuint glsl_program_num, const str pixels = weights.bilinear_weights_fp16.get(); } - if (int(weights.src_bilinear_samples) == last_texture_width && - int(weights.dst_samples) == last_texture_height && - internal_format == last_texture_internal_format) { - // Texture dimensions and type are unchanged; it is more efficient - // to just update it rather than making an entirely new texture. - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, weights.src_bilinear_samples, weights.dst_samples, GL_RG, type, pixels); - } else { - glTexImage2D(GL_TEXTURE_2D, 0, internal_format, weights.src_bilinear_samples, weights.dst_samples, 0, GL_RG, type, pixels); - last_texture_width = weights.src_bilinear_samples; - last_texture_height = weights.dst_samples; - last_texture_internal_format = internal_format; - } - check_error(); + tex.update(weights.src_bilinear_samples, weights.dst_samples, internal_format, GL_RG, type, pixels); } ScalingWeights calculate_scaling_weights(unsigned src_size, unsigned dst_size, float zoom, float offset) @@ -715,7 +686,7 @@ void SingleResamplePassEffect::set_gl_state(GLuint glsl_program_num, const strin glActiveTexture(GL_TEXTURE0 + *sampler_num); check_error(); - glBindTexture(GL_TEXTURE_2D, texnum); + glBindTexture(GL_TEXTURE_2D, tex.get_texnum()); check_error(); uniform_sample_tex = *sampler_num; @@ -745,4 +716,44 @@ void SingleResamplePassEffect::set_gl_state(GLuint glsl_program_num, const strin } } +Support2DTexture::Support2DTexture() +{ + glGenTextures(1, &texnum); + check_error(); + glBindTexture(GL_TEXTURE_2D, texnum); + check_error(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + check_error(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + check_error(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + check_error(); +} + +Support2DTexture::~Support2DTexture() +{ + glDeleteTextures(1, &texnum); + check_error(); +} + +void Support2DTexture::update(GLint width, GLint height, GLenum internal_format, GLenum format, GLenum type, const GLvoid * data) +{ + glBindTexture(GL_TEXTURE_2D, texnum); + check_error(); + if (width == last_texture_width && + height == last_texture_height && + internal_format == last_texture_internal_format) { + // Texture dimensions and type are unchanged; it is more efficient + // to just update it rather than making an entirely new texture. + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, format, type, data); + check_error(); + } else { + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, format, type, data); + check_error(); + last_texture_width = width; + last_texture_height = height; + last_texture_internal_format = internal_format; + } +} + } // namespace movit