Fix array stride in uniform buffer for VK_KHR_16bit_storage
authorLei Zhang <antiagainst@google.com>
Fri, 14 Sep 2018 18:56:12 +0000 (14:56 -0400)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 22 Nov 2018 09:33:23 +0000 (04:33 -0500)
Array stride need to be a multiple of 16.

Affects:
dEQP-VK.spirv_assembly.instruction.*.16bit_storage.*

Components: Vulkan, SPIR-V
VK-GL-CTS issue: 1344

Change-Id: If5c4415e8f1914a2579d914d33ab3b334affd8d3
(cherry picked from commit 503aa56f067bcd7d20ef55e676672098007e3782)

external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm16bitStorageTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp

index c979538..e91613a 100644 (file)
@@ -193,7 +193,7 @@ bool graphicsCheck16BitFloats (const std::vector<Resource>& originalFloats,
        for (deUint32 outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
        {
                vector<deUint8> originalBytes;
-               originalFloats[outputNdx].getBytes(originalBytes);
+               originalFloats[outputNdx].getBuffer()->getPackedBytes(originalBytes);
 
                const deUint16* returned        = static_cast<const deUint16*>(outputAllocs[outputNdx]->getHostPtr());
                const float*    original        = reinterpret_cast<const float*>(&originalBytes.front());
@@ -214,7 +214,7 @@ bool computeCheckBuffersFloats (const std::vector<Resource>&        originalFloats,
                                                                tcu::TestLog&                                   /*log*/)
 {
        std::vector<deUint8> result;
-       originalFloats.front().getBytes(result);
+       originalFloats.front().getBuffer()->getPackedBytes(result);
 
        const deUint16 * results = reinterpret_cast<const deUint16 *>(&result[0]);
        const deUint16 * expected = reinterpret_cast<const deUint16 *>(outputAllocs.front()->getHostPtr());
@@ -245,7 +245,7 @@ bool computeCheck16BitFloats (const std::vector<Resource>&  originalFloats,
        for (deUint32 outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
        {
                vector<deUint8> originalBytes;
-               originalFloats[outputNdx].getBytes(originalBytes);
+               originalFloats[outputNdx].getBuffer()->getPackedBytes(originalBytes);
 
                const deUint16* returned        = static_cast<const deUint16*>(outputAllocs[outputNdx]->getHostPtr());
                const float*    original        = reinterpret_cast<const float*>(&originalBytes.front());
@@ -275,7 +275,7 @@ bool check32BitFloats (const std::vector<Resource>&         /* originalFloats */,
        for (deUint32 outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
        {
                vector<deUint8> expectedBytes;
-               expectedOutputs[outputNdx].getBytes(expectedBytes);
+               expectedOutputs[outputNdx].getBuffer()->getPackedBytes(expectedBytes);
 
                const float*    returnedAsFloat = static_cast<const float*>(outputAllocs[outputNdx]->getHostPtr());
                const float*    expectedAsFloat = reinterpret_cast<const float*>(&expectedBytes.front());
@@ -1028,7 +1028,7 @@ bool computeCheckStruct (const std::vector<Resource>&     originalFloats,
        for (deUint32 outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
        {
                vector<deUint8> originalBytes;
-               originalFloats[outputNdx].getBytes(originalBytes);
+               originalFloats[outputNdx].getBuffer()->getPackedBytes(originalBytes);
 
                const resultType*       returned        = static_cast<const resultType*>(outputAllocs[outputNdx]->getHostPtr());
                const originType*       original        = reinterpret_cast<const originType*>(&originalBytes.front());
@@ -1048,7 +1048,7 @@ bool graphicsCheckStruct (const std::vector<Resource>&    originalFloats,
        for (deUint32 outputNdx = 0; outputNdx < static_cast<deUint32>(outputAllocs.size()); ++outputNdx)
        {
                vector<deUint8> originalBytes;
-               originalFloats[outputNdx].getBytes(originalBytes);
+               originalFloats[outputNdx].getBuffer()->getPackedBytes(originalBytes);
 
                const resultType*       returned        = static_cast<const resultType*>(outputAllocs[outputNdx]->getHostPtr());
                const originType*       original        = reinterpret_cast<const originType*>(&originalBytes.front());
index a61cdc0..7f2c27c 100644 (file)
@@ -137,6 +137,11 @@ public:
                        DE_FATAL("Unknown buffer type");
        }
 
+       void getPackedBytes (std::vector<deUint8>& bytes) const
+       {
+               return getBytes(bytes);
+       }
+
        size_t getByteSize (void) const
        {
                switch (m_type)
@@ -258,24 +263,49 @@ template<typename E>
 class Buffer : public BufferInterface
 {
 public:
-                                               Buffer                          (const std::vector<E>& elements)
-                                                       : m_elements(elements)
-                                               {}
+       Buffer  (const std::vector<E>& elements, deUint32 padding = 0 /* in bytes */)
+                       : m_elements(elements)
+                       , m_padding(padding)
+                       {}
 
        void getBytes (std::vector<deUint8>& bytes) const
        {
+               const size_t    count                   = m_elements.size();
+               const size_t    perSegmentSize  = sizeof(E) + m_padding;
+               const size_t    size                    = count * perSegmentSize;
+
+               bytes.resize(size);
+
+               if (m_padding == 0)
+               {
+                       deMemcpy(&bytes.front(), &m_elements.front(), size);
+               }
+               else
+               {
+                       deMemset(&bytes.front(), 0xff, size);
+
+                       for (deUint32 elementIdx = 0; elementIdx < count; ++elementIdx)
+                               deMemcpy(&bytes[elementIdx * perSegmentSize], &m_elements[elementIdx], sizeof(E));
+               }
+       }
+
+       void getPackedBytes (std::vector<deUint8>& bytes) const
+       {
                const size_t size = m_elements.size() * sizeof(E);
+
                bytes.resize(size);
+
                deMemcpy(&bytes.front(), &m_elements.front(), size);
        }
 
        size_t getByteSize (void) const
        {
-               return m_elements.size() * sizeof(E);
+               return m_elements.size() * (sizeof(E) + m_padding);
        }
 
 private:
        std::vector<E>          m_elements;
+       deUint32                        m_padding;
 };
 
 DE_STATIC_ASSERT(sizeof(tcu::Vec4) == 4 * sizeof(float));
index 345d6de..7c000ca 100644 (file)
@@ -49,6 +49,7 @@ public:
        virtual                         ~BufferInterface        (void)                          {}
 
        virtual void            getBytes                        (std::vector<deUint8>& bytes) const = 0;
+       virtual void            getPackedBytes          (std::vector<deUint8>& bytes) const = 0;
        virtual size_t          getByteSize                     (void) const = 0;
 };