vkd3d-shader/spirv: Handle "BitEnum" operands.

This commit is contained in:
Henri Verbeet
2025-03-01 16:17:35 +01:00
parent 00039ba629
commit 5d55a5894c
Notes: Henri Verbeet 2025-03-10 15:22:45 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1382

View File

@ -517,12 +517,17 @@ static bool spirv_parser_parse_string_literal(struct spirv_parser *parser,
return true; return true;
} }
static uint32_t lowest_set(uint32_t v)
{
return v & -v;
}
static bool spirv_parser_parse_operand(struct spirv_parser *parser, struct vkd3d_string_buffer *buffer, static bool spirv_parser_parse_operand(struct spirv_parser *parser, struct vkd3d_string_buffer *buffer,
const char *opcode_name, enum spirv_parser_operand_type type, size_t end, uint32_t *result_id) const char *opcode_name, enum spirv_parser_operand_type type, size_t end, uint32_t *result_id)
{ {
const struct spirv_parser_operand_type_info *info; const struct spirv_parser_operand_type_info *info;
const struct spirv_parser_enumerant *e; const struct spirv_parser_enumerant *e;
uint32_t word, i; uint32_t word, tmp, v, i, j;
if (parser->pos >= end) if (parser->pos >= end)
{ {
@ -537,6 +542,59 @@ static bool spirv_parser_parse_operand(struct spirv_parser *parser, struct vkd3d
return false; return false;
} }
if (info->category == SPIRV_PARSER_OPERAND_CATEGORY_BIT_ENUM)
{
if (!(word = spirv_parser_read_u32(parser)))
{
if (!(e = spirv_parser_get_enumerant(info, word)))
{
spirv_parser_warning(parser, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED,
"Unhandled enumeration value %#x.", word);
return false;
}
spirv_parser_print_enumerant(parser, buffer, " ", e->name, "");
for (j = 0; j < e->parameter_count; ++j)
{
if (!spirv_parser_parse_operand(parser, buffer, opcode_name, e->parameters[j], end, result_id))
return false;
}
return true;
}
for (i = 0, tmp = word; tmp; ++i, tmp ^= v)
{
v = lowest_set(tmp);
if (!(e = spirv_parser_get_enumerant(info, v)))
{
spirv_parser_warning(parser, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED,
"Unhandled enumeration value %#x.", v);
return false;
}
spirv_parser_print_enumerant(parser, buffer, i ? " | " : " ", e->name, "");
}
for (i = 0, tmp = word; tmp; ++i, tmp ^= v)
{
v = lowest_set(tmp);
if (!(e = spirv_parser_get_enumerant(info, v)))
{
spirv_parser_warning(parser, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED,
"Unhandled enumeration value %#x.", v);
return false;
}
for (j = 0; j < e->parameter_count; ++j)
{
if (!spirv_parser_parse_operand(parser, buffer, opcode_name, e->parameters[j], end, result_id))
return false;
}
}
return true;
}
if (info->category == SPIRV_PARSER_OPERAND_CATEGORY_VALUE_ENUM) if (info->category == SPIRV_PARSER_OPERAND_CATEGORY_VALUE_ENUM)
{ {
word = spirv_parser_read_u32(parser); word = spirv_parser_read_u32(parser);