From 98a4a18201dd31b9f78fe76c9a2ede6a888eaf7a Mon Sep 17 00:00:00 2001 From: emufan4568 Date: Sun, 11 Sep 2022 12:31:32 +0300 Subject: [PATCH] rasterizer_cache: Fix texture cube blitting * The target was GL_TEXTURE_2D instead of GL_TEXTURE_CUBE_MAP_* --- src/citra_qt/bootmanager.cpp | 1 + src/citra_qt/main.cpp | 8 -------- src/video_core/rasterizer_cache/rasterizer_cache.cpp | 12 +++++++++++- src/video_core/rasterizer_cache/texture_runtime.cpp | 11 ++++++++--- src/video_core/rasterizer_cache/types.h | 2 ++ .../renderer_opengl/gl_resource_manager.cpp | 6 ++++-- src/video_core/renderer_opengl/gl_resource_manager.h | 1 + 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index 0bd461808..43bd98b57 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -116,6 +116,7 @@ public: QSurfaceFormat format; format.setVersion(4, 4); format.setProfile(QSurfaceFormat::CoreProfile); + format.setOption(QSurfaceFormat::DebugContext); // TODO: expose a setting for buffer value (ie default/single/double/triple) format.setSwapBehavior(QSurfaceFormat::DefaultSwapBehavior); format.setSwapInterval(0); diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index 3fb84e3a5..7c7b4291d 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -2426,14 +2426,6 @@ int main(int argc, char* argv[]) { QCoreApplication::setOrganizationName(QStringLiteral("Citra team")); QCoreApplication::setApplicationName(QStringLiteral("Citra")); - QSurfaceFormat format; - format.setVersion(4, 3); - format.setProfile(QSurfaceFormat::CoreProfile); - format.setSwapInterval(0); - // TODO: expose a setting for buffer value (ie default/single/double/triple) - format.setSwapBehavior(QSurfaceFormat::DefaultSwapBehavior); - QSurfaceFormat::setDefaultFormat(format); - #ifdef __APPLE__ std::string bin_path = FileUtil::GetBundleDirectory() + DIR_SEP + ".."; chdir(bin_path.c_str()); diff --git a/src/video_core/rasterizer_cache/rasterizer_cache.cpp b/src/video_core/rasterizer_cache/rasterizer_cache.cpp index c0f8dff6e..1d103c6f7 100644 --- a/src/video_core/rasterizer_cache/rasterizer_cache.cpp +++ b/src/video_core/rasterizer_cache/rasterizer_cache.cpp @@ -83,6 +83,8 @@ void RasterizerCache::CopySurface(const Surface& src_surface, const Surface& dst .surface_type = src_surface->type, .src_level = 0, .dst_level = 0, + .src_layer = 0, + .dst_layer = 0, .src_region = Region2D{ .start = {src_rect.left, src_rect.bottom}, .end = {src_rect.right, src_rect.top} @@ -227,6 +229,8 @@ bool RasterizerCache::BlitSurfaces(const Surface& src_surface, .surface_type = src_surface->type, .src_level = 0, .dst_level = 0, + .src_layer = 0, + .dst_layer = 0, .src_region = Region2D{ .start = {src_rect.left, src_rect.bottom}, .end = {src_rect.right, src_rect.top} @@ -463,6 +467,8 @@ Surface RasterizerCache::GetTextureSurface(const Pica::Texture::TextureInfo& inf .surface_type = surface->type, .src_level = 0, .dst_level = level, + .src_layer = 0, + .dst_layer = 0, .src_region = Region2D{ .start = {src_rect.left, src_rect.bottom}, .end = {src_rect.right, src_rect.top} @@ -552,9 +558,11 @@ const CachedTextureCube& RasterizerCache::GetTextureCube(const TextureCubeConfig const auto src_rect = surface->GetScaledRect(); const TextureBlit texture_blit = { - .surface_type = surface->type, + .surface_type = SurfaceType::Color, .src_level = 0, .dst_level = 0, + .src_layer = 0, + .dst_layer = static_cast(i), .src_region = Region2D{ .start = {src_rect.left, src_rect.bottom}, .end = {src_rect.right, src_rect.top} @@ -885,6 +893,8 @@ bool RasterizerCache::ValidateByReinterpretation(const Surface& surface, .surface_type = type, .src_level = 0, .dst_level = 0, + .src_layer = 0, + .dst_layer = 0, .src_region = Region2D{ .start = {0, 0}, .end = {width, height} diff --git a/src/video_core/rasterizer_cache/texture_runtime.cpp b/src/video_core/rasterizer_cache/texture_runtime.cpp index 4445035d6..50b8f8de0 100644 --- a/src/video_core/rasterizer_cache/texture_runtime.cpp +++ b/src/video_core/rasterizer_cache/texture_runtime.cpp @@ -148,9 +148,14 @@ bool TextureRuntime::BlitTextures(OGLTexture& source, OGLTexture& dest, const Te state.draw.draw_framebuffer = draw_fbo.handle; state.Apply(); - auto BindAttachment = [&blit](GLenum target, u32 src_tex, u32 dst_tex) -> void { - glFramebufferTexture2D(GL_READ_FRAMEBUFFER, target, GL_TEXTURE_2D, src_tex, blit.src_level); - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, target, GL_TEXTURE_2D, dst_tex, blit.dst_level); + auto BindAttachment = [&blit, &source, &dest](GLenum attachment, u32 src_tex, u32 dst_tex) -> void { + const GLenum src_target = source.target == GL_TEXTURE_CUBE_MAP ? + GL_TEXTURE_CUBE_MAP_POSITIVE_X + blit.src_layer : source.target; + const GLenum dst_target = dest.target == GL_TEXTURE_CUBE_MAP ? + GL_TEXTURE_CUBE_MAP_POSITIVE_X + blit.dst_layer : dest.target; + + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, attachment, src_target, src_tex, blit.src_level); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, dst_target, dst_tex, blit.dst_level); }; switch (blit.surface_type) { diff --git a/src/video_core/rasterizer_cache/types.h b/src/video_core/rasterizer_cache/types.h index e7cf5cad6..be85a8c01 100644 --- a/src/video_core/rasterizer_cache/types.h +++ b/src/video_core/rasterizer_cache/types.h @@ -65,6 +65,8 @@ struct TextureBlit { SurfaceType surface_type; u32 src_level; u32 dst_level; + u32 src_layer; + u32 dst_layer; Region2D src_region; Region2D dst_region; }; diff --git a/src/video_core/renderer_opengl/gl_resource_manager.cpp b/src/video_core/renderer_opengl/gl_resource_manager.cpp index 3b531fda0..5e163ce7d 100644 --- a/src/video_core/renderer_opengl/gl_resource_manager.cpp +++ b/src/video_core/renderer_opengl/gl_resource_manager.cpp @@ -52,8 +52,10 @@ void OGLTexture::Release() { handle = 0; } -void OGLTexture::Allocate(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, +void OGLTexture::Allocate(GLenum _target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + target = _target; + GLuint old_tex = OpenGLState::GetCurState().texture_units[0].texture_2d; glActiveTexture(GL_TEXTURE0); glBindTexture(target, handle); @@ -80,7 +82,7 @@ void OGLTexture::Allocate(GLenum target, GLsizei levels, GLenum internalformat, glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, old_tex); + glBindTexture(target, old_tex); } void OGLTexture::CopyFrom(const OGLTexture& other, GLenum target, GLsizei levels, GLsizei width, diff --git a/src/video_core/renderer_opengl/gl_resource_manager.h b/src/video_core/renderer_opengl/gl_resource_manager.h index d6b24262c..a2839993e 100644 --- a/src/video_core/renderer_opengl/gl_resource_manager.h +++ b/src/video_core/renderer_opengl/gl_resource_manager.h @@ -65,6 +65,7 @@ public: GLsizei height); GLuint handle = 0; + GLenum target = GL_TEXTURE_2D; }; class OGLSampler : private NonCopyable {