vkd3d-shader/fx: Move state decomposition to the fx_4_0-specific writing path.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov
2025-06-16 16:40:37 +02:00
committed by Henri Verbeet
parent 9f9cf59b6e
commit 43a29044d6
Notes: Henri Verbeet 2025-06-23 20:19:30 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1585

View File

@@ -502,6 +502,8 @@ static uint32_t write_fx_4_string(const char *string, struct fx_write_context *f
return string_entry->offset; return string_entry->offset;
} }
static void fx_4_decompose_state_blocks(struct hlsl_ir_var *var, struct fx_write_context *fx);
static void write_fx_4_pass(struct hlsl_ir_var *var, struct fx_write_context *fx) static void write_fx_4_pass(struct hlsl_ir_var *var, struct fx_write_context *fx)
{ {
struct vkd3d_bytecode_buffer *buffer = &fx->structured; struct vkd3d_bytecode_buffer *buffer = &fx->structured;
@@ -511,6 +513,8 @@ static void write_fx_4_pass(struct hlsl_ir_var *var, struct fx_write_context *fx
put_u32(buffer, name_offset); put_u32(buffer, name_offset);
count_offset = put_u32(buffer, 0); count_offset = put_u32(buffer, 0);
fx_4_decompose_state_blocks(var, fx);
write_fx_4_annotations(var->annotations, fx); write_fx_4_annotations(var->annotations, fx);
write_fx_4_state_block(var, 0, count_offset, fx); write_fx_4_state_block(var, 0, count_offset, fx);
} }
@@ -3082,6 +3086,25 @@ static unsigned int decompose_fx_4_state_block(struct hlsl_ir_var *var, struct h
return decompose_fx_4_state_block_expand_array(var, block, entry_index, fx); return decompose_fx_4_state_block_expand_array(var, block, entry_index, fx);
} }
static void fx_4_decompose_state_blocks(struct hlsl_ir_var *var, struct fx_write_context *fx)
{
unsigned int block_count = hlsl_get_multiarray_size(var->data_type);
struct hlsl_state_block *block;
if (!var->state_blocks)
return;
for (unsigned int i = 0; i < block_count; ++i)
{
block = var->state_blocks[i];
for (unsigned int j = 0; j < block->count;)
{
j += decompose_fx_4_state_block(var, block, j, fx);
}
}
}
static void write_fx_4_state_block(struct hlsl_ir_var *var, unsigned int block_index, static void write_fx_4_state_block(struct hlsl_ir_var *var, unsigned int block_index,
uint32_t count_offset, struct fx_write_context *fx) uint32_t count_offset, struct fx_write_context *fx)
{ {
@@ -3093,11 +3116,6 @@ static void write_fx_4_state_block(struct hlsl_ir_var *var, unsigned int block_i
{ {
block = var->state_blocks[block_index]; block = var->state_blocks[block_index];
for (i = 0; i < block->count;)
{
i += decompose_fx_4_state_block(var, block, i, fx);
}
for (i = 0; i < block->count; ++i) for (i = 0; i < block->count; ++i)
{ {
struct hlsl_state_block_entry *entry = block->entries[i]; struct hlsl_state_block_entry *entry = block->entries[i];
@@ -3123,6 +3141,8 @@ static void write_fx_4_state_object_initializer(struct hlsl_ir_var *var, struct
struct vkd3d_bytecode_buffer *buffer = &fx->structured; struct vkd3d_bytecode_buffer *buffer = &fx->structured;
uint32_t count_offset; uint32_t count_offset;
fx_4_decompose_state_blocks(var, fx);
for (i = 0; i < elements_count; ++i) for (i = 0; i < elements_count; ++i)
{ {
count_offset = put_u32(buffer, 0); count_offset = put_u32(buffer, 0);