From 0bfaa035b932e8555f4f17412839e7fc351c856c Mon Sep 17 00:00:00 2001 From: GPUCode Date: Fri, 7 Oct 2022 14:02:55 +0300 Subject: [PATCH] renderer_vulkan: Fix warnings and cleanup --- src/video_core/CMakeLists.txt | 6 +++++- src/video_core/renderer_vulkan/pica_to_vk.h | 16 +--------------- .../renderer_vulkan/renderer_vulkan.cpp | 3 +-- src/video_core/renderer_vulkan/vk_common.cpp | 5 ++++- src/video_core/renderer_vulkan/vk_common.h | 4 +--- .../renderer_vulkan/vk_format_reinterpreter.cpp | 1 - src/video_core/renderer_vulkan/vk_instance.cpp | 3 ++- src/video_core/renderer_vulkan/vk_instance.h | 2 ++ .../renderer_vulkan/vk_pipeline_cache.cpp | 1 - src/video_core/renderer_vulkan/vk_platform.h | 2 +- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 12 +++++++----- .../renderer_vulkan/vk_renderpass_cache.cpp | 1 - src/video_core/renderer_vulkan/vk_shader.cpp | 1 - src/video_core/renderer_vulkan/vk_shader_gen.h | 1 + .../renderer_vulkan/vk_stream_buffer.cpp | 4 ++-- .../renderer_vulkan/vk_stream_buffer.h | 3 +++ src/video_core/renderer_vulkan/vk_swapchain.cpp | 16 +++++++++------- src/video_core/renderer_vulkan/vk_swapchain.h | 3 +-- .../renderer_vulkan/vk_task_scheduler.cpp | 1 - .../renderer_vulkan/vk_texture_runtime.cpp | 2 +- .../renderer_vulkan/vk_texture_runtime.h | 2 +- 21 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 0487b5f85..af7744746 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -191,7 +191,11 @@ endif() create_target_directory_groups(video_core) -# Include Vulkan headers +if (NOT MSVC) + # Ignore nullability warnings generated from VMA + target_compile_options(vma INTERFACE -Wno-unused-variable -Wno-nullability-completeness) +endif() + target_link_libraries(video_core PUBLIC common core) target_link_libraries(video_core PRIVATE glad vma vulkan-headers glm::glm SPIRV glslang nihstro-headers Boost::serialization) set_target_properties(video_core PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${ENABLE_LTO}) diff --git a/src/video_core/renderer_vulkan/pica_to_vk.h b/src/video_core/renderer_vulkan/pica_to_vk.h index 51c894cda..3a3315dbc 100644 --- a/src/video_core/renderer_vulkan/pica_to_vk.h +++ b/src/video_core/renderer_vulkan/pica_to_vk.h @@ -3,7 +3,7 @@ // Refer to the license.txt file included. #pragma once -#include + #include "common/logging/log.h" #include "core/core.h" #include "video_core/regs.h" @@ -13,20 +13,6 @@ namespace PicaToVK { using TextureFilter = Pica::TexturingRegs::TextureConfig::TextureFilter; -struct FilterInfo { - vk::Filter mag_filter, min_filter; - vk::SamplerMipmapMode mip_mode; -}; - -inline FilterInfo TextureFilterMode(TextureFilter mag, TextureFilter min, TextureFilter mip) { - constexpr std::array filter_table = {vk::Filter::eNearest, vk::Filter::eLinear}; - - constexpr std::array mipmap_table = {vk::SamplerMipmapMode::eNearest, - vk::SamplerMipmapMode::eLinear}; - - return FilterInfo{filter_table.at(mag), filter_table.at(min), mipmap_table.at(mip)}; -} - inline vk::Filter TextureFilterMode(TextureFilter mode) { switch (mode) { case TextureFilter::Linear: diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index c0d50e9ca..55a0e5a7e 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #define GLM_FORCE_DEPTH_ZERO_TO_ONE #include #include "common/assert.h" @@ -942,7 +941,7 @@ void RendererVulkan::SwapBuffers() { // Create swapchain if needed if (swapchain.NeedsRecreation()) { - swapchain.Create(layout.width, layout.height, false); + swapchain.Create(layout.width, layout.height); } // Calling Submit will change the slot so get the required semaphores now diff --git a/src/video_core/renderer_vulkan/vk_common.cpp b/src/video_core/renderer_vulkan/vk_common.cpp index f8377bc8d..4c0ae3de4 100644 --- a/src/video_core/renderer_vulkan/vk_common.cpp +++ b/src/video_core/renderer_vulkan/vk_common.cpp @@ -2,8 +2,11 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VMA_IMPLEMENTATION #include "video_core/renderer_vulkan/vk_common.h" +// Implement vma functions +#define VMA_IMPLEMENTATION +#include + // Store the dispatch loader here VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE diff --git a/src/video_core/renderer_vulkan/vk_common.h b/src/video_core/renderer_vulkan/vk_common.h index 765235fca..9f657385f 100644 --- a/src/video_core/renderer_vulkan/vk_common.h +++ b/src/video_core/renderer_vulkan/vk_common.h @@ -9,13 +9,11 @@ // Include vulkan-hpp header #define VK_NO_PROTOTYPES 1 #define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 +#define VULKAN_HPP_NO_CONSTRUCTORS #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 namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp b/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp index f93266ccf..e434d48df 100644 --- a/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp +++ b/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include "video_core/renderer_vulkan/vk_format_reinterpreter.h" #include "video_core/renderer_vulkan/vk_shader.h" #include "video_core/renderer_vulkan/vk_texture_runtime.h" diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index ae243fc0c..9b6b32c7f 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -2,13 +2,14 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include #include "common/assert.h" #include "core/frontend/emu_window.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_platform.h" +#include + namespace Vulkan { vk::Format ToVkFormat(VideoCore::PixelFormat format) { diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 2777859aa..a1dced109 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -14,6 +14,8 @@ namespace Frontend { class EmuWindow; } +VK_DEFINE_HANDLE(VmaAllocator) + namespace Vulkan { struct FormatTraits { diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 23135cd1f..d7e27695e 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include #include "common/common_paths.h" #include "common/file_util.h" diff --git a/src/video_core/renderer_vulkan/vk_platform.h b/src/video_core/renderer_vulkan/vk_platform.h index 078ed8df9..7316bcc56 100644 --- a/src/video_core/renderer_vulkan/vk_platform.h +++ b/src/video_core/renderer_vulkan/vk_platform.h @@ -11,7 +11,7 @@ namespace Frontend { class EmuWindow; enum class WindowSystemType : u8; -} // namespace Frontend +} namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index c2ad411f3..c249891b1 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include "common/alignment.h" #include "common/logging/log.h" #include "common/math_util.h" @@ -175,7 +174,6 @@ RasterizerVulkan::~RasterizerVulkan() { renderpass_cache.ExitRenderpass(); scheduler.Submit(SubmitMode::Flush | SubmitMode::Shutdown); - VmaAllocator allocator = instance.GetAllocator(); vk::Device device = instance.GetDevice(); for (auto& [key, sampler] : samplers) { @@ -186,9 +184,13 @@ RasterizerVulkan::~RasterizerVulkan() { device.destroyFramebuffer(framebuffer); } - vmaDestroyImage(allocator, default_texture.image, default_texture.allocation); - device.destroyImageView(default_texture.image_view); - device.destroyImageView(default_texture.base_view); + const VideoCore::HostTextureTag tag = { + .format = VideoCore::PixelFormat::RGBA8, + .width = 1, + .height = 1 + }; + + runtime.Recycle(tag, std::move(default_texture)); device.destroySampler(default_sampler); } diff --git a/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp b/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp index 5e80fb11d..a0bf5046c 100644 --- a/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_renderpass_cache.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include "common/assert.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_renderpass_cache.h" diff --git a/src/video_core/renderer_vulkan/vk_shader.cpp b/src/video_core/renderer_vulkan/vk_shader.cpp index d0a54a200..1e2b412da 100644 --- a/src/video_core/renderer_vulkan/vk_shader.cpp +++ b/src/video_core/renderer_vulkan/vk_shader.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include #include #include diff --git a/src/video_core/renderer_vulkan/vk_shader_gen.h b/src/video_core/renderer_vulkan/vk_shader_gen.h index cbf26ea15..82bd7e850 100644 --- a/src/video_core/renderer_vulkan/vk_shader_gen.h +++ b/src/video_core/renderer_vulkan/vk_shader_gen.h @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #pragma once + #include #include #include "common/hash.h" diff --git a/src/video_core/renderer_vulkan/vk_stream_buffer.cpp b/src/video_core/renderer_vulkan/vk_stream_buffer.cpp index 5d06d5935..a03fec4df 100644 --- a/src/video_core/renderer_vulkan/vk_stream_buffer.cpp +++ b/src/video_core/renderer_vulkan/vk_stream_buffer.cpp @@ -2,15 +2,15 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include -#include "common/alignment.h" #include "common/assert.h" #include "common/logging/log.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_stream_buffer.h" #include "video_core/renderer_vulkan/vk_task_scheduler.h" +#include + namespace Vulkan { inline auto ToVkAccessStageFlags(vk::BufferUsageFlagBits usage) { diff --git a/src/video_core/renderer_vulkan/vk_stream_buffer.h b/src/video_core/renderer_vulkan/vk_stream_buffer.h index 4c3881ba7..87c4955ec 100644 --- a/src/video_core/renderer_vulkan/vk_stream_buffer.h +++ b/src/video_core/renderer_vulkan/vk_stream_buffer.h @@ -3,12 +3,15 @@ // Refer to the license.txt file included. #pragma once + #include #include #include #include "common/assert.h" #include "video_core/renderer_vulkan/vk_common.h" +VK_DEFINE_HANDLE(VmaAllocation) + namespace Vulkan { class Instance; diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index c4fee5f00..b0bb774d6 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -2,9 +2,9 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include #include "common/logging/log.h" +#include "core/settings.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_renderpass_cache.h" #include "video_core/renderer_vulkan/vk_swapchain.h" @@ -29,7 +29,7 @@ Swapchain::~Swapchain() { } } -void Swapchain::Create(u32 width, u32 height, bool vsync_enabled) { +void Swapchain::Create(u32 width, u32 height) { is_outdated = false; is_suboptimal = false; @@ -184,12 +184,14 @@ void Swapchain::Configure(u32 width, u32 height) { // FIFO is guaranteed by the Vulkan standard to be available present_mode = vk::PresentModeKHR::eFifo; - auto iter = std::ranges::find_if( - modes, [](vk::PresentModeKHR mode) { return vk::PresentModeKHR::eMailbox == mode; }); + if (!Settings::values.use_vsync_new) { + auto iter = std::ranges::find_if( + modes, [](vk::PresentModeKHR mode) { return vk::PresentModeKHR::eMailbox == mode; }); - // Prefer Mailbox if present for lowest latency - if (iter != modes.end()) { - present_mode = vk::PresentModeKHR::eMailbox; + // Prefer Mailbox when vsync is disabled for lowest latency + if (iter != modes.end()) { + present_mode = vk::PresentModeKHR::eMailbox; + } } // Query surface extent diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index 7116b49a8..972042b65 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -19,7 +19,7 @@ public: ~Swapchain(); /// Creates (or recreates) the swapchain with a given size. - void Create(u32 width, u32 height, bool vsync_enabled); + void Create(u32 width, u32 height); /// Acquires the next image in the swapchain. void AcquireNextImage(vk::Semaphore signal_acquired); @@ -83,7 +83,6 @@ private: std::vector swapchain_images; u32 current_image = 0; u32 current_frame = 0; - bool vsync_enabled = false; bool is_outdated = true; bool is_suboptimal = true; }; diff --git a/src/video_core/renderer_vulkan/vk_task_scheduler.cpp b/src/video_core/renderer_vulkan/vk_task_scheduler.cpp index ceeb1a58d..977d61b13 100644 --- a/src/video_core/renderer_vulkan/vk_task_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_task_scheduler.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include "common/assert.h" #include "common/logging/log.h" #include "video_core/renderer_vulkan/renderer_vulkan.h" diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index 06305e7f4..b841dfb28 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -2,7 +2,6 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#define VULKAN_HPP_NO_CONSTRUCTORS #include "video_core/rasterizer_cache/utils.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_renderpass_cache.h" @@ -10,6 +9,7 @@ #include "video_core/renderer_vulkan/vk_texture_runtime.h" #include +#include namespace Vulkan { diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.h b/src/video_core/renderer_vulkan/vk_texture_runtime.h index 6e6976178..64f7ba776 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.h +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.h @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #pragma once + #include #include #include @@ -114,7 +115,6 @@ private: std::array staging_offsets{}; std::unordered_multimap texture_recycler; std::unordered_map clear_framebuffers; - ReinterpreterList list; }; class Surface : public VideoCore::SurfaceBase {