diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-02-02 20:47:22 +0300 |
---|---|---|
committer | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-09-02 12:42:43 +0300 |
commit | b9372b55d77adcdd33d568105abdafcafcfd60bd (patch) | |
tree | dec9506ec9e48a75f37ff1bdd8b386221662b4a6 | |
parent | f018ac1339eb89af8c6d1b38fe0311659472edc8 (diff) |
Implement StoreVertexOutput opcode.
-rw-r--r-- | opcodes/dxil/dxil_mesh.cpp | 43 | ||||
-rw-r--r-- | opcodes/dxil/dxil_mesh.hpp | 1 | ||||
-rw-r--r-- | opcodes/opcodes_dxil_builtins.cpp | 1 |
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; } |