From 37e8f42f4a71ce7227231d02ab99f8eb2ae1c168 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 7 Jul 2021 15:44:12 +0200 Subject: [PATCH] vkd3d: Move patch vertex count to meta struct. Will make it easier to implement for DXIL. Signed-off-by: Hans-Kristian Arntzen --- include/vkd3d_shader.h | 8 +--- libs/vkd3d-shader/dxil.c | 8 +--- libs/vkd3d-shader/vkd3d_shader_main.c | 53 ++++----------------------- libs/vkd3d/state.c | 9 ++--- 4 files changed, 14 insertions(+), 64 deletions(-) diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index 2e60e88f..63ff947b 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -58,6 +58,7 @@ struct vkd3d_shader_meta { vkd3d_shader_hash_t hash; unsigned int cs_workgroup_size[3]; /* Only contains valid data if uses_subgroup_size is true. */ + unsigned int patch_vertex_count; /* Relevant for HS. May be 0, in which case the patch vertex count is not known. */ bool replaced; bool uses_subgroup_size; }; @@ -624,6 +625,7 @@ struct vkd3d_shader_scan_info bool has_side_effects; bool needs_late_zs; bool discards; + unsigned int patch_vertex_count; }; enum vkd3d_component_type @@ -729,10 +731,6 @@ int vkd3d_shader_convert_root_signature(struct vkd3d_versioned_root_signature_de int vkd3d_shader_scan_dxbc(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_scan_info *scan_info); -/* If value cannot be determined, *patch_vertex_count returns 0. */ -int vkd3d_shader_scan_patch_vertex_count(const struct vkd3d_shader_code *dxbc, - unsigned int *patch_vertex_count); - int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_signature *signature); struct vkd3d_shader_signature_element *vkd3d_shader_find_signature_element( @@ -788,8 +786,6 @@ typedef int (*PFN_vkd3d_shader_convert_root_signature)(struct vkd3d_versioned_ro typedef int (*PFN_vkd3d_shader_scan_dxbc)(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_scan_info *scan_info); -typedef int (*PFN_vkd3d_shader_scan_patch_vertex_count)(const struct vkd3d_shader_code *dxbc, - unsigned int *patch_vertex_count); typedef int (*PFN_vkd3d_shader_parse_input_signature)(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_signature *signature); diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 06787239..9ca6fc08 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -494,11 +494,9 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc, dxil_spv_set_thread_log_callback(vkd3d_dxil_log_callback, NULL); + memset(&spirv->meta, 0, sizeof(spirv->meta)); hash = vkd3d_shader_hash(dxbc); - spirv->meta.replaced = false; spirv->meta.hash = hash; - spirv->meta.uses_subgroup_size = false; - memset(spirv->meta.cs_workgroup_size, 0, sizeof(spirv->meta.cs_workgroup_size)); if (vkd3d_shader_replace(hash, &spirv->code, &spirv->size)) { spirv->meta.replaced = true; @@ -827,11 +825,9 @@ int vkd3d_shader_compile_dxil_export(const struct vkd3d_shader_code *dxil, dxil_spv_set_thread_log_callback(vkd3d_dxil_log_callback, NULL); + memset(&spirv->meta, 0, sizeof(spirv->meta)); hash = vkd3d_shader_hash(dxil); - spirv->meta.replaced = false; - spirv->meta.uses_subgroup_size = false; spirv->meta.hash = hash; - memset(spirv->meta.cs_workgroup_size, 0, sizeof(spirv->meta.cs_workgroup_size)); demangled_export = vkd3d_dup_demangled_entry_point_ascii(export); if (demangled_export) { diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 01293303..2d8c07fb 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -343,11 +343,10 @@ int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_code *dxbc, return vkd3d_shader_compile_dxil(dxbc, spirv, shader_interface_info, compile_args); } + memset(&spirv->meta, 0, sizeof(spirv->meta)); + hash = vkd3d_shader_hash(dxbc); - spirv->meta.replaced = false; - spirv->meta.uses_subgroup_size = false; spirv->meta.hash = hash; - memset(spirv->meta.cs_workgroup_size, 0, sizeof(spirv->meta.cs_workgroup_size)); if (vkd3d_shader_replace(hash, &spirv->code, &spirv->size)) { spirv->meta.replaced = true; @@ -362,6 +361,8 @@ int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_code *dxbc, return ret; } + spirv->meta.patch_vertex_count = scan_info.patch_vertex_count; + if ((ret = vkd3d_shader_parser_init(&parser, dxbc)) < 0) { vkd3d_shader_scan_destroy(&scan_info); @@ -523,6 +524,9 @@ static void vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_info *scan_in if (instruction->flags & VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL) scan_info->early_fragment_tests = true; break; + case VKD3DSIH_DCL_INPUT_CONTROL_POINT_COUNT: + scan_info->patch_vertex_count = instruction->declaration.count; + break; default: break; } @@ -558,49 +562,6 @@ static void vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_info *scan_in vkd3d_shader_scan_record_uav_counter(scan_info, &instruction->src[0].reg); } -int vkd3d_shader_scan_patch_vertex_count(const struct vkd3d_shader_code *dxbc, - unsigned int *patch_vertex_count) -{ - struct vkd3d_shader_instruction instruction; - struct vkd3d_shader_parser parser; - int ret; - - if (shader_is_dxil(dxbc->code, dxbc->size)) - { - /* TODO */ - *patch_vertex_count = 0; - return VKD3D_OK; - } - else - { - if ((ret = vkd3d_shader_parser_init(&parser, dxbc)) < 0) - return ret; - - *patch_vertex_count = 0; - - while (!shader_sm4_is_end(parser.data, &parser.ptr)) - { - shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction); - - if (instruction.handler_idx == VKD3DSIH_INVALID) - { - WARN("Encountered unrecognized or invalid instruction.\n"); - vkd3d_shader_parser_destroy(&parser); - return VKD3D_ERROR_INVALID_ARGUMENT; - } - - if (instruction.handler_idx == VKD3DSIH_DCL_INPUT_CONTROL_POINT_COUNT) - { - *patch_vertex_count = instruction.declaration.count; - break; - } - } - - vkd3d_shader_parser_destroy(&parser); - return VKD3D_OK; - } -} - int vkd3d_shader_scan_dxbc(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_scan_info *scan_info) { diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 25ba5a58..cd7661a1 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -3210,12 +3210,6 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s break; case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: - if ((ret = vkd3d_shader_scan_patch_vertex_count(&dxbc, &graphics->patch_vertex_count)) < 0) - { - hr = hresult_from_vkd3d_result(ret); - goto fail; - } - /* fallthrough */ case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: if (desc->primitive_topology_type != D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH) { @@ -3242,6 +3236,9 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s &graphics->stage_meta[graphics->stage_count]))) goto fail; + if (shader_stages[i].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) + graphics->patch_vertex_count = graphics->stage_meta[graphics->stage_count].patch_vertex_count; + if (graphics->stage_meta[graphics->stage_count].replaced && device->debug_ring.active) { vkd3d_shader_debug_ring_init_spec_constant(device,