Pipeline/SpirvShader: Add Impl struct

Instead of declaring a bunch of private forward declarations in SpirvShader, create a single Impl struct, which can hold all the forward declarations. The names of these forward declarations can then directly match the SpirvShader file name suffixes.

The Impl struct can also be used later to store pointers to any internal state.

This was proposed here: https://swiftshader-review.googlesource.com/c/SwiftShader/+/38929/1/src/Pipeline/SpirvShaderGroup.cpp#23

Bug: b/145351270
Change-Id: Ie0de5e651fce9969fe0c24f51ae57652cade54d1
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39883
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index b7c3eeb..45265de 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -1138,7 +1138,14 @@
 	// Returns 0 when invalid.
 	static VkShaderStageFlagBits executionModelToStage(spv::ExecutionModel model);
 
-	struct GroupOps;
+	// Impl holds private forward declaration structs that are implemented
+	// in the corresponding SpirvShaderXXX.cpp files.
+	// This allows access to the private members of the SpirvShader, without
+	// littering the header with implementation details.
+	struct Impl
+	{
+		struct Group;
+	};
 };
 
 class SpirvRoutine
diff --git a/src/Pipeline/SpirvShaderGroup.cpp b/src/Pipeline/SpirvShaderGroup.cpp
index 77b73ea..877020d 100644
--- a/src/Pipeline/SpirvShaderGroup.cpp
+++ b/src/Pipeline/SpirvShaderGroup.cpp
@@ -18,7 +18,7 @@
 
 namespace sw {
 
-struct SpirvShader::GroupOps
+struct SpirvShader::Impl::Group
 {
 
 	// Template function to perform a binary operation.
@@ -318,7 +318,7 @@
 		case spv::OpGroupNonUniformIAdd:
 		{
 			using Type = SIMD::Int;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(0),
 			    [](RValue<Type> a, RValue<Type> b) { return a + b; });
@@ -328,7 +328,7 @@
 		case spv::OpGroupNonUniformFAdd:
 		{
 			using Type = SIMD::Float;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(0.),
 			    [](RValue<Type> a, RValue<Type> b) { return a + b; });
@@ -338,7 +338,7 @@
 		case spv::OpGroupNonUniformIMul:
 		{
 			using Type = SIMD::Int;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(1),
 			    [](RValue<Type> a, RValue<Type> b) { return a * b; });
@@ -348,7 +348,7 @@
 		case spv::OpGroupNonUniformFMul:
 		{
 			using Type = SIMD::Float;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(1.),
 			    [](RValue<Type> a, RValue<Type> b) { return a * b; });
@@ -358,7 +358,7 @@
 		case spv::OpGroupNonUniformBitwiseAnd:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(~0u),
 			    [](RValue<Type> a, RValue<Type> b) { return a & b; });
@@ -368,7 +368,7 @@
 		case spv::OpGroupNonUniformBitwiseOr:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(0),
 			    [](RValue<Type> a, RValue<Type> b) { return a | b; });
@@ -378,7 +378,7 @@
 		case spv::OpGroupNonUniformBitwiseXor:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(0),
 			    [](RValue<Type> a, RValue<Type> b) { return a ^ b; });
@@ -388,7 +388,7 @@
 		case spv::OpGroupNonUniformSMin:
 		{
 			using Type = SIMD::Int;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(INT32_MAX),
 			    [](RValue<Type> a, RValue<Type> b) { return Min(a, b); });
@@ -398,7 +398,7 @@
 		case spv::OpGroupNonUniformUMin:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(~0u),
 			    [](RValue<Type> a, RValue<Type> b) { return Min(a, b); });
@@ -408,7 +408,7 @@
 		case spv::OpGroupNonUniformFMin:
 		{
 			using Type = SIMD::Float;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type::positive_inf(),
 			    [](RValue<Type> a, RValue<Type> b) { return NMin(a, b); });
@@ -418,7 +418,7 @@
 		case spv::OpGroupNonUniformSMax:
 		{
 			using Type = SIMD::Int;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(INT32_MIN),
 			    [](RValue<Type> a, RValue<Type> b) { return Max(a, b); });
@@ -428,7 +428,7 @@
 		case spv::OpGroupNonUniformUMax:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(0),
 			    [](RValue<Type> a, RValue<Type> b) { return Max(a, b); });
@@ -438,7 +438,7 @@
 		case spv::OpGroupNonUniformFMax:
 		{
 			using Type = SIMD::Float;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type::negative_inf(),
 			    [](RValue<Type> a, RValue<Type> b) { return NMax(a, b); });
@@ -448,7 +448,7 @@
 		case spv::OpGroupNonUniformLogicalAnd:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(~0u),
 			    [](RValue<Type> a, RValue<Type> b) {
@@ -461,7 +461,7 @@
 		case spv::OpGroupNonUniformLogicalOr:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(0),
 			    [](RValue<Type> a, RValue<Type> b) {
@@ -474,7 +474,7 @@
 		case spv::OpGroupNonUniformLogicalXor:
 		{
 			using Type = SIMD::UInt;
-			SpirvShader::GroupOps::BinaryOperation(
+			Impl::Group::BinaryOperation(
 			    this, insn, state, dst,
 			    Type(0),
 			    [](RValue<Type> a, RValue<Type> b) {