mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 22:00:05 +00:00 
			
		
		
		
	renderer_opengl: Add support for custom shaders (#4578)
* Add Anaglyph 3D Change 3D slider in-game Change shaders while game is running Move shader loading into function Disable 3D slider setting when stereoscopy is off The rest of the shaders Address review issues Documentation and minor fixups Forgot clang-format Fix shader release on SDL2-software rendering Remove unnecessary state changes Respect 3D factor setting regardless of stereoscopic rendering Improve shader resolution passing Minor setting-related improvements Add option to toggle texture filtering Rebase fixes * One final clang-format * Fix OpenGL problems
This commit is contained in:
		
							parent
							
								
									3e9c2e77d9
								
							
						
					
					
						commit
						8131bd32e3
					
				
					 22 changed files with 587 additions and 48 deletions
				
			
		|  | @ -62,7 +62,7 @@ EmuWindow::~EmuWindow() { | |||
|  */ | ||||
| static bool IsWithinTouchscreen(const Layout::FramebufferLayout& layout, unsigned framebuffer_x, | ||||
|                                 unsigned framebuffer_y) { | ||||
|     if (Settings::values.toggle_3d) { | ||||
|     if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide) { | ||||
|         return (framebuffer_y >= layout.bottom_screen.top && | ||||
|                 framebuffer_y < layout.bottom_screen.bottom && | ||||
|                 ((framebuffer_x >= layout.bottom_screen.left / 2 && | ||||
|  | @ -78,7 +78,7 @@ static bool IsWithinTouchscreen(const Layout::FramebufferLayout& layout, unsigne | |||
| } | ||||
| 
 | ||||
| std::tuple<unsigned, unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) const { | ||||
|     if (Settings::values.toggle_3d) { | ||||
|     if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide) { | ||||
|         if (new_x >= framebuffer_layout.width / 2) | ||||
|             new_x -= framebuffer_layout.width / 2; | ||||
|         new_x = std::max(new_x, framebuffer_layout.bottom_screen.left / 2); | ||||
|  | @ -98,10 +98,11 @@ void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) { | |||
|     if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) | ||||
|         return; | ||||
| 
 | ||||
|     if (Settings::values.toggle_3d && framebuffer_x >= framebuffer_layout.width / 2) | ||||
|     if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide && | ||||
|         framebuffer_x >= framebuffer_layout.width / 2) | ||||
|         framebuffer_x -= framebuffer_layout.width / 2; | ||||
|     std::lock_guard guard(touch_state->mutex); | ||||
|     if (Settings::values.toggle_3d) { | ||||
|     if (Settings::values.render_3d == Settings::StereoRenderOption::SideBySide) { | ||||
|         touch_state->touch_x = | ||||
|             static_cast<float>(framebuffer_x - framebuffer_layout.bottom_screen.left / 2) / | ||||
|             (framebuffer_layout.bottom_screen.right / 2 - | ||||
|  |  | |||
|  | @ -58,9 +58,8 @@ Handler::Handler(Core::Timing& timing) : timing(timing) { | |||
|                                              std::bind(&Handler::UpdateTimeCallback, this, _1, _2)); | ||||
|     timing.ScheduleEvent(0, update_time_event); | ||||
| 
 | ||||
|     float slidestate = | ||||
|         Settings::values.toggle_3d ? (float_le)Settings::values.factor_3d / 100 : 0.0f; | ||||
|     shared_page.sliderstate_3d = slidestate; | ||||
|     float slidestate = Settings::values.factor_3d / 100.0f; | ||||
|     shared_page.sliderstate_3d = static_cast<float_le>(slidestate); | ||||
| } | ||||
| 
 | ||||
| /// Gets system time in 3DS format. The epoch is Jan 1900, and the unit is millisecond.
 | ||||
|  |  | |||
|  | @ -90,10 +90,10 @@ public: | |||
| 
 | ||||
|     void SetWifiLinkLevel(WifiLinkLevel); | ||||
| 
 | ||||
|     void Set3DSlider(float); | ||||
| 
 | ||||
|     void Set3DLed(u8); | ||||
| 
 | ||||
|     void Set3DSlider(float); | ||||
| 
 | ||||
|     SharedPageDef& GetSharedPage(); | ||||
| 
 | ||||
| private: | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| #include "audio_core/dsp_interface.h" | ||||
| #include "core/core.h" | ||||
| #include "core/gdbstub/gdbstub.h" | ||||
| #include "core/hle/kernel/shared_page.h" | ||||
| #include "core/hle/service/hid/hid.h" | ||||
| #include "core/hle/service/ir/ir_rst.h" | ||||
| #include "core/hle/service/ir/ir_user.h" | ||||
|  | @ -34,6 +35,8 @@ void Apply() { | |||
|     } | ||||
| 
 | ||||
|     VideoCore::g_renderer_bg_color_update_requested = true; | ||||
|     VideoCore::g_renderer_sampler_update_requested = true; | ||||
|     VideoCore::g_renderer_shader_update_requested = true; | ||||
| 
 | ||||
|     auto& system = Core::System::GetInstance(); | ||||
|     if (system.IsPoweredOn()) { | ||||
|  | @ -80,8 +83,10 @@ void LogSettings() { | |||
|     LogSetting("Renderer_VsyncEnabled", Settings::values.vsync_enabled); | ||||
|     LogSetting("Renderer_UseFrameLimit", Settings::values.use_frame_limit); | ||||
|     LogSetting("Renderer_FrameLimit", Settings::values.frame_limit); | ||||
|     LogSetting("Layout_Toggle3d", Settings::values.toggle_3d); | ||||
|     LogSetting("Layout_Factor3d", Settings::values.factor_3d); | ||||
|     LogSetting("Renderer_PostProcessingShader", Settings::values.pp_shader_name); | ||||
|     LogSetting("Renderer_FilterMode", Settings::values.filter_mode); | ||||
|     LogSetting("Stereoscopy_Render3d", static_cast<int>(Settings::values.render_3d)); | ||||
|     LogSetting("Stereoscopy_Factor3d", Settings::values.factor_3d); | ||||
|     LogSetting("Layout_LayoutOption", static_cast<int>(Settings::values.layout_option)); | ||||
|     LogSetting("Layout_SwapScreen", Settings::values.swap_screen); | ||||
|     LogSetting("Audio_EnableDspLle", Settings::values.enable_dsp_lle); | ||||
|  |  | |||
|  | @ -32,6 +32,8 @@ enum class MicInputType { | |||
|     Static, | ||||
| }; | ||||
| 
 | ||||
| enum class StereoRenderOption { Off, SideBySide, Anaglyph }; | ||||
| 
 | ||||
| namespace NativeButton { | ||||
| enum Values { | ||||
|     A, | ||||
|  | @ -163,9 +165,12 @@ struct Values { | |||
|     float bg_green; | ||||
|     float bg_blue; | ||||
| 
 | ||||
|     bool toggle_3d; | ||||
|     StereoRenderOption render_3d; | ||||
|     std::atomic<u8> factor_3d; | ||||
| 
 | ||||
|     bool filter_mode; | ||||
|     std::string pp_shader_name; | ||||
| 
 | ||||
|     // Audio
 | ||||
|     bool enable_dsp_lle; | ||||
|     bool enable_dsp_lle_multithread; | ||||
|  |  | |||
|  | @ -195,7 +195,9 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) { | |||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_UseShaderJit", | ||||
|              Settings::values.use_shader_jit); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_UseVsync", Settings::values.vsync_enabled); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_Toggle3d", Settings::values.toggle_3d); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_FilterMode", Settings::values.filter_mode); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_Render3d", | ||||
|              static_cast<int>(Settings::values.render_3d)); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Renderer_Factor3d", | ||||
|              Settings::values.factor_3d.load()); | ||||
|     AddField(Telemetry::FieldType::UserConfig, "System_IsNew3ds", Settings::values.is_new_3ds); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue