Use 'discard' to denote terminated or demoted invocations

SPIR-V's `OpKill` instruction has been deprecated because some
implementations interpret it as fully terminating an invocation, while
others implement it as demoting an invocation to a 'helper' which still
performs arithmetic computations but doesn't perform memory writes.

This change follows suite by avoiding 'kill', and instead uses
'terminate' or 'demote-to-helper' nomenclature where the semantics need
to be explicit. Since fragment data produced by terminated or demoted
invocations must be discarded, this change uses 'discard' to denote
either of these two fates of an invocation.

Note that while HLSL uses 'discard' to specifically denote demotion to a
helper invocation, in the context of Vulkan, or elsewhere for that
matter, it does not imply whether or not arithmetic computation still
took place. So this shouldn't add any new confusion, while avoiding any
association with the chosen OpKill implementation.

Bug: b/204502919
Change-Id: I0b6a70b34a0e7a70abd74e3330e88187f095cde2
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/64788
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/PixelProcessor.cpp b/src/Device/PixelProcessor.cpp
index 8493ce7..93848b0 100644
--- a/src/Device/PixelProcessor.cpp
+++ b/src/Device/PixelProcessor.cpp
@@ -131,12 +131,12 @@
 
 	state.occlusionEnabled = occlusionEnabled;
 
-	bool fragmentContainsKill = (fragmentShader && fragmentShader->getAnalysis().ContainsKill);
+	bool fragmentContainsDiscard = (fragmentShader && fragmentShader->getAnalysis().ContainsDiscard);
 	for(int i = 0; i < MAX_COLOR_BUFFERS; i++)
 	{
 		state.colorWriteMask |= pipelineState.colorWriteActive(i, attachments) << (4 * i);
 		state.colorFormat[i] = attachments.colorFormat(i);
-		state.blendState[i] = pipelineState.getBlendState(i, attachments, fragmentContainsKill);
+		state.blendState[i] = pipelineState.getBlendState(i, attachments, fragmentContainsDiscard);
 	}
 
 	state.multiSampleCount = static_cast<unsigned int>(pipelineState.getSampleCount());
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index 6b16d3b..44e478e 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -197,7 +197,7 @@
 	// handled separately, through the cMask.
 	auto activeLaneMask = SIMD::Int(0xFFFFFFFF);
 	auto storesAndAtomicsMask = maskAny(cMask, sMask, zMask, samples);
-	routine.killMask = 0;
+	routine.discardMask = 0;
 
 	spirvShader->emit(&routine, activeLaneMask, storesAndAtomicsMask, descriptorSets, state.multiSampleCount);
 	spirvShader->emitEpilog(&routine);
@@ -218,11 +218,11 @@
 
 	clampColor(c);
 
-	if(spirvShader->getAnalysis().ContainsKill)
+	if(spirvShader->getAnalysis().ContainsDiscard)
 	{
 		for(unsigned int q : samples)
 		{
-			cMask[q] &= ~routine.killMask;
+			cMask[q] &= ~routine.discardMask;
 		}
 	}
 
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 3bf2dd2..480f16a 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -282,7 +282,7 @@
 
 			Bool alphaPass = alphaTest(cMask, samples);
 
-			if((spirvShader && spirvShader->getAnalysis().ContainsKill) || state.alphaToCoverage)
+			if((spirvShader && spirvShader->getAnalysis().ContainsDiscard) || state.alphaToCoverage)
 			{
 				for(unsigned int q : samples)
 				{
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 8d99850..d9b393c 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -234,7 +234,7 @@
 		// Termination instructions:
 		case spv::OpKill:
 		case spv::OpTerminateInvocation:
-			analysis.ContainsKill = true;
+			analysis.ContainsDiscard = true;
 			// [[fallthrough]]
 
 		case spv::OpUnreachable:
@@ -256,7 +256,7 @@
 			break;
 
 		case spv::OpDemoteToHelperInvocation:
-			analysis.ContainsKill = true;
+			analysis.ContainsDiscard = true;
 			break;
 
 		case spv::OpLoopMerge:
@@ -2092,7 +2092,7 @@
 
 	case spv::OpKill:
 	case spv::OpTerminateInvocation:
-		return EmitKill(insn, state);
+		return EmitTerminateInvocation(insn, state);
 
 	case spv::OpDemoteToHelperInvocation:
 		return EmitDemoteToHelperInvocation(insn, state);
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 561032b..cec18c8 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -669,7 +669,7 @@
 
 	struct Analysis
 	{
-		bool ContainsKill : 1;
+		bool ContainsDiscard : 1;  // OpKill, OpTerminateInvocation, or OpDemoteToHelperInvocation
 		bool ContainsControlBarriers : 1;
 		bool NeedsCentroid : 1;
 		bool ContainsSampleQualifier : 1;
@@ -1334,7 +1334,7 @@
 	EmitResult EmitSwitch(InsnIterator insn, EmitState *state) const;
 	EmitResult EmitUnreachable(InsnIterator insn, EmitState *state) const;
 	EmitResult EmitReturn(InsnIterator insn, EmitState *state) const;
-	EmitResult EmitKill(InsnIterator insn, EmitState *state) const;
+	EmitResult EmitTerminateInvocation(InsnIterator insn, EmitState *state) const;
 	EmitResult EmitDemoteToHelperInvocation(InsnIterator insn, EmitState *state) const;
 	EmitResult EmitIsHelperInvocation(InsnIterator insn, EmitState *state) const;
 	EmitResult EmitFunctionCall(InsnIterator insn, EmitState *state) const;
@@ -1540,7 +1540,7 @@
 	Pointer<Int> descriptorDynamicOffsets;
 	Pointer<Byte> pushConstants;
 	Pointer<Byte> constants;
-	Int killMask = Int{ 0 };
+	Int discardMask = 0;
 
 	// Shader invocation state.
 	// Not all of these variables are used for every type of shader, and some
diff --git a/src/Pipeline/SpirvShaderControlFlow.cpp b/src/Pipeline/SpirvShaderControlFlow.cpp
index bdd1923..2624032 100644
--- a/src/Pipeline/SpirvShaderControlFlow.cpp
+++ b/src/Pipeline/SpirvShaderControlFlow.cpp
@@ -572,9 +572,9 @@
 	return EmitResult::Terminator;
 }
 
-SpirvShader::EmitResult SpirvShader::EmitKill(InsnIterator insn, EmitState *state) const
+SpirvShader::EmitResult SpirvShader::EmitTerminateInvocation(InsnIterator insn, EmitState *state) const
 {
-	state->routine->killMask |= SignMask(state->activeLaneMask());
+	state->routine->discardMask |= SignMask(state->activeLaneMask());
 	SetActiveLaneMask(SIMD::Int(0), state);
 	return EmitResult::Terminator;
 }
@@ -582,7 +582,7 @@
 SpirvShader::EmitResult SpirvShader::EmitDemoteToHelperInvocation(InsnIterator insn, EmitState *state) const
 {
 	state->routine->helperInvocation |= state->activeLaneMask();
-	state->routine->killMask |= SignMask(state->activeLaneMask());
+	state->routine->discardMask |= SignMask(state->activeLaneMask());
 	SetStoresAndAtomicsMask(state->storesAndAtomicsMask() & ~state->activeLaneMask(), state);
 	return EmitResult::Continue;
 }