Skip to content

Commit

Permalink
vkd3d: Implement ExecuteIndirect tier 1.1.
Browse files Browse the repository at this point in the history
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
  • Loading branch information
HansKristian-Work committed Oct 17, 2024
1 parent 526dbfc commit 65b8140
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 14 deletions.
59 changes: 47 additions & 12 deletions libs/vkd3d/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -13992,6 +13992,16 @@ static void d3d12_command_list_execute_indirect_state_template_dgc(
break;
}

case D3D12_INDIRECT_ARGUMENT_TYPE_INCREMENTING_CONSTANT:
{
uint32_t zero = 0;
d3d12_command_list_set_root_constants(list,
bindings, arg->IncrementingConstant.RootParameterIndex,
arg->IncrementingConstant.DestOffsetIn32BitValues,
1, &zero);
break;
}

default:
break;
}
Expand Down Expand Up @@ -20351,6 +20361,7 @@ static HRESULT d3d12_command_signature_init_state_template_dgc_ext(struct d3d12_
switch (argument_desc->Type)
{
case D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT:
case D3D12_INDIRECT_ARGUMENT_TYPE_INCREMENTING_CONSTANT:
root_parameter_index = argument_desc->Constant.RootParameterIndex;
root_constant = root_signature_get_32bit_constants(root_signature, root_parameter_index);

Expand All @@ -20361,7 +20372,6 @@ static HRESULT d3d12_command_signature_init_state_template_dgc_ext(struct d3d12_
goto end;
}

token.type = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT;
assert(pc_token_count < ARRAY_SIZE(signature->state_template.dgc.pc_tokens));
pc_token = &signature->state_template.dgc.pc_tokens[pc_token_count++];
token.data.pPushConstant = pc_token;
Expand All @@ -20370,14 +20380,28 @@ static HRESULT d3d12_command_signature_init_state_template_dgc_ext(struct d3d12_
pc_token->updateRange.size = argument_desc->Constant.Num32BitValuesToSet;
pc_token->updateRange.offset *= sizeof(uint32_t);
pc_token->updateRange.size *= sizeof(uint32_t);
required_alignment = sizeof(uint32_t);

stream_stride = align(stream_stride, required_alignment);
token.offset = stream_stride;
stream_stride += pc_token->updateRange.size;
dst_word_offset = token.offset / sizeof(uint32_t);
if (argument_desc->Type == D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT)
{
token.type = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT;

required_alignment = sizeof(uint32_t);
stream_stride = align(stream_stride, required_alignment);
token.offset = stream_stride;
stream_stride += pc_token->updateRange.size;
dst_word_offset = token.offset / sizeof(uint32_t);

generic_u32_copy_count = argument_desc->Constant.Num32BitValuesToSet;
}
else
{
token.type = VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT;
token.offset = 0; /* ignored */
pc_token->updateRange.size = sizeof(uint32_t);

generic_u32_copy_count = 0;
}

generic_u32_copy_count = argument_desc->Constant.Num32BitValuesToSet;
generic_u32_copy_types = NULL;
break;

Expand Down Expand Up @@ -20544,13 +20568,19 @@ static HRESULT d3d12_command_signature_init_state_template_dgc_ext(struct d3d12_
stream_stride = max(stream_stride, desc->ByteStride);
stream_stride = align(stream_stride, required_stride_alignment);

if (FAILED(hr = d3d12_command_signature_init_patch_commands_buffer(signature, device, patch_commands, patch_commands_count)))
goto end;
if (patch_commands_count)
if (FAILED(hr = d3d12_command_signature_init_patch_commands_buffer(signature, device, patch_commands, patch_commands_count)))
goto end;

if (FAILED(hr = d3d12_command_signature_init_indirect_commands_layout_ext(signature, root_signature, device, tokens, token_count, stream_stride)))
goto end;
if (FAILED(hr = vkd3d_meta_get_execute_indirect_pipeline(&device->meta_ops, patch_commands_count,
&signature->state_template.dgc.pipeline)))
goto end;

if (patch_commands_count)
{
if (FAILED(hr = vkd3d_meta_get_execute_indirect_pipeline(&device->meta_ops, patch_commands_count,
&signature->state_template.dgc.pipeline)))
goto end;
}

end:
vkd3d_free(tokens);
Expand Down Expand Up @@ -20623,6 +20653,11 @@ HRESULT d3d12_command_signature_create(struct d3d12_device *device, struct d3d12
signature_size += argument_desc->Constant.Num32BitValuesToSet * sizeof(uint32_t);
break;

case D3D12_INDIRECT_ARGUMENT_TYPE_INCREMENTING_CONSTANT:
requires_root_signature = true;
requires_state_template = true;
break;

case D3D12_INDIRECT_ARGUMENT_TYPE_SHADER_RESOURCE_VIEW:
case D3D12_INDIRECT_ARGUMENT_TYPE_UNORDERED_ACCESS_VIEW:
case D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT_BUFFER_VIEW:
Expand Down
4 changes: 2 additions & 2 deletions libs/vkd3d/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -8189,8 +8189,8 @@ static void d3d12_device_caps_init_feature_options21(struct d3d12_device *device
D3D12_FEATURE_DATA_D3D12_OPTIONS21 *options21 = &device->d3d12_caps.options21;

options21->WorkGraphsTier = D3D12_WORK_GRAPHS_TIER_NOT_SUPPORTED;
/* Tier 1_1 requires emulating DrawID */
options21->ExecuteIndirectTier = D3D12_EXECUTE_INDIRECT_TIER_1_0;
options21->ExecuteIndirectTier = device->device_info.device_generated_commands_features_ext.deviceGeneratedCommands ?
D3D12_EXECUTE_INDIRECT_TIER_1_1 : D3D12_EXECUTE_INDIRECT_TIER_1_0;
options21->SampleCmpGradientAndBiasSupported = device->d3d12_caps.max_shader_model >= D3D_SHADER_MODEL_6_8 &&
device->d3d12_caps.options14.AdvancedTextureOpsSupported;
options21->ExtendedCommandInfoSupported = device->d3d12_caps.max_shader_model >= D3D_SHADER_MODEL_6_8;
Expand Down

0 comments on commit 65b8140

Please sign in to comment.