mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-19 19:15:26 +00:00
vk: Rework extension wrangling
This commit is contained in:
parent
8aaf2f8577
commit
0f57624a61
13 changed files with 94 additions and 65 deletions
|
@ -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()
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
41
rpcs3/Emu/RSX/VK/VKProcTable.h
Normal file
41
rpcs3/Emu/RSX/VK/VKProcTable.h
Normal 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
|
20
rpcs3/Emu/RSX/VK/VulkanAPI.cpp
Normal file
20
rpcs3/Emu/RSX/VK/VulkanAPI.cpp
Normal 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"
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue