mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/hlsl: Store the function body directly in the hlsl_ir_function_decl structure.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
423213fb05
commit
8485a7c450
@ -685,6 +685,7 @@ struct hlsl_ir_function_decl *hlsl_new_func_decl(struct hlsl_ctx *ctx, struct hl
|
|||||||
|
|
||||||
if (!(decl = hlsl_alloc(ctx, sizeof(*decl))))
|
if (!(decl = hlsl_alloc(ctx, sizeof(*decl))))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
list_init(&decl->body);
|
||||||
decl->return_type = return_type;
|
decl->return_type = return_type;
|
||||||
decl->parameters = parameters;
|
decl->parameters = parameters;
|
||||||
decl->loc = loc;
|
decl->loc = loc;
|
||||||
@ -1340,8 +1341,8 @@ void hlsl_dump_function(struct hlsl_ctx *ctx, const struct hlsl_ir_function_decl
|
|||||||
dump_ir_var(ctx, &buffer, param);
|
dump_ir_var(ctx, &buffer, param);
|
||||||
vkd3d_string_buffer_printf(&buffer, "\n");
|
vkd3d_string_buffer_printf(&buffer, "\n");
|
||||||
}
|
}
|
||||||
if (func->body)
|
if (func->has_body)
|
||||||
dump_instr_list(ctx, &buffer, func->body);
|
dump_instr_list(ctx, &buffer, &func->body);
|
||||||
|
|
||||||
vkd3d_string_buffer_trace(&buffer);
|
vkd3d_string_buffer_trace(&buffer);
|
||||||
vkd3d_string_buffer_cleanup(&buffer);
|
vkd3d_string_buffer_cleanup(&buffer);
|
||||||
@ -1482,8 +1483,7 @@ void hlsl_free_instr(struct hlsl_ir_node *node)
|
|||||||
static void free_function_decl(struct hlsl_ir_function_decl *decl)
|
static void free_function_decl(struct hlsl_ir_function_decl *decl)
|
||||||
{
|
{
|
||||||
vkd3d_free(decl->parameters);
|
vkd3d_free(decl->parameters);
|
||||||
hlsl_free_instr_list(decl->body);
|
hlsl_free_instr_list(&decl->body);
|
||||||
vkd3d_free(decl->body);
|
|
||||||
vkd3d_free(decl);
|
vkd3d_free(decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1530,7 +1530,7 @@ void hlsl_add_function(struct hlsl_ctx *ctx, char *name, struct hlsl_ir_function
|
|||||||
struct hlsl_ir_function_decl *old_decl =
|
struct hlsl_ir_function_decl *old_decl =
|
||||||
RB_ENTRY_VALUE(old_entry, struct hlsl_ir_function_decl, entry);
|
RB_ENTRY_VALUE(old_entry, struct hlsl_ir_function_decl, entry);
|
||||||
|
|
||||||
if (!decl->body)
|
if (!decl->has_body)
|
||||||
{
|
{
|
||||||
free_function_decl(decl);
|
free_function_decl(decl);
|
||||||
vkd3d_free(name);
|
vkd3d_free(name);
|
||||||
|
@ -258,7 +258,8 @@ struct hlsl_ir_function_decl
|
|||||||
struct rb_entry entry;
|
struct rb_entry entry;
|
||||||
struct hlsl_ir_function *func;
|
struct hlsl_ir_function *func;
|
||||||
struct list *parameters;
|
struct list *parameters;
|
||||||
struct list *body;
|
struct list body;
|
||||||
|
bool has_body;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hlsl_ir_if
|
struct hlsl_ir_if
|
||||||
|
@ -2053,7 +2053,7 @@ hlsl_prog:
|
|||||||
decl = get_func_decl(&ctx->functions, $2.name, $2.decl->parameters);
|
decl = get_func_decl(&ctx->functions, $2.name, $2.decl->parameters);
|
||||||
if (decl && !decl->func->intrinsic)
|
if (decl && !decl->func->intrinsic)
|
||||||
{
|
{
|
||||||
if (decl->body && $2.decl->body)
|
if (decl->has_body && $2.decl->has_body)
|
||||||
{
|
{
|
||||||
hlsl_error(ctx, $2.decl->loc, VKD3D_SHADER_ERROR_HLSL_REDEFINED,
|
hlsl_error(ctx, $2.decl->loc, VKD3D_SHADER_ERROR_HLSL_REDEFINED,
|
||||||
"Function \"%s\" is already defined.", $2.name);
|
"Function \"%s\" is already defined.", $2.name);
|
||||||
@ -2247,7 +2247,9 @@ func_declaration:
|
|||||||
func_prototype compound_statement
|
func_prototype compound_statement
|
||||||
{
|
{
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
$$.decl->body = $2;
|
$$.decl->has_body = true;
|
||||||
|
list_move_tail(&$$.decl->body, $2);
|
||||||
|
vkd3d_free($2);
|
||||||
hlsl_pop_scope(ctx);
|
hlsl_pop_scope(ctx);
|
||||||
}
|
}
|
||||||
| func_prototype ';'
|
| func_prototype ';'
|
||||||
|
@ -567,7 +567,7 @@ static void dump_function_decl(struct rb_entry *entry, void *context)
|
|||||||
struct hlsl_ir_function_decl *func = RB_ENTRY_VALUE(entry, struct hlsl_ir_function_decl, entry);
|
struct hlsl_ir_function_decl *func = RB_ENTRY_VALUE(entry, struct hlsl_ir_function_decl, entry);
|
||||||
struct hlsl_ctx *ctx = context;
|
struct hlsl_ctx *ctx = context;
|
||||||
|
|
||||||
if (func->body)
|
if (func->has_body)
|
||||||
hlsl_dump_function(ctx, func);
|
hlsl_dump_function(ctx, func);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -674,7 +674,7 @@ static void compute_liveness(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl
|
|||||||
struct hlsl_ir_var *var;
|
struct hlsl_ir_var *var;
|
||||||
|
|
||||||
/* Index 0 means unused; index 1 means function entry, so start at 2. */
|
/* Index 0 means unused; index 1 means function entry, so start at 2. */
|
||||||
index_instructions(entry_func->body, 2);
|
index_instructions(&entry_func->body, 2);
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(scope, &ctx->scopes, struct hlsl_scope, entry)
|
LIST_FOR_EACH_ENTRY(scope, &ctx->scopes, struct hlsl_scope, entry)
|
||||||
{
|
{
|
||||||
@ -693,7 +693,7 @@ static void compute_liveness(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl
|
|||||||
if (entry_func->return_var)
|
if (entry_func->return_var)
|
||||||
entry_func->return_var->last_read = UINT_MAX;
|
entry_func->return_var->last_read = UINT_MAX;
|
||||||
|
|
||||||
compute_liveness_recurse(entry_func->body, 0, 0);
|
compute_liveness_recurse(&entry_func->body, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct liveness
|
struct liveness
|
||||||
@ -1001,7 +1001,7 @@ static void allocate_const_registers(struct hlsl_ctx *ctx, struct hlsl_ir_functi
|
|||||||
struct liveness liveness = {0};
|
struct liveness liveness = {0};
|
||||||
struct hlsl_ir_var *var;
|
struct hlsl_ir_var *var;
|
||||||
|
|
||||||
allocate_const_registers_recurse(ctx, entry_func->body, &liveness);
|
allocate_const_registers_recurse(ctx, &entry_func->body, &liveness);
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
|
LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
|
||||||
{
|
{
|
||||||
@ -1026,7 +1026,7 @@ static void allocate_const_registers(struct hlsl_ctx *ctx, struct hlsl_ir_functi
|
|||||||
static void allocate_temp_registers(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func)
|
static void allocate_temp_registers(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func)
|
||||||
{
|
{
|
||||||
struct liveness liveness = {0};
|
struct liveness liveness = {0};
|
||||||
allocate_temp_registers_recurse(ctx, entry_func->body, &liveness);
|
allocate_temp_registers_recurse(ctx, &entry_func->body, &liveness);
|
||||||
ctx->temp_count = liveness.reg_count;
|
ctx->temp_count = liveness.reg_count;
|
||||||
vkd3d_free(liveness.regs);
|
vkd3d_free(liveness.regs);
|
||||||
}
|
}
|
||||||
@ -1303,22 +1303,23 @@ struct hlsl_reg hlsl_reg_from_deref(const struct hlsl_deref *deref, const struct
|
|||||||
|
|
||||||
int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func, struct vkd3d_shader_code *out)
|
int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func, struct vkd3d_shader_code *out)
|
||||||
{
|
{
|
||||||
|
struct list *const body = &entry_func->body;
|
||||||
struct hlsl_ir_var *var;
|
struct hlsl_ir_var *var;
|
||||||
bool progress;
|
bool progress;
|
||||||
|
|
||||||
list_move_head(entry_func->body, &ctx->static_initializers);
|
list_move_head(body, &ctx->static_initializers);
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(var, &ctx->globals->vars, struct hlsl_ir_var, scope_entry)
|
LIST_FOR_EACH_ENTRY(var, &ctx->globals->vars, struct hlsl_ir_var, scope_entry)
|
||||||
{
|
{
|
||||||
if (var->modifiers & HLSL_STORAGE_UNIFORM)
|
if (var->modifiers & HLSL_STORAGE_UNIFORM)
|
||||||
prepend_uniform_copy(ctx, entry_func->body, var);
|
prepend_uniform_copy(ctx, body, var);
|
||||||
}
|
}
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(var, entry_func->parameters, struct hlsl_ir_var, param_entry)
|
LIST_FOR_EACH_ENTRY(var, entry_func->parameters, struct hlsl_ir_var, param_entry)
|
||||||
{
|
{
|
||||||
if (var->data_type->type == HLSL_CLASS_OBJECT || (var->modifiers & HLSL_STORAGE_UNIFORM))
|
if (var->data_type->type == HLSL_CLASS_OBJECT || (var->modifiers & HLSL_STORAGE_UNIFORM))
|
||||||
{
|
{
|
||||||
prepend_uniform_copy(ctx, entry_func->body, var);
|
prepend_uniform_copy(ctx, body, var);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1327,9 +1328,9 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun
|
|||||||
"Parameter \"%s\" is missing a semantic.", var->name);
|
"Parameter \"%s\" is missing a semantic.", var->name);
|
||||||
|
|
||||||
if (var->modifiers & HLSL_STORAGE_IN)
|
if (var->modifiers & HLSL_STORAGE_IN)
|
||||||
prepend_input_var_copy(ctx, entry_func->body, var);
|
prepend_input_var_copy(ctx, body, var);
|
||||||
if (var->modifiers & HLSL_STORAGE_OUT)
|
if (var->modifiers & HLSL_STORAGE_OUT)
|
||||||
append_output_var_copy(ctx, entry_func->body, var);
|
append_output_var_copy(ctx, body, var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (entry_func->return_var)
|
if (entry_func->return_var)
|
||||||
@ -1338,24 +1339,24 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun
|
|||||||
hlsl_error(ctx, entry_func->loc, VKD3D_SHADER_ERROR_HLSL_MISSING_SEMANTIC,
|
hlsl_error(ctx, entry_func->loc, VKD3D_SHADER_ERROR_HLSL_MISSING_SEMANTIC,
|
||||||
"Entry point \"%s\" is missing a return value semantic.", entry_func->func->name);
|
"Entry point \"%s\" is missing a return value semantic.", entry_func->func->name);
|
||||||
|
|
||||||
append_output_var_copy(ctx, entry_func->body, entry_func->return_var);
|
append_output_var_copy(ctx, body, entry_func->return_var);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (transform_ir(ctx, fold_redundant_casts, entry_func->body, NULL));
|
while (transform_ir(ctx, fold_redundant_casts, body, NULL));
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
progress = transform_ir(ctx, split_array_copies, entry_func->body, NULL);
|
progress = transform_ir(ctx, split_array_copies, body, NULL);
|
||||||
progress |= transform_ir(ctx, split_struct_copies, entry_func->body, NULL);
|
progress |= transform_ir(ctx, split_struct_copies, body, NULL);
|
||||||
}
|
}
|
||||||
while (progress);
|
while (progress);
|
||||||
while (transform_ir(ctx, fold_constants, entry_func->body, NULL));
|
while (transform_ir(ctx, fold_constants, body, NULL));
|
||||||
|
|
||||||
if (ctx->profile->major_version < 4)
|
if (ctx->profile->major_version < 4)
|
||||||
transform_ir(ctx, lower_division, entry_func->body, NULL);
|
transform_ir(ctx, lower_division, body, NULL);
|
||||||
|
|
||||||
do
|
do
|
||||||
compute_liveness(ctx, entry_func);
|
compute_liveness(ctx, entry_func);
|
||||||
while (transform_ir(ctx, dce, entry_func->body, NULL));
|
while (transform_ir(ctx, dce, body, NULL));
|
||||||
|
|
||||||
compute_liveness(ctx, entry_func);
|
compute_liveness(ctx, entry_func);
|
||||||
|
|
||||||
|
@ -768,7 +768,7 @@ static void write_sm1_instructions(struct hlsl_ctx *ctx, struct vkd3d_bytecode_b
|
|||||||
{
|
{
|
||||||
const struct hlsl_ir_node *instr;
|
const struct hlsl_ir_node *instr;
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(instr, entry_func->body, struct hlsl_ir_node, entry)
|
LIST_FOR_EACH_ENTRY(instr, &entry_func->body, struct hlsl_ir_node, entry)
|
||||||
{
|
{
|
||||||
if (instr->data_type)
|
if (instr->data_type)
|
||||||
{
|
{
|
||||||
|
@ -1472,7 +1472,7 @@ static void write_sm4_shdr(struct hlsl_ctx *ctx,
|
|||||||
if (ctx->temp_count)
|
if (ctx->temp_count)
|
||||||
write_sm4_dcl_temps(&buffer, ctx->temp_count);
|
write_sm4_dcl_temps(&buffer, ctx->temp_count);
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(instr, entry_func->body, struct hlsl_ir_node, entry)
|
LIST_FOR_EACH_ENTRY(instr, &entry_func->body, struct hlsl_ir_node, entry)
|
||||||
{
|
{
|
||||||
if (instr->data_type)
|
if (instr->data_type)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user