Add stub Dolphin recipe.

This commit is contained in:
Augustin Cavalier
2020-12-21 20:47:02 -05:00
parent 66b3662e27
commit 7a09137062
2 changed files with 355 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
SUMMARY="A GameCube and Wii emulator"
DESCRIPTION="Dolphin is an emulator for two recent Nintendo video game consoles: the \
GameCube and the Wii. It allows PC gamers to enjoy games for these two consoles in \
full HD (1080p) with several enhancements: compatibility with all PC controllers, \
turbo speed, networked multiplayer, and even more!"
HOMEPAGE="https://dolphin-emu.org/"
COPYRIGHT="2020 Dolphin Emulator Project"
LICENSE="GNU GPL v2"
REVISION="1"
gitRevision="a34823df61df65168aa40ef5e82e44defd4a0138"
SOURCE_URI="https://github.com/dolphin-emu/dolphin/archive/$gitRevision.tar.gz"
CHECKSUM_SHA256="f2fcdcd26e8156b15adc0bc031fdaae3ff29bee59f46376ad57d7165b3c1f0c9"
SOURCE_DIR="dolphin-$gitRevision"
PATCHES="dolphin-$portVersion.patch"
ARCHITECTURES="!x86_gcc2 !x86 ?x86_64"
PROVIDES="
dolphin = $portVersion
app:Dolphin = $portVersion
"
REQUIRES="
haiku
lib:libQt5Core
lib:libQt5Widgets
"
BUILD_REQUIRES="
haiku${secondaryArchSuffix}_devel
devel:libQt5Core
devel:libQt5Widgets
"
BUILD_PREREQUIRES="
cmd:cmake
cmd:gcc
cmd:ld
cmd:lrelease >= 5
cmd:ninja
cmd:pkg_config
"
BUILD()
{
cmake . \
-GNinja \
-DCMAKE_INSTALL_PREFIX=$appsDir/Dolphin/
-DDOLPHIN_WC_DESCRIBE="$portVersion"
-DENABLE_VULKAN=OFF \
-DENABLE_NOGUI=OFF
ninja $jobArgs
}
INSTALL()
{
ninja install
addAppDeskbarSymlink $appsDir/Dolphin/Dolphin Dolphin
}

View File

@@ -0,0 +1,296 @@
From 8a4481489dee5a41b35a150938306d05414e6989 Mon Sep 17 00:00:00 2001
From: waddlesplash <waddlesplash@gmail.com>
Date: Sat, 12 Dec 2020 15:25:51 -0500
Subject: [PATCH] Rehabilitate Haiku support.
---
CMakeLists.txt | 2 +-
Source/Core/Common/CMakeLists.txt | 7 ++
Source/Core/Common/GL/GLContext.cpp | 7 ++
Source/Core/Common/GL/GLInterface/BGL.cpp | 93 ++++++++++++++++++++
Source/Core/Common/GL/GLInterface/BGL.h | 36 ++++++++
Source/Core/Common/WindowSystemInfo.h | 1 +
Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h | 2 +-
Source/Core/DolphinQt/MainWindow.cpp | 4 +-
Source/Core/VideoCommon/DriverDetails.cpp | 2 +
Source/Core/VideoCommon/DriverDetails.h | 1 +
10 files changed, 152 insertions(+), 3 deletions(-)
create mode 100644 Source/Core/Common/GL/GLInterface/BGL.cpp
create mode 100644 Source/Core/Common/GL/GLInterface/BGL.h
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b01b90fc548..06851076ce7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,7 +20,7 @@ set(DISTRIBUTOR "None" CACHE STRING "Name of the distributor.")
if(UNIX AND NOT APPLE AND NOT ANDROID)
option(ENABLE_X11 "Enables X11 Support" ON)
endif()
-if(NOT WIN32 AND NOT APPLE)
+if(NOT WIN32 AND NOT APPLE AND NOT HAIKU)
option(ENABLE_EGL "Enables EGL OpenGL Interface" ON)
endif()
diff --git a/Source/Core/Common/CMakeLists.txt b/Source/Core/Common/CMakeLists.txt
index 543c4cf9bb9..7656fd1f589 100644
--- a/Source/Core/Common/CMakeLists.txt
+++ b/Source/Core/Common/CMakeLists.txt
@@ -168,6 +168,8 @@ elseif (ANDROID)
PRIVATE
androidcommon
)
+elseif(HAIKU)
+ target_link_libraries(common PRIVATE be GL)
endif()
if(ANDROID)
@@ -256,6 +258,11 @@ elseif(APPLE)
GL/GLInterface/AGL.h
GL/GLInterface/AGL.mm
)
+elseif(HAIKU)
+ target_sources(common PRIVATE
+ GL/GLInterface/BGL.h
+ GL/GLInterface/BGL.cpp
+ )
elseif(ENABLE_X11 AND X11_FOUND)
target_sources(common PRIVATE
GL/GLX11Window.cpp
diff --git a/Source/Core/Common/GL/GLContext.cpp b/Source/Core/Common/GL/GLContext.cpp
index 2f72204af85..945008538f1 100644
--- a/Source/Core/Common/GL/GLContext.cpp
+++ b/Source/Core/Common/GL/GLContext.cpp
@@ -12,6 +12,9 @@
#if defined(_WIN32)
#include "Common/GL/GLInterface/WGL.h"
#endif
+#if defined(__HAIKU__)
+#include "Common/GL/GLInterface/BGL.h"
+#endif
#if HAVE_X11
#include "Common/GL/GLInterface/GLX.h"
#endif
@@ -92,6 +95,10 @@ std::unique_ptr<GLContext> GLContext::Create(const WindowSystemInfo& wsi, bool s
if (wsi.type == WindowSystemType::Android)
context = std::make_unique<GLContextEGLAndroid>();
#endif
+#if defined(__HAIKU__)
+ if (wsi.type == WindowSystemType::Haiku)
+ context = std::make_unique<GLContextBGL>();
+#endif
#if HAVE_X11
if (wsi.type == WindowSystemType::X11)
{
diff --git a/Source/Core/Common/GL/GLInterface/BGL.cpp b/Source/Core/Common/GL/GLInterface/BGL.cpp
new file mode 100644
index 00000000000..118639c2bbe
--- /dev/null
+++ b/Source/Core/Common/GL/GLInterface/BGL.cpp
@@ -0,0 +1,93 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "Common/GL/GLInterface/BGL.h"
+
+#include <GLView.h>
+#include <Size.h>
+#include <Window.h>
+
+BGLView* GLContextBGL::m_current = nullptr;
+
+GLContextBGL::~GLContextBGL()
+{
+ if (!m_window)
+ delete m_gl;
+}
+
+bool GLContextBGL::Initialize(const WindowSystemInfo& wsi, bool stereo, bool core)
+{
+ m_window = static_cast<BWindow*>(wsi.render_window);
+
+ m_gl = new BGLView(m_window ? m_window->Bounds() : BRect(), "GLContextBGL", B_FOLLOW_ALL_SIDES, 0,
+ BGL_RGB | BGL_DOUBLE | BGL_ALPHA);
+ if (m_window)
+ m_window->AddChild(m_gl);
+
+ m_opengl_mode = Mode::OpenGL;
+
+ m_gl->LockLooper();
+ BRect size = m_gl->Frame();
+ m_gl->UnlockLooper();
+
+ m_backbuffer_width = size.IntegerWidth();
+ m_backbuffer_height = size.IntegerHeight();
+
+ MakeCurrent();
+
+ return true;
+}
+
+bool GLContextBGL::IsHeadless() const
+{
+ return !m_window;
+}
+
+bool GLContextBGL::MakeCurrent()
+{
+ if (m_current)
+ m_current->UnlockGL();
+ m_gl->LockGL();
+ m_current = m_gl;
+ return true;
+}
+
+bool GLContextBGL::ClearCurrent()
+{
+ if (!m_current)
+ return true;
+
+ //assert(m_gl == m_current);
+ m_current->UnlockGL();
+ m_current = nullptr;
+ return true;
+}
+
+void GLContextBGL::Swap()
+{
+ m_gl->SwapBuffers();
+}
+
+void GLContextBGL::Update()
+{
+ m_gl->LockLooper();
+ BRect size = m_gl->Frame();
+ if (m_backbuffer_width == size.IntegerWidth() && m_backbuffer_height == size.IntegerHeight()) {
+ m_gl->UnlockLooper();
+ return;
+ }
+
+ ClearCurrent();
+ m_gl->FrameResized(size.Width(), size.Height());
+ MakeCurrent();
+ m_gl->UnlockLooper();
+
+ m_backbuffer_width = size.IntegerWidth();
+ m_backbuffer_height = size.IntegerHeight();
+}
+
+void* GLContextBGL::GetFuncAddress(const std::string& name)
+{
+ return m_gl->GetGLProcAddress(name.c_str());
+}
diff --git a/Source/Core/Common/GL/GLInterface/BGL.h b/Source/Core/Common/GL/GLInterface/BGL.h
new file mode 100644
index 00000000000..54089a324e6
--- /dev/null
+++ b/Source/Core/Common/GL/GLInterface/BGL.h
@@ -0,0 +1,36 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "Common/GL/GLContext.h"
+
+class BWindow;
+class BGLView;
+
+class GLContextBGL final : public GLContext
+{
+public:
+ ~GLContextBGL() override;
+
+ bool IsHeadless() const override;
+
+ bool MakeCurrent() override;
+ bool ClearCurrent() override;
+
+ void Update() override;
+
+ void Swap() override;
+
+ void* GetFuncAddress(const std::string& name) override;
+
+protected:
+ bool Initialize(const WindowSystemInfo& wsi, bool stereo, bool core) override;
+
+private:
+ BWindow* m_window;
+ BGLView* m_gl;
+
+ static BGLView* m_current;
+};
diff --git a/Source/Core/Common/WindowSystemInfo.h b/Source/Core/Common/WindowSystemInfo.h
index 244a985cdfe..ff2bebabedd 100644
--- a/Source/Core/Common/WindowSystemInfo.h
+++ b/Source/Core/Common/WindowSystemInfo.h
@@ -13,6 +13,7 @@ enum class WindowSystemType
X11,
Wayland,
FBDev,
+ Haiku,
};
struct WindowSystemInfo
diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h
index ed79b9a9b17..0075e40aaa9 100644
--- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h
+++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.h
@@ -383,7 +383,7 @@ class CEXIETHERNET : public IEXIDevice
bool m_bba_link_up = false;
bool m_bba_failure_notified = false;
#if defined(WIN32) || defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \
- defined(__OpenBSD__)
+ defined(__OpenBSD__) || defined(__HAIKU__)
sf::UdpSocket m_sf_socket;
sf::IpAddress m_sf_recipient_ip;
char m_in_frame[9004];
diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp
index 54deeb47c6c..f4a062a8f55 100644
--- a/Source/Core/DolphinQt/MainWindow.cpp
+++ b/Source/Core/DolphinQt/MainWindow.cpp
@@ -152,6 +152,8 @@ static WindowSystemType GetWindowSystemType()
return WindowSystemType::X11;
else if (platform_name == QStringLiteral("wayland"))
return WindowSystemType::Wayland;
+ else if (platform_name == QStringLiteral("haiku"))
+ return WindowSystemType::Haiku;
ModalMessageBox::critical(
nullptr, QStringLiteral("Error"),
@@ -165,7 +167,7 @@ static WindowSystemInfo GetWindowSystemInfo(QWindow* window)
wsi.type = GetWindowSystemType();
// Our Win32 Qt external doesn't have the private API.
-#if defined(WIN32) || defined(__APPLE__)
+#if defined(WIN32) || defined(__APPLE__) || defined(__HAIKU__)
wsi.render_window = window ? reinterpret_cast<void*>(window->winId()) : nullptr;
wsi.render_surface = wsi.render_window;
#else
diff --git a/Source/Core/VideoCommon/DriverDetails.cpp b/Source/Core/VideoCommon/DriverDetails.cpp
index 88a482ecf83..990894f8714 100644
--- a/Source/Core/VideoCommon/DriverDetails.cpp
+++ b/Source/Core/VideoCommon/DriverDetails.cpp
@@ -35,6 +35,8 @@ constexpr u32 m_os = OS_ALL | OS_LINUX;
constexpr u32 m_os = OS_ALL | OS_FREEBSD;
#elif __OpenBSD__
constexpr u32 m_os = OS_ALL | OS_OPENBSD;
+#elif __HAIKU__
+constexpr u32 m_os = OS_ALL | OS_HAIKU;
#endif
static API m_api = API_OPENGL;
diff --git a/Source/Core/VideoCommon/DriverDetails.h b/Source/Core/VideoCommon/DriverDetails.h
index 3e58a5fb586..9707b1b0da0 100644
--- a/Source/Core/VideoCommon/DriverDetails.h
+++ b/Source/Core/VideoCommon/DriverDetails.h
@@ -27,6 +27,7 @@ enum OS
OS_ANDROID = (1 << 4),
OS_FREEBSD = (1 << 5),
OS_OPENBSD = (1 << 6),
+ OS_HAIKU = (1 << 7),
};
// Enum of known vendors
// Tegra and Nvidia are separated out due to such substantial differences