mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
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:
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
@@ -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:
|
||||
|
Reference in New Issue
Block a user