mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/d3dbc: Move TEXLD lowering to d3dbc_parse().
This commit is contained in:
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
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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:
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user