|
|
|
@ -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 = { |
|
|
|
|