From b048d4dd6eb19c8601a123664bb73e7b3d34088a Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Tue, 18 Jul 2023 22:00:28 -0700 Subject: [PATCH] Add `SDL_Window` to `initGraphicsContext` prototype This value is needed for vulkan to properly allocate a surface, and would benefit OpenGL to move more of its initialization code into here rather than in `emulator.cpp`. --- include/PICA/gpu.hpp | 6 ++---- include/renderer.hpp | 3 ++- include/renderer_gl/renderer_gl.hpp | 2 +- include/renderer_null/renderer_null.hpp | 2 +- include/renderer_vk/renderer_vk.hpp | 2 +- src/core/renderer_gl/renderer_gl.cpp | 2 +- src/core/renderer_null/renderer_null.cpp | 2 +- src/core/renderer_vk/renderer_vk.cpp | 6 +++++- src/emulator.cpp | 4 ++-- 9 files changed, 16 insertions(+), 13 deletions(-) diff --git a/include/PICA/gpu.hpp b/include/PICA/gpu.hpp index 4304a2de..b4236ee0 100644 --- a/include/PICA/gpu.hpp +++ b/include/PICA/gpu.hpp @@ -83,7 +83,7 @@ class GPU { bool lightingLUTDirty = false; GPU(Memory& mem, EmulatorConfig& config); - void initGraphicsContext() { renderer->initGraphicsContext(); } + void initGraphicsContext(SDL_Window* window) { renderer->initGraphicsContext(window); } void display() { renderer->display(); } void screenshot(const std::string& name) { renderer->screenshot(name); } @@ -103,9 +103,7 @@ class GPU { // TODO: Emulate the transfer engine & its registers // Then this can be emulated by just writing the appropriate values there - void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) { - renderer->clearBuffer(startAddress, endAddress, value, control); - } + void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) { renderer->clearBuffer(startAddress, endAddress, value, control); } // TODO: Emulate the transfer engine & its registers // Then this can be emulated by just writing the appropriate values there diff --git a/include/renderer.hpp b/include/renderer.hpp index 970b8933..f8e57bb3 100644 --- a/include/renderer.hpp +++ b/include/renderer.hpp @@ -16,6 +16,7 @@ enum class RendererType : s8 { }; class GPU; +class SDL_Window; class Renderer { protected: @@ -42,7 +43,7 @@ class Renderer { virtual void reset() = 0; virtual void display() = 0; // Display the 3DS screen contents to the window - virtual void initGraphicsContext() = 0; // Initialize graphics context + virtual void initGraphicsContext(SDL_Window* window) = 0; // Initialize graphics context virtual void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) = 0; // Clear a GPU buffer in VRAM virtual void displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) = 0; // Perform display transfer virtual void drawVertices(PICA::PrimType primType, std::span vertices) = 0; // Draw the given vertices diff --git a/include/renderer_gl/renderer_gl.hpp b/include/renderer_gl/renderer_gl.hpp index 15d12ade..3c729d76 100644 --- a/include/renderer_gl/renderer_gl.hpp +++ b/include/renderer_gl/renderer_gl.hpp @@ -72,7 +72,7 @@ class RendererGL final : public Renderer { void reset() override; void display() override; // Display the 3DS screen contents to the window - void initGraphicsContext() override; // Initialize graphics context + void initGraphicsContext(SDL_Window* window) override; // Initialize graphics context void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) override; // Clear a GPU buffer in VRAM void displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) override; // Perform display transfer void drawVertices(PICA::PrimType primType, std::span vertices) override; // Draw the given vertices diff --git a/include/renderer_null/renderer_null.hpp b/include/renderer_null/renderer_null.hpp index 29080786..553af035 100644 --- a/include/renderer_null/renderer_null.hpp +++ b/include/renderer_null/renderer_null.hpp @@ -9,7 +9,7 @@ class RendererNull final : public Renderer { void reset() override; void display() override; - void initGraphicsContext() override; + void initGraphicsContext(SDL_Window* window) override; void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) override; void displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) override; void drawVertices(PICA::PrimType primType, std::span vertices) override; diff --git a/include/renderer_vk/renderer_vk.hpp b/include/renderer_vk/renderer_vk.hpp index 7a2f9a55..36ad17b3 100644 --- a/include/renderer_vk/renderer_vk.hpp +++ b/include/renderer_vk/renderer_vk.hpp @@ -16,7 +16,7 @@ class RendererVK final : public Renderer { void reset() override; void display() override; - void initGraphicsContext() override; + void initGraphicsContext(SDL_Window* window) override; void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) override; void displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) override; void drawVertices(PICA::PrimType primType, std::span vertices) override; diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp index bef3fe93..0126b3b8 100644 --- a/src/core/renderer_gl/renderer_gl.cpp +++ b/src/core/renderer_gl/renderer_gl.cpp @@ -45,7 +45,7 @@ void RendererGL::reset() { } } -void RendererGL::initGraphicsContext() { +void RendererGL::initGraphicsContext(SDL_Window* window) { gl.reset(); auto gl_resources = cmrc::RendererGL::get_filesystem(); diff --git a/src/core/renderer_null/renderer_null.cpp b/src/core/renderer_null/renderer_null.cpp index 9df2ddeb..272ce4e3 100644 --- a/src/core/renderer_null/renderer_null.cpp +++ b/src/core/renderer_null/renderer_null.cpp @@ -5,7 +5,7 @@ RendererNull::~RendererNull() {} void RendererNull::reset() {} void RendererNull::display() {} -void RendererNull::initGraphicsContext() {} +void RendererNull::initGraphicsContext(SDL_Window* window) {} void RendererNull::clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) {} void RendererNull::displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) {} void RendererNull::drawVertices(PICA::PrimType primType, std::span vertices) {} diff --git a/src/core/renderer_vk/renderer_vk.cpp b/src/core/renderer_vk/renderer_vk.cpp index 6c5f3362..36400fd7 100644 --- a/src/core/renderer_vk/renderer_vk.cpp +++ b/src/core/renderer_vk/renderer_vk.cpp @@ -1,5 +1,6 @@ #include "renderer_vk/renderer_vk.hpp" +#include "SDL_vulkan.h" #include "helpers.hpp" #include "renderer_vk/vk_debug.hpp" @@ -11,7 +12,7 @@ void RendererVK::reset() {} void RendererVK::display() {} -void RendererVK::initGraphicsContext() { +void RendererVK::initGraphicsContext(SDL_Window* window) { // Resolve all function pointers static vk::DynamicLoader dl; VULKAN_HPP_DEFAULT_DISPATCHER.init(dl.getProcAddress("vkGetInstanceProcAddr")); @@ -129,6 +130,9 @@ void RendererVK::initGraphicsContext() { // Initialize device-specific function pointers VULKAN_HPP_DEFAULT_DISPATCHER.init(device.get()); + + VkSurfaceKHR surface; + SDL_Vulkan_CreateSurface(window, instance.get(), &surface); } void RendererVK::clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) {} diff --git a/src/emulator.cpp b/src/emulator.cpp index 7355c2e0..26780852 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -54,7 +54,7 @@ Emulator::Emulator() #ifdef PANDA3DS_ENABLE_VULKAN if (config.rendererType == RendererType::Vulkan) { - // window = SDL_CreateWindow("Alber", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_VULKAN); + window = SDL_CreateWindow("Alber", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_VULKAN); if (window == nullptr) { // Helpers::panic("Window creation failed: %s", SDL_GetError()); @@ -457,7 +457,7 @@ bool Emulator::loadELF(std::ifstream& file) { } // Reset our graphics context and initialize the GPU's graphics context -void Emulator::initGraphicsContext() { gpu.initGraphicsContext(); } +void Emulator::initGraphicsContext() { gpu.initGraphicsContext(window); } #ifdef PANDA3DS_ENABLE_HTTP_SERVER void Emulator::pollHttpServer() {