diff options
author | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-10-23 04:11:23 +0200 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2021-11-16 22:11:32 +0100 |
commit | 172d4f1e3b08901548ae1d2e7e476f97e8032585 (patch) | |
tree | 441a7a7c64ab4b02ee0f4202f73f77121fbcad4f /src | |
parent | OpenGlTextureCache: Fix state invalidation on rescaling. (diff) | |
download | yuzu-172d4f1e3b08901548ae1d2e7e476f97e8032585.tar yuzu-172d4f1e3b08901548ae1d2e7e476f97e8032585.tar.gz yuzu-172d4f1e3b08901548ae1d2e7e476f97e8032585.tar.bz2 yuzu-172d4f1e3b08901548ae1d2e7e476f97e8032585.tar.lz yuzu-172d4f1e3b08901548ae1d2e7e476f97e8032585.tar.xz yuzu-172d4f1e3b08901548ae1d2e7e476f97e8032585.tar.zst yuzu-172d4f1e3b08901548ae1d2e7e476f97e8032585.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 83 | ||||
-rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.h | 2 |
2 files changed, 28 insertions, 57 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 6e7f66ef0..6841b5450 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -883,7 +883,7 @@ void Image::CopyImageToBuffer(const VideoCommon::BufferImageCopy& copy, size_t b } } -bool Image::Scale(bool up_scale) { +void Image::Scale(bool up_scale) { const auto format_type = GetFormatType(info.format); const GLenum attachment = [format_type] { switch (format_type) { @@ -942,77 +942,54 @@ bool Image::Scale(bool up_scale) { dst_info.size.height = scaled_height; upscaled_backup = MakeImage(dst_info, gl_internal_format); } - auto& state_tracker = runtime->GetStateTracker(); - state_tracker.NotifyViewport0(); - state_tracker.NotifyScissor0(); + const u32 src_width = up_scale ? original_width : scaled_width; + const u32 src_height = up_scale ? original_height : scaled_height; + const u32 dst_width = up_scale ? scaled_width : original_width; + const u32 dst_height = up_scale ? scaled_height : original_height; + const auto src_handle = up_scale ? texture.handle : upscaled_backup.handle; + const auto dst_handle = up_scale ? upscaled_backup.handle : texture.handle; + // TODO (ameerj): Investigate other GL states that affect blitting. - GLboolean scissor_test; - glGetBooleani_v(GL_SCISSOR_TEST, 0, &scissor_test); glDisablei(GL_SCISSOR_TEST, 0); - if (up_scale) { - glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(scaled_width), - static_cast<GLfloat>(scaled_height)); - } else { - glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(original_width), - static_cast<GLfloat>(original_height)); - } - + glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(dst_width), + static_cast<GLfloat>(dst_height)); const GLuint read_fbo = runtime->rescale_read_fbos[fbo_index].handle; const GLuint draw_fbo = runtime->rescale_draw_fbos[fbo_index].handle; for (s32 layer = 0; layer < info.resources.layers; ++layer) { for (s32 level = 0; level < info.resources.levels; ++level) { - const u32 src_level_width = - std::max(1u, (up_scale ? original_width : scaled_width) >> level); - const u32 src_level_height = - std::max(1u, (up_scale ? original_height : scaled_height) >> level); - const u32 dst_level_width = - std::max(1u, (up_scale ? scaled_width : original_width) >> level); - const u32 dst_level_height = - std::max(1u, (up_scale ? scaled_height : original_height) >> level); - - if (up_scale) { - glNamedFramebufferTextureLayer(read_fbo, attachment, texture.handle, level, layer); - glNamedFramebufferTextureLayer(draw_fbo, attachment, upscaled_backup.handle, level, - layer); - } else { - glNamedFramebufferTextureLayer(read_fbo, attachment, upscaled_backup.handle, level, - layer); - glNamedFramebufferTextureLayer(draw_fbo, attachment, texture.handle, level, layer); - } + const u32 src_level_width = std::max(1u, src_width >> level); + const u32 src_level_height = std::max(1u, src_height >> level); + const u32 dst_level_width = std::max(1u, dst_width >> level); + const u32 dst_level_height = std::max(1u, dst_height >> level); + + glNamedFramebufferTextureLayer(read_fbo, attachment, src_handle, level, layer); + glNamedFramebufferTextureLayer(draw_fbo, attachment, dst_handle, level, layer); glBlitNamedFramebuffer(read_fbo, draw_fbo, 0, 0, src_level_width, src_level_height, 0, 0, dst_level_width, dst_level_height, mask, filter); } } - if (scissor_test != GL_FALSE) { - glEnablei(GL_SCISSOR_TEST, 0); - } - if (up_scale) { - current_texture = upscaled_backup.handle; - } else { - current_texture = texture.handle; - } - - return true; + current_texture = dst_handle; + auto& state_tracker = runtime->GetStateTracker(); + state_tracker.NotifyViewport0(); + state_tracker.NotifyScissor0(); } bool Image::ScaleUp(bool ignore) { if (True(flags & ImageFlagBits::Rescaled)) { return false; } - flags |= ImageFlagBits::Rescaled; - if (!runtime->resolution.active) { - return false; - } if (gl_format == 0 && gl_type == 0) { // compressed textures - flags &= ~ImageFlagBits::Rescaled; return false; } if (info.type == ImageType::Linear) { UNREACHABLE(); - flags &= ~ImageFlagBits::Rescaled; + return false; + } + flags |= ImageFlagBits::Rescaled; + if (!runtime->resolution.active) { return false; } has_scaled = true; @@ -1020,10 +997,7 @@ bool Image::ScaleUp(bool ignore) { current_texture = upscaled_backup.handle; return true; } - if (!Scale()) { - flags &= ~ImageFlagBits::Rescaled; - return false; - } + Scale(true); return true; } @@ -1039,10 +1013,7 @@ bool Image::ScaleDown(bool ignore) { current_texture = texture.handle; return true; } - if (!Scale(false)) { - flags &= ~ImageFlagBits::Rescaled; - return false; - } + Scale(false); return true; } diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index 8161e6b72..c51a7428d 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -209,7 +209,7 @@ private: void CopyImageToBuffer(const VideoCommon::BufferImageCopy& copy, size_t buffer_offset); - bool Scale(bool up_scale = true); + void Scale(bool up_scale); OGLTexture texture; OGLTexture upscaled_backup; |