SpirvShaderDebugger: Fix store() of arrays
```
template<typename T, std::size_t N>
void store(const rr::RValue<rr::Pointer<rr::Byte>> &ptr, const std::array<T, N> &val)
```
was completely broken as it was using `sizeof(T)` for element offsets.
All uses of this overload use Reactor values for T, and so `sizeof(T)` evaluates to the size of the compiler type, not the runtime data type.
Also remove the useless `for(int i = 0; i < N; i++)` in `buildGlobal()`.
This iterator isn't used, so we're just doing the same calls to `put()` `N` times.
Bug: b/170383642
Change-Id: I9ba9efce07e886087124118122de56a4d31c5503
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/49129
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Pipeline/SpirvShaderDebugger.cpp b/src/Pipeline/SpirvShaderDebugger.cpp
index 25331f6..45c01ba 100644
--- a/src/Pipeline/SpirvShaderDebugger.cpp
+++ b/src/Pipeline/SpirvShaderDebugger.cpp
@@ -146,28 +146,35 @@
});
}
-// store() emits a store instruction to write sizeof(T) bytes from val into ptr.
+// store() emits a store instruction to copy val into ptr.
template<typename T>
void store(const rr::RValue<rr::Pointer<rr::Byte>> &ptr, const rr::RValue<T> &val)
{
*rr::Pointer<T>(ptr) = val;
}
-// store() emits a store instruction to write sizeof(T) bytes from val into ptr.
+// store() emits a store instruction to copy val into ptr.
template<typename T>
void store(const rr::RValue<rr::Pointer<rr::Byte>> &ptr, const T &val)
{
*rr::Pointer<T>(ptr) = val;
}
-// store() emits a store instruction to write sizeof(T) * N bytes from val into
-// ptr.
+// clang-format off
+template<typename T> struct ReactorTypeSize {};
+template<> struct ReactorTypeSize<rr::Int> { static constexpr const int value = 4; };
+template<> struct ReactorTypeSize<rr::Float> { static constexpr const int value = 4; };
+template<> struct ReactorTypeSize<rr::Int4> { static constexpr const int value = 16; };
+template<> struct ReactorTypeSize<rr::Float4> { static constexpr const int value = 16; };
+// clang-format on
+
+// store() emits a store instruction to copy val into ptr.
template<typename T, std::size_t N>
void store(const rr::RValue<rr::Pointer<rr::Byte>> &ptr, const std::array<T, N> &val)
{
for(std::size_t i = 0; i < N; i++)
{
- store<T>(ptr + i * sizeof(T), val[i]);
+ store<T>(ptr + i * ReactorTypeSize<T>::value, val[i]);
}
}
@@ -2346,10 +2353,7 @@
{
for(int lane = 0; lane < sw::SIMD::Width; lane++)
{
- for(int i = 0; i < N; i++)
- {
- globals.lanes[lane]->put(name, makeDbgValue(simd[lane]));
- }
+ globals.lanes[lane]->put(name, makeDbgValue(simd[lane]));
}
}