diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index f5baa5f068..9e6dac4e0c 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -492,6 +492,7 @@ target_sources(rpcs3_emu PRIVATE RSX/GL/GLPipelineCompiler.cpp RSX/GL/GLPresent.cpp RSX/GL/GLRenderTargets.cpp + RSX/GL/GLResolveHelper.cpp RSX/GL/GLShaderInterpreter.cpp RSX/GL/GLTexture.cpp RSX/GL/GLTextureCache.cpp diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index 20da00944f..e36b47ab8b 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -259,6 +259,10 @@ OPENGL_PROC(PFNGLTEXSTORAGE1DPROC, TexStorage1D); OPENGL_PROC(PFNGLTEXSTORAGE2DPROC, TexStorage2D); OPENGL_PROC(PFNGLTEXSTORAGE3DPROC, TexStorage3D); +// ARB_texture_multisample +OPENGL_PROC(PFNGLTEXSTORAGE2DMULTISAMPLEPROC, TexStorage2DMultisample); +OPENGL_PROC(PFNGLTEXSTORAGE3DMULTISAMPLEPROC, TexStorage3DMultisample); + // Texture_View OPENGL_PROC(PFNGLTEXTUREVIEWPROC, TextureView); diff --git a/rpcs3/Emu/RSX/GL/GLResolveHelper.cpp b/rpcs3/Emu/RSX/GL/GLResolveHelper.cpp new file mode 100644 index 0000000000..23f96e74aa --- /dev/null +++ b/rpcs3/Emu/RSX/GL/GLResolveHelper.cpp @@ -0,0 +1,15 @@ +#include "stdafx.h" +#include "GLResolveHelper.h" + +namespace gl +{ + void resolve_image(gl::command_context& cmd, gl::viewable_image* dst, gl::viewable_image* src) + { + // TODO + } + + void unresolve_image(gl::command_context& cmd, gl::viewable_image* dst, gl::viewable_image* src) + { + // TODO + } +} diff --git a/rpcs3/Emu/RSX/GL/GLResolveHelper.h b/rpcs3/Emu/RSX/GL/GLResolveHelper.h new file mode 100644 index 0000000000..1a0bd05e80 --- /dev/null +++ b/rpcs3/Emu/RSX/GL/GLResolveHelper.h @@ -0,0 +1,10 @@ +#pragma once + +#include "GLCompute.h" +#include "GLOverlays.h" + +namespace gl +{ + void resolve_image(gl::command_context& cmd, gl::viewable_image* dst, gl::viewable_image* src); + void unresolve_image(gl::command_context& cmd, gl::viewable_image* dst, gl::viewable_image* src); +} diff --git a/rpcs3/Emu/RSX/GL/glutils/image.cpp b/rpcs3/Emu/RSX/GL/glutils/image.cpp index 93233c0ade..6d9e0b2b80 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/image.cpp @@ -21,6 +21,22 @@ namespace gl texture::texture(GLenum target, GLuint width, GLuint height, GLuint depth, GLuint mipmaps, GLubyte samples, GLenum sized_format, rsx::format_class format_class) { + // Upgrade targets for MSAA + if (samples > 1) + { + switch (target) + { + case GL_TEXTURE_2D: + target = GL_TEXTURE_2D_MULTISAMPLE; + break; + case GL_TEXTURE_2D_ARRAY: + target = GL_TEXTURE_2D_MULTISAMPLE_ARRAY; + break; + default: + fmt::throw_exception("MSAA is only supported on 2D images. Target=0x%x", target); + } + } + glGenTextures(1, &m_id); // Must bind to initialize the new texture @@ -40,10 +56,19 @@ namespace gl glTexStorage2D(target, mipmaps, storage_fmt, width, height); depth = 1; break; + case GL_TEXTURE_2D_MULTISAMPLE: + ensure(mipmaps == 1); + glTexStorage2DMultisample(target, samples, storage_fmt, width, height, GL_TRUE); + depth = 1; + break; case GL_TEXTURE_3D: case GL_TEXTURE_2D_ARRAY: glTexStorage3D(target, mipmaps, storage_fmt, width, height, depth); break; + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: + ensure(mipmaps == 1); + glTexStorage3DMultisample(target, samples, storage_fmt, width, height, depth, GL_TRUE); + break; case GL_TEXTURE_BUFFER: break; } @@ -149,6 +174,8 @@ namespace gl void texture::copy_from(const void* src, texture::format format, texture::type type, int level, const coord3u region, const pixel_unpack_settings& pixel_settings) { + ensure(m_samples == 1, "Transfer operations are unsupported on multisampled textures."); + pixel_settings.apply(); switch (const auto target_ = static_cast(m_target)) @@ -193,6 +220,8 @@ namespace gl void texture::copy_from(buffer& buf, u32 gl_format_type, u32 offset, u32 length) { + ensure(m_samples == 1, "Transfer operations are unsupported on multisampled textures."); + if (get_target() != target::textureBuffer) fmt::throw_exception("OpenGL error: texture cannot copy from buffer"); @@ -206,6 +235,8 @@ namespace gl void texture::copy_to(void* dst, texture::format format, texture::type type, int level, const coord3u& region, const pixel_pack_settings& pixel_settings) const { + ensure(m_samples == 1, "Transfer operations are unsupported on multisampled textures."); + pixel_settings.apply(); const auto& caps = get_driver_caps(); diff --git a/rpcs3/GLGSRender.vcxproj b/rpcs3/GLGSRender.vcxproj index 013888ead4..9fbbaa3d2a 100644 --- a/rpcs3/GLGSRender.vcxproj +++ b/rpcs3/GLGSRender.vcxproj @@ -60,6 +60,7 @@ + @@ -95,6 +96,7 @@ + diff --git a/rpcs3/GLGSRender.vcxproj.filters b/rpcs3/GLGSRender.vcxproj.filters index 28670f9bb5..dca3a91380 100644 --- a/rpcs3/GLGSRender.vcxproj.filters +++ b/rpcs3/GLGSRender.vcxproj.filters @@ -48,6 +48,7 @@ upscalers\fsr1 + @@ -120,6 +121,7 @@ upscalers +