1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-12 04:08:52 +01:00

[dxvk] Add flag to ensure stable image GPU addresses

This commit is contained in:
Philip Rebohle 2024-09-29 15:09:19 +02:00 committed by Philip Rebohle
parent 438a08f87c
commit c59d6bd12c
3 changed files with 15 additions and 5 deletions

View File

@ -1943,9 +1943,14 @@ namespace dxvk {
&& (image->info().access & usageInfo.access) == usageInfo.access && (image->info().access & usageInfo.access) == usageInfo.access
&& (usageInfo.layout && image->info().layout == usageInfo.layout); && (usageInfo.layout && image->info().layout == usageInfo.layout);
// If everything matches already, no need to do anything. // If everything matches already, no need to do anything. Only ensure
if (isUsageAndFormatCompatible && isAccessAndLayoutCompatible) // that the stable adress bit is respected if set for the first time.
if (isUsageAndFormatCompatible && isAccessAndLayoutCompatible) {
if (usageInfo.stableGpuAddress && image->canRelocate())
image->assignResourceWithUsage(image->getAllocation(), usageInfo);
return true; return true;
}
// Ensure the image is accessible and in its default layout // Ensure the image is accessible and in its default layout
this->spillRenderPass(true); this->spillRenderPass(true);

View File

@ -49,7 +49,7 @@ namespace dxvk {
bool DxvkImage::canRelocate() const { bool DxvkImage::canRelocate() const {
return !m_imageInfo.mapPtr && !m_shared return !m_imageInfo.mapPtr && !m_shared && !m_stableAddress
&& !m_storage->flags().test(DxvkAllocationFlag::Imported) && !m_storage->flags().test(DxvkAllocationFlag::Imported)
&& !(m_info.flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT); && !(m_info.flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
} }
@ -151,7 +151,7 @@ namespace dxvk {
void* sharedMemoryInfo = nullptr; void* sharedMemoryInfo = nullptr;
VkExportMemoryAllocateInfo sharedExport = { VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO }; VkExportMemoryAllocateInfo sharedExport = { VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO };
VkImportMemoryWin32HandleInfoKHR sharedImportWin32= { VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR }; VkImportMemoryWin32HandleInfoKHR sharedImportWin32 = { VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR };
if (m_shared && m_info.sharing.mode == DxvkSharedHandleMode::Export) { if (m_shared && m_info.sharing.mode == DxvkSharedHandleMode::Export) {
sharedExport.pNext = std::exchange(sharedMemoryInfo, &sharedExport); sharedExport.pNext = std::exchange(sharedMemoryInfo, &sharedExport);
@ -164,7 +164,8 @@ namespace dxvk {
sharedImportWin32.handle = m_info.sharing.handle; sharedImportWin32.handle = m_info.sharing.handle;
} }
return m_allocator->createImageResource(imageInfo, m_properties, sharedMemoryInfo); return m_allocator->createImageResource(imageInfo,
m_properties, sharedMemoryInfo);
} }
@ -206,6 +207,7 @@ namespace dxvk {
m_info.viewFormats = m_viewFormats.data(); m_info.viewFormats = m_viewFormats.data();
} }
m_stableAddress |= usageInfo.stableGpuAddress;
return old; return old;
} }

View File

@ -91,6 +91,8 @@ namespace dxvk {
uint32_t viewFormatCount = 0u; uint32_t viewFormatCount = 0u;
// View formats to add to the compatibility list // View formats to add to the compatibility list
const VkFormat* viewFormats = nullptr; const VkFormat* viewFormats = nullptr;
// Requtes the image to not be relocated in the future
VkBool32 stableGpuAddress = VK_FALSE;
}; };
@ -583,6 +585,7 @@ namespace dxvk {
uint32_t m_version = 0u; uint32_t m_version = 0u;
VkBool32 m_shared = VK_FALSE; VkBool32 m_shared = VK_FALSE;
VkBool32 m_stableAddress = VK_FALSE;
DxvkResourceImageInfo m_imageInfo = { }; DxvkResourceImageInfo m_imageInfo = { };