vk: Rework extension wrangling

This commit is contained in:
kd-11 2025-03-31 15:35:23 +03:00 committed by kd-11
parent 8aaf2f8577
commit 0f57624a61
13 changed files with 94 additions and 65 deletions

View file

@ -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()

View file

@ -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);
}

View file

@ -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

View file

@ -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

View file

@ -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<PFN_##func>(vkGetDeviceProcAddr(*pdev, #func))
#include "VKProcTable.h"
}
}

View file

@ -26,3 +26,11 @@
#if VK_HEADER_VERSION < 287
constexpr VkDriverId VK_DRIVER_ID_MESA_HONEYKRISP = static_cast<VkDriverId>(26);
#endif
#define DECLARE_VK_FUNCTION_HEADER 1
#include "VKProcTable.h"
namespace vk
{
void init();
}

View file

@ -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<PFN_vkCmdBeginConditionalRenderingEXT>(vkGetDeviceProcAddr(dev, "vkCmdBeginConditionalRenderingEXT"));
_vkCmdEndConditionalRenderingEXT = reinterpret_cast<PFN_vkCmdEndConditionalRenderingEXT>(vkGetDeviceProcAddr(dev, "vkCmdEndConditionalRenderingEXT"));
}
if (pgpu->optional_features_support.debug_utils)
{
_vkSetDebugUtilsObjectNameEXT = reinterpret_cast<PFN_vkSetDebugUtilsObjectNameEXT>(vkGetDeviceProcAddr(dev, "vkSetDebugUtilsObjectNameEXT"));
_vkQueueInsertDebugUtilsLabelEXT = reinterpret_cast<PFN_vkQueueInsertDebugUtilsLabelEXT>(vkGetDeviceProcAddr(dev, "vkQueueInsertDebugUtilsLabelEXT"));
_vkCmdInsertDebugUtilsLabelEXT = reinterpret_cast<PFN_vkCmdInsertDebugUtilsLabelEXT>(vkGetDeviceProcAddr(dev, "vkCmdInsertDebugUtilsLabelEXT"));
}
if (pgpu->optional_features_support.synchronization_2)
{
_vkCmdSetEvent2KHR = reinterpret_cast<PFN_vkCmdSetEvent2KHR>(vkGetDeviceProcAddr(dev, "vkCmdSetEvent2KHR"));
_vkCmdWaitEvents2KHR = reinterpret_cast<PFN_vkCmdWaitEvents2KHR>(vkGetDeviceProcAddr(dev, "vkCmdWaitEvents2KHR"));
_vkCmdPipelineBarrier2KHR = reinterpret_cast<PFN_vkCmdPipelineBarrier2KHR>(vkGetDeviceProcAddr(dev, "vkCmdPipelineBarrier2KHR"));
}
if (pgpu->optional_features_support.extended_device_fault)
{
_vkGetDeviceFaultInfoEXT = reinterpret_cast<PFN_vkGetDeviceFaultInfoEXT>(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<PFN_vkGetMemoryHostPointerPropertiesEXT>(vkGetDeviceProcAddr(dev, "vkGetMemoryHostPointerPropertiesEXT"));
}
if (g_cfg.video.disable_vulkan_mem_allocator)
{
m_allocator = std::make_unique<vk::mem_allocator_vk>(*this, pdev);

View file

@ -155,18 +155,6 @@ namespace vk
const std::vector<const char*>& 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;

View file

@ -292,7 +292,7 @@ namespace vk
name_info.objectHandle = reinterpret_cast<u64>(value);
name_info.pObjectName = name.c_str();
g_render_device->_vkSetDebugUtilsObjectNameEXT(m_device, &name_info);
_vkSetDebugUtilsObjectNameEXT(m_device, &name_info);
}
}

View file

@ -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(

View file

@ -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;
}

View file

@ -114,6 +114,7 @@
<ClCompile Include="Emu\RSX\VK\VKVertexProgram.cpp" />
<ClCompile Include="Emu\RSX\VK\VKTextureCache.cpp" />
<ClCompile Include="Emu\RSX\VK\VKMemAlloc.cpp" />
<ClCompile Include="Emu\RSX\VK\VulkanAPI.cpp" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="emucore.vcxproj">

View file

@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="Emu\RSX\VK\VKAsyncScheduler.cpp" />
<ClCompile Include="Emu\RSX\VK\VKCommandStream.cpp" />
<ClCompile Include="Emu\RSX\VK\VKCommonDecompiler.cpp" />
<ClCompile Include="Emu\RSX\VK\VKCompute.cpp" />
<ClCompile Include="Emu\RSX\VK\VKDataHeapManager.cpp" />
<ClCompile Include="Emu\RSX\VK\VKDMA.cpp" />
<ClCompile Include="Emu\RSX\VK\VKDraw.cpp" />
@ -10,20 +13,22 @@
<ClCompile Include="Emu\RSX\VK\VKFramebuffer.cpp" />
<ClCompile Include="Emu\RSX\VK\VKGSRender.cpp" />
<ClCompile Include="Emu\RSX\VK\VKHelpers.cpp" />
<ClCompile Include="Emu\RSX\VK\VKMemAlloc.cpp" />
<ClCompile Include="Emu\RSX\VK\VKOverlays.cpp" />
<ClCompile Include="Emu\RSX\VK\VKPipelineCompiler.cpp" />
<ClCompile Include="Emu\RSX\VK\VKPresent.cpp" />
<ClCompile Include="Emu\RSX\VK\VKProgramPipeline.cpp" />
<ClCompile Include="Emu\RSX\VK\VKQueryPool.cpp" />
<ClCompile Include="Emu\RSX\VK\VKRenderPass.cpp" />
<ClCompile Include="Emu\RSX\VK\VKRenderTargets.cpp" />
<ClCompile Include="Emu\RSX\VK\VKResolveHelper.cpp" />
<ClCompile Include="Emu\RSX\VK\VKResourceManager.cpp" />
<ClCompile Include="Emu\RSX\VK\VKShaderInterpreter.cpp" />
<ClCompile Include="Emu\RSX\VK\VKTexture.cpp" />
<ClCompile Include="Emu\RSX\VK\VKTextureCache.cpp" />
<ClCompile Include="Emu\RSX\VK\VKVertexBuffers.cpp" />
<ClCompile Include="Emu\RSX\VK\VKVertexProgram.cpp" />
<ClCompile Include="Emu\RSX\VK\VKTextureCache.cpp" />
<ClCompile Include="Emu\RSX\VK\VKMemAlloc.cpp" />
<ClCompile Include="Emu\RSX\VK\VKCommandStream.cpp" />
<ClCompile Include="Emu\RSX\VK\VKQueryPool.cpp" />
<ClCompile Include="Emu\RSX\VK\VKPipelineCompiler.cpp" />
<ClCompile Include="Emu\RSX\VK\VulkanAPI.cpp" />
<ClCompile Include="Emu\RSX\VK\vkutils\chip_class.cpp">
<Filter>vkutils</Filter>
</ClCompile>
@ -66,10 +71,6 @@
<ClCompile Include="Emu\RSX\VK\vkutils\image_helpers.cpp">
<Filter>vkutils</Filter>
</ClCompile>
<ClCompile Include="Emu\RSX\VK\VKOverlays.cpp" />
<ClCompile Include="Emu\RSX\VK\VKCompute.cpp" />
<ClCompile Include="Emu\RSX\VK\VKAsyncScheduler.cpp" />
<ClCompile Include="Emu\RSX\VK\VKRenderTargets.cpp" />
<ClCompile Include="Emu\RSX\VK\upscalers\fsr1\fsr_pass.cpp">
<Filter>upscalers\fsr1</Filter>
</ClCompile>