// Copyright 2014 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include #include "common/archives.h" #include "common/logging/log.h" #include "core/settings.h" #include "video_core/pica.h" #include "video_core/pica_state.h" #include "video_core/renderer_base.h" #include "video_core/renderer_opengl/gl_vars.h" #include "video_core/renderer_opengl/renderer_opengl.h" #include "video_core/video_core.h" //////////////////////////////////////////////////////////////////////////////////////////////////// // Video Core namespace namespace VideoCore { std::unique_ptr g_renderer; ///< Renderer plugin std::atomic g_hw_renderer_enabled; std::atomic g_shader_jit_enabled; std::atomic g_hw_shader_enabled; std::atomic g_hw_shader_accurate_mul; std::atomic g_use_disk_shader_cache; std::atomic g_renderer_bg_color_update_requested; std::atomic g_renderer_sampler_update_requested; std::atomic g_renderer_shader_update_requested; // Screenshot std::atomic g_renderer_screenshot_requested; void* g_screenshot_bits; std::function g_screenshot_complete_callback; Layout::FramebufferLayout g_screenshot_framebuffer_layout; Memory::MemorySystem* g_memory; /// Initialize the video core ResultStatus Init(Frontend::EmuWindow& emu_window, Memory::MemorySystem& memory) { g_memory = &memory; Pica::Init(); OpenGL::GLES = Settings::values.use_gles; g_renderer = std::make_unique(emu_window); ResultStatus result = g_renderer->Init(); if (result != ResultStatus::Success) { LOG_ERROR(Render, "initialization failed !"); } else { LOG_DEBUG(Render, "initialized OK"); } return result; } /// Shutdown the video core void Shutdown() { Pica::Shutdown(); g_renderer.reset(); LOG_DEBUG(Render, "shutdown OK"); } void RequestScreenshot(void* data, std::function callback, const Layout::FramebufferLayout& layout) { if (g_renderer_screenshot_requested) { LOG_ERROR(Render, "A screenshot is already requested or in progress, ignoring the request"); return; } g_screenshot_bits = data; g_screenshot_complete_callback = std::move(callback); g_screenshot_framebuffer_layout = layout; g_renderer_screenshot_requested = true; } u16 GetResolutionScaleFactor() { if (g_hw_renderer_enabled) { return Settings::values.resolution_factor ? Settings::values.resolution_factor : g_renderer->GetRenderWindow().GetFramebufferLayout().GetScalingRatio(); } else { // Software renderer always render at native resolution return 1; } } void Save(std::ostream &stream) { oarchive oa{stream}; oa & Pica::g_state; } void Load(std::istream &stream) { iarchive ia{stream}; ia & Pica::g_state; // TODO: Flush/reset things } } // namespace VideoCore