Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ValveSoftware/vkd3d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2020-05-09 13:52:47 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2020-05-12 13:13:30 +0300
commit26f6e59f3e92cfa6204af427f4b0aab787ecb294 (patch)
treecc1570b48f93be5593a3b3924b6ae9335b19d968
parent6d0c1b4dd37d06916057e768a7c255f8c3e6560d (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.c38
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);