diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/core/hle/service/am/applet_oe.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/service/audio/audio.cpp | 16 | ||||
-rw-r--r-- | src/core/hle/service/audio/audio.h | 16 | ||||
-rw-r--r-- | src/core/hle/service/audio/audout_u.cpp | 26 | ||||
-rw-r--r-- | src/core/hle/service/audio/audout_u.h | 23 | ||||
-rw-r--r-- | src/core/hle/service/hid/hid.cpp | 61 | ||||
-rw-r--r-- | src/core/hle/service/hid/hid.h | 13 | ||||
-rw-r--r-- | src/core/hle/service/lm/lm.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/service/service.cpp | 12 | ||||
-rw-r--r-- | src/core/hle/service/time/time.cpp | 16 | ||||
-rw-r--r-- | src/core/hle/service/time/time.h | 16 | ||||
-rw-r--r-- | src/core/hle/service/time/time_s.cpp | 58 | ||||
-rw-r--r-- | src/core/hle/service/time/time_s.h | 23 | ||||
-rw-r--r-- | src/core/hle/service/vi/vi.cpp | 5 | ||||
-rw-r--r-- | src/video_core/renderer_base.h | 3 | ||||
-rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 32 | ||||
-rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.h | 12 |
18 files changed, 305 insertions, 39 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 021e2f152..f5c92a5aa 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -41,6 +41,8 @@ set(SRCS hle/service/am/applet_oe.cpp hle/service/aoc/aoc_u.cpp hle/service/apm/apm.cpp + hle/service/audio/audio.cpp + hle/service/audio/audout_u.cpp hle/service/hid/hid.cpp hle/service/lm/lm.cpp hle/service/nvdrv/devices/nvdisp_disp0.cpp @@ -53,6 +55,8 @@ set(SRCS hle/service/service.cpp hle/service/sm/controller.cpp hle/service/sm/sm.cpp + hle/service/time/time.cpp + hle/service/time/time_s.cpp hle/service/vi/vi.cpp hle/service/vi/vi_m.cpp hle/shared_page.cpp @@ -124,6 +128,8 @@ set(HEADERS hle/service/am/applet_oe.h hle/service/aoc/aoc_u.h hle/service/apm/apm.h + hle/service/audio/audio.h + hle/service/audio/audout_u.h hle/service/hid/hid.h hle/service/lm/lm.h hle/service/nvdrv/devices/nvdevice.h @@ -137,6 +143,8 @@ set(HEADERS hle/service/service.h hle/service/sm/controller.h hle/service/sm/sm.h + hle/service/time/time.h + hle/service/time/time_s.h hle/service/vi/vi.h hle/service/vi/vi_m.h hle/shared_page.h diff --git a/src/core/hle/service/am/applet_oe.cpp b/src/core/hle/service/am/applet_oe.cpp index e2bb581ff..f3d66ea96 100644 --- a/src/core/hle/service/am/applet_oe.cpp +++ b/src/core/hle/service/am/applet_oe.cpp @@ -81,7 +81,7 @@ private: void ReceiveMessage(Kernel::HLERequestContext& ctx) { IPC::RequestBuilder rb{ctx, 3}; rb.Push(RESULT_SUCCESS); - rb.Push<u32>(1); + rb.Push<u32>(15); LOG_WARNING(Service, "(STUBBED) called"); } diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp new file mode 100644 index 000000000..2b4c6c5d0 --- /dev/null +++ b/src/core/hle/service/audio/audio.cpp @@ -0,0 +1,16 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/audio/audio.h" +#include "core/hle/service/audio/audout_u.h" + +namespace Service { +namespace Audio { + +void InstallInterfaces(SM::ServiceManager& service_manager) { + std::make_shared<AudOutU>()->InstallAsService(service_manager); +} + +} // namespace Audio +} // namespace Service diff --git a/src/core/hle/service/audio/audio.h b/src/core/hle/service/audio/audio.h new file mode 100644 index 000000000..cbd56b2a8 --- /dev/null +++ b/src/core/hle/service/audio/audio.h @@ -0,0 +1,16 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service { +namespace Audio { + +/// Registers all Audio services with the specified service manager. +void InstallInterfaces(SM::ServiceManager& service_manager); + +} // namespace Audio +} // namespace Service diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp new file mode 100644 index 000000000..c028262c6 --- /dev/null +++ b/src/core/hle/service/audio/audout_u.cpp @@ -0,0 +1,26 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/service/audio/audout_u.h" + +namespace Service { +namespace Audio { + +void AudOutU::ListAudioOuts(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service, "(STUBBED) called"); + IPC::RequestBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); +} + +AudOutU::AudOutU() : ServiceFramework("audout:u") { + static const FunctionInfo functions[] = { + {0x00000000, &AudOutU::ListAudioOuts, "ListAudioOuts"}, + }; + RegisterHandlers(functions); +} + +} // namespace Audio +} // namespace Service diff --git a/src/core/hle/service/audio/audout_u.h b/src/core/hle/service/audio/audout_u.h new file mode 100644 index 000000000..42680af94 --- /dev/null +++ b/src/core/hle/service/audio/audout_u.h @@ -0,0 +1,23 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/kernel/hle_ipc.h" +#include "core/hle/service/service.h" + +namespace Service { +namespace Audio { + +class AudOutU final : public ServiceFramework<AudOutU> { +public: + AudOutU(); + ~AudOutU() = default; + +private: + void ListAudioOuts(Kernel::HLERequestContext& ctx); +}; + +} // namespace Audio +} // namespace Service diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index f838713a3..3f74aed06 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -1,19 +1,74 @@ -// Copyright 2015 Citra Emulator Project +// Copyright 2018 yuzu emulator team // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/client_port.h" +#include "core/hle/kernel/client_session.h" +#include "core/hle/kernel/shared_memory.h" #include "core/hle/service/hid/hid.h" #include "core/hle/service/service.h" namespace Service { namespace HID { -void Init() {} +class IAppletResource final : public ServiceFramework<IAppletResource> { +public: + IAppletResource() : ServiceFramework("IAppletResource") { + static const FunctionInfo functions[] = { + {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"}, + }; + RegisterHandlers(functions); -void Shutdown() {} + shared_mem = Kernel::SharedMemory::Create( + nullptr, 0x40000, Kernel::MemoryPermission::ReadWrite, Kernel::MemoryPermission::Read, + 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory"); + } + +private: + void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { + IPC::RequestBuilder rb{ctx, 2, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushCopyObjects(shared_mem); + LOG_DEBUG(Service, "called"); + } + + // Handle to shared memory region designated to HID service + Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; +}; + +class Hid final : public ServiceFramework<Hid> { +public: + Hid() : ServiceFramework("hid") { + static const FunctionInfo functions[] = { + {0x00000000, &Hid::CreateAppletResource, "CreateAppletResource"}, + }; + RegisterHandlers(functions); + } + ~Hid() = default; + +private: + void CreateAppletResource(Kernel::HLERequestContext& ctx) { + auto client_port = std::make_shared<IAppletResource>()->CreatePort(); + auto session = client_port->Connect(); + if (session.Succeeded()) { + LOG_DEBUG(Service, "called, initialized IAppletResource -> session=%u", + (*session)->GetObjectId()); + IPC::RequestBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushMoveObjects(std::move(session).Unwrap()); + } else { + UNIMPLEMENTED(); + } + } +}; void ReloadInputDevices() {} +void InstallInterfaces(SM::ServiceManager& service_manager) { + std::make_shared<Hid>()->InstallAsService(service_manager); +} + } // namespace HID } // namespace Service diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index a1d227dfe..f7621f62d 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -1,20 +1,19 @@ -// Copyright 2015 Citra Emulator Project +// Copyright 2018 yuzu emulator team // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once +#include "core/hle/service/service.h" + namespace Service { namespace HID { -/// Initialize HID service -void Init(); - -/// Shutdown HID service -void Shutdown(); - /// Reload input devices. Used when input configuration changed void ReloadInputDevices(); +/// Registers all HID services with the specified service manager. +void InstallInterfaces(SM::ServiceManager& service_manager); + } // namespace HID } // namespace Service diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index ca429e15f..2d0d2fb65 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp @@ -144,7 +144,7 @@ void LM::Initialize(Kernel::HLERequestContext& ctx) { if (session.Succeeded()) { LOG_DEBUG(Service_SM, "called, initialized logger -> session=%u", (*session)->GetObjectId()); - IPC::RequestBuilder rb{ctx, 1, 0, 1}; + IPC::RequestBuilder rb{ctx, 2, 0, 1}; rb.Push(RESULT_SUCCESS); rb.PushMoveObjects(std::move(session).Unwrap()); registered_loggers.emplace_back(std::move(client_port)); diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index b82df6f35..02d434660 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -17,6 +17,7 @@ #include "core/hle/service/am/am.h" #include "core/hle/service/aoc/aoc_u.h" #include "core/hle/service/apm/apm.h" +#include "core/hle/service/audio/audio.h" #include "core/hle/service/hid/hid.h" #include "core/hle/service/lm/lm.h" #include "core/hle/service/nvdrv/nvdrv.h" @@ -24,6 +25,7 @@ #include "core/hle/service/service.h" #include "core/hle/service/sm/controller.h" #include "core/hle/service/sm/sm.h" +#include "core/hle/service/time/time.h" #include "core/hle/service/vi/vi.h" using Kernel::ClientPort; @@ -78,7 +80,8 @@ Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() { ASSERT(port == nullptr); Kernel::SharedPtr<Kernel::ServerPort> server_port; Kernel::SharedPtr<Kernel::ClientPort> client_port; - std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, service_name); + std::tie(server_port, client_port) = + Kernel::ServerPort::CreatePortPair(max_sessions, service_name); port = MakeResult<Kernel::SharedPtr<Kernel::ServerPort>>(std::move(server_port)).Unwrap(); port->SetHleHandler(shared_from_this()); return client_port; @@ -164,20 +167,19 @@ void Init() { AM::InstallInterfaces(*SM::g_service_manager); AOC::InstallInterfaces(*SM::g_service_manager); APM::InstallInterfaces(*SM::g_service_manager); + Audio::InstallInterfaces(*SM::g_service_manager); + HID::InstallInterfaces(*SM::g_service_manager); LM::InstallInterfaces(*SM::g_service_manager); NVDRV::InstallInterfaces(*SM::g_service_manager); PCTL::InstallInterfaces(*SM::g_service_manager); + Time::InstallInterfaces(*SM::g_service_manager); VI::InstallInterfaces(*SM::g_service_manager); - HID::Init(); - LOG_DEBUG(Service, "initialized OK"); } /// Shutdown ServiceManager void Shutdown() { - HID::Shutdown(); - SM::g_service_manager = nullptr; g_kernel_named_ports.clear(); LOG_DEBUG(Service, "shutdown OK"); diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp new file mode 100644 index 000000000..e3d58aa60 --- /dev/null +++ b/src/core/hle/service/time/time.cpp @@ -0,0 +1,16 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/time/time.h" +#include "core/hle/service/time/time_s.h" + +namespace Service { +namespace Time { + +void InstallInterfaces(SM::ServiceManager& service_manager) { + std::make_shared<TimeS>()->InstallAsService(service_manager); +} + +} // namespace Time +} // namespace Service diff --git a/src/core/hle/service/time/time.h b/src/core/hle/service/time/time.h new file mode 100644 index 000000000..7d0803e24 --- /dev/null +++ b/src/core/hle/service/time/time.h @@ -0,0 +1,16 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service { +namespace Time { + +/// Registers all Time services with the specified service manager. +void InstallInterfaces(SM::ServiceManager& service_manager); + +} // namespace Time +} // namespace Service diff --git a/src/core/hle/service/time/time_s.cpp b/src/core/hle/service/time/time_s.cpp new file mode 100644 index 000000000..6b0597d8e --- /dev/null +++ b/src/core/hle/service/time/time_s.cpp @@ -0,0 +1,58 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <chrono> +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/client_port.h" +#include "core/hle/kernel/client_session.h" +#include "core/hle/service/time/time_s.h" + +namespace Service { +namespace Time { + +class ISystemClock final : public ServiceFramework<ISystemClock> { +public: + ISystemClock() : ServiceFramework("ISystemClock") { + static const FunctionInfo functions[] = { + {0, &ISystemClock::GetCurrentTime, "GetCurrentTime"}, + }; + RegisterHandlers(functions); + } + +private: + void GetCurrentTime(Kernel::HLERequestContext& ctx) { + const s64 time_since_epoch{std::chrono::duration_cast<std::chrono::milliseconds>( + std::chrono::system_clock::now().time_since_epoch()) + .count()}; + IPC::RequestBuilder rb{ctx, 4}; + rb.Push(RESULT_SUCCESS); + rb.Push<u64>(time_since_epoch); + LOG_DEBUG(Service, "called"); + } +}; + +void TimeS::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { + auto client_port = std::make_shared<ISystemClock>()->CreatePort(); + auto session = client_port->Connect(); + if (session.Succeeded()) { + LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", + (*session)->GetObjectId()); + IPC::RequestBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushMoveObjects(std::move(session).Unwrap()); + } else { + UNIMPLEMENTED(); + } +} + +TimeS::TimeS() : ServiceFramework("time:s") { + static const FunctionInfo functions[] = { + {0x00000000, &TimeS::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, + }; + RegisterHandlers(functions); +} + +} // namespace Time +} // namespace Service diff --git a/src/core/hle/service/time/time_s.h b/src/core/hle/service/time/time_s.h new file mode 100644 index 000000000..073227910 --- /dev/null +++ b/src/core/hle/service/time/time_s.h @@ -0,0 +1,23 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/kernel/hle_ipc.h" +#include "core/hle/service/service.h" + +namespace Service { +namespace Time { + +class TimeS final : public ServiceFramework<TimeS> { +public: + TimeS(); + ~TimeS() = default; + +private: + void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); +}; + +} // namespace Time +} // namespace Service diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index d3b63949e..b35a7a377 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -12,6 +12,8 @@ #include "core/hle/service/nvdrv/nvdrv_a.h" #include "core/hle/service/vi/vi.h" #include "core/hle/service/vi/vi_m.h" +#include "video_core/renderer_base.h" +#include "video_core/video_core.h" namespace Service { namespace VI { @@ -743,7 +745,8 @@ void NVFlinger::Compose() { auto buffer = buffer_queue->AcquireBuffer(); if (buffer == boost::none) { - // There was no queued buffer to draw. + // There was no queued buffer to draw, render previous frame + VideoCore::g_renderer->SwapBuffers({}); continue; } diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index d15db6c8c..28893b181 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h @@ -5,6 +5,7 @@ #pragma once #include <memory> +#include <boost/optional.hpp> #include "common/assert.h" #include "common/common_types.h" @@ -47,7 +48,7 @@ public: virtual ~RendererBase() {} /// Swap buffers (render frame) - virtual void SwapBuffers(const FramebufferInfo& framebuffer_info) = 0; + virtual void SwapBuffers(boost::optional<const FramebufferInfo&> framebuffer_info) = 0; /** * Set the emulator window to use for renderer diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index a5df91604..50396b5c1 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -4,8 +4,8 @@ #include <algorithm> #include <cstddef> -#include <cstring> #include <cstdlib> +#include <cstring> #include <memory> #include <glad/glad.h> #include "common/assert.h" @@ -98,20 +98,23 @@ RendererOpenGL::RendererOpenGL() = default; RendererOpenGL::~RendererOpenGL() = default; /// Swap buffers (render frame) -void RendererOpenGL::SwapBuffers(const FramebufferInfo& framebuffer_info) { +void RendererOpenGL::SwapBuffers(boost::optional<const FramebufferInfo&> framebuffer_info) { // Maintain the rasterizer's state as a priority OpenGLState prev_state = OpenGLState::GetCurState(); state.Apply(); - if (screen_info.texture.width != (GLsizei)framebuffer_info.width || - screen_info.texture.height != (GLsizei)framebuffer_info.height || - screen_info.texture.pixel_format != framebuffer_info.pixel_format) { - // Reallocate texture if the framebuffer size has changed. - // This is expected to not happen very often and hence should not be a - // performance problem. - ConfigureFramebufferTexture(screen_info.texture, framebuffer_info); + if (framebuffer_info != boost::none) { + // If framebuffer_info is provided, reload it from memory to a texture + if (screen_info.texture.width != (GLsizei)framebuffer_info->width || + screen_info.texture.height != (GLsizei)framebuffer_info->height || + screen_info.texture.pixel_format != framebuffer_info->pixel_format) { + // Reallocate texture if the framebuffer size has changed. + // This is expected to not happen very often and hence should not be a + // performance problem. + ConfigureFramebufferTexture(screen_info.texture, *framebuffer_info); + } + LoadFBToScreenInfo(*framebuffer_info, screen_info); } - LoadFBToScreenInfo(framebuffer_info, screen_info); DrawScreens(); @@ -290,16 +293,16 @@ void RendererOpenGL::LoadFBToScreenInfo(const FramebufferInfo& framebuffer_info, * Fills active OpenGL texture with the given RGB color. Since the color is solid, the texture can * be 1x1 but will stretch across whatever it's rendered on. */ -void RendererOpenGL::LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, +void RendererOpenGL::LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, u8 color_a, const TextureInfo& texture) { state.texture_units[0].texture_2d = texture.resource.handle; state.Apply(); glActiveTexture(GL_TEXTURE0); - u8 framebuffer_data[3] = {color_r, color_g, color_b}; + u8 framebuffer_data[4] = {color_a, color_b, color_g, color_r}; // Update existing texture - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, framebuffer_data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, framebuffer_data); state.texture_units[0].texture_2d = 0; state.Apply(); @@ -361,6 +364,9 @@ void RendererOpenGL::InitOpenGLObjects() { state.texture_units[0].texture_2d = 0; state.Apply(); + + // Clear screen to black + LoadColorToActiveGLTexture(0, 0, 0, 0, screen_info.texture); } void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture, diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index dc21d7a38..dd01e1b1a 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h @@ -37,7 +37,7 @@ public: ~RendererOpenGL() override; /// Swap buffers (render frame) - void SwapBuffers(const FramebufferInfo& framebuffer_info) override; + void SwapBuffers(boost::optional<const FramebufferInfo&> framebuffer_info) override; /** * Set the emulator window to use for renderer @@ -53,17 +53,15 @@ public: private: void InitOpenGLObjects(); - void ConfigureFramebufferTexture(TextureInfo& texture, - const FramebufferInfo& framebuffer_info); + void ConfigureFramebufferTexture(TextureInfo& texture, const FramebufferInfo& framebuffer_info); void DrawScreens(); void DrawSingleScreen(const ScreenInfo& screen_info, float x, float y, float w, float h); void UpdateFramerate(); // Loads framebuffer from emulated memory into the display information structure - void LoadFBToScreenInfo(const FramebufferInfo& framebuffer_info, - ScreenInfo& screen_info); - // Fills active OpenGL texture with the given RGB color. - void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, const TextureInfo& texture); + void LoadFBToScreenInfo(const FramebufferInfo& framebuffer_info, ScreenInfo& screen_info); + // Fills active OpenGL texture with the given RGBA color. + void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, u8 color_a, const TextureInfo& texture); EmuWindow* render_window; ///< Handle to render window |