Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend ID3D12DXVKInteropDevice into ID3D12DXVKInteropDevice1 to add VkCommandBuffer interop #2053

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions include/vkd3d_device_vkd3d_ext.idl
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,21 @@ interface ID3D12DXVKInteropDevice : IUnknown
HRESULT UnlockCommandQueue(ID3D12CommandQueue *queue);
}

[
uuid(902d8115-59eb-4406-9518-fe00f991ee65),
object,
local,
pointer_default(unique)
]
interface ID3D12DXVKInteropDevice1 : ID3D12DXVKInteropDevice
{
HRESULT GetVulkanResourceInfo1(ID3D12Resource *resource, UINT64 *vk_handle, UINT64 *buffer_offset, VkFormat *format);
HRESULT CreateInteropCommandQueue(const D3D12_COMMAND_QUEUE_DESC *pDesc, UINT32 vk_queue_family_index, ID3D12CommandQueue **ppQueue);
HRESULT CreateInteropCommandAllocator(D3D12_COMMAND_LIST_TYPE type, UINT32 vk_queue_family_index, ID3D12CommandAllocator **ppAllocator);
HRESULT BeginVkCommandBufferInterop(ID3D12CommandList *pCmdList, VkCommandBuffer *pCommandBuffer);
Copy link
Owner

@HansKristian-Work HansKristian-Work Aug 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need an EndVkCommandBufferInterop as well, just in case we need to support certain things in the future like conditional rendering and queries. For now, just implement it as a noop.

HRESULT EndVkCommandBufferInterop(ID3D12CommandList *pCmdList);
}

[
uuid(f3112584-41f9-348d-a59b-00b7e1d285d6),
object,
Expand Down
1 change: 1 addition & 0 deletions include/vkd3d_vk_includes.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ typedef struct VkInstance_T *VkInstance;
typedef struct VkDevice_T *VkDevice;
typedef struct VkQueue_T *VkQueue;

typedef enum VkFormat VkFormat;
typedef enum VkResult VkResult;
typedef enum VkImageLayout VkImageLayout;

Expand Down
9 changes: 6 additions & 3 deletions libs/vkd3d/breadcrumbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,21 +599,24 @@ void vkd3d_breadcrumb_tracer_report_device_lost(struct vkd3d_breadcrumb_tracer *
if (device->vk_info.NV_device_diagnostic_checkpoints)
{
/* vkGetQueueCheckpointDataNV does not require us to synchronize access to the queue. */
queue_family_info = d3d12_device_get_vkd3d_queue_family(device, D3D12_COMMAND_LIST_TYPE_DIRECT);
queue_family_info = d3d12_device_get_vkd3d_queue_family(device, D3D12_COMMAND_LIST_TYPE_DIRECT, VK_QUEUE_FAMILY_IGNORED);

for (i = 0; i < queue_family_info->queue_count; i++)
{
vk_queue = queue_family_info->queues[i]->vk_queue;
vkd3d_breadcrumb_tracer_report_queue_nv(tracer, device, vk_queue);
}

queue_family_info = d3d12_device_get_vkd3d_queue_family(device, D3D12_COMMAND_LIST_TYPE_COMPUTE);
queue_family_info = d3d12_device_get_vkd3d_queue_family(device, D3D12_COMMAND_LIST_TYPE_COMPUTE, VK_QUEUE_FAMILY_IGNORED);

for (i = 0; i < queue_family_info->queue_count; i++)
{
vk_queue = queue_family_info->queues[i]->vk_queue;
vkd3d_breadcrumb_tracer_report_queue_nv(tracer, device, vk_queue);
}

queue_family_info = d3d12_device_get_vkd3d_queue_family(device, D3D12_COMMAND_LIST_TYPE_COPY);
queue_family_info = d3d12_device_get_vkd3d_queue_family(device, D3D12_COMMAND_LIST_TYPE_COPY, VK_QUEUE_FAMILY_IGNORED);

for (i = 0; i < queue_family_info->queue_count; i++)
{
vk_queue = queue_family_info->queues[i]->vk_queue;
Expand Down
68 changes: 43 additions & 25 deletions libs/vkd3d/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -2031,8 +2031,6 @@ static HRESULT d3d12_command_allocator_allocate_command_buffer(struct d3d12_comm
return S_OK;
}

static void d3d12_command_list_invalidate_all_state(struct d3d12_command_list *list);

static void d3d12_command_list_begin_new_sequence(struct d3d12_command_list *list)
{
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
Expand Down Expand Up @@ -2629,19 +2627,33 @@ static CONST_VTBL struct ID3D12CommandAllocatorVtbl d3d12_command_allocator_vtbl
};

struct vkd3d_queue_family_info *d3d12_device_get_vkd3d_queue_family(struct d3d12_device *device,
D3D12_COMMAND_LIST_TYPE type)
D3D12_COMMAND_LIST_TYPE type,
uint32_t vk_family_index)
{
switch (type)
if (vk_family_index == VK_QUEUE_FAMILY_IGNORED)
{
case D3D12_COMMAND_LIST_TYPE_DIRECT:
return device->queue_families[VKD3D_QUEUE_FAMILY_GRAPHICS];
case D3D12_COMMAND_LIST_TYPE_COMPUTE:
return device->queue_families[VKD3D_QUEUE_FAMILY_COMPUTE];
case D3D12_COMMAND_LIST_TYPE_COPY:
return device->queue_families[VKD3D_QUEUE_FAMILY_TRANSFER];
default:
FIXME("Unhandled command list type %#x.\n", type);
return device->queue_families[VKD3D_QUEUE_FAMILY_GRAPHICS];
switch (type)
{
case D3D12_COMMAND_LIST_TYPE_DIRECT:
return device->queue_families[VKD3D_QUEUE_FAMILY_GRAPHICS];
case D3D12_COMMAND_LIST_TYPE_COMPUTE:
return device->queue_families[VKD3D_QUEUE_FAMILY_COMPUTE];
case D3D12_COMMAND_LIST_TYPE_COPY:
return device->queue_families[VKD3D_QUEUE_FAMILY_TRANSFER];
default:
FIXME("Unhandled command list type %#x.\n", type);
return device->queue_families[VKD3D_QUEUE_FAMILY_GRAPHICS];
}
}
else
{
for (int i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
{
if (device->queue_families[i]->vk_family_index == vk_family_index)
return device->queue_families[i];
}
FIXME("Unhandled command list vk_family %#x.\n", vk_family_index);
return device->queue_families[VKD3D_QUEUE_FAMILY_GRAPHICS];
}
}

Expand Down Expand Up @@ -2678,10 +2690,11 @@ void d3d12_device_unmap_vkd3d_queue(struct d3d12_device *device,
}

static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allocator,
struct d3d12_device *device, D3D12_COMMAND_LIST_TYPE type)
struct d3d12_device *device,
D3D12_COMMAND_LIST_TYPE type,
struct vkd3d_queue_family_info *queue_family)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
struct vkd3d_queue_family_info *queue_family;
VkCommandPoolCreateInfo command_pool_info;
VkResult vr;
HRESULT hr;
Expand All @@ -2690,7 +2703,6 @@ static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allo
if (FAILED(hr = vkd3d_private_store_init(&allocator->private_store)))
return hr;

queue_family = d3d12_device_get_vkd3d_queue_family(device, type);
allocator->ID3D12CommandAllocator_iface.lpVtbl = &d3d12_command_allocator_vtbl;
allocator->refcount = 1;
allocator->internal_refcount = 1;
Expand Down Expand Up @@ -2771,8 +2783,11 @@ static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allo
}

HRESULT d3d12_command_allocator_create(struct d3d12_device *device,
D3D12_COMMAND_LIST_TYPE type, struct d3d12_command_allocator **allocator)
D3D12_COMMAND_LIST_TYPE type,
uint32_t vk_family_index,
struct d3d12_command_allocator **allocator)
{
struct vkd3d_queue_family_info *family_info;
struct d3d12_command_allocator *object;
HRESULT hr;

Expand All @@ -2785,7 +2800,8 @@ HRESULT d3d12_command_allocator_create(struct d3d12_device *device,
if (!(object = vkd3d_malloc(sizeof(*object))))
return E_OUTOFMEMORY;

if (FAILED(hr = d3d12_command_allocator_init(object, device, type)))
family_info = d3d12_device_get_vkd3d_queue_family(device, type, vk_family_index);
if (FAILED(hr = d3d12_command_allocator_init(object, device, type, family_info)))
{
vkd3d_free(object);
return hr;
Expand Down Expand Up @@ -5634,7 +5650,7 @@ static void d3d12_command_list_reset_state(struct d3d12_command_list *list,
d3d12_command_list_reset_internal_state(list);
}

static void d3d12_command_list_invalidate_all_state(struct d3d12_command_list *list)
void d3d12_command_list_invalidate_all_state(struct d3d12_command_list *list)
{
d3d12_command_list_invalidate_current_pipeline(list, true);
d3d12_command_list_invalidate_root_parameters(list, &list->graphics_bindings, true, NULL);
Expand Down Expand Up @@ -16758,7 +16774,7 @@ HRESULT d3d12_command_list_create(struct d3d12_device *device,
return S_OK;
}

static struct d3d12_command_list *d3d12_command_list_from_iface(ID3D12CommandList *iface)
struct d3d12_command_list *d3d12_command_list_from_iface(ID3D12CommandList *iface)
{
bool is_valid = false;
if (!iface)
Expand Down Expand Up @@ -18698,7 +18714,7 @@ static void *d3d12_command_queue_submission_worker_main(void *userdata)
}

static HRESULT d3d12_command_queue_init(struct d3d12_command_queue *queue,
struct d3d12_device *device, const D3D12_COMMAND_QUEUE_DESC *desc)
struct d3d12_device *device, const D3D12_COMMAND_QUEUE_DESC *desc, struct vkd3d_queue_family_info *family_info)
{
HRESULT hr;
int rc;
Expand All @@ -18711,8 +18727,7 @@ static HRESULT d3d12_command_queue_init(struct d3d12_command_queue *queue,
if (!queue->desc.NodeMask)
queue->desc.NodeMask = 0x1;

queue->vkd3d_queue = d3d12_device_allocate_vkd3d_queue(device,
d3d12_device_get_vkd3d_queue_family(device, desc->Type));
queue->vkd3d_queue = d3d12_device_allocate_vkd3d_queue(device, family_info);
queue->submissions = NULL;
queue->submissions_count = 0;
queue->submissions_size = 0;
Expand Down Expand Up @@ -18773,15 +18788,18 @@ fail_fence_worker_start:;
}

HRESULT d3d12_command_queue_create(struct d3d12_device *device,
const D3D12_COMMAND_QUEUE_DESC *desc, struct d3d12_command_queue **queue)
const D3D12_COMMAND_QUEUE_DESC *desc, uint32_t vk_family_index, struct d3d12_command_queue **queue)
{
struct vkd3d_queue_family_info *family_info;
struct d3d12_command_queue *object;
HRESULT hr;

if (!(object = vkd3d_calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;

if (FAILED(hr = d3d12_command_queue_init(object, device, desc)))
family_info = d3d12_device_get_vkd3d_queue_family(device, desc->Type, vk_family_index);

if (FAILED(hr = d3d12_command_queue_init(object, device, desc, family_info)))
{
vkd3d_free(object);
return hr;
Expand Down
11 changes: 6 additions & 5 deletions libs/vkd3d/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -3411,7 +3411,7 @@ void d3d12_device_return_query_pool(struct d3d12_device *device, const struct vk

/* ID3D12Device */
extern ULONG STDMETHODCALLTYPE d3d12_device_vkd3d_ext_AddRef(d3d12_device_vkd3d_ext_iface *iface);
extern ULONG STDMETHODCALLTYPE d3d12_dxvk_interop_device_AddRef(ID3D12DXVKInteropDevice *iface);
extern ULONG STDMETHODCALLTYPE d3d12_dxvk_interop_device_AddRef(d3d12_dxvk_interop_device_iface *iface);
extern ULONG STDMETHODCALLTYPE d3d12_low_latency_device_AddRef(ID3DLowLatencyDevice *iface);

HRESULT STDMETHODCALLTYPE d3d12_device_QueryInterface(d3d12_device_iface *iface,
Expand Down Expand Up @@ -3452,7 +3452,8 @@ HRESULT STDMETHODCALLTYPE d3d12_device_QueryInterface(d3d12_device_iface *iface,
return S_OK;
}

if (IsEqualGUID(riid, &IID_ID3D12DXVKInteropDevice))
if (IsEqualGUID(riid, &IID_ID3D12DXVKInteropDevice)
|| IsEqualGUID(riid, &IID_ID3D12DXVKInteropDevice1))
{
struct d3d12_device *device = impl_from_ID3D12Device(iface);
d3d12_dxvk_interop_device_AddRef(&device->ID3D12DXVKInteropDevice_iface);
Expand Down Expand Up @@ -3649,7 +3650,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandQueue(d3d12_device_if
TRACE("iface %p, desc %p, riid %s, command_queue %p.\n",
iface, desc, debugstr_guid(riid), command_queue);

if (FAILED(hr = d3d12_command_queue_create(device, desc, &object)))
if (FAILED(hr = d3d12_command_queue_create(device, desc, VK_QUEUE_FAMILY_IGNORED, &object)))
return hr;

return return_interface(&object->ID3D12CommandQueue_iface, &IID_ID3D12CommandQueue,
Expand All @@ -3676,7 +3677,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandAllocator(d3d12_devic
else
{
struct d3d12_command_allocator *object;
if (FAILED(hr = d3d12_command_allocator_create(device, type, &object)))
if (FAILED(hr = d3d12_command_allocator_create(device, type, VK_QUEUE_FAMILY_IGNORED, &object)))
return hr;
allocator_iface = &object->ID3D12CommandAllocator_iface;
}
Expand Down Expand Up @@ -8711,7 +8712,7 @@ static void d3d12_device_replace_vtable(struct d3d12_device *device)
}

extern CONST_VTBL struct ID3D12DeviceExt1Vtbl d3d12_device_vkd3d_ext_vtbl;
extern CONST_VTBL struct ID3D12DXVKInteropDeviceVtbl d3d12_dxvk_interop_device_vtbl;
extern CONST_VTBL struct ID3D12DXVKInteropDevice1Vtbl d3d12_dxvk_interop_device_vtbl;
extern CONST_VTBL struct ID3DLowLatencyDeviceVtbl d3d_low_latency_device_vtbl;

static void vkd3d_scratch_pool_init(struct d3d12_device *device)
Expand Down
Loading