mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/fx: Add a format-specific callback to write state assignments.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
committed by
Henri Verbeet
parent
3537feb45c
commit
92c711a7d5
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
@@ -251,6 +251,8 @@ struct fx_write_context_ops
|
|||||||
void (*write_technique)(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
void (*write_technique)(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
||||||
void (*write_pass)(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
void (*write_pass)(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
||||||
void (*write_annotation)(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
void (*write_annotation)(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
||||||
|
void (*write_state_assignment)(const struct hlsl_ir_var *var,
|
||||||
|
struct hlsl_state_block_entry *entry, struct fx_write_context *fx);
|
||||||
bool are_child_effects_supported;
|
bool are_child_effects_supported;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -313,6 +315,15 @@ static void write_pass(struct hlsl_ir_var *var, struct fx_write_context *fx)
|
|||||||
fx->ops->write_pass(var, fx);
|
fx->ops->write_pass(var, fx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void write_state_assignment(const struct hlsl_ir_var *var,
|
||||||
|
struct hlsl_state_block_entry *entry, struct fx_write_context *fx)
|
||||||
|
{
|
||||||
|
fx->ops->write_state_assignment(var, entry, fx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t write_state_block(struct hlsl_ir_var *var,
|
||||||
|
unsigned int block_index, struct fx_write_context *fx);
|
||||||
|
|
||||||
static uint32_t write_annotations(struct hlsl_scope *scope, struct fx_write_context *fx)
|
static uint32_t write_annotations(struct hlsl_scope *scope, struct fx_write_context *fx)
|
||||||
{
|
{
|
||||||
struct hlsl_ctx *ctx = fx->ctx;
|
struct hlsl_ctx *ctx = fx->ctx;
|
||||||
@@ -348,8 +359,6 @@ static void write_fx_4_annotations(struct hlsl_scope *scope, struct fx_write_con
|
|||||||
static uint32_t write_fx_4_type(const struct hlsl_type *type, struct fx_write_context *fx);
|
static uint32_t write_fx_4_type(const struct hlsl_type *type, struct fx_write_context *fx);
|
||||||
static const char * get_fx_4_type_name(const struct hlsl_type *type);
|
static const char * get_fx_4_type_name(const struct hlsl_type *type);
|
||||||
static void write_fx_4_annotation(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
static void write_fx_4_annotation(struct hlsl_ir_var *var, struct fx_write_context *fx);
|
||||||
static uint32_t write_fx_4_state_block(struct hlsl_ir_var *var, unsigned int block_index,
|
|
||||||
struct fx_write_context *fx);
|
|
||||||
|
|
||||||
static uint32_t write_type(const struct hlsl_type *type, struct fx_write_context *fx)
|
static uint32_t write_type(const struct hlsl_type *type, struct fx_write_context *fx)
|
||||||
{
|
{
|
||||||
@@ -516,7 +525,7 @@ static void write_fx_4_pass(struct hlsl_ir_var *var, struct fx_write_context *fx
|
|||||||
fx_4_decompose_state_blocks(var, fx);
|
fx_4_decompose_state_blocks(var, fx);
|
||||||
|
|
||||||
write_fx_4_annotations(var->annotations, fx);
|
write_fx_4_annotations(var->annotations, fx);
|
||||||
count = write_fx_4_state_block(var, 0, fx);
|
count = write_state_block(var, 0, fx);
|
||||||
set_u32(buffer, count_offset, count);
|
set_u32(buffer, count_offset, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1985,12 +1994,21 @@ static void write_fx_2_annotation(struct hlsl_ir_var *var, struct fx_write_conte
|
|||||||
put_u32(buffer, value_offset);
|
put_u32(buffer, value_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void write_fx_2_state_assignment(const struct hlsl_ir_var *var,
|
||||||
|
struct hlsl_state_block_entry *entry, struct fx_write_context *fx)
|
||||||
|
{
|
||||||
|
struct hlsl_ctx *ctx = fx->ctx;
|
||||||
|
|
||||||
|
hlsl_fixme(ctx, &var->loc, "Writing fx_2_0 state assignments is not implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
static const struct fx_write_context_ops fx_2_ops =
|
static const struct fx_write_context_ops fx_2_ops =
|
||||||
{
|
{
|
||||||
.write_string = write_fx_2_string,
|
.write_string = write_fx_2_string,
|
||||||
.write_technique = write_fx_2_technique,
|
.write_technique = write_fx_2_technique,
|
||||||
.write_pass = write_fx_2_pass,
|
.write_pass = write_fx_2_pass,
|
||||||
.write_annotation = write_fx_2_annotation,
|
.write_annotation = write_fx_2_annotation,
|
||||||
|
.write_state_assignment = write_fx_2_state_assignment,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int hlsl_fx_2_write(struct hlsl_ctx *ctx, struct vkd3d_shader_code *out)
|
static int hlsl_fx_2_write(struct hlsl_ctx *ctx, struct vkd3d_shader_code *out)
|
||||||
@@ -2053,12 +2071,16 @@ static int hlsl_fx_2_write(struct hlsl_ctx *ctx, struct vkd3d_shader_code *out)
|
|||||||
return fx_write_context_cleanup(&fx);
|
return fx_write_context_cleanup(&fx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void write_fx_4_state_assignment(const struct hlsl_ir_var *var,
|
||||||
|
struct hlsl_state_block_entry *entry, struct fx_write_context *fx);
|
||||||
|
|
||||||
static const struct fx_write_context_ops fx_4_ops =
|
static const struct fx_write_context_ops fx_4_ops =
|
||||||
{
|
{
|
||||||
.write_string = write_fx_4_string,
|
.write_string = write_fx_4_string,
|
||||||
.write_technique = write_fx_4_technique,
|
.write_technique = write_fx_4_technique,
|
||||||
.write_pass = write_fx_4_pass,
|
.write_pass = write_fx_4_pass,
|
||||||
.write_annotation = write_fx_4_annotation,
|
.write_annotation = write_fx_4_annotation,
|
||||||
|
.write_state_assignment = write_fx_4_state_assignment,
|
||||||
.are_child_effects_supported = true,
|
.are_child_effects_supported = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3106,7 +3128,7 @@ static void fx_4_decompose_state_blocks(struct hlsl_ir_var *var, struct fx_write
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t write_fx_4_state_block(struct hlsl_ir_var *var, unsigned int block_index,
|
static uint32_t write_state_block(struct hlsl_ir_var *var, unsigned int block_index,
|
||||||
struct fx_write_context *fx)
|
struct fx_write_context *fx)
|
||||||
{
|
{
|
||||||
struct hlsl_state_block *block;
|
struct hlsl_state_block *block;
|
||||||
@@ -3127,7 +3149,7 @@ static uint32_t write_fx_4_state_block(struct hlsl_ir_var *var, unsigned int blo
|
|||||||
/* Resolve special constant names and property names. */
|
/* Resolve special constant names and property names. */
|
||||||
resolve_fx_state_block_values(var, entry, fx);
|
resolve_fx_state_block_values(var, entry, fx);
|
||||||
|
|
||||||
write_fx_4_state_assignment(var, entry, fx);
|
write_state_assignment(var, entry, fx);
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3146,7 +3168,7 @@ static void write_fx_4_state_object_initializer(struct hlsl_ir_var *var, struct
|
|||||||
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);
|
||||||
count = write_fx_4_state_block(var, i, fx);
|
count = write_state_block(var, i, fx);
|
||||||
set_u32(buffer, count_offset, count);
|
set_u32(buffer, count_offset, count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user