vkd3d: Use index type LUT for DGC.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2022-07-08 17:46:24 +02:00
parent e17a7cb40c
commit f704cb9776
3 changed files with 8 additions and 20 deletions

View File

@ -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. */

View File

@ -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;
}
}

View File

@ -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);