From ea283625a718eba24b429119642fd188d5769573 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Tue, 8 Jun 2021 17:20:41 -0700 Subject: [PATCH] Further simplification of AA regime Reduce each (Accel & Fallback) to 3 options: Off, Fast, Good. Fast AA in accelerated canvas uses SMAA with tweaks suggested by David Beinder. Good AA is super-sampled x2. Cairo is similarly reduced to Off, Fast, Good, which map to the Cairo options themselves. Best is removed as it mostly affects text rendering and not line drawing (as our text is) --- common/dialogs/panel_common_settings_base.cpp | 4 +- common/dialogs/panel_common_settings_base.fbp | 4 +- common/gal/cairo/cairo_compositor.cpp | 1 - common/gal/opengl/antialiasing.cpp | 81 +++---------------- common/gal/opengl/antialiasing.h | 18 +---- common/gal/opengl/opengl_compositor.cpp | 34 +++----- common/settings/common_settings.cpp | 4 +- include/gal/cairo/cairo_compositor.h | 2 - include/gal/gal_display_options.h | 7 +- 9 files changed, 36 insertions(+), 119 deletions(-) diff --git a/common/dialogs/panel_common_settings_base.cpp b/common/dialogs/panel_common_settings_base.cpp index 6fcaa2df8e..1dd8fc509c 100644 --- a/common/dialogs/panel_common_settings_base.cpp +++ b/common/dialogs/panel_common_settings_base.cpp @@ -74,7 +74,7 @@ PANEL_COMMON_SETTINGS_BASE::PANEL_COMMON_SETTINGS_BASE( wxWindow* parent, wxWind antialiasingLabel->Wrap( -1 ); gbSizer1->Add( antialiasingLabel, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); - wxString m_antialiasingChoices[] = { _("No Antialiasing"), _("Fast Antialiasing"), _("Balanced Antialiasing"), _("High Quality Antialiasing") }; + wxString m_antialiasingChoices[] = { _("No Antialiasing"), _("Fast Antialiasing"), _("High Quality Antialiasing") }; int m_antialiasingNChoices = sizeof( m_antialiasingChoices ) / sizeof( wxString ); m_antialiasing = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_antialiasingNChoices, m_antialiasingChoices, 0 ); m_antialiasing->SetSelection( 0 ); @@ -84,7 +84,7 @@ PANEL_COMMON_SETTINGS_BASE::PANEL_COMMON_SETTINGS_BASE( wxWindow* parent, wxWind m_antialiasingFallbackLabel->Wrap( -1 ); gbSizer1->Add( m_antialiasingFallbackLabel, wxGBPosition( 6, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); - wxString m_antialiasingFallbackChoices[] = { _("No Antialiasing"), _("Fast Antialiasing"), _("Balanced Antialiasing"), _("High Quality Antialiasing") }; + wxString m_antialiasingFallbackChoices[] = { _("No Antialiasing"), _("Fast Antialiasing"), _("High Quality Antialiasing") }; int m_antialiasingFallbackNChoices = sizeof( m_antialiasingFallbackChoices ) / sizeof( wxString ); m_antialiasingFallback = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_antialiasingFallbackNChoices, m_antialiasingFallbackChoices, 0 ); m_antialiasingFallback->SetSelection( 0 ); diff --git a/common/dialogs/panel_common_settings_base.fbp b/common/dialogs/panel_common_settings_base.fbp index 5aeba9e677..913a9f6a2e 100644 --- a/common/dialogs/panel_common_settings_base.fbp +++ b/common/dialogs/panel_common_settings_base.fbp @@ -696,7 +696,7 @@ 1 0 - "No Antialiasing" "Fast Antialiasing" "Balanced Antialiasing" "High Quality Antialiasing" + "No Antialiasing" "Fast Antialiasing" "High Quality Antialiasing" 1 1 @@ -827,7 +827,7 @@ 1 0 - "No Antialiasing" "Fast Antialiasing" "Balanced Antialiasing" "High Quality Antialiasing" + "No Antialiasing" "Fast Antialiasing" "High Quality Antialiasing" 1 1 diff --git a/common/gal/cairo/cairo_compositor.cpp b/common/gal/cairo/cairo_compositor.cpp index 40d8f224f9..bc1b0155e0 100644 --- a/common/gal/cairo/cairo_compositor.cpp +++ b/common/gal/cairo/cairo_compositor.cpp @@ -66,7 +66,6 @@ void CAIRO_COMPOSITOR::SetAntialiasingMode( CAIRO_ANTIALIASING_MODE aMode ) { case CAIRO_ANTIALIASING_MODE::FAST: m_currentAntialiasingMode = CAIRO_ANTIALIAS_FAST; break; case CAIRO_ANTIALIASING_MODE::GOOD: m_currentAntialiasingMode = CAIRO_ANTIALIAS_GOOD; break; - case CAIRO_ANTIALIASING_MODE::BEST: m_currentAntialiasingMode = CAIRO_ANTIALIAS_BEST; break; default: m_currentAntialiasingMode = CAIRO_ANTIALIAS_NONE; } diff --git a/common/gal/opengl/antialiasing.cpp b/common/gal/opengl/antialiasing.cpp index b85fbe6e86..06019c7e01 100644 --- a/common/gal/opengl/antialiasing.cpp +++ b/common/gal/opengl/antialiasing.cpp @@ -127,44 +127,16 @@ void draw_fullscreen_primitive() // ANTIALIASING_SUPERSAMPLING // ========================= -ANTIALIASING_SUPERSAMPLING::ANTIALIASING_SUPERSAMPLING( OPENGL_COMPOSITOR* aCompositor, - SUPERSAMPLING_MODE aMode ) : +ANTIALIASING_SUPERSAMPLING::ANTIALIASING_SUPERSAMPLING( OPENGL_COMPOSITOR* aCompositor ) : compositor( aCompositor ), - mode( aMode ), ssaaMainBuffer( 0 ), areBuffersCreated( false ), areShadersCreated( false ) + ssaaMainBuffer( 0 ), areBuffersCreated( false ), areShadersCreated( false ) { } bool ANTIALIASING_SUPERSAMPLING::Init() { - if( mode == SUPERSAMPLING_MODE::X4 && !areShadersCreated ) - { - x4_shader = std::make_unique(); - x4_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_VERTEX, - BUILTIN_SHADERS::ssaa_x4_vertex_shader ); - x4_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_FRAGMENT, - BUILTIN_SHADERS::ssaa_x4_fragment_shader ); - x4_shader->Link(); - checkGlError( "linking supersampling x4 shader", __FILE__, __LINE__ ); - - GLint source_parameter = x4_shader->AddParameter( "source" ); - checkGlError( "getting pass 1 colorTex", __FILE__, __LINE__ ); - - x4_shader->Use(); - checkGlError( "using pass 1 shader", __FILE__, __LINE__ ); - x4_shader->SetParameter( source_parameter, 0 ); - checkGlError( "setting colorTex uniform", __FILE__, __LINE__ ); - x4_shader->Deactivate(); - checkGlError( "deactivating pass 2 shader", __FILE__, __LINE__ ); - - areShadersCreated = true; - } - - if( areShadersCreated && mode != SUPERSAMPLING_MODE::X4 ) - { - x4_shader.reset(); - areShadersCreated = false; - } + areShadersCreated = false; if( !areBuffersCreated ) { @@ -181,8 +153,7 @@ bool ANTIALIASING_SUPERSAMPLING::Init() VECTOR2U ANTIALIASING_SUPERSAMPLING::GetInternalBufferSize() { - unsigned int factor = ( mode == SUPERSAMPLING_MODE::X2 ) ? 2 : 4; - return compositor->GetScreenSize() * factor; + return compositor->GetScreenSize() * 2; } @@ -207,19 +178,7 @@ void ANTIALIASING_SUPERSAMPLING::Present() glBindTexture( GL_TEXTURE_2D, compositor->GetBufferTexture( ssaaMainBuffer ) ); compositor->SetBuffer( OPENGL_COMPOSITOR::DIRECT_RENDERING ); - if( mode == SUPERSAMPLING_MODE::X4 ) - { - x4_shader->Use(); - checkGlError( "activating supersampling x4 shader", __FILE__, __LINE__ ); - } - draw_fullscreen_primitive(); - - if( mode == SUPERSAMPLING_MODE::X4 ) - { - x4_shader->Deactivate(); - checkGlError( "deactivating supersampling x4 shader", __FILE__, __LINE__ ); - } } @@ -238,10 +197,9 @@ unsigned int ANTIALIASING_SUPERSAMPLING::CreateBuffer() // ANTIALIASING_SMAA // =============================== -ANTIALIASING_SMAA::ANTIALIASING_SMAA( OPENGL_COMPOSITOR* aCompositor, SMAA_QUALITY aQuality ) : +ANTIALIASING_SMAA::ANTIALIASING_SMAA( OPENGL_COMPOSITOR* aCompositor ) : areBuffersInitialized( false ), shadersLoaded( false ), - quality( aQuality ), compositor( aCompositor ) { smaaBaseBuffer = 0; @@ -303,27 +261,14 @@ void ANTIALIASING_SMAA::loadShaders() std::string quality_string; const char* edge_detect_shader; - if( quality == SMAA_QUALITY::CONSERVATIVE ) - { - // trades imperfect AA of shallow angles for a near artifact-free reproduction of fine features - // jaggies are smoothed over max 5px (original step + 2px in both directions) - quality_string = "#define SMAA_THRESHOLD 0.1\n" - "#define SMAA_MAX_SEARCH_STEPS 1\n" - "#define SMAA_MAX_SEARCH_STEPS_DIAG 2\n" - "#define SMAA_DISABLE_CORNER_DETECTION\n"; - edge_detect_shader = BUILTIN_SHADERS::smaa_pass_1_fragment_shader_luma; - } - else - { - // jaggies are smoothed over max 17px (original step + 8px in both directions) - quality_string = "#define SMAA_THRESHOLD 0.05\n" - "#define SMAA_MAX_SEARCH_STEPS 4\n" - "#define SMAA_MAX_SEARCH_STEPS_DIAG 4\n" - "#define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR 1.5\n" - "#define SMAA_CORNER_ROUNDING 10\n"; - edge_detect_shader = BUILTIN_SHADERS::smaa_pass_1_fragment_shader_color; - } - + // trades imperfect AA of shallow angles for a near artifact-free reproduction of fine features + // jaggies are smoothed over max 5px (original step + 2px in both directions) + quality_string = "#define SMAA_THRESHOLD 0.005\n" + "#define SMAA_MAX_SEARCH_STEPS 1\n" + "#define SMAA_MAX_SEARCH_STEPS_DIAG 2\n" + "#define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR 1.5\n" + "#define SMAA_CORNER_ROUNDING 0\n"; + edge_detect_shader = BUILTIN_SHADERS::smaa_pass_1_fragment_shader_luma; // set up shaders std::string vert_preamble( R"SHADER( diff --git a/common/gal/opengl/antialiasing.h b/common/gal/opengl/antialiasing.h index 43f28d6995..97821c5ceb 100644 --- a/common/gal/opengl/antialiasing.h +++ b/common/gal/opengl/antialiasing.h @@ -70,16 +70,11 @@ namespace KIGFX { OPENGL_COMPOSITOR* compositor; }; - enum class SUPERSAMPLING_MODE { - X2, - X4 - }; - class ANTIALIASING_SUPERSAMPLING : public OPENGL_PRESENTOR { public: - ANTIALIASING_SUPERSAMPLING( OPENGL_COMPOSITOR* aCompositor, SUPERSAMPLING_MODE aMode ); + ANTIALIASING_SUPERSAMPLING( OPENGL_COMPOSITOR* aCompositor ); bool Init() override; unsigned int CreateBuffer() override; @@ -93,25 +88,17 @@ namespace KIGFX { private: OPENGL_COMPOSITOR* compositor; - SUPERSAMPLING_MODE mode; unsigned int ssaaMainBuffer; bool areBuffersCreated; bool areShadersCreated; - std::unique_ptr x4_shader; - }; - - enum class SMAA_QUALITY - { - CONSERVATIVE, - AGGRESSIVE }; class ANTIALIASING_SMAA : public OPENGL_PRESENTOR { public: - ANTIALIASING_SMAA( OPENGL_COMPOSITOR* aCompositor, SMAA_QUALITY aQuality ); + ANTIALIASING_SMAA( OPENGL_COMPOSITOR* aCompositor ); bool Init() override; unsigned int CreateBuffer () override; @@ -148,7 +135,6 @@ namespace KIGFX { std::unique_ptr pass_3_shader; GLint pass_3_metrics; - SMAA_QUALITY quality; OPENGL_COMPOSITOR* compositor; }; diff --git a/common/gal/opengl/opengl_compositor.cpp b/common/gal/opengl/opengl_compositor.cpp index 36c67f4c8f..5c26662aa4 100644 --- a/common/gal/opengl/opengl_compositor.cpp +++ b/common/gal/opengl/opengl_compositor.cpp @@ -93,23 +93,15 @@ void OPENGL_COMPOSITOR::Initialize() switch( m_currentAntialiasingMode ) { - case OPENGL_ANTIALIASING_MODE::NONE: + case OPENGL_ANTIALIASING_MODE::SMAA: + m_antialiasing = std::make_unique( this ); + break; + case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING: + m_antialiasing = std::make_unique( this ); + break; + default: m_antialiasing = std::make_unique( this ); break; - case OPENGL_ANTIALIASING_MODE::SUBSAMPLE_CONSERVATIVE: - m_antialiasing = std::make_unique( this, SMAA_QUALITY::CONSERVATIVE ); - break; - case OPENGL_ANTIALIASING_MODE::SUBSAMPLE_AGGRESSIVE: - m_antialiasing = std::make_unique( this, SMAA_QUALITY::AGGRESSIVE ); - break; - case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING_X2: - m_antialiasing = - std::make_unique( this, SUPERSAMPLING_MODE::X2 ); - break; - case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING_X4: - m_antialiasing = - std::make_unique( this, SUPERSAMPLING_MODE::X4 ); - break; } VECTOR2U dims = m_antialiasing->GetInternalBufferSize(); @@ -432,11 +424,12 @@ void OPENGL_COMPOSITOR::clean() int OPENGL_COMPOSITOR::GetAntialiasSupersamplingFactor() const { - switch( m_currentAntialiasingMode ) + switch ( m_currentAntialiasingMode ) { - case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING_X2: return 2; - case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING_X4: return 4; - default: return 1; + case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING: + return 2; + default: + return 1; } } @@ -444,8 +437,7 @@ VECTOR2D OPENGL_COMPOSITOR::GetAntialiasRenderingOffset() const { switch( m_currentAntialiasingMode ) { - case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING_X2: return VECTOR2D( 0.5, -0.5 ); - case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING_X4: return VECTOR2D( 0.25, -0.25 ); + case OPENGL_ANTIALIASING_MODE::SUPERSAMPLING: return VECTOR2D( 0.5, -0.5 ); default: return VECTOR2D( 0, 0 ); } } diff --git a/common/settings/common_settings.cpp b/common/settings/common_settings.cpp index 059284c5b2..6ff93f11f9 100644 --- a/common/settings/common_settings.cpp +++ b/common/settings/common_settings.cpp @@ -247,10 +247,10 @@ COMMON_SETTINGS::COMMON_SETTINGS() : MOUSE_DRAG_ACTION::NONE ) ); m_params.emplace_back( new PARAM( "graphics.opengl_antialiasing_mode", - &m_Graphics.opengl_aa_mode, 0, 0, 3 ) ); + &m_Graphics.opengl_aa_mode, 0, 0, 2 ) ); m_params.emplace_back( new PARAM( "graphics.cairo_antialiasing_mode", - &m_Graphics.cairo_aa_mode, 0, 0, 3 ) ); + &m_Graphics.cairo_aa_mode, 0, 0, 2 ) ); m_params.emplace_back( new PARAM( "system.autosave_interval", &m_System.autosave_interval, 600 ) ); diff --git a/include/gal/cairo/cairo_compositor.h b/include/gal/cairo/cairo_compositor.h index 1105ade12c..105b18468b 100644 --- a/include/gal/cairo/cairo_compositor.h +++ b/include/gal/cairo/cairo_compositor.h @@ -86,8 +86,6 @@ public: return CAIRO_ANTIALIASING_MODE::FAST; case CAIRO_ANTIALIAS_GOOD: return CAIRO_ANTIALIASING_MODE::GOOD; - case CAIRO_ANTIALIAS_BEST: - return CAIRO_ANTIALIASING_MODE::BEST; default: return CAIRO_ANTIALIASING_MODE::NONE; } diff --git a/include/gal/gal_display_options.h b/include/gal/gal_display_options.h index fda84418ef..40580e99ab 100644 --- a/include/gal/gal_display_options.h +++ b/include/gal/gal_display_options.h @@ -48,10 +48,8 @@ namespace KIGFX enum class OPENGL_ANTIALIASING_MODE { NONE, - SUBSAMPLE_CONSERVATIVE, - SUBSAMPLE_AGGRESSIVE, - SUPERSAMPLING_X2, - SUPERSAMPLING_X4, + SMAA, + SUPERSAMPLING, }; enum class CAIRO_ANTIALIASING_MODE @@ -59,7 +57,6 @@ namespace KIGFX NONE, FAST, GOOD, - BEST, }; enum class GRID_SNAPPING