mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/fx: Parse array selector expressions for fx_2_0.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
committed by
Henri Verbeet
parent
90032acbcf
commit
1913f5e6f9
Notes:
Henri Verbeet
2025-06-11 20:37:36 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1559
@@ -66,6 +66,7 @@
|
|||||||
|
|
||||||
#define TAG_AON9 VKD3D_MAKE_TAG('A', 'o', 'n', '9')
|
#define TAG_AON9 VKD3D_MAKE_TAG('A', 'o', 'n', '9')
|
||||||
#define TAG_CLI4 VKD3D_MAKE_TAG('C', 'L', 'I', '4')
|
#define TAG_CLI4 VKD3D_MAKE_TAG('C', 'L', 'I', '4')
|
||||||
|
#define TAG_CLIT VKD3D_MAKE_TAG('C', 'L', 'I', 'T')
|
||||||
#define TAG_CTAB VKD3D_MAKE_TAG('C', 'T', 'A', 'B')
|
#define TAG_CTAB VKD3D_MAKE_TAG('C', 'T', 'A', 'B')
|
||||||
#define TAG_DXBC VKD3D_MAKE_TAG('D', 'X', 'B', 'C')
|
#define TAG_DXBC VKD3D_MAKE_TAG('D', 'X', 'B', 'C')
|
||||||
#define TAG_DXIL VKD3D_MAKE_TAG('D', 'X', 'I', 'L')
|
#define TAG_DXIL VKD3D_MAKE_TAG('D', 'X', 'I', 'L')
|
||||||
|
@@ -4270,6 +4270,8 @@ static void fx_dump_blob(struct fx_parser *parser, const void *blob, uint32_t si
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fx_2_parse_fxlvm_expression(struct fx_parser *parser, const uint32_t *blob, uint32_t size);
|
||||||
|
|
||||||
static void fx_parse_fx_2_array_selector(struct fx_parser *parser)
|
static void fx_parse_fx_2_array_selector(struct fx_parser *parser)
|
||||||
{
|
{
|
||||||
uint32_t size, blob_size = 0;
|
uint32_t size, blob_size = 0;
|
||||||
@@ -4297,7 +4299,7 @@ static void fx_parse_fx_2_array_selector(struct fx_parser *parser)
|
|||||||
{
|
{
|
||||||
parse_fx_print_indent(parser);
|
parse_fx_print_indent(parser);
|
||||||
vkd3d_string_buffer_printf(&parser->buffer, "selector blob size %u\n", blob_size);
|
vkd3d_string_buffer_printf(&parser->buffer, "selector blob size %u\n", blob_size);
|
||||||
fx_dump_blob(parser, blob, blob_size);
|
fx_2_parse_fxlvm_expression(parser, blob, blob_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4826,6 +4828,7 @@ struct fxlvm_code
|
|||||||
union
|
union
|
||||||
{
|
{
|
||||||
const float *_4;
|
const float *_4;
|
||||||
|
const double *_8;
|
||||||
} cli;
|
} cli;
|
||||||
uint32_t cli_count;
|
uint32_t cli_count;
|
||||||
|
|
||||||
@@ -4849,7 +4852,34 @@ static uint32_t fxlvm_read_u32(struct fxlvm_code *code)
|
|||||||
return *code->ptr++;
|
return *code->ptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fx_4_parse_print_swizzle(struct fx_parser *parser, const struct fxlvm_code *code, unsigned int addr)
|
static const uint32_t *find_d3dbc_section(const uint32_t *ptr, uint32_t count, uint32_t tag, uint32_t *size)
|
||||||
|
{
|
||||||
|
if (!count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Skip version tag */
|
||||||
|
ptr++;
|
||||||
|
count--;
|
||||||
|
|
||||||
|
while (count > 2 && (*ptr & 0xffff) == 0xfffe)
|
||||||
|
{
|
||||||
|
unsigned int section_size;
|
||||||
|
|
||||||
|
section_size = (*ptr >> 16);
|
||||||
|
if (!section_size || section_size + 1 > count)
|
||||||
|
break;
|
||||||
|
if (*(ptr + 1) == tag)
|
||||||
|
{
|
||||||
|
*size = section_size;
|
||||||
|
return ptr + 2;
|
||||||
|
}
|
||||||
|
count -= section_size + 1;
|
||||||
|
ptr += section_size + 1;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fx_parse_print_swizzle(struct fx_parser *parser, const struct fxlvm_code *code, unsigned int addr)
|
||||||
{
|
{
|
||||||
unsigned int comp_count = code->scalar ? 1 : code->comp_count;
|
unsigned int comp_count = code->scalar ? 1 : code->comp_count;
|
||||||
static const char comp[] = "xyzw";
|
static const char comp[] = "xyzw";
|
||||||
@@ -4861,7 +4891,11 @@ static void fx_4_parse_print_swizzle(struct fx_parser *parser, const struct fxlv
|
|||||||
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)
|
||||||
{
|
{
|
||||||
uint32_t i, offset, register_index = arg->address / 4; /* Address counts in components. */
|
uint32_t register_index = arg->address / 4; /* Address counts in components. */
|
||||||
|
|
||||||
|
if (code->ctab_count)
|
||||||
|
{
|
||||||
|
uint32_t i, offset;
|
||||||
|
|
||||||
for (i = 0; i < code->ctab_count; ++i)
|
for (i = 0; i < code->ctab_count; ++i)
|
||||||
{
|
{
|
||||||
@@ -4877,11 +4911,17 @@ static void fx_parse_fxlc_constant_argument(struct fx_parser *parser,
|
|||||||
|
|
||||||
if (offset / 4)
|
if (offset / 4)
|
||||||
vkd3d_string_buffer_printf(&parser->buffer, "[%u]", offset / 4);
|
vkd3d_string_buffer_printf(&parser->buffer, "[%u]", offset / 4);
|
||||||
fx_4_parse_print_swizzle(parser, code, offset);
|
fx_parse_print_swizzle(parser, code, offset);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vkd3d_string_buffer_printf(&parser->buffer, "(var-not-found)");
|
vkd3d_string_buffer_printf(&parser->buffer, "(var-not-found)");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vkd3d_string_buffer_printf(&parser->buffer, "c%u", register_index);
|
||||||
|
fx_parse_print_swizzle(parser, code, arg->address);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fx_parse_fxlc_argument(struct fx_parser *parser, struct fxlc_arg *arg, struct fxlvm_code *code)
|
static void fx_parse_fxlc_argument(struct fx_parser *parser, struct fxlc_arg *arg, struct fxlvm_code *code)
|
||||||
@@ -4903,7 +4943,10 @@ static void fx_parse_fxlc_argument(struct fx_parser *parser, struct fxlc_arg *ar
|
|||||||
|
|
||||||
static void fx_print_fxlc_literal(struct fx_parser *parser, uint32_t address, struct fxlvm_code *code)
|
static void fx_print_fxlc_literal(struct fx_parser *parser, uint32_t address, struct fxlvm_code *code)
|
||||||
{
|
{
|
||||||
|
if (parser->version.major >= 4)
|
||||||
vkd3d_string_buffer_print_f32(&parser->buffer, code->cli._4[address]);
|
vkd3d_string_buffer_print_f32(&parser->buffer, code->cli._4[address]);
|
||||||
|
else
|
||||||
|
vkd3d_string_buffer_print_f64(&parser->buffer, code->cli._8[address]);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
@@ -4941,7 +4984,7 @@ static void fx_print_fxlc_argument(struct fx_parser *parser, const struct fxlc_a
|
|||||||
vkd3d_string_buffer_printf(&parser->buffer, "expr");
|
vkd3d_string_buffer_printf(&parser->buffer, "expr");
|
||||||
else
|
else
|
||||||
vkd3d_string_buffer_printf(&parser->buffer, "r%u", arg->address / 4);
|
vkd3d_string_buffer_printf(&parser->buffer, "r%u", arg->address / 4);
|
||||||
fx_4_parse_print_swizzle(parser, code, arg->address);
|
fx_parse_print_swizzle(parser, code, arg->address);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -5005,6 +5048,29 @@ static void fx_parse_fxlvm_expression(struct fx_parser *parser, struct fxlvm_cod
|
|||||||
parse_fx_end_indent(parser);
|
parse_fx_end_indent(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fx_2_parse_fxlvm_expression(struct fx_parser *parser, const uint32_t *blob, uint32_t size)
|
||||||
|
{
|
||||||
|
uint32_t count = size / sizeof(uint32_t);
|
||||||
|
struct fxlvm_code code = { 0 };
|
||||||
|
uint32_t section_size;
|
||||||
|
const uint32_t *data;
|
||||||
|
|
||||||
|
/* Literal constants, using 64-bit floats. */
|
||||||
|
if ((data = find_d3dbc_section(blob, count, TAG_CLIT, §ion_size)))
|
||||||
|
{
|
||||||
|
code.cli_count = *data++;
|
||||||
|
code.cli._8 = (const double *)data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CTAB does not contain variable names */
|
||||||
|
|
||||||
|
/* Code blob */
|
||||||
|
code.ptr = find_d3dbc_section(blob, count, TAG_FXLC, &count);
|
||||||
|
code.end = code.ptr + count;
|
||||||
|
|
||||||
|
fx_parse_fxlvm_expression(parser, &code);
|
||||||
|
}
|
||||||
|
|
||||||
static void fx_4_parse_fxlvm_expression(struct fx_parser *parser, uint32_t offset)
|
static void fx_4_parse_fxlvm_expression(struct fx_parser *parser, uint32_t offset)
|
||||||
{
|
{
|
||||||
struct vkd3d_shader_dxbc_section_desc *section, fxlc, cli4, ctab;
|
struct vkd3d_shader_dxbc_section_desc *section, fxlc, cli4, ctab;
|
||||||
|
Reference in New Issue
Block a user