diff options
| author | Stenzek <stenzek@gmail.com> | 2019-04-10 14:44:21 +0000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2019-09-01 14:00:40 +1000 |
| commit | 0a75e71672ed63d6d92ba42c1a183e72090d7c83 (patch) | |
| tree | 1bfd16cc9d128482eefe09ed82dafd7d687353b7 /Source/Core/DolphinNoGUI/PlatformFBDev.cpp | |
| parent | 43fe02ee9b820d16d1759a1e37b666bcb1e5a298 (diff) | |
DolphinNoGUI: Add a FBDev platform
And the associated GLContext bits
Diffstat (limited to 'Source/Core/DolphinNoGUI/PlatformFBDev.cpp')
| -rw-r--r-- | Source/Core/DolphinNoGUI/PlatformFBDev.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/Source/Core/DolphinNoGUI/PlatformFBDev.cpp b/Source/Core/DolphinNoGUI/PlatformFBDev.cpp new file mode 100644 index 0000000000..9818105521 --- /dev/null +++ b/Source/Core/DolphinNoGUI/PlatformFBDev.cpp @@ -0,0 +1,102 @@ +// Copyright 2018 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include <unistd.h> + +#include "DolphinNoGUI/Platform.h" + +#include "Common/MsgHandler.h" +#include "Core/ConfigManager.h" +#include "Core/Core.h" +#include "Core/State.h" + +#include <climits> +#include <cstdio> + +#include <fcntl.h> +#include <linux/fb.h> +#include <linux/kd.h> +#include <linux/vt.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <termios.h> +#include <unistd.h> +#include "VideoCommon/RenderBase.h" + +namespace +{ +class PlatformFBDev : public Platform +{ +public: + ~PlatformFBDev() override; + + bool Init() override; + void SetTitle(const std::string& string) override; + void MainLoop() override; + + WindowSystemInfo GetWindowSystemInfo() const; + +private: + bool OpenFramebuffer(); + + int m_fb_fd = -1; +}; + +PlatformFBDev::~PlatformFBDev() +{ + if (m_fb_fd >= 0) + close(m_fb_fd); +} + +bool PlatformFBDev::Init() +{ + if (!OpenFramebuffer()) + return false; + + return true; +} + +bool PlatformFBDev::OpenFramebuffer() +{ + m_fb_fd = open("/dev/fb0", O_RDWR); + if (m_fb_fd < 0) + { + std::fprintf(stderr, "open(/dev/fb0) failed\n"); + return false; + } + + return true; +} + +void PlatformFBDev::SetTitle(const std::string& string) +{ + std::fprintf(stdout, "%s\n", string.c_str()); +} + +void PlatformFBDev::MainLoop() +{ + while (IsRunning()) + { + UpdateRunningFlag(); + Core::HostDispatchJobs(); + + // TODO: Is this sleep appropriate? + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } +} + +WindowSystemInfo PlatformFBDev::GetWindowSystemInfo() const +{ + WindowSystemInfo wsi; + wsi.type = WindowSystemType::FBDev; + wsi.display_connection = nullptr; // EGL_DEFAULT_DISPLAY + wsi.render_surface = nullptr; + return wsi; +} +} // namespace + +std::unique_ptr<Platform> Platform::CreateFBDevPlatform() +{ + return std::make_unique<PlatformFBDev>(); +} |
