Commit 53f2a7a5 by Nicolas Capens Committed by Nicolas Capens

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: 's avatarBen Clayton <bclayton@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 9e5d547d
...@@ -62,86 +62,26 @@ PixelProcessor::~PixelProcessor() ...@@ -62,86 +62,26 @@ PixelProcessor::~PixelProcessor()
void PixelProcessor::setBlendConstant(const Color<float> &blendConstant) void PixelProcessor::setBlendConstant(const Color<float> &blendConstant)
{ {
// TODO(b/140935644): Compact into generic function, cheack if clamp is required // TODO(b/140935644): Check if clamp is required
factor.blendConstant4W[0][0] = factor.blendConstant4W[0] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.r)));
factor.blendConstant4W[0][1] = factor.blendConstant4W[1] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.g)));
factor.blendConstant4W[0][2] = factor.blendConstant4W[2] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.b)));
factor.blendConstant4W[0][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.r)); factor.blendConstant4W[3] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.a)));
factor.blendConstant4W[1][0] = factor.invBlendConstant4W[0] = word4(0xFFFFu - factor.blendConstant4W[0][0]);
factor.blendConstant4W[1][1] = factor.invBlendConstant4W[1] = word4(0xFFFFu - factor.blendConstant4W[1][0]);
factor.blendConstant4W[1][2] = factor.invBlendConstant4W[2] = word4(0xFFFFu - factor.blendConstant4W[2][0]);
factor.blendConstant4W[1][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.g)); factor.invBlendConstant4W[3] = word4(0xFFFFu - factor.blendConstant4W[3][0]);
factor.blendConstant4W[2][0] = factor.blendConstant4F[0] = float4(blendConstant.r);
factor.blendConstant4W[2][1] = factor.blendConstant4F[1] = float4(blendConstant.g);
factor.blendConstant4W[2][2] = factor.blendConstant4F[2] = float4(blendConstant.b);
factor.blendConstant4W[2][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.b)); factor.blendConstant4F[3] = float4(blendConstant.a);
factor.blendConstant4W[3][0] = factor.invBlendConstant4F[0] = float4(1 - blendConstant.r);
factor.blendConstant4W[3][1] = factor.invBlendConstant4F[1] = float4(1 - blendConstant.g);
factor.blendConstant4W[3][2] = factor.invBlendConstant4F[2] = float4(1 - blendConstant.b);
factor.blendConstant4W[3][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.a)); factor.invBlendConstant4F[3] = float4(1 - 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;
} }
void PixelProcessor::setRoutineCacheSize(int cacheSize) void PixelProcessor::setRoutineCacheSize(int cacheSize)
......
...@@ -243,18 +243,12 @@ Constants::Constants() ...@@ -243,18 +243,12 @@ Constants::Constants()
for(int i = 0; i < 8; i++) for(int i = 0; i < 8; i++)
{ {
mask565Q[i][0] = mask565Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x07E0 : 0) | (i & 0x4 ? 0xF800 : 0));
mask565Q[i][1] =
mask565Q[i][2] =
mask565Q[i][3] = (i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x07E0 : 0) | (i & 0x4 ? 0xF800 : 0);
} }
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
{ {
mask5551Q[i][0] = mask5551Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x03E0 : 0) | (i & 0x4 ? 0x7C00 : 0) | (i & 8 ? 0x8000 : 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);
} }
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++)
......
...@@ -55,7 +55,7 @@ struct alignas(sizeof(T)* N) vec ...@@ -55,7 +55,7 @@ struct alignas(sizeof(T)* N) vec
{ {
vec() = default; vec() = default;
vec(T replicate) explicit vec(T replicate)
{ {
for(int i = 0; i < N; i++) for(int i = 0; i < N; i++)
{ {
...@@ -69,6 +69,9 @@ struct alignas(sizeof(T)* N) vec ...@@ -69,6 +69,9 @@ struct alignas(sizeof(T)* N) vec
{ {
} }
// Require explicit use of replicate constructor.
vec &operator=(T) = delete;
T &operator[](int i) T &operator[](int i)
{ {
return v[i]; return v[i];
...@@ -87,7 +90,7 @@ struct alignas(sizeof(T) * 4) vec<T, 4> ...@@ -87,7 +90,7 @@ struct alignas(sizeof(T) * 4) vec<T, 4>
{ {
vec() = default; vec() = default;
constexpr vec(T replicate) constexpr explicit vec(T replicate)
: x(replicate), y(replicate), z(replicate), w(replicate) : x(replicate), y(replicate), z(replicate), w(replicate)
{ {
} }
...@@ -97,6 +100,9 @@ struct alignas(sizeof(T) * 4) vec<T, 4> ...@@ -97,6 +100,9 @@ struct alignas(sizeof(T) * 4) vec<T, 4>
{ {
} }
// Require explicit use of replicate constructor.
vec &operator=(T) = delete;
T &operator[](int i) T &operator[](int i)
{ {
return v[i]; return v[i];
......
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