vkd3d-shader/d3dbc: Move TEXLD lowering to d3dbc_parse().

This commit is contained in:
Elizabeth Figura
2025-08-05 22:26:23 -05:00
committed by Henri Verbeet
parent 2201c32e6d
commit a4f69d4ae6
Notes: Henri Verbeet 2025-08-07 20:51:20 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1670
5 changed files with 70 additions and 22 deletions

View File

@@ -1513,7 +1513,10 @@ int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t c
return ret; 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, bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name,

View File

@@ -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); sm1_generate_vsir_block(ctx, body, program);
program->ssa_count = ctx->ssa_count; 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) 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; struct hlsl_block global_uniform_block, body, patch_body;
uint32_t config_flags = vkd3d_shader_init_config_flags(); uint32_t config_flags = vkd3d_shader_init_config_flags();
const struct hlsl_profile_info *profile = ctx->profile; const struct hlsl_profile_info *profile = ctx->profile;
enum vsir_normalisation_level normalisation_level;
struct list semantic_vars, patch_semantic_vars; struct list semantic_vars, patch_semantic_vars;
struct vkd3d_shader_version version = {0}; struct vkd3d_shader_version version = {0};
struct hlsl_ir_var *var; 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.major = ctx->profile->major_version;
version.minor = ctx->profile->minor_version; version.minor = ctx->profile->minor_version;
version.type = ctx->profile->type; 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; ctx->result = VKD3D_ERROR_OUT_OF_MEMORY;
return ctx->result; return ctx->result;

View File

@@ -1605,6 +1605,39 @@ static enum vkd3d_result vsir_program_lower_dcl_output(struct vsir_program *prog
return VKD3D_OK; 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, static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *program,
struct vsir_transformation_context *ctx) struct vsir_transformation_context *ctx)
{ {
@@ -1688,19 +1721,6 @@ static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *pr
} }
break; 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: case VSIR_OP_TEXLDD:
if ((ret = vsir_program_lower_texldd(program, ins)) < 0) if ((ret = vsir_program_lower_texldd(program, ins)) < 0)
return ret; return ret;
@@ -12044,6 +12064,26 @@ enum vkd3d_result vsir_program_transform_early(struct vsir_program *program, uin
return ctx.result; 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, 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) const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
{ {

View File

@@ -1470,13 +1470,6 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte
if (context->cf_info_count) if (context->cf_info_count)
context->cf_info[context->cf_info_count - 1].inside_block = false; context->cf_info[context->cf_info_count - 1].inside_block = false;
break; 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_TEX:
case VSIR_OP_TEXBEM: case VSIR_OP_TEXBEM:
case VSIR_OP_TEXBEML: case VSIR_OP_TEXBEML:

View File

@@ -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, 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, const struct vkd3d_shader_version *version, unsigned int reserve, enum vsir_control_flow_type cf_type,
enum vsir_normalisation_level normalisation_level); 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, 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); 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, enum vkd3d_result vsir_program_transform_early(struct vsir_program *program, uint64_t config_flags,