* 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
89 lines
2.7 KiB
C++
89 lines
2.7 KiB
C++
// Copyright 2014 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include <memory>
|
|
#include "common/logging/log.h"
|
|
#include "core/settings.h"
|
|
#include "video_core/pica.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<RendererBase> g_renderer; ///< Renderer plugin
|
|
|
|
std::atomic<bool> g_hw_renderer_enabled;
|
|
std::atomic<bool> g_shader_jit_enabled;
|
|
std::atomic<bool> g_hw_shader_enabled;
|
|
std::atomic<bool> g_hw_shader_accurate_gs;
|
|
std::atomic<bool> g_hw_shader_accurate_mul;
|
|
std::atomic<bool> g_renderer_bg_color_update_requested;
|
|
std::atomic<bool> g_renderer_sampler_update_requested;
|
|
std::atomic<bool> g_renderer_shader_update_requested;
|
|
// Screenshot
|
|
std::atomic<bool> g_renderer_screenshot_requested;
|
|
void* g_screenshot_bits;
|
|
std::function<void()> g_screenshot_complete_callback;
|
|
Layout::FramebufferLayout g_screenshot_framebuffer_layout;
|
|
|
|
Memory::MemorySystem* g_memory;
|
|
|
|
/// Initialize the video core
|
|
Core::System::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<OpenGL::RendererOpenGL>(emu_window);
|
|
Core::System::ResultStatus result = g_renderer->Init();
|
|
|
|
if (result != Core::System::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<void()> 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;
|
|
}
|
|
}
|
|
|
|
} // namespace VideoCore
|