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_CB = 2,
|
||||||
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,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rhs_named_value
|
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 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)
|
||||||
|
{
|
||||||
|
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)
|
switch (arg->reg_type)
|
||||||
{
|
{
|
||||||
case FX_FXLC_REG_LITERAL:
|
case FX_FXLC_REG_LITERAL:
|
||||||
|
Reference in New Issue
Block a user