Make use of vec<T, N> vector broadcasts
Also disable the assignment operator implicitly doing a broadcast.
Instead the explicit constructor must be used. This prevents bugs like
assigning a scalar to one element, while it was intended to broadcast
(especially when using [] on an array of vectors).
Bug: b/146224130
Bug: b/144825072
Change-Id: I43c977e256e134f6707b5c19252ded08db73b270
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39630
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/PixelProcessor.cpp b/src/Device/PixelProcessor.cpp
index a1e8df1..1c81a24 100644
--- a/src/Device/PixelProcessor.cpp
+++ b/src/Device/PixelProcessor.cpp
@@ -62,86 +62,26 @@
void PixelProcessor::setBlendConstant(const Color<float> &blendConstant)
{
- // TODO(b/140935644): Compact into generic function, cheack if clamp is required
- factor.blendConstant4W[0][0] =
- factor.blendConstant4W[0][1] =
- factor.blendConstant4W[0][2] =
- factor.blendConstant4W[0][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.r));
+ // TODO(b/140935644): Check if clamp is required
+ factor.blendConstant4W[0] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.r)));
+ factor.blendConstant4W[1] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.g)));
+ factor.blendConstant4W[2] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.b)));
+ factor.blendConstant4W[3] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.a)));
- factor.blendConstant4W[1][0] =
- factor.blendConstant4W[1][1] =
- factor.blendConstant4W[1][2] =
- factor.blendConstant4W[1][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.g));
+ factor.invBlendConstant4W[0] = word4(0xFFFFu - factor.blendConstant4W[0][0]);
+ factor.invBlendConstant4W[1] = word4(0xFFFFu - factor.blendConstant4W[1][0]);
+ factor.invBlendConstant4W[2] = word4(0xFFFFu - factor.blendConstant4W[2][0]);
+ factor.invBlendConstant4W[3] = word4(0xFFFFu - factor.blendConstant4W[3][0]);
- factor.blendConstant4W[2][0] =
- factor.blendConstant4W[2][1] =
- factor.blendConstant4W[2][2] =
- factor.blendConstant4W[2][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.b));
+ factor.blendConstant4F[0] = float4(blendConstant.r);
+ factor.blendConstant4F[1] = float4(blendConstant.g);
+ factor.blendConstant4F[2] = float4(blendConstant.b);
+ factor.blendConstant4F[3] = float4(blendConstant.a);
- factor.blendConstant4W[3][0] =
- factor.blendConstant4W[3][1] =
- factor.blendConstant4W[3][2] =
- factor.blendConstant4W[3][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.a));
-
- factor.invBlendConstant4W[0][0] =
- factor.invBlendConstant4W[0][1] =
- factor.invBlendConstant4W[0][2] =
- factor.invBlendConstant4W[0][3] = 0xFFFFu - factor.blendConstant4W[0][0];
-
- factor.invBlendConstant4W[1][0] =
- factor.invBlendConstant4W[1][1] =
- factor.invBlendConstant4W[1][2] =
- factor.invBlendConstant4W[1][3] = 0xFFFFu - factor.blendConstant4W[1][0];
-
- factor.invBlendConstant4W[2][0] =
- factor.invBlendConstant4W[2][1] =
- factor.invBlendConstant4W[2][2] =
- factor.invBlendConstant4W[2][3] = 0xFFFFu - factor.blendConstant4W[2][0];
-
- factor.invBlendConstant4W[3][0] =
- factor.invBlendConstant4W[3][1] =
- factor.invBlendConstant4W[3][2] =
- factor.invBlendConstant4W[3][3] = 0xFFFFu - factor.blendConstant4W[3][0];
-
- factor.blendConstant4F[0][0] =
- factor.blendConstant4F[0][1] =
- factor.blendConstant4F[0][2] =
- factor.blendConstant4F[0][3] = blendConstant.r;
-
- factor.blendConstant4F[1][0] =
- factor.blendConstant4F[1][1] =
- factor.blendConstant4F[1][2] =
- factor.blendConstant4F[1][3] = blendConstant.g;
-
- factor.blendConstant4F[2][0] =
- factor.blendConstant4F[2][1] =
- factor.blendConstant4F[2][2] =
- factor.blendConstant4F[2][3] = blendConstant.b;
-
- factor.blendConstant4F[3][0] =
- factor.blendConstant4F[3][1] =
- factor.blendConstant4F[3][2] =
- factor.blendConstant4F[3][3] = blendConstant.a;
-
- factor.invBlendConstant4F[0][0] =
- factor.invBlendConstant4F[0][1] =
- factor.invBlendConstant4F[0][2] =
- factor.invBlendConstant4F[0][3] = 1 - blendConstant.r;
-
- factor.invBlendConstant4F[1][0] =
- factor.invBlendConstant4F[1][1] =
- factor.invBlendConstant4F[1][2] =
- factor.invBlendConstant4F[1][3] = 1 - blendConstant.g;
-
- factor.invBlendConstant4F[2][0] =
- factor.invBlendConstant4F[2][1] =
- factor.invBlendConstant4F[2][2] =
- factor.invBlendConstant4F[2][3] = 1 - blendConstant.b;
-
- factor.invBlendConstant4F[3][0] =
- factor.invBlendConstant4F[3][1] =
- factor.invBlendConstant4F[3][2] =
- factor.invBlendConstant4F[3][3] = 1 - blendConstant.a;
+ factor.invBlendConstant4F[0] = float4(1 - blendConstant.r);
+ factor.invBlendConstant4F[1] = float4(1 - blendConstant.g);
+ factor.invBlendConstant4F[2] = float4(1 - blendConstant.b);
+ factor.invBlendConstant4F[3] = float4(1 - blendConstant.a);
}
void PixelProcessor::setRoutineCacheSize(int cacheSize)
diff --git a/src/Pipeline/Constants.cpp b/src/Pipeline/Constants.cpp
index b1afb1a..c38507d 100644
--- a/src/Pipeline/Constants.cpp
+++ b/src/Pipeline/Constants.cpp
@@ -243,18 +243,12 @@
for(int i = 0; i < 8; i++)
{
- mask565Q[i][0] =
- mask565Q[i][1] =
- mask565Q[i][2] =
- mask565Q[i][3] = (i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x07E0 : 0) | (i & 0x4 ? 0xF800 : 0);
+ mask565Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x07E0 : 0) | (i & 0x4 ? 0xF800 : 0));
}
for (int i = 0; i < 16; i++)
{
- mask5551Q[i][0] =
- mask5551Q[i][1] =
- mask5551Q[i][2] =
- mask5551Q[i][3] = (i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x03E0 : 0) | (i & 0x4 ? 0x7C00 : 0) | (i & 8 ? 0x8000 : 0);
+ mask5551Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x03E0 : 0) | (i & 0x4 ? 0x7C00 : 0) | (i & 8 ? 0x8000 : 0));
}
for(int i = 0; i < 4; i++)
diff --git a/src/System/Types.hpp b/src/System/Types.hpp
index e70344f..df28db5 100644
--- a/src/System/Types.hpp
+++ b/src/System/Types.hpp
@@ -55,7 +55,7 @@
{
vec() = default;
- vec(T replicate)
+ explicit vec(T replicate)
{
for(int i = 0; i < N; i++)
{
@@ -69,6 +69,9 @@
{
}
+ // Require explicit use of replicate constructor.
+ vec &operator=(T) = delete;
+
T &operator[](int i)
{
return v[i];
@@ -87,7 +90,7 @@
{
vec() = default;
- constexpr vec(T replicate)
+ constexpr explicit vec(T replicate)
: x(replicate), y(replicate), z(replicate), w(replicate)
{
}
@@ -97,6 +100,9 @@
{
}
+ // Require explicit use of replicate constructor.
+ vec &operator=(T) = delete;
+
T &operator[](int i)
{
return v[i];