vkd3d-shader/fx: Handle regular shader blobs when parsing the state data.

For the pass shader states this blob will contain compiled shaders, for other
state types it will contain expression code. Complex state data is stored separately,
tracing it back to actual state type will require keeping track of already parsed states.
This commit is contained in:
Nikolay Sivov
2025-07-24 20:18:39 +02:00
committed by Henri Verbeet
parent 0652cb4adb
commit dcd1747f12
Notes: Henri Verbeet 2025-07-28 16:38:54 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1651

View File

@@ -20,6 +20,8 @@
#include "hlsl.h"
#define TAG_FX20 0x46580200
static inline size_t put_u32_unaligned(struct vkd3d_bytecode_buffer *buffer, uint32_t value)
{
return bytecode_put_bytes_unaligned(buffer, &value, sizeof(value));
@@ -4333,6 +4335,32 @@ static void fx_parse_fx_2_array_selector(struct fx_parser *parser)
}
}
static void fx_2_parse_code_blob(struct fx_parser *parser, const uint32_t *blob, uint32_t size)
{
uint32_t tag;
if (size < sizeof(tag))
return;
tag = *blob;
if (tag == TAG_FX20)
{
fx_2_parse_fxlvm_expression(parser, blob, size);
return;
}
tag >>= 16;
if (tag == 0xfffe || tag == 0xffff)
{
fx_parse_shader_blob(parser, VKD3D_SHADER_SOURCE_D3D_BYTECODE, blob, size);
vkd3d_string_buffer_printf(&parser->buffer, "\n");
return;
}
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_INVALID_DATA, "Unrecognized code blob type, tag 0x%08x.", *blob);
}
static void fx_parse_fx_2_complex_state(struct fx_parser *parser)
{
struct
@@ -4374,7 +4402,7 @@ static void fx_parse_fx_2_complex_state(struct fx_parser *parser)
size = fx_parser_read_u32(parser);
data = fx_parser_get_ptr(parser, size);
vkd3d_string_buffer_printf(&parser->buffer, "blob size %u\n", size);
fx_2_parse_fxlvm_expression(parser, data, size);
fx_2_parse_code_blob(parser, data, size);
fx_parser_skip(parser, align(size, 4));
}
else