From a4f69d4ae69ef5f1e2018ff5465ee9a6cb0cf889 Mon Sep 17 00:00:00 2001 From: Elizabeth Figura Date: Tue, 5 Aug 2025 22:26:23 -0500 Subject: [PATCH] vkd3d-shader/d3dbc: Move TEXLD lowering to d3dbc_parse(). --- libs/vkd3d-shader/d3dbc.c | 5 +- libs/vkd3d-shader/hlsl_codegen.c | 12 ++++- libs/vkd3d-shader/ir.c | 66 +++++++++++++++++++----- libs/vkd3d-shader/vkd3d_shader_main.c | 7 --- libs/vkd3d-shader/vkd3d_shader_private.h | 2 + 5 files changed, 70 insertions(+), 22 deletions(-) diff --git a/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d-shader/d3dbc.c index dd13757bf..751e55782 100644 --- a/libs/vkd3d-shader/d3dbc.c +++ b/libs/vkd3d-shader/d3dbc.c @@ -1513,7 +1513,10 @@ int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t c return ret; } - return VKD3D_OK; + if (program->normalisation_level >= VSIR_NORMALISED_SM4) + ret = vsir_program_lower_d3dbc(program, config_flags, compile_info, message_context); + + return ret; } bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name, diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 168aa56ea..5be0ff301 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -9945,6 +9945,11 @@ static void sm1_generate_vsir(struct hlsl_ctx *ctx, const struct vkd3d_shader_co sm1_generate_vsir_block(ctx, body, program); program->ssa_count = ctx->ssa_count; + + if (ctx->result) + return; + if (program->normalisation_level >= VSIR_NORMALISED_SM4) + ctx->result = vsir_program_lower_d3dbc(program, config_flags, compile_info, ctx->message_context); } D3DXPARAMETER_CLASS hlsl_sm1_class(const struct hlsl_type *type) @@ -14271,6 +14276,7 @@ int hlsl_emit_vsir(struct hlsl_ctx *ctx, const struct vkd3d_shader_compile_info struct hlsl_block global_uniform_block, body, patch_body; uint32_t config_flags = vkd3d_shader_init_config_flags(); const struct hlsl_profile_info *profile = ctx->profile; + enum vsir_normalisation_level normalisation_level; struct list semantic_vars, patch_semantic_vars; struct vkd3d_shader_version version = {0}; struct hlsl_ir_var *var; @@ -14352,7 +14358,11 @@ int hlsl_emit_vsir(struct hlsl_ctx *ctx, const struct vkd3d_shader_compile_info version.major = ctx->profile->major_version; version.minor = ctx->profile->minor_version; version.type = ctx->profile->type; - if (!vsir_program_init(program, compile_info, &version, 0, VSIR_CF_STRUCTURED, VSIR_NORMALISED_SM4)) + normalisation_level = VSIR_NORMALISED_SM4; + if (version.major < 4 && (compile_info->target_type == VKD3D_SHADER_TARGET_D3D_ASM + || compile_info->target_type == VKD3D_SHADER_TARGET_D3D_BYTECODE)) + normalisation_level = VSIR_NORMALISED_SM1; + if (!vsir_program_init(program, compile_info, &version, 0, VSIR_CF_STRUCTURED, normalisation_level)) { ctx->result = VKD3D_ERROR_OUT_OF_MEMORY; return ctx->result; diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 29e4d2dc1..219747ca6 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -1605,6 +1605,39 @@ static enum vkd3d_result vsir_program_lower_dcl_output(struct vsir_program *prog return VKD3D_OK; } +static enum vkd3d_result vsir_program_lower_d3dbc_instructions(struct vsir_program *program, + struct vsir_transformation_context *ctx) +{ + struct vsir_program_iterator it = vsir_program_iterator(&program->instructions); + struct vkd3d_shader_message_context *message_context = ctx->message_context; + struct vkd3d_shader_instruction *ins; + unsigned int tmp_idx = ~0u; + + for (ins = vsir_program_iterator_head(&it); ins; ins = vsir_program_iterator_next(&it)) + { + enum vkd3d_result ret; + + switch (ins->opcode) + { + case VSIR_OP_TEXLD: + if (ins->flags == VKD3DSI_TEXLD_PROJECT) + ret = vsir_program_lower_texldp(program, &it, &tmp_idx); + else + ret = vsir_program_lower_texld(program, ins, message_context); + break; + + default: + ret = VKD3D_OK; + break; + } + + if (ret < 0) + return ret; + } + + return VKD3D_OK; +} + static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *program, struct vsir_transformation_context *ctx) { @@ -1688,19 +1721,6 @@ static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *pr } break; - case VSIR_OP_TEXLD: - if (ins->flags == VKD3DSI_TEXLD_PROJECT) - { - if ((ret = vsir_program_lower_texldp(program, &it, &tmp_idx)) < 0) - return ret; - } - else - { - if ((ret = vsir_program_lower_texld(program, ins, message_context)) < 0) - return ret; - } - break; - case VSIR_OP_TEXLDD: if ((ret = vsir_program_lower_texldd(program, ins)) < 0) return ret; @@ -12044,6 +12064,26 @@ enum vkd3d_result vsir_program_transform_early(struct vsir_program *program, uin return ctx.result; } +enum vkd3d_result vsir_program_lower_d3dbc(struct vsir_program *program, uint64_t config_flags, + const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context) +{ + struct vsir_transformation_context ctx = + { + .result = VKD3D_OK, + .program = program, + .config_flags = config_flags, + .compile_info = compile_info, + .message_context = message_context, + }; + + vsir_transform(&ctx, vsir_program_lower_d3dbc_instructions); + + if (TRACE_ON()) + vsir_program_trace(program); + + return ctx.result; +} + enum vkd3d_result vsir_program_transform(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context) { diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 17be72a52..343e2633a 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -1470,13 +1470,6 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte if (context->cf_info_count) context->cf_info[context->cf_info_count - 1].inside_block = false; break; - case VSIR_OP_TEXLD: - if (context->version->major == 1) - sampler_reg = &instruction->dst[0].reg; - else - sampler_reg = &instruction->src[1].reg; - vkd3d_shader_scan_combined_sampler_usage(context, sampler_reg, sampler_reg); - break; case VSIR_OP_TEX: case VSIR_OP_TEXBEM: case VSIR_OP_TEXBEML: diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 4be52de6b..9acc45b59 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1589,6 +1589,8 @@ const struct vkd3d_shader_parameter1 *vsir_program_get_parameter( bool vsir_program_init(struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_version *version, unsigned int reserve, enum vsir_control_flow_type cf_type, enum vsir_normalisation_level normalisation_level); +enum vkd3d_result vsir_program_lower_d3dbc(struct vsir_program *program, uint64_t config_flags, + const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context); enum vkd3d_result vsir_program_transform(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context); enum vkd3d_result vsir_program_transform_early(struct vsir_program *program, uint64_t config_flags,