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

github.com/HansKristian-Work/dxil-spirv.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-02-02 20:47:22 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-09-02 12:42:43 +0300
commitb9372b55d77adcdd33d568105abdafcafcfd60bd (patch)
treedec9506ec9e48a75f37ff1bdd8b386221662b4a6
parentf018ac1339eb89af8c6d1b38fe0311659472edc8 (diff)
Implement StoreVertexOutput opcode.
-rw-r--r--opcodes/dxil/dxil_mesh.cpp43
-rw-r--r--opcodes/dxil/dxil_mesh.hpp1
-rw-r--r--opcodes/opcodes_dxil_builtins.cpp1
3 files changed, 45 insertions, 0 deletions
diff --git a/opcodes/dxil/dxil_mesh.cpp b/opcodes/dxil/dxil_mesh.cpp
index 0f42b9b..8904894 100644
--- a/opcodes/dxil/dxil_mesh.cpp
+++ b/opcodes/dxil/dxil_mesh.cpp
@@ -41,6 +41,49 @@ bool emit_set_mesh_output_counts_instruction(Converter::Impl &impl, const llvm::
return true;
}
+bool emit_store_vertex_output_instruction(Converter::Impl &impl, const llvm::CallInst *instruction)
+{
+ auto &builder = impl.builder();
+ uint32_t output_element_index;
+ if (!get_constant_operand(instruction, 1, &output_element_index))
+ return false;
+
+ const auto &meta = impl.output_elements_meta[output_element_index];
+
+ uint32_t var_id = meta.id;
+ uint32_t ptr_id;
+
+ spv::Id output_type_id = builder.getContainedTypeId(builder.getDerefTypeId(var_id));
+
+ bool row_index = false;
+ if (builder.isArrayType(output_type_id))
+ {
+ row_index = true;
+ output_type_id = builder.getContainedTypeId(output_type_id);
+ }
+ uint32_t num_cols = builder.getNumTypeComponents(output_type_id);
+
+ Operation *op = impl.allocate(
+ spv::OpAccessChain, builder.makePointer(spv::StorageClassOutput, builder.getScalarTypeId(output_type_id)));
+ ptr_id = op->id;
+
+ op->add_id(var_id);
+ op->add_id(impl.get_id_for_value(instruction->getOperand(5)));
+ if (row_index)
+ op->add_id(impl.get_id_for_value(instruction->getOperand(2)));
+ if (num_cols > 1)
+ op->add_id(impl.get_id_for_value(instruction->getOperand(3), 32));
+
+ impl.add(op);
+
+ spv::Id store_value = impl.get_id_for_value(instruction->getOperand(4));
+
+ op = impl.allocate(spv::OpStore);
+ op->add_ids({ ptr_id, impl.fixup_store_type_io(meta.component_type, 1, store_value) });
+ impl.add(op);
+ return true;
+}
+
bool emit_store_primitive_output_instruction(Converter::Impl &impl, const llvm::CallInst *instruction)
{
auto &builder = impl.builder();
diff --git a/opcodes/dxil/dxil_mesh.hpp b/opcodes/dxil/dxil_mesh.hpp
index 9059541..2b9dd1e 100644
--- a/opcodes/dxil/dxil_mesh.hpp
+++ b/opcodes/dxil/dxil_mesh.hpp
@@ -29,5 +29,6 @@
namespace dxil_spv
{
bool emit_set_mesh_output_counts_instruction(Converter::Impl &impl, const llvm::CallInst *instruction);
+bool emit_store_vertex_output_instruction(Converter::Impl &impl, const llvm::CallInst *instruction);
bool emit_store_primitive_output_instruction(Converter::Impl &impl, const llvm::CallInst *instruction);
} // namespace dxil_spv
diff --git a/opcodes/opcodes_dxil_builtins.cpp b/opcodes/opcodes_dxil_builtins.cpp
index 1f3a6c1..e554672 100644
--- a/opcodes/opcodes_dxil_builtins.cpp
+++ b/opcodes/opcodes_dxil_builtins.cpp
@@ -338,6 +338,7 @@ struct DXILDispatcher
// dxil_mesh.cpp
OP(SetMeshOutputCounts) = emit_set_mesh_output_counts_instruction;
+ OP(StoreVertexOutput) = emit_store_vertex_output_instruction;
OP(StorePrimitiveOutput) = emit_store_primitive_output_instruction;
}