mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/fx: Improve register naming in the disassembly output.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
committed by
Henri Verbeet
parent
15561c1e56
commit
fc77bddb9c
Notes:
Henri Verbeet
2025-07-14 18:54:14 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1615
@@ -61,8 +61,10 @@ enum fxlvm_constants
|
|||||||
FX_FXLC_OPCODE_SHIFT = 20,
|
FX_FXLC_OPCODE_SHIFT = 20,
|
||||||
FX_FXLC_IS_SCALAR_MASK = 0x80000000,
|
FX_FXLC_IS_SCALAR_MASK = 0x80000000,
|
||||||
|
|
||||||
|
FX_FXLC_REG_UNUSED = 0,
|
||||||
FX_FXLC_REG_LITERAL = 1,
|
FX_FXLC_REG_LITERAL = 1,
|
||||||
FX_FXLC_REG_CB = 2,
|
FX_FXLC_REG_CB = 2,
|
||||||
|
FX_FXLC_REG_INPUT = 3,
|
||||||
FX_FXLC_REG_OUTPUT = 4,
|
FX_FXLC_REG_OUTPUT = 4,
|
||||||
FX_FXLC_REG_TEMP = 7,
|
FX_FXLC_REG_TEMP = 7,
|
||||||
FX_FXLC_REG_MAX = FX_FXLC_REG_TEMP,
|
FX_FXLC_REG_MAX = FX_FXLC_REG_TEMP,
|
||||||
@@ -4916,6 +4918,46 @@ static void fx_parse_print_swizzle(struct fx_parser *parser, const struct fxlvm_
|
|||||||
vkd3d_string_buffer_printf(&parser->buffer, ".%.*s", comp_count, &comp[addr % 4]);
|
vkd3d_string_buffer_printf(&parser->buffer, ".%.*s", comp_count, &comp[addr % 4]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fx_print_fxlc_register(struct fx_parser *parser, uint32_t reg_type,
|
||||||
|
uint32_t address, uint32_t index_type, uint32_t index_address, struct fxlvm_code *code)
|
||||||
|
{
|
||||||
|
static const char *table_names[FX_FXLC_REG_MAX + 1] =
|
||||||
|
{
|
||||||
|
[FX_FXLC_REG_LITERAL] = "imm",
|
||||||
|
[FX_FXLC_REG_CB] = "c",
|
||||||
|
[FX_FXLC_REG_INPUT] = "i",
|
||||||
|
[FX_FXLC_REG_OUTPUT] = "expr",
|
||||||
|
[FX_FXLC_REG_TEMP] = "r",
|
||||||
|
};
|
||||||
|
uint32_t reg_index = address / 4;
|
||||||
|
|
||||||
|
if (parser->source_type == VKD3D_SHADER_SOURCE_TX
|
||||||
|
&& (reg_type == FX_FXLC_REG_INPUT || reg_type == FX_FXLC_REG_OUTPUT))
|
||||||
|
{
|
||||||
|
if (reg_type == FX_FXLC_REG_INPUT)
|
||||||
|
{
|
||||||
|
if (reg_index == 0)
|
||||||
|
vkd3d_string_buffer_printf(&parser->buffer, "vPos");
|
||||||
|
else if (reg_index == 1)
|
||||||
|
vkd3d_string_buffer_printf(&parser->buffer, "vPSize");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vkd3d_string_buffer_printf(&parser->buffer, "oC%u", reg_index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vkd3d_string_buffer_printf(&parser->buffer, "%s%u", table_names[reg_type], reg_index);
|
||||||
|
}
|
||||||
|
if (index_type != FX_FXLC_REG_UNUSED)
|
||||||
|
{
|
||||||
|
vkd3d_string_buffer_printf(&parser->buffer, "[%s%u.%c]", table_names[index_type],
|
||||||
|
index_address / 4, "xyzw"[index_address % 4]);
|
||||||
|
}
|
||||||
|
fx_parse_print_swizzle(parser, code, address);
|
||||||
|
}
|
||||||
|
|
||||||
static void fx_parse_fxlc_constant_argument(struct fx_parser *parser,
|
static void fx_parse_fxlc_constant_argument(struct fx_parser *parser,
|
||||||
const struct fxlc_arg *arg, const struct fxlvm_code *code)
|
const struct fxlc_arg *arg, const struct fxlvm_code *code)
|
||||||
{
|
{
|
||||||
@@ -4979,13 +5021,6 @@ static void fx_print_fxlc_literal(struct fx_parser *parser, uint32_t address, st
|
|||||||
|
|
||||||
static void fx_print_fxlc_argument(struct fx_parser *parser, const struct fxlc_arg *arg, struct fxlvm_code *code)
|
static void fx_print_fxlc_argument(struct fx_parser *parser, const struct fxlc_arg *arg, struct fxlvm_code *code)
|
||||||
{
|
{
|
||||||
static const char *table_names[FX_FXLC_REG_MAX + 1] =
|
|
||||||
{
|
|
||||||
[FX_FXLC_REG_LITERAL] = "imm",
|
|
||||||
[FX_FXLC_REG_CB] = "cb",
|
|
||||||
[FX_FXLC_REG_OUTPUT] = "o",
|
|
||||||
[FX_FXLC_REG_TEMP] = "r",
|
|
||||||
};
|
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
|
|
||||||
if (arg->reg_type > FX_FXLC_REG_MAX)
|
if (arg->reg_type > FX_FXLC_REG_MAX)
|
||||||
@@ -5004,10 +5039,8 @@ static void fx_print_fxlc_argument(struct fx_parser *parser, const struct fxlc_a
|
|||||||
|
|
||||||
if (arg->indexed)
|
if (arg->indexed)
|
||||||
{
|
{
|
||||||
vkd3d_string_buffer_printf(&parser->buffer, "%s[%u + %s%u.%c]", table_names[arg->reg_type],
|
fx_print_fxlc_register(parser, arg->reg_type, arg->address, arg->index.reg_type,
|
||||||
arg->address, table_names[arg->index.reg_type], arg->index.address,
|
arg->index.address, code);
|
||||||
"xyzw"[arg->index.address % 4]);
|
|
||||||
fx_parse_print_swizzle(parser, code, arg->address);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5036,13 +5069,10 @@ static void fx_print_fxlc_argument(struct fx_parser *parser, const struct fxlc_a
|
|||||||
fx_parse_fxlc_constant_argument(parser, arg, code);
|
fx_parse_fxlc_constant_argument(parser, arg, code);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FX_FXLC_REG_INPUT:
|
||||||
case FX_FXLC_REG_OUTPUT:
|
case FX_FXLC_REG_OUTPUT:
|
||||||
case FX_FXLC_REG_TEMP:
|
case FX_FXLC_REG_TEMP:
|
||||||
if (arg->reg_type == FX_FXLC_REG_OUTPUT)
|
fx_print_fxlc_register(parser, arg->reg_type, arg->address, FX_FXLC_REG_UNUSED, 0, code);
|
||||||
vkd3d_string_buffer_printf(&parser->buffer, "expr");
|
|
||||||
else
|
|
||||||
vkd3d_string_buffer_printf(&parser->buffer, "r%u", arg->address / 4);
|
|
||||||
fx_parse_print_swizzle(parser, code, arg->address);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user