Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2021
- 82 participants
- 607 discussions
11 Jun '21
To automatically put the compilation context in a failed state.
Signed-off-by: Zebediah Figura <zfigura(a)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);
--
2.31.1
4
15
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
programs/wordpad/wordpad.manifest | 16 ++++++++++++++++
programs/wordpad/wordpad.rc | 3 +++
2 files changed, 19 insertions(+)
create mode 100644 programs/wordpad/wordpad.manifest
diff --git a/programs/wordpad/wordpad.manifest b/programs/wordpad/wordpad.manifest
new file mode 100644
index 00000000000..51fb21fa97d
--- /dev/null
+++ b/programs/wordpad/wordpad.manifest
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity type="win32" name="Wine.Wordpad" version="0.0.0.0"/>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+</assembly>
diff --git a/programs/wordpad/wordpad.rc b/programs/wordpad/wordpad.rc
index abf9ed9c50a..324b6d06d53 100644
--- a/programs/wordpad/wordpad.rc
+++ b/programs/wordpad/wordpad.rc
@@ -301,6 +301,9 @@ END
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+/* @makedep: wordpad.manifest */
+1 RT_MANIFEST wordpad.manifest
+
/* @makedep: toolbar.bmp */
IDB_TOOLBAR BITMAP "toolbar.bmp"
--
2.30.2
1
0
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
programs/winver/Makefile.in | 2 +-
programs/winver/version.rc | 5 +++++
programs/winver/winver.c | 3 +++
programs/winver/winver.manifest | 16 ++++++++++++++++
4 files changed, 25 insertions(+), 1 deletion(-)
create mode 100644 programs/winver/winver.manifest
diff --git a/programs/winver/Makefile.in b/programs/winver/Makefile.in
index 0caef713865..8f74ab774df 100644
--- a/programs/winver/Makefile.in
+++ b/programs/winver/Makefile.in
@@ -1,5 +1,5 @@
MODULE = winver.exe
-IMPORTS = shell32
+IMPORTS = shell32 comctl32
EXTRADLLFLAGS = -mwindows -mno-cygwin
diff --git a/programs/winver/version.rc b/programs/winver/version.rc
index ae042fb82a0..c079dde644a 100644
--- a/programs/winver/version.rc
+++ b/programs/winver/version.rc
@@ -15,6 +15,8 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include <windef.h>
+#include <winuser.h>
#define WINE_FILEDESCRIPTION_STR "Windows Version"
#define WINE_FILENAME_STR "winver.exe"
@@ -25,3 +27,6 @@
#define WINE_PRODUCTVERSION_STR "5.1.2600.0"
#include "wine/wine_common_ver.rc"
+
+/* @makedep: winver.manifest */
+1 RT_MANIFEST winver.manifest
diff --git a/programs/winver/winver.c b/programs/winver/winver.c
index 019eb5248b2..ee3120443eb 100644
--- a/programs/winver/winver.c
+++ b/programs/winver/winver.c
@@ -19,6 +19,7 @@
*/
#include "windows.h"
+#include "commctrl.h"
#include "shellapi.h"
int PASCAL WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
@@ -26,6 +27,8 @@ int PASCAL WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
char name[128] = "Wine ";
const char * (CDECL *wine_get_version)(void);
+ InitCommonControls();
+
wine_get_version = (void *)GetProcAddress( GetModuleHandleA("ntdll.dll"), "wine_get_version" );
if (wine_get_version) strcat( name, wine_get_version() );
return !ShellAboutA( NULL, name, NULL, 0 );
diff --git a/programs/winver/winver.manifest b/programs/winver/winver.manifest
new file mode 100644
index 00000000000..519bd175c19
--- /dev/null
+++ b/programs/winver/winver.manifest
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity type="win32" name="Wine.Winver" version="0.0.0.0"/>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+</assembly>
--
2.30.2
1
0
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
programs/winevdm/Makefile.in | 4 +++-
programs/winevdm/winevdm.c | 3 +++
programs/winevdm/winevdm.manifest | 16 ++++++++++++++++
programs/winevdm/winevdm.rc | 25 +++++++++++++++++++++++++
4 files changed, 47 insertions(+), 1 deletion(-)
create mode 100644 programs/winevdm/winevdm.manifest
create mode 100644 programs/winevdm/winevdm.rc
diff --git a/programs/winevdm/Makefile.in b/programs/winevdm/Makefile.in
index 0ea89f4b0de..c841f3c4d46 100644
--- a/programs/winevdm/Makefile.in
+++ b/programs/winevdm/Makefile.in
@@ -1,6 +1,8 @@
MODULE = winevdm.exe
APPMODE = -mwindows
-IMPORTS = user32 kernel
+IMPORTS = user32 kernel comctl32
C_SRCS = \
winevdm.c
+
+RC_SRCS = winevdm.rc
diff --git a/programs/winevdm/winevdm.c b/programs/winevdm/winevdm.c
index 0a43e579793..1ab91f41d66 100644
--- a/programs/winevdm/winevdm.c
+++ b/programs/winevdm/winevdm.c
@@ -30,6 +30,7 @@
#include "wine/winbase16.h"
#include "winuser.h"
#include "wincon.h"
+#include "commctrl.h"
#include "wine/unicode.h"
#include "wine/debug.h"
@@ -504,6 +505,8 @@ int main( int argc, char *argv[] )
char *cmdline, *appname, **first_arg;
char *p;
+ InitCommonControls();
+
if (!argv[1]) usage();
if (!strcmp( argv[1], "--app-name" ))
diff --git a/programs/winevdm/winevdm.manifest b/programs/winevdm/winevdm.manifest
new file mode 100644
index 00000000000..9634ec55524
--- /dev/null
+++ b/programs/winevdm/winevdm.manifest
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity type="win32" name="Wine.Winevdm" version="0.0.0.0"/>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+</assembly>
diff --git a/programs/winevdm/winevdm.rc b/programs/winevdm/winevdm.rc
new file mode 100644
index 00000000000..5ccf9e47151
--- /dev/null
+++ b/programs/winevdm/winevdm.rc
@@ -0,0 +1,25 @@
+/*
+ * Winevdm resources
+ *
+ * Copyright 2021 Zhiyi Zhang for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <windef.h>
+#include <winuser.h>
+
+/* @makedep: winevdm.manifest */
+1 RT_MANIFEST winevdm.manifest
--
2.30.2
1
0
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
programs/winemine/Makefile.in | 2 +-
programs/winemine/main.c | 3 +++
programs/winemine/winemine.manifest | 16 ++++++++++++++++
programs/winemine/winemine.rc | 3 +++
4 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 programs/winemine/winemine.manifest
diff --git a/programs/winemine/Makefile.in b/programs/winemine/Makefile.in
index 8f5aebd9645..5ae0eaf2c62 100644
--- a/programs/winemine/Makefile.in
+++ b/programs/winemine/Makefile.in
@@ -1,5 +1,5 @@
MODULE = winemine.exe
-IMPORTS = user32 gdi32 advapi32
+IMPORTS = user32 gdi32 advapi32 comctl32
DELAYIMPORTS = shell32
EXTRADLLFLAGS = -mwindows -municode -mno-cygwin
diff --git a/programs/winemine/main.c b/programs/winemine/main.c
index 37ce1927047..cd0763042d3 100644
--- a/programs/winemine/main.c
+++ b/programs/winemine/main.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <time.h>
#include <windows.h>
+#include <commctrl.h>
#include <stdlib.h>
#include <shellapi.h>
#include "main.h"
@@ -1012,6 +1013,8 @@ int WINAPI wWinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int c
HACCEL haccel;
WCHAR appname[20];
+ InitCommonControls();
+
LoadStringW( hInst, IDS_APPNAME, appname, ARRAY_SIZE(appname));
wc.cbSize = sizeof(wc);
diff --git a/programs/winemine/winemine.manifest b/programs/winemine/winemine.manifest
new file mode 100644
index 00000000000..8850b090e37
--- /dev/null
+++ b/programs/winemine/winemine.manifest
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity type="win32" name="Wine.Winemine" version="0.0.0.0"/>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+</assembly>
diff --git a/programs/winemine/winemine.rc b/programs/winemine/winemine.rc
index 5bbd68247b8..1e1bdeae5bc 100644
--- a/programs/winemine/winemine.rc
+++ b/programs/winemine/winemine.rc
@@ -105,6 +105,9 @@ IDA_WINEMINE ACCELERATORS
LANGUAGE LANG_NEUTRAL,SUBLANG_NEUTRAL
+/* @makedep: winemine.manifest */
+1 RT_MANIFEST winemine.manifest
+
/* @makedep: winemine.ico */
IDI_WINEMINE ICON winemine.ico
--
2.30.2
1
0
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
programs/winefile/winefile.manifest | 16 ++++++++++++++++
programs/winefile/winefile.rc | 3 +++
2 files changed, 19 insertions(+)
create mode 100644 programs/winefile/winefile.manifest
diff --git a/programs/winefile/winefile.manifest b/programs/winefile/winefile.manifest
new file mode 100644
index 00000000000..4ebd48c8933
--- /dev/null
+++ b/programs/winefile/winefile.manifest
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity type="win32" name="Wine.Winefile" version="0.0.0.0"/>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+</assembly>
diff --git a/programs/winefile/winefile.rc b/programs/winefile/winefile.rc
index 4420019ec56..8d0f9940787 100644
--- a/programs/winefile/winefile.rc
+++ b/programs/winefile/winefile.rc
@@ -195,6 +195,9 @@ IDA_WINEFILE ACCELERATORS
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+/* @makedep: winefile.manifest */
+1 RT_MANIFEST winefile.manifest
+
/* @makedep: winefile.ico */
IDI_WINEFILE ICON winefile.ico
--
2.30.2
1
0
[PATCH 1/6] server: Do not return the socket state from get_socket_event.
by Zebediah Figura 11 Jun '21
by Zebediah Figura 11 Jun '21
11 Jun '21
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
server/protocol.def | 1 -
server/sock.c | 1 -
2 files changed, 2 deletions(-)
diff --git a/server/protocol.def b/server/protocol.def
index 30624a7cbaf..3609261b848 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1441,7 +1441,6 @@ enum server_fd_type
@REPLY
unsigned int mask; /* event mask */
unsigned int pmask; /* pending events */
- unsigned int state; /* status bits */
VARARG(errors,ints); /* event errors */
@END
diff --git a/server/sock.c b/server/sock.c
index b4649abbf08..bbd82d57bd5 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -2376,7 +2376,6 @@ DECL_HANDLER(get_socket_event)
if (get_unix_fd( sock->fd ) == -1) return;
reply->mask = sock->mask;
reply->pmask = sock->pending_events;
- reply->state = sock->state;
set_reply_data( sock->errors, min( get_reply_max_size(), sizeof(sock->errors) ));
if (req->service)
--
2.30.2
1
5
[PATCH v7 1/4] winevulkan: Support use of extensions which mustn't be exposed.
by Derek Lesho 10 Jun '21
by Derek Lesho 10 Jun '21
10 Jun '21
Signed-off-by: Derek Lesho <dlesho(a)codeweavers.com>
---
v7: Fixed typo whereupon the presence the of the is_required method was checked, rather than the return value.
---
dlls/winevulkan/make_vulkan | 35 ++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 7f76d328fc8..34dd9fc432f 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -120,6 +120,11 @@ UNSUPPORTED_EXTENSIONS = [
"VK_NV_external_memory_win32",
]
+# Either internal extensions which aren't present on the win32 platform which
+# winevulkan may nonetheless use, or extensions we want to generate headers for
+# but not expose to applications (useful for test commits)
+UNEXPOSED_EXTENSIONS = {}
+
# The Vulkan loader provides entry-points for core functionality and important
# extensions. Based on vulkan-1.def this amounts to WSI extensions on 1.0.51.
CORE_EXTENSIONS = [
@@ -521,8 +526,8 @@ class VkEnumValue(object):
class VkFunction(object):
- def __init__(self, _type=None, name=None, params=[], extensions=[], alias=None):
- self.extensions = []
+ def __init__(self, _type=None, name=None, params=[], alias=None):
+ self.extensions = set()
self.name = name
self.type = _type
self.params = params
@@ -665,6 +670,10 @@ class VkFunction(object):
def needs_private_thunk(self):
return self.thunk_type == ThunkType.PRIVATE
+ def needs_exposing(self):
+ # The function needs exposed if at-least one extension isn't both UNSUPPORTED and UNEXPOSED
+ return self.is_required() and (not self.extensions or not self.extensions.issubset(UNEXPOSED_EXTENSIONS))
+
def pfn(self, prefix="p", call_conv=None, conv=False):
""" Create function pointer. """
@@ -2653,7 +2662,7 @@ class VkGenerator(object):
# Create thunks for instance and device functions.
# Global functions don't go through the thunks.
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.is_global_func():
@@ -2676,6 +2685,8 @@ class VkGenerator(object):
for ext in self.registry.extensions:
if ext["type"] != "device":
continue
+ if ext["name"] in UNEXPOSED_EXTENSIONS:
+ continue
f.write(" \"{0}\",\n".format(ext["name"]))
f.write("};\n\n")
@@ -2685,6 +2696,8 @@ class VkGenerator(object):
for ext in self.registry.extensions:
if ext["type"] != "instance":
continue
+ if ext["name"] in UNEXPOSED_EXTENSIONS:
+ continue
f.write(" \"{0}\",\n".format(ext["name"]))
f.write("};\n\n")
@@ -2744,7 +2757,7 @@ class VkGenerator(object):
f.write("const struct unix_funcs loader_funcs =\n")
f.write("{\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.loader_thunk_type == ThunkType.NONE:
continue
@@ -2763,7 +2776,7 @@ class VkGenerator(object):
# Generate prototypes for device and instance functions requiring a custom implementation.
f.write("/* Functions for which we have custom implementations outside of the thunks. */\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.needs_thunk() and not vk_func.needs_private_thunk():
continue
@@ -2872,7 +2885,7 @@ class VkGenerator(object):
f.write("WINE_DEFAULT_DEBUG_CHANNEL(vulkan);\n\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.loader_thunk_type != ThunkType.PUBLIC:
continue
@@ -2881,7 +2894,7 @@ class VkGenerator(object):
f.write("static const struct vulkan_func vk_device_dispatch_table[] =\n{\n")
for vk_func in self.registry.device_funcs:
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
f.write(" {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2889,7 +2902,7 @@ class VkGenerator(object):
f.write("static const struct vulkan_func vk_phys_dev_dispatch_table[] =\n{\n")
for vk_func in self.registry.phys_dev_funcs:
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
f.write(" {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2897,7 +2910,7 @@ class VkGenerator(object):
f.write("static const struct vulkan_func vk_instance_dispatch_table[] =\n{\n")
for vk_func in self.registry.instance_funcs:
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
f.write(" {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2954,7 +2967,7 @@ class VkGenerator(object):
f.write("struct unix_funcs\n")
f.write("{\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.loader_thunk_type == ThunkType.NONE:
continue
@@ -3447,7 +3460,7 @@ class VkRegistry(object):
# the XML file to handle this, but because of the manner in which we parse the XML
# file we pre-populate from <commands> before we check if a command is enabled.
if cmd_name in self.funcs:
- self.funcs[cmd_name].extensions.append(ext_name)
+ self.funcs[cmd_name].extensions.add(ext_name)
# Some extensions are not ready or have numbers reserved as a place holder.
if ext.attrib["supported"] == "disabled":
--
2.31.1
4
18
[PATCH 1/5] ws2_32/tests: Add more tests for calling functions on a connecting socket.
by Zebediah Figura 10 Jun '21
by Zebediah Figura 10 Jun '21
10 Jun '21
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/ws2_32/tests/sock.c | 73 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index d9cb629caa4..6cfdced79dc 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -10219,25 +10219,51 @@ static void test_bind(void)
/* Test calling methods on a socket which is currently connecting. */
static void test_connecting_socket(void)
{
+ const struct sockaddr_in bind_addr = {.sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_ANY)};
const struct sockaddr_in invalid_addr =
{
.sin_family = AF_INET,
.sin_addr.s_addr = inet_addr("192.0.2.0"),
.sin_port = 255
};
+ OVERLAPPED overlapped = {0}, overlapped2 = {0};
+ GUID connectex_guid = WSAID_CONNECTEX;
+ LPFN_CONNECTEX pConnectEx;
struct sockaddr_in addr;
char buffer[4];
SOCKET client;
int ret, len;
+ DWORD size;
client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ok(client != -1, "failed to create socket, error %u\n", WSAGetLastError());
set_blocking(client, FALSE);
+ ret = bind(client, (const struct sockaddr *)&bind_addr, sizeof(bind_addr));
+ ok(!ret, "expected success\n");
+ ok(!WSAGetLastError(), "got %u\n", WSAGetLastError());
+
ret = connect(client, (struct sockaddr *)&invalid_addr, sizeof(invalid_addr));
ok(ret == -1, "got %d\n", ret);
ok(WSAGetLastError() == WSAEWOULDBLOCK, "got %u\n", WSAGetLastError());
+ /* Mortal Kombat 11 connects to the same address twice and expects the
+ * second to return WSAEALREADY. */
+ ret = connect(client, (struct sockaddr *)&invalid_addr, sizeof(invalid_addr));
+ ok(ret == -1, "got %d\n", ret);
+ todo_wine ok(WSAGetLastError() == WSAEALREADY, "got %u\n", WSAGetLastError());
+
+ ret = WSAIoctl(client, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectex_guid, sizeof(connectex_guid),
+ &pConnectEx, sizeof(pConnectEx), &size, NULL, NULL);
+ ok(!ret, "failed to get ConnectEx, error %u\n", WSAGetLastError());
+ overlapped.Internal = 0xdeadbeef;
+ overlapped.InternalHigh = 0xdeadbeef;
+ ret = pConnectEx(client, (struct sockaddr *)&invalid_addr, sizeof(invalid_addr), NULL, 0, &size, &overlapped);
+ ok(!ret, "got %d\n", ret);
+ todo_wine ok(WSAGetLastError() == WSAEINVAL, "got %u\n", WSAGetLastError());
+ ok((NTSTATUS)overlapped.Internal == STATUS_PENDING, "got status %#x\n", (NTSTATUS)overlapped.Internal);
+ todo_wine ok(overlapped.InternalHigh == 0xdeadbeef, "got size %Iu\n", overlapped.InternalHigh);
+
len = sizeof(addr);
ret = getsockname(client, (struct sockaddr *)&addr, &len);
ok(!ret, "got error %u\n", WSAGetLastError());
@@ -10263,6 +10289,53 @@ static void test_connecting_socket(void)
todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got %u\n", WSAGetLastError());
closesocket(client);
+
+ /* Test with ConnectEx(). */
+
+ client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ ok(client != -1, "failed to create socket, error %u\n", WSAGetLastError());
+ set_blocking(client, FALSE);
+
+ ret = bind(client, (const struct sockaddr *)&bind_addr, sizeof(bind_addr));
+ ok(!ret, "expected success\n");
+ ok(!WSAGetLastError(), "got %u\n", WSAGetLastError());
+
+ ret = pConnectEx(client, (struct sockaddr *)&invalid_addr, sizeof(invalid_addr), NULL, 0, &size, &overlapped2);
+ ok(!ret, "got %d\n", ret);
+ ok(WSAGetLastError() == ERROR_IO_PENDING, "got error %u\n", WSAGetLastError());
+
+ ret = connect(client, (struct sockaddr *)&invalid_addr, sizeof(invalid_addr));
+ ok(ret == -1, "got %d\n", ret);
+ ok(WSAGetLastError() == WSAEINVAL, "got %u\n", WSAGetLastError());
+
+ overlapped.Internal = 0xdeadbeef;
+ overlapped.InternalHigh = 0xdeadbeef;
+ ret = pConnectEx(client, (struct sockaddr *)&invalid_addr, sizeof(invalid_addr), NULL, 0, &size, &overlapped);
+ ok(!ret, "got %d\n", ret);
+ todo_wine ok(WSAGetLastError() == WSAEINVAL, "got %u\n", WSAGetLastError());
+ ok((NTSTATUS)overlapped.Internal == STATUS_PENDING, "got status %#x\n", (NTSTATUS)overlapped.Internal);
+ todo_wine ok(overlapped.InternalHigh == 0xdeadbeef, "got size %Iu\n", overlapped.InternalHigh);
+
+ len = sizeof(addr);
+ ret = getsockname(client, (struct sockaddr *)&addr, &len);
+ ok(!ret, "got error %u\n", WSAGetLastError());
+ ok(addr.sin_family == AF_INET, "got family %u\n", addr.sin_family);
+ ok(addr.sin_port, "expected nonzero port\n");
+
+ len = sizeof(addr);
+ ret = getpeername(client, (struct sockaddr *)&addr, &len);
+ ok(ret == -1, "got %d\n", ret);
+ ok(WSAGetLastError() == WSAENOTCONN, "got %u\n", WSAGetLastError());
+
+ ret = recv(client, buffer, sizeof(buffer), 0);
+ ok(ret == -1, "got %d\n", ret);
+ todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got %u\n", WSAGetLastError());
+
+ ret = send(client, "data", 5, 0);
+ ok(ret == -1, "got %d\n", ret);
+ todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got %u\n", WSAGetLastError());
+
+ closesocket(client);
}
static DWORD map_status( NTSTATUS status )
--
2.30.2
2
6
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msvcrt/math.c | 177 ++++++++++++++++++++++++++++++++++++++++--
dlls/msvcrt/unixlib.c | 9 ---
dlls/msvcrt/unixlib.h | 1 -
3 files changed, 171 insertions(+), 16 deletions(-)
1
0