diff options
| author | Marshall Mohror <mohror64@gmail.com> | 2021-10-20 21:40:02 -0500 | 
|---|---|---|
| committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2021-11-16 22:11:32 +0100 | 
| commit | 056894f07ae4c1ef295fefb1e8f120964f2e04b4 (patch) | |
| tree | 777c70aa14ca65af9d5168a50e24b1f9c103d1b0 /src/video_core | |
| parent | 48cf3764626e1ed30450d15e00befb75a4eae329 (diff) | |
OpenGL: fix FXAA with scaling
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 39 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.h | 1 | 
2 files changed, 31 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index dbe66a1b6..e63f0bdd8 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -213,7 +213,9 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf      framebuffer_crop_rect = framebuffer.crop_rect;      const VAddr framebuffer_addr{framebuffer.address + framebuffer.offset}; -    if (rasterizer.AccelerateDisplay(framebuffer, framebuffer_addr, framebuffer.stride)) { +    screen_info.was_accelerated = +        rasterizer.AccelerateDisplay(framebuffer, framebuffer_addr, framebuffer.stride); +    if (screen_info.was_accelerated) {          return;      } @@ -346,7 +348,9 @@ void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,      glTextureStorage2D(texture.resource.handle, 1, internal_format, texture.width, texture.height);      fxaa_texture.Release();      fxaa_texture.Create(GL_TEXTURE_2D); -    glTextureStorage2D(fxaa_texture.handle, 1, GL_RGBA16F, texture.width, texture.height); +    glTextureStorage2D(fxaa_texture.handle, 1, GL_RGBA16F, +                       Settings::values.resolution_info.ScaleUp(screen_info.texture.width), +                       Settings::values.resolution_info.ScaleUp(screen_info.texture.height));      glNamedFramebufferTexture(fxaa_framebuffer.handle, GL_COLOR_ATTACHMENT0, fxaa_texture.handle,                                0);  } @@ -397,13 +401,25 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {          program_manager.BindPresentPrograms(fxaa_vertex.handle, fxaa_fragment.handle);          glEnablei(GL_SCISSOR_TEST, 0); -        glScissorIndexed(0, 0, 0, -                         framebuffer_crop_rect.GetWidth() != 0 ? framebuffer_crop_rect.GetWidth() -                                                               : screen_info.texture.width, -                         framebuffer_crop_rect.GetHeight() != 0 ? framebuffer_crop_rect.GetHeight() -                                                                : screen_info.texture.height); -        glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(screen_info.texture.width), -                           static_cast<GLfloat>(screen_info.texture.height)); +        auto viewport_width = screen_info.texture.width; +        auto scissor_width = framebuffer_crop_rect.GetWidth(); +        if (scissor_width <= 0) { +            scissor_width = viewport_width; +        } +        auto viewport_height = screen_info.texture.height; +        auto scissor_height = framebuffer_crop_rect.GetHeight(); +        if (scissor_height <= 0) { +            scissor_height = viewport_height; +        } +        if (screen_info.was_accelerated) { +            viewport_width = Settings::values.resolution_info.ScaleUp(viewport_width); +            scissor_width = Settings::values.resolution_info.ScaleUp(scissor_width); +            viewport_height = Settings::values.resolution_info.ScaleUp(viewport_height); +            scissor_height = Settings::values.resolution_info.ScaleUp(scissor_height); +        } +        glScissorIndexed(0, 0, 0, scissor_width, scissor_height); +        glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(viewport_width), +                           static_cast<GLfloat>(viewport_height));          glDepthRangeIndexed(0, 0.0, 0.0);          glBindSampler(0, present_sampler.handle); @@ -487,6 +503,11 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {          scale_v = static_cast<f32>(framebuffer_crop_rect.GetHeight()) /                    static_cast<f32>(screen_info.texture.height);      } +    if (Settings::values.anti_aliasing.GetValue() == Settings::AntiAliasing::Fxaa && +        !screen_info.was_accelerated) { +        scale_u /= Settings::values.resolution_info.up_factor; +        scale_v /= Settings::values.resolution_info.up_factor; +    }      const auto& screen = layout.screen;      const std::array vertices = { diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index f6c66f804..cda333cad 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h @@ -50,6 +50,7 @@ struct TextureInfo {  /// Structure used for storing information about the display target for the Switch screen  struct ScreenInfo {      GLuint display_texture{}; +    bool was_accelerated = false;      bool display_srgb{};      const Common::Rectangle<float> display_texcoords{0.0f, 0.0f, 1.0f, 1.0f};      TextureInfo texture;  | 
