diff --git a/rpcs3/Emu/RSX/VK/VKDMA.cpp b/rpcs3/Emu/RSX/VK/VKDMA.cpp index 85dd0ba46e..e363380de4 100644 --- a/rpcs3/Emu/RSX/VK/VKDMA.cpp +++ b/rpcs3/Emu/RSX/VK/VKDMA.cpp @@ -280,8 +280,16 @@ namespace vk void create_dma_block(std::unique_ptr& block) { - // TODO - block.reset(new dma_block_EXT()); +#ifdef _WIN32 + if (g_render_device->get_external_memory_host_support()) + { + block.reset(new dma_block_EXT()); + } + else +#endif + { + block.reset(new dma_block()); + } } std::pair map_dma(const command_buffer& cmd, u32 local_address, u32 length) diff --git a/rpcs3/Emu/RSX/VK/vkutils/buffer_object.cpp b/rpcs3/Emu/RSX/VK/vkutils/buffer_object.cpp index a9f23a9647..86027f2317 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/buffer_object.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/buffer_object.cpp @@ -91,7 +91,7 @@ namespace vk VkMemoryHostPointerPropertiesEXT memory_properties{}; memory_properties.sType = VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT; - memory_map.getMemoryHostPointerPropertiesEXT(dev, VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, host_pointer, &memory_properties); + CHECK_RESULT(memory_map.getMemoryHostPointerPropertiesEXT(dev, VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, host_pointer, &memory_properties)); VkMemoryRequirements memory_reqs; vkGetBufferMemoryRequirements(m_device, value, &memory_reqs); @@ -110,7 +110,7 @@ namespace vk } memory = std::make_unique(m_device, host_pointer, size, memory_type_index); - vkBindBufferMemory(dev, value, memory->get_vk_device_memory(), memory->get_vk_device_memory_offset()); + CHECK_RESULT(vkBindBufferMemory(dev, value, memory->get_vk_device_memory(), memory->get_vk_device_memory_offset())); } buffer::~buffer() diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.cpp b/rpcs3/Emu/RSX/VK/vkutils/device.cpp index 123d58fac5..3c3755e4bb 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/device.cpp @@ -265,6 +265,7 @@ namespace vk if (pgpu->external_memory_host_support) { + requested_extensions.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME); requested_extensions.push_back(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME); } @@ -484,6 +485,11 @@ namespace vk return pgpu->unrestricted_depth_range_support; } + bool render_device::get_external_memory_host_support() const + { + return pgpu->external_memory_host_support; + } + mem_allocator_base* render_device::get_allocator() const { return m_allocator.get(); diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.h b/rpcs3/Emu/RSX/VK/vkutils/device.h index c3bcf293b3..e627580cd9 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.h +++ b/rpcs3/Emu/RSX/VK/vkutils/device.h @@ -115,6 +115,7 @@ namespace vk bool get_alpha_to_one_support() const; bool get_conditional_render_support() const; bool get_unrestricted_depth_range_support() const; + bool get_external_memory_host_support() const; mem_allocator_base* get_allocator() const; diff --git a/rpcs3/Emu/RSX/VK/vkutils/instance.hpp b/rpcs3/Emu/RSX/VK/vkutils/instance.hpp index b0740d4066..7b88614f9d 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/instance.hpp +++ b/rpcs3/Emu/RSX/VK/vkutils/instance.hpp @@ -149,6 +149,11 @@ namespace vk { extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); } + + if (support.is_supported(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) + { + extensions.push_back(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME); + } #ifdef _WIN32 extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #elif defined(__APPLE__)