blob: ac970e887e6a7ff40ee724731196496cca83db56 [file] [edit]
/*
* * Copyright 2023 NVIDIA Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define VKD3D_DBG_CHANNEL VKD3D_DBG_CHANNEL_API
#include "vkd3d_private.h"
static inline struct d3d12_command_queue *d3d12_command_queue_from_ID3D12CommandQueueExt(d3d12_command_queue_vkd3d_ext_iface *iface)
{
return CONTAINING_RECORD(iface, struct d3d12_command_queue, ID3D12CommandQueueExt_iface);
}
extern ULONG STDMETHODCALLTYPE d3d12_command_queue_AddRef(d3d12_command_queue_iface *iface);
ULONG STDMETHODCALLTYPE d3d12_command_queue_vkd3d_ext_AddRef(d3d12_command_queue_vkd3d_ext_iface *iface)
{
struct d3d12_command_queue *command_queue = d3d12_command_queue_from_ID3D12CommandQueueExt(iface);
return d3d12_command_queue_AddRef(&command_queue->ID3D12CommandQueue_iface);
}
extern ULONG STDMETHODCALLTYPE d3d12_command_queue_Release(d3d12_command_queue_iface *iface);
static ULONG STDMETHODCALLTYPE d3d12_command_queue_vkd3d_ext_Release(d3d12_command_queue_vkd3d_ext_iface *iface)
{
struct d3d12_command_queue *command_queue = d3d12_command_queue_from_ID3D12CommandQueueExt(iface);
return d3d12_command_queue_Release(&command_queue->ID3D12CommandQueue_iface);
}
extern HRESULT STDMETHODCALLTYPE d3d12_command_queue_QueryInterface(d3d12_command_queue_iface *iface,
REFIID iid, void **object);
static HRESULT STDMETHODCALLTYPE d3d12_command_queue_vkd3d_ext_QueryInterface(d3d12_command_queue_vkd3d_ext_iface *iface,
REFIID iid, void **out)
{
struct d3d12_command_queue *command_queue = d3d12_command_queue_from_ID3D12CommandQueueExt(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
return d3d12_command_queue_QueryInterface(&command_queue->ID3D12CommandQueue_iface, iid, out);
}
static HRESULT STDMETHODCALLTYPE d3d12_command_queue_vkd3d_ext_NotifyOutOfBandCommandQueue(d3d12_command_queue_vkd3d_ext_iface *iface, D3D12_OUT_OF_BAND_CQ_TYPE type)
{
struct d3d12_command_queue *command_queue;
VkOutOfBandQueueTypeNV vk_queue_type;
int i;
command_queue = d3d12_command_queue_from_ID3D12CommandQueueExt(iface);
if (!command_queue->device->vk_info.NV_low_latency2)
return E_NOTIMPL;
if (type != OUT_OF_BAND_RENDER && type != OUT_OF_BAND_PRESENT)
return E_INVALIDARG;
vk_queue_type = (VkOutOfBandQueueTypeNV)type;
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
{
if (command_queue->device->queue_families[i]->vk_family_index == command_queue->vkd3d_queue->vk_family_index &&
command_queue->device->queue_families[i]->out_of_band_queue)
{
struct vkd3d_queue *out_of_band_queue = command_queue->device->queue_families[i]->out_of_band_queue;
vkd3d_set_queue_out_of_band(command_queue->device, out_of_band_queue, vk_queue_type);
command_queue->vkd3d_queue = out_of_band_queue;
break;
}
}
return S_OK;
}
CONST_VTBL struct ID3D12CommandQueueExtVtbl d3d12_command_queue_vkd3d_ext_vtbl =
{
/* IUnknown methods */
d3d12_command_queue_vkd3d_ext_QueryInterface,
d3d12_command_queue_vkd3d_ext_AddRef,
d3d12_command_queue_vkd3d_ext_Release,
/* ID3D12CommandQueueExt methods */
d3d12_command_queue_vkd3d_ext_NotifyOutOfBandCommandQueue
};