@@ -170,13 +170,20 @@ VkImageLayout VkImageLayoutFromUsage(VkImageUsageFlags Usage)
170170 return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
171171}
172172
173- bool CheckHostImageCopySupport (const VulkanUtilities::VulkanLogicalDevice& LogicalDevice,
174- const VulkanUtilities::VulkanPhysicalDevice& PhysicalDevice,
175- const VkImageCreateInfo& ImageCI)
173+ bool CheckHostImageInitialization (const VulkanUtilities::VulkanLogicalDevice& LogicalDevice,
174+ const VulkanUtilities::VulkanPhysicalDevice& PhysicalDevice,
175+ const VkImageCreateInfo& ImageCI)
176176{
177177 if (!LogicalDevice.GetEnabledExtFeatures ().HostImageCopy .hostImageCopy )
178178 return false ;
179179
180+ if (!PhysicalDevice.IsUMA ())
181+ {
182+ // On discrete GPUs, textures with VK_IMAGE_USAGE_HOST_TRANSFER_BIT usage are allocated in a host-visible
183+ // device-local memory that is very scarce.
184+ return false ;
185+ }
186+
180187 VkFormatProperties3 vkFormatProps3{};
181188 VkFormatProperties VkFormatProps = PhysicalDevice.GetPhysicalDeviceFormatProperties (ImageCI.format , &vkFormatProps3);
182189 (void )VkFormatProps;
@@ -236,9 +243,9 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
236243
237244 VkImageCreateInfo ImageCI = TextureDescToVkImageCreateInfo (m_Desc, pRenderDeviceVk);
238245
239- const bool InitContent = pInitData != nullptr && pInitData->pSubResources != nullptr && pInitData->NumSubresources > 0 ;
240- const bool UseHostImageCopy = InitContent && CheckHostImageCopySupport (LogicalDevice, pRenderDeviceVk->GetPhysicalDevice (), ImageCI);
241- if (UseHostImageCopy )
246+ const bool InitContent = pInitData != nullptr && pInitData->pSubResources != nullptr && pInitData->NumSubresources > 0 ;
247+ const bool UseHostInitialization = InitContent && CheckHostImageInitialization (LogicalDevice, pRenderDeviceVk->GetPhysicalDevice (), ImageCI);
248+ if (UseHostInitialization )
242249 ImageCI.usage |= VK_IMAGE_USAGE_HOST_TRANSFER_BIT;
243250
244251 const std::vector<uint32_t > QueueFamilyIndices = PlatformMisc::CountOneBits (m_Desc.ImmediateContextMask ) > 1 ?
@@ -288,7 +295,7 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
288295 if (InitContent)
289296 {
290297 bool InitializedOnHost = false ;
291- if (UseHostImageCopy )
298+ if (UseHostInitialization )
292299 {
293300 InitializedOnHost = InitializeContentOnHost (*pInitData, FmtAttribs, ImageCI);
294301 }
0 commit comments