diff --git a/src/backend/Core.cpp b/src/backend/Core.cpp index 2f00ce66..70e2f8de 100644 --- a/src/backend/Core.cpp +++ b/src/backend/Core.cpp @@ -1,6 +1,7 @@ #include #include #include +#include namespace n64 { u32 extraCycles = 0; @@ -16,15 +17,16 @@ u32 PopStalledCycles() { } Core::Core() { + SDL_Init(SDL_INIT_EVERYTHING); if(SDL_GameControllerAddMappingsFromFile("resources/gamecontrollerdb.txt") < 0) { Util::warn("Failed to load game controller DB"); } cpu = std::make_unique(); - LoadParallelRDP(cpu->mem.GetRDRAM()); } void Core::Stop() { + render = false; pause = true; romLoaded = false; cpu->Reset(); @@ -54,6 +56,7 @@ void Core::LoadROM(const std::string& rom_) { cpu->mem.LoadSRAM(cpu->mem.saveType, rom); PIF::ExecutePIF(cpu->mem, cpu->regs); pause = false; + render = true; } void Core::Run(float volumeL, float volumeR) { diff --git a/src/backend/Core.hpp b/src/backend/Core.hpp index f51822e3..cada6c05 100644 --- a/src/backend/Core.hpp +++ b/src/backend/Core.hpp @@ -22,7 +22,7 @@ struct Core { u32 breakpoint = 0; bool pause = true; - bool render = true; + bool render = false; u32 cycles = 0; bool romLoaded = false; std::string rom; diff --git a/src/frontend/EmuThread.cpp b/src/frontend/EmuThread.cpp index 043292ee..cd95275b 100644 --- a/src/frontend/EmuThread.cpp +++ b/src/frontend/EmuThread.cpp @@ -1,11 +1,23 @@ +#include #include +#include -EmuThread::EmuThread(QObject* parent_object) noexcept : QThread(parent_object) {} +EmuThread::EmuThread(std::unique_ptr&& instance, std::unique_ptr&& wsiPlatform, std::unique_ptr&& windowInfo, QObject* parent_object) noexcept + : QThread(parent_object), instance(std::move(instance)), wsiPlatform(std::move(wsiPlatform)), windowInfo(std::move(windowInfo)) {} [[noreturn]] void EmuThread::run() noexcept { + LoadWSIPlatform(instance.get(), std::move(wsiPlatform), std::move(windowInfo)); + LoadParallelRDP(core.cpu->mem.GetRDRAM()); while (true) { if (!core.pause) { core.Run(0.5, 0.5); + if(core.render) { + UpdateScreenParallelRdp(core, core.cpu->mem.mmio.vi); + } + } else { + if(core.render) { + UpdateScreenParallelRdpNoGame(core); + } } } } \ No newline at end of file diff --git a/src/frontend/EmuThread.hpp b/src/frontend/EmuThread.hpp index 215bcdbb..1bbbe168 100644 --- a/src/frontend/EmuThread.hpp +++ b/src/frontend/EmuThread.hpp @@ -2,12 +2,20 @@ #include #include +struct QtInstanceFactory; +struct ParallelRdpWindowInfo; +namespace Vulkan { +struct WSIPlatform; +} + class EmuThread : public QThread { Q_OBJECT - + std::unique_ptr instance; + std::unique_ptr wsiPlatform; + std::unique_ptr windowInfo; public: - explicit EmuThread(QObject* parent_object) noexcept; + explicit EmuThread(std::unique_ptr&& instance, std::unique_ptr&& wsiPlatform, std::unique_ptr&& windowInfo, QObject* parent_object) noexcept; [[noreturn]] void run() noexcept override; diff --git a/src/frontend/KaizenQt.cpp b/src/frontend/KaizenQt.cpp index 9a4be5c2..3dcbdbaf 100644 --- a/src/frontend/KaizenQt.cpp +++ b/src/frontend/KaizenQt.cpp @@ -1,8 +1,16 @@ #include #include #include +#include + +KaizenQt::KaizenQt() noexcept { + mainWindow = new MainWindowController(); + emuThread = new EmuThread( + std::move(mainWindow->view.vulkanWidget->instance), + std::move(mainWindow->view.vulkanWidget->wsiPlatform), + std::move(mainWindow->view.vulkanWidget->windowInfo), + mainWindow); -KaizenQt::KaizenQt() noexcept : mainWindow(new MainWindowController), emuThread(new EmuThread(mainWindow)) { ConnectMainWindowSignalsToSlots(); mainWindow->show(); @@ -19,6 +27,6 @@ void KaizenQt::ConnectMainWindowSignalsToSlots() noexcept { } void KaizenQt::LoadROM(const QString& file_name) noexcept { - emuThread->core.LoadROM(file_name.toStdString()); emuThread->start(); + emuThread->core.LoadROM(file_name.toStdString()); } \ No newline at end of file diff --git a/src/frontend/MainWindow.cpp b/src/frontend/MainWindow.cpp index 0959da8f..b44e886e 100644 --- a/src/frontend/MainWindow.cpp +++ b/src/frontend/MainWindow.cpp @@ -2,7 +2,7 @@ #include #include -MainWindowController::MainWindowController() noexcept : vulkanWidget(new RenderWidget(this)) { +MainWindowController::MainWindowController() noexcept { view.setupUi(this); ConnectSignalsToSlots(); } diff --git a/src/frontend/MainWindow.hpp b/src/frontend/MainWindow.hpp index 49e3a5d0..0337f80c 100644 --- a/src/frontend/MainWindow.hpp +++ b/src/frontend/MainWindow.hpp @@ -11,11 +11,10 @@ class MainWindowController : public QMainWindow public: MainWindowController() noexcept; + Ui::MainWindow view; private: void ConnectSignalsToSlots() noexcept; - Ui::MainWindow view; - RenderWidget *vulkanWidget; bool textPauseToggle = false; Q_SIGNALS: diff --git a/src/frontend/RenderWidget.cpp b/src/frontend/RenderWidget.cpp index e9ea20fc..d1e20026 100644 --- a/src/frontend/RenderWidget.cpp +++ b/src/frontend/RenderWidget.cpp @@ -19,11 +19,10 @@ RenderWidget::RenderWidget(QWidget* parent) : QWidget(parent) { Util::panic("Could not initialize Vulkan ICD"); } - windowHandle()->setVulkanInstance(&instance.get_qvkinstance()); + instance = std::make_unique(); + windowHandle()->setVulkanInstance(&instance->qVkInstance); windowHandle()->create(); wsiPlatform = std::make_unique(windowHandle()); windowInfo = std::make_unique(windowHandle()); - - LoadWSIPlatform(&instance, std::move(wsiPlatform), std::move(windowInfo)); } \ No newline at end of file diff --git a/src/frontend/RenderWidget.hpp b/src/frontend/RenderWidget.hpp index eb314a22..4993d6a7 100644 --- a/src/frontend/RenderWidget.hpp +++ b/src/frontend/RenderWidget.hpp @@ -4,10 +4,11 @@ #include #include #include +#include struct QtInstanceFactory : Vulkan::InstanceFactory { VkInstance create_instance(const VkInstanceCreateInfo *info) override { - instance.setApiVersion({1,3,0}); + qVkInstance.setApiVersion({1,3,0}); QByteArrayList exts; for(int i = 0; i < info->enabledExtensionCount; i++) { exts.push_back(QByteArray::fromStdString(info->ppEnabledExtensionNames[i])); @@ -16,17 +17,15 @@ struct QtInstanceFactory : Vulkan::InstanceFactory { for(int i = 0; i < info->enabledLayerCount; i++) { layers.push_back(QByteArray::fromStdString(info->ppEnabledLayerNames[i])); } - instance.setExtensions(exts); - instance.setLayers(layers); - instance.setApiVersion({1,3,0}); - instance.create(); + qVkInstance.setExtensions(exts); + qVkInstance.setLayers(layers); + qVkInstance.setApiVersion({1,3,0}); + qVkInstance.create(); - return instance.vkInstance(); + return qVkInstance.vkInstance(); } - QVulkanInstance& get_qvkinstance() { return instance; } -private: - QVulkanInstance instance; + QVulkanInstance qVkInstance; }; class QtParallelRdpWindowInfo : public ParallelRdpWindowInfo { @@ -58,6 +57,8 @@ public: return QVulkanInstance::surfaceForWindow(window); } + void destroy_surface(VkInstance instance, VkSurfaceKHR surface) override { } + uint32_t get_surface_width() override { return 640; } @@ -70,7 +71,9 @@ public: return true; } - void poll_input() override { } + void poll_input() override { + SDL_PumpEvents(); + } void event_frame_tick(double frame, double elapsed) override { } @@ -93,8 +96,8 @@ public: [[nodiscard]] QPaintEngine* paintEngine() const override { return nullptr; } -private: + std::unique_ptr windowInfo; std::unique_ptr wsiPlatform; - QtInstanceFactory instance; + std::unique_ptr instance; }; \ No newline at end of file diff --git a/src/frontend/mainwindow.ui b/src/frontend/mainwindow.ui index 1c8fc3a4..f741ed2d 100644 --- a/src/frontend/mainwindow.ui +++ b/src/frontend/mainwindow.ui @@ -30,6 +30,9 @@ 0 + + + @@ -119,6 +122,13 @@ + + + RenderWidget + QWidget +
RenderWidget.hpp
+
+