glslang -> SPIR-V: Correct code generated for EmitStreamVertex and EndStreamPrimitive.


git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@30270 e7fa87d3-cd2b-0410-9028-fcbf551c1848
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 10e7b92..332c5ec 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -736,6 +736,14 @@
         }

 

         return false;

+

+    case glslang::EOpEmitStreamVertex:

+        builder.createNoResultOp(spv::OpEmitStreamVertex, operand);

+        return false;

+    case glslang::EOpEndStreamPrimitive:

+        builder.createNoResultOp(spv::OpEndStreamPrimitive, operand);

+        return false;

+

     default:

         spv::MissingFunctionality("glslang unary");

         break;

@@ -967,13 +975,7 @@
     case glslang::EOpMemoryBarrierShared:

     case glslang::EOpGroupMemoryBarrier:

         noReturnValue = true;

-        // These all have 0 operands and will naturally finish up in the createIntrinsic code below for 0 operands

-        break;

-

-    case glslang::EOpEmitStreamVertex:

-    case glslang::EOpEndStreamPrimitive:

-        noReturnValue = true;

-        // These all have 1 operand and will naturally finish up in the createIntrinsic code below for 1 operand

+        // These all have 0 operands and will naturally finish up in the code below for 0 operands

         break;

 

     default:

@@ -2137,13 +2139,6 @@
         libCall = GLSL_STD_450::Sign;

         break;

 

-    case glslang::EOpEmitStreamVertex:

-        unaryOp = spv::OpEmitStreamVertex;

-        break;

-    case glslang::EOpEndStreamPrimitive:

-        unaryOp = spv::OpEndStreamPrimitive;

-        break;

-

     default:

         return 0;

     }

@@ -2331,12 +2326,13 @@
     else {

         switch (operands.size()) {

         case 0:

-            id = builder.createEmptyOp(opCode);

-            break;

+            // should all be handled by visitAggregate and createNoArgOperation

+            assert(0);

+            return 0;

         case 1:

             // should all be handled by createUnaryOperation

             assert(0);

-            break;

+            return 0;

         case 2:

             id = builder.createBinOp(opCode, typeId, operands[0], operands[1]);

             break;

@@ -2362,9 +2358,11 @@
 

     switch (op) {

     case glslang::EOpEmitVertex:

-        return builder.createEmptyOp(spv::OpEmitVertex);

+        builder.createNoResultOp(spv::OpEmitVertex);

+        return 0;

     case glslang::EOpEndPrimitive:

-        return builder.createEmptyOp(spv::OpEndPrimitive);

+        builder.createNoResultOp(spv::OpEndPrimitive);

+        return 0;

     case glslang::EOpBarrier:

         builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsAllMemory);

         builder.createControlBarrier(spv::ExecutionScopeDevice);

diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 7421284..8e2b9bc 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -877,12 +877,19 @@
     return insert->getResultId();

 }

 

-Id Builder::createEmptyOp(OpCode opCode)

+// An opcode that has no operands, no result id, and no type

+void Builder::createNoResultOp(OpCode opCode)

 {

     Instruction* op = new Instruction(opCode);

     buildPoint->addInstruction(op);

+}

 

-    return op->getResultId();

+// An opcode that has one operand, no result id, and no type

+void Builder::createNoResultOp(OpCode opCode, Id operand)

+{

+    Instruction* op = new Instruction(opCode);

+    op->addIdOperand(operand);

+    buildPoint->addInstruction(op);

 }

 

 void Builder::createControlBarrier(unsigned executionScope)

@@ -900,6 +907,7 @@
     buildPoint->addInstruction(op);

 }

 

+// An opcode that has one operands, a result id, and a type

 Id Builder::createUnaryOp(OpCode opCode, Id typeId, Id operand)

 {

     Instruction* op = new Instruction(getUniqueId(), typeId, opCode);

diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index f2b746c..787d852 100644
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -228,7 +228,8 @@
     Id createCompositeInsert(Id object, Id composite, Id typeId, unsigned index);

     Id createCompositeInsert(Id object, Id composite, Id typeId, std::vector<unsigned>& indexes);

 

-    Id createEmptyOp(OpCode);

+    void createNoResultOp(OpCode);

+    void createNoResultOp(OpCode, Id operand);

     void createControlBarrier(unsigned executionScope);

     void createMemoryBarrier(unsigned executionScope, unsigned memorySemantics);

     Id createUnaryOp(OpCode, Id typeId, Id operand);