r600/sfn: add emitVertex instructions
authorGert Wollny <gert.wollny@collabora.com>
Fri, 27 Dec 2019 16:49:27 +0000 (17:49 +0100)
committerMarge Bot <eric+marge@anholt.net>
Mon, 10 Feb 2020 19:09:08 +0000 (19:09 +0000)
More preparation for GS support

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3225>

src/gallium/drivers/r600/sfn/sfn_instruction_misc.cpp
src/gallium/drivers/r600/sfn/sfn_instruction_misc.h
src/gallium/drivers/r600/sfn/sfn_ir_to_assembly.cpp

index 8d4fd7e1f39b9ef1707935fc7f7d71bebe591c14..0eac46abb2fe48740869fceca8eabe6ddce1256d 100644 (file)
 #include "sfn_instruction_misc.h"
 
 namespace r600 {
+EmitVertex::EmitVertex(int stream, bool cut):
+   Instruction (emit_vtx),
+   m_stream(stream),
+   m_cut(cut)
+{
+
+}
+
+bool EmitVertex::is_equal_to(const Instruction& lhs) const
+{
+   auto& oth = static_cast<const EmitVertex&>(lhs);
+   return oth.m_stream == m_stream &&
+         oth.m_cut == m_cut;
+}
+
+void EmitVertex::do_print(std::ostream& os) const
+{
+   os << (m_cut ? "EMIT_CUT_VERTEX @" : "EMIT_VERTEX @") << m_stream;
+}
 
 WaitAck::WaitAck(int nack):
    Instruction (wait_ack),
index 883b3cd9a0ab36598b1471c0aaac55ad2bca60a7..b7be59017ee1c6471778e1aa1d68700db1d3320a 100644 (file)
 
 namespace r600 {
 
+class EmitVertex : public Instruction {
+public:
+   EmitVertex(int stream, bool cut);
+   ECFOpCode op() const {return m_cut ? cf_cut_vertex: cf_emit_vertex;}
+   int stream() const { return m_stream;}
+private:
+
+   bool is_equal_to(const Instruction& lhs) const override;
+   void do_print(std::ostream& os) const override;
+   int m_stream;
+   bool m_cut;
+};
+
 class WaitAck : public Instruction {
 public:
    WaitAck(int nack);
index c6beddd79c785d995ec0fc5f0e5a019c08924dbd..a26054397d8354aac4621b3422f70d0346c7126c 100644 (file)
@@ -53,6 +53,7 @@ private:
    bool emit_if_start(const IfInstruction & if_instr);
    bool emit_else(const ElseInstruction & else_instr);
    bool emit_endif(const IfElseEndInstruction & endif_instr);
+   bool emit_emit_vertex(const EmitVertex &instr);
 
    bool emit_loop_begin(const LoopBeginInstruction& instr);
    bool emit_loop_end(const LoopEndInstruction& instr);
@@ -167,6 +168,8 @@ bool AssemblyFromShaderLegacyImpl::emit(const Instruction::Pointer i)
       return emit_streamout(static_cast<const StreamOutIntruction&>(*i));
    case Instruction::ring:
       return emit_memringwrite(static_cast<const MemRingOutIntruction&>(*i));
+   case Instruction::emit_vtx:
+      return emit_emit_vertex(static_cast<const EmitVertex&>(*i));
    case Instruction::wait_ack:
       return emit_wait_ack(static_cast<const WaitAck&>(*i));
    case Instruction::mem_wr_scratch:
@@ -772,6 +775,16 @@ bool AssemblyFromShaderLegacyImpl::emit_vtx(const FetchInstruction& fetch_instr)
    return true;
 }
 
+bool AssemblyFromShaderLegacyImpl::emit_emit_vertex(const EmitVertex &instr)
+{
+   int r = r600_bytecode_add_cfinst(m_bc, instr.op());
+   if (!r)
+      m_bc->cf_last->count = instr.stream();
+   assert(m_bc->cf_last->count < 4);
+
+   return r == 0;
+}
+
 bool AssemblyFromShaderLegacyImpl::emit_wait_ack(const WaitAck& instr)
 {
    int r = r600_bytecode_add_cfinst(m_bc, instr.op());