diff --git a/.gitmodules b/.gitmodules index 1752f9a93..533cd078e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -61,3 +61,6 @@ [submodule "externals/shaderc"] path = externals/shaderc url = https://github.com/google/shaderc +[submodule "externals/Vulkan-Headers"] + path = externals/Vulkan-Headers + url = https://github.com/KhronosGroup/Vulkan-Headers diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c09be209..179a30e48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -199,11 +199,6 @@ if (ENABLE_QT) endif() endif() -if (ENABLE_VULKAN) - # Vulkan Memory Allocator - set(VMA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/externals/vma/include) -endif() - # Ensure libusb is properly configured (based on dolphin libusb include) if(NOT APPLE) include(FindPkgConfig) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 480c6487d..b2df1930c 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -132,6 +132,7 @@ if (ENABLE_WEB_SERVICE) SET(CPP_JWT_USE_VENDORED_NLOHMANN_JSON ON CACHE BOOL "Use included json-hpp") add_library(cpp-jwt INTERFACE) target_include_directories(cpp-jwt INTERFACE ./cpp-jwt/include) + target_compile_definitions(cpp-jwt INTERFACE CPP_JWT_USE_VENDORED_NLOHMANN_JSON) endif() # lodepng diff --git a/externals/Vulkan-Headers b/externals/Vulkan-Headers new file mode 160000 index 000000000..2c823b7f2 --- /dev/null +++ b/externals/Vulkan-Headers @@ -0,0 +1 @@ +Subproject commit 2c823b7f27590ec0a489f7fbe14b154e13fa5cfb diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index ce9431399..3fed8319c 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -75,12 +75,12 @@ add_library(video_core STATIC renderer_vulkan/renderer_vulkan.h renderer_vulkan/vk_buffer.cpp renderer_vulkan/vk_buffer.h + renderer_vulkan/vk_common.cpp + renderer_vulkan/vk_common.h renderer_vulkan/vk_format_reinterpreter.cpp renderer_vulkan/vk_format_reinterpreter.h renderer_vulkan/vk_instance.cpp renderer_vulkan/vk_instance.h - renderer_vulkan/vk_memory.cpp - renderer_vulkan/vk_memory.h renderer_vulkan/vk_pipeline_builder.cpp renderer_vulkan/vk_pipeline_builder.h renderer_vulkan/vk_rasterizer_cache.cpp @@ -177,11 +177,11 @@ create_target_directory_groups(video_core) target_link_libraries(video_core PUBLIC common core) target_link_libraries(video_core PRIVATE glad nihstro-headers Boost::serialization) +# Include Vulkan headers +target_include_directories(video_core PRIVATE ../../externals/Vulkan-Headers/include) +target_include_directories(video_core PRIVATE ../../externals/vma/include) +target_link_libraries(video_core PRIVATE ${SHADERC_DEP}) + if (ARCHITECTURE_x86_64) target_link_libraries(video_core PUBLIC xbyak) endif() - -if (ENABLE_VULKAN) - target_include_directories(video_core PRIVATE ${Vulkan_INCLUDE_DIRS} ${VMA_INCLUDE_DIR}) - target_link_libraries(video_core PRIVATE ${Vulkan_LIBRARIES} ${SHADERC_DEP}) -endif() diff --git a/src/video_core/renderer_vulkan/pica_to_vulkan.h b/src/video_core/renderer_vulkan/pica_to_vulkan.h index 205e76875..1e0aeba6b 100644 --- a/src/video_core/renderer_vulkan/pica_to_vulkan.h +++ b/src/video_core/renderer_vulkan/pica_to_vulkan.h @@ -5,17 +5,13 @@ #pragma once #include -#include -#include #include -#include -#include "common/assert.h" -#include "common/common_types.h" #include "common/logging/log.h" #include "core/core.h" #include "video_core/regs_framebuffer.h" #include "video_core/regs_lighting.h" #include "video_core/regs_texturing.h" +#include "video_core/renderer_vulkan/vk_common.h" namespace PicaToVK { diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index b8bd175b3..7583ae653 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -2,6 +2,22 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +// Enable vulkan platforms +#if defined(ANDROID) || defined (__ANDROID__) + #define VK_USE_PLATFORM_ANDROID_KHR 1 +#elif defined(_WIN32) + #define VK_USE_PLATFORM_WIN32_KHR 1 +#elif defined(__APPLE__) + #define VK_USE_PLATFORM_MACOS_MVK 1 + #define VK_USE_PLATFORM_METAL_EXT 1 +#else + #ifdef WAYLAND_DISPLAY + #define VK_USE_PLATFORM_WAYLAND_KHR 1 + #else // wayland + #define VK_USE_PLATFORM_XLIB_KHR 1 + #endif +#endif + #include #include "common/assert.h" #include "common/logging/log.h" @@ -21,6 +37,8 @@ #include "video_core/renderer_vulkan/renderer_vulkan.h" #include "video_core/renderer_vulkan/vk_task_scheduler.h" #include "video_core/renderer_vulkan/vk_pipeline_builder.h" +#include "video_core/renderer_vulkan/vk_swapchain.h" +#include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/video_core.h" // Include these late to avoid polluting previous headers @@ -38,12 +56,12 @@ namespace Vulkan { -vk::SurfaceKHR CreateSurface(const VkInstance& instance, +vk::SurfaceKHR CreateSurface(const vk::Instance& instance, const Frontend::EmuWindow& emu_window) { const auto& window_info = emu_window.GetWindowInfo(); - VkSurfaceKHR unsafe_surface = nullptr; + vk::SurfaceKHR surface; -#ifdef _WIN32 +#if VK_USE_PLATFORM_WIN32_KHR if (window_info.type == Core::Frontend::WindowSystemType::Windows) { const HWND hWnd = static_cast(window_info.render_surface); const VkWin32SurfaceCreateInfoKHR win32_ci{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, @@ -53,36 +71,35 @@ vk::SurfaceKHR CreateSurface(const VkInstance& instance, UNREACHABLE(); } } -#endif -#if !defined(_WIN32) && !defined(__APPLE__) +#elif VK_USE_PLATFORM_XLIB_KHR if (window_info.type == Frontend::WindowSystemType::X11) { - const VkXlibSurfaceCreateInfoKHR xlib_ci{ - VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, nullptr, 0, + const vk::XlibSurfaceCreateInfoKHR xlib_ci{{}, static_cast(window_info.display_connection), reinterpret_cast(window_info.render_surface)}; - if (vkCreateXlibSurfaceKHR(instance, &xlib_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { + if (instance.createXlibSurfaceKHR(&xlib_ci, nullptr, &surface) != vk::Result::eSuccess) { LOG_ERROR(Render_Vulkan, "Failed to initialize Xlib surface"); UNREACHABLE(); } } +#elif VK_USE_PLATFORM_WAYLAND_KHR if (window_info.type == Frontend::WindowSystemType::Wayland) { - /*const VkWaylandSurfaceCreateInfoKHR wayland_ci{ + const VkWaylandSurfaceCreateInfoKHR wayland_ci{ VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0, static_cast(window_info.display_connection), static_cast(window_info.render_surface)}; if (vkCreateWaylandSurfaceKHR(instance, &wayland_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { LOG_ERROR(Render_Vulkan, "Failed to initialize Wayland surface"); UNREACHABLE(); - }*/ + } } #endif - if (!unsafe_surface) { + if (!surface) { LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform"); UNREACHABLE(); } - return vk::SurfaceKHR(unsafe_surface); + return surface; } std::vector RequiredExtensions(Frontend::WindowSystemType window_type, bool enable_debug_utils) { @@ -568,23 +585,29 @@ void RendererVulkan::EndPresent() { /// Initialize the renderer VideoCore::ResultStatus RendererVulkan::Init() { - // Create vulkan instance - vk::ApplicationInfo app_info{"Citra", VK_MAKE_VERSION(1, 0, 0), nullptr, 0, VK_API_VERSION_1_3}; + // Fetch instance independant function pointers + vk::DynamicLoader dl; + auto vkGetInstanceProcAddr = dl.getProcAddress("vkGetInstanceProcAddr"); + VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr); // Get required extensions + vk::ApplicationInfo app_info{"Citra", VK_MAKE_VERSION(1, 0, 0), nullptr, 0, VK_API_VERSION_1_3}; auto extensions = RequiredExtensions(render_window.GetWindowInfo().type, true); const char* layers = "VK_LAYER_KHRONOS_validation"; vk::InstanceCreateInfo instance_info{{}, &app_info, layers, extensions}; + // Create vulkan instance auto instance = vk::createInstance(instance_info); + VULKAN_HPP_DEFAULT_DISPATCHER.init(instance); + auto physical_devices = instance.enumeratePhysicalDevices(); // Create global instance auto surface = CreateSurface(instance, render_window); g_vk_instace = std::make_unique(); g_vk_task_scheduler = std::make_unique(); - g_vk_instace->Create(instance, physical_devices[1], surface, true); + g_vk_instace->Create(instance, physical_devices[2], surface, true); g_vk_task_scheduler->Create(); //auto& layout = render_window.GetFramebufferLayout(); diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index c0b7813ba..092e39a1a 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -9,7 +9,6 @@ #include "common/math_util.h" #include "core/hw/gpu.h" #include "video_core/renderer_base.h" -#include "video_core/renderer_vulkan/vk_swapchain.h" #include "video_core/renderer_vulkan/vk_state.h" namespace Layout { @@ -18,6 +17,8 @@ struct FramebufferLayout; namespace Vulkan { +class Swapchain; + /// Structure used for storing information about the display target for each 3DS screen struct ScreenInfo { Texture* display_texture; diff --git a/src/video_core/renderer_vulkan/vk_buffer.h b/src/video_core/renderer_vulkan/vk_buffer.h index 71a8b3993..09701031c 100644 --- a/src/video_core/renderer_vulkan/vk_buffer.h +++ b/src/video_core/renderer_vulkan/vk_buffer.h @@ -8,8 +8,8 @@ #include #include #include -#include #include "common/common_types.h" +#include "video_core/renderer_vulkan/vk_common.h" namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_memory.cpp b/src/video_core/renderer_vulkan/vk_common.cpp similarity index 53% rename from src/video_core/renderer_vulkan/vk_memory.cpp rename to src/video_core/renderer_vulkan/vk_common.cpp index d9e10f443..f8377bc8d 100644 --- a/src/video_core/renderer_vulkan/vk_memory.cpp +++ b/src/video_core/renderer_vulkan/vk_common.cpp @@ -3,4 +3,7 @@ // Refer to the license.txt file included. #define VMA_IMPLEMENTATION -#include "vk_memory.h" +#include "video_core/renderer_vulkan/vk_common.h" + +// Store the dispatch loader here +VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE diff --git a/src/video_core/renderer_vulkan/vk_memory.h b/src/video_core/renderer_vulkan/vk_common.h similarity index 66% rename from src/video_core/renderer_vulkan/vk_memory.h rename to src/video_core/renderer_vulkan/vk_common.h index 67fc8a044..b345a59f5 100644 --- a/src/video_core/renderer_vulkan/vk_memory.h +++ b/src/video_core/renderer_vulkan/vk_common.h @@ -4,16 +4,13 @@ #pragma once -#include - -#ifndef VMA_STATIC_VULKAN_FUNCTIONS -#define VMA_STATIC_VULKAN_FUNCTIONS 0 -#endif - -#ifndef VMA_DYNAMIC_VULKAN_FUNCTIONS -#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 -#endif +// Include vulkan-hpp header +#define VK_NO_PROTOTYPES 1 +#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 +#include // Include Vulkan memory allocator +#define VMA_STATIC_VULKAN_FUNCTIONS 0 +#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 #define VMA_VULKAN_VERSION 1001000 // Vulkan 1.1 -#include "vk_mem_alloc.h" +#include diff --git a/src/video_core/renderer_vulkan/vk_format_reinterpreter.h b/src/video_core/renderer_vulkan/vk_format_reinterpreter.h index efdae586c..1c694b340 100644 --- a/src/video_core/renderer_vulkan/vk_format_reinterpreter.h +++ b/src/video_core/renderer_vulkan/vk_format_reinterpreter.h @@ -6,7 +6,6 @@ #include #include -#include #include "common/common_types.h" #include "common/math_util.h" #include "video_core/renderer_vulkan/vk_surface_params.h" diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 5d34b7cc5..850c2e448 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -98,6 +98,7 @@ bool Instance::CreateDevice(vk::SurfaceKHR surface, bool validation_enabled) { // Create logical device device = physical_device.createDevice(device_info); + VULKAN_HPP_DEFAULT_DISPATCHER.init(device); // Grab the graphics and present queues. graphics_queue = device.getQueue(graphics_queue_family_index, 0); @@ -133,14 +134,11 @@ bool Instance::FindFeatures() { vk13_features.dynamicRendering = true; dynamic_state_features.extendedDynamicState = true; dynamic_state2_features.extendedDynamicState2 = true; - dynamic_state2_features.extendedDynamicState2LogicOp = true; - color_write_features.colorWriteEnable = true; // Include features in device creation vk12_features.pNext = &vk13_features; vk13_features.pNext = &dynamic_state_features; dynamic_state_features.pNext = &dynamic_state2_features; - dynamic_state2_features.pNext = &color_write_features; features = vk::PhysicalDeviceFeatures2{vk_features, &vk12_features}; return true; diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 2a3645795..c155de32b 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -4,11 +4,9 @@ #pragma once -#include -#include -#include #include #include "common/common_types.h" +#include "video_core/renderer_vulkan/vk_common.h" namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 0df50caab..b8ca49cfc 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -9,7 +9,6 @@ #include #include #include -#include #include #include "common/bit_field.h" #include "common/common_types.h" diff --git a/src/video_core/renderer_vulkan/vk_rasterizer_cache.h b/src/video_core/renderer_vulkan/vk_rasterizer_cache.h index 94e0ec8fa..fb9cecf3c 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer_cache.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer_cache.h @@ -13,7 +13,6 @@ #include #include #include -#include #include #include "common/assert.h" #include "common/common_funcs.h" diff --git a/src/video_core/renderer_vulkan/vk_shader_state.h b/src/video_core/renderer_vulkan/vk_shader_state.h index 7f6960306..f90e12b16 100644 --- a/src/video_core/renderer_vulkan/vk_shader_state.h +++ b/src/video_core/renderer_vulkan/vk_shader_state.h @@ -5,16 +5,12 @@ #pragma once #include -#include -#include -#include -#include #include -#include #include #include "common/hash.h" #include "video_core/regs.h" #include "video_core/shader/shader.h" +#include "video_core/renderer_vulkan/vk_common.h" namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_state.cpp b/src/video_core/renderer_vulkan/vk_state.cpp index 02113e650..9eff7d6b3 100644 --- a/src/video_core/renderer_vulkan/vk_state.cpp +++ b/src/video_core/renderer_vulkan/vk_state.cpp @@ -2,13 +2,9 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include -#include #include "video_core/renderer_vulkan/vk_state.h" -#include "video_core/renderer_vulkan/renderer_vulkan.h" +#include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_task_scheduler.h" -#include "video_core/renderer_vulkan/vk_rasterizer_cache.h" -#include "video_core/renderer_vulkan/vk_rasterizer.h" #include "video_core/renderer_vulkan/vk_shader_gen.h" namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_state.h b/src/video_core/renderer_vulkan/vk_state.h index a3fb609e2..d65f749e5 100644 --- a/src/video_core/renderer_vulkan/vk_state.h +++ b/src/video_core/renderer_vulkan/vk_state.h @@ -5,8 +5,6 @@ #pragma once #include -#include -#include #include #include "video_core/regs.h" #include "video_core/renderer_vulkan/vk_shader_state.h" diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index a3ac476cf..a4f920bef 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -2,11 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include #include -#include -#include -#include #include "common/logging/log.h" #include "video_core/renderer_vulkan/vk_swapchain.h" #include "video_core/renderer_vulkan/vk_instance.h" diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index f46b802ca..6055a72b8 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include "core/frontend/emu_window.h" #include "video_core/renderer_vulkan/vk_texture.h" diff --git a/src/video_core/renderer_vulkan/vk_task_scheduler.cpp b/src/video_core/renderer_vulkan/vk_task_scheduler.cpp index b5d686a76..5950e114a 100644 --- a/src/video_core/renderer_vulkan/vk_task_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_task_scheduler.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include "video_core/renderer_vulkan/vk_task_scheduler.h" +#include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_state.h" #include "video_core/renderer_vulkan/vk_swapchain.h" #include "common/assert.h" diff --git a/src/video_core/renderer_vulkan/vk_task_scheduler.h b/src/video_core/renderer_vulkan/vk_task_scheduler.h index 04c3cc454..b1436559e 100644 --- a/src/video_core/renderer_vulkan/vk_task_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_task_scheduler.h @@ -5,17 +5,6 @@ #pragma once #include -#include -#include -#include -#include -#include -#include -#include - -#include "common/common_types.h" -#include "common/threadsafe_queue.h" -#include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_buffer.h" namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_texture.cpp b/src/video_core/renderer_vulkan/vk_texture.cpp index b19b2d1da..1c671501b 100644 --- a/src/video_core/renderer_vulkan/vk_texture.cpp +++ b/src/video_core/renderer_vulkan/vk_texture.cpp @@ -9,6 +9,7 @@ #include "video_core/renderer_vulkan/vk_texture.h" #include "video_core/renderer_vulkan/vk_task_scheduler.h" #include "video_core/renderer_vulkan/vk_state.h" +#include "video_core/renderer_vulkan/vk_instance.h" namespace Vulkan {