vkd3d-shader: Add helper to declare a struct once.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-05-09 12:52:47 +02:00 committed by Hans-Kristian Arntzen
parent 6d0c1b4dd3
commit 26f6e59f3e
1 changed files with 37 additions and 1 deletions

View File

@ -410,6 +410,8 @@ static void vkd3d_spirv_build_string(struct vkd3d_spirv_stream *stream,
}
typedef uint32_t (*vkd3d_spirv_build_pfn)(struct vkd3d_spirv_builder *builder);
typedef uint32_t (*vkd3d_spirv_build_v_pfn)(struct vkd3d_spirv_builder *builder,
const uint32_t *operands, unsigned int operand_count);
typedef uint32_t (*vkd3d_spirv_build1_pfn)(struct vkd3d_spirv_builder *builder,
uint32_t operand0);
typedef uint32_t (*vkd3d_spirv_build1v_pfn)(struct vkd3d_spirv_builder *builder,
@ -477,6 +479,33 @@ static void vkd3d_spirv_insert_declaration(struct vkd3d_spirv_builder *builder,
}
}
static uint32_t vkd3d_spirv_build_once_v(struct vkd3d_spirv_builder *builder,
SpvOp op, const uint32_t *operands, unsigned int operand_count,
vkd3d_spirv_build_v_pfn build_pfn)
{
struct vkd3d_spirv_declaration declaration;
unsigned int i, param_idx = 0;
struct rb_entry *entry;
if (operand_count > ARRAY_SIZE(declaration.parameters))
{
WARN("Unsupported parameter count %u (opcode %#x).\n", operand_count, op);
return build_pfn(builder, operands, operand_count);
}
declaration.op = op;
for (i = 0; i < operand_count; ++i)
declaration.parameters[param_idx++] = operands[i];
declaration.parameter_count = param_idx;
if ((entry = rb_get(&builder->declarations, &declaration)))
return RB_ENTRY_VALUE(entry, struct vkd3d_spirv_declaration, entry)->id;
declaration.id = build_pfn(builder, operands, operand_count);
vkd3d_spirv_insert_declaration(builder, &declaration);
return declaration.id;
}
static uint32_t vkd3d_spirv_build_once1(struct vkd3d_spirv_builder *builder,
SpvOp op, uint32_t operand0, vkd3d_spirv_build1_pfn build_pfn)
{
@ -985,12 +1014,19 @@ static uint32_t vkd3d_spirv_get_op_type_runtime_array(struct vkd3d_spirv_builder
}
static uint32_t vkd3d_spirv_build_op_type_struct(struct vkd3d_spirv_builder *builder,
uint32_t *members, unsigned int member_count)
const uint32_t *members, unsigned int member_count)
{
return vkd3d_spirv_build_op_rv(builder, &builder->global_stream,
SpvOpTypeStruct, members, member_count);
}
static uint32_t vkd3d_spirv_get_op_type_struct(struct vkd3d_spirv_builder *builder,
const uint32_t *members, unsigned int member_count)
{
return vkd3d_spirv_build_once_v(builder, SpvOpTypeStruct, members, member_count,
vkd3d_spirv_build_op_type_struct);
}
static uint32_t vkd3d_spirv_build_op_type_sampler(struct vkd3d_spirv_builder *builder)
{
return vkd3d_spirv_build_op_r(builder, &builder->global_stream, SpvOpTypeSampler);