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 22:07:11 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-09-02 12:42:43 +0300
commite7613be24cc66716b5e813be9ba07c9fb40eca0e (patch)
treed7ac0cddf0b0062363fd4017a569010948d5cdcf
parent73e216c5bcf2c33351d41d410a35b9f75dffc359 (diff)
Implement EmitIndices opcode.
-rw-r--r--opcodes/dxil/dxil_mesh.cpp27
-rw-r--r--opcodes/dxil/dxil_mesh.hpp1
-rw-r--r--opcodes/opcodes_dxil_builtins.cpp1
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;
}