diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2020-05-09 13:52:47 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2020-05-12 13:13:30 +0300 |
commit | 26f6e59f3e92cfa6204af427f4b0aab787ecb294 (patch) | |
tree | cc1570b48f93be5593a3b3924b6ae9335b19d968 | |
parent | 6d0c1b4dd37d06916057e768a7c255f8c3e6560d (diff) |
vkd3d-shader: Add helper to declare a struct once.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
-rw-r--r-- | libs/vkd3d-shader/spirv.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 5a44d55d..190082a6 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -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); |