mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d: Support count buffer for indirect draws.
Used by Resident Evil 2. Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de> Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ca744ae579
commit
f1076bb153
@ -4872,6 +4872,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(ID3D12GraphicsC
|
||||
UINT64 arg_buffer_offset, ID3D12Resource *count_buffer, UINT64 count_buffer_offset)
|
||||
{
|
||||
struct d3d12_command_signature *sig_impl = unsafe_impl_from_ID3D12CommandSignature(command_signature);
|
||||
struct d3d12_resource *count_impl = unsafe_impl_from_ID3D12Resource(count_buffer);
|
||||
struct d3d12_resource *arg_impl = unsafe_impl_from_ID3D12Resource(arg_buffer);
|
||||
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList1(iface);
|
||||
const D3D12_COMMAND_SIGNATURE_DESC *signature_desc;
|
||||
@ -4885,9 +4886,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(ID3D12GraphicsC
|
||||
|
||||
vk_procs = &list->device->vk_procs;
|
||||
|
||||
if (count_buffer)
|
||||
if (count_buffer && !list->device->vk_info.KHR_draw_indirect_count)
|
||||
{
|
||||
FIXME("Count buffers not implemented.\n");
|
||||
FIXME("Count buffers not supported by Vulkan implementation.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4905,8 +4906,17 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(ID3D12GraphicsC
|
||||
break;
|
||||
}
|
||||
|
||||
VK_CALL(vkCmdDrawIndirect(list->vk_command_buffer, arg_impl->u.vk_buffer,
|
||||
arg_buffer_offset, max_command_count, signature_desc->ByteStride));
|
||||
if (count_buffer)
|
||||
{
|
||||
VK_CALL(vkCmdDrawIndirectCountKHR(list->vk_command_buffer, arg_impl->u.vk_buffer,
|
||||
arg_buffer_offset, count_impl->u.vk_buffer, count_buffer_offset,
|
||||
max_command_count, signature_desc->ByteStride));
|
||||
}
|
||||
else
|
||||
{
|
||||
VK_CALL(vkCmdDrawIndirect(list->vk_command_buffer, arg_impl->u.vk_buffer,
|
||||
arg_buffer_offset, max_command_count, signature_desc->ByteStride));
|
||||
}
|
||||
break;
|
||||
|
||||
case D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED:
|
||||
@ -4918,14 +4928,29 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(ID3D12GraphicsC
|
||||
|
||||
d3d12_command_list_check_index_buffer_strip_cut_value(list);
|
||||
|
||||
VK_CALL(vkCmdDrawIndexedIndirect(list->vk_command_buffer, arg_impl->u.vk_buffer,
|
||||
arg_buffer_offset, max_command_count, signature_desc->ByteStride));
|
||||
if (count_buffer)
|
||||
{
|
||||
VK_CALL(vkCmdDrawIndexedIndirectCountKHR(list->vk_command_buffer, arg_impl->u.vk_buffer,
|
||||
arg_buffer_offset, count_impl->u.vk_buffer, count_buffer_offset,
|
||||
max_command_count, signature_desc->ByteStride));
|
||||
}
|
||||
else
|
||||
{
|
||||
VK_CALL(vkCmdDrawIndexedIndirect(list->vk_command_buffer, arg_impl->u.vk_buffer,
|
||||
arg_buffer_offset, max_command_count, signature_desc->ByteStride));
|
||||
}
|
||||
break;
|
||||
|
||||
case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH:
|
||||
if (max_command_count != 1)
|
||||
FIXME("Ignoring command count %u.\n", max_command_count);
|
||||
|
||||
if (count_buffer)
|
||||
{
|
||||
FIXME("Count buffers not supported for indirect dispatch.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (list->state->vk_bind_point != VK_PIPELINE_BIND_POINT_COMPUTE)
|
||||
{
|
||||
WARN("Pipeline state %p has bind point %#x, ignoring dispatch.\n",
|
||||
|
Loading…
x
Reference in New Issue
Block a user