From f704cb97764b049f9e49658a1c7b914234878c48 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 8 Jul 2022 17:46:24 +0200 Subject: [PATCH] vkd3d: Use index type LUT for DGC. Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/command.c | 12 ++++++++---- libs/vkd3d/shaders/cs_execute_indirect_patch.comp | 9 --------- .../cs_execute_indirect_patch_debug_ring.comp | 7 ------- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index d9c3c48b..5bc6e896 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -9703,15 +9703,13 @@ static void d3d12_command_list_execute_indirect_state_template( /* - Stride can mismatch, i.e. we need internal alignment of arguments. * - Min required alignment on the indirect buffer itself might be too strict. * - Min required alignment on count buffer might be too strict. - * - We require debugging. - * - Temporary: IBO type rewrite is required. TODO: Use index type LUT feature. */ + * - We require debugging. */ props = &list->device->device_info.device_generated_commands_properties_nv; if ((signature->state_template.stride != signature->desc.ByteStride && max_command_count > 1) || (arg_buffer_offset & (props->minIndirectCommandsBufferOffsetAlignment - 1)) || (count_buffer && (count_buffer_offset & (props->minSequencesCountBufferOffsetAlignment - 1))) || - patch_args.debug_tag || - require_ibo_update) + patch_args.debug_tag) { require_patch = true; } @@ -13041,6 +13039,9 @@ static HRESULT d3d12_command_signature_init_state_template(struct d3d12_command_ VKD3D_PATCH_COMMAND_TOKEN_COPY_ROOT_VA_HI, }; + static const VkIndexType vk_index_types[] = { VK_INDEX_TYPE_UINT32, VK_INDEX_TYPE_UINT16 }; + static const uint32_t d3d_index_types[] = { DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R16_UINT }; + if (!device->device_info.device_generated_commands_features_nv.deviceGeneratedCommands) { WARN("Device generated commands not supported, indirect state commands will be ignored.\n"); @@ -13131,6 +13132,9 @@ static HRESULT d3d12_command_signature_init_state_template(struct d3d12_command_ case D3D12_INDIRECT_ARGUMENT_TYPE_INDEX_BUFFER_VIEW: token.tokenType = VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV; + token.indexTypeCount = ARRAY_SIZE(vk_index_types); + token.pIndexTypeValues = d3d_index_types; + token.pIndexTypes = vk_index_types; /* If device exposes 4 byte alignment of the indirect command buffer, we can * pack VA at sub-scalar alignment. */ diff --git a/libs/vkd3d/shaders/cs_execute_indirect_patch.comp b/libs/vkd3d/shaders/cs_execute_indirect_patch.comp index c2522910..46455009 100644 --- a/libs/vkd3d/shaders/cs_execute_indirect_patch.comp +++ b/libs/vkd3d/shaders/cs_execute_indirect_patch.comp @@ -11,11 +11,6 @@ struct Command uint dst_offset; }; -const int COMMAND_TYPE_COPY_INDEX_TYPE = 4; -const int DXGI_FORMAT_R32_UINT = 0x2a; -const int VK_INDEX_TYPE_UINT16 = 0; -const int VK_INDEX_TYPE_UINT32 = 1; - layout(buffer_reference, std430, buffer_reference_align = 4) readonly buffer Commands { Command commands[]; @@ -66,11 +61,7 @@ void main() { uint src_offset = src_stride * draw_id + cmd.src_offset; uint dst_offset = dst_stride * draw_id + cmd.dst_offset; - uint src_value = src_buffer_va.values[src_offset]; - if (cmd.type == COMMAND_TYPE_COPY_INDEX_TYPE) - src_value = src_value == DXGI_FORMAT_R32_UINT ? VK_INDEX_TYPE_UINT32 : VK_INDEX_TYPE_UINT16; - dst_buffer_va.values[dst_offset] = src_value; } } diff --git a/libs/vkd3d/shaders/cs_execute_indirect_patch_debug_ring.comp b/libs/vkd3d/shaders/cs_execute_indirect_patch_debug_ring.comp index 6a63a445..33e245a6 100644 --- a/libs/vkd3d/shaders/cs_execute_indirect_patch_debug_ring.comp +++ b/libs/vkd3d/shaders/cs_execute_indirect_patch_debug_ring.comp @@ -13,11 +13,6 @@ struct Command uint dst_offset; }; -const int COMMAND_TYPE_COPY_INDEX_TYPE = 4; -const int DXGI_FORMAT_R32_UINT = 0x2a; -const int VK_INDEX_TYPE_UINT16 = 0; -const int VK_INDEX_TYPE_UINT32 = 1; - layout(buffer_reference, std430, buffer_reference_align = 4) readonly buffer Commands { Command commands[]; @@ -79,8 +74,6 @@ void main() uint dst_offset = dst_stride * draw_id + cmd.dst_offset; uint src_value = src_buffer_va.values[src_offset]; - if (cmd.type == COMMAND_TYPE_COPY_INDEX_TYPE) - src_value = src_value == DXGI_FORMAT_R32_UINT ? VK_INDEX_TYPE_UINT32 : VK_INDEX_TYPE_UINT16; if (debug_tag != 0u) DEBUG_CHANNEL_MSG(cmd.type, dst_offset, src_offset, src_value);