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

View File

@@ -139,6 +139,7 @@ protected:
std::pair< FrameBuffer *, FrameBuffer * > buffers_;
std::pair< ImageFilteringShader *, ImageFilteringShader *> shaders_;
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_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
program_ = &imageShadingProgram;
@@ -60,21 +60,21 @@ void ImageShader::use()
program_->setUniform("iNodes", iNodes);
// default mask
if (mask_texture == 0)
mask_texture = Resource::getTextureWhite();
if (secondary_texture == 0)
secondary_texture = Resource::getTextureWhite();
// setup mask texture
glActiveTexture(GL_TEXTURE1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 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);
}
void ImageShader::reset()
{
Shader::reset();
mask_texture = 0;
secondary_texture = 0;
// no stippling
stipple = 0.f;
@@ -84,7 +84,7 @@ void ImageShader::reset()
void ImageShader::copy(ImageShader const& S)
{
mask_texture = S.mask_texture;
secondary_texture = S.secondary_texture;
stipple = S.stipple;
iNodes = S.iNodes;
}

View File

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

View File

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