mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d: Implement D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED.
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:
committed by
Alexandre Julliard
parent
a1ad45be69
commit
6851bc6667
@@ -2251,6 +2251,34 @@ static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void d3d12_command_list_check_index_buffer_strip_cut_value(struct d3d12_command_list *list)
|
||||||
|
{
|
||||||
|
struct d3d12_graphics_pipeline_state *graphics = &list->state->u.graphics;
|
||||||
|
|
||||||
|
/* In Vulkan, the strip cut value is derived from the index buffer format. */
|
||||||
|
switch (graphics->index_buffer_strip_cut_value)
|
||||||
|
{
|
||||||
|
case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF:
|
||||||
|
if (list->index_buffer_format != DXGI_FORMAT_R16_UINT)
|
||||||
|
{
|
||||||
|
FIXME("Strip cut value 0xffff is not supported with index buffer format %#x.\n",
|
||||||
|
list->index_buffer_format);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFFFFFF:
|
||||||
|
if (list->index_buffer_format != DXGI_FORMAT_R32_UINT)
|
||||||
|
{
|
||||||
|
FIXME("Strip cut value 0xffffffff is not supported with index buffer format %#x.\n",
|
||||||
|
list->index_buffer_format);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void STDMETHODCALLTYPE d3d12_command_list_DrawInstanced(ID3D12GraphicsCommandList *iface,
|
static void STDMETHODCALLTYPE d3d12_command_list_DrawInstanced(ID3D12GraphicsCommandList *iface,
|
||||||
UINT vertex_count_per_instance, UINT instance_count, UINT start_vertex_location,
|
UINT vertex_count_per_instance, UINT instance_count, UINT start_vertex_location,
|
||||||
UINT start_instance_location)
|
UINT start_instance_location)
|
||||||
@@ -2287,27 +2315,15 @@ static void STDMETHODCALLTYPE d3d12_command_list_DrawIndexedInstanced(ID3D12Grap
|
|||||||
iface, index_count_per_instance, instance_count, start_vertex_location,
|
iface, index_count_per_instance, instance_count, start_vertex_location,
|
||||||
base_vertex_location, start_instance_location);
|
base_vertex_location, start_instance_location);
|
||||||
|
|
||||||
vk_procs = &list->device->vk_procs;
|
|
||||||
|
|
||||||
if (!d3d12_command_list_begin_render_pass(list))
|
if (!d3d12_command_list_begin_render_pass(list))
|
||||||
{
|
{
|
||||||
WARN("Failed to begin render pass, ignoring draw call.\n");
|
WARN("Failed to begin render pass, ignoring draw call.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (list->state->u.graphics.index_buffer_strip_cut_value)
|
vk_procs = &list->device->vk_procs;
|
||||||
{
|
|
||||||
case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF:
|
d3d12_command_list_check_index_buffer_strip_cut_value(list);
|
||||||
if (list->index_buffer_format != DXGI_FORMAT_R16_UINT)
|
|
||||||
FIXME("Strip cut value 0xffff is not supported with index buffer format %#x.\n", list->index_buffer_format);
|
|
||||||
break;
|
|
||||||
case D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFFFFFF:
|
|
||||||
if (list->index_buffer_format != DXGI_FORMAT_R32_UINT)
|
|
||||||
FIXME("Strip cut value 0xffffffff is not supported with index buffer format %#x.\n", list->index_buffer_format);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
VK_CALL(vkCmdDrawIndexed(list->vk_command_buffer, index_count_per_instance,
|
VK_CALL(vkCmdDrawIndexed(list->vk_command_buffer, index_count_per_instance,
|
||||||
instance_count, start_vertex_location, base_vertex_location, start_instance_location));
|
instance_count, start_vertex_location, base_vertex_location, start_instance_location));
|
||||||
@@ -4113,6 +4129,19 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(ID3D12GraphicsC
|
|||||||
arg_buffer_offset, max_command_count, signature_desc->ByteStride));
|
arg_buffer_offset, max_command_count, signature_desc->ByteStride));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED:
|
||||||
|
if (!d3d12_command_list_begin_render_pass(list))
|
||||||
|
{
|
||||||
|
WARN("Failed to begin render pass, ignoring draw.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
break;
|
||||||
|
|
||||||
case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH:
|
case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH:
|
||||||
if (max_command_count != 1)
|
if (max_command_count != 1)
|
||||||
FIXME("Ignoring command count %u.\n", max_command_count);
|
FIXME("Ignoring command count %u.\n", max_command_count);
|
||||||
|
|||||||
Reference in New Issue
Block a user