diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index f8476746ac..61a81558a7 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -650,6 +650,7 @@ if(TARGET 3rdparty_vulkan) RSX/VK/VKVertexBuffers.cpp RSX/VK/VKVertexProgram.cpp RSX/VK/VKTextureCache.cpp + RSX/VK/VulkanAPI.cpp ) endif() diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 3821240cab..510af1295c 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -919,7 +919,7 @@ void VKGSRender::emit_geometry(u32 sub_index) info.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT; info.buffer = m_cond_render_buffer->value; - m_device->_vkCmdBeginConditionalRenderingEXT(*m_current_command_buffer, &info); + _vkCmdBeginConditionalRenderingEXT(*m_current_command_buffer, &info); m_current_command_buffer->flags |= vk::command_buffer::cb_has_conditional_render; } } @@ -950,7 +950,7 @@ void VKGSRender::emit_geometry(u32 sub_index) _ptr->firstVertex = range.first; _ptr->vertexCount = range.count; } - vkCmdDrawMultiEXT(*m_current_command_buffer, subranges_count, ptr, 1, 0, sizeof(VkMultiDrawInfoEXT)); + _vkCmdDrawMultiEXT(*m_current_command_buffer, subranges_count, ptr, 1, 0, sizeof(VkMultiDrawInfoEXT)); } else { @@ -994,7 +994,7 @@ void VKGSRender::emit_geometry(u32 sub_index) _ptr->indexCount = count; vertex_offset += count; } - vkCmdDrawMultiIndexedEXT(*m_current_command_buffer, subranges_count, ptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), nullptr); + _vkCmdDrawMultiIndexedEXT(*m_current_command_buffer, subranges_count, ptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), nullptr); } else { @@ -1167,7 +1167,7 @@ void VKGSRender::end() if (m_current_command_buffer->flags & vk::command_buffer::cb_has_conditional_render) { - m_device->_vkCmdEndConditionalRenderingEXT(*m_current_command_buffer); + _vkCmdEndConditionalRenderingEXT(*m_current_command_buffer); m_current_command_buffer->flags &= ~(vk::command_buffer::cb_has_conditional_render); } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 13039a68c3..a900098a50 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2435,7 +2435,7 @@ void VKGSRender::close_and_submit_command_buffer(vk::fence* pFence, VkSemaphore if (m_current_command_buffer->flags & vk::command_buffer::cb_has_conditional_render) { ensure(m_render_pass_open); - m_device->_vkCmdEndConditionalRenderingEXT(*m_current_command_buffer); + _vkCmdEndConditionalRenderingEXT(*m_current_command_buffer); } #endif diff --git a/rpcs3/Emu/RSX/VK/VKProcTable.h b/rpcs3/Emu/RSX/VK/VKProcTable.h new file mode 100644 index 0000000000..3caea96dc3 --- /dev/null +++ b/rpcs3/Emu/RSX/VK/VKProcTable.h @@ -0,0 +1,41 @@ +// Wrangler for Vulkan functions. +// TODO: Eventually, we shall declare vulkan with NO_PROTOTYPES and wrap everything here for android multi-driver support. +// For now, we just use it for extensions since we're on VK_1_0 + +#define VK_DECL_EXTERN(func) extern PFN_##func _##func +#define VK_DECL_LOCAL(func) PFN_##func _##func + +#if defined(DECLARE_VK_FUNCTION_HEADER) +#define VK_FUNC VK_DECL_EXTERN +#elif defined(DECLARE_VK_FUNCTION_BODY) +#define VK_FUNC VK_DECL_LOCAL +#elif !defined(VK_FUNC) +#error "VK_FUNC is not defined" +#endif + +// EXT_conditional_rendering +VK_FUNC(vkCmdBeginConditionalRenderingEXT); +VK_FUNC(vkCmdEndConditionalRenderingEXT); + +// EXT_debug_utils +VK_FUNC(vkSetDebugUtilsObjectNameEXT); +VK_FUNC(vkQueueInsertDebugUtilsLabelEXT); +VK_FUNC(vkCmdInsertDebugUtilsLabelEXT); + +// KHR_synchronization2 +VK_FUNC(vkCmdSetEvent2KHR); +VK_FUNC(vkCmdWaitEvents2KHR); +VK_FUNC(vkCmdPipelineBarrier2KHR); + +// EXT_device_fault +VK_FUNC(vkGetDeviceFaultInfoEXT); + +// EXT_multi_draw +VK_FUNC(vkCmdDrawMultiEXT); +VK_FUNC(vkCmdDrawMultiIndexedEXT); + +#undef VK_FUNC +#undef DECLARE_VK_FUNCTION_HEADER +#undef DECLARE_VK_FUNCTION_BODY +#undef VK_DECL_EXTERN +#undef VK_DECL_LOCAL diff --git a/rpcs3/Emu/RSX/VK/VulkanAPI.cpp b/rpcs3/Emu/RSX/VK/VulkanAPI.cpp new file mode 100644 index 0000000000..d866710355 --- /dev/null +++ b/rpcs3/Emu/RSX/VK/VulkanAPI.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "VulkanAPI.h" + +#include "vkutils/device.h" + +#define DECLARE_VK_FUNCTION_BODY +#include "VKProcTable.h" + +namespace vk +{ + render_device* get_current_renderer(); + + void init() + { + auto pdev = get_current_renderer(); + + #define VK_FUNC(func) _##func = reinterpret_cast(vkGetDeviceProcAddr(*pdev, #func)) + #include "VKProcTable.h" + } +} diff --git a/rpcs3/Emu/RSX/VK/VulkanAPI.h b/rpcs3/Emu/RSX/VK/VulkanAPI.h index b5317474f9..3f14a00979 100644 --- a/rpcs3/Emu/RSX/VK/VulkanAPI.h +++ b/rpcs3/Emu/RSX/VK/VulkanAPI.h @@ -26,3 +26,11 @@ #if VK_HEADER_VERSION < 287 constexpr VkDriverId VK_DRIVER_ID_MESA_HONEYKRISP = static_cast(26); #endif + +#define DECLARE_VK_FUNCTION_HEADER 1 +#include "VKProcTable.h" + +namespace vk +{ + void init(); +} diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.cpp b/rpcs3/Emu/RSX/VK/vkutils/device.cpp index b19ea8b842..fd41e3df2a 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/device.cpp @@ -822,41 +822,10 @@ namespace vk vkGetDeviceQueue(dev, present_queue_idx, 0, &m_present_queue); } - // Import optional function endpoints - if (pgpu->optional_features_support.conditional_rendering) - { - _vkCmdBeginConditionalRenderingEXT = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkCmdBeginConditionalRenderingEXT")); - _vkCmdEndConditionalRenderingEXT = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkCmdEndConditionalRenderingEXT")); - } - - if (pgpu->optional_features_support.debug_utils) - { - _vkSetDebugUtilsObjectNameEXT = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkSetDebugUtilsObjectNameEXT")); - _vkQueueInsertDebugUtilsLabelEXT = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkQueueInsertDebugUtilsLabelEXT")); - _vkCmdInsertDebugUtilsLabelEXT = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkCmdInsertDebugUtilsLabelEXT")); - } - - if (pgpu->optional_features_support.synchronization_2) - { - _vkCmdSetEvent2KHR = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkCmdSetEvent2KHR")); - _vkCmdWaitEvents2KHR = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkCmdWaitEvents2KHR")); - _vkCmdPipelineBarrier2KHR = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkCmdPipelineBarrier2KHR")); - } - - if (pgpu->optional_features_support.extended_device_fault) - { - _vkGetDeviceFaultInfoEXT = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkGetDeviceFaultInfoEXT")); - } - memory_map = vk::get_memory_mapping(pdev); m_formats_support = vk::get_optimal_tiling_supported_formats(pdev); m_pipeline_binding_table = vk::get_pipeline_binding_table(pdev); - if (pgpu->optional_features_support.external_memory_host) - { - memory_map._vkGetMemoryHostPointerPropertiesEXT = reinterpret_cast(vkGetDeviceProcAddr(dev, "vkGetMemoryHostPointerPropertiesEXT")); - } - if (g_cfg.video.disable_vulkan_mem_allocator) { m_allocator = std::make_unique(*this, pdev); diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.h b/rpcs3/Emu/RSX/VK/vkutils/device.h index 193fa2377e..9f14a3ef4a 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.h +++ b/rpcs3/Emu/RSX/VK/vkutils/device.h @@ -155,18 +155,6 @@ namespace vk const std::vector& requested_extensions, const VkPhysicalDeviceFeatures& requested_features) const; - public: - // Exported device endpoints - PFN_vkCmdBeginConditionalRenderingEXT _vkCmdBeginConditionalRenderingEXT = nullptr; - PFN_vkCmdEndConditionalRenderingEXT _vkCmdEndConditionalRenderingEXT = nullptr; - PFN_vkSetDebugUtilsObjectNameEXT _vkSetDebugUtilsObjectNameEXT = nullptr; - PFN_vkQueueInsertDebugUtilsLabelEXT _vkQueueInsertDebugUtilsLabelEXT = nullptr; - PFN_vkCmdInsertDebugUtilsLabelEXT _vkCmdInsertDebugUtilsLabelEXT = nullptr; - PFN_vkCmdSetEvent2KHR _vkCmdSetEvent2KHR = nullptr; - PFN_vkCmdWaitEvents2KHR _vkCmdWaitEvents2KHR = nullptr; - PFN_vkCmdPipelineBarrier2KHR _vkCmdPipelineBarrier2KHR = nullptr; - PFN_vkGetDeviceFaultInfoEXT _vkGetDeviceFaultInfoEXT = nullptr; - public: render_device() = default; ~render_device() = default; diff --git a/rpcs3/Emu/RSX/VK/vkutils/image.cpp b/rpcs3/Emu/RSX/VK/vkutils/image.cpp index cd6a916214..3146552f56 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image.cpp @@ -292,7 +292,7 @@ namespace vk name_info.objectHandle = reinterpret_cast(value); name_info.pObjectName = name.c_str(); - g_render_device->_vkSetDebugUtilsObjectNameEXT(m_device, &name_info); + _vkSetDebugUtilsObjectNameEXT(m_device, &name_info); } } diff --git a/rpcs3/Emu/RSX/VK/vkutils/shared.cpp b/rpcs3/Emu/RSX/VK/vkutils/shared.cpp index b63bf89ec5..3ce129ea89 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/shared.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/shared.cpp @@ -17,7 +17,7 @@ namespace vk return "Extended fault info is not available. Extension 'VK_EXT_device_fault' is probably not supported by your driver."; } - ensure(g_render_device->_vkGetDeviceFaultInfoEXT); + ensure(_vkGetDeviceFaultInfoEXT); VkDeviceFaultCountsEXT fault_counts { @@ -30,7 +30,7 @@ namespace vk std::string fault_description; // Retrieve sizes - g_render_device->_vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, nullptr); + _vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, nullptr); // Resize arrays and fill address_info.resize(fault_counts.addressInfoCount); @@ -44,7 +44,7 @@ namespace vk .pVendorInfos = vendor_info.data(), .pVendorBinaryData = vendor_binary_data.data() }; - g_render_device->_vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, &fault_info); + _vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, &fault_info); fault_description = fault_info.description; std::string fault_message = fmt::format( diff --git a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp index 238f5f80b2..322e06460f 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/sync.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/sync.cpp @@ -253,7 +253,7 @@ namespace vk if (m_backend == sync_backend::events_v2) { - m_device->_vkCmdPipelineBarrier2KHR(cmd, &dependency); + _vkCmdPipelineBarrier2KHR(cmd, &dependency); return; } @@ -284,7 +284,7 @@ namespace vk // The expectation is that this will be awaited using the gpu_wait function. if (m_backend == sync_backend::events_v2) [[ likely ]] { - m_device->_vkCmdSetEvent2KHR(cmd, m_vk_event, &dependency); + _vkCmdSetEvent2KHR(cmd, m_vk_event, &dependency); } else { @@ -322,7 +322,7 @@ namespace vk .pMemoryBarriers = &mem_barrier }; - m_device->_vkCmdSetEvent2KHR(cmd, m_vk_event, &empty_dependency); + _vkCmdSetEvent2KHR(cmd, m_vk_event, &empty_dependency); } void event::host_signal() const @@ -342,7 +342,7 @@ namespace vk if (m_backend == sync_backend::events_v2) [[ likely ]] { - m_device->_vkCmdWaitEvents2KHR(cmd, 1, &m_vk_event, &dependency); + _vkCmdWaitEvents2KHR(cmd, 1, &m_vk_event, &dependency); return; } diff --git a/rpcs3/VKGSRender.vcxproj b/rpcs3/VKGSRender.vcxproj index 99c1b8594f..95d9377296 100644 --- a/rpcs3/VKGSRender.vcxproj +++ b/rpcs3/VKGSRender.vcxproj @@ -114,6 +114,7 @@ + diff --git a/rpcs3/VKGSRender.vcxproj.filters b/rpcs3/VKGSRender.vcxproj.filters index 18f61ab147..6a804298d5 100644 --- a/rpcs3/VKGSRender.vcxproj.filters +++ b/rpcs3/VKGSRender.vcxproj.filters @@ -1,7 +1,10 @@  + + + @@ -10,20 +13,22 @@ + + + + + + - - - - - + vkutils @@ -66,10 +71,6 @@ vkutils - - - - upscalers\fsr1