mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	video_core: Refactor GPU interface (#7272)
* video_core: Refactor GPU interface * citra_qt: Better debug widget lifetime
This commit is contained in:
		
							parent
							
								
									602f4f60d8
								
							
						
					
					
						commit
						2bb7f89c30
					
				
					 167 changed files with 4172 additions and 4866 deletions
				
			
		|  | @ -15,7 +15,6 @@ | |||
| #include "jni/input_manager.h" | ||||
| #include "network/network.h" | ||||
| #include "video_core/renderer_base.h" | ||||
| #include "video_core/video_core.h" | ||||
| 
 | ||||
| static bool IsPortraitMode() { | ||||
|     return JNI_FALSE != IDCache::GetEnvForThread()->CallStaticBooleanMethod( | ||||
|  |  | |||
|  | @ -7,6 +7,10 @@ | |||
| #include <vector> | ||||
| #include "core/frontend/emu_window.h" | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| class EmuWindow_Android : public Frontend::EmuWindow { | ||||
| public: | ||||
|     EmuWindow_Android(ANativeWindow* surface); | ||||
|  |  | |||
|  | @ -12,10 +12,11 @@ | |||
| 
 | ||||
| #include "common/logging/log.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "input_common/main.h" | ||||
| #include "jni/emu_window/emu_window_gl.h" | ||||
| #include "video_core/gpu.h" | ||||
| #include "video_core/renderer_base.h" | ||||
| #include "video_core/video_core.h" | ||||
| 
 | ||||
| static constexpr std::array<EGLint, 15> egl_attribs{EGL_SURFACE_TYPE, | ||||
|                                                     EGL_WINDOW_BIT, | ||||
|  | @ -71,8 +72,8 @@ private: | |||
|     EGLContext egl_context{}; | ||||
| }; | ||||
| 
 | ||||
| EmuWindow_Android_OpenGL::EmuWindow_Android_OpenGL(ANativeWindow* surface) | ||||
|     : EmuWindow_Android{surface} { | ||||
| EmuWindow_Android_OpenGL::EmuWindow_Android_OpenGL(Core::System& system_, ANativeWindow* surface) | ||||
|     : EmuWindow_Android{surface}, system{system_} { | ||||
|     if (egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); egl_display == EGL_NO_DISPLAY) { | ||||
|         LOG_CRITICAL(Frontend, "eglGetDisplay() failed"); | ||||
|         return; | ||||
|  | @ -199,6 +200,9 @@ void EmuWindow_Android_OpenGL::StopPresenting() { | |||
| } | ||||
| 
 | ||||
| void EmuWindow_Android_OpenGL::TryPresenting() { | ||||
|     if (!system.IsPoweredOn()) { | ||||
|         return; | ||||
|     } | ||||
|     if (presenting_state == PresentingState::Initial) [[unlikely]] { | ||||
|         eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context); | ||||
|         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); | ||||
|  | @ -208,8 +212,6 @@ void EmuWindow_Android_OpenGL::TryPresenting() { | |||
|         return; | ||||
|     } | ||||
|     eglSwapInterval(egl_display, Settings::values.use_vsync_new ? 1 : 0); | ||||
|     if (VideoCore::g_renderer) { | ||||
|         VideoCore::g_renderer->TryPresent(0); | ||||
|         eglSwapBuffers(egl_display, egl_surface); | ||||
|     } | ||||
|     system.GPU().Renderer().TryPresent(0); | ||||
|     eglSwapBuffers(egl_display, egl_surface); | ||||
| } | ||||
|  |  | |||
|  | @ -11,11 +11,15 @@ | |||
| 
 | ||||
| #include "jni/emu_window/emu_window.h" | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
| 
 | ||||
| struct ANativeWindow; | ||||
| 
 | ||||
| class EmuWindow_Android_OpenGL : public EmuWindow_Android { | ||||
| public: | ||||
|     EmuWindow_Android_OpenGL(ANativeWindow* surface); | ||||
|     EmuWindow_Android_OpenGL(Core::System& system, ANativeWindow* surface); | ||||
|     ~EmuWindow_Android_OpenGL() override = default; | ||||
| 
 | ||||
|     void TryPresenting() override; | ||||
|  | @ -30,6 +34,7 @@ private: | |||
|     void DestroyContext() override; | ||||
| 
 | ||||
| private: | ||||
|     Core::System& system; | ||||
|     EGLConfig egl_config; | ||||
|     EGLSurface egl_surface{}; | ||||
|     EGLContext egl_context{}; | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ | |||
| #include "common/logging/log.h" | ||||
| #include "common/settings.h" | ||||
| #include "jni/emu_window/emu_window_vk.h" | ||||
| #include "video_core/video_core.h" | ||||
| 
 | ||||
| class GraphicsContext_Android final : public Frontend::GraphicsContext { | ||||
| public: | ||||
|  |  | |||
|  | @ -51,8 +51,9 @@ | |||
| #include "jni/id_cache.h" | ||||
| #include "jni/input_manager.h" | ||||
| #include "jni/ndk_motion.h" | ||||
| #include "video_core/debug_utils/debug_utils.h" | ||||
| #include "video_core/gpu.h" | ||||
| #include "video_core/renderer_base.h" | ||||
| #include "video_core/video_core.h" | ||||
| 
 | ||||
| #if CITRA_ARCH(arm64) | ||||
| #include <adrenotools/driver.h> | ||||
|  | @ -126,7 +127,7 @@ static bool CheckMicPermission() { | |||
| 
 | ||||
| static Core::System::ResultStatus RunCitra(const std::string& filepath) { | ||||
|     // Citra core only supports a single running instance
 | ||||
|     std::lock_guard<std::mutex> lock(running_mutex); | ||||
|     std::scoped_lock lock(running_mutex); | ||||
| 
 | ||||
|     LOG_INFO(Frontend, "Citra starting..."); | ||||
| 
 | ||||
|  | @ -137,10 +138,12 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { | |||
|         return Core::System::ResultStatus::ErrorLoader; | ||||
|     } | ||||
| 
 | ||||
|     Core::System& system{Core::System::GetInstance()}; | ||||
| 
 | ||||
|     const auto graphics_api = Settings::values.graphics_api.GetValue(); | ||||
|     switch (graphics_api) { | ||||
|     case Settings::GraphicsAPI::OpenGL: | ||||
|         window = std::make_unique<EmuWindow_Android_OpenGL>(s_surf); | ||||
|         window = std::make_unique<EmuWindow_Android_OpenGL>(system, s_surf); | ||||
|         break; | ||||
|     case Settings::GraphicsAPI::Vulkan: | ||||
|         window = std::make_unique<EmuWindow_Android_Vulkan>(s_surf, vulkan_library); | ||||
|  | @ -150,8 +153,6 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { | |||
|         window = std::make_unique<EmuWindow_Android_Vulkan>(s_surf, vulkan_library); | ||||
|     } | ||||
| 
 | ||||
|     Core::System& system{Core::System::GetInstance()}; | ||||
| 
 | ||||
|     // Forces a config reload on game boot, if the user changed settings in the UI
 | ||||
|     Config{}; | ||||
|     // Replace with game-specific settings
 | ||||
|  | @ -179,6 +180,7 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { | |||
|     // Register microphone permission check
 | ||||
|     system.RegisterMicPermissionCheck(&CheckMicPermission); | ||||
| 
 | ||||
|     Pica::g_debug_context = Pica::DebugContext::Construct(); | ||||
|     InputManager::Init(); | ||||
| 
 | ||||
|     window->MakeCurrent(); | ||||
|  | @ -196,7 +198,7 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { | |||
|     LoadDiskCacheProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0); | ||||
| 
 | ||||
|     std::unique_ptr<Frontend::GraphicsContext> cpu_context; | ||||
|     system.Renderer().Rasterizer()->LoadDiskResources(stop_run, &LoadDiskCacheProgress); | ||||
|     system.GPU().Renderer().Rasterizer()->LoadDiskResources(stop_run, &LoadDiskCacheProgress); | ||||
| 
 | ||||
|     LoadDiskCacheProgress(VideoCore::LoadCallbackStage::Complete, 0, 0); | ||||
| 
 | ||||
|  | @ -275,8 +277,10 @@ void Java_org_citra_citra_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, | |||
|     if (window) { | ||||
|         window->OnSurfaceChanged(s_surf); | ||||
|     } | ||||
|     if (VideoCore::g_renderer) { | ||||
|         VideoCore::g_renderer->NotifySurfaceChanged(); | ||||
| 
 | ||||
|     auto& system = Core::System::GetInstance(); | ||||
|     if (system.IsPoweredOn()) { | ||||
|         system.GPU().Renderer().NotifySurfaceChanged(); | ||||
|     } | ||||
| 
 | ||||
|     LOG_INFO(Frontend, "Surface changed"); | ||||
|  | @ -311,8 +315,9 @@ void Java_org_citra_citra_1emu_NativeLibrary_notifyOrientationChange([[maybe_unu | |||
|                                                                      jint layout_option, | ||||
|                                                                      jint rotation) { | ||||
|     Settings::values.layout_option = static_cast<Settings::LayoutOption>(layout_option); | ||||
|     if (VideoCore::g_renderer) { | ||||
|         VideoCore::g_renderer->UpdateCurrentFramebufferLayout(!(rotation % 2)); | ||||
|     auto& system = Core::System::GetInstance(); | ||||
|     if (system.IsPoweredOn()) { | ||||
|         system.GPU().Renderer().UpdateCurrentFramebufferLayout(!(rotation % 2)); | ||||
|     } | ||||
|     InputManager::screen_rotation = rotation; | ||||
|     Camera::NDK::g_rotation = rotation; | ||||
|  | @ -322,8 +327,9 @@ void Java_org_citra_citra_1emu_NativeLibrary_swapScreens([[maybe_unused]] JNIEnv | |||
|                                                          [[maybe_unused]] jobject obj, | ||||
|                                                          jboolean swap_screens, jint rotation) { | ||||
|     Settings::values.swap_screen = swap_screens; | ||||
|     if (VideoCore::g_renderer) { | ||||
|         VideoCore::g_renderer->UpdateCurrentFramebufferLayout(!(rotation % 2)); | ||||
|     auto& system = Core::System::GetInstance(); | ||||
|     if (system.IsPoweredOn()) { | ||||
|         system.GPU().Renderer().UpdateCurrentFramebufferLayout(!(rotation % 2)); | ||||
|     } | ||||
|     InputManager::screen_rotation = rotation; | ||||
|     Camera::NDK::g_rotation = rotation; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue