Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ValveSoftware/vkd3d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConor McCarthy <cmccarthy@codeweavers.com>2019-10-25 04:13:21 +0300
committerAlexandre Julliard <julliard@winehq.org>2019-10-27 21:20:50 +0300
commit87cc75b7e6c7692c5f2f236f63b3839d1ab4aebe (patch)
tree835f4b05a504d414bd6c5b6cb0ca10c21f6de333
parent832f47edd3be8a4dc5acaf9f05f52fa1713ce89e (diff)
vkd3d: Add support for custom heap properties.
Signed-off-by: Conor McCarthy <cmccarthy@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
-rw-r--r--include/vkd3d_d3d12.idl1
-rw-r--r--libs/vkd3d/resource.c64
2 files changed, 49 insertions, 16 deletions
diff --git a/include/vkd3d_d3d12.idl b/include/vkd3d_d3d12.idl
index 8489f565..ec8b83db 100644
--- a/include/vkd3d_d3d12.idl
+++ b/include/vkd3d_d3d12.idl
@@ -309,6 +309,7 @@ typedef enum D3D12_HEAP_TYPE
typedef enum D3D12_CPU_PAGE_PROPERTY
{
D3D12_CPU_PAGE_PROPERTY_UNKNOWN = 0,
+ D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE = 1,
D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE = 2,
D3D12_CPU_PAGE_PROPERTY_WRITE_BACK = 3,
} D3D12_CPU_PAGE_PROPERTY;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index f15c371e..d6e999eb 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -34,8 +34,17 @@ static inline bool is_cpu_accessible_heap(const D3D12_HEAP_PROPERTIES *propertie
return true;
}
-static unsigned int vkd3d_select_memory_type(struct d3d12_device *device, uint32_t memory_type_mask,
- const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags)
+static bool is_numa_device(struct d3d12_device *device)
+{
+ unsigned int i;
+ for (i = 0; i < device->memory_properties.memoryTypeCount; ++i)
+ if (!(device->memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))
+ return true;
+ return false;
+}
+
+static HRESULT vkd3d_select_memory_type(struct d3d12_device *device, uint32_t memory_type_mask,
+ const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags, unsigned int *type_index)
{
const VkPhysicalDeviceMemoryProperties *memory_info = &device->memory_properties;
VkMemoryPropertyFlags flags[3];
@@ -58,16 +67,36 @@ static unsigned int vkd3d_select_memory_type(struct d3d12_device *device, uint32
break;
case D3D12_HEAP_TYPE_CUSTOM:
- FIXME("Custom heaps not supported yet.\n");
- flags[count++] = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
- | VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
- flags[count++] = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
- flags[count++] = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ if (heap_properties->MemoryPoolPreference == D3D12_MEMORY_POOL_UNKNOWN
+ || (heap_properties->MemoryPoolPreference == D3D12_MEMORY_POOL_L1
+ && (is_cpu_accessible_heap(heap_properties) || !is_numa_device(device))))
+ {
+ WARN("Invalid memory pool preference.\n");
+ return E_INVALIDARG;
+ }
+
+ switch (heap_properties->CPUPageProperty)
+ {
+ case D3D12_CPU_PAGE_PROPERTY_WRITE_BACK:
+ flags[count++] = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
+ | VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+ /* Fall through. */
+ case D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE:
+ flags[count++] = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+ /* Fall through. */
+ case D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE:
+ flags[count++] = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ break;
+ case D3D12_CPU_PAGE_PROPERTY_UNKNOWN:
+ default:
+ WARN("Invalid CPU page property.\n");
+ return E_INVALIDARG;
+ }
break;
default:
WARN("Invalid heap type %#x.\n", heap_properties->Type);
- return ~0u;
+ return E_INVALIDARG;
}
for (j = 0; j < count; ++j)
@@ -79,11 +108,14 @@ static unsigned int vkd3d_select_memory_type(struct d3d12_device *device, uint32
if (!(memory_type_mask & (1u << i)))
continue;
if ((memory_info->memoryTypes[i].propertyFlags & preferred_flags) == preferred_flags)
- return i;
+ {
+ *type_index = i;
+ return S_OK;
+ }
}
}
- return ~0u;
+ return E_FAIL;
}
static HRESULT vkd3d_allocate_device_memory(struct d3d12_device *device,
@@ -95,6 +127,7 @@ static HRESULT vkd3d_allocate_device_memory(struct d3d12_device *device,
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkMemoryAllocateInfo allocate_info;
VkResult vr;
+ HRESULT hr;
TRACE("Memory requirements: size %#"PRIx64", alignment %#"PRIx64".\n",
memory_requirements->size, memory_requirements->alignment);
@@ -102,14 +135,13 @@ static HRESULT vkd3d_allocate_device_memory(struct d3d12_device *device,
allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
allocate_info.pNext = dedicated_allocate_info;
allocate_info.allocationSize = memory_requirements->size;
- allocate_info.memoryTypeIndex = vkd3d_select_memory_type(device,
- memory_requirements->memoryTypeBits, heap_properties, heap_flags);
-
- if (allocate_info.memoryTypeIndex == ~0u)
+ if (FAILED(hr = vkd3d_select_memory_type(device, memory_requirements->memoryTypeBits,
+ heap_properties, heap_flags, &allocate_info.memoryTypeIndex)))
{
- FIXME("Failed to find suitable memory type (allowed types %#x).\n", memory_requirements->memoryTypeBits);
+ if (hr != E_INVALIDARG)
+ FIXME("Failed to find suitable memory type (allowed types %#x).\n", memory_requirements->memoryTypeBits);
*vk_memory = VK_NULL_HANDLE;
- return E_FAIL;
+ return hr;
}
TRACE("Allocating memory type %u.\n", allocate_info.memoryTypeIndex);