From d2241a25bc829a704d2486870d879ab038b0a575 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Tue, 18 Jul 2023 20:29:26 -0700 Subject: [PATCH] Stub Vulkan backend support A lot of the architecture of the emulator here does not allow for vulkan to initialize easily since it involves a bit of data to be exchanged between SDL and Vulkan. This commit just adds the foundational linkage and library code for vulkan support. --- CMakeLists.txt | 35 ++++++++++++++++++++++++++++ include/renderer_vk/renderer_vk.hpp | 18 ++++++++++++++ include/renderer_vk/vulkan_api.hpp | 10 ++++++++ src/core/PICA/gpu.cpp | 10 +++++--- src/core/renderer_vk/renderer_vk.cpp | 19 +++++++++++++++ src/core/renderer_vk/vulkan_api.cpp | 3 +++ src/emulator.cpp | 10 ++++++++ 7 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 include/renderer_vk/renderer_vk.hpp create mode 100644 include/renderer_vk/vulkan_api.hpp create mode 100644 src/core/renderer_vk/renderer_vk.cpp create mode 100644 src/core/renderer_vk/vulkan_api.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c84bf0c9..ae4b8c00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ endif() option(DISABLE_PANIC_DEV "Make a build with fewer and less intrusive asserts" OFF) option(GPU_DEBUG_INFO "Enable additional GPU debugging info" OFF) option(ENABLE_OPENGL "Enable OpenGL rendering backend" ON) +option(ENABLE_VULKAN "Enable Vulkan rendering backend" ON) option(ENABLE_LTO "Enable link-time optimization" OFF) option(ENABLE_USER_BUILD "Make a user-facing build. These builds have various assertions disabled, LTO, and more" OFF) option(ENABLE_HTTP_SERVER "Enable HTTP server. Used for Discord bot support" OFF) @@ -177,6 +178,7 @@ source_group("Source Files\\Core\\Software Renderer" FILES ${RENDERER_SW_SOURCE_ source_group("Source Files\\Third Party" FILES ${THIRD_PARTY_SOURCE_FILES}) set(RENDERER_GL_SOURCE_FILES "") # Empty by default unless we are compiling with the GL renderer +set(RENDERER_VK_SOURCE_FILES "") # Empty by default unless we are compiling with the VK renderer if(ENABLE_OPENGL) set(RENDERER_GL_INCLUDE_FILES include/renderer_gl/opengl.hpp @@ -206,6 +208,29 @@ if(ENABLE_OPENGL) ) endif() +if(ENABLE_VULKAN) + find_package( + Vulkan 1.3.206 REQUIRED + COMPONENTS glslangValidator + ) + set(RENDERER_VK_INCLUDE_FILES include/renderer_vk/renderer_vk.hpp + include/renderer_vk/vulkan_api.hpp + ) + + set(RENDERER_VK_SOURCE_FILES src/core/renderer_vk/renderer_vk.cpp + src/core/renderer_vk/vulkan_api.cpp + ) + + set(HEADER_FILES ${HEADER_FILES} ${RENDERER_VK_INCLUDE_FILES}) + source_group("Source Files\\Core\\Vulkan Renderer" FILES ${RENDERER_VK_SOURCE_FILES}) + + cmrc_add_resource_library( + resources_renderer_vk + NAMESPACE RendererVK + WHENCE "src/host_shaders/" + ) +endif() + source_group("Header Files\\Core" FILES ${HEADER_FILES}) set(ALL_SOURCES ${SOURCE_FILES} ${FS_SOURCE_FILES} ${CRYPTO_SOURCE_FILES} ${KERNEL_SOURCE_FILES} ${LOADER_SOURCE_FILES} ${SERVICE_SOURCE_FILES} ${RENDERER_SW_SOURCE_FILES} ${PICA_SOURCE_FILES} ${THIRD_PARTY_SOURCE_FILES} ${HEADER_FILES}) @@ -215,6 +240,11 @@ if(ENABLE_OPENGL) set(ALL_SOURCES ${ALL_SOURCES} ${RENDERER_GL_SOURCE_FILES}) endif() +if(ENABLE_VULKAN) + # Add the Vulkan source files to ALL_SOURCES + set(ALL_SOURCES ${ALL_SOURCES} ${RENDERER_VK_SOURCE_FILES}) +endif() + add_executable(Alber ${ALL_SOURCES}) if(ENABLE_LTO OR ENABLE_USER_BUILD) @@ -228,6 +258,11 @@ if(ENABLE_OPENGL) target_link_libraries(Alber PRIVATE resources_renderer_gl) endif() +if(ENABLE_VULKAN) + target_compile_definitions(Alber PUBLIC "PANDA3DS_ENABLE_VULKAN=1") + target_link_libraries(Alber PRIVATE Vulkan::Vulkan resources_renderer_vk) +endif() + if(GPU_DEBUG_INFO) target_compile_definitions(Alber PRIVATE GPU_DEBUG_INFO=1) endif() diff --git a/include/renderer_vk/renderer_vk.hpp b/include/renderer_vk/renderer_vk.hpp new file mode 100644 index 00000000..b825692b --- /dev/null +++ b/include/renderer_vk/renderer_vk.hpp @@ -0,0 +1,18 @@ +#include "renderer.hpp" +#include "vulkan_api.hpp" + +class GPU; + +class RendererVK final : public Renderer { + public: + RendererVK(GPU& gpu, const std::array& internalRegs); + ~RendererVK() override; + + void reset() override; + void display() override; + void initGraphicsContext() 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; + void screenshot(const std::string& name) override; +}; \ No newline at end of file diff --git a/include/renderer_vk/vulkan_api.hpp b/include/renderer_vk/vulkan_api.hpp new file mode 100644 index 00000000..7a606546 --- /dev/null +++ b/include/renderer_vk/vulkan_api.hpp @@ -0,0 +1,10 @@ +#pragma once + +#define VK_NO_PROTOTYPES +#include + +#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 +#define VULKAN_HPP_NO_EXCEPTIONS +#include +#include +#include \ No newline at end of file diff --git a/src/core/PICA/gpu.cpp b/src/core/PICA/gpu.cpp index d7c37925..20fe4946 100644 --- a/src/core/PICA/gpu.cpp +++ b/src/core/PICA/gpu.cpp @@ -12,6 +12,9 @@ #ifdef PANDA3DS_ENABLE_OPENGL #include "renderer_gl/renderer_gl.hpp" #endif +#ifdef PANDA3DS_ENABLE_VULKAN +#include "renderer_vk/renderer_vk.hpp" +#endif using namespace Floats; @@ -38,11 +41,12 @@ GPU::GPU(Memory& mem, EmulatorConfig& config) : mem(mem), config(config) { break; } #endif - +#ifdef PANDA3DS_ENABLE_VULKAN case RendererType::Vulkan: { - Helpers::panic("Vulkan is not supported yet, please pick another renderer"); + renderer.reset(new RendererVK(*this, regs)); + break; } - +#endif default: { Helpers::panic("Rendering backend not supported: %s", Renderer::typeToString(config.rendererType)); break; diff --git a/src/core/renderer_vk/renderer_vk.cpp b/src/core/renderer_vk/renderer_vk.cpp new file mode 100644 index 00000000..22922347 --- /dev/null +++ b/src/core/renderer_vk/renderer_vk.cpp @@ -0,0 +1,19 @@ +#include "renderer_vk/renderer_vk.hpp" + +RendererVK::RendererVK(GPU& gpu, const std::array& internalRegs) : Renderer(gpu, internalRegs) {} + +RendererVK::~RendererVK() {} + +void RendererVK::reset() {} + +void RendererVK::display() {} + +void RendererVK::initGraphicsContext() { static vk::DynamicLoader dl; } + +void RendererVK::clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) {} + +void RendererVK::displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) {} + +void RendererVK::drawVertices(PICA::PrimType primType, std::span vertices) {} + +void RendererVK::screenshot(const std::string& name) {} \ No newline at end of file diff --git a/src/core/renderer_vk/vulkan_api.cpp b/src/core/renderer_vk/vulkan_api.cpp new file mode 100644 index 00000000..c207eea7 --- /dev/null +++ b/src/core/renderer_vk/vulkan_api.cpp @@ -0,0 +1,3 @@ +#include "renderer_vk/vulkan_api.hpp" + +VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE; \ No newline at end of file diff --git a/src/emulator.cpp b/src/emulator.cpp index 98c4c67f..8ad81eb6 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -52,6 +52,16 @@ 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); + + if (window == nullptr) { + Helpers::panic("Window creation failed: %s", SDL_GetError()); + } + } +#endif + if (SDL_WasInit(SDL_INIT_GAMECONTROLLER)) { gameController = SDL_GameControllerOpen(0);