To automatically put the compilation context in a failed state.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/hlsl.c | 102 ++++++++++----------- libs/vkd3d-shader/hlsl.h | 57 +++++++++--- libs/vkd3d-shader/hlsl.l | 5 +- libs/vkd3d-shader/hlsl.y | 137 ++++++++++++++-------------- libs/vkd3d-shader/hlsl_codegen.c | 147 +++++++++++-------------------- 5 files changed, 216 insertions(+), 232 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index e81efa2d..86ef1247 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -103,7 +103,7 @@ struct hlsl_type *hlsl_new_type(struct hlsl_ctx *ctx, const char *name, enum hls { struct hlsl_type *type;
- if (!(type = vkd3d_calloc(1, sizeof(*type)))) + if (!(type = hlsl_alloc(ctx, sizeof(*type)))) return NULL; type->name = name; type->type = type_class; @@ -149,7 +149,7 @@ struct hlsl_type *hlsl_new_struct_type(struct hlsl_ctx *ctx, const char *name, s unsigned int reg_size = 0; struct hlsl_type *type;
- if (!(type = vkd3d_calloc(1, sizeof(*type)))) + if (!(type = hlsl_alloc(ctx, sizeof(*type)))) return NULL; type->type = HLSL_CLASS_STRUCT; type->base_type = HLSL_TYPE_VOID; @@ -281,12 +281,12 @@ struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old, u struct hlsl_struct_field *old_field, *field; struct hlsl_type *type;
- if (!(type = vkd3d_calloc(1, sizeof(*type)))) + if (!(type = hlsl_alloc(ctx, sizeof(*type)))) return NULL;
if (old->name) { - type->name = vkd3d_strdup(old->name); + type->name = hlsl_strdup(ctx, old->name); if (!type->name) { vkd3d_free(type); @@ -313,7 +313,7 @@ struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old, u { unsigned int reg_size = 0;
- if (!(type->e.elements = vkd3d_malloc(sizeof(*type->e.elements)))) + if (!(type->e.elements = hlsl_alloc(ctx, sizeof(*type->e.elements)))) { vkd3d_free((void *)type->name); vkd3d_free(type); @@ -322,7 +322,7 @@ struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old, u list_init(type->e.elements); LIST_FOR_EACH_ENTRY(old_field, old->e.elements, struct hlsl_struct_field, entry) { - if (!(field = vkd3d_calloc(1, sizeof(*field)))) + if (!(field = hlsl_alloc(ctx, sizeof(*field)))) { LIST_FOR_EACH_ENTRY_SAFE(field, old_field, type->e.elements, struct hlsl_struct_field, entry) { @@ -337,10 +337,10 @@ struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old, u } field->loc = old_field->loc; field->type = hlsl_type_clone(ctx, old_field->type, default_majority); - field->name = vkd3d_strdup(old_field->name); + field->name = hlsl_strdup(ctx, old_field->name); if (old_field->semantic.name) { - field->semantic.name = vkd3d_strdup(old_field->semantic.name); + field->semantic.name = hlsl_strdup(ctx, old_field->semantic.name); field->semantic.index = old_field->semantic.index; } field->reg_offset = reg_size; @@ -373,30 +373,30 @@ bool hlsl_scope_add_type(struct hlsl_scope *scope, struct hlsl_type *type) return true; }
-struct hlsl_ir_expr *hlsl_new_cast(struct hlsl_ir_node *node, struct hlsl_type *type, +struct hlsl_ir_expr *hlsl_new_cast(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, struct hlsl_type *type, struct vkd3d_shader_location *loc) { struct hlsl_ir_node *cast;
- cast = hlsl_new_unary_expr(HLSL_IR_UNOP_CAST, node, *loc); + cast = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_CAST, node, *loc); if (cast) cast->data_type = type; return hlsl_ir_expr(cast); }
-struct hlsl_ir_expr *hlsl_new_copy(struct hlsl_ir_node *node) +struct hlsl_ir_expr *hlsl_new_copy(struct hlsl_ctx *ctx, struct hlsl_ir_node *node) { /* Use a cast to the same type as a makeshift identity expression. */ - return hlsl_new_cast(node, node->data_type, &node->loc); + return hlsl_new_cast(ctx, node, node->data_type, &node->loc); }
-struct hlsl_ir_var *hlsl_new_var(const char *name, struct hlsl_type *type, +struct hlsl_ir_var *hlsl_new_var(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *type, const struct vkd3d_shader_location loc, const struct hlsl_semantic *semantic, unsigned int modifiers, const struct hlsl_reg_reservation *reg_reservation) { struct hlsl_ir_var *var;
- if (!(var = vkd3d_calloc(1, sizeof(*var)))) + if (!(var = hlsl_alloc(ctx, sizeof(*var)))) return NULL;
var->name = name; @@ -412,7 +412,7 @@ struct hlsl_ir_var *hlsl_new_var(const char *name, struct hlsl_type *type, struct hlsl_ir_var *hlsl_new_synthetic_var(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *type, const struct vkd3d_shader_location loc) { - struct hlsl_ir_var *var = hlsl_new_var(vkd3d_strdup(name), type, loc, NULL, 0, NULL); + struct hlsl_ir_var *var = hlsl_new_var(ctx, hlsl_strdup(ctx, name), type, loc, NULL, 0, NULL);
if (var) list_add_tail(&ctx->globals->vars, &var->scope_entry); @@ -424,7 +424,7 @@ static bool type_is_single_reg(const struct hlsl_type *type) return type->type == HLSL_CLASS_SCALAR || type->type == HLSL_CLASS_VECTOR; }
-struct hlsl_ir_store *hlsl_new_store(struct hlsl_ir_var *var, struct hlsl_ir_node *offset, +struct hlsl_ir_store *hlsl_new_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset, struct hlsl_ir_node *rhs, unsigned int writemask, struct vkd3d_shader_location loc) { struct hlsl_ir_store *store; @@ -432,7 +432,7 @@ struct hlsl_ir_store *hlsl_new_store(struct hlsl_ir_var *var, struct hlsl_ir_nod if (!writemask && type_is_single_reg(rhs->data_type)) writemask = (1 << rhs->data_type->dimx) - 1;
- if (!(store = vkd3d_malloc(sizeof(*store)))) + if (!(store = hlsl_alloc(ctx, sizeof(*store)))) return NULL;
init_node(&store->node, HLSL_IR_STORE, NULL, loc); @@ -443,9 +443,9 @@ struct hlsl_ir_store *hlsl_new_store(struct hlsl_ir_var *var, struct hlsl_ir_nod return store; }
-struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs) +struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs) { - return hlsl_new_store(lhs, NULL, rhs, 0, rhs->loc); + return hlsl_new_store(ctx, lhs, NULL, rhs, 0, rhs->loc); }
struct hlsl_ir_constant *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned int n, @@ -453,19 +453,19 @@ struct hlsl_ir_constant *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned i { struct hlsl_ir_constant *c;
- if (!(c = vkd3d_malloc(sizeof(*c)))) + if (!(c = hlsl_alloc(ctx, sizeof(*c)))) return NULL; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_UINT], loc); c->value.u[0] = n; return c; }
-struct hlsl_ir_node *hlsl_new_unary_expr(enum hlsl_ir_expr_op op, +struct hlsl_ir_node *hlsl_new_unary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg, struct vkd3d_shader_location loc) { struct hlsl_ir_expr *expr;
- if (!(expr = vkd3d_calloc(1, sizeof(*expr)))) + if (!(expr = hlsl_alloc(ctx, sizeof(*expr)))) return NULL; init_node(&expr->node, HLSL_IR_EXPR, arg->data_type, loc); expr->op = op; @@ -473,13 +473,14 @@ struct hlsl_ir_node *hlsl_new_unary_expr(enum hlsl_ir_expr_op op, return &expr->node; }
-struct hlsl_ir_node *hlsl_new_binary_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2) +struct hlsl_ir_node *hlsl_new_binary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, + struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2) { struct hlsl_ir_expr *expr;
assert(hlsl_types_are_equal(arg1->data_type, arg2->data_type));
- if (!(expr = vkd3d_calloc(1, sizeof(*expr)))) + if (!(expr = hlsl_alloc(ctx, sizeof(*expr)))) return NULL; init_node(&expr->node, HLSL_IR_EXPR, arg1->data_type, arg1->loc); expr->op = op; @@ -488,11 +489,11 @@ struct hlsl_ir_node *hlsl_new_binary_expr(enum hlsl_ir_expr_op op, struct hlsl_i return &expr->node; }
-struct hlsl_ir_if *hlsl_new_if(struct hlsl_ir_node *condition, struct vkd3d_shader_location loc) +struct hlsl_ir_if *hlsl_new_if(struct hlsl_ctx *ctx, struct hlsl_ir_node *condition, struct vkd3d_shader_location loc) { struct hlsl_ir_if *iff;
- if (!(iff = vkd3d_malloc(sizeof(*iff)))) + if (!(iff = hlsl_alloc(ctx, sizeof(*iff)))) return NULL; init_node(&iff->node, HLSL_IR_IF, NULL, loc); hlsl_src_from_node(&iff->condition, condition); @@ -501,12 +502,12 @@ struct hlsl_ir_if *hlsl_new_if(struct hlsl_ir_node *condition, struct vkd3d_shad return iff; }
-struct hlsl_ir_load *hlsl_new_load(struct hlsl_ir_var *var, struct hlsl_ir_node *offset, +struct hlsl_ir_load *hlsl_new_load(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset, struct hlsl_type *type, const struct vkd3d_shader_location loc) { struct hlsl_ir_load *load;
- if (!(load = vkd3d_calloc(1, sizeof(*load)))) + if (!(load = hlsl_alloc(ctx, sizeof(*load)))) return NULL; init_node(&load->node, HLSL_IR_LOAD, type, loc); load->src.var = var; @@ -514,9 +515,10 @@ struct hlsl_ir_load *hlsl_new_load(struct hlsl_ir_var *var, struct hlsl_ir_node return load; }
-struct hlsl_ir_load *hlsl_new_var_load(struct hlsl_ir_var *var, const struct vkd3d_shader_location loc) +struct hlsl_ir_load *hlsl_new_var_load(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, + const struct vkd3d_shader_location loc) { - return hlsl_new_load(var, NULL, var->data_type, loc); + return hlsl_new_load(ctx, var, NULL, var->data_type, loc); }
struct hlsl_ir_swizzle *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned int components, @@ -524,7 +526,7 @@ struct hlsl_ir_swizzle *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned { struct hlsl_ir_swizzle *swizzle;
- if (!(swizzle = vkd3d_malloc(sizeof(*swizzle)))) + if (!(swizzle = hlsl_alloc(ctx, sizeof(*swizzle)))) return NULL; init_node(&swizzle->node, HLSL_IR_SWIZZLE, hlsl_new_type(ctx, NULL, HLSL_CLASS_VECTOR, val->data_type->base_type, components, 1), *loc); @@ -533,22 +535,22 @@ struct hlsl_ir_swizzle *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned return swizzle; }
-struct hlsl_ir_jump *hlsl_new_jump(enum hlsl_ir_jump_type type, struct vkd3d_shader_location loc) +struct hlsl_ir_jump *hlsl_new_jump(struct hlsl_ctx *ctx, enum hlsl_ir_jump_type type, struct vkd3d_shader_location loc) { struct hlsl_ir_jump *jump;
- if (!(jump = vkd3d_malloc(sizeof(*jump)))) + if (!(jump = hlsl_alloc(ctx, sizeof(*jump)))) return NULL; init_node(&jump->node, HLSL_IR_JUMP, NULL, loc); jump->type = type; return jump; }
-struct hlsl_ir_loop *hlsl_new_loop(struct vkd3d_shader_location loc) +struct hlsl_ir_loop *hlsl_new_loop(struct hlsl_ctx *ctx, struct vkd3d_shader_location loc) { struct hlsl_ir_loop *loop;
- if (!(loop = vkd3d_calloc(1, sizeof(*loop)))) + if (!(loop = hlsl_alloc(ctx, sizeof(*loop)))) return NULL; init_node(&loop->node, HLSL_IR_LOOP, NULL, loc); list_init(&loop->body); @@ -565,7 +567,7 @@ struct hlsl_ir_function_decl *hlsl_new_func_decl(struct hlsl_ctx *ctx, struct hl { struct hlsl_ir_function_decl *decl;
- if (!(decl = vkd3d_calloc(1, sizeof(*decl)))) + if (!(decl = hlsl_alloc(ctx, sizeof(*decl)))) return NULL; decl->return_type = return_type; decl->parameters = parameters; @@ -577,7 +579,7 @@ struct hlsl_ir_function_decl *hlsl_new_func_decl(struct hlsl_ctx *ctx, struct hl char name[28];
sprintf(name, "<retval-%p>", decl); - if (!(return_var = hlsl_new_var(vkd3d_strdup(name), return_type, loc, semantic, 0, NULL))) + if (!(return_var = hlsl_new_var(ctx, hlsl_strdup(ctx, name), return_type, loc, semantic, 0, NULL))) { vkd3d_free(decl); return NULL; @@ -609,7 +611,7 @@ void hlsl_push_scope(struct hlsl_ctx *ctx) { struct hlsl_scope *new_scope;
- if (!(new_scope = vkd3d_malloc(sizeof(*new_scope)))) + if (!(new_scope = hlsl_alloc(ctx, sizeof(*new_scope)))) return; TRACE("Pushing a new scope.\n"); list_init(&new_scope->vars); @@ -1333,12 +1335,12 @@ static void free_function_rb(struct rb_entry *entry, void *context) free_function(RB_ENTRY_VALUE(entry, struct hlsl_ir_function, entry)); }
-void hlsl_add_function(struct rb_tree *funcs, char *name, struct hlsl_ir_function_decl *decl, bool intrinsic) +void hlsl_add_function(struct hlsl_ctx *ctx, char *name, struct hlsl_ir_function_decl *decl, bool intrinsic) { struct hlsl_ir_function *func; struct rb_entry *func_entry, *old_entry;
- func_entry = rb_get(funcs, name); + func_entry = rb_get(&ctx->functions, name); if (func_entry) { func = RB_ENTRY_VALUE(func_entry, struct hlsl_ir_function, entry); @@ -1372,13 +1374,13 @@ void hlsl_add_function(struct rb_tree *funcs, char *name, struct hlsl_ir_functio vkd3d_free(name); return; } - func = vkd3d_malloc(sizeof(*func)); + func = hlsl_alloc(ctx, sizeof(*func)); func->name = name; rb_init(&func->overloads, compare_function_decl_rb); decl->func = func; rb_put(&func->overloads, decl->parameters, &decl->entry); func->intrinsic = intrinsic; - rb_put(funcs, func->name, &func->entry); + rb_put(&ctx->functions, func->name, &func->entry); }
static const struct hlsl_profile_info *get_target_info(const char *target) @@ -1517,20 +1519,20 @@ static void declare_predefined_types(struct hlsl_ctx *ctx) for (x = 1; x <= 4; ++x) { sprintf(name, "%s%ux%u", names[bt], y, x); - type = hlsl_new_type(ctx, vkd3d_strdup(name), HLSL_CLASS_MATRIX, bt, x, y); + type = hlsl_new_type(ctx, hlsl_strdup(ctx, name), HLSL_CLASS_MATRIX, bt, x, y); hlsl_scope_add_type(ctx->globals, type);
if (y == 1) { sprintf(name, "%s%u", names[bt], x); - type = hlsl_new_type(ctx, vkd3d_strdup(name), HLSL_CLASS_VECTOR, bt, x, y); + type = hlsl_new_type(ctx, hlsl_strdup(ctx, name), HLSL_CLASS_VECTOR, bt, x, y); hlsl_scope_add_type(ctx->globals, type); ctx->builtin_types.vector[bt][x - 1] = type;
if (x == 1) { sprintf(name, "%s", names[bt]); - type = hlsl_new_type(ctx, vkd3d_strdup(name), HLSL_CLASS_SCALAR, bt, x, y); + type = hlsl_new_type(ctx, hlsl_strdup(ctx, name), HLSL_CLASS_SCALAR, bt, x, y); hlsl_scope_add_type(ctx->globals, type); ctx->builtin_types.scalar[bt] = type; } @@ -1541,16 +1543,16 @@ static void declare_predefined_types(struct hlsl_ctx *ctx)
for (bt = 0; bt <= HLSL_SAMPLER_DIM_MAX; ++bt) { - type = hlsl_new_type(ctx, vkd3d_strdup(sampler_names[bt]), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1); + type = hlsl_new_type(ctx, hlsl_strdup(ctx, sampler_names[bt]), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1); type->sampler_dim = bt; ctx->builtin_types.sampler[bt] = type; }
- ctx->builtin_types.Void = hlsl_new_type(ctx, vkd3d_strdup("void"), HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1); + ctx->builtin_types.Void = hlsl_new_type(ctx, hlsl_strdup(ctx, "void"), HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1);
for (i = 0; i < ARRAY_SIZE(effect_types); ++i) { - type = hlsl_new_type(ctx, vkd3d_strdup(effect_types[i].name), effect_types[i].class, + type = hlsl_new_type(ctx, hlsl_strdup(ctx, effect_types[i].name), effect_types[i].class, effect_types[i].base_type, effect_types[i].dimx, effect_types[i].dimy); hlsl_scope_add_type(ctx->globals, type); } @@ -1565,9 +1567,9 @@ static bool hlsl_ctx_init(struct hlsl_ctx *ctx, const struct hlsl_profile_info *
ctx->message_context = message_context;
- if (!(ctx->source_files = vkd3d_malloc(sizeof(*ctx->source_files)))) + if (!(ctx->source_files = hlsl_alloc(ctx, sizeof(*ctx->source_files)))) return false; - if (!(ctx->source_files[0] = vkd3d_strdup(""))) + if (!(ctx->source_files[0] = hlsl_strdup(ctx, ""))) { vkd3d_free(ctx->source_files); return false; diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index 9081ef37..3e7d2445 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -539,6 +539,34 @@ static inline void hlsl_src_remove(struct hlsl_src *src) src->node = NULL; }
+static inline void *hlsl_alloc(struct hlsl_ctx *ctx, size_t size) +{ + void *ptr = vkd3d_calloc(1, size); + + if (!ptr) + ctx->failed = true; + return ptr; +} + +static inline char *hlsl_strdup(struct hlsl_ctx *ctx, const char *string) +{ + char *ptr = vkd3d_strdup(string); + + if (!ptr) + ctx->failed = true; + return ptr; +} + +static inline bool hlsl_array_reserve(struct hlsl_ctx *ctx, void **elements, + size_t *capacity, size_t element_count, size_t element_size) +{ + bool ret = vkd3d_array_reserve(elements, capacity, element_count, element_size); + + if (!ret) + ctx->failed = true; + return ret; +} + const char *debug_hlsl_type(const struct hlsl_type *type) DECLSPEC_HIDDEN; const char *debug_hlsl_writemask(unsigned int writemask) DECLSPEC_HIDDEN;
@@ -548,7 +576,7 @@ struct vkd3d_string_buffer *hlsl_modifiers_to_string(struct vkd3d_string_buffer_ unsigned int modifiers) DECLSPEC_HIDDEN; const char *hlsl_node_type_to_string(enum hlsl_ir_node_type type) DECLSPEC_HIDDEN;
-void hlsl_add_function(struct rb_tree *funcs, char *name, struct hlsl_ir_function_decl *decl, +void hlsl_add_function(struct hlsl_ctx *ctx, char *name, struct hlsl_ir_function_decl *decl, bool intrinsic) DECLSPEC_HIDDEN; bool hlsl_add_var(struct hlsl_ctx *ctx, struct hlsl_ir_var *decl, bool local_var) DECLSPEC_HIDDEN;
@@ -569,22 +597,24 @@ struct hlsl_ir_var *hlsl_get_var(struct hlsl_scope *scope, const char *name) DEC
struct hlsl_type *hlsl_new_array_type(struct hlsl_ctx *ctx, struct hlsl_type *basic_type, unsigned int array_size) DECLSPEC_HIDDEN; -struct hlsl_ir_node *hlsl_new_binary_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1, +struct hlsl_ir_node *hlsl_new_binary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2) DECLSPEC_HIDDEN; -struct hlsl_ir_expr *hlsl_new_cast(struct hlsl_ir_node *node, struct hlsl_type *type, +struct hlsl_ir_expr *hlsl_new_cast(struct hlsl_ctx *ctx, struct hlsl_ir_node *node, struct hlsl_type *type, struct vkd3d_shader_location *loc) DECLSPEC_HIDDEN; -struct hlsl_ir_expr *hlsl_new_copy(struct hlsl_ir_node *node) DECLSPEC_HIDDEN; +struct hlsl_ir_expr *hlsl_new_copy(struct hlsl_ctx *ctx, struct hlsl_ir_node *node) DECLSPEC_HIDDEN; struct hlsl_ir_function_decl *hlsl_new_func_decl(struct hlsl_ctx *ctx, struct hlsl_type *return_type, struct list *parameters, const struct hlsl_semantic *semantic, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; -struct hlsl_ir_if *hlsl_new_if(struct hlsl_ir_node *condition, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; -struct hlsl_ir_jump *hlsl_new_jump(enum hlsl_ir_jump_type type, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; -struct hlsl_ir_load *hlsl_new_load(struct hlsl_ir_var *var, struct hlsl_ir_node *offset, struct hlsl_type *type, +struct hlsl_ir_if *hlsl_new_if(struct hlsl_ctx *ctx, struct hlsl_ir_node *condition, + struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; +struct hlsl_ir_jump *hlsl_new_jump(struct hlsl_ctx *ctx, enum hlsl_ir_jump_type type, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; -struct hlsl_ir_loop *hlsl_new_loop(struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; -struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ir_var *lhs, +struct hlsl_ir_load *hlsl_new_load(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset, + struct hlsl_type *type, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; +struct hlsl_ir_loop *hlsl_new_loop(struct hlsl_ctx *ctx, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; +struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs) DECLSPEC_HIDDEN; -struct hlsl_ir_store *hlsl_new_store(struct hlsl_ir_var *var, struct hlsl_ir_node *offset, +struct hlsl_ir_store *hlsl_new_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset, struct hlsl_ir_node *rhs, unsigned int writemask, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; struct hlsl_type *hlsl_new_struct_type(struct hlsl_ctx *ctx, const char *name, struct list *fields) DECLSPEC_HIDDEN; struct hlsl_ir_swizzle *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned int components, @@ -595,12 +625,13 @@ struct hlsl_type *hlsl_new_type(struct hlsl_ctx *ctx, const char *name, enum hls enum hlsl_base_type base_type, unsigned dimx, unsigned dimy) DECLSPEC_HIDDEN; struct hlsl_ir_constant *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned int n, const struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; -struct hlsl_ir_node *hlsl_new_unary_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg, +struct hlsl_ir_node *hlsl_new_unary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg, struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; -struct hlsl_ir_var *hlsl_new_var(const char *name, struct hlsl_type *type, +struct hlsl_ir_var *hlsl_new_var(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *type, const struct vkd3d_shader_location loc, const struct hlsl_semantic *semantic, unsigned int modifiers, const struct hlsl_reg_reservation *reg_reservation) DECLSPEC_HIDDEN; -struct hlsl_ir_load *hlsl_new_var_load(struct hlsl_ir_var *var, const struct vkd3d_shader_location loc) DECLSPEC_HIDDEN; +struct hlsl_ir_load *hlsl_new_var_load(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, + const struct vkd3d_shader_location loc) DECLSPEC_HIDDEN;
void hlsl_error(struct hlsl_ctx *ctx, const struct vkd3d_shader_location loc, enum vkd3d_shader_error error, const char *fmt, ...) VKD3D_PRINTF_FUNC(4, 5) DECLSPEC_HIDDEN; diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index cee98ea5..f8ff2830 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -170,7 +170,7 @@ row_major {return KW_ROW_MAJOR; } {IDENTIFIER} { struct hlsl_ctx *ctx = yyget_extra(yyscanner);
- yylval->name = vkd3d_strdup(yytext); + yylval->name = hlsl_strdup(ctx, yytext); if (hlsl_get_var(ctx->cur_scope, yytext) || hlsl_get_function(ctx, yytext)) return VAR_IDENTIFIER; else if (hlsl_get_type(ctx->cur_scope, yytext, true)) @@ -248,7 +248,8 @@ row_major {return KW_ROW_MAJOR; } return PRE_LINE; } <pp_line>{STRING} { - char *string = vkd3d_strdup(yytext + 1); + struct hlsl_ctx *ctx = yyget_extra(yyscanner); + char *string = hlsl_strdup(ctx, yytext + 1);
BEGIN(pp_ignore); string[strlen(string) - 1] = 0; diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index bcb1c207..52544c43 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -127,11 +127,11 @@ static struct hlsl_ir_node *node_from_list(struct list *list) return LIST_ENTRY(list_tail(list), struct hlsl_ir_node, entry); }
-static struct list *make_empty_list(void) +static struct list *make_empty_list(struct hlsl_ctx *ctx) { struct list *list;
- if ((list = vkd3d_malloc(sizeof(*list)))) + if ((list = hlsl_alloc(ctx, sizeof(*list)))) list_init(list); return list; } @@ -286,7 +286,7 @@ static struct hlsl_ir_node *add_implicit_conversion(struct hlsl_ctx *ctx, struct hlsl_warning(ctx, *loc, VKD3D_SHADER_WARNING_HLSL_IMPLICIT_TRUNCATION, "Implicit truncation of %s type.", src_type->type == HLSL_CLASS_VECTOR ? "vector" : "matrix");
- if (!(cast = hlsl_new_cast(node, dst_type, loc))) + if (!(cast = hlsl_new_cast(ctx, node, dst_type, loc))) return NULL; list_add_tail(instrs, &cast->node.entry); return &cast->node; @@ -313,7 +313,7 @@ static DWORD add_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, DWORD mod, con return modifiers | mod; }
-static bool append_conditional_break(struct list *cond_list) +static bool append_conditional_break(struct hlsl_ctx *ctx, struct list *cond_list) { struct hlsl_ir_node *condition, *not; struct hlsl_ir_jump *jump; @@ -324,15 +324,15 @@ static bool append_conditional_break(struct list *cond_list) return true;
condition = node_from_list(cond_list); - if (!(not = hlsl_new_unary_expr(HLSL_IR_UNOP_LOGIC_NOT, condition, condition->loc))) + if (!(not = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_LOGIC_NOT, condition, condition->loc))) return false; list_add_tail(cond_list, ¬->entry);
- if (!(iff = hlsl_new_if(not, condition->loc))) + if (!(iff = hlsl_new_if(ctx, not, condition->loc))) return false; list_add_tail(cond_list, &iff->node.entry);
- if (!(jump = hlsl_new_jump(HLSL_IR_JUMP_BREAK, condition->loc))) + if (!(jump = hlsl_new_jump(ctx, HLSL_IR_JUMP_BREAK, condition->loc))) return false; list_add_head(&iff->then_instrs, &jump->node.entry); return true; @@ -345,24 +345,24 @@ enum loop_type LOOP_DO_WHILE };
-static struct list *create_loop(enum loop_type type, struct list *init, struct list *cond, +static struct list *create_loop(struct hlsl_ctx *ctx, enum loop_type type, struct list *init, struct list *cond, struct list *iter, struct list *body, struct vkd3d_shader_location loc) { struct list *list = NULL; struct hlsl_ir_loop *loop = NULL; struct hlsl_ir_if *cond_jump = NULL;
- if (!(list = make_empty_list())) + if (!(list = make_empty_list(ctx))) goto oom;
if (init) list_move_head(list, init);
- if (!(loop = hlsl_new_loop(loc))) + if (!(loop = hlsl_new_loop(ctx, loc))) goto oom; list_add_tail(list, &loop->node.entry);
- if (!append_conditional_break(cond)) + if (!append_conditional_break(ctx, cond)) goto oom;
if (type != LOOP_DO_WHILE) @@ -504,7 +504,7 @@ static struct hlsl_ir_jump *add_return(struct hlsl_ctx *ctx, struct list *instrs if (!(return_value = add_implicit_conversion(ctx, instrs, return_value, return_type, &loc))) return NULL;
- if (!(store = hlsl_new_simple_store(ctx->cur_function->return_var, return_value))) + if (!(store = hlsl_new_simple_store(ctx, ctx->cur_function->return_var, return_value))) return NULL; list_add_after(&return_value->entry, &store->node.entry); } @@ -514,7 +514,7 @@ static struct hlsl_ir_jump *add_return(struct hlsl_ctx *ctx, struct list *instrs return NULL; }
- if (!(jump = hlsl_new_jump(HLSL_IR_JUMP_RETURN, loc))) + if (!(jump = hlsl_new_jump(ctx, HLSL_IR_JUMP_RETURN, loc))) return NULL; list_add_tail(instrs, &jump->node.entry);
@@ -535,7 +535,7 @@ static struct hlsl_ir_load *add_load(struct hlsl_ctx *ctx, struct list *instrs, var = src->var; if (src->offset.node) { - if (!(add = hlsl_new_binary_expr(HLSL_IR_BINOP_ADD, src->offset.node, offset))) + if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, src->offset.node, offset))) return NULL; list_add_tail(instrs, &add->entry); offset = add; @@ -550,13 +550,13 @@ static struct hlsl_ir_load *add_load(struct hlsl_ctx *ctx, struct list *instrs, if (!(var = hlsl_new_synthetic_var(ctx, name, var_node->data_type, var_node->loc))) return NULL;
- if (!(store = hlsl_new_simple_store(var, var_node))) + if (!(store = hlsl_new_simple_store(ctx, var, var_node))) return NULL;
list_add_tail(instrs, &store->node.entry); }
- if (!(load = hlsl_new_load(var, offset, data_type, loc))) + if (!(load = hlsl_new_load(ctx, var, offset, data_type, loc))) return NULL; list_add_tail(instrs, &load->node.entry); return load; @@ -604,7 +604,7 @@ static struct hlsl_ir_load *add_array_load(struct hlsl_ctx *ctx, struct list *in if (!(c = hlsl_new_uint_constant(ctx, data_type->reg_size * 4, loc))) return NULL; list_add_tail(instrs, &c->node.entry); - if (!(mul = hlsl_new_binary_expr(HLSL_IR_BINOP_MUL, index, &c->node))) + if (!(mul = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_MUL, index, &c->node))) return NULL; list_add_tail(instrs, &mul->entry); index = mul; @@ -676,13 +676,13 @@ static struct list *gen_struct_fields(struct hlsl_ctx *ctx, struct hlsl_type *ty if (type->type == HLSL_CLASS_MATRIX) assert(type->modifiers & HLSL_MODIFIERS_MAJORITY_MASK);
- if (!(list = make_empty_list())) + if (!(list = make_empty_list(ctx))) return NULL; LIST_FOR_EACH_ENTRY_SAFE(v, v_next, fields, struct parse_variable_def, entry) { unsigned int i;
- if (!(field = vkd3d_calloc(1, sizeof(*field)))) + if (!(field = hlsl_alloc(ctx, sizeof(*field)))) { vkd3d_free(v); return list; @@ -767,7 +767,7 @@ static bool add_func_parameter(struct hlsl_ctx *ctx, struct list *list, hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER, "Parameter '%s' is declared as both "out" and "uniform".", param->name);
- if (!(var = hlsl_new_var(param->name, param->type, loc, ¶m->semantic, param->modifiers, param->reg_reservation))) + if (!(var = hlsl_new_var(ctx, param->name, param->type, loc, ¶m->semantic, param->modifiers, param->reg_reservation))) return false; var->is_param = 1;
@@ -780,7 +780,7 @@ static bool add_func_parameter(struct hlsl_ctx *ctx, struct list *list, return true; }
-static struct hlsl_reg_reservation *parse_reg_reservation(const char *reg_string) +static struct hlsl_reg_reservation *parse_reg_reservation(struct hlsl_ctx *ctx, const char *reg_string) { enum vkd3d_shader_register_type type; struct hlsl_reg_reservation *reg_res; @@ -811,7 +811,7 @@ static struct hlsl_reg_reservation *parse_reg_reservation(const char *reg_string return NULL; }
- if (!(reg_res = vkd3d_malloc(sizeof(*reg_res)))) + if (!(reg_res = hlsl_alloc(ctx, sizeof(*reg_res)))) return NULL; reg_res->type = type; reg_res->regnum = regnum; @@ -841,11 +841,11 @@ static const struct hlsl_ir_function_decl *get_overloaded_func(struct rb_tree *f return NULL; }
-static struct list *make_list(struct hlsl_ir_node *node) +static struct list *make_list(struct hlsl_ctx *ctx, struct hlsl_ir_node *node) { struct list *list;
- if (!(list = make_empty_list())) + if (!(list = make_empty_list(ctx))) { hlsl_free_instr(node); return NULL; @@ -1112,13 +1112,13 @@ static struct hlsl_ir_expr *add_expr(struct hlsl_ctx *ctx, struct list *instrs, "Implicit truncation of %s type.", operands[i]->data_type->type == HLSL_CLASS_VECTOR ? "vector" : "matrix");
- if (!(cast = hlsl_new_cast(operands[i], type, &operands[i]->loc))) + if (!(cast = hlsl_new_cast(ctx, operands[i], type, &operands[i]->loc))) return NULL; list_add_after(&operands[i]->entry, &cast->node.entry); operands[i] = &cast->node; }
- if (!(expr = vkd3d_calloc(1, sizeof(*expr)))) + if (!(expr = hlsl_alloc(ctx, sizeof(*expr)))) return NULL; init_node(&expr->node, HLSL_IR_EXPR, type, *loc); expr->op = op; @@ -1229,7 +1229,7 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in return NULL; }
- if (!(store = vkd3d_malloc(sizeof(*store)))) + if (!(store = hlsl_alloc(ctx, sizeof(*store)))) return NULL;
while (lhs->type != HLSL_IR_LOAD) @@ -1283,7 +1283,7 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in /* Don't use the instruction itself as a source, as this makes structure * splitting easier. Instead copy it here. Since we retrieve sources from * the last instruction in the list, we do need to copy. */ - if (!(copy = hlsl_new_copy(rhs))) + if (!(copy = hlsl_new_copy(ctx, rhs))) return NULL; list_add_tail(instrs, ©->node.entry); return ©->node; @@ -1310,7 +1310,7 @@ static bool add_increment(struct hlsl_ctx *ctx, struct list *instrs, bool decrem { struct hlsl_ir_expr *copy;
- if (!(copy = hlsl_new_copy(lhs))) + if (!(copy = hlsl_new_copy(ctx, lhs))) return false; list_add_tail(instrs, ©->node.entry);
@@ -1357,7 +1357,7 @@ static void struct_var_initializer(struct hlsl_ctx *ctx, struct list *list, stru break; list_add_tail(list, &c->node.entry);
- if (!(store = hlsl_new_store(var, &c->node, node, 0, node->loc))) + if (!(store = hlsl_new_store(ctx, var, &c->node, node, 0, node->loc))) break; list_add_tail(list, &store->node.entry); } @@ -1391,7 +1391,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t if (basic_type->type == HLSL_CLASS_MATRIX) assert(basic_type->modifiers & HLSL_MODIFIERS_MAJORITY_MASK);
- if (!(statements_list = make_empty_list())) + if (!(statements_list = make_empty_list(ctx))) { LIST_FOR_EACH_ENTRY_SAFE(v, v_next, var_list, struct parse_variable_def, entry) free_parse_variable_def(v); @@ -1413,7 +1413,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t if (type->type != HLSL_CLASS_MATRIX) check_invalid_matrix_modifiers(ctx, modifiers, v->loc);
- if (!(var = hlsl_new_var(v->name, type, v->loc, &v->semantic, modifiers, v->reg_reservation))) + if (!(var = hlsl_new_var(ctx, v->name, type, v->loc, &v->semantic, modifiers, v->reg_reservation))) { free_parse_variable_def(v); continue; @@ -1538,7 +1538,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t continue; }
- load = hlsl_new_var_load(var, var->loc); + load = hlsl_new_var_load(ctx, var, var->loc); list_add_tail(v->initializer.instrs, &load->node.entry); add_assignment(ctx, v->initializer.instrs, &load->node, ASSIGN_OP_ASSIGN, v->initializer.args[0]); vkd3d_free(v->initializer.args); @@ -1800,7 +1800,7 @@ hlsl_prog: } }
- hlsl_add_function(&ctx->functions, $2.name, $2.decl, false); + hlsl_add_function(ctx, $2.name, $2.decl, false); } | hlsl_prog declaration_statement { @@ -1893,7 +1893,7 @@ any_identifier: fields_list: %empty { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; } | fields_list field @@ -1996,7 +1996,7 @@ func_prototype: compound_statement: '{' '}' { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; } | '{' scope_start statement_list '}' @@ -2048,7 +2048,7 @@ semantic: register_opt: ':' KW_REGISTER '(' any_identifier ')' { - $$ = parse_reg_reservation($4); + $$ = parse_reg_reservation(ctx, $4); vkd3d_free($4); } | ':' KW_REGISTER '(' any_identifier ',' any_identifier ')' @@ -2056,14 +2056,14 @@ register_opt: FIXME("Ignoring shader target %s in a register reservation.\n", debugstr_a($4)); vkd3d_free($4);
- $$ = parse_reg_reservation($6); + $$ = parse_reg_reservation(ctx, $6); vkd3d_free($6); }
parameters: scope_start { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; } | scope_start param_list @@ -2074,12 +2074,11 @@ parameters: param_list: parameter { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; if (!add_func_parameter(ctx, $$, &$1, @1)) { ERR("Error adding function parameter %s.\n", $1.name); - ctx->failed = true; YYABORT; } } @@ -2244,7 +2243,7 @@ declaration_statement: | struct_declaration | typedef { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; }
@@ -2272,7 +2271,7 @@ typedef: type_specs: type_spec { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; list_add_head($$, &$1->entry); } @@ -2285,7 +2284,7 @@ type_specs: type_spec: any_identifier arrays { - $$ = vkd3d_calloc(1, sizeof(*$$)); + $$ = hlsl_alloc(ctx, sizeof(*$$)); $$->loc = @1; $$->name = $1; $$->arrays = $2; @@ -2312,7 +2311,7 @@ variables_def_optional: variables_def: variable_def { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; list_add_head($$, &$1->entry); } @@ -2325,7 +2324,7 @@ variables_def: variable_def: any_identifier arrays colon_attribute { - $$ = vkd3d_calloc(1, sizeof(*$$)); + $$ = hlsl_alloc(ctx, sizeof(*$$)); $$->loc = @1; $$->name = $1; $$->arrays = $2; @@ -2334,7 +2333,7 @@ variable_def: } | any_identifier arrays colon_attribute '=' complex_initializer { - $$ = vkd3d_calloc(1, sizeof(*$$)); + $$ = hlsl_alloc(ctx, sizeof(*$$)); $$->loc = @1; $$->name = $1; $$->arrays = $2; @@ -2437,7 +2436,7 @@ complex_initializer: initializer_expr { $$.args_count = 1; - if (!($$.args = vkd3d_malloc(sizeof(*$$.args)))) + if (!($$.args = hlsl_alloc(ctx, sizeof(*$$.args)))) YYABORT; $$.args[0] = node_from_list($1); $$.instrs = $1; @@ -2458,7 +2457,7 @@ initializer_expr_list: initializer_expr { $$.args_count = 1; - if (!($$.args = vkd3d_malloc(sizeof(*$$.args)))) + if (!($$.args = hlsl_alloc(ctx, sizeof(*$$.args)))) YYABORT; $$.args[0] = node_from_list($1); $$.instrs = $1; @@ -2509,7 +2508,7 @@ jump_statement: } | KW_RETURN ';' { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; if (!add_return(ctx, $$, NULL, @1)) YYABORT; @@ -2521,7 +2520,7 @@ selection_statement: struct hlsl_ir_node *condition = node_from_list($3); struct hlsl_ir_if *instr;
- if (!(instr = hlsl_new_if(condition, @1))) + if (!(instr = hlsl_new_if(ctx, condition, @1))) YYABORT; list_move_tail(&instr->then_instrs, $5.then_instrs); list_move_tail(&instr->else_instrs, $5.else_instrs); @@ -2555,27 +2554,27 @@ if_body: loop_statement: KW_WHILE '(' expr ')' statement { - $$ = create_loop(LOOP_WHILE, NULL, $3, NULL, $5, @1); + $$ = create_loop(ctx, LOOP_WHILE, NULL, $3, NULL, $5, @1); } | KW_DO statement KW_WHILE '(' expr ')' ';' { - $$ = create_loop(LOOP_DO_WHILE, NULL, $5, NULL, $2, @1); + $$ = create_loop(ctx, LOOP_DO_WHILE, NULL, $5, NULL, $2, @1); } | KW_FOR '(' scope_start expr_statement expr_statement expr ')' statement { - $$ = create_loop(LOOP_FOR, $4, $5, $6, $8, @1); + $$ = create_loop(ctx, LOOP_FOR, $4, $5, $6, $8, @1); hlsl_pop_scope(ctx); } | KW_FOR '(' scope_start declaration expr_statement expr ')' statement { - $$ = create_loop(LOOP_FOR, $4, $5, $6, $8, @1); + $$ = create_loop(ctx, LOOP_FOR, $4, $5, $6, $8, @1); hlsl_pop_scope(ctx); }
expr_statement: ';' { - if (!($$ = make_empty_list())) + if (!($$ = make_empty_list(ctx))) YYABORT; } | expr ';' @@ -2588,33 +2587,33 @@ primary_expr: { struct hlsl_ir_constant *c;
- if (!(c = vkd3d_malloc(sizeof(*c)))) + if (!(c = hlsl_alloc(ctx, sizeof(*c)))) YYABORT; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_FLOAT], @1); c->value.f[0] = $1; - if (!($$ = make_list(&c->node))) + if (!($$ = make_list(ctx, &c->node))) YYABORT; } | C_INTEGER { struct hlsl_ir_constant *c;
- if (!(c = vkd3d_malloc(sizeof(*c)))) + if (!(c = hlsl_alloc(ctx, sizeof(*c)))) YYABORT; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_INT], @1); c->value.i[0] = $1; - if (!($$ = make_list(&c->node))) + if (!($$ = make_list(ctx, &c->node))) YYABORT; } | boolean { struct hlsl_ir_constant *c;
- if (!(c = vkd3d_malloc(sizeof(*c)))) + if (!(c = hlsl_alloc(ctx, sizeof(*c)))) YYABORT; init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_BOOL], @1); c->value.b[0] = $1; - if (!($$ = make_list(&c->node))) + if (!($$ = make_list(ctx, &c->node))) YYABORT; } | VAR_IDENTIFIER @@ -2627,9 +2626,9 @@ primary_expr: hlsl_error(ctx, @1, VKD3D_SHADER_ERROR_HLSL_NOT_DEFINED, "Variable "%s" is not defined.", $1); YYABORT; } - if ((load = hlsl_new_var_load(var, @1))) + if ((load = hlsl_new_var_load(ctx, var, @1))) { - if (!($$ = make_list(&load->node))) + if (!($$ = make_list(ctx, &load->node))) YYABORT; } else @@ -2711,7 +2710,7 @@ postfix_expr: YYABORT; }
- if (!(cast = hlsl_new_cast(index, ctx->builtin_types.scalar[HLSL_TYPE_UINT], &index->loc))) + if (!(cast = hlsl_new_cast(ctx, index, ctx->builtin_types.scalar[HLSL_TYPE_UINT], &index->loc))) { hlsl_free_instr_list($1); YYABORT; @@ -2793,14 +2792,14 @@ postfix_expr: ctx->builtin_types.vector[$2->base_type][width - 1], &arg->loc))) continue;
- if (!(store = hlsl_new_store(var, NULL, arg, + if (!(store = hlsl_new_store(ctx, var, NULL, arg, ((1 << width) - 1) << writemask_offset, arg->loc))) YYABORT; writemask_offset += width; list_add_tail($4.instrs, &store->node.entry); } vkd3d_free($4.args); - if (!(load = hlsl_new_var_load(var, @2))) + if (!(load = hlsl_new_var_load(ctx, var, @2))) YYABORT; $$ = append_unop($4.instrs, &load->node); } @@ -2833,7 +2832,7 @@ unary_expr: if ($1 == UNARY_OP_PLUS) $$ = $2; else - $$ = append_unop($2, hlsl_new_unary_expr(ops[$1], node_from_list($2), @1)); + $$ = append_unop($2, hlsl_new_unary_expr(ctx, ops[$1], node_from_list($2), @1)); }
/* var_modifiers is necessary to avoid shift/reduce conflicts. */ @@ -2868,7 +2867,7 @@ unary_expr: YYABORT; }
- $$ = append_unop($6, &hlsl_new_cast(node_from_list($6), dst_type, &@3)->node); + $$ = append_unop($6, &hlsl_new_cast(ctx, node_from_list($6), dst_type, &@3)->node); }
unary_op: diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index c2cedd2a..1705529e 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -35,11 +35,8 @@ static void prepend_uniform_copy(struct hlsl_ctx *ctx, struct list *instrs, stru /* Use the synthetic name for the temp, rather than the uniform, so that we * can write the uniform name into the shader reflection data. */
- if (!(uniform = hlsl_new_var(temp->name, temp->data_type, temp->loc, NULL, 0, temp->reg_reservation))) - { - ctx->failed = true; + if (!(uniform = hlsl_new_var(ctx, temp->name, temp->data_type, temp->loc, NULL, 0, temp->reg_reservation))) return; - } list_add_before(&temp->scope_entry, &uniform->scope_entry); list_add_tail(&ctx->extern_vars, &uniform->extern_entry); uniform->is_uniform = 1; @@ -51,21 +48,15 @@ static void prepend_uniform_copy(struct hlsl_ctx *ctx, struct list *instrs, stru return; } vkd3d_string_buffer_printf(name, "<temp-%s>", temp->name); - temp->name = vkd3d_strdup(name->buffer); + temp->name = hlsl_strdup(ctx, name->buffer); vkd3d_string_buffer_release(&ctx->string_buffers, name);
- if (!(load = hlsl_new_var_load(uniform, temp->loc))) - { - ctx->failed = true; + if (!(load = hlsl_new_var_load(ctx, uniform, temp->loc))) return; - } list_add_head(instrs, &load->node.entry);
- if (!(store = hlsl_new_simple_store(temp, &load->node))) - { - ctx->failed = true; + if (!(store = hlsl_new_simple_store(ctx, temp, &load->node))) return; - } list_add_after(&load->node.entry, &store->node.entry); }
@@ -85,18 +76,16 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct list *instrs, struct return; } vkd3d_string_buffer_printf(name, "<input-%s%u>", semantic->name, semantic->index); - if (!(new_semantic.name = vkd3d_strdup(semantic->name))) + if (!(new_semantic.name = hlsl_strdup(ctx, semantic->name))) { vkd3d_string_buffer_release(&ctx->string_buffers, name); - ctx->failed = true; return; } new_semantic.index = semantic->index; - if (!(input = hlsl_new_var(vkd3d_strdup(name->buffer), type, var->loc, &new_semantic, 0, NULL))) + if (!(input = hlsl_new_var(ctx, hlsl_strdup(ctx, name->buffer), type, var->loc, &new_semantic, 0, NULL))) { vkd3d_string_buffer_release(&ctx->string_buffers, name); vkd3d_free((void *)new_semantic.name); - ctx->failed = true; return; } vkd3d_string_buffer_release(&ctx->string_buffers, name); @@ -105,25 +94,16 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct list *instrs, struct list_add_before(&var->scope_entry, &input->scope_entry); list_add_tail(&ctx->extern_vars, &input->extern_entry);
- if (!(load = hlsl_new_var_load(input, var->loc))) - { - ctx->failed = true; + if (!(load = hlsl_new_var_load(ctx, input, var->loc))) return; - } list_add_head(instrs, &load->node.entry);
if (!(offset = hlsl_new_uint_constant(ctx, field_offset * 4, var->loc))) - { - ctx->failed = true; return; - } list_add_after(&load->node.entry, &offset->node.entry);
- if (!(store = hlsl_new_store(var, &offset->node, &load->node, 0, var->loc))) - { - ctx->failed = true; + if (!(store = hlsl_new_store(ctx, var, &offset->node, &load->node, 0, var->loc))) return; - } list_add_after(&offset->node.entry, &store->node.entry); }
@@ -170,18 +150,16 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct list *instrs, struct return; } vkd3d_string_buffer_printf(name, "<output-%s%u>", semantic->name, semantic->index); - if (!(new_semantic.name = vkd3d_strdup(semantic->name))) + if (!(new_semantic.name = hlsl_strdup(ctx, semantic->name))) { vkd3d_string_buffer_release(&ctx->string_buffers, name); - ctx->failed = true; return; } new_semantic.index = semantic->index; - if (!(output = hlsl_new_var(vkd3d_strdup(name->buffer), type, var->loc, &new_semantic, 0, NULL))) + if (!(output = hlsl_new_var(ctx, hlsl_strdup(ctx, name->buffer), type, var->loc, &new_semantic, 0, NULL))) { vkd3d_free((void *)new_semantic.name); vkd3d_string_buffer_release(&ctx->string_buffers, name); - ctx->failed = true; return; } vkd3d_string_buffer_release(&ctx->string_buffers, name); @@ -191,24 +169,15 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct list *instrs, struct list_add_tail(&ctx->extern_vars, &output->extern_entry);
if (!(offset = hlsl_new_uint_constant(ctx, field_offset * 4, var->loc))) - { - ctx->failed = true; return; - } list_add_tail(instrs, &offset->node.entry);
- if (!(load = hlsl_new_load(var, &offset->node, type, var->loc))) - { - ctx->failed = true; + if (!(load = hlsl_new_load(ctx, var, &offset->node, type, var->loc))) return; - } list_add_after(&offset->node.entry, &load->node.entry);
- if (!(store = hlsl_new_store(output, NULL, &load->node, 0, var->loc))) - { - ctx->failed = true; + if (!(store = hlsl_new_store(ctx, output, NULL, &load->node, 0, var->loc))) return; - } list_add_after(&load->node.entry, &store->node.entry); }
@@ -331,47 +300,32 @@ static bool split_struct_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr struct hlsl_ir_constant *c;
if (!(c = hlsl_new_uint_constant(ctx, field->reg_offset * 4, instr->loc))) - { - ctx->failed = true; return false; - } list_add_before(&instr->entry, &c->node.entry);
offset = &c->node; if (rhs_load->src.offset.node) { - if (!(add = hlsl_new_binary_expr(HLSL_IR_BINOP_ADD, rhs_load->src.offset.node, &c->node))) - { - ctx->failed = true; + if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, rhs_load->src.offset.node, &c->node))) return false; - } list_add_before(&instr->entry, &add->entry); offset = add; } - if (!(field_load = hlsl_new_load(rhs_load->src.var, offset, field->type, instr->loc))) - { - ctx->failed = true; + if (!(field_load = hlsl_new_load(ctx, rhs_load->src.var, offset, field->type, instr->loc))) return false; - } list_add_before(&instr->entry, &field_load->node.entry);
offset = &c->node; if (store->lhs.offset.node) { - if (!(add = hlsl_new_binary_expr(HLSL_IR_BINOP_ADD, store->lhs.offset.node, &c->node))) - { - ctx->failed = true; + if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, store->lhs.offset.node, &c->node))) return false; - } list_add_before(&instr->entry, &add->entry); offset = add; }
- if (!(field_store = hlsl_new_store(store->lhs.var, offset, &field_load->node, 0, instr->loc))) - { - ctx->failed = true; + if (!(field_store = hlsl_new_store(ctx, store->lhs.var, offset, &field_load->node, 0, instr->loc))) return false; - } list_add_before(&instr->entry, &field_store->node.entry); }
@@ -402,11 +356,8 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi if (expr->operands[1].node) arg2 = hlsl_ir_constant(expr->operands[1].node);
- if (!(res = vkd3d_calloc(1, sizeof(*res)))) - { - ctx->failed = true; + if (!(res = hlsl_alloc(ctx, sizeof(*res)))) return false; - } init_node(&res->node, HLSL_IR_CONSTANT, instr->data_type, instr->loc);
switch (instr->data_type->base_type) @@ -657,11 +608,11 @@ static unsigned int get_available_writemask(struct liveness *liveness, return 0; }
-static bool resize_liveness(struct liveness *liveness, size_t new_count) +static bool resize_liveness(struct hlsl_ctx *ctx, struct liveness *liveness, size_t new_count) { size_t old_capacity = liveness->size;
- if (!vkd3d_array_reserve((void **)&liveness->regs, &liveness->size, new_count, sizeof(*liveness->regs))) + if (!hlsl_array_reserve(ctx, (void **)&liveness->regs, &liveness->size, new_count, sizeof(*liveness->regs))) return false;
if (liveness->size > old_capacity) @@ -669,7 +620,7 @@ static bool resize_liveness(struct liveness *liveness, size_t new_count) return true; }
-static struct hlsl_reg allocate_register(struct liveness *liveness, +static struct hlsl_reg allocate_register(struct hlsl_ctx *ctx, struct liveness *liveness, unsigned int first_write, unsigned int last_read, unsigned int component_count) { unsigned int component_idx, writemask, i; @@ -682,7 +633,7 @@ static struct hlsl_reg allocate_register(struct liveness *liveness, } if (component_idx == liveness->size) { - if (!resize_liveness(liveness, component_idx + 4)) + if (!resize_liveness(ctx, liveness, component_idx + 4)) return ret; writemask = (1u << component_count) - 1; } @@ -710,7 +661,7 @@ static bool is_range_available(struct liveness *liveness, unsigned int first_wri return true; }
-static struct hlsl_reg allocate_range(struct liveness *liveness, +static struct hlsl_reg allocate_range(struct hlsl_ctx *ctx, struct liveness *liveness, unsigned int first_write, unsigned int last_read, unsigned int reg_count) { const unsigned int component_count = reg_count * 4; @@ -723,7 +674,7 @@ static struct hlsl_reg allocate_range(struct liveness *liveness, min(component_count, liveness->size - component_idx))) break; } - if (!resize_liveness(liveness, component_idx + component_count)) + if (!resize_liveness(ctx, liveness, component_idx + component_count)) return ret;
for (i = 0; i < component_count; ++i) @@ -741,7 +692,7 @@ static const char *debug_register(char class, struct hlsl_reg reg, const struct return vkd3d_dbg_sprintf("%c%u%s", class, reg.id, debug_hlsl_writemask(reg.writemask)); }
-static void allocate_variable_temp_register(struct hlsl_ir_var *var, struct liveness *liveness) +static void allocate_variable_temp_register(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct liveness *liveness) { if (var->is_input_semantic || var->is_output_semantic || var->is_uniform) return; @@ -749,17 +700,17 @@ static void allocate_variable_temp_register(struct hlsl_ir_var *var, struct live if (!var->reg.allocated && var->last_read) { if (var->data_type->reg_size > 1) - var->reg = allocate_range(liveness, var->first_write, + var->reg = allocate_range(ctx, liveness, var->first_write, var->last_read, var->data_type->reg_size); else - var->reg = allocate_register(liveness, var->first_write, + var->reg = allocate_register(ctx, liveness, var->first_write, var->last_read, var->data_type->dimx); TRACE("Allocated %s to %s (liveness %u-%u).\n", var->name, debug_register('r', var->reg, var->data_type), var->first_write, var->last_read); } }
-static void allocate_temp_registers_recurse(struct list *instrs, struct liveness *liveness) +static void allocate_temp_registers_recurse(struct hlsl_ctx *ctx, struct list *instrs, struct liveness *liveness) { struct hlsl_ir_node *instr;
@@ -768,10 +719,10 @@ static void allocate_temp_registers_recurse(struct list *instrs, struct liveness if (!instr->reg.allocated && instr->last_read) { if (instr->data_type->reg_size > 1) - instr->reg = allocate_range(liveness, instr->index, + instr->reg = allocate_range(ctx, liveness, instr->index, instr->last_read, instr->data_type->reg_size); else - instr->reg = allocate_register(liveness, instr->index, + instr->reg = allocate_register(ctx, liveness, instr->index, instr->last_read, instr->data_type->dimx); TRACE("Allocated anonymous expression @%u to %s (liveness %u-%u).\n", instr->index, debug_register('r', instr->reg, instr->data_type), instr->index, instr->last_read); @@ -782,8 +733,8 @@ static void allocate_temp_registers_recurse(struct list *instrs, struct liveness case HLSL_IR_IF: { struct hlsl_ir_if *iff = hlsl_ir_if(instr); - allocate_temp_registers_recurse(&iff->then_instrs, liveness); - allocate_temp_registers_recurse(&iff->else_instrs, liveness); + allocate_temp_registers_recurse(ctx, &iff->then_instrs, liveness); + allocate_temp_registers_recurse(ctx, &iff->else_instrs, liveness); break; }
@@ -792,21 +743,21 @@ static void allocate_temp_registers_recurse(struct list *instrs, struct liveness struct hlsl_ir_load *load = hlsl_ir_load(instr); /* We need to at least allocate a variable for undefs. * FIXME: We should probably find a way to remove them instead. */ - allocate_variable_temp_register(load->src.var, liveness); + allocate_variable_temp_register(ctx, load->src.var, liveness); break; }
case HLSL_IR_LOOP: { struct hlsl_ir_loop *loop = hlsl_ir_loop(instr); - allocate_temp_registers_recurse(&loop->body, liveness); + allocate_temp_registers_recurse(ctx, &loop->body, liveness); break; }
case HLSL_IR_STORE: { struct hlsl_ir_store *store = hlsl_ir_store(instr); - allocate_variable_temp_register(store->lhs.var, liveness); + allocate_variable_temp_register(ctx, store->lhs.var, liveness); break; }
@@ -833,17 +784,14 @@ static void allocate_const_registers_recurse(struct hlsl_ctx *ctx, struct list * unsigned int x, y, i, writemask;
if (reg_size > 1) - constant->reg = allocate_range(liveness, 1, UINT_MAX, reg_size); + constant->reg = allocate_range(ctx, liveness, 1, UINT_MAX, reg_size); else - constant->reg = allocate_register(liveness, 1, UINT_MAX, type->dimx); + constant->reg = allocate_register(ctx, liveness, 1, UINT_MAX, type->dimx); TRACE("Allocated constant @%u to %s.\n", instr->index, debug_register('c', constant->reg, type));
- if (!vkd3d_array_reserve((void **)&defs->values, &defs->size, + if (!hlsl_array_reserve(ctx, (void **)&defs->values, &defs->size, constant->reg.id + reg_size, sizeof(*defs->values))) - { - ctx->failed = true; return; - } defs->count = max(defs->count, constant->reg.id + reg_size);
assert(type->type <= HLSL_CLASS_LAST_NUMERIC); @@ -927,10 +875,10 @@ static void allocate_const_registers(struct hlsl_ctx *ctx, struct hlsl_ir_functi if (var->is_uniform && var->last_read) { if (var->data_type->reg_size > 1) - var->reg = allocate_range(&liveness, 1, UINT_MAX, var->data_type->reg_size); + var->reg = allocate_range(ctx, &liveness, 1, UINT_MAX, var->data_type->reg_size); else { - var->reg = allocate_register(&liveness, 1, UINT_MAX, 4); + var->reg = allocate_register(ctx, &liveness, 1, UINT_MAX, 4); var->reg.writemask = (1u << var->data_type->dimx) - 1; } TRACE("Allocated %s to %s.\n", var->name, debug_register('c', var->reg, var->data_type)); @@ -942,10 +890,10 @@ static void allocate_const_registers(struct hlsl_ctx *ctx, struct hlsl_ir_functi * index to all (simultaneously live) variables or intermediate values. Agnostic * as to how many registers are actually available for the current backend, and * does not handle constants. */ -static void allocate_temp_registers(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}; - allocate_temp_registers_recurse(entry_func->body, &liveness); + allocate_temp_registers_recurse(ctx, entry_func->body, &liveness); }
static bool sm1_register_from_semantic(struct hlsl_ctx *ctx, const struct hlsl_semantic *semantic, bool output, @@ -1216,6 +1164,7 @@ static struct hlsl_reg hlsl_reg_from_deref(const struct hlsl_deref *deref, const
struct bytecode_buffer { + struct hlsl_ctx *ctx; uint32_t *data; size_t count, size; int status; @@ -1229,7 +1178,8 @@ static unsigned int put_dword(struct bytecode_buffer *buffer, uint32_t value) if (buffer->status) return index;
- if (!vkd3d_array_reserve((void **)&buffer->data, &buffer->size, buffer->count + 1, sizeof(*buffer->data))) + if (!hlsl_array_reserve(buffer->ctx, (void **)&buffer->data, &buffer->size, + buffer->count + 1, sizeof(*buffer->data))) { buffer->status = VKD3D_ERROR_OUT_OF_MEMORY; return index; @@ -1270,7 +1220,8 @@ static unsigned int put_string(struct bytecode_buffer *buffer, const char *str) if (buffer->status) return index;
- if (!vkd3d_array_reserve((void **)&buffer->data, &buffer->size, buffer->count + token_count, sizeof(*buffer->data))) + if (!hlsl_array_reserve(buffer->ctx, (void **)&buffer->data, &buffer->size, + buffer->count + token_count, sizeof(*buffer->data))) { buffer->status = E_OUTOFMEMORY; return index; @@ -1478,7 +1429,7 @@ static void write_sm1_uniforms(struct hlsl_ctx *ctx, struct bytecode_buffer *buf } vkd3d_string_buffer_printf(name, "$%s", var->name); vkd3d_free((char *)var->name); - var->name = vkd3d_strdup(name->buffer); + var->name = hlsl_strdup(ctx, name->buffer); vkd3d_string_buffer_release(&ctx->string_buffers, name); } } @@ -1936,7 +1887,7 @@ static void write_sm1_instructions(struct hlsl_ctx *ctx, struct bytecode_buffer static int write_sm1_shader(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func, struct vkd3d_shader_code *out) { - struct bytecode_buffer buffer = {0}; + struct bytecode_buffer buffer = {.ctx = ctx}; int ret;
put_dword(&buffer, sm1_version(ctx->profile->type, ctx->profile->major_version, ctx->profile->minor_version)); @@ -2018,7 +1969,7 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun if (TRACE_ON()) rb_for_each_entry(&ctx->functions, dump_function, NULL);
- allocate_temp_registers(entry_func); + allocate_temp_registers(ctx, entry_func); if (ctx->profile->major_version < 4) allocate_const_registers(ctx, entry_func); allocate_semantic_registers(ctx);