diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 8b86136e0..6aea375f1 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -478,6 +478,10 @@ TextureCacheRuntime::TextureCacheRuntime(const Device& device_, ProgramManager& | |||
| 478 | if (is_rescaling_on) { | 478 | if (is_rescaling_on) { |
| 479 | rescale_draw_fbo.Create(); | 479 | rescale_draw_fbo.Create(); |
| 480 | rescale_read_fbo.Create(); | 480 | rescale_read_fbo.Create(); |
| 481 | |||
| 482 | // Make sure the framebuffer is created without DSA | ||
| 483 | glBindFramebuffer(GL_READ_FRAMEBUFFER, rescale_draw_fbo.handle); | ||
| 484 | glBindFramebuffer(GL_READ_FRAMEBUFFER, rescale_read_fbo.handle); | ||
| 481 | } | 485 | } |
| 482 | } | 486 | } |
| 483 | 487 | ||
| @@ -882,11 +886,6 @@ bool Image::Scale(bool scale_src, bool scale_dst) { | |||
| 882 | UNIMPLEMENTED(); | 886 | UNIMPLEMENTED(); |
| 883 | return false; | 887 | return false; |
| 884 | } | 888 | } |
| 885 | GLint prev_draw_fbo; | ||
| 886 | GLint prev_read_fbo; | ||
| 887 | glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &prev_draw_fbo); | ||
| 888 | glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &prev_read_fbo); | ||
| 889 | |||
| 890 | const GLenum attachment = [this] { | 889 | const GLenum attachment = [this] { |
| 891 | switch (GetFormatType(info.format)) { | 890 | switch (GetFormatType(info.format)) { |
| 892 | case SurfaceType::ColorTexture: | 891 | case SurfaceType::ColorTexture: |
| @@ -935,10 +934,8 @@ bool Image::Scale(bool scale_src, bool scale_dst) { | |||
| 935 | dst_info.size.height = dst_height; | 934 | dst_info.size.height = dst_height; |
| 936 | auto dst_texture = MakeImage(dst_info, gl_internal_format); | 935 | auto dst_texture = MakeImage(dst_info, gl_internal_format); |
| 937 | 936 | ||
| 938 | const auto& read_fbo = runtime->rescale_read_fbo; | 937 | const GLuint read_fbo = runtime->rescale_read_fbo.handle; |
| 939 | const auto& draw_fbo = runtime->rescale_draw_fbo; | 938 | const GLuint draw_fbo = runtime->rescale_draw_fbo.handle; |
| 940 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, draw_fbo.handle); | ||
| 941 | glBindFramebuffer(GL_READ_FRAMEBUFFER, read_fbo.handle); | ||
| 942 | for (s32 layer = 0; layer < info.resources.layers; ++layer) { | 939 | for (s32 layer = 0; layer < info.resources.layers; ++layer) { |
| 943 | for (s32 level = 0; level < info.resources.levels; ++level) { | 940 | for (s32 level = 0; level < info.resources.levels; ++level) { |
| 944 | const u32 src_level_width = std::max(1u, src_width >> level); | 941 | const u32 src_level_width = std::max(1u, src_width >> level); |
| @@ -946,20 +943,15 @@ bool Image::Scale(bool scale_src, bool scale_dst) { | |||
| 946 | const u32 dst_level_width = std::max(1u, dst_width >> level); | 943 | const u32 dst_level_width = std::max(1u, dst_width >> level); |
| 947 | const u32 dst_level_height = std::max(1u, dst_height >> level); | 944 | const u32 dst_level_height = std::max(1u, dst_height >> level); |
| 948 | 945 | ||
| 949 | glNamedFramebufferTextureLayer(read_fbo.handle, attachment, texture.handle, level, | 946 | glNamedFramebufferTextureLayer(read_fbo, attachment, texture.handle, level, layer); |
| 950 | layer); | 947 | glNamedFramebufferTextureLayer(draw_fbo, attachment, dst_texture.handle, level, layer); |
| 951 | glNamedFramebufferTextureLayer(draw_fbo.handle, attachment, dst_texture.handle, level, | 948 | glBlitNamedFramebuffer(read_fbo, draw_fbo, 0, 0, src_level_width, src_level_height, 0, |
| 952 | layer); | 949 | 0, dst_level_width, dst_level_height, mask, filter); |
| 953 | glBlitNamedFramebuffer(read_fbo.handle, draw_fbo.handle, 0, 0, src_level_width, | 950 | glNamedFramebufferTextureLayer(read_fbo, attachment, 0, level, layer); |
| 954 | src_level_height, 0, 0, dst_level_width, dst_level_height, mask, | 951 | glNamedFramebufferTextureLayer(draw_fbo, attachment, 0, level, layer); |
| 955 | filter); | ||
| 956 | } | 952 | } |
| 957 | } | 953 | } |
| 958 | texture = std::move(dst_texture); | 954 | texture = std::move(dst_texture); |
| 959 | |||
| 960 | // Restore previous framebuffers | ||
| 961 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, prev_draw_fbo); | ||
| 962 | glBindFramebuffer(GL_READ_FRAMEBUFFER, prev_read_fbo); | ||
| 963 | return true; | 955 | return true; |
| 964 | } | 956 | } |
| 965 | 957 | ||