From e26d9f7c35b0a84e6ae7181e0a6b9bf7568dea7b Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 12 Dec 2015 13:00:08 +0100 Subject: [PATCH] MSAA: Store samples in ini files. --- Source/Core/DolphinWX/VideoConfigDiag.cpp | 16 +++-- Source/Core/DolphinWX/VideoConfigDiag.h | 2 +- Source/Core/VideoBackends/D3D/D3DBase.cpp | 16 +++-- Source/Core/VideoBackends/D3D/D3DBase.h | 1 - .../VideoBackends/D3D/FramebufferManager.cpp | 10 +-- .../VideoBackends/D3D/PixelShaderCache.cpp | 20 +++--- Source/Core/VideoBackends/D3D/Render.cpp | 8 +-- Source/Core/VideoBackends/OGL/Render.cpp | 64 +++++-------------- Source/Core/VideoCommon/PixelShaderGen.cpp | 4 +- Source/Core/VideoCommon/ShaderGenCommon.h | 2 +- Source/Core/VideoCommon/VideoConfig.cpp | 14 ++-- Source/Core/VideoCommon/VideoConfig.h | 2 +- 12 files changed, 68 insertions(+), 91 deletions(-) diff --git a/Source/Core/DolphinWX/VideoConfigDiag.cpp b/Source/Core/DolphinWX/VideoConfigDiag.cpp index de206ab4fe..ee1a1b864d 100644 --- a/Source/Core/DolphinWX/VideoConfigDiag.cpp +++ b/Source/Core/DolphinWX/VideoConfigDiag.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include #include #include #include @@ -772,11 +773,11 @@ void VideoConfigDiag::PopulateAAList() } } - int selected_mode_index = vconfig.iMultisampleMode; + int selected_mode_index = 0; - // Don't go out of range - if (selected_mode_index >= aa_modes.size()) - return; + auto index = std::find(aa_modes.begin(), aa_modes.end(), vconfig.iMultisamples); + if (index != aa_modes.end()) + selected_mode_index = index - aa_modes.begin(); // Select one of the SSAA modes at the end of the list if SSAA is enabled if (supports_ssaa && vconfig.bSSAA && aa_modes[selected_mode_index] != 1) @@ -787,11 +788,14 @@ void VideoConfigDiag::PopulateAAList() void VideoConfigDiag::OnAAChanged(wxCommandEvent& ev) { - int mode = ev.GetInt(); + size_t mode = ev.GetInt(); ev.Skip(); vconfig.bSSAA = mode > m_msaa_modes; mode -= vconfig.bSSAA * m_msaa_modes; - vconfig.iMultisampleMode = mode; + if (mode >= vconfig.backend_info.AAModes.size()) + return; + + vconfig.iMultisamples = vconfig.backend_info.AAModes[mode]; } diff --git a/Source/Core/DolphinWX/VideoConfigDiag.h b/Source/Core/DolphinWX/VideoConfigDiag.h index eb4d7f583a..d2c7ef9d43 100644 --- a/Source/Core/DolphinWX/VideoConfigDiag.h +++ b/Source/Core/DolphinWX/VideoConfigDiag.h @@ -279,5 +279,5 @@ protected: VideoConfig &vconfig; std::string ininame; - int m_msaa_modes; + size_t m_msaa_modes; }; diff --git a/Source/Core/VideoBackends/D3D/D3DBase.cpp b/Source/Core/VideoBackends/D3D/D3DBase.cpp index 07d5888ee6..fa0a0adf06 100644 --- a/Source/Core/VideoBackends/D3D/D3DBase.cpp +++ b/Source/Core/VideoBackends/D3D/D3DBase.cpp @@ -2,6 +2,8 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include + #include "Common/StringUtil.h" #include "VideoBackends/D3D/D3DBase.h" #include "VideoBackends/D3D/D3DState.h" @@ -199,11 +201,6 @@ D3D_FEATURE_LEVEL GetFeatureLevel(IDXGIAdapter* adapter) return feat_level; } -DXGI_SAMPLE_DESC GetAAMode(int index) -{ - return aa_modes[index]; -} - HRESULT Create(HWND wnd) { hWnd = wnd; @@ -258,9 +255,14 @@ HRESULT Create(HWND wnd) // get supported AA modes aa_modes = EnumAAModes(adapter); - if (g_Config.iMultisampleMode >= (int)aa_modes.size()) + + if (std::find_if( + aa_modes.begin(), + aa_modes.end(), + [](const DXGI_SAMPLE_DESC& desc) {return desc.Count == g_Config.iMultisamples;} + ) == aa_modes.end()) { - g_Config.iMultisampleMode = 0; + g_Config.iMultisamples = 1; UpdateActiveConfig(); } diff --git a/Source/Core/VideoBackends/D3D/D3DBase.h b/Source/Core/VideoBackends/D3D/D3DBase.h index 51e4a8bf0a..4647f1e3a0 100644 --- a/Source/Core/VideoBackends/D3D/D3DBase.h +++ b/Source/Core/VideoBackends/D3D/D3DBase.h @@ -33,7 +33,6 @@ void UnloadD3DCompiler(); D3D_FEATURE_LEVEL GetFeatureLevel(IDXGIAdapter* adapter); std::vector EnumAAModes(IDXGIAdapter* adapter); -DXGI_SAMPLE_DESC GetAAMode(int index); HRESULT Create(HWND wnd); void Close(); diff --git a/Source/Core/VideoBackends/D3D/FramebufferManager.cpp b/Source/Core/VideoBackends/D3D/FramebufferManager.cpp index f9f798f262..c4881ec0f2 100644 --- a/Source/Core/VideoBackends/D3D/FramebufferManager.cpp +++ b/Source/Core/VideoBackends/D3D/FramebufferManager.cpp @@ -30,7 +30,7 @@ ID3D11Texture2D* &FramebufferManager::GetEFBDepthStagingBuffer() { return m_efb. D3DTexture2D* &FramebufferManager::GetResolvedEFBColorTexture() { - if (g_ActiveConfig.iMultisampleMode) + if (g_ActiveConfig.iMultisamples > 1) { for (int i = 0; i < m_efb.slices; i++) D3D::context->ResolveSubresource(m_efb.resolved_color_tex->GetTex(), D3D11CalcSubresource(0, i, 1), m_efb.color_tex->GetTex(), D3D11CalcSubresource(0, i, 1), DXGI_FORMAT_R8G8B8A8_UNORM); @@ -42,7 +42,7 @@ D3DTexture2D* &FramebufferManager::GetResolvedEFBColorTexture() D3DTexture2D* &FramebufferManager::GetResolvedEFBDepthTexture() { - if (g_ActiveConfig.iMultisampleMode) + if (g_ActiveConfig.iMultisamples > 1) { for (int i = 0; i < m_efb.slices; i++) D3D::context->ResolveSubresource(m_efb.resolved_depth_tex->GetTex(), D3D11CalcSubresource(0, i, 1), m_efb.depth_tex->GetTex(), D3D11CalcSubresource(0, i, 1), DXGI_FORMAT_R24_UNORM_X8_TYPELESS); @@ -64,7 +64,9 @@ FramebufferManager::FramebufferManager() { m_target_width = 1; } - DXGI_SAMPLE_DESC sample_desc = D3D::GetAAMode(g_ActiveConfig.iMultisampleMode); + DXGI_SAMPLE_DESC sample_desc; + sample_desc.Count = g_ActiveConfig.iMultisamples; + sample_desc.Quality = 0; ID3D11Texture2D* buf; D3D11_TEXTURE2D_DESC texdesc; @@ -125,7 +127,7 @@ FramebufferManager::FramebufferManager() CHECK(hr==S_OK, "create EFB depth staging buffer (hr=%#x)", hr); D3D::SetDebugObjectName((ID3D11DeviceChild*)m_efb.depth_staging_buf, "EFB depth staging texture (used for Renderer::AccessEFB)"); - if (g_ActiveConfig.iMultisampleMode) + if (g_ActiveConfig.iMultisamples > 1) { // Framebuffer resolve textures (color+depth) texdesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8G8B8A8_UNORM, m_target_width, m_target_height, m_efb.slices, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DEFAULT, 0, 1); diff --git a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp index d1013c5539..136d74a5b3 100644 --- a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp @@ -287,7 +287,7 @@ const char reint_rgb8_to_rgba6_msaa[] = { ID3D11PixelShader* PixelShaderCache::ReinterpRGBA6ToRGB8(bool multisampled) { - if (!multisampled || D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count == 1) + if (!multisampled || g_ActiveConfig.iMultisamples <= 1) { if (!s_rgba6_to_rgb8[0]) { @@ -300,7 +300,7 @@ ID3D11PixelShader* PixelShaderCache::ReinterpRGBA6ToRGB8(bool multisampled) else if (!s_rgba6_to_rgb8[1]) { // create MSAA shader for current AA mode - std::string buf = StringFromFormat(reint_rgba6_to_rgb8_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); + std::string buf = StringFromFormat(reint_rgba6_to_rgb8_msaa, g_ActiveConfig.iMultisamples); s_rgba6_to_rgb8[1] = D3D::CompileAndCreatePixelShader(buf); CHECK(s_rgba6_to_rgb8[1], "Create RGBA6 to RGB8 MSAA pixel shader"); @@ -311,7 +311,7 @@ ID3D11PixelShader* PixelShaderCache::ReinterpRGBA6ToRGB8(bool multisampled) ID3D11PixelShader* PixelShaderCache::ReinterpRGB8ToRGBA6(bool multisampled) { - if (!multisampled || D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count == 1) + if (!multisampled || g_ActiveConfig.iMultisamples <= 1) { if (!s_rgb8_to_rgba6[0]) { @@ -324,7 +324,7 @@ ID3D11PixelShader* PixelShaderCache::ReinterpRGB8ToRGBA6(bool multisampled) else if (!s_rgb8_to_rgba6[1]) { // create MSAA shader for current AA mode - std::string buf = StringFromFormat(reint_rgb8_to_rgba6_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); + std::string buf = StringFromFormat(reint_rgb8_to_rgba6_msaa, g_ActiveConfig.iMultisamples); s_rgb8_to_rgba6[1] = D3D::CompileAndCreatePixelShader(buf); CHECK(s_rgb8_to_rgba6[1], "Create RGB8 to RGBA6 MSAA pixel shader"); @@ -335,7 +335,7 @@ ID3D11PixelShader* PixelShaderCache::ReinterpRGB8ToRGBA6(bool multisampled) ID3D11PixelShader* PixelShaderCache::GetColorCopyProgram(bool multisampled) { - if (!multisampled || D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count == 1) + if (!multisampled || g_ActiveConfig.iMultisamples <= 1) { return s_ColorCopyProgram[0]; } @@ -346,7 +346,7 @@ ID3D11PixelShader* PixelShaderCache::GetColorCopyProgram(bool multisampled) else { // create MSAA shader for current AA mode - std::string buf = StringFromFormat(color_copy_program_code_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); + std::string buf = StringFromFormat(color_copy_program_code_msaa, g_ActiveConfig.iMultisamples); s_ColorCopyProgram[1] = D3D::CompileAndCreatePixelShader(buf); CHECK(s_ColorCopyProgram[1]!=nullptr, "Create color copy MSAA pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ColorCopyProgram[1], "color copy MSAA pixel shader"); @@ -356,7 +356,7 @@ ID3D11PixelShader* PixelShaderCache::GetColorCopyProgram(bool multisampled) ID3D11PixelShader* PixelShaderCache::GetColorMatrixProgram(bool multisampled) { - if (!multisampled || D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count == 1) + if (!multisampled || g_ActiveConfig.iMultisamples <= 1) { return s_ColorMatrixProgram[0]; } @@ -367,7 +367,7 @@ ID3D11PixelShader* PixelShaderCache::GetColorMatrixProgram(bool multisampled) else { // create MSAA shader for current AA mode - std::string buf = StringFromFormat(color_matrix_program_code_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); + std::string buf = StringFromFormat(color_matrix_program_code_msaa, g_ActiveConfig.iMultisamples); s_ColorMatrixProgram[1] = D3D::CompileAndCreatePixelShader(buf); CHECK(s_ColorMatrixProgram[1]!=nullptr, "Create color matrix MSAA pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_ColorMatrixProgram[1], "color matrix MSAA pixel shader"); @@ -377,7 +377,7 @@ ID3D11PixelShader* PixelShaderCache::GetColorMatrixProgram(bool multisampled) ID3D11PixelShader* PixelShaderCache::GetDepthMatrixProgram(bool multisampled) { - if (!multisampled || D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count == 1) + if (!multisampled || g_ActiveConfig.iMultisamples <= 1) { return s_DepthMatrixProgram[0]; } @@ -388,7 +388,7 @@ ID3D11PixelShader* PixelShaderCache::GetDepthMatrixProgram(bool multisampled) else { // create MSAA shader for current AA mode - std::string buf = StringFromFormat(depth_matrix_program_msaa, D3D::GetAAMode(g_ActiveConfig.iMultisampleMode).Count); + std::string buf = StringFromFormat(depth_matrix_program_msaa, g_ActiveConfig.iMultisamples); s_DepthMatrixProgram[1] = D3D::CompileAndCreatePixelShader(buf); CHECK(s_DepthMatrixProgram[1]!=nullptr, "Create depth matrix MSAA pixel shader"); D3D::SetDebugObjectName((ID3D11DeviceChild*)s_DepthMatrixProgram[1], "depth matrix MSAA pixel shader"); diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index 95bfb1f0bd..970a7e5bea 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -42,7 +42,7 @@ namespace DX11 { -static u32 s_last_multisample_mode = 0; +static u32 s_last_multisamples = 1; static bool s_last_stereo_mode = false; static bool s_last_xfb_mode = false; @@ -246,7 +246,7 @@ Renderer::Renderer(void *&window_handle) UpdateDrawRectangle(s_backbuffer_width, s_backbuffer_height); - s_last_multisample_mode = g_ActiveConfig.iMultisampleMode; + s_last_multisamples = g_ActiveConfig.iMultisamples; s_last_efb_scale = g_ActiveConfig.iEFBScale; s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0; s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; @@ -958,11 +958,11 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co windowResized || fullscreen_changed || s_last_efb_scale != g_ActiveConfig.iEFBScale || - s_last_multisample_mode != g_ActiveConfig.iMultisampleMode || + s_last_multisamples != g_ActiveConfig.iMultisamples || s_last_stereo_mode != (g_ActiveConfig.iStereoMode > 0)) { s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; - s_last_multisample_mode = g_ActiveConfig.iMultisampleMode; + s_last_multisamples = g_ActiveConfig.iMultisamples; PixelShaderCache::InvalidateMSAAShaders(); if (windowResized || fullscreen_changed) diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 86c3bcb492..4720925304 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -66,14 +66,6 @@ static int OSDInternalW, OSDInternalH; namespace OGL { -enum MultisampleMode -{ - MULTISAMPLE_OFF, - MULTISAMPLE_2X, - MULTISAMPLE_4X, - MULTISAMPLE_8X, -}; - VideoConfig g_ogl_config; // Declarations and definitions @@ -82,7 +74,7 @@ static RasterFont* s_pfont = nullptr; // 1 for no MSAA. Use s_MSAASamples > 1 to check for MSAA. static int s_MSAASamples = 1; -static int s_last_multisample_mode = 0; +static int s_last_multisamples = 1; static bool s_last_stereo_mode = false; static bool s_last_xfb_mode = false; @@ -98,38 +90,6 @@ static bool s_efbCacheValid[2][EFB_CACHE_WIDTH * EFB_CACHE_HEIGHT]; static bool s_efbCacheIsCleared = false; static std::vector s_efbCache[2][EFB_CACHE_WIDTH * EFB_CACHE_HEIGHT]; // 2 for PEEK_Z and PEEK_COLOR -static int GetNumMSAASamples(int MSAAMode) -{ - int samples; - switch (MSAAMode) - { - case MULTISAMPLE_OFF: - samples = 1; - break; - - case MULTISAMPLE_2X: - samples = 2; - break; - - case MULTISAMPLE_4X: - samples = 4; - break; - - case MULTISAMPLE_8X: - samples = 8; - break; - default: - samples = 1; - } - - if (samples <= g_ogl_config.max_samples) - return samples; - - // TODO: move this to InitBackendInfo - OSD::AddMessage(StringFromFormat("%d Anti Aliasing samples selected, but only %d supported by your GPU.", samples, g_ogl_config.max_samples), 10000); - return g_ogl_config.max_samples; -} - static void GLAPIENTRY ErrorCallback( GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* message, const void* userParam) { const char *s_source; @@ -492,11 +452,11 @@ Renderer::Renderer() g_Config.backend_info.bSupportsBBox = true; g_ogl_config.bSupportsMSAA = true; g_ogl_config.bSupports2DTextureStorage = true; - if (g_ActiveConfig.iStereoMode > 0 && g_ActiveConfig.iMultisampleMode > 1 && !g_ogl_config.bSupports3DTextureStorage) + if (g_ActiveConfig.iStereoMode > 0 && g_ActiveConfig.iMultisamples > 1 && !g_ogl_config.bSupports3DTextureStorage) { // GLES 3.1 can't support stereo rendering and MSAA OSD::AddMessage("MSAA Stereo rendering isn't supported by your GPU.", 10000); - g_ActiveConfig.iMultisampleMode = 1; + g_ActiveConfig.iMultisamples = 1; } } else @@ -628,8 +588,8 @@ Renderer::Renderer() g_ogl_config.bSupportsCopySubImage ? "" : "CopyImageSubData " ); - s_last_multisample_mode = g_ActiveConfig.iMultisampleMode; - s_MSAASamples = GetNumMSAASamples(s_last_multisample_mode); + s_last_multisamples = g_ActiveConfig.iMultisamples; + s_MSAASamples = s_last_multisamples; s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0; s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; @@ -1536,18 +1496,24 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co TargetSizeChanged = true; } if (TargetSizeChanged || xfbchanged || WindowResized || - (s_last_multisample_mode != g_ActiveConfig.iMultisampleMode) || (s_last_stereo_mode != (g_ActiveConfig.iStereoMode > 0))) + (s_last_multisamples != g_ActiveConfig.iMultisamples) || (s_last_stereo_mode != (g_ActiveConfig.iStereoMode > 0))) { s_last_xfb_mode = g_ActiveConfig.bUseRealXFB; UpdateDrawRectangle(s_backbuffer_width, s_backbuffer_height); if (TargetSizeChanged || - s_last_multisample_mode != g_ActiveConfig.iMultisampleMode || s_last_stereo_mode != (g_ActiveConfig.iStereoMode > 0)) + s_last_multisamples != g_ActiveConfig.iMultisamples || s_last_stereo_mode != (g_ActiveConfig.iStereoMode > 0)) { s_last_stereo_mode = g_ActiveConfig.iStereoMode > 0; - s_last_multisample_mode = g_ActiveConfig.iMultisampleMode; - s_MSAASamples = GetNumMSAASamples(s_last_multisample_mode); + s_last_multisamples = g_ActiveConfig.iMultisamples; + s_MSAASamples = s_last_multisamples; + + if (s_MSAASamples > 1 && s_MSAASamples > g_ogl_config.max_samples) + { + s_MSAASamples = g_ogl_config.max_samples; + OSD::AddMessage(StringFromFormat("%d Anti Aliasing samples selected, but only %d supported by your GPU.", s_last_multisamples, g_ogl_config.max_samples), 10000); + } delete g_framebuffer_manager; g_framebuffer_manager = new FramebufferManager(s_target_width, s_target_height, diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index 4254334d6c..3439481da5 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -347,8 +347,8 @@ static inline T GeneratePixelShader(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType warn_once = false; } - uid_data->msaa = g_ActiveConfig.iMultisampleMode > 0; - uid_data->ssaa = g_ActiveConfig.iMultisampleMode > 0 && g_ActiveConfig.bSSAA; + uid_data->msaa = g_ActiveConfig.iMultisamples > 1; + uid_data->ssaa = g_ActiveConfig.iMultisamples > 1 && g_ActiveConfig.bSSAA; if (ApiType == API_OPENGL) { out.Write("out vec4 ocol0;\n"); diff --git a/Source/Core/VideoCommon/ShaderGenCommon.h b/Source/Core/VideoCommon/ShaderGenCommon.h index ece50e6c38..11c4e2870e 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/ShaderGenCommon.h @@ -295,7 +295,7 @@ static inline void AssignVSOutputMembers(T& object, const char* a, const char* b // Without MSAA, this flag is defined to have no effect. static inline const char* GetInterpolationQualifier(API_TYPE api_type, bool in = true, bool in_out = false) { - if (!g_ActiveConfig.iMultisampleMode) + if (g_ActiveConfig.iMultisamples <= 1) return ""; if (!g_ActiveConfig.bSSAA) diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index 874e8f2ddb..280b3d9f74 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include #include #include "Common/CommonTypes.h" @@ -76,7 +77,7 @@ void VideoConfig::Load(const std::string& ini_file) settings->Get("UseFFV1", &bUseFFV1, 0); settings->Get("EnablePixelLighting", &bEnablePixelLighting, 0); settings->Get("FastDepthCalc", &bFastDepthCalc, true); - settings->Get("MSAA", &iMultisampleMode, 0); + settings->Get("MSAA", &iMultisamples, 1); settings->Get("SSAA", &bSSAA, false); settings->Get("EFBScale", &iEFBScale, (int)SCALE_1X); // native settings->Get("TexFmtOverlayEnable", &bTexFmtOverlayEnable, 0); @@ -169,7 +170,7 @@ void VideoConfig::GameIniLoad() CHECK_SETTING("Video_Settings", "CacheHiresTextures", bCacheHiresTextures); CHECK_SETTING("Video_Settings", "EnablePixelLighting", bEnablePixelLighting); CHECK_SETTING("Video_Settings", "FastDepthCalc", bFastDepthCalc); - CHECK_SETTING("Video_Settings", "MSAA", iMultisampleMode); + CHECK_SETTING("Video_Settings", "MSAA", iMultisamples); CHECK_SETTING("Video_Settings", "SSAA", bSSAA); int tmp = -9000; @@ -245,8 +246,11 @@ void VideoConfig::GameIniLoad() void VideoConfig::VerifyValidity() { // TODO: Check iMaxAnisotropy value - if (iAdapter < 0 || iAdapter > ((int)backend_info.Adapters.size() - 1)) iAdapter = 0; - if (iMultisampleMode < 0 || iMultisampleMode >= (int)backend_info.AAModes.size()) iMultisampleMode = 0; + if (iAdapter < 0 || iAdapter > ((int)backend_info.Adapters.size() - 1)) + iAdapter = 0; + + if (std::find(backend_info.AAModes.begin(), backend_info.AAModes.end(), iMultisamples) == backend_info.AAModes.end()) + iMultisamples = 1; if (iStereoMode > 0) { @@ -293,7 +297,7 @@ void VideoConfig::Save(const std::string& ini_file) settings->Set("UseFFV1", bUseFFV1); settings->Set("EnablePixelLighting", bEnablePixelLighting); settings->Set("FastDepthCalc", bFastDepthCalc); - settings->Set("MSAA", iMultisampleMode); + settings->Set("MSAA", iMultisamples); settings->Set("SSAA", bSSAA); settings->Set("EFBScale", iEFBScale); settings->Set("TexFmtOverlayEnable", bTexFmtOverlayEnable); diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index e1681ca291..8022ac02a4 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -82,7 +82,7 @@ struct VideoConfig final bool bUseRealXFB; // Enhancements - int iMultisampleMode; + int iMultisamples; bool bSSAA; int iEFBScale; bool bForceFiltering;