vkd3d-shader/fx: Use appropriate BlendState description when tracing.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov
2025-05-06 01:07:03 +02:00
committed by Henri Verbeet
parent 5d5d892830
commit 960244bf1e
Notes: Henri Verbeet 2025-05-06 19:06:09 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1484

View File

@@ -2655,9 +2655,6 @@ fx_4_states[] =
{ "ComputeShader", HLSL_CLASS_PASS, HLSL_CLASS_SCALAR, FX_COMPUTESHADER, 1, 1, 58 },
};
static void resolve_fx_4_state_block_values(struct hlsl_ir_var *var, struct hlsl_state_block_entry *entry,
struct fx_write_context *fx)
{
static const struct fx_4_state fx_5_blend_states[] =
{
{ "AlphaToCoverageEnable", HLSL_CLASS_BLEND_STATE, HLSL_CLASS_SCALAR, FX_BOOL, 1, 1, 36, bool_values },
@@ -2671,22 +2668,18 @@ static void resolve_fx_4_state_block_values(struct hlsl_ir_var *var, struct hlsl
{ "RenderTargetWriteMask", HLSL_CLASS_BLEND_STATE, HLSL_CLASS_SCALAR, FX_UINT8, 1, 8, 44 },
};
struct state_table
struct fx_4_state_table
{
const struct fx_4_state *ptr;
unsigned int count;
} table;
};
const struct hlsl_type *type = hlsl_get_multiarray_element_type(var->data_type);
struct replace_state_context replace_context;
const struct fx_4_state *state = NULL;
struct hlsl_type *state_type = NULL;
struct hlsl_ctx *ctx = fx->ctx;
enum hlsl_base_type base_type;
struct hlsl_ir_node *node;
unsigned int i;
static struct fx_4_state_table fx_4_get_state_table(enum hlsl_type_class type_class,
unsigned int major, unsigned int minor)
{
struct fx_4_state_table table;
if (type->class == HLSL_CLASS_BLEND_STATE && hlsl_version_ge(ctx, 4, 1))
if (type_class == HLSL_CLASS_BLEND_STATE && (major == 5 || (major == 4 && minor == 1)))
{
table.ptr = fx_5_blend_states;
table.count = ARRAY_SIZE(fx_5_blend_states);
@@ -2697,6 +2690,24 @@ static void resolve_fx_4_state_block_values(struct hlsl_ir_var *var, struct hlsl
table.count = ARRAY_SIZE(fx_4_states);
}
return table;
}
static void resolve_fx_4_state_block_values(struct hlsl_ir_var *var,
struct hlsl_state_block_entry *entry, struct fx_write_context *fx)
{
const struct hlsl_type *type = hlsl_get_multiarray_element_type(var->data_type);
struct replace_state_context replace_context;
const struct fx_4_state *state = NULL;
struct hlsl_type *state_type = NULL;
struct hlsl_ctx *ctx = fx->ctx;
enum hlsl_base_type base_type;
struct fx_4_state_table table;
struct hlsl_ir_node *node;
unsigned int i;
table = fx_4_get_state_table(type->class, ctx->profile->major_version, ctx->profile->minor_version);
for (i = 0; i < table.count; ++i)
{
if (type->class == table.ptr[i].container
@@ -3439,7 +3450,11 @@ struct fx_parser
struct vkd3d_shader_message_context *message_context;
struct vkd3d_string_buffer buffer;
unsigned int indent;
unsigned int version;
struct
{
unsigned int major;
unsigned int minor;
} version;
struct
{
const uint8_t *ptr;
@@ -4904,16 +4919,18 @@ static void fx_4_parse_state_object_initializer(struct fx_parser *parser, uint32
};
const struct rhs_named_value *named_value;
struct fx_5_shader shader = { 0 };
struct fx_4_state_table table;
unsigned int shader_type = 0;
uint32_t i, j, comp_count;
struct fx_4_state *state;
table = fx_4_get_state_table(type_class, parser->version.major, parser->version.minor);
for (i = 0; i < count; ++i)
{
fx_parser_read_u32s(parser, &entry, sizeof(entry));
if (!(state = bsearch(&entry.id, fx_4_states, ARRAY_SIZE(fx_4_states),
sizeof(*fx_4_states), fx_4_state_id_compare)))
if (!(state = bsearch(&entry.id, table.ptr, table.count, sizeof(*table.ptr), fx_4_state_id_compare)))
{
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_INVALID_DATA, "Unrecognized state id %#x.", entry.id);
break;
@@ -5183,7 +5200,7 @@ static void fx_parse_fx_4_technique(struct fx_parser *parser)
name = fx_4_get_string(parser, technique.name);
parse_fx_print_indent(parser);
vkd3d_string_buffer_printf(&parser->buffer, "technique%u %s", parser->version, name);
vkd3d_string_buffer_printf(&parser->buffer, "technique%u %s", parser->version.major == 4 ? 10 : 11, name);
fx_parse_fx_4_annotations(parser);
vkd3d_string_buffer_printf(&parser->buffer, "\n");
@@ -5277,7 +5294,6 @@ static void fx_4_parse(struct fx_parser *parser)
} header;
uint32_t i;
parser->version = 10;
fx_parser_read_u32s(parser, &header, sizeof(header));
parser->buffer_count = header.buffer_count;
parser->object_count = header.object_count;
@@ -5331,7 +5347,6 @@ static void fx_5_parse(struct fx_parser *parser)
uint32_t class_instance_element_count;
} header;
parser->version = 11;
fx_parser_read_u32s(parser, &header, sizeof(header));
parser->buffer_count = header.buffer_count;
parser->object_count = header.object_count;
@@ -5390,13 +5405,20 @@ int fx_parse(const struct vkd3d_shader_compile_info *compile_info,
switch (version)
{
case 0xfeff0901:
parser.version.major = 3;
fx_2_parse(&parser);
break;
case 0xfeff1001:
parser.version.major = 4;
fx_4_parse(&parser);
break;
case 0xfeff1011:
parser.version.major = 4;
parser.version.minor = 1;
fx_4_parse(&parser);
break;
case 0xfeff2001:
parser.version.major = 5;
fx_5_parse(&parser);
break;
default: