diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index 801de6a5..828a94d7 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -64,7 +64,6 @@ struct vkd3d_glsl_generator const struct vkd3d_shader_interface_info *interface_info; const struct vkd3d_shader_descriptor_offset_info *offset_info; - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info; const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info; }; @@ -130,7 +129,7 @@ static const struct glsl_resource_type_info *shader_glsl_get_resource_type_info( static const struct vkd3d_shader_descriptor_info1 *shader_glsl_get_descriptor(struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int idx, unsigned int space) { - const struct vkd3d_shader_scan_descriptor_info1 *info = gen->descriptor_info; + const struct vkd3d_shader_scan_descriptor_info1 *info = &gen->program->descriptors; for (unsigned int i = 0; i < info->descriptor_count; ++i) { @@ -146,7 +145,7 @@ static const struct vkd3d_shader_descriptor_info1 *shader_glsl_get_descriptor(st static const struct vkd3d_shader_descriptor_info1 *shader_glsl_get_descriptor_by_id( struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int id) { - const struct vkd3d_shader_scan_descriptor_info1 *info = gen->descriptor_info; + const struct vkd3d_shader_scan_descriptor_info1 *info = &gen->program->descriptors; for (unsigned int i = 0; i < info->descriptor_count; ++i) { @@ -2080,7 +2079,7 @@ static void shader_glsl_generate_sampler_declaration(struct vkd3d_glsl_generator static void shader_glsl_generate_descriptor_declarations(struct vkd3d_glsl_generator *gen) { const struct vkd3d_shader_scan_combined_resource_sampler_info *sampler_info = gen->combined_sampler_info; - const struct vkd3d_shader_scan_descriptor_info1 *info = gen->descriptor_info; + const struct vkd3d_shader_scan_descriptor_info1 *info = &gen->program->descriptors; const struct vkd3d_shader_descriptor_info1 *descriptor; unsigned int i; @@ -2431,7 +2430,6 @@ static void shader_glsl_init_limits(struct vkd3d_glsl_generator *gen, const stru static void vkd3d_glsl_generator_init(struct vkd3d_glsl_generator *gen, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, struct vkd3d_shader_message_context *message_context) { @@ -2455,12 +2453,10 @@ static void vkd3d_glsl_generator_init(struct vkd3d_glsl_generator *gen, gen->interface_info = vkd3d_find_struct(compile_info->next, INTERFACE_INFO); gen->offset_info = vkd3d_find_struct(compile_info->next, DESCRIPTOR_OFFSET_INFO); - gen->descriptor_info = descriptor_info; gen->combined_sampler_info = combined_sampler_info; } int glsl_compile(struct vsir_program *program, uint64_t config_flags, - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context) @@ -2474,7 +2470,7 @@ int glsl_compile(struct vsir_program *program, uint64_t config_flags, VKD3D_ASSERT(program->normalisation_level == VSIR_NORMALISED_SM6); vkd3d_glsl_generator_init(&generator, program, compile_info, - descriptor_info, combined_sampler_info, message_context); + combined_sampler_info, message_context); ret = vkd3d_glsl_generator_generate(&generator, out); vkd3d_glsl_generator_cleanup(&generator); diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 2e3040f0..3a784c71 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -116,6 +116,7 @@ void vsir_program_cleanup(struct vsir_program *program) shader_signature_cleanup(&program->input_signature); shader_signature_cleanup(&program->output_signature); shader_signature_cleanup(&program->patch_constant_signature); + vkd3d_shader_free_scan_descriptor_info1(&program->descriptors); } const struct vkd3d_shader_parameter1 *vsir_program_get_parameter( diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index e783128e..756b4329 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -44,7 +44,6 @@ struct msl_generator bool write_depth; const struct vkd3d_shader_interface_info *interface_info; - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info; }; static void VKD3D_PRINTF_FUNC(3, 4) msl_compiler_error(struct msl_generator *gen, @@ -821,7 +820,7 @@ static void msl_generate_cbv_declaration(struct msl_generator *gen, static void msl_generate_descriptor_struct_declarations(struct msl_generator *gen) { - const struct vkd3d_shader_scan_descriptor_info1 *info = gen->descriptor_info; + const struct vkd3d_shader_scan_descriptor_info1 *info = &gen->program->descriptors; const struct vkd3d_shader_descriptor_info1 *descriptor; struct vkd3d_string_buffer *buffer = gen->buffer; unsigned int i; @@ -1171,7 +1170,7 @@ static void msl_generate_entrypoint(struct msl_generator *gen) vkd3d_string_buffer_printf(gen->buffer, "vkd3d_%s_out shader_entry(\n", gen->prefix); - if (gen->descriptor_info->descriptor_count) + if (gen->program->descriptors.descriptor_count) { msl_print_indent(gen->buffer, 2); /* TODO: Configurable argument buffer binding location. */ @@ -1195,7 +1194,7 @@ static void msl_generate_entrypoint(struct msl_generator *gen) vkd3d_string_buffer_printf(gen->buffer, " %s_main(%s_in, %s_out", gen->prefix, gen->prefix, gen->prefix); if (gen->write_depth) vkd3d_string_buffer_printf(gen->buffer, ", shader_out_depth"); - if (gen->descriptor_info->descriptor_count) + if (gen->program->descriptors.descriptor_count) vkd3d_string_buffer_printf(gen->buffer, ", descriptors"); vkd3d_string_buffer_printf(gen->buffer, ");\n"); @@ -1234,7 +1233,7 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader gen->prefix); if (gen->write_depth) vkd3d_string_buffer_printf(gen->buffer, ", thread float& o_depth"); - if (gen->descriptor_info->descriptor_count) + if (gen->program->descriptors.descriptor_count) vkd3d_string_buffer_printf(gen->buffer, ", constant vkd3d_%s_descriptors& descriptors", gen->prefix); vkd3d_string_buffer_printf(gen->buffer, ")\n{\n"); @@ -1276,7 +1275,6 @@ static void msl_generator_cleanup(struct msl_generator *gen) static int msl_generator_init(struct msl_generator *gen, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, struct vkd3d_shader_message_context *message_context) { enum vkd3d_shader_type type = program->shader_version.type; @@ -1297,13 +1295,11 @@ static int msl_generator_init(struct msl_generator *gen, struct vsir_program *pr return VKD3D_ERROR_INVALID_SHADER; } gen->interface_info = vkd3d_find_struct(compile_info->next, INTERFACE_INFO); - gen->descriptor_info = descriptor_info; return VKD3D_OK; } int msl_compile(struct vsir_program *program, uint64_t config_flags, - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context) { @@ -1315,7 +1311,7 @@ int msl_compile(struct vsir_program *program, uint64_t config_flags, VKD3D_ASSERT(program->normalisation_level == VSIR_NORMALISED_SM6); - if ((ret = msl_generator_init(&generator, program, compile_info, descriptor_info, message_context)) < 0) + if ((ret = msl_generator_init(&generator, program, compile_info, message_context)) < 0) return ret; ret = msl_generator_generate(&generator, out); msl_generator_cleanup(&generator); diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 008af238..aca20f4f 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -3105,7 +3105,6 @@ struct spirv_compiler uint32_t binding_idx; - const struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info; unsigned int input_control_point_count; unsigned int output_control_point_count; @@ -3191,7 +3190,6 @@ static void spirv_compiler_destroy(struct spirv_compiler *compiler) static struct spirv_compiler *spirv_compiler_create(const struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, - const struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info, struct vkd3d_shader_message_context *message_context, uint64_t config_flags) { const struct vkd3d_shader_interface_info *shader_interface; @@ -3334,8 +3332,6 @@ static struct spirv_compiler *spirv_compiler_create(const struct vsir_program *p else if (compiler->shader_type != VKD3D_SHADER_TYPE_GEOMETRY) compiler->emit_point_size = compiler->xfb_info && compiler->xfb_info->element_count; - compiler->scan_descriptor_info = scan_descriptor_info; - compiler->phase = VKD3DSIH_INVALID; vkd3d_string_buffer_cache_init(&compiler->string_buffers); @@ -6732,7 +6728,7 @@ static const struct vkd3d_shader_descriptor_info1 *spirv_compiler_get_descriptor struct spirv_compiler *compiler, enum vkd3d_shader_descriptor_type type, const struct vkd3d_shader_register_range *range) { - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info = compiler->scan_descriptor_info; + const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info = &compiler->program->descriptors; unsigned int register_last = (range->last == ~0u) ? range->first : range->last; const struct vkd3d_shader_descriptor_info1 *d; unsigned int i; @@ -11159,11 +11155,12 @@ static void spirv_compiler_emit_io_declarations(struct spirv_compiler *compiler) static void spirv_compiler_emit_descriptor_declarations(struct spirv_compiler *compiler) { + const struct vkd3d_shader_scan_descriptor_info1 *descriptors = &compiler->program->descriptors; unsigned int i; - for (i = 0; i < compiler->scan_descriptor_info->descriptor_count; ++i) + for (i = 0; i < descriptors->descriptor_count; ++i) { - const struct vkd3d_shader_descriptor_info1 *descriptor = &compiler->scan_descriptor_info->descriptors[i]; + const struct vkd3d_shader_descriptor_info1 *descriptor = &descriptors->descriptors[i]; struct vkd3d_shader_register_range range; range.first = descriptor->register_index; @@ -11354,7 +11351,6 @@ static int spirv_compiler_generate_spirv(struct spirv_compiler *compiler, } int spirv_compile(struct vsir_program *program, uint64_t config_flags, - const struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context) { @@ -11367,7 +11363,7 @@ int spirv_compile(struct vsir_program *program, uint64_t config_flags, VKD3D_ASSERT(program->normalisation_level == VSIR_NORMALISED_SM6); if (!(spirv_compiler = spirv_compiler_create(program, compile_info, - scan_descriptor_info, message_context, config_flags))) + message_context, config_flags))) { ERR("Failed to create SPIR-V compiler.\n"); return VKD3D_ERROR; diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index fdc60291..84f0498f 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -1569,7 +1569,7 @@ static enum vkd3d_result convert_descriptor_info(struct vkd3d_shader_scan_descri return VKD3D_OK; } -static void vkd3d_shader_free_scan_descriptor_info1(struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info) +void vkd3d_shader_free_scan_descriptor_info1(struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info) { TRACE("scan_descriptor_info %p.\n", scan_descriptor_info); @@ -1577,12 +1577,10 @@ static void vkd3d_shader_free_scan_descriptor_info1(struct vkd3d_shader_scan_des } static int vsir_program_scan(struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, - struct vkd3d_shader_message_context *message_context, - struct vkd3d_shader_scan_descriptor_info1 *descriptor_info1) + struct vkd3d_shader_message_context *message_context, bool add_descriptor_info) { struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info; struct vkd3d_shader_scan_hull_shader_tessellation_info *tessellation_info; - struct vkd3d_shader_scan_descriptor_info1 local_descriptor_info1 = {0}; struct vkd3d_shader_scan_descriptor_info *descriptor_info; struct vkd3d_shader_scan_signature_info *signature_info; struct vkd3d_shader_instruction *instruction; @@ -1591,29 +1589,22 @@ static int vsir_program_scan(struct vsir_program *program, const struct vkd3d_sh unsigned int i; descriptor_info = vkd3d_find_struct(compile_info->next, SCAN_DESCRIPTOR_INFO); - if (descriptor_info1) - { - descriptor_info1->descriptors = NULL; - descriptor_info1->descriptor_count = 0; - } - else if (descriptor_info) - { - descriptor_info1 = &local_descriptor_info1; - } + if (descriptor_info) + add_descriptor_info = true; + signature_info = vkd3d_find_struct(compile_info->next, SCAN_SIGNATURE_INFO); if ((combined_sampler_info = vkd3d_find_struct(compile_info->next, SCAN_COMBINED_RESOURCE_SAMPLER_INFO))) { combined_sampler_info->combined_samplers = NULL; combined_sampler_info->combined_sampler_count = 0; - if (!descriptor_info1) - descriptor_info1 = &local_descriptor_info1; + add_descriptor_info = true; } tessellation_info = vkd3d_find_struct(compile_info->next, SCAN_HULL_SHADER_TESSELLATION_INFO); vkd3d_shader_scan_context_init(&context, &program->shader_version, compile_info, - descriptor_info1, combined_sampler_info, message_context); + add_descriptor_info ? &program->descriptors : NULL, combined_sampler_info, message_context); if (TRACE_ON()) vsir_program_trace(program); @@ -1653,7 +1644,7 @@ static int vsir_program_scan(struct vsir_program *program, const struct vkd3d_sh } if (!ret && descriptor_info) - ret = convert_descriptor_info(descriptor_info, descriptor_info1); + ret = convert_descriptor_info(descriptor_info, &program->descriptors); if (!ret && tessellation_info) { @@ -1667,15 +1658,10 @@ static int vsir_program_scan(struct vsir_program *program, const struct vkd3d_sh vkd3d_shader_free_scan_combined_resource_sampler_info(combined_sampler_info); if (descriptor_info) vkd3d_shader_free_scan_descriptor_info(descriptor_info); - if (descriptor_info1) - vkd3d_shader_free_scan_descriptor_info1(descriptor_info1); if (signature_info) vkd3d_shader_free_scan_signature_info(signature_info); } - else - { - vkd3d_shader_free_scan_descriptor_info1(&local_descriptor_info1); - } + vkd3d_shader_scan_context_cleanup(&context); return ret; } @@ -1713,7 +1699,7 @@ int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char if (!(ret = vsir_parse(compile_info, config_flags, &message_context, &program))) { - ret = vsir_program_scan(&program, compile_info, &message_context, NULL); + ret = vsir_program_scan(&program, compile_info, &message_context, false); vsir_program_cleanup(&program); } } @@ -1730,7 +1716,6 @@ int vsir_program_compile(struct vsir_program *program, uint64_t config_flags, struct vkd3d_shader_message_context *message_context) { struct vkd3d_shader_scan_combined_resource_sampler_info combined_sampler_info; - struct vkd3d_shader_scan_descriptor_info1 scan_descriptor_info; struct vkd3d_shader_compile_info scan_info; int ret; @@ -1746,28 +1731,24 @@ int vsir_program_compile(struct vsir_program *program, uint64_t config_flags, combined_sampler_info.type = VKD3D_SHADER_STRUCTURE_TYPE_SCAN_COMBINED_RESOURCE_SAMPLER_INFO; combined_sampler_info.next = scan_info.next; scan_info.next = &combined_sampler_info; - if ((ret = vsir_program_scan(program, &scan_info, message_context, &scan_descriptor_info)) < 0) + if ((ret = vsir_program_scan(program, &scan_info, message_context, true)) < 0) return ret; - ret = glsl_compile(program, config_flags, &scan_descriptor_info, + ret = glsl_compile(program, config_flags, &combined_sampler_info, compile_info, out, message_context); vkd3d_shader_free_scan_combined_resource_sampler_info(&combined_sampler_info); - vkd3d_shader_free_scan_descriptor_info1(&scan_descriptor_info); break; case VKD3D_SHADER_TARGET_SPIRV_BINARY: case VKD3D_SHADER_TARGET_SPIRV_TEXT: - if ((ret = vsir_program_scan(program, &scan_info, message_context, &scan_descriptor_info)) < 0) + if ((ret = vsir_program_scan(program, &scan_info, message_context, true)) < 0) return ret; - ret = spirv_compile(program, config_flags, &scan_descriptor_info, - compile_info, out, message_context); - vkd3d_shader_free_scan_descriptor_info1(&scan_descriptor_info); + ret = spirv_compile(program, config_flags, compile_info, out, message_context); break; case VKD3D_SHADER_TARGET_MSL: - if ((ret = vsir_program_scan(program, &scan_info, message_context, &scan_descriptor_info)) < 0) + if ((ret = vsir_program_scan(program, &scan_info, message_context, true)) < 0) return ret; - ret = msl_compile(program, config_flags, &scan_descriptor_info, compile_info, out, message_context); - vkd3d_shader_free_scan_descriptor_info1(&scan_descriptor_info); + ret = msl_compile(program, config_flags, compile_info, out, message_context); break; default: diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index b766b0e7..a45f3bef 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1422,6 +1422,30 @@ enum vsir_normalisation_level VSIR_NORMALISED_SM6, }; +struct vkd3d_shader_descriptor_info1 +{ + enum vkd3d_shader_descriptor_type type; + unsigned int register_space; + unsigned int register_index; + unsigned int register_id; + enum vkd3d_shader_resource_type resource_type; + enum vkd3d_shader_resource_data_type resource_data_type; + unsigned int flags; + unsigned int sample_count; + unsigned int buffer_size; + unsigned int structure_stride; + unsigned int count; + uint32_t uav_flags; +}; + +struct vkd3d_shader_scan_descriptor_info1 +{ + struct vkd3d_shader_descriptor_info1 *descriptors; + unsigned int descriptor_count; +}; + +void vkd3d_shader_free_scan_descriptor_info1(struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info); + struct vsir_program { struct vkd3d_shader_version shader_version; @@ -1431,6 +1455,8 @@ struct vsir_program struct shader_signature output_signature; struct shader_signature patch_constant_signature; + struct vkd3d_shader_scan_descriptor_info1 descriptors; + unsigned int parameter_count; const struct vkd3d_shader_parameter1 *parameters; bool free_parameters; @@ -1508,28 +1534,6 @@ void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser, struct vsir_pr void vkd3d_shader_parser_warning(struct vkd3d_shader_parser *parser, enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(3, 4); -struct vkd3d_shader_descriptor_info1 -{ - enum vkd3d_shader_descriptor_type type; - unsigned int register_space; - unsigned int register_index; - unsigned int register_id; - enum vkd3d_shader_resource_type resource_type; - enum vkd3d_shader_resource_data_type resource_data_type; - unsigned int flags; - unsigned int sample_count; - unsigned int buffer_size; - unsigned int structure_stride; - unsigned int count; - uint32_t uav_flags; -}; - -struct vkd3d_shader_scan_descriptor_info1 -{ - struct vkd3d_shader_descriptor_info1 *descriptors; - unsigned int descriptor_count; -}; - void vsir_program_trace(const struct vsir_program *program); const char *shader_get_type_prefix(enum vkd3d_shader_type type); @@ -1673,7 +1677,6 @@ int d3dbc_compile(struct vsir_program *program, uint64_t config_flags, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context); int glsl_compile(struct vsir_program *program, uint64_t config_flags, - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context); @@ -1681,12 +1684,10 @@ int glsl_compile(struct vsir_program *program, uint64_t config_flags, #define SPIRV_MAX_SRC_COUNT 6 int spirv_compile(struct vsir_program *program, uint64_t config_flags, - const struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context); int msl_compile(struct vsir_program *program, uint64_t config_flags, - const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context);