BugFix ImageFilters Repair filters

Use of secondary texture in image shader (renamed from mask texture) in image filters for ichannel_1 as texture of display loopback only if not needed otherwise (e.g. input image needed in Sharpen filter).
This commit is contained in:
Bruno Herbelin
2024-05-26 23:56:23 +02:00
parent 34297feed4
commit 81a0a724ab
6 changed files with 28 additions and 19 deletions

View File

@@ -292,7 +292,7 @@ void ImageFilteringShader::copy(ImageFilteringShader const& S)
/// //// /// ////
//////////////////////////////////////// ////////////////////////////////////////
ImageFilter::ImageFilter (): FrameBufferFilter(), buffers_({nullptr, nullptr}) ImageFilter::ImageFilter (): FrameBufferFilter(), buffers_({nullptr, nullptr}), channel1_output_session(true)
{ {
// surface and shader for first pass // surface and shader for first pass
shaders_.first = new ImageFilteringShader; shaders_.first = new ImageFilteringShader;
@@ -381,6 +381,7 @@ void ImageFilter::draw (FrameBuffer *input)
input_ = input; input_ = input;
// create first-pass surface and shader, taking as texture the input framebuffer // create first-pass surface and shader, taking as texture the input framebuffer
surfaces_.first->setTextureIndex( input_->texture() ); surfaces_.first->setTextureIndex( input_->texture() );
shaders_.first->secondary_texture = input_->texture();
// (re)create framebuffer for result of first-pass // (re)create framebuffer for result of first-pass
if (buffers_.first != nullptr) if (buffers_.first != nullptr)
delete buffers_.first; delete buffers_.first;
@@ -390,6 +391,7 @@ void ImageFilter::draw (FrameBuffer *input)
input_->blit( buffers_.first ); input_->blit( buffers_.first );
// create second-pass surface and shader, taking as texture the first-pass framebuffer // create second-pass surface and shader, taking as texture the first-pass framebuffer
surfaces_.second->setTextureIndex( buffers_.first->texture() ); surfaces_.second->setTextureIndex( buffers_.first->texture() );
shaders_.second->secondary_texture = input_->texture();
// (re)create framebuffer for result of second-pass // (re)create framebuffer for result of second-pass
if (buffers_.second != nullptr) if (buffers_.second != nullptr)
delete buffers_.second; delete buffers_.second;
@@ -401,16 +403,18 @@ void ImageFilter::draw (FrameBuffer *input)
if ( enabled() || forced ) if ( enabled() || forced )
{ {
// FIRST PASS // FIRST PASS
if (channel1_output_session)
shaders_.first->secondary_texture = Mixer::manager().session()->frame()->texture();
// render input surface into frame buffer // render input surface into frame buffer
shaders_.first->mask_texture = Mixer::manager().session()->frame()->texture();
buffers_.first->begin(); buffers_.first->begin();
surfaces_.first->draw(glm::identity<glm::mat4>(), buffers_.first->projection()); surfaces_.first->draw(glm::identity<glm::mat4>(), buffers_.first->projection());
buffers_.first->end(); buffers_.first->end();
// SECOND PASS // SECOND PASS
if ( program_.isTwoPass() ) { if ( program_.isTwoPass() ) {
if (channel1_output_session)
shaders_.second->secondary_texture = Mixer::manager().session()->frame()->texture();
// render filtered surface from first pass into frame buffer // render filtered surface from first pass into frame buffer
shaders_.second->mask_texture = Mixer::manager().session()->frame()->texture();
buffers_.second->begin(); buffers_.second->begin();
surfaces_.second->draw(glm::identity<glm::mat4>(), buffers_.second->projection()); surfaces_.second->draw(glm::identity<glm::mat4>(), buffers_.second->projection());
buffers_.second->end(); buffers_.second->end();
@@ -525,6 +529,7 @@ std::vector< FilteringProgram > ResampleFilter::programs_ = {
ResampleFilter::ResampleFilter (): ImageFilter(), factor_(RESAMPLE_INVALID) ResampleFilter::ResampleFilter (): ImageFilter(), factor_(RESAMPLE_INVALID)
{ {
channel1_output_session = false;
} }
void ResampleFilter::setFactor(int factor) void ResampleFilter::setFactor(int factor)
@@ -579,7 +584,7 @@ void ResampleFilter::draw (FrameBuffer *input)
// create first-pass surface and shader, taking as texture the input framebuffer // create first-pass surface and shader, taking as texture the input framebuffer
surfaces_.first->setTextureIndex( input_->texture() ); surfaces_.first->setTextureIndex( input_->texture() );
shaders_.first->mask_texture = input_->texture(); shaders_.first->secondary_texture = input_->texture();
// (re)create framebuffer for result of first-pass // (re)create framebuffer for result of first-pass
if (buffers_.first != nullptr) if (buffers_.first != nullptr)
delete buffers_.first; delete buffers_.first;
@@ -604,7 +609,7 @@ void ResampleFilter::draw (FrameBuffer *input)
// SECOND PASS for QUARTER resolution (divide by 2 after first pass divide by 2) // SECOND PASS for QUARTER resolution (divide by 2 after first pass divide by 2)
// create second-pass surface and shader, taking as texture the first-pass framebuffer // create second-pass surface and shader, taking as texture the first-pass framebuffer
surfaces_.second->setTextureIndex( buffers_.first->texture() ); surfaces_.second->setTextureIndex( buffers_.first->texture() );
shaders_.second->mask_texture = input_->texture(); shaders_.second->secondary_texture = input_->texture();
// (re)create framebuffer for result of second-pass // (re)create framebuffer for result of second-pass
if (buffers_.second != nullptr) if (buffers_.second != nullptr)
delete buffers_.second; delete buffers_.second;
@@ -662,6 +667,7 @@ std::vector< FilteringProgram > BlurFilter::programs_ = {
BlurFilter::BlurFilter (): ImageFilter(), method_(BLUR_INVALID), mipmap_buffer_(nullptr) BlurFilter::BlurFilter (): ImageFilter(), method_(BLUR_INVALID), mipmap_buffer_(nullptr)
{ {
mipmap_surface_ = new Surface; mipmap_surface_ = new Surface;
channel1_output_session = false;
} }
BlurFilter::~BlurFilter () BlurFilter::~BlurFilter ()
@@ -733,7 +739,7 @@ void BlurFilter::draw (FrameBuffer *input)
// create first-pass surface and shader, taking as texture the input framebuffer // create first-pass surface and shader, taking as texture the input framebuffer
surfaces_.first->setTextureIndex( mipmap_buffer_->texture() ); surfaces_.first->setTextureIndex( mipmap_buffer_->texture() );
shaders_.first->mask_texture = input_->texture(); shaders_.first->secondary_texture = input_->texture();
// (re)create framebuffer for result of first-pass // (re)create framebuffer for result of first-pass
if (buffers_.first != nullptr) if (buffers_.first != nullptr)
delete buffers_.first; delete buffers_.first;
@@ -743,7 +749,7 @@ void BlurFilter::draw (FrameBuffer *input)
// create second-pass surface and shader, taking as texture the first-pass framebuffer // create second-pass surface and shader, taking as texture the first-pass framebuffer
surfaces_.second->setTextureIndex( buffers_.first->texture() ); surfaces_.second->setTextureIndex( buffers_.first->texture() );
shaders_.second->mask_texture = input_->texture(); shaders_.second->secondary_texture = input_->texture();
// (re)create framebuffer for result of second-pass // (re)create framebuffer for result of second-pass
if (buffers_.second != nullptr) if (buffers_.second != nullptr)
delete buffers_.second; delete buffers_.second;
@@ -803,6 +809,7 @@ std::vector< FilteringProgram > SharpenFilter::programs_ = {
SharpenFilter::SharpenFilter (): ImageFilter(), method_(SHARPEN_INVALID) SharpenFilter::SharpenFilter (): ImageFilter(), method_(SHARPEN_INVALID)
{ {
channel1_output_session = false;
} }
void SharpenFilter::setMethod(int method) void SharpenFilter::setMethod(int method)
@@ -880,6 +887,7 @@ std::vector< FilteringProgram > SmoothFilter::programs_ = {
SmoothFilter::SmoothFilter (): ImageFilter(), method_(SMOOTH_INVALID) SmoothFilter::SmoothFilter (): ImageFilter(), method_(SMOOTH_INVALID)
{ {
channel1_output_session = false;
} }
void SmoothFilter::setMethod(int method) void SmoothFilter::setMethod(int method)
@@ -950,6 +958,7 @@ std::vector< FilteringProgram > EdgeFilter::programs_ = {
EdgeFilter::EdgeFilter (): ImageFilter(), method_(EDGE_INVALID) EdgeFilter::EdgeFilter (): ImageFilter(), method_(EDGE_INVALID)
{ {
channel1_output_session = false;
} }
void EdgeFilter::setMethod(int method) void EdgeFilter::setMethod(int method)
@@ -1020,6 +1029,7 @@ std::vector< FilteringProgram > AlphaFilter::programs_ = {
AlphaFilter::AlphaFilter (): ImageFilter(), operation_(ALPHA_INVALID) AlphaFilter::AlphaFilter (): ImageFilter(), operation_(ALPHA_INVALID)
{ {
channel1_output_session = false;
} }
void AlphaFilter::setOperation(int op) void AlphaFilter::setOperation(int op)

View File

@@ -139,6 +139,7 @@ protected:
std::pair< FrameBuffer *, FrameBuffer * > buffers_; std::pair< FrameBuffer *, FrameBuffer * > buffers_;
std::pair< ImageFilteringShader *, ImageFilteringShader *> shaders_; std::pair< ImageFilteringShader *, ImageFilteringShader *> shaders_;
void updateParameters(); void updateParameters();
bool channel1_output_session;
}; };

View File

@@ -43,7 +43,7 @@ const char* MaskShader::mask_icons[4] = { ICON_FA_WINDOW_CLOSE, ICON_FA_EDIT, I
const char* MaskShader::mask_names[4] = { "No mask", "Paint mask", "Shape mask", "Source mask" }; const char* MaskShader::mask_names[4] = { "No mask", "Paint mask", "Shape mask", "Source mask" };
const char* MaskShader::mask_shapes[5] = { "Ellipse", "Oblong", "Rectangle", "Horizontal", "Vertical" }; const char* MaskShader::mask_shapes[5] = { "Ellipse", "Oblong", "Rectangle", "Horizontal", "Vertical" };
ImageShader::ImageShader(): Shader(), mask_texture(0), stipple(0.f) ImageShader::ImageShader(): Shader(), secondary_texture(0), stipple(0.f)
{ {
// static program shader // static program shader
program_ = &imageShadingProgram; program_ = &imageShadingProgram;
@@ -60,21 +60,21 @@ void ImageShader::use()
program_->setUniform("iNodes", iNodes); program_->setUniform("iNodes", iNodes);
// default mask // default mask
if (mask_texture == 0) if (secondary_texture == 0)
mask_texture = Resource::getTextureWhite(); secondary_texture = Resource::getTextureWhite();
// setup mask texture // setup mask texture
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture (GL_TEXTURE_2D, mask_texture); glBindTexture (GL_TEXTURE_2D, secondary_texture);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
} }
void ImageShader::reset() void ImageShader::reset()
{ {
Shader::reset(); Shader::reset();
mask_texture = 0; secondary_texture = 0;
// no stippling // no stippling
stipple = 0.f; stipple = 0.f;
@@ -84,7 +84,7 @@ void ImageShader::reset()
void ImageShader::copy(ImageShader const& S) void ImageShader::copy(ImageShader const& S)
{ {
mask_texture = S.mask_texture; secondary_texture = S.secondary_texture;
stipple = S.stipple; stipple = S.stipple;
iNodes = S.iNodes; iNodes = S.iNodes;
} }

View File

@@ -1,8 +1,6 @@
#ifndef IMAGESHADER_H #ifndef IMAGESHADER_H
#define IMAGESHADER_H #define IMAGESHADER_H
#include <string>
#include <map>
#include <sys/types.h> #include <sys/types.h>
#include "Shader.h" #include "Shader.h"
@@ -18,7 +16,7 @@ public:
void accept(Visitor& v) override; void accept(Visitor& v) override;
void copy(ImageShader const& S); void copy(ImageShader const& S);
uint mask_texture; uint secondary_texture;
// uniforms // uniforms
float stipple; float stipple;

View File

@@ -948,7 +948,7 @@ void Source::update(float dt)
if (ref_source != nullptr) { if (ref_source != nullptr) {
if (ref_source->ready()) if (ref_source->ready())
// set mask texture to mask source // set mask texture to mask source
blendingshader_->mask_texture = ref_source->frame()->texture(); blendingshader_->secondary_texture = ref_source->frame()->texture();
else else
// retry for when source will be ready // retry for when source will be ready
need_update_ |= SourceUpdate_Mask; need_update_ |= SourceUpdate_Mask;
@@ -964,7 +964,7 @@ void Source::update(float dt)
masksurface_->draw(glm::identity<glm::mat4>(), maskbuffer_->projection()); masksurface_->draw(glm::identity<glm::mat4>(), maskbuffer_->projection());
maskbuffer_->end(); maskbuffer_->end();
// set mask texture to mask buffer // set mask texture to mask buffer
blendingshader_->mask_texture = maskbuffer_->texture(); blendingshader_->secondary_texture = maskbuffer_->texture();
} }
} }

View File

@@ -535,7 +535,7 @@ bool TextureView::adjustBackground()
shift_crop_.x *= edit_source_->frame()->aspectRatio(); shift_crop_.x *= edit_source_->frame()->aspectRatio();
preview_surface_->setTextureIndex(edit_source_->frame()->texture()); preview_surface_->setTextureIndex(edit_source_->frame()->texture());
preview_shader_->mask_texture = edit_source_->blendingShader()->mask_texture; preview_shader_->secondary_texture = edit_source_->blendingShader()->secondary_texture;
preview_surface_->scale_ = scale_crop_; preview_surface_->scale_ = scale_crop_;
preview_surface_->translation_ = shift_crop_; preview_surface_->translation_ = shift_crop_;