Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit c2bb50b

Browse files
committed
ComputeProgram: Clean up usage of Float4/Int4 and SIMD::Float/SIMD::Int
Bug: b/126126820 Change-Id: I0df0841952dcaa9c8376847704a9697b9c9e9894 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/27093 Presubmit-Ready: Ben Clayton <[email protected]> Kokoro-Presubmit: kokoro <[email protected]> Tested-by: Ben Clayton <[email protected]> Reviewed-by: Chris Forbes <[email protected]>
1 parent 62758f5 commit c2bb50b

File tree

2 files changed

+45
-41
lines changed

2 files changed

+45
-41
lines changed

src/Pipeline/ComputeProgram.cpp

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
#include "Vulkan/VkDebug.hpp"
1818
#include "Vulkan/VkPipelineLayout.hpp"
1919

20+
namespace
21+
{
22+
enum { X, Y, Z };
23+
} // anonymous namespace
24+
2025
namespace sw
2126
{
2227
ComputeProgram::ComputeProgram(SpirvShader const *shader, vk::PipelineLayout const *pipelineLayout)
@@ -54,95 +59,94 @@ namespace sw
5459
const int subgroupSize = SIMD::Width;
5560

5661
// Total number of invocations required to execute this workgroup.
57-
int numInvocations = localSize[0] * localSize[1] * localSize[2];
62+
int numInvocations = localSize[X] * localSize[Y] * localSize[Z];
5863

5964
Int4 numWorkgroups = *Pointer<Int4>(data + OFFSET(Data, numWorkgroups));
6065
Int4 workgroupID = *Pointer<Int4>(data + OFFSET(Data, workgroupID));
61-
Int4 workgroupSize = Int4(localSize[0], localSize[1], localSize[2], 0);
66+
Int4 workgroupSize = Int4(localSize[X], localSize[Y], localSize[Z], 0);
6267
Int numSubgroups = (numInvocations + subgroupSize - 1) / subgroupSize;
6368

64-
setInputBuiltin(spv::BuiltInNumWorkgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
69+
setInputBuiltin(spv::BuiltInNumWorkgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
6570
{
6671
for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
6772
{
6873
value[builtin.FirstComponent + component] =
69-
As<Float4>(Int4(Extract(numWorkgroups, component)));
74+
As<SIMD::Float>(SIMD::Int(Extract(numWorkgroups, component)));
7075
}
7176
});
7277

73-
setInputBuiltin(spv::BuiltInWorkgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
78+
setInputBuiltin(spv::BuiltInWorkgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
7479
{
7580
for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
7681
{
7782
value[builtin.FirstComponent + component] =
78-
As<Float4>(Int4(Extract(workgroupSize, component)));
83+
As<SIMD::Float>(SIMD::Int(Extract(workgroupSize, component)));
7984
}
8085
});
8186

82-
setInputBuiltin(spv::BuiltInNumSubgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
87+
setInputBuiltin(spv::BuiltInNumSubgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
8388
{
8489
ASSERT(builtin.SizeInComponents == 1);
85-
value[builtin.FirstComponent] = As<Float4>(Int4(numSubgroups));
90+
value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(numSubgroups));
8691
});
8792

88-
setInputBuiltin(spv::BuiltInSubgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
93+
setInputBuiltin(spv::BuiltInSubgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
8994
{
9095
ASSERT(builtin.SizeInComponents == 1);
91-
value[builtin.FirstComponent] = As<Float4>(Int4(subgroupSize));
96+
value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(subgroupSize));
9297
});
9398

94-
setInputBuiltin(spv::BuiltInSubgroupLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
99+
setInputBuiltin(spv::BuiltInSubgroupLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
95100
{
96101
ASSERT(builtin.SizeInComponents == 1);
97-
value[builtin.FirstComponent] = As<Float4>(Int4(0, 1, 2, 3));
102+
value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(0, 1, 2, 3));
98103
});
99104

100-
enum { XXXX, YYYY, ZZZZ };
101-
102105
For(Int subgroupIndex = 0, subgroupIndex < numSubgroups, subgroupIndex++)
103106
{
104-
Int4 localInvocationIndex = Int4(subgroupIndex * 4) + Int4(0, 1, 2, 3);
107+
// TODO: Replace SIMD::Int(0, 1, 2, 3) with SIMD-width equivalent
108+
auto localInvocationIndex = SIMD::Int(subgroupIndex * SIMD::Width) + SIMD::Int(0, 1, 2, 3);
105109

106110
// Disable lanes where (invocationIDs >= numInvocations)
107-
routine.activeLaneMask = CmpLT(localInvocationIndex, Int4(numInvocations));
111+
routine.activeLaneMask = CmpLT(localInvocationIndex, SIMD::Int(numInvocations));
108112

109-
Int4 localInvocationID[3];
113+
SIMD::Int localInvocationID[3];
110114
{
111-
Int4 idx = localInvocationIndex;
112-
localInvocationID[ZZZZ] = idx / Int4(localSize[0] * localSize[1]);
113-
idx -= localInvocationID[ZZZZ] * Int4(localSize[0] * localSize[1]); // modulo
114-
localInvocationID[YYYY] = idx / Int4(localSize[0]);
115-
idx -= localInvocationID[YYYY] * Int4(localSize[0]); // modulo
116-
localInvocationID[XXXX] = idx;
115+
SIMD::Int idx = localInvocationIndex;
116+
localInvocationID[Z] = idx / SIMD::Int(localSize[X] * localSize[Y]);
117+
idx -= localInvocationID[Z] * SIMD::Int(localSize[X] * localSize[Y]); // modulo
118+
localInvocationID[Y] = idx / SIMD::Int(localSize[X]);
119+
idx -= localInvocationID[Y] * SIMD::Int(localSize[X]); // modulo
120+
localInvocationID[X] = idx;
117121
}
118122

119-
setInputBuiltin(spv::BuiltInLocalInvocationIndex, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
123+
setInputBuiltin(spv::BuiltInLocalInvocationIndex, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
120124
{
121125
ASSERT(builtin.SizeInComponents == 1);
122-
value[builtin.FirstComponent] = As<Float4>(localInvocationIndex);
126+
value[builtin.FirstComponent] = As<SIMD::Float>(localInvocationIndex);
123127
});
124128

125-
setInputBuiltin(spv::BuiltInSubgroupId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
129+
setInputBuiltin(spv::BuiltInSubgroupId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
126130
{
127131
ASSERT(builtin.SizeInComponents == 1);
128-
value[builtin.FirstComponent] = As<Float4>(Int4(subgroupIndex));
132+
value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(subgroupIndex));
129133
});
130134

131-
setInputBuiltin(spv::BuiltInLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
135+
setInputBuiltin(spv::BuiltInLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
132136
{
133137
for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
134138
{
135-
value[builtin.FirstComponent + component] = As<Float4>(localInvocationID[component]);
139+
value[builtin.FirstComponent + component] = As<SIMD::Float>(localInvocationID[component]);
136140
}
137141
});
138142

139-
setInputBuiltin(spv::BuiltInGlobalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)
143+
setInputBuiltin(spv::BuiltInGlobalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
140144
{
141-
Int4 localBase = workgroupID * workgroupSize;
145+
auto localBase = workgroupID * workgroupSize;
142146
for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
143147
{
144-
Int4 globalInvocationID = Int4(Extract(localBase, component)) + localInvocationID[component];
145-
value[builtin.FirstComponent + component] = As<Float4>(globalInvocationID);
148+
auto globalInvocationID = SIMD::Int(Extract(localBase, component)) + localInvocationID[component];
149+
value[builtin.FirstComponent + component] = As<SIMD::Float>(globalInvocationID);
146150
}
147151
});
148152

@@ -151,7 +155,7 @@ namespace sw
151155
}
152156
}
153157

154-
void ComputeProgram::setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)> cb)
158+
void ComputeProgram::setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)> cb)
155159
{
156160
auto it = shader->inputBuiltins.find(id);
157161
if (it != shader->inputBuiltins.end())
@@ -170,21 +174,21 @@ namespace sw
170174

171175
Data data;
172176
data.descriptorSets = descriptorSets;
173-
data.numWorkgroups[0] = groupCountX;
174-
data.numWorkgroups[1] = groupCountY;
175-
data.numWorkgroups[2] = groupCountZ;
177+
data.numWorkgroups[X] = groupCountX;
178+
data.numWorkgroups[Y] = groupCountY;
179+
data.numWorkgroups[Z] = groupCountZ;
176180
data.numWorkgroups[3] = 0;
177181

178182
// TODO(bclayton): Split work across threads.
179183
for (uint32_t groupZ = 0; groupZ < groupCountZ; groupZ++)
180184
{
181-
data.workgroupID[2] = groupZ;
185+
data.workgroupID[Z] = groupZ;
182186
for (uint32_t groupY = 0; groupY < groupCountY; groupY++)
183187
{
184-
data.workgroupID[1] = groupY;
188+
data.workgroupID[Y] = groupY;
185189
for (uint32_t groupX = 0; groupX < groupCountX; groupX++)
186190
{
187-
data.workgroupID[0] = groupX;
191+
data.workgroupID[X] = groupX;
188192
runWorkgroup(&data);
189193
}
190194
}

src/Pipeline/ComputeProgram.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ namespace sw
5353
protected:
5454
void emit();
5555

56-
void setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)> cb);
56+
void setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)> cb);
5757

5858
Pointer<Byte> data; // argument 0
5959

0 commit comments

Comments
 (0)