vkd3d-shader/fx: Output indirect register access in arguments.

This uses the notation from Wine's d3dx9 effects runtime implementation.
Indirect addressing in fx_4_0 looks pretty much broken - it compiles
to something that produces non-sensical text disassembly and fails
runtime effect creation.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov
2025-06-09 16:50:31 +02:00
committed by Henri Verbeet
parent 3f6013ea27
commit e28af05957
Notes: Henri Verbeet 2025-06-16 17:49:09 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1570

View File

@@ -65,6 +65,7 @@ enum fxlvm_constants
FX_FXLC_REG_CB = 2,
FX_FXLC_REG_OUTPUT = 4,
FX_FXLC_REG_TEMP = 7,
FX_FXLC_REG_MAX = FX_FXLC_REG_TEMP,
};
struct rhs_named_value
@@ -4931,8 +4932,38 @@ 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 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;
if (arg->reg_type > FX_FXLC_REG_MAX)
{
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_INVALID_DATA,
"Unexpected register type %u.", arg->reg_type);
return;
}
if (arg->index.reg_type > FX_FXLC_REG_MAX)
{
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_INVALID_DATA,
"Unexpected index register type %u.", arg->index.reg_type);
return;
}
if (arg->indexed)
{
vkd3d_string_buffer_printf(&parser->buffer, "%s[%u + %s%u.%c]", table_names[arg->reg_type],
arg->address, table_names[arg->index.reg_type], arg->index.address,
"xyzw"[arg->index.address % 4]);
fx_parse_print_swizzle(parser, code, arg->address);
return;
}
switch (arg->reg_type)
{
case FX_FXLC_REG_LITERAL: