mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Prepare frontend for multiple graphics APIs (#6347)
* externals: Update dynarmic * settings: Introduce GraphicsAPI enum * For now it's OpenGL only but will be expanded upon later * citra_qt: Introduce backend agnostic context management * Mostly a direct port from yuzu * core: Simplify context acquire * settings: Add option to create debug contexts * renderer_opengl: Abstract initialization to Driver * This commit also updates glad and adds some useful extensions which we will use in part 2 * Rasterizer construction is moved to the specific renderer instead of RendererBase. Software rendering has been disable to achieve this but will be brought back in the next commit. * video_core: Remove Init/Shutdown methods from renderer * The constructor and destructor can do the same job * In addition move opengl function loading to Qt since SDL already does this. Also remove ErrorVideoCore which is never reached * citra_qt: Decouple software renderer from opengl part 1 * citra: Decouple software renderer from opengl part 2 * android: Decouple software renderer from opengl part 3 * swrasterizer: Decouple software renderer from opengl part 4 * This commit simply enforces the renderer naming conventions in the software renderer * video_core: Move RendererBase to VideoCore * video_core: De-globalize screenshot state * video_core: Pass system to the renderers * video_core: Commonize shader uniform data * video_core: Abstract backend agnostic rasterizer operations * bootmanager: Remove references to OpenGL for macOS OpenGL macOS headers definitions clash heavily with each other * citra_qt: Proper title for api settings * video_core: Reduce boost usage * bootmanager: Fix hide mouse option Remove event handlers from RenderWidget for events that are already handled by the parent GRenderWindow. Also enable mouse tracking on the RenderWidget. * android: Remove software from graphics api list * code: Address review comments * citra: Port per-game settings read * Having to update the default value for all backends is a pain so lets centralize it * android: Rename to OpenGLES --------- Co-authored-by: MerryMage <MerryMage@users.noreply.github.com> Co-authored-by: Vitor Kiguchi <vitor-kiguchi@hotmail.com>
This commit is contained in:
		
							parent
							
								
									9ef42040af
								
							
						
					
					
						commit
						b5d6f645bd
					
				
					 99 changed files with 3165 additions and 4501 deletions
				
			
		|  | @ -496,9 +496,6 @@ public final class NativeLibrary { | |||
|         final int ErrorLoader_ErrorEncrypted = 5; | ||||
|         final int ErrorLoader_ErrorInvalidFormat = 6; | ||||
|         final int ErrorSystemFiles = 7; | ||||
|         final int ErrorVideoCore = 8; | ||||
|         final int ErrorVideoCore_ErrorGenericDrivers = 9; | ||||
|         final int ErrorVideoCore_ErrorBelowGL33 = 10; | ||||
|         final int ShutdownRequested = 11; | ||||
|         final int ErrorUnknown = 12; | ||||
| 
 | ||||
|  |  | |||
|  | @ -355,6 +355,7 @@ public final class SettingsFragmentPresenter { | |||
|         mView.getActivity().setTitle(R.string.preferences_graphics); | ||||
| 
 | ||||
|         SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); | ||||
|         Setting graphicsApi = rendererSection.getSetting(SettingsFile.KEY_GRAPHICS_API); | ||||
|         Setting resolutionFactor = rendererSection.getSetting(SettingsFile.KEY_RESOLUTION_FACTOR); | ||||
|         Setting filterMode = rendererSection.getSetting(SettingsFile.KEY_FILTER_MODE); | ||||
|         Setting shadersAccurateMul = rendererSection.getSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL); | ||||
|  | @ -371,6 +372,7 @@ public final class SettingsFragmentPresenter { | |||
|         //Setting preloadTextures = utilitySection.getSetting(SettingsFile.KEY_PRELOAD_TEXTURES); | ||||
| 
 | ||||
|         sl.add(new HeaderSetting(null, null, R.string.renderer, 0)); | ||||
|         sl.add(new SingleChoiceSetting(SettingsFile.KEY_GRAPHICS_API, Settings.SECTION_RENDERER, R.string.graphics_api, 0, R.array.graphicsApiNames, R.array.graphicsApiValues, 0, graphicsApi)); | ||||
|         sl.add(new SliderSetting(SettingsFile.KEY_RESOLUTION_FACTOR, Settings.SECTION_RENDERER, R.string.internal_resolution, R.string.internal_resolution_description, 1, 4, "x", 1, resolutionFactor)); | ||||
|         sl.add(new CheckBoxSetting(SettingsFile.KEY_FILTER_MODE, Settings.SECTION_RENDERER, R.string.linear_filtering, R.string.linear_filtering_description, true, filterMode)); | ||||
|         sl.add(new CheckBoxSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL, Settings.SECTION_RENDERER, R.string.shaders_accurate_mul, R.string.shaders_accurate_mul_description, false, shadersAccurateMul)); | ||||
|  | @ -409,14 +411,14 @@ public final class SettingsFragmentPresenter { | |||
|         SettingSection coreSection = mSettings.getSection(Settings.SECTION_CORE); | ||||
|         SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); | ||||
|         Setting useCpuJit = coreSection.getSetting(SettingsFile.KEY_CPU_JIT); | ||||
|         Setting hardwareRenderer = rendererSection.getSetting(SettingsFile.KEY_HW_RENDERER); | ||||
|         Setting hardwareShader = rendererSection.getSetting(SettingsFile.KEY_HW_SHADER); | ||||
|         Setting vsyncEnable = rendererSection.getSetting(SettingsFile.KEY_USE_VSYNC); | ||||
|         Setting rendererDebug = rendererSection.getSetting(SettingsFile.KEY_RENDERER_DEBUG); | ||||
| 
 | ||||
|         sl.add(new HeaderSetting(null, null, R.string.debug_warning, 0)); | ||||
|         sl.add(new CheckBoxSetting(SettingsFile.KEY_CPU_JIT, Settings.SECTION_CORE, R.string.cpu_jit, R.string.cpu_jit_description, true, useCpuJit, true, mView)); | ||||
|         sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_RENDERER, Settings.SECTION_RENDERER, R.string.hw_renderer, R.string.hw_renderer_description, true, hardwareRenderer, true, mView)); | ||||
|         sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_SHADER, Settings.SECTION_RENDERER, R.string.hw_shaders, R.string.hw_shaders_description, true, hardwareShader, true, mView)); | ||||
|         sl.add(new CheckBoxSetting(SettingsFile.KEY_USE_VSYNC, Settings.SECTION_RENDERER, R.string.vsync, R.string.vsync_description, true, vsyncEnable)); | ||||
|         sl.add(new CheckBoxSetting(SettingsFile.KEY_RENDERER_DEBUG, Settings.SECTION_RENDERER, R.string.renderer_debug, R.string.renderer_debug_description, false, rendererDebug)); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -44,7 +44,8 @@ public final class SettingsFile { | |||
| 
 | ||||
|     public static final String KEY_PREMIUM = "premium"; | ||||
| 
 | ||||
|     public static final String KEY_HW_RENDERER = "use_hw_renderer"; | ||||
|     public static final String KEY_GRAPHICS_API = "graphics_api"; | ||||
|     public static final String KEY_RENDERER_DEBUG = "renderer_debug"; | ||||
|     public static final String KEY_HW_SHADER = "use_hw_shader"; | ||||
|     public static final String KEY_SHADERS_ACCURATE_MUL = "shaders_accurate_mul"; | ||||
|     public static final String KEY_USE_SHADER_JIT = "use_shader_jit"; | ||||
|  |  | |||
|  | @ -82,6 +82,30 @@ void Config::UpdateCFG() { | |||
|     cfg->UpdateConfigNANDSavegame(); | ||||
| } | ||||
| 
 | ||||
| template <> | ||||
| void Config::ReadSetting(const std::string& group, Settings::Setting<std::string>& setting) { | ||||
|     std::string setting_value = sdl2_config->Get(group, setting.GetLabel(), setting.GetDefault()); | ||||
|     if (setting_value.empty()) { | ||||
|         setting_value = setting.GetDefault(); | ||||
|     } | ||||
|     setting = std::move(setting_value); | ||||
| } | ||||
| 
 | ||||
| template <> | ||||
| void Config::ReadSetting(const std::string& group, Settings::Setting<bool>& setting) { | ||||
|     setting = sdl2_config->GetBoolean(group, setting.GetLabel(), setting.GetDefault()); | ||||
| } | ||||
| 
 | ||||
| template <typename Type, bool ranged> | ||||
| void Config::ReadSetting(const std::string& group, Settings::Setting<Type, ranged>& setting) { | ||||
|     if constexpr (std::is_floating_point_v<Type>) { | ||||
|         setting = sdl2_config->GetReal(group, setting.GetLabel(), setting.GetDefault()); | ||||
|     } else { | ||||
|         setting = static_cast<Type>(sdl2_config->GetInteger( | ||||
|             group, setting.GetLabel(), static_cast<long>(setting.GetDefault()))); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Config::ReadValues() { | ||||
|     // Controls
 | ||||
|     for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { | ||||
|  | @ -112,39 +136,32 @@ void Config::ReadValues() { | |||
|                                                  InputCommon::CemuhookUDP::DEFAULT_PORT)); | ||||
| 
 | ||||
|     // Core
 | ||||
|     Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true); | ||||
|     Settings::values.cpu_clock_percentage = | ||||
|         static_cast<int>(sdl2_config->GetInteger("Core", "cpu_clock_percentage", 100)); | ||||
|     ReadSetting("Core", Settings::values.use_cpu_jit); | ||||
|     ReadSetting("Core", Settings::values.cpu_clock_percentage); | ||||
| 
 | ||||
|     // Premium
 | ||||
|     Settings::values.texture_filter_name = | ||||
|         sdl2_config->GetString("Premium", "texture_filter_name", "none"); | ||||
|     ReadSetting("Premium", Settings::values.texture_filter_name); | ||||
| 
 | ||||
|     // Renderer
 | ||||
|     Settings::values.use_gles = sdl2_config->GetBoolean("Renderer", "use_gles", true); | ||||
|     Settings::values.use_hw_renderer = sdl2_config->GetBoolean("Renderer", "use_hw_renderer", true); | ||||
|     Settings::values.use_hw_shader = sdl2_config->GetBoolean("Renderer", "use_hw_shader", true); | ||||
|     Settings::values.shaders_accurate_mul = | ||||
|         sdl2_config->GetBoolean("Renderer", "shaders_accurate_mul", false); | ||||
|     Settings::values.use_shader_jit = sdl2_config->GetBoolean("Renderer", "use_shader_jit", true); | ||||
|     Settings::values.resolution_factor = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Renderer", "resolution_factor", 1)); | ||||
|     Settings::values.use_disk_shader_cache = | ||||
|         sdl2_config->GetBoolean("Renderer", "use_disk_shader_cache", true); | ||||
|     Settings::values.use_vsync_new = sdl2_config->GetBoolean("Renderer", "use_vsync_new", true); | ||||
|     ReadSetting("Renderer", Settings::values.graphics_api); | ||||
|     ReadSetting("Renderer", Settings::values.use_hw_shader); | ||||
|     ReadSetting("Renderer", Settings::values.use_shader_jit); | ||||
|     ReadSetting("Renderer", Settings::values.resolution_factor); | ||||
|     ReadSetting("Renderer", Settings::values.use_disk_shader_cache); | ||||
|     ReadSetting("Renderer", Settings::values.use_vsync_new); | ||||
| 
 | ||||
|     // Work around to map Android setting for enabling the frame limiter to the format Citra expects
 | ||||
|     if (sdl2_config->GetBoolean("Renderer", "use_frame_limit", true)) { | ||||
|         Settings::values.frame_limit = | ||||
|             static_cast<u16>(sdl2_config->GetInteger("Renderer", "frame_limit", 100)); | ||||
|         ReadSetting("Renderer", Settings::values.frame_limit); | ||||
|     } else { | ||||
|         Settings::values.frame_limit = 0; | ||||
|     } | ||||
| 
 | ||||
|     Settings::values.render_3d = static_cast<Settings::StereoRenderOption>( | ||||
|         sdl2_config->GetInteger("Renderer", "render_3d", 0)); | ||||
|     Settings::values.factor_3d = | ||||
|         static_cast<u8>(sdl2_config->GetInteger("Renderer", "factor_3d", 0)); | ||||
|     ReadSetting("Renderer", Settings::values.render_3d); | ||||
|     ReadSetting("Renderer", Settings::values.factor_3d); | ||||
|     std::string default_shader = "none (builtin)"; | ||||
|     if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph) | ||||
|         default_shader = "dubois (builtin)"; | ||||
|  | @ -152,70 +169,49 @@ void Config::ReadValues() { | |||
|         default_shader = "horizontal (builtin)"; | ||||
|     Settings::values.pp_shader_name = | ||||
|         sdl2_config->GetString("Renderer", "pp_shader_name", default_shader); | ||||
|     Settings::values.filter_mode = sdl2_config->GetBoolean("Renderer", "filter_mode", true); | ||||
|     ReadSetting("Renderer", Settings::values.filter_mode); | ||||
| 
 | ||||
|     Settings::values.bg_red = static_cast<float>(sdl2_config->GetReal("Renderer", "bg_red", 0.0)); | ||||
|     Settings::values.bg_green = | ||||
|         static_cast<float>(sdl2_config->GetReal("Renderer", "bg_green", 0.0)); | ||||
|     Settings::values.bg_blue = static_cast<float>(sdl2_config->GetReal("Renderer", "bg_blue", 0.0)); | ||||
|     ReadSetting("Renderer", Settings::values.bg_red); | ||||
|     ReadSetting("Renderer", Settings::values.bg_green); | ||||
|     ReadSetting("Renderer", Settings::values.bg_blue); | ||||
| 
 | ||||
|     // Layout
 | ||||
|     Settings::values.layout_option = static_cast<Settings::LayoutOption>(sdl2_config->GetInteger( | ||||
|         "Layout", "layout_option", static_cast<int>(Settings::LayoutOption::MobileLandscape))); | ||||
|     Settings::values.custom_layout = sdl2_config->GetBoolean("Layout", "custom_layout", false); | ||||
|     Settings::values.custom_top_left = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_top_left", 0)); | ||||
|     Settings::values.custom_top_top = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_top_top", 0)); | ||||
|     Settings::values.custom_top_right = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_top_right", 400)); | ||||
|     Settings::values.custom_top_bottom = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_top_bottom", 240)); | ||||
|     Settings::values.custom_bottom_left = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_bottom_left", 40)); | ||||
|     Settings::values.custom_bottom_top = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_bottom_top", 240)); | ||||
|     Settings::values.custom_bottom_right = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_bottom_right", 360)); | ||||
|     Settings::values.custom_bottom_bottom = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Layout", "custom_bottom_bottom", 480)); | ||||
|     Settings::values.cardboard_screen_size = | ||||
|         static_cast<int>(sdl2_config->GetInteger("Layout", "cardboard_screen_size", 85)); | ||||
|     Settings::values.cardboard_x_shift = | ||||
|         static_cast<int>(sdl2_config->GetInteger("Layout", "cardboard_x_shift", 0)); | ||||
|     Settings::values.cardboard_y_shift = | ||||
|         static_cast<int>(sdl2_config->GetInteger("Layout", "cardboard_y_shift", 0)); | ||||
|     ReadSetting("Layout", Settings::values.custom_layout); | ||||
|     ReadSetting("Layout", Settings::values.custom_top_left); | ||||
|     ReadSetting("Layout", Settings::values.custom_top_top); | ||||
|     ReadSetting("Layout", Settings::values.custom_top_right); | ||||
|     ReadSetting("Layout", Settings::values.custom_top_bottom); | ||||
|     ReadSetting("Layout", Settings::values.custom_bottom_left); | ||||
|     ReadSetting("Layout", Settings::values.custom_bottom_top); | ||||
|     ReadSetting("Layout", Settings::values.custom_bottom_right); | ||||
|     ReadSetting("Layout", Settings::values.custom_bottom_bottom); | ||||
|     ReadSetting("Layout", Settings::values.cardboard_screen_size); | ||||
|     ReadSetting("Layout", Settings::values.cardboard_x_shift); | ||||
|     ReadSetting("Layout", Settings::values.cardboard_y_shift); | ||||
| 
 | ||||
|     // Utility
 | ||||
|     Settings::values.dump_textures = sdl2_config->GetBoolean("Utility", "dump_textures", false); | ||||
|     Settings::values.custom_textures = sdl2_config->GetBoolean("Utility", "custom_textures", false); | ||||
|     Settings::values.preload_textures = | ||||
|         sdl2_config->GetBoolean("Utility", "preload_textures", false); | ||||
|     ReadSetting("Utility", Settings::values.dump_textures); | ||||
|     ReadSetting("Utility", Settings::values.custom_textures); | ||||
|     ReadSetting("Utility", Settings::values.preload_textures); | ||||
| 
 | ||||
|     // Audio
 | ||||
|     Settings::values.audio_emulation = | ||||
|         static_cast<Settings::AudioEmulation>(sdl2_config->GetInteger( | ||||
|             "Audio", "audio_emulation", static_cast<int>(Settings::AudioEmulation::HLE))); | ||||
|     Settings::values.sink_id = sdl2_config->GetString("Audio", "output_engine", "auto"); | ||||
|     Settings::values.enable_audio_stretching = | ||||
|         sdl2_config->GetBoolean("Audio", "enable_audio_stretching", true); | ||||
|     Settings::values.audio_device_id = sdl2_config->GetString("Audio", "output_device", "auto"); | ||||
|     Settings::values.volume = static_cast<float>(sdl2_config->GetReal("Audio", "volume", 1)); | ||||
|     Settings::values.mic_input_device = | ||||
|         sdl2_config->GetString("Audio", "mic_input_device", "Default"); | ||||
|     Settings::values.mic_input_type = | ||||
|         static_cast<Settings::MicInputType>(sdl2_config->GetInteger("Audio", "mic_input_type", 1)); | ||||
|     ReadSetting("Audio", Settings::values.audio_emulation); | ||||
|     ReadSetting("Audio", Settings::values.sink_id); | ||||
|     ReadSetting("Audio", Settings::values.enable_audio_stretching); | ||||
|     ReadSetting("Audio", Settings::values.audio_device_id); | ||||
|     ReadSetting("Audio", Settings::values.volume); | ||||
|     ReadSetting("Audio", Settings::values.mic_input_device); | ||||
|     ReadSetting("Audio", Settings::values.mic_input_type); | ||||
| 
 | ||||
|     // Data Storage
 | ||||
|     Settings::values.use_virtual_sd = | ||||
|         sdl2_config->GetBoolean("Data Storage", "use_virtual_sd", true); | ||||
|     ReadSetting("Data Storage", Settings::values.use_virtual_sd); | ||||
| 
 | ||||
|     // System
 | ||||
|     Settings::values.is_new_3ds = sdl2_config->GetBoolean("System", "is_new_3ds", true); | ||||
|     Settings::values.region_value = | ||||
|         sdl2_config->GetInteger("System", "region_value", Settings::REGION_VALUE_AUTO_SELECT); | ||||
|     Settings::values.init_clock = | ||||
|         static_cast<Settings::InitClock>(sdl2_config->GetInteger("System", "init_clock", 0)); | ||||
|     ReadSetting("System", Settings::values.is_new_3ds); | ||||
|     ReadSetting("System", Settings::values.region_value); | ||||
|     ReadSetting("System", Settings::values.init_clock); | ||||
|     { | ||||
|         std::tm t; | ||||
|         t.tm_sec = 1; | ||||
|  | @ -236,10 +232,8 @@ void Config::ReadValues() { | |||
|                 std::chrono::system_clock::from_time_t(std::mktime(&t)).time_since_epoch()) | ||||
|                 .count(); | ||||
|     } | ||||
|     Settings::values.plugin_loader_enabled = | ||||
|         sdl2_config->GetBoolean("System", "plugin_loader", false); | ||||
|     Settings::values.allow_plugin_loader = | ||||
|         sdl2_config->GetBoolean("System", "allow_plugin_loader", true); | ||||
|     ReadSetting("System", Settings::values.plugin_loader_enabled); | ||||
|     ReadSetting("System", Settings::values.allow_plugin_loader); | ||||
| 
 | ||||
|     // Camera
 | ||||
|     using namespace Service::CAM; | ||||
|  | @ -263,14 +257,14 @@ void Config::ReadValues() { | |||
|         sdl2_config->GetInteger("Camera", "camera_outer_left_flip", 0); | ||||
| 
 | ||||
|     // Miscellaneous
 | ||||
|     Settings::values.log_filter = sdl2_config->GetString("Miscellaneous", "log_filter", "*:Info"); | ||||
|     ReadSetting("Miscellaneous", Settings::values.log_filter); | ||||
| 
 | ||||
|     // Debugging
 | ||||
|     Settings::values.record_frame_times = | ||||
|         sdl2_config->GetBoolean("Debugging", "record_frame_times", false); | ||||
|     Settings::values.use_gdbstub = sdl2_config->GetBoolean("Debugging", "use_gdbstub", false); | ||||
|     Settings::values.gdbstub_port = | ||||
|         static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689)); | ||||
|     ReadSetting("Debugging", Settings::values.renderer_debug); | ||||
|     ReadSetting("Debugging", Settings::values.use_gdbstub); | ||||
|     ReadSetting("Debugging", Settings::values.gdbstub_port); | ||||
| 
 | ||||
|     for (const auto& service_module : Service::service_module_map) { | ||||
|         bool use_lle = sdl2_config->GetBoolean("Debugging", "LLE\\" + service_module.name, false); | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include "common/settings.h" | ||||
| 
 | ||||
| class INIReader; | ||||
| 
 | ||||
|  | @ -23,4 +24,14 @@ public: | |||
|     ~Config(); | ||||
| 
 | ||||
|     void Reload(); | ||||
| 
 | ||||
| private: | ||||
|     /**
 | ||||
|      * Applies a value read from the sdl2_config to a Setting. | ||||
|      * | ||||
|      * @param group The name of the INI group | ||||
|      * @param setting The yuzu setting to modify | ||||
|      */ | ||||
|     template <typename Type, bool ranged> | ||||
|     void ReadSetting(const std::string& group, Settings::Setting<Type, ranged>& setting); | ||||
| }; | ||||
|  |  | |||
|  | @ -98,13 +98,9 @@ use_cpu_jit = | |||
| cpu_clock_percentage = | ||||
| 
 | ||||
| [Renderer] | ||||
| # Whether to render using GLES or OpenGL | ||||
| # 0: OpenGL, 1 (default): GLES | ||||
| use_gles = | ||||
| 
 | ||||
| # Whether to use software or hardware rendering. | ||||
| # 0: Software, 1 (default): Hardware | ||||
| use_hw_renderer = | ||||
| # Whether to render using OpenGL | ||||
| # 1: OpenGLES (default) | ||||
| graphics_api = | ||||
| 
 | ||||
| # Whether to use hardware shaders to emulate 3DS shaders | ||||
| # 0: Software, 1 (default): Hardware | ||||
|  | @ -118,10 +114,6 @@ separable_shader = | |||
| # 0: Off (Default. Faster, but causes issues in some games) 1: On (Slower, but correct) | ||||
| shaders_accurate_mul = | ||||
| 
 | ||||
| # Enable asynchronous GPU emulation | ||||
| # 0: Off (Slower, but more accurate) 1: On (Default. Faster, but may cause issues in some games) | ||||
| use_asynchronous_gpu_emulation = | ||||
| 
 | ||||
| # Whether to use the Just-In-Time (JIT) compiler for shader emulation | ||||
| # 0: Interpreter (slow), 1 (default): JIT (fast) | ||||
| use_shader_jit = | ||||
|  | @ -325,9 +317,15 @@ log_filter = *:Info | |||
| [Debugging] | ||||
| # Record frame time data, can be found in the log directory. Boolean value | ||||
| record_frame_times = | ||||
| 
 | ||||
| # Whether to enable additional debugging information during emulation | ||||
| # 0 (default): Off, 1: On | ||||
| renderer_debug = | ||||
| 
 | ||||
| # Port for listening to GDB connections. | ||||
| use_gdbstub=false | ||||
| gdbstub_port=24689 | ||||
| 
 | ||||
| # To LLE a service module add "LLE\<module name>=true" | ||||
| 
 | ||||
| [WebService] | ||||
|  |  | |||
|  | @ -25,7 +25,6 @@ | |||
| #include "core/frontend/applets/default_applets.h" | ||||
| #include "core/frontend/camera/factory.h" | ||||
| #include "core/frontend/mic.h" | ||||
| #include "core/frontend/scope_acquire_context.h" | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/nfc/nfc.h" | ||||
| #include "core/savestate.h" | ||||
|  | @ -46,6 +45,7 @@ | |||
| #include "jni/ndk_motion.h" | ||||
| #include "video_core/renderer_base.h" | ||||
| #include "video_core/renderer_opengl/texture_filters/texture_filterer.h" | ||||
| #include "video_core/video_core.h" | ||||
| 
 | ||||
| namespace { | ||||
| 
 | ||||
|  | @ -149,7 +149,15 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { | |||
|         return Core::System::ResultStatus::ErrorLoader; | ||||
|     } | ||||
| 
 | ||||
|     window = std::make_unique<EmuWindow_Android>(s_surf); | ||||
|     const auto graphics_api = Settings::values.graphics_api.GetValue(); | ||||
|     switch (graphics_api) { | ||||
|     case Settings::GraphicsAPI::OpenGL: | ||||
|         window = std::make_unique<EmuWindow_Android>(s_surf); | ||||
|         break; | ||||
|     default: | ||||
|         LOG_CRITICAL(Frontend, "Unknown graphics API {}, using OpenGL", graphics_api); | ||||
|         window = std::make_unique<EmuWindow_Android>(s_surf); | ||||
|     } | ||||
| 
 | ||||
|     Core::System& system{Core::System::GetInstance()}; | ||||
| 
 | ||||
|  |  | |||
|  | @ -58,8 +58,6 @@ | |||
|     <string name="linear_filtering_description">Aktiviert lineare Filterung, welche die Spieletexturen glättet.</string> | ||||
|     <string name="texture_filter_name">Texturfilter</string> | ||||
|     <string name="texture_filter_description">Verbessert die Grafik von Spielen durch das Anwendung eines Texturfilters. Die unterstützten Filter sind Anime4K Ultrafast, Bicubic, ScaleForce und xBRZ freescale.</string> | ||||
|     <string name="hw_renderer">Aktiviere Hardware Renderer</string> | ||||
|     <string name="hw_renderer_description">Benutzt Hardware, um die 3DS-Grafik zu emulieren. Wenn aktiviert, wird die Spieleleistung stark verbessert.</string> | ||||
|     <string name="hw_shaders">Aktiviere Hardware Shader</string> | ||||
|     <string name="hw_shaders_description">Benutzt Hardware, um die 3DS-Shader zu emulieren. Wenn aktiviert, wird die Spieleleistung stark verbessert.</string> | ||||
|     <string name="shaders_accurate_mul">Aktiviere genaue Shader-Multiplikation</string> | ||||
|  |  | |||
|  | @ -62,8 +62,6 @@ | |||
|     <string name="linear_filtering_description">Activa el filtro linear, que hace que los gráficos del juego se vean más suaves.</string> | ||||
|     <string name="texture_filter_name">Filtro de Texturas</string> | ||||
|     <string name="texture_filter_description">Mejora los gráficos visuales de los juegos al aplicar un filtro a las texturas. Los filtros soportados son Anime4K Ultrafast, Bicubic, ScaleForce, y xBRZ freescale.</string> | ||||
|     <string name="hw_renderer">Activar renderizador de hardware</string> | ||||
|     <string name="hw_renderer_description">Usa el hardware para emular los gráficos de 3DS. Cuando se active, el rendimiento mejorará notablemente.</string> | ||||
|     <string name="hw_shaders">Activar sombreador de hardware</string> | ||||
|     <string name="hw_shaders_description">Usa el hardware para emular los sombreadores de 3DS. Cuando se active, el rendimiento mejorará notablemente.</string> | ||||
|     <string name="shaders_accurate_mul">Activar multiplicación precisa de sombreado</string> | ||||
|  |  | |||
|  | @ -46,8 +46,6 @@ | |||
|     <!-- Graphics settings strings --> | ||||
|     <string name="vsync">Aktivoi V-Sync</string> | ||||
|     <string name="vsync_description">Synkronoi pelin virkistystaajuus laitteesi virkistystaajuuteen.</string> | ||||
|     <string name="hw_renderer">Aktivoi Laitteistorenderöinti</string> | ||||
|     <string name="hw_renderer_description">Käyttää laitteistoa emuloidakseen 3DS-grafiikoita. Kun tämä on päällä, pelien suorituskyky on huomattavasti parempi.</string> | ||||
|     <string name="hw_shaders">Aktivoi Laitteistovarjostin</string> | ||||
|     <string name="hw_shaders_description">Käyttää laitteistoa emuloidakseen 3DS:n varjostimia. Kun tämä on päällä, pelien suorituskyky on huomattavasti parempi.</string> | ||||
|     <string name="frame_limit_enable">Aktivoi nopeuden rajoitus</string> | ||||
|  |  | |||
|  | @ -58,8 +58,6 @@ | |||
|     <string name="linear_filtering_description">Active le filtrage linéaire, qui améliorera le lissage graphique du jeu.</string> | ||||
|     <string name="texture_filter_name">Filtrage des textures</string> | ||||
|     <string name="texture_filter_description">Améliore l\'aspect graphique des jeux en appliquant un filtre aux textures. Les filtres supportés sont Anime4K Ultrafast, Bicubic, ScaleForce, et xBRZ freescale.</string> | ||||
|     <string name="hw_renderer">Activer le rendu matériel</string> | ||||
|     <string name="hw_renderer_description">Utilise le matériel pour émuler les graphismes de la 3DS. Lorsqu\'il est activé, la performance des jeux sera améliorée de manière significative.</string> | ||||
|     <string name="hw_shaders">Activer le shader (nuanceur) matériel </string> | ||||
|     <string name="hw_shaders_description">Utilise le matériel pour émuler les shaders de la 3DS. Lorsqu\'il est activé, la performance des jeux sera améliorée de manière significative.</string> | ||||
|     <string name="shaders_accurate_mul">Activer la multiplication précise dans les shaders</string> | ||||
|  |  | |||
|  | @ -58,8 +58,6 @@ | |||
|     <string name="linear_filtering_description">Abilita il filtro lineare, che fa sembrare più smussata la grafica dei giochi.</string> | ||||
|     <string name="texture_filter_name">Filtro Texture</string> | ||||
|     <string name="texture_filter_description">Migliora la grafica dei giochi applicando un filtro alle texture. I filtri supportati sono Anime4k Ultrafast, Bicubic, ScaleForce, e xBRZ freescale.</string> | ||||
|     <string name="hw_renderer">Abilita renderer hardware</string> | ||||
|     <string name="hw_renderer_description">Utilizza l\'hardware per emulare la grafica del 3DS. Se abilitato, le prestazioni dei giochi miglioreranno significativamente.</string> | ||||
|     <string name="hw_shaders">Abilita shader hardware</string> | ||||
|     <string name="hw_shaders_description">Utilizza l\'hardware per emulare gli shader del 3DS. Se abilitato, le prestazioni dei giochi miglioreranno significativamente.</string> | ||||
|     <string name="shaders_accurate_mul">Abilita moltiplicazione shader accurata</string> | ||||
|  |  | |||
|  | @ -40,8 +40,6 @@ | |||
|     <string name="linear_filtering">リニアフィルタリングを有効化</string> | ||||
|     <string name="linear_filtering_description">有効にすると、よりなめらかな画質が期待できます。</string> | ||||
|     <string name="texture_filter_name">テクスチャフィルタ</string> | ||||
|     <string name="hw_renderer">ハードウェアレンダラを有効にする</string> | ||||
|     <string name="hw_renderer_description">グラフィックエミュレーションにハードウェアを使用します。有効にすると、パフォーマンスが大幅に向上します。</string> | ||||
|     <string name="hw_shaders">ハードウェアシェーダを有効にする</string> | ||||
|     <string name="hw_shaders_description">シェーダエミュレーションにハードウェアを使用します。有効にすると、パフォーマンスが大幅に向上します。</string> | ||||
|     <string name="shaders_accurate_mul">正確なシェーダ乗算を有効にする</string> | ||||
|  |  | |||
|  | @ -58,8 +58,6 @@ | |||
|     <string name="linear_filtering_description">게임 필터링이 매끄럽게 보이도록 선형 필터링을 활성화합니다.</string> | ||||
|     <string name="texture_filter_name">텍스처 필터</string> | ||||
|     <string name="texture_filter_description">텍스처에 필터를 적용하여 게임의 시각적 효과를 향상시킵니다. 지원되는 필터는 Anime4K Ultrafast, Bicubic, ScaleForce 및 xBRZ 프리스케일입니다.</string> | ||||
|     <string name="hw_renderer">하드웨어 렌더러 사용</string> | ||||
|     <string name="hw_renderer_description">하드웨어를 사용하여 3DS 그래픽을 에뮬레이션합니다. 활성화하면 게임 성능이 크게 향상됩니다.</string> | ||||
|     <string name="hw_shaders">하드웨어 쉐이더 사용</string> | ||||
|     <string name="hw_shaders_description">하드웨어를 사용하여 3DS 쉐이더를 에뮬레이션합니다. 활성화하면 게임 성능이 크게 향상됩니다.</string> | ||||
|     <string name="shaders_accurate_mul">정확한 쉐이더 곱셉 사용</string> | ||||
|  |  | |||
|  | @ -58,8 +58,6 @@ | |||
|     <string name="linear_filtering_description">Aktiverer lineær filtrering, noe som får spillvisualer til å vises jevnere.</string> | ||||
|     <string name="texture_filter_name">Tekstur Filter</string> | ||||
|     <string name="texture_filter_description">Forbedrer det visuelle i spill ved å bruke et filter på teksturer. De støttede filtrene er Anime4K Ultrafast, Bicubic, ScaleForce og xBRZ freescale.</string> | ||||
|     <string name="hw_renderer">Aktiver maskinvaregjengivelse</string> | ||||
|     <string name="hw_renderer_description">Bruker maskinvare til å emulere 3DS grafikk. Når dette er aktivert, vil spillytelsen bli betydelig forbedret.</string> | ||||
|     <string name="hw_shaders">Aktiver maskinvare shader</string> | ||||
|     <string name="hw_shaders_description">Bruker maskinvare for å etterligne 3DS shaders. Når dette er aktivert, vil spillytelsen bli betydelig forbedret.</string> | ||||
|     <string name="shaders_accurate_mul">Aktiver nøyaktig shader-multiplikasjon</string> | ||||
|  |  | |||
|  | @ -58,8 +58,6 @@ | |||
|     <string name="linear_filtering_description">Ativa a filtragem linear, que suaviza o visual do jogo.</string> | ||||
|     <string name="texture_filter_name">Filtro de texturas</string> | ||||
|     <string name="texture_filter_description">Aprimora o visual dos jogos ao aplicar filtros às texturas. Os filtros compatíveis são: Anime4K Ultrafast, Bicúbico, ScaleForce e xBRZ Freescale.</string> | ||||
|     <string name="hw_renderer">Ativar renderizador por hardware</string> | ||||
|     <string name="hw_renderer_description">Utiliza o hardware para emular os gráficos do 3DS. Quando ativado, o desempenho de jogo será consideravelmente melhorado.</string> | ||||
|     <string name="hw_shaders">Ativar shaders via hardware</string> | ||||
|     <string name="hw_shaders_description">Utiliza o hardware para emular os shaders do 3DS. Quando ativado, o desempenho do jogo será consideravelmente melhorado.</string> | ||||
|     <string name="shaders_accurate_mul">Ativar multiplicação precisa de shaders</string> | ||||
|  |  | |||
|  | @ -58,8 +58,6 @@ | |||
|     <string name="linear_filtering_description">开启后,游戏视觉效果会更加平滑。</string> | ||||
|     <string name="texture_filter_name">纹理滤镜</string> | ||||
|     <string name="texture_filter_description">通过对纹理使用滤镜来增强游戏的视觉效果。支持的滤镜有 Anime4K Ultrafast, Bicubic, ScaleForce 和 xBRZ freescale。</string> | ||||
|     <string name="hw_renderer">启用硬件渲染器</string> | ||||
|     <string name="hw_renderer_description">使用硬件模拟 3DS 图形。启用后,游戏性能将显著提高。</string> | ||||
|     <string name="hw_shaders">启用硬件着色器</string> | ||||
|     <string name="hw_shaders_description">使用硬件模拟 3DS 着色器。启用后,游戏性能将显著提高。</string> | ||||
|     <string name="shaders_accurate_mul">启用精确乘法运算</string> | ||||
|  |  | |||
|  | @ -171,4 +171,12 @@ | |||
|         <item>4</item> | ||||
|         <item>5</item> | ||||
|     </integer-array> | ||||
| 
 | ||||
|     <string-array name="graphicsApiNames"> | ||||
|         <item>OpenGLES</item> | ||||
|     </string-array> | ||||
| 
 | ||||
|     <integer-array name="graphicsApiValues"> | ||||
|         <item>1</item> | ||||
|     </integer-array> | ||||
| </resources> | ||||
|  |  | |||
|  | @ -72,14 +72,15 @@ | |||
| 
 | ||||
|     <!-- Graphics settings strings --> | ||||
|     <string name="renderer">Renderer</string> | ||||
|     <string name="graphics_api">Graphics API</string> | ||||
|     <string name="renderer_debug">Enable debug renderer</string> | ||||
|     <string name="renderer_debug_description">Log additional graphics related debug information. When enabled, game performance will be significantly reduced</string> | ||||
|     <string name="vsync">Enable V-Sync</string> | ||||
|     <string name="vsync_description">Synchronizes the game frame rate to the refresh rate of your device.</string> | ||||
|     <string name="linear_filtering">Enable linear filtering</string> | ||||
|     <string name="linear_filtering_description">Enables linear filtering, which causes game visuals to appear smoother.</string> | ||||
|     <string name="texture_filter_name">Texture Filter</string> | ||||
|     <string name="texture_filter_description">Enhances the visuals of games by applying a filter to textures. The supported filters are Anime4K Ultrafast, Bicubic, ScaleForce, and xBRZ freescale.</string> | ||||
|     <string name="hw_renderer">Enable hardware renderer</string> | ||||
|     <string name="hw_renderer_description">Uses hardware to emulate 3DS graphics. When enabled, game performance will be significantly improved.</string> | ||||
|     <string name="hw_shaders">Enable hardware shader</string> | ||||
|     <string name="hw_shaders_description">Uses hardware to emulate 3DS shaders. When enabled, game performance will be significantly improved.</string> | ||||
|     <string name="shaders_accurate_mul">Enable accurate shader multiplication</string> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue