mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Add per game configuration options (#6187)
* common: Move settings to common from core. - Removes a dependency on core and input_common from common. * code: Wrap settings values * Port from yuzu to allow per game settings * citra_qt: Initial per-game settings dialog * citra_qt: Use new API for read/save of config values * citra_qt: Per game audio settings * citra_qt: Per game graphics settings * citra_qt: Per game system settings * citra_qt: Per game general settings * citra_qt: Document and run clang format * citra_qt: Make icon smaller and centered * citra_qt: Remove version number * Not sure how to extract that, can always add it back later * citra_qt: Wrap UISettings * citra_qt: Fix unthottled fps setting * citra_qt: Remove margin in emulation tab * citra_qt: Implement some suggestions * Bring back speed switch hotkey * Allow configuration when game is running * Rename/adjust UI stuff * citra_qt: Fix build with separate windows * citra_qt: Address feedback * citra_qt: Log per-game settings before launching games * citra_qt: Add shader cache options * Also fix android build * citra_qt: Add DLC menu option * citra_qt: Run clang-format * citra_qt: Adjust for time offset * citra_qt: Implement suggestions * Run clang-format Co-authored-by: bunnei <bunneidev@gmail.com>
This commit is contained in:
		
							parent
							
								
									f261daf2fa
								
							
						
					
					
						commit
						48ee112ceb
					
				
					 92 changed files with 3171 additions and 1546 deletions
				
			
		|  | @ -241,8 +241,8 @@ static Surface FindMatch(const SurfaceCache& surface_cache, const SurfaceParams& | |||
| 
 | ||||
| RasterizerCacheOpenGL::RasterizerCacheOpenGL() { | ||||
|     resolution_scale_factor = VideoCore::GetResolutionScaleFactor(); | ||||
|     texture_filterer = std::make_unique<TextureFilterer>(Settings::values.texture_filter_name, | ||||
|                                                          resolution_scale_factor); | ||||
|     texture_filterer = std::make_unique<TextureFilterer>( | ||||
|         Settings::values.texture_filter_name.GetValue(), resolution_scale_factor); | ||||
|     format_reinterpreter = std::make_unique<FormatReinterpreterOpenGL>(); | ||||
|     texture_downloader_es = std::make_unique<TextureDownloaderES>(false); | ||||
| } | ||||
|  | @ -592,7 +592,7 @@ SurfaceSurfaceRect_Tuple RasterizerCacheOpenGL::GetFramebufferSurfaces( | |||
|         resolution_scale_factor != VideoCore::GetResolutionScaleFactor(); | ||||
|     const bool texture_filter_changed = | ||||
|         VideoCore::g_texture_filter_update_requested.exchange(false) && | ||||
|         texture_filterer->Reset(Settings::values.texture_filter_name, | ||||
|         texture_filterer->Reset(Settings::values.texture_filter_name.GetValue(), | ||||
|                                 VideoCore::GetResolutionScaleFactor()); | ||||
| 
 | ||||
|     if (resolution_scale_changed || texture_filter_changed) { | ||||
|  |  | |||
|  | @ -11,10 +11,10 @@ | |||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "common/scm_rev.h" | ||||
| #include "common/settings.h" | ||||
| #include "common/zstd_compression.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/settings.h" | ||||
| #include "video_core/renderer_opengl/gl_shader_disk_cache.h" | ||||
| 
 | ||||
| namespace OpenGL { | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| #include <queue> | ||||
| #include "common/logging/log.h" | ||||
| #include "common/microprofile.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "core/dumping/backend.h" | ||||
| #include "core/frontend/emu_window.h" | ||||
|  | @ -12,7 +13,6 @@ | |||
| #include "core/hw/hw.h" | ||||
| #include "core/hw/lcd.h" | ||||
| #include "core/memory.h" | ||||
| #include "core/settings.h" | ||||
| #include "core/tracer/recorder.h" | ||||
| #include "video_core/debug_utils/debug_utils.h" | ||||
| #include "video_core/rasterizer_interface.h" | ||||
|  | @ -381,7 +381,7 @@ void RendererOpenGL::SwapBuffers() { | |||
|     RenderToMailbox(main_layout, render_window.mailbox, false); | ||||
| 
 | ||||
| #ifndef ANDROID | ||||
|     if (Settings::values.layout_option == Settings::LayoutOption::SeparateWindows) { | ||||
|     if (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows) { | ||||
|         ASSERT(secondary_window); | ||||
|         const auto& secondary_layout = secondary_window->GetFramebufferLayout(); | ||||
|         RenderToMailbox(secondary_layout, secondary_window->mailbox, false); | ||||
|  | @ -618,8 +618,8 @@ void RendererOpenGL::LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color | |||
|  * Initializes the OpenGL state and creates persistent objects. | ||||
|  */ | ||||
| void RendererOpenGL::InitOpenGLObjects() { | ||||
|     glClearColor(Settings::values.bg_red, Settings::values.bg_green, Settings::values.bg_blue, | ||||
|                  0.0f); | ||||
|     glClearColor(Settings::values.bg_red.GetValue(), Settings::values.bg_green.GetValue(), | ||||
|                  Settings::values.bg_blue.GetValue(), 0.0f); | ||||
| 
 | ||||
|     filter_sampler.Create(); | ||||
|     ReloadSampler(); | ||||
|  | @ -685,12 +685,13 @@ void RendererOpenGL::ReloadShader() { | |||
|     if (GLES) { | ||||
|         shader_data += fragment_shader_precision_OES; | ||||
|     } | ||||
|     if (Settings::values.render_3d == Settings::StereoRenderOption::Anaglyph) { | ||||
|         if (Settings::values.pp_shader_name == "dubois (builtin)") { | ||||
| 
 | ||||
|     if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph) { | ||||
|         if (Settings::values.pp_shader_name.GetValue() == "dubois (builtin)") { | ||||
|             shader_data += fragment_shader_anaglyph; | ||||
|         } else { | ||||
|             std::string shader_text = | ||||
|                 OpenGL::GetPostProcessingShaderCode(true, Settings::values.pp_shader_name); | ||||
|             std::string shader_text = OpenGL::GetPostProcessingShaderCode( | ||||
|                 true, Settings::values.pp_shader_name.GetValue()); | ||||
|             if (shader_text.empty()) { | ||||
|                 // Should probably provide some information that the shader couldn't load
 | ||||
|                 shader_data += fragment_shader_anaglyph; | ||||
|  | @ -698,13 +699,14 @@ void RendererOpenGL::ReloadShader() { | |||
|                 shader_data += shader_text; | ||||
|             } | ||||
|         } | ||||
|     } else if (Settings::values.render_3d == Settings::StereoRenderOption::Interlaced || | ||||
|                Settings::values.render_3d == Settings::StereoRenderOption::ReverseInterlaced) { | ||||
|         if (Settings::values.pp_shader_name == "horizontal (builtin)") { | ||||
|     } else if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || | ||||
|                Settings::values.render_3d.GetValue() == | ||||
|                    Settings::StereoRenderOption::ReverseInterlaced) { | ||||
|         if (Settings::values.pp_shader_name.GetValue() == "horizontal (builtin)") { | ||||
|             shader_data += fragment_shader_interlaced; | ||||
|         } else { | ||||
|             std::string shader_text = | ||||
|                 OpenGL::GetPostProcessingShaderCode(false, Settings::values.pp_shader_name); | ||||
|             std::string shader_text = OpenGL::GetPostProcessingShaderCode( | ||||
|                 false, Settings::values.pp_shader_name.GetValue()); | ||||
|             if (shader_text.empty()) { | ||||
|                 // Should probably provide some information that the shader couldn't load
 | ||||
|                 shader_data += fragment_shader_interlaced; | ||||
|  | @ -713,11 +715,11 @@ void RendererOpenGL::ReloadShader() { | |||
|             } | ||||
|         } | ||||
|     } else { | ||||
|         if (Settings::values.pp_shader_name == "none (builtin)") { | ||||
|         if (Settings::values.pp_shader_name.GetValue() == "none (builtin)") { | ||||
|             shader_data += fragment_shader; | ||||
|         } else { | ||||
|             std::string shader_text = | ||||
|                 OpenGL::GetPostProcessingShaderCode(false, Settings::values.pp_shader_name); | ||||
|             std::string shader_text = OpenGL::GetPostProcessingShaderCode( | ||||
|                 false, Settings::values.pp_shader_name.GetValue()); | ||||
|             if (shader_text.empty()) { | ||||
|                 // Should probably provide some information that the shader couldn't load
 | ||||
|                 shader_data += fragment_shader; | ||||
|  | @ -731,16 +733,17 @@ void RendererOpenGL::ReloadShader() { | |||
|     state.Apply(); | ||||
|     uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix"); | ||||
|     uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture"); | ||||
|     if (Settings::values.render_3d == Settings::StereoRenderOption::Anaglyph || | ||||
|         Settings::values.render_3d == Settings::StereoRenderOption::Interlaced || | ||||
|         Settings::values.render_3d == Settings::StereoRenderOption::ReverseInterlaced) { | ||||
|     if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph || | ||||
|         Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || | ||||
|         Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::ReverseInterlaced) { | ||||
|         uniform_color_texture_r = glGetUniformLocation(shader.handle, "color_texture_r"); | ||||
|     } | ||||
|     if (Settings::values.render_3d == Settings::StereoRenderOption::Interlaced || | ||||
|         Settings::values.render_3d == Settings::StereoRenderOption::ReverseInterlaced) { | ||||
|     if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || | ||||
|         Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::ReverseInterlaced) { | ||||
|         GLuint uniform_reverse_interlaced = | ||||
|             glGetUniformLocation(shader.handle, "reverse_interlaced"); | ||||
|         if (Settings::values.render_3d == Settings::StereoRenderOption::ReverseInterlaced) | ||||
|         if (Settings::values.render_3d.GetValue() == | ||||
|             Settings::StereoRenderOption::ReverseInterlaced) | ||||
|             glUniform1i(uniform_reverse_interlaced, 1); | ||||
|         else | ||||
|             glUniform1i(uniform_reverse_interlaced, 0); | ||||
|  | @ -958,8 +961,8 @@ void RendererOpenGL::DrawSingleScreenStereo(const ScreenInfo& screen_info_l, | |||
| void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool flipped) { | ||||
|     if (VideoCore::g_renderer_bg_color_update_requested.exchange(false)) { | ||||
|         // Update background color before drawing
 | ||||
|         glClearColor(Settings::values.bg_red, Settings::values.bg_green, Settings::values.bg_blue, | ||||
|                      0.0f); | ||||
|         glClearColor(Settings::values.bg_red.GetValue(), Settings::values.bg_green.GetValue(), | ||||
|                      Settings::values.bg_blue.GetValue(), 0.0f); | ||||
|     } | ||||
| 
 | ||||
|     if (VideoCore::g_renderer_sampler_update_requested.exchange(false)) { | ||||
|  | @ -989,9 +992,9 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|     glUniform1i(uniform_color_texture, 0); | ||||
| 
 | ||||
|     const bool stereo_single_screen = | ||||
|         Settings::values.render_3d == Settings::StereoRenderOption::Anaglyph || | ||||
|         Settings::values.render_3d == Settings::StereoRenderOption::Interlaced || | ||||
|         Settings::values.render_3d == Settings::StereoRenderOption::ReverseInterlaced; | ||||
|         Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph || | ||||
|         Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || | ||||
|         Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::ReverseInterlaced; | ||||
| 
 | ||||
|     // Bind a second texture for the right eye if in Anaglyph mode
 | ||||
|     if (stereo_single_screen) { | ||||
|  | @ -1001,12 +1004,13 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|     glUniform1i(uniform_layer, 0); | ||||
|     if (layout.top_screen_enabled) { | ||||
|         if (layout.is_rotated) { | ||||
|             if (Settings::values.render_3d == Settings::StereoRenderOption::Off) { | ||||
|             if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Off) { | ||||
|                 int eye = Settings::values.mono_render_left_eye ? 0 : 1; | ||||
|                 DrawSingleScreenRotated(screen_infos[eye], (float)top_screen.left, | ||||
|                                         (float)top_screen.top, (float)top_screen.GetWidth(), | ||||
|                                         (float)top_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::SideBySide) { | ||||
|                 DrawSingleScreenRotated(screen_infos[0], (float)top_screen.left / 2, | ||||
|                                         (float)top_screen.top, (float)top_screen.GetWidth() / 2, | ||||
|                                         (float)top_screen.GetHeight()); | ||||
|  | @ -1015,7 +1019,8 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|                                         ((float)top_screen.left / 2) + ((float)layout.width / 2), | ||||
|                                         (float)top_screen.top, (float)top_screen.GetWidth() / 2, | ||||
|                                         (float)top_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::CardboardVR) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::CardboardVR) { | ||||
|                 DrawSingleScreenRotated(screen_infos[0], layout.top_screen.left, | ||||
|                                         layout.top_screen.top, layout.top_screen.GetWidth(), | ||||
|                                         layout.top_screen.GetHeight()); | ||||
|  | @ -1031,11 +1036,12 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|                     (float)top_screen.GetWidth(), (float)top_screen.GetHeight()); | ||||
|             } | ||||
|         } else { | ||||
|             if (Settings::values.render_3d == Settings::StereoRenderOption::Off) { | ||||
|                 int eye = Settings::values.mono_render_left_eye ? 0 : 1; | ||||
|             if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Off) { | ||||
|                 int eye = Settings::values.mono_render_left_eye.GetValue() ? 0 : 1; | ||||
|                 DrawSingleScreen(screen_infos[eye], (float)top_screen.left, (float)top_screen.top, | ||||
|                                  (float)top_screen.GetWidth(), (float)top_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::SideBySide) { | ||||
|                 DrawSingleScreen(screen_infos[0], (float)top_screen.left / 2, (float)top_screen.top, | ||||
|                                  (float)top_screen.GetWidth() / 2, (float)top_screen.GetHeight()); | ||||
|                 glUniform1i(uniform_layer, 1); | ||||
|  | @ -1043,7 +1049,8 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|                                  ((float)top_screen.left / 2) + ((float)layout.width / 2), | ||||
|                                  (float)top_screen.top, (float)top_screen.GetWidth() / 2, | ||||
|                                  (float)top_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::CardboardVR) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::CardboardVR) { | ||||
|                 DrawSingleScreen(screen_infos[0], layout.top_screen.left, layout.top_screen.top, | ||||
|                                  layout.top_screen.GetWidth(), layout.top_screen.GetHeight()); | ||||
|                 glUniform1i(uniform_layer, 1); | ||||
|  | @ -1061,11 +1068,12 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|     glUniform1i(uniform_layer, 0); | ||||
|     if (layout.bottom_screen_enabled) { | ||||
|         if (layout.is_rotated) { | ||||
|             if (Settings::values.render_3d == Settings::StereoRenderOption::Off) { | ||||
|             if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Off) { | ||||
|                 DrawSingleScreenRotated(screen_infos[2], (float)bottom_screen.left, | ||||
|                                         (float)bottom_screen.top, (float)bottom_screen.GetWidth(), | ||||
|                                         (float)bottom_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::SideBySide) { | ||||
|                 DrawSingleScreenRotated( | ||||
|                     screen_infos[2], (float)bottom_screen.left / 2, (float)bottom_screen.top, | ||||
|                     (float)bottom_screen.GetWidth() / 2, (float)bottom_screen.GetHeight()); | ||||
|  | @ -1074,7 +1082,8 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|                     screen_infos[2], ((float)bottom_screen.left / 2) + ((float)layout.width / 2), | ||||
|                     (float)bottom_screen.top, (float)bottom_screen.GetWidth() / 2, | ||||
|                     (float)bottom_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::CardboardVR) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::CardboardVR) { | ||||
|                 DrawSingleScreenRotated(screen_infos[2], layout.bottom_screen.left, | ||||
|                                         layout.bottom_screen.top, layout.bottom_screen.GetWidth(), | ||||
|                                         layout.bottom_screen.GetHeight()); | ||||
|  | @ -1091,11 +1100,12 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|                                               (float)bottom_screen.GetHeight()); | ||||
|             } | ||||
|         } else { | ||||
|             if (Settings::values.render_3d == Settings::StereoRenderOption::Off) { | ||||
|             if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Off) { | ||||
|                 DrawSingleScreen(screen_infos[2], (float)bottom_screen.left, | ||||
|                                  (float)bottom_screen.top, (float)bottom_screen.GetWidth(), | ||||
|                                  (float)bottom_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::SideBySide) { | ||||
|                 DrawSingleScreen(screen_infos[2], (float)bottom_screen.left / 2, | ||||
|                                  (float)bottom_screen.top, (float)bottom_screen.GetWidth() / 2, | ||||
|                                  (float)bottom_screen.GetHeight()); | ||||
|  | @ -1104,7 +1114,8 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f | |||
|                                  ((float)bottom_screen.left / 2) + ((float)layout.width / 2), | ||||
|                                  (float)bottom_screen.top, (float)bottom_screen.GetWidth() / 2, | ||||
|                                  (float)bottom_screen.GetHeight()); | ||||
|             } else if (Settings::values.render_3d == Settings::StereoRenderOption::CardboardVR) { | ||||
|             } else if (Settings::values.render_3d.GetValue() == | ||||
|                        Settings::StereoRenderOption::CardboardVR) { | ||||
|                 DrawSingleScreen(screen_infos[2], layout.bottom_screen.left, | ||||
|                                  layout.bottom_screen.top, layout.bottom_screen.GetWidth(), | ||||
|                                  layout.bottom_screen.GetHeight()); | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| #include <memory> | ||||
| #include "common/archives.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/settings.h" | ||||
| #include "common/settings.h" | ||||
| #include "video_core/pica.h" | ||||
| #include "video_core/pica_state.h" | ||||
| #include "video_core/renderer_base.h" | ||||
|  | @ -44,7 +44,7 @@ ResultStatus Init(Frontend::EmuWindow& emu_window, Frontend::EmuWindow* secondar | |||
|     g_memory = &memory; | ||||
|     Pica::Init(); | ||||
| 
 | ||||
|     OpenGL::GLES = Settings::values.use_gles; | ||||
|     OpenGL::GLES = Settings::values.use_gles.GetValue(); | ||||
| 
 | ||||
|     g_renderer = std::make_unique<OpenGL::RendererOpenGL>(emu_window, secondary_window); | ||||
|     ResultStatus result = g_renderer->Init(); | ||||
|  | @ -82,8 +82,8 @@ void RequestScreenshot(void* data, std::function<void()> callback, | |||
| 
 | ||||
| u16 GetResolutionScaleFactor() { | ||||
|     if (g_hw_renderer_enabled) { | ||||
|         return Settings::values.resolution_factor | ||||
|                    ? Settings::values.resolution_factor | ||||
|         return Settings::values.resolution_factor.GetValue() | ||||
|                    ? Settings::values.resolution_factor.GetValue() | ||||
|                    : g_renderer->GetRenderWindow().GetFramebufferLayout().GetScalingRatio(); | ||||
|     } else { | ||||
|         // Software renderer always render at native resolution
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue