mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/hlsl: Pull evaluate_static_expression_as_uint() upwards.
This commit is contained in:
parent
50e28f70ed
commit
323f53bd7d
Notes:
Henri Verbeet
2024-07-11 00:40:50 +02:00
Approved-by: Elizabeth Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/786
@ -573,6 +573,84 @@ static void check_loop_attributes(struct hlsl_ctx *ctx, const struct parse_attri
|
|||||||
hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX, "Unroll attribute can't be used with 'fastopt' attribute.");
|
hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX, "Unroll attribute can't be used with 'fastopt' attribute.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static union hlsl_constant_value_component evaluate_static_expression(struct hlsl_ctx *ctx,
|
||||||
|
struct hlsl_block *block, struct hlsl_type *dst_type, const struct vkd3d_shader_location *loc)
|
||||||
|
{
|
||||||
|
union hlsl_constant_value_component ret = {0};
|
||||||
|
struct hlsl_ir_constant *constant;
|
||||||
|
struct hlsl_ir_node *node;
|
||||||
|
struct hlsl_block expr;
|
||||||
|
struct hlsl_src src;
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY(node, &block->instrs, struct hlsl_ir_node, entry)
|
||||||
|
{
|
||||||
|
switch (node->type)
|
||||||
|
{
|
||||||
|
case HLSL_IR_CONSTANT:
|
||||||
|
case HLSL_IR_EXPR:
|
||||||
|
case HLSL_IR_SWIZZLE:
|
||||||
|
case HLSL_IR_LOAD:
|
||||||
|
case HLSL_IR_INDEX:
|
||||||
|
continue;
|
||||||
|
case HLSL_IR_STORE:
|
||||||
|
if (hlsl_ir_store(node)->lhs.var->is_synthetic)
|
||||||
|
break;
|
||||||
|
/* fall-through */
|
||||||
|
case HLSL_IR_CALL:
|
||||||
|
case HLSL_IR_IF:
|
||||||
|
case HLSL_IR_LOOP:
|
||||||
|
case HLSL_IR_JUMP:
|
||||||
|
case HLSL_IR_RESOURCE_LOAD:
|
||||||
|
case HLSL_IR_RESOURCE_STORE:
|
||||||
|
case HLSL_IR_SWITCH:
|
||||||
|
case HLSL_IR_STATEBLOCK_CONSTANT:
|
||||||
|
hlsl_error(ctx, &node->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX,
|
||||||
|
"Expected literal expression.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hlsl_clone_block(ctx, &expr, &ctx->static_initializers))
|
||||||
|
return ret;
|
||||||
|
hlsl_block_add_block(&expr, block);
|
||||||
|
|
||||||
|
if (!add_implicit_conversion(ctx, &expr, node_from_block(&expr), dst_type, loc))
|
||||||
|
{
|
||||||
|
hlsl_block_cleanup(&expr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wrap the node into a src to allow the reference to survive the multiple const passes. */
|
||||||
|
hlsl_src_from_node(&src, node_from_block(&expr));
|
||||||
|
hlsl_run_const_passes(ctx, &expr);
|
||||||
|
node = src.node;
|
||||||
|
hlsl_src_remove(&src);
|
||||||
|
|
||||||
|
if (node->type == HLSL_IR_CONSTANT)
|
||||||
|
{
|
||||||
|
constant = hlsl_ir_constant(node);
|
||||||
|
ret = constant->value.u[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hlsl_error(ctx, &node->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX,
|
||||||
|
"Failed to evaluate constant expression.");
|
||||||
|
}
|
||||||
|
|
||||||
|
hlsl_block_cleanup(&expr);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int evaluate_static_expression_as_uint(struct hlsl_ctx *ctx, struct hlsl_block *block,
|
||||||
|
const struct vkd3d_shader_location *loc)
|
||||||
|
{
|
||||||
|
union hlsl_constant_value_component res;
|
||||||
|
|
||||||
|
res = evaluate_static_expression(ctx, block, hlsl_get_scalar_type(ctx, HLSL_TYPE_UINT), loc);
|
||||||
|
return res.u;
|
||||||
|
}
|
||||||
|
|
||||||
static struct hlsl_block *create_loop(struct hlsl_ctx *ctx, enum loop_type type,
|
static struct hlsl_block *create_loop(struct hlsl_ctx *ctx, enum loop_type type,
|
||||||
const struct parse_attribute_list *attributes, struct hlsl_block *init, struct hlsl_block *cond,
|
const struct parse_attribute_list *attributes, struct hlsl_block *init, struct hlsl_block *cond,
|
||||||
struct hlsl_block *iter, struct hlsl_block *body, const struct vkd3d_shader_location *loc)
|
struct hlsl_block *iter, struct hlsl_block *body, const struct vkd3d_shader_location *loc)
|
||||||
@ -1320,84 +1398,6 @@ static struct hlsl_block *make_block(struct hlsl_ctx *ctx, struct hlsl_ir_node *
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
static union hlsl_constant_value_component evaluate_static_expression(struct hlsl_ctx *ctx,
|
|
||||||
struct hlsl_block *block, struct hlsl_type *dst_type, const struct vkd3d_shader_location *loc)
|
|
||||||
{
|
|
||||||
union hlsl_constant_value_component ret = {0};
|
|
||||||
struct hlsl_ir_constant *constant;
|
|
||||||
struct hlsl_ir_node *node;
|
|
||||||
struct hlsl_block expr;
|
|
||||||
struct hlsl_src src;
|
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(node, &block->instrs, struct hlsl_ir_node, entry)
|
|
||||||
{
|
|
||||||
switch (node->type)
|
|
||||||
{
|
|
||||||
case HLSL_IR_CONSTANT:
|
|
||||||
case HLSL_IR_EXPR:
|
|
||||||
case HLSL_IR_SWIZZLE:
|
|
||||||
case HLSL_IR_LOAD:
|
|
||||||
case HLSL_IR_INDEX:
|
|
||||||
continue;
|
|
||||||
case HLSL_IR_STORE:
|
|
||||||
if (hlsl_ir_store(node)->lhs.var->is_synthetic)
|
|
||||||
break;
|
|
||||||
/* fall-through */
|
|
||||||
case HLSL_IR_CALL:
|
|
||||||
case HLSL_IR_IF:
|
|
||||||
case HLSL_IR_LOOP:
|
|
||||||
case HLSL_IR_JUMP:
|
|
||||||
case HLSL_IR_RESOURCE_LOAD:
|
|
||||||
case HLSL_IR_RESOURCE_STORE:
|
|
||||||
case HLSL_IR_SWITCH:
|
|
||||||
case HLSL_IR_STATEBLOCK_CONSTANT:
|
|
||||||
hlsl_error(ctx, &node->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX,
|
|
||||||
"Expected literal expression.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hlsl_clone_block(ctx, &expr, &ctx->static_initializers))
|
|
||||||
return ret;
|
|
||||||
hlsl_block_add_block(&expr, block);
|
|
||||||
|
|
||||||
if (!add_implicit_conversion(ctx, &expr, node_from_block(&expr), dst_type, loc))
|
|
||||||
{
|
|
||||||
hlsl_block_cleanup(&expr);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wrap the node into a src to allow the reference to survive the multiple const passes. */
|
|
||||||
hlsl_src_from_node(&src, node_from_block(&expr));
|
|
||||||
hlsl_run_const_passes(ctx, &expr);
|
|
||||||
node = src.node;
|
|
||||||
hlsl_src_remove(&src);
|
|
||||||
|
|
||||||
if (node->type == HLSL_IR_CONSTANT)
|
|
||||||
{
|
|
||||||
constant = hlsl_ir_constant(node);
|
|
||||||
ret = constant->value.u[0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hlsl_error(ctx, &node->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX,
|
|
||||||
"Failed to evaluate constant expression.");
|
|
||||||
}
|
|
||||||
|
|
||||||
hlsl_block_cleanup(&expr);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int evaluate_static_expression_as_uint(struct hlsl_ctx *ctx, struct hlsl_block *block,
|
|
||||||
const struct vkd3d_shader_location *loc)
|
|
||||||
{
|
|
||||||
union hlsl_constant_value_component res;
|
|
||||||
|
|
||||||
res = evaluate_static_expression(ctx, block, hlsl_get_scalar_type(ctx, HLSL_TYPE_UINT), loc);
|
|
||||||
return res.u;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool expr_compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
|
static bool expr_compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
|
||||||
{
|
{
|
||||||
/* Scalar vars can be converted to pretty much everything */
|
/* Scalar vars can be converted to pretty much everything */
|
||||||
|
Loading…
Reference in New Issue
Block a user