Commit c2bb50b7 by Ben Clayton

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 <bclayton@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Tested-by: 's avatarBen Clayton <bclayton@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com>
parent 62758f58
...@@ -17,6 +17,11 @@ ...@@ -17,6 +17,11 @@
#include "Vulkan/VkDebug.hpp" #include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkPipelineLayout.hpp" #include "Vulkan/VkPipelineLayout.hpp"
namespace
{
enum { X, Y, Z };
} // anonymous namespace
namespace sw namespace sw
{ {
ComputeProgram::ComputeProgram(SpirvShader const *shader, vk::PipelineLayout const *pipelineLayout) ComputeProgram::ComputeProgram(SpirvShader const *shader, vk::PipelineLayout const *pipelineLayout)
...@@ -54,95 +59,94 @@ namespace sw ...@@ -54,95 +59,94 @@ namespace sw
const int subgroupSize = SIMD::Width; const int subgroupSize = SIMD::Width;
// Total number of invocations required to execute this workgroup. // Total number of invocations required to execute this workgroup.
int numInvocations = localSize[0] * localSize[1] * localSize[2]; int numInvocations = localSize[X] * localSize[Y] * localSize[Z];
Int4 numWorkgroups = *Pointer<Int4>(data + OFFSET(Data, numWorkgroups)); Int4 numWorkgroups = *Pointer<Int4>(data + OFFSET(Data, numWorkgroups));
Int4 workgroupID = *Pointer<Int4>(data + OFFSET(Data, workgroupID)); Int4 workgroupID = *Pointer<Int4>(data + OFFSET(Data, workgroupID));
Int4 workgroupSize = Int4(localSize[0], localSize[1], localSize[2], 0); Int4 workgroupSize = Int4(localSize[X], localSize[Y], localSize[Z], 0);
Int numSubgroups = (numInvocations + subgroupSize - 1) / subgroupSize; Int numSubgroups = (numInvocations + subgroupSize - 1) / subgroupSize;
setInputBuiltin(spv::BuiltInNumWorkgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInNumWorkgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
for (uint32_t component = 0; component < builtin.SizeInComponents; component++) for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
{ {
value[builtin.FirstComponent + component] = value[builtin.FirstComponent + component] =
As<Float4>(Int4(Extract(numWorkgroups, component))); As<SIMD::Float>(SIMD::Int(Extract(numWorkgroups, component)));
} }
}); });
setInputBuiltin(spv::BuiltInWorkgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInWorkgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
for (uint32_t component = 0; component < builtin.SizeInComponents; component++) for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
{ {
value[builtin.FirstComponent + component] = value[builtin.FirstComponent + component] =
As<Float4>(Int4(Extract(workgroupSize, component))); As<SIMD::Float>(SIMD::Int(Extract(workgroupSize, component)));
} }
}); });
setInputBuiltin(spv::BuiltInNumSubgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInNumSubgroups, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
ASSERT(builtin.SizeInComponents == 1); ASSERT(builtin.SizeInComponents == 1);
value[builtin.FirstComponent] = As<Float4>(Int4(numSubgroups)); value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(numSubgroups));
}); });
setInputBuiltin(spv::BuiltInSubgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInSubgroupSize, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
ASSERT(builtin.SizeInComponents == 1); ASSERT(builtin.SizeInComponents == 1);
value[builtin.FirstComponent] = As<Float4>(Int4(subgroupSize)); value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(subgroupSize));
}); });
setInputBuiltin(spv::BuiltInSubgroupLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInSubgroupLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
ASSERT(builtin.SizeInComponents == 1); ASSERT(builtin.SizeInComponents == 1);
value[builtin.FirstComponent] = As<Float4>(Int4(0, 1, 2, 3)); value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(0, 1, 2, 3));
}); });
enum { XXXX, YYYY, ZZZZ };
For(Int subgroupIndex = 0, subgroupIndex < numSubgroups, subgroupIndex++) For(Int subgroupIndex = 0, subgroupIndex < numSubgroups, subgroupIndex++)
{ {
Int4 localInvocationIndex = Int4(subgroupIndex * 4) + Int4(0, 1, 2, 3); // TODO: Replace SIMD::Int(0, 1, 2, 3) with SIMD-width equivalent
auto localInvocationIndex = SIMD::Int(subgroupIndex * SIMD::Width) + SIMD::Int(0, 1, 2, 3);
// Disable lanes where (invocationIDs >= numInvocations) // Disable lanes where (invocationIDs >= numInvocations)
routine.activeLaneMask = CmpLT(localInvocationIndex, Int4(numInvocations)); routine.activeLaneMask = CmpLT(localInvocationIndex, SIMD::Int(numInvocations));
Int4 localInvocationID[3]; SIMD::Int localInvocationID[3];
{ {
Int4 idx = localInvocationIndex; SIMD::Int idx = localInvocationIndex;
localInvocationID[ZZZZ] = idx / Int4(localSize[0] * localSize[1]); localInvocationID[Z] = idx / SIMD::Int(localSize[X] * localSize[Y]);
idx -= localInvocationID[ZZZZ] * Int4(localSize[0] * localSize[1]); // modulo idx -= localInvocationID[Z] * SIMD::Int(localSize[X] * localSize[Y]); // modulo
localInvocationID[YYYY] = idx / Int4(localSize[0]); localInvocationID[Y] = idx / SIMD::Int(localSize[X]);
idx -= localInvocationID[YYYY] * Int4(localSize[0]); // modulo idx -= localInvocationID[Y] * SIMD::Int(localSize[X]); // modulo
localInvocationID[XXXX] = idx; localInvocationID[X] = idx;
} }
setInputBuiltin(spv::BuiltInLocalInvocationIndex, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInLocalInvocationIndex, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
ASSERT(builtin.SizeInComponents == 1); ASSERT(builtin.SizeInComponents == 1);
value[builtin.FirstComponent] = As<Float4>(localInvocationIndex); value[builtin.FirstComponent] = As<SIMD::Float>(localInvocationIndex);
}); });
setInputBuiltin(spv::BuiltInSubgroupId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInSubgroupId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
ASSERT(builtin.SizeInComponents == 1); ASSERT(builtin.SizeInComponents == 1);
value[builtin.FirstComponent] = As<Float4>(Int4(subgroupIndex)); value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(subgroupIndex));
}); });
setInputBuiltin(spv::BuiltInLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInLocalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
for (uint32_t component = 0; component < builtin.SizeInComponents; component++) for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
{ {
value[builtin.FirstComponent + component] = As<Float4>(localInvocationID[component]); value[builtin.FirstComponent + component] = As<SIMD::Float>(localInvocationID[component]);
} }
}); });
setInputBuiltin(spv::BuiltInGlobalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value) setInputBuiltin(spv::BuiltInGlobalInvocationId, [&](const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)
{ {
Int4 localBase = workgroupID * workgroupSize; auto localBase = workgroupID * workgroupSize;
for (uint32_t component = 0; component < builtin.SizeInComponents; component++) for (uint32_t component = 0; component < builtin.SizeInComponents; component++)
{ {
Int4 globalInvocationID = Int4(Extract(localBase, component)) + localInvocationID[component]; auto globalInvocationID = SIMD::Int(Extract(localBase, component)) + localInvocationID[component];
value[builtin.FirstComponent + component] = As<Float4>(globalInvocationID); value[builtin.FirstComponent + component] = As<SIMD::Float>(globalInvocationID);
} }
}); });
...@@ -151,7 +155,7 @@ namespace sw ...@@ -151,7 +155,7 @@ namespace sw
} }
} }
void ComputeProgram::setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)> cb) void ComputeProgram::setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)> cb)
{ {
auto it = shader->inputBuiltins.find(id); auto it = shader->inputBuiltins.find(id);
if (it != shader->inputBuiltins.end()) if (it != shader->inputBuiltins.end())
...@@ -170,21 +174,21 @@ namespace sw ...@@ -170,21 +174,21 @@ namespace sw
Data data; Data data;
data.descriptorSets = descriptorSets; data.descriptorSets = descriptorSets;
data.numWorkgroups[0] = groupCountX; data.numWorkgroups[X] = groupCountX;
data.numWorkgroups[1] = groupCountY; data.numWorkgroups[Y] = groupCountY;
data.numWorkgroups[2] = groupCountZ; data.numWorkgroups[Z] = groupCountZ;
data.numWorkgroups[3] = 0; data.numWorkgroups[3] = 0;
// TODO(bclayton): Split work across threads. // TODO(bclayton): Split work across threads.
for (uint32_t groupZ = 0; groupZ < groupCountZ; groupZ++) for (uint32_t groupZ = 0; groupZ < groupCountZ; groupZ++)
{ {
data.workgroupID[2] = groupZ; data.workgroupID[Z] = groupZ;
for (uint32_t groupY = 0; groupY < groupCountY; groupY++) for (uint32_t groupY = 0; groupY < groupCountY; groupY++)
{ {
data.workgroupID[1] = groupY; data.workgroupID[Y] = groupY;
for (uint32_t groupX = 0; groupX < groupCountX; groupX++) for (uint32_t groupX = 0; groupX < groupCountX; groupX++)
{ {
data.workgroupID[0] = groupX; data.workgroupID[X] = groupX;
runWorkgroup(&data); runWorkgroup(&data);
} }
} }
......
...@@ -53,7 +53,7 @@ namespace sw ...@@ -53,7 +53,7 @@ namespace sw
protected: protected:
void emit(); void emit();
void setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<Float4>& value)> cb); void setInputBuiltin(spv::BuiltIn id, std::function<void(const SpirvShader::BuiltinMapping& builtin, Array<SIMD::Float>& value)> cb);
Pointer<Byte> data; // argument 0 Pointer<Byte> data; // argument 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment