mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/spirv: Handle "IdResult" operands.
This commit is contained in:
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
@@ -422,7 +422,7 @@ static enum vkd3d_result spirv_parser_read_header(struct spirv_parser *parser)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
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;
|
||||||
|
|
||||||
@@ -445,6 +445,16 @@ static bool spirv_parser_parse_operand(struct spirv_parser *parser, struct vkd3d
|
|||||||
spirv_parser_print_id(parser, buffer, " ", spirv_parser_read_u32(parser), "");
|
spirv_parser_print_id(parser, buffer, " ", spirv_parser_read_u32(parser), "");
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case SPIRV_PARSER_OPERAND_TYPE_ID_RESULT:
|
||||||
|
if (*result_id)
|
||||||
|
{
|
||||||
|
spirv_parser_warning(parser, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED,
|
||||||
|
"Instruction has multiple results.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*result_id = spirv_parser_read_u32(parser);
|
||||||
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
spirv_parser_warning(parser, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED,
|
spirv_parser_warning(parser, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED,
|
||||||
"Unhandled operand type \"%s\".", info->name);
|
"Unhandled operand type \"%s\".", info->name);
|
||||||
@@ -471,11 +481,11 @@ static void spirv_parser_parse_raw_instruction(struct spirv_parser *parser, uint
|
|||||||
static enum vkd3d_result spirv_parser_parse_instruction(struct spirv_parser *parser)
|
static enum vkd3d_result spirv_parser_parse_instruction(struct spirv_parser *parser)
|
||||||
{
|
{
|
||||||
const struct spirv_parser_instruction_operand *operand;
|
const struct spirv_parser_instruction_operand *operand;
|
||||||
|
struct vkd3d_string_buffer *operands, *result_name;
|
||||||
const struct spirv_parser_opcode_info *info;
|
const struct spirv_parser_opcode_info *info;
|
||||||
struct vkd3d_string_buffer *operands;
|
uint32_t result_id, word;
|
||||||
uint16_t op, count, rem;
|
uint16_t op, count, rem;
|
||||||
size_t end, pos, i;
|
size_t end, pos, i;
|
||||||
uint32_t word;
|
|
||||||
|
|
||||||
pos = parser->pos;
|
pos = parser->pos;
|
||||||
word = spirv_parser_read_u32(parser);
|
word = spirv_parser_read_u32(parser);
|
||||||
@@ -498,6 +508,7 @@ static enum vkd3d_result spirv_parser_parse_instruction(struct spirv_parser *par
|
|||||||
|
|
||||||
operands = vkd3d_string_buffer_get(&parser->string_buffers);
|
operands = vkd3d_string_buffer_get(&parser->string_buffers);
|
||||||
|
|
||||||
|
result_id = 0;
|
||||||
for (i = 0, end = pos + count; i < info->operand_count; ++i)
|
for (i = 0, end = pos + count; i < info->operand_count; ++i)
|
||||||
{
|
{
|
||||||
operand = &info->operands[i];
|
operand = &info->operands[i];
|
||||||
@@ -507,7 +518,7 @@ static enum vkd3d_result spirv_parser_parse_instruction(struct spirv_parser *par
|
|||||||
if (parser->pos >= end && (operand->quantifier == '?' || operand->quantifier == '*'))
|
if (parser->pos >= end && (operand->quantifier == '?' || operand->quantifier == '*'))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!spirv_parser_parse_operand(parser, operands, info->name, operand->type, end))
|
if (!spirv_parser_parse_operand(parser, operands, info->name, operand->type, end, &result_id))
|
||||||
{
|
{
|
||||||
vkd3d_string_buffer_release(&parser->string_buffers, operands);
|
vkd3d_string_buffer_release(&parser->string_buffers, operands);
|
||||||
goto raw;
|
goto raw;
|
||||||
@@ -525,8 +536,23 @@ static enum vkd3d_result spirv_parser_parse_instruction(struct spirv_parser *par
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser->formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT)
|
if (result_id)
|
||||||
|
{
|
||||||
|
int max_indent = 0;
|
||||||
|
|
||||||
|
if (parser->formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT)
|
||||||
|
max_indent = VKD3D_SPIRV_INDENT - 4;
|
||||||
|
result_name = vkd3d_string_buffer_get(&parser->string_buffers);
|
||||||
|
vkd3d_string_buffer_printf(result_name, "%u", result_id);
|
||||||
|
vkd3d_string_buffer_printf(parser->text, "%*s%%%s%s%s = ",
|
||||||
|
result_name->content_size > max_indent ? 0 : max_indent - (int)result_name->content_size, "",
|
||||||
|
parser->colours.id, result_name->buffer, parser->colours.reset);
|
||||||
|
vkd3d_string_buffer_release(&parser->string_buffers, result_name);
|
||||||
|
}
|
||||||
|
else if (parser->formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT)
|
||||||
|
{
|
||||||
vkd3d_string_buffer_printf(parser->text, "%*s", VKD3D_SPIRV_INDENT, "");
|
vkd3d_string_buffer_printf(parser->text, "%*s", VKD3D_SPIRV_INDENT, "");
|
||||||
|
}
|
||||||
spirv_parser_print_opcode(parser, parser->text, info->name);
|
spirv_parser_print_opcode(parser, parser->text, info->name);
|
||||||
vkd3d_string_buffer_printf(parser->text, "%s", operands->buffer);
|
vkd3d_string_buffer_printf(parser->text, "%s", operands->buffer);
|
||||||
if (parser->formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_OFFSETS)
|
if (parser->formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_OFFSETS)
|
||||||
|
Reference in New Issue
Block a user