From 2a49173b6060394b7136c99e1b4bc1fe844d27fc Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 17 Oct 2016 18:38:39 +0200 Subject: [PATCH] libs/vkd3d: Export a function to create a d3d12 resource from a Vulkan image. --- include/vkd3d.h | 3 +++ libs/vkd3d/device.c | 8 ++++++++ libs/vkd3d/resource.c | 31 +++++++++++++++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 3 ++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/include/vkd3d.h b/include/vkd3d.h index 3ea591ad..b7481877 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -25,6 +25,7 @@ #include "vkd3d_windows.h" #include "d3d12.h" +#include #include #ifdef __cplusplus @@ -41,6 +42,8 @@ struct vkd3d_device_create_info HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info, REFIID riid, void **device); +HRESULT vkd3d_create_image_resource(ID3D12Device *device, const D3D12_RESOURCE_DESC *desc, + VkImage vk_image, ID3D12Resource **resource); #ifdef __cplusplus } diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 414f73f4..55c753de 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1091,6 +1091,14 @@ static const struct ID3D12DeviceVtbl d3d12_device_vtbl = d3d12_device_GetAdapterLuid, }; +struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface) +{ + if (!iface) + return NULL; + assert(iface->lpVtbl == &d3d12_device_vtbl); + return impl_from_ID3D12Device(iface); +} + static HRESULT d3d12_device_init(struct d3d12_device *device, const struct vkd3d_device_create_info *create_info) { diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index f9a9fffc..fcfc7e02 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -324,6 +324,9 @@ static void vkd3d_destroy_resource(struct d3d12_resource *resource, struct d3d12 { const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; + if (resource->external) + return; + switch (resource->desc.Dimension) { case D3D12_RESOURCE_DIMENSION_BUFFER: @@ -670,6 +673,7 @@ static HRESULT d3d12_committed_resource_init(struct d3d12_resource *resource, st return E_INVALIDARG; } + resource->external = false; resource->map_count = 0; resource->map_data = NULL; @@ -704,6 +708,33 @@ HRESULT d3d12_committed_resource_create(struct d3d12_device *device, return S_OK; } +HRESULT vkd3d_create_image_resource(ID3D12Device *device, const D3D12_RESOURCE_DESC *desc, + VkImage vk_image, ID3D12Resource **resource) +{ + struct d3d12_device *d3d12_device = unsafe_impl_from_ID3D12Device(device); + struct d3d12_resource *object; + + if (!(object = vkd3d_malloc(sizeof(*object)))) + return E_OUTOFMEMORY; + + object->ID3D12Resource_iface.lpVtbl = &d3d12_resource_vtbl; + object->refcount = 1; + object->desc = *desc; + object->u.vk_image = vk_image; + object->vk_memory = VK_NULL_HANDLE; + object->external = true; + object->map_count = 0; + object->map_data = NULL; + object->device = d3d12_device; + ID3D12Device_AddRef(&d3d12_device->ID3D12Device_iface); + + TRACE("Created resource %p.\n", object); + + *resource = &object->ID3D12Resource_iface; + + return S_OK; +} + /* RTVs */ static void d3d12_rtv_desc_destroy(struct d3d12_rtv_desc *rtv, struct d3d12_device *device) { diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index b703b388..8498543b 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -24,7 +24,6 @@ #define __VKD3D_PRIVATE_H #define VK_NO_PROTOTYPES -#include #define COBJMACROS #define NONAMELESSUNION @@ -129,6 +128,7 @@ struct d3d12_resource VkImage vk_image; } u; VkDeviceMemory vk_memory; + bool external; unsigned int map_count; void *map_data; @@ -344,6 +344,7 @@ struct d3d12_device HRESULT d3d12_device_create(const struct vkd3d_device_create_info *create_info, struct d3d12_device **device) DECLSPEC_HIDDEN; +struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface) DECLSPEC_HIDDEN; /* utils */ struct vkd3d_format