mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/hlsl: Allow effect calls on default value initializers.
This commit is contained in:
parent
4aa262d773
commit
ffc1449412
Notes:
Henri Verbeet
2024-09-14 16:53:12 +02:00
Approved-by: Elizabeth Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1057
@ -609,6 +609,7 @@ static struct hlsl_default_value evaluate_static_expression(struct hlsl_ctx *ctx
|
|||||||
{
|
{
|
||||||
switch (node->type)
|
switch (node->type)
|
||||||
{
|
{
|
||||||
|
case HLSL_IR_COMPILE:
|
||||||
case HLSL_IR_CONSTANT:
|
case HLSL_IR_CONSTANT:
|
||||||
case HLSL_IR_EXPR:
|
case HLSL_IR_EXPR:
|
||||||
case HLSL_IR_STRING_CONSTANT:
|
case HLSL_IR_STRING_CONSTANT:
|
||||||
@ -627,7 +628,6 @@ static struct hlsl_default_value evaluate_static_expression(struct hlsl_ctx *ctx
|
|||||||
case HLSL_IR_RESOURCE_LOAD:
|
case HLSL_IR_RESOURCE_LOAD:
|
||||||
case HLSL_IR_RESOURCE_STORE:
|
case HLSL_IR_RESOURCE_STORE:
|
||||||
case HLSL_IR_SWITCH:
|
case HLSL_IR_SWITCH:
|
||||||
case HLSL_IR_COMPILE:
|
|
||||||
case HLSL_IR_STATEBLOCK_CONSTANT:
|
case HLSL_IR_STATEBLOCK_CONSTANT:
|
||||||
hlsl_error(ctx, &node->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX,
|
hlsl_error(ctx, &node->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX,
|
||||||
"Expected literal expression.");
|
"Expected literal expression.");
|
||||||
@ -1227,7 +1227,8 @@ static bool add_typedef(struct hlsl_ctx *ctx, struct hlsl_type *const orig_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *instrs,
|
static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *instrs,
|
||||||
struct hlsl_ir_var *dst, unsigned int *store_index, struct hlsl_ir_node *src);
|
struct hlsl_ir_var *dst, unsigned int *store_index, struct hlsl_ir_node *src,
|
||||||
|
bool is_default_values_initializer);
|
||||||
|
|
||||||
static bool add_func_parameter(struct hlsl_ctx *ctx, struct hlsl_func_parameters *parameters,
|
static bool add_func_parameter(struct hlsl_ctx *ctx, struct hlsl_func_parameters *parameters,
|
||||||
struct parse_parameter *param, const struct vkd3d_shader_location *loc)
|
struct parse_parameter *param, const struct vkd3d_shader_location *loc)
|
||||||
@ -1285,7 +1286,8 @@ static bool add_func_parameter(struct hlsl_ctx *ctx, struct hlsl_func_parameters
|
|||||||
|
|
||||||
for (i = 0; i < param->initializer.args_count; ++i)
|
for (i = 0; i < param->initializer.args_count; ++i)
|
||||||
{
|
{
|
||||||
initialize_var_components(ctx, param->initializer.instrs, var, &store_index, param->initializer.args[i]);
|
initialize_var_components(ctx, param->initializer.instrs, var,
|
||||||
|
&store_index, param->initializer.args[i], true);
|
||||||
}
|
}
|
||||||
|
|
||||||
free_parse_initializer(¶m->initializer);
|
free_parse_initializer(¶m->initializer);
|
||||||
@ -2368,7 +2370,8 @@ static unsigned int get_component_index_from_default_initializer_index(struct hl
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *instrs,
|
static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *instrs,
|
||||||
struct hlsl_ir_var *dst, unsigned int *store_index, struct hlsl_ir_node *src)
|
struct hlsl_ir_var *dst, unsigned int *store_index, struct hlsl_ir_node *src,
|
||||||
|
bool is_default_values_initializer)
|
||||||
{
|
{
|
||||||
unsigned int src_comp_count = hlsl_type_component_count(src->data_type);
|
unsigned int src_comp_count = hlsl_type_component_count(src->data_type);
|
||||||
struct hlsl_deref dst_deref;
|
struct hlsl_deref dst_deref;
|
||||||
@ -2387,23 +2390,43 @@ static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *i
|
|||||||
|
|
||||||
dst_comp_type = hlsl_type_get_component_type(ctx, dst->data_type, *store_index);
|
dst_comp_type = hlsl_type_get_component_type(ctx, dst->data_type, *store_index);
|
||||||
|
|
||||||
if (dst->default_values)
|
if (is_default_values_initializer)
|
||||||
{
|
{
|
||||||
struct hlsl_default_value default_value = {0};
|
struct hlsl_default_value default_value = {0};
|
||||||
unsigned int dst_index;
|
unsigned int dst_index;
|
||||||
|
|
||||||
if (!hlsl_clone_block(ctx, &block, instrs))
|
if (hlsl_is_numeric_type(dst_comp_type))
|
||||||
return;
|
{
|
||||||
default_value = evaluate_static_expression(ctx, &block, dst_comp_type, &src->loc);
|
if (src->type == HLSL_IR_COMPILE)
|
||||||
|
{
|
||||||
|
/* Default values are discarded if they contain an object
|
||||||
|
* literal expression for a numeric component. */
|
||||||
|
if (dst->default_values)
|
||||||
|
{
|
||||||
|
hlsl_warning(ctx, &src->loc, VKD3D_SHADER_WARNING_HLSL_IGNORED_DEFAULT_VALUE,
|
||||||
|
"Component %u in variable '%s' initializer is object literal. Default values discarded.",
|
||||||
|
k, dst->name);
|
||||||
|
vkd3d_free(dst->default_values);
|
||||||
|
dst->default_values = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!hlsl_clone_block(ctx, &block, instrs))
|
||||||
|
return;
|
||||||
|
default_value = evaluate_static_expression(ctx, &block, dst_comp_type, &src->loc);
|
||||||
|
|
||||||
if (dst->is_param)
|
if (dst->is_param)
|
||||||
dst_index = *store_index;
|
dst_index = *store_index;
|
||||||
else
|
else
|
||||||
dst_index = get_component_index_from_default_initializer_index(ctx, dst->data_type, *store_index);
|
dst_index = get_component_index_from_default_initializer_index(ctx, dst->data_type, *store_index);
|
||||||
|
|
||||||
dst->default_values[dst_index] = default_value;
|
if (dst->default_values)
|
||||||
|
dst->default_values[dst_index] = default_value;
|
||||||
|
|
||||||
hlsl_block_cleanup(&block);
|
hlsl_block_cleanup(&block);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2793,7 +2816,8 @@ static struct hlsl_block *initialize_vars(struct hlsl_ctx *ctx, struct list *var
|
|||||||
|
|
||||||
for (k = 0; k < v->initializer.args_count; ++k)
|
for (k = 0; k < v->initializer.args_count; ++k)
|
||||||
{
|
{
|
||||||
initialize_var_components(ctx, v->initializer.instrs, var, &store_index, v->initializer.args[k]);
|
initialize_var_components(ctx, v->initializer.instrs, var,
|
||||||
|
&store_index, v->initializer.args[k], is_default_values_initializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_default_values_initializer)
|
if (is_default_values_initializer)
|
||||||
@ -4785,17 +4809,17 @@ static bool intrinsic_tex(struct hlsl_ctx *ctx, const struct parse_initializer *
|
|||||||
if (!(var = hlsl_new_synthetic_var(ctx, "coords", hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, 2), loc)))
|
if (!(var = hlsl_new_synthetic_var(ctx, "coords", hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, 2), loc)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
initialize_var_components(ctx, params->instrs, var, &idx, coords);
|
initialize_var_components(ctx, params->instrs, var, &idx, coords, false);
|
||||||
if (hlsl_version_ge(ctx, 4, 0))
|
if (hlsl_version_ge(ctx, 4, 0))
|
||||||
{
|
{
|
||||||
if (!(half = hlsl_new_float_constant(ctx, 0.5f, loc)))
|
if (!(half = hlsl_new_float_constant(ctx, 0.5f, loc)))
|
||||||
return false;
|
return false;
|
||||||
hlsl_block_add_instr(params->instrs, half);
|
hlsl_block_add_instr(params->instrs, half);
|
||||||
|
|
||||||
initialize_var_components(ctx, params->instrs, var, &idx, half);
|
initialize_var_components(ctx, params->instrs, var, &idx, half, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
initialize_var_components(ctx, params->instrs, var, &idx, coords);
|
initialize_var_components(ctx, params->instrs, var, &idx, coords, false);
|
||||||
|
|
||||||
if (!(load = hlsl_new_var_load(ctx, var, loc)))
|
if (!(load = hlsl_new_var_load(ctx, var, loc)))
|
||||||
return false;
|
return false;
|
||||||
@ -5276,7 +5300,7 @@ static struct hlsl_block *add_constructor(struct hlsl_ctx *ctx, struct hlsl_type
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (i = 0; i < params->args_count; ++i)
|
for (i = 0; i < params->args_count; ++i)
|
||||||
initialize_var_components(ctx, params->instrs, var, &idx, params->args[i]);
|
initialize_var_components(ctx, params->instrs, var, &idx, params->args[i], false);
|
||||||
|
|
||||||
if (!(load = hlsl_new_var_load(ctx, var, loc)))
|
if (!(load = hlsl_new_var_load(ctx, var, loc)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -165,6 +165,7 @@ enum vkd3d_shader_error
|
|||||||
VKD3D_SHADER_WARNING_HLSL_IMAGINARY_NUMERIC_RESULT = 5303,
|
VKD3D_SHADER_WARNING_HLSL_IMAGINARY_NUMERIC_RESULT = 5303,
|
||||||
VKD3D_SHADER_WARNING_HLSL_NON_FINITE_RESULT = 5304,
|
VKD3D_SHADER_WARNING_HLSL_NON_FINITE_RESULT = 5304,
|
||||||
VKD3D_SHADER_WARNING_HLSL_IGNORED_ATTRIBUTE = 5305,
|
VKD3D_SHADER_WARNING_HLSL_IGNORED_ATTRIBUTE = 5305,
|
||||||
|
VKD3D_SHADER_WARNING_HLSL_IGNORED_DEFAULT_VALUE = 5306,
|
||||||
|
|
||||||
VKD3D_SHADER_ERROR_GLSL_INTERNAL = 6000,
|
VKD3D_SHADER_ERROR_GLSL_INTERNAL = 6000,
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ technique10
|
|||||||
// Without initializer
|
// Without initializer
|
||||||
technique10 < int a; > {}
|
technique10 < int a; > {}
|
||||||
|
|
||||||
[effect fail]
|
[effect fail todo]
|
||||||
// Only numeric types and strings are allowed
|
// Only numeric types and strings are allowed
|
||||||
technique10 < DepthStencilState ds = { 0 }; > {}
|
technique10 < DepthStencilState ds = { 0 }; > {}
|
||||||
|
|
||||||
|
@ -20,3 +20,11 @@ float4 main() : sv_target
|
|||||||
[test]
|
[test]
|
||||||
todo(sm<6) draw quad
|
todo(sm<6) draw quad
|
||||||
probe (0, 0) rgba (0.1, 0.1, 0.2, 0.4)
|
probe (0, 0) rgba (0.1, 0.1, 0.2, 0.4)
|
||||||
|
|
||||||
|
|
||||||
|
[pixel shader fail]
|
||||||
|
float4 fun() { return 0; };
|
||||||
|
|
||||||
|
float a[CompileShader(ps_2_0, main())];
|
||||||
|
|
||||||
|
float4 main() : sv_target { return 0; }
|
||||||
|
@ -294,6 +294,17 @@ float4 main() : sv_target
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
% This compiles but default values for 'p' aren't written to the output binary.
|
||||||
|
[pixel shader fail(sm>=6)]
|
||||||
|
float4 fun() { return 0; };
|
||||||
|
float2 p = {5, CompileShader(ps_2_0, fun())};
|
||||||
|
|
||||||
|
float4 main() : sv_target
|
||||||
|
{
|
||||||
|
return p.xyxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[require]
|
[require]
|
||||||
shader model >= 5.0
|
shader model >= 5.0
|
||||||
|
|
||||||
|
@ -161,13 +161,13 @@ float4 main() : sv_target { return 0; }
|
|||||||
PixelShader ps1 = {42}; // braces make the type checking more permissive.
|
PixelShader ps1 = {42}; // braces make the type checking more permissive.
|
||||||
|
|
||||||
% This compiles, but the default value of "f" is not written.
|
% This compiles, but the default value of "f" is not written.
|
||||||
[pixel shader todo fail(sm>=6)]
|
[pixel shader fail(sm>=6)]
|
||||||
float4 fun() : sv_target { return 0; }
|
float4 fun() : sv_target { return 0; }
|
||||||
float f = {CompileShader(ps_2_0, fun())};
|
float f = {CompileShader(ps_2_0, fun())};
|
||||||
float4 main() : sv_target { return f; }
|
float4 main() : sv_target { return f; }
|
||||||
|
|
||||||
% This also compiles, but the default value of "f" is not written.
|
% This also compiles, but the default value of "f" is not written.
|
||||||
[pixel shader todo fail(sm>=6)]
|
[pixel shader fail(sm>=6)]
|
||||||
float4 fun() : sv_target { return 0; }
|
float4 fun() : sv_target { return 0; }
|
||||||
float4 f = {1, 2, compile ps_2_0 fun(), 4};
|
float4 f = {1, 2, compile ps_2_0 fun(), 4};
|
||||||
float4 main() : sv_target { return f; }
|
float4 main() : sv_target { return f; }
|
||||||
@ -225,7 +225,7 @@ shader model < 6.0
|
|||||||
|
|
||||||
|
|
||||||
% The following test segfaults on DXC.
|
% The following test segfaults on DXC.
|
||||||
[pixel shader todo]
|
[pixel shader]
|
||||||
float f;
|
float f;
|
||||||
|
|
||||||
float4 foo(uniform float r) : sv_target { return r; }
|
float4 foo(uniform float r) : sv_target { return r; }
|
||||||
@ -247,7 +247,7 @@ technique
|
|||||||
float4 main() : sv_target { return 0; }
|
float4 main() : sv_target { return 0; }
|
||||||
|
|
||||||
[test]
|
[test]
|
||||||
todo draw quad
|
todo(glsl) draw quad
|
||||||
probe (0, 0) rgba (0, 0, 0, 0)
|
probe (0, 0) rgba (0, 0, 0, 0)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user