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/VKVertexBuffers.cpp
RSX/VK/VKVertexProgram.cpp RSX/VK/VKVertexProgram.cpp
RSX/VK/VKTextureCache.cpp RSX/VK/VKTextureCache.cpp
RSX/VK/VulkanAPI.cpp
) )
endif() 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.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT;
info.buffer = m_cond_render_buffer->value; 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; 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->firstVertex = range.first;
_ptr->vertexCount = range.count; _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 else
{ {
@ -994,7 +994,7 @@ void VKGSRender::emit_geometry(u32 sub_index)
_ptr->indexCount = count; _ptr->indexCount = count;
vertex_offset += 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 else
{ {
@ -1167,7 +1167,7 @@ void VKGSRender::end()
if (m_current_command_buffer->flags & vk::command_buffer::cb_has_conditional_render) 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); 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) if (m_current_command_buffer->flags & vk::command_buffer::cb_has_conditional_render)
{ {
ensure(m_render_pass_open); ensure(m_render_pass_open);
m_device->_vkCmdEndConditionalRenderingEXT(*m_current_command_buffer); _vkCmdEndConditionalRenderingEXT(*m_current_command_buffer);
} }
#endif #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 #if VK_HEADER_VERSION < 287
constexpr VkDriverId VK_DRIVER_ID_MESA_HONEYKRISP = static_cast<VkDriverId>(26); constexpr VkDriverId VK_DRIVER_ID_MESA_HONEYKRISP = static_cast<VkDriverId>(26);
#endif #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); 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); memory_map = vk::get_memory_mapping(pdev);
m_formats_support = vk::get_optimal_tiling_supported_formats(pdev); m_formats_support = vk::get_optimal_tiling_supported_formats(pdev);
m_pipeline_binding_table = vk::get_pipeline_binding_table(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) if (g_cfg.video.disable_vulkan_mem_allocator)
{ {
m_allocator = std::make_unique<vk::mem_allocator_vk>(*this, pdev); 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 std::vector<const char*>& requested_extensions,
const VkPhysicalDeviceFeatures& requested_features) const; 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: public:
render_device() = default; render_device() = default;
~render_device() = default; ~render_device() = default;

View file

@ -292,7 +292,7 @@ namespace vk
name_info.objectHandle = reinterpret_cast<u64>(value); name_info.objectHandle = reinterpret_cast<u64>(value);
name_info.pObjectName = name.c_str(); 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."; 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 VkDeviceFaultCountsEXT fault_counts
{ {
@ -30,7 +30,7 @@ namespace vk
std::string fault_description; std::string fault_description;
// Retrieve sizes // Retrieve sizes
g_render_device->_vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, nullptr); _vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, nullptr);
// Resize arrays and fill // Resize arrays and fill
address_info.resize(fault_counts.addressInfoCount); address_info.resize(fault_counts.addressInfoCount);
@ -44,7 +44,7 @@ namespace vk
.pVendorInfos = vendor_info.data(), .pVendorInfos = vendor_info.data(),
.pVendorBinaryData = vendor_binary_data.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; fault_description = fault_info.description;
std::string fault_message = fmt::format( std::string fault_message = fmt::format(

View file

@ -253,7 +253,7 @@ namespace vk
if (m_backend == sync_backend::events_v2) if (m_backend == sync_backend::events_v2)
{ {
m_device->_vkCmdPipelineBarrier2KHR(cmd, &dependency); _vkCmdPipelineBarrier2KHR(cmd, &dependency);
return; return;
} }
@ -284,7 +284,7 @@ namespace vk
// The expectation is that this will be awaited using the gpu_wait function. // The expectation is that this will be awaited using the gpu_wait function.
if (m_backend == sync_backend::events_v2) [[ likely ]] if (m_backend == sync_backend::events_v2) [[ likely ]]
{ {
m_device->_vkCmdSetEvent2KHR(cmd, m_vk_event, &dependency); _vkCmdSetEvent2KHR(cmd, m_vk_event, &dependency);
} }
else else
{ {
@ -322,7 +322,7 @@ namespace vk
.pMemoryBarriers = &mem_barrier .pMemoryBarriers = &mem_barrier
}; };
m_device->_vkCmdSetEvent2KHR(cmd, m_vk_event, &empty_dependency); _vkCmdSetEvent2KHR(cmd, m_vk_event, &empty_dependency);
} }
void event::host_signal() const void event::host_signal() const
@ -342,7 +342,7 @@ namespace vk
if (m_backend == sync_backend::events_v2) [[ likely ]] 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; return;
} }

View file

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

View file

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