diff --git a/src/d3d11/d3d11_texture.cpp b/src/d3d11/d3d11_texture.cpp index 4e68b2be..4bf7c1cb 100644 --- a/src/d3d11/d3d11_texture.cpp +++ b/src/d3d11/d3d11_texture.cpp @@ -203,11 +203,8 @@ namespace dxvk { // in case it is going to be mapped directly. VkMemoryPropertyFlags memoryProperties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - if (m_mapMode == D3D11_COMMON_TEXTURE_MAP_MODE_DIRECT) { - memoryProperties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT - | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT - | VK_MEMORY_PROPERTY_HOST_CACHED_BIT; - } + if (m_mapMode == D3D11_COMMON_TEXTURE_MAP_MODE_DIRECT) + memoryProperties = GetMemoryFlags(); if (vkImage == VK_NULL_HANDLE) m_image = m_device->GetDXVKDevice()->createImage(imageInfo, memoryProperties); @@ -531,6 +528,19 @@ namespace dxvk { } + VkMemoryPropertyFlags D3D11CommonTexture::GetMemoryFlags() const { + VkMemoryPropertyFlags memoryFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT + | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + + if ((m_desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ) || m_device->GetOptions()->apitraceMode) + memoryFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT; + else if (m_desc.Usage == D3D11_USAGE_DEFAULT || m_desc.BindFlags) + memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + + return memoryFlags; + } + + D3D11_COMMON_TEXTURE_MAP_MODE D3D11CommonTexture::DetermineMapMode( const DxvkImageCreateInfo* pImageInfo) const { // Don't map an image unless the application requests it diff --git a/src/d3d11/d3d11_texture.h b/src/d3d11/d3d11_texture.h index e6115279..b08291fc 100644 --- a/src/d3d11/d3d11_texture.h +++ b/src/d3d11/d3d11_texture.h @@ -414,6 +414,8 @@ namespace dxvk { VkFormat Format, UINT CpuAccess) const; + VkMemoryPropertyFlags GetMemoryFlags() const; + D3D11_COMMON_TEXTURE_MAP_MODE DetermineMapMode( const DxvkImageCreateInfo* pImageInfo) const;