diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-02-02 22:07:11 +0300 |
---|---|---|
committer | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-09-02 12:42:43 +0300 |
commit | e7613be24cc66716b5e813be9ba07c9fb40eca0e (patch) | |
tree | d7ac0cddf0b0062363fd4017a569010948d5cdcf | |
parent | 73e216c5bcf2c33351d41d410a35b9f75dffc359 (diff) |
Implement EmitIndices opcode.
-rw-r--r-- | opcodes/dxil/dxil_mesh.cpp | 27 | ||||
-rw-r--r-- | opcodes/dxil/dxil_mesh.hpp | 1 | ||||
-rw-r--r-- | opcodes/opcodes_dxil_builtins.cpp | 1 |
3 files changed, 29 insertions, 0 deletions
diff --git a/opcodes/dxil/dxil_mesh.cpp b/opcodes/dxil/dxil_mesh.cpp index 8904894..cf064d5 100644 --- a/opcodes/dxil/dxil_mesh.cpp +++ b/opcodes/dxil/dxil_mesh.cpp @@ -41,6 +41,33 @@ bool emit_set_mesh_output_counts_instruction(Converter::Impl &impl, const llvm:: return true; } +bool emit_emit_indices_instruction(Converter::Impl &impl, const llvm::CallInst *instruction) +{ + auto &builder = impl.builder(); + + unsigned index_dim = impl.execution_mode_meta.primitive_index_dimension; + spv::Id index_type_id = impl.get_type_id(DXIL::ComponentType::U32, 1, index_dim); + spv::Id index_scalar_type_id = impl.get_type_id(DXIL::ComponentType::U32, 1, 1); + + spv::Id components[3]; + for (unsigned i = 0; i < index_dim; i++) + components[i] = impl.get_id_for_value(instruction->getOperand(2 + i)); + spv::Id index_id = impl.build_vector(index_scalar_type_id, components, index_dim); + + Operation *op = impl.allocate(spv::OpAccessChain, + builder.makePointer(spv::StorageClassOutput, index_type_id)); + spv::Id ptr_id = op->id; + + op->add_id(impl.primitive_index_array_id); + op->add_id(impl.get_id_for_value(instruction->getOperand(1))); + impl.add(op); + + op = impl.allocate(spv::OpStore); + op->add_ids({ ptr_id, index_id }); + impl.add(op); + return true; +} + bool emit_store_vertex_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 2b9dd1e..92a4636 100644 --- a/opcodes/dxil/dxil_mesh.hpp +++ b/opcodes/dxil/dxil_mesh.hpp @@ -29,6 +29,7 @@ namespace dxil_spv { bool emit_set_mesh_output_counts_instruction(Converter::Impl &impl, const llvm::CallInst *instruction); +bool emit_emit_indices_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 e554672..24685ac 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(EmitIndices) = emit_emit_indices_instruction; OP(StoreVertexOutput) = emit_store_vertex_output_instruction; OP(StorePrimitiveOutput) = emit_store_primitive_output_instruction; } |