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 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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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:
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user