Protected memory stack tests
authorBoris Zanin <boris.zanin@mobica.com>
Tue, 30 Apr 2019 09:29:41 +0000 (11:29 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 22 Nov 2019 12:38:01 +0000 (07:38 -0500)
Test use of stack in shaders in protected mode.

Add tests:
 * dEQP-VK.protected_memory.stack.stacksize_*

Components: Vulkan

VK-GL-CTS issue: 1075

Change-Id: I8b7439b7961f2f8539d94c3641c235a8e613b23e

AndroidGen.mk
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/protected_memory/CMakeLists.txt
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStackTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStackTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.hpp
external/vulkancts/mustpass/master/vk-default-no-waivers.txt
external/vulkancts/mustpass/master/vk-default.txt

index 8a6d0ec..3949b47 100644 (file)
@@ -237,6 +237,7 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemFillUpdateCopyBufferTests.cpp \
        external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemImageValidator.cpp \
        external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemShaderImageAccessTests.cpp \
+       external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStackTests.cpp \
        external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStorageBufferTests.cpp \
        external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemTests.cpp \
        external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp \
index 2cc1fdf..18aacab 100644 (file)
@@ -538269,6 +538269,12 @@ dEQP-VK.protected_memory.workgroupstorage.memsize_5
 dEQP-VK.protected_memory.workgroupstorage.memsize_60
 dEQP-VK.protected_memory.workgroupstorage.memsize_101
 dEQP-VK.protected_memory.workgroupstorage.memsize_503
+dEQP-VK.protected_memory.stack.stacksize_32
+dEQP-VK.protected_memory.stack.stacksize_64
+dEQP-VK.protected_memory.stack.stacksize_128
+dEQP-VK.protected_memory.stack.stacksize_256
+dEQP-VK.protected_memory.stack.stacksize_512
+dEQP-VK.protected_memory.stack.stacksize_1024
 dEQP-VK.device_group.sfr
 dEQP-VK.device_group.sfr_sys
 dEQP-VK.device_group.sfr_dedicated
index 7efcd0e..cdfaa71 100644 (file)
@@ -42,6 +42,8 @@ set(DEQP_VK_PROTECTED_MEMORY_SRCS
        vktProtectedMemWorkgroupStorageTests.hpp
        vktProtectedMemTests.cpp
        vktProtectedMemTests.hpp
+       vktProtectedMemStackTests.cpp
+       vktProtectedMemStackTests.hpp
        )
 
 set(DEQP_VK_PROTECTED_MEMORY_LIBS
diff --git a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStackTests.cpp b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStackTests.cpp
new file mode 100644 (file)
index 0000000..3e9b105
--- /dev/null
@@ -0,0 +1,400 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2018 The Khronos Group Inc.
+ * Copyright (c) 2018 Google Inc.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Protected memory stack tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktProtectedMemStackTests.hpp"
+
+#include "vktProtectedMemContext.hpp"
+#include "vktProtectedMemUtils.hpp"
+#include "vktProtectedMemImageValidator.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestGroupUtil.hpp"
+
+#include "vkPrograms.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkObjUtil.hpp"
+
+#include "tcuTestLog.hpp"
+#include "tcuVector.hpp"
+#include "tcuTextureUtil.hpp"
+#include "tcuStringTemplate.hpp"
+
+#include "gluTextureTestUtil.hpp"
+
+#include "deRandom.hpp"
+
+namespace vkt
+{
+namespace ProtectedMem
+{
+
+namespace
+{
+
+struct Params
+{
+       deUint32        stackSize;
+       deUint32        imageWidth;
+       deUint32        imageHeight;
+
+       Params (deUint32        stackSize_)
+               : stackSize     (stackSize_)
+       {
+               // Find suitable image dimensions based on stack memory size
+               imageWidth = 1;
+               imageHeight = 1;
+               bool increaseWidth = true;
+               while (imageWidth * imageHeight < stackSize)
+               {
+                       if (increaseWidth)
+                               imageWidth *= 2;
+                       else
+                               imageHeight *= 2;
+
+                       increaseWidth = !increaseWidth;
+               }
+       }
+};
+
+deUint32 getSeedValue (const Params& params)
+{
+       return deInt32Hash(params.stackSize);
+}
+
+class StackTestInstance : public ProtectedTestInstance
+{
+public:
+                                                               StackTestInstance       (Context&                               ctx,
+                                                                                                        const ImageValidator&  validator,
+                                                                                                        const Params&                  params);
+       virtual tcu::TestStatus         iterate                         (void);
+
+private:
+       de::MovePtr<tcu::Texture2D>     createTestTexture2D     (void);
+       tcu::TestStatus                         validateResult          (vk::VkImage                    image,
+                                                                                                        vk::VkImageLayout imageLayout,
+                                                                                                        const tcu::Texture2D&  texture2D,
+                                                                                                        const tcu::Sampler&    refSampler);
+       void                                            calculateRef            (tcu::Texture2D&                texture2D);
+
+       const ImageValidator&           m_validator;
+       const Params&                           m_params;
+};
+
+class StackTestCase : public TestCase
+{
+public:
+                                                               StackTestCase   (tcu::TestContext&              testCtx,
+                                                                                                const std::string&             name,
+                                                                                                const std::string&             description,
+                                                                                                const Params&                  params)
+                                                                       : TestCase              (testCtx, name, description)
+                                                                       , m_validator   (vk::VK_FORMAT_R8G8B8A8_UNORM)
+                                                                       , m_params              (params)
+                                                               {
+                                                               }
+
+       virtual                                         ~StackTestCase  (void) {}
+       virtual TestInstance*           createInstance  (Context& ctx) const
+                                                               {
+                                                                       return new StackTestInstance(ctx, m_validator, m_params);
+                                                               }
+       virtual void                            initPrograms    (vk::SourceCollections& programCollection) const;
+
+private:
+       ImageValidator                          m_validator;
+       Params                                          m_params;
+};
+
+void StackTestCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+       m_validator.initPrograms(programCollection);
+
+       // Test validates handling of protected memory allocated on stack.
+       // The test copies protected memory content into temporary variable allocated inside function p.
+       // Thus test forces protected content to appear on stack.
+       // Function p() returns specified protected memory element from the variable allocated on stack.
+       // Function u() returns specified protected memory element from the global variable.
+       // Values returned by p() and u() should be same.
+       // Test is repeated several times (16) to avoid coincidental matches.
+       // In case of any mismatches it is signalized to inherited verifier function by setting 0 in result store image.
+       // Each invocation validates particular element (bytes) on stack.
+       // Number of invocations matches stack size specified in test parameters.
+       std::string comp =
+               std::string() +
+               "#version 450\n"
+               "layout(local_size_x = " + de::toString(m_params.imageWidth) + ", local_size_y = " + de::toString(m_params.imageHeight) + ", local_size_z = 1) in;\n"
+               "layout(set = 0, binding = 0, rgba8) writeonly uniform highp image2D u_resultImage;\n"
+               "layout(set = 0, binding = 1, rgba8) readonly uniform highp image2D u_srcImage;\n"
+               "vec4 protectedData[" + de::toString(m_params.stackSize) + "];\n"
+               "\n"
+               "vec4 p(int idx)\n"
+               "{\n"
+               "    vec4 localData[" + de::toString(m_params.stackSize) + "];\n"
+               "    for (int i = 0; i < " + de::toString(m_params.stackSize) + "; i++)\n"
+               "        localData[i] = protectedData[i];\n"
+               "    return localData[idx];\n"
+               "}\n"
+               "\n"
+               "vec4 u(int idx)\n"
+               "{\n"
+               "    return protectedData[idx];\n"
+               "}\n"
+               "\n"
+               "void main() {\n"
+               "    const int n = " + de::toString(m_params.stackSize) + ";\n"
+               "    int m = 0;\n"
+               "    int w = " + de::toString(m_params.imageWidth) + ";\n"
+               "    int gx = int(gl_GlobalInvocationID.x);\n"
+               "    int gy = int(gl_GlobalInvocationID.y);\n"
+               "    int checked_ndx = gy * w + gx;\n"
+               "    vec4 outColor;\n"
+               "\n"
+               "    for (int j = 0; j < 16; j++)\n"
+               "    {\n"
+               "        for (int i = 0; i < n; i++)\n"
+               "        {\n"
+               "            const int idx = (i + j) % n;\n"
+               "            protectedData[i] = imageLoad(u_srcImage, ivec2(idx % w, idx / w));\n"
+               "        }\n"
+               "\n"
+               "        vec4 vp = p(checked_ndx);\n"
+               "        vec4 vu = u(checked_ndx);\n"
+               "        if (any(notEqual(vp,vu)))\n"
+               "            m++;\n"
+               "    }\n"
+               "\n"
+               "    if (m <= 0)\n"
+               "        outColor = vec4(0.0f);\n"
+               "    else\n"
+               "        outColor = vec4(1.0f);\n"
+               "    imageStore(u_resultImage, ivec2(gx, gy), outColor);\n"
+               "}\n";
+
+       programCollection.glslSources.add("comp") << glu::ComputeSource(comp);
+}
+
+StackTestInstance::StackTestInstance (Context&                         ctx,
+                                                                         const ImageValidator& validator,
+                                                                         const Params&                 params)
+       : ProtectedTestInstance (ctx)
+       , m_validator                   (validator)
+       , m_params                              (params)
+{
+}
+
+de::MovePtr<tcu::Texture2D> StackTestInstance::createTestTexture2D (void)
+{
+       const tcu::TextureFormat                texFmt          = mapVkFormat(vk::VK_FORMAT_R8G8B8A8_UNORM);
+       de::MovePtr<tcu::Texture2D>             texture2D       (new tcu::Texture2D(texFmt, m_params.imageWidth, m_params.imageHeight));
+
+       texture2D->allocLevel(0);
+
+       const tcu::PixelBufferAccess&   level           = texture2D->getLevel(0);
+
+       fillWithUniqueColors(level, getSeedValue(m_params));
+
+       return texture2D;
+}
+
+tcu::TestStatus StackTestInstance::iterate (void)
+{
+       ProtectedContext&                                               ctx                                     (m_protectedContext);
+       const vk::DeviceInterface&                              vk                                      = ctx.getDeviceInterface();
+       const vk::VkDevice                                              device                          = ctx.getDevice();
+       const vk::VkQueue                                               queue                           = ctx.getQueue();
+       const deUint32                                                  queueFamilyIndex        = ctx.getQueueFamilyIndex();
+       const vk::VkPhysicalDeviceProperties    properties                      = vk::getPhysicalDeviceProperties(ctx.getInstanceDriver(), ctx.getPhysicalDevice());
+
+       vk::Unique<vk::VkCommandPool>                   cmdPool                         (makeCommandPool(vk, device, PROTECTION_ENABLED, queueFamilyIndex));
+
+       de::MovePtr<tcu::Texture2D>                             texture2D                       = createTestTexture2D();
+       const tcu::Sampler                                              refSampler                      = tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE,
+                                                                                                                                                          tcu::Sampler::NEAREST, tcu::Sampler::NEAREST);
+
+       vk::Unique<vk::VkShaderModule>                  computeShader           (vk::createShaderModule(vk, device, ctx.getBinaryCollection().get("comp"), 0));
+
+       de::MovePtr<vk::ImageWithMemory>                imageSrc;
+       de::MovePtr<vk::ImageWithMemory>                imageDst;
+       vk::Move<vk::VkSampler>                                 sampler;
+       vk::Move<vk::VkImageView>                               imageViewSrc;
+       vk::Move<vk::VkImageView>                               imageViewDst;
+
+       vk::Move<vk::VkDescriptorSetLayout>             descriptorSetLayout;
+       vk::Move<vk::VkDescriptorPool>                  descriptorPool;
+       vk::Move<vk::VkDescriptorSet>                   descriptorSet;
+
+       // Check the number of invocations supported
+       if (properties.limits.maxComputeWorkGroupInvocations < m_params.imageWidth * m_params.imageHeight)
+               throw tcu::NotSupportedError("Not enough compute workgroup invocations supported.");
+
+       // Create src and dst images
+       {
+               vk::VkImageUsageFlags imageUsageFlags = vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT     |
+                                                                                               vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT     |
+                                                                                               vk::VK_IMAGE_USAGE_SAMPLED_BIT          |
+                                                                                               vk::VK_IMAGE_USAGE_STORAGE_BIT;
+
+               imageSrc = createImage2D(ctx, PROTECTION_ENABLED, queueFamilyIndex,
+                                                                m_params.imageWidth, m_params.imageHeight,
+                                                                vk::VK_FORMAT_R8G8B8A8_UNORM,
+                                                                imageUsageFlags);
+
+               imageDst = createImage2D(ctx, PROTECTION_ENABLED, queueFamilyIndex,
+                                                                m_params.imageWidth, m_params.imageHeight,
+                                                                vk::VK_FORMAT_R8G8B8A8_UNORM,
+                                                                imageUsageFlags);
+       }
+
+       // Upload source image
+       {
+               de::MovePtr<vk::ImageWithMemory>        unprotectedImage        = createImage2D(ctx, PROTECTION_DISABLED, queueFamilyIndex,
+                                                                                                                                                               m_params.imageWidth, m_params.imageHeight,
+                                                                                                                                                               vk::VK_FORMAT_R8G8B8A8_UNORM,
+                                                                                                                                                               vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+
+               // Upload data to an unprotected image
+               uploadImage(m_protectedContext, **unprotectedImage, *texture2D);
+
+               // Copy unprotected image to protected image
+               copyToProtectedImage(m_protectedContext, **unprotectedImage, **imageSrc, vk::VK_IMAGE_LAYOUT_GENERAL, m_params.imageWidth, m_params.imageHeight);
+       }
+
+       // Clear dst image
+       clearImage(m_protectedContext, **imageDst);
+
+       // Create descriptors
+       {
+               vk::DescriptorSetLayoutBuilder  layoutBuilder;
+               vk::DescriptorPoolBuilder               poolBuilder;
+
+               layoutBuilder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, vk::VK_SHADER_STAGE_COMPUTE_BIT);
+               layoutBuilder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, vk::VK_SHADER_STAGE_COMPUTE_BIT);
+               poolBuilder.addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u);
+
+               descriptorSetLayout             = layoutBuilder.build(vk, device);
+               descriptorPool                  = poolBuilder.build(vk, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+               descriptorSet                   = makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout);
+       }
+
+       // Create pipeline layout
+       vk::Unique<vk::VkPipelineLayout>        pipelineLayout          (makePipelineLayout(vk, device, *descriptorSetLayout));
+
+       // Create image views
+       {
+               imageViewSrc = createImageView(ctx, **imageSrc, vk::VK_FORMAT_R8G8B8A8_UNORM);
+               imageViewDst = createImageView(ctx, **imageDst, vk::VK_FORMAT_R8G8B8A8_UNORM);
+       }
+
+       // Update descriptor set information
+       {
+               vk::DescriptorSetUpdateBuilder  updateBuilder;
+
+               vk::VkDescriptorImageInfo               descStorageImgDst       = makeDescriptorImageInfo((vk::VkSampler)0, *imageViewDst, vk::VK_IMAGE_LAYOUT_GENERAL);
+               vk::VkDescriptorImageInfo               descStorageImgSrc       = makeDescriptorImageInfo((vk::VkSampler)0, *imageViewSrc, vk::VK_IMAGE_LAYOUT_GENERAL);
+
+               updateBuilder.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descStorageImgDst);
+               updateBuilder.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descStorageImgSrc);
+
+               updateBuilder.update(vk, device);
+       }
+
+       // Create compute commands & submit
+       {
+               const vk::Unique<vk::VkFence>           fence           (vk::createFence(vk, device));
+               vk::Unique<vk::VkPipeline>                      pipeline        (makeComputePipeline(vk, device, *pipelineLayout, *computeShader, DE_NULL));
+               vk::Unique<vk::VkCommandBuffer>         cmdBuffer       (vk::allocateCommandBuffer(vk, device, *cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+
+               beginCommandBuffer(vk, *cmdBuffer);
+
+               vk.cmdBindPipeline(*cmdBuffer, vk::VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+               vk.cmdBindDescriptorSets(*cmdBuffer, vk::VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &*descriptorSet, 0u, DE_NULL);
+               vk.cmdDispatch(*cmdBuffer, 1u, 1u, 1u);
+               endCommandBuffer(vk, *cmdBuffer);
+
+               VK_CHECK(queueSubmit(ctx, PROTECTION_ENABLED, queue, *cmdBuffer, *fence, ~0ull));
+       }
+
+       // Calculate reference image
+       calculateRef(*texture2D);
+
+       // Validate result
+       return validateResult(**imageDst, vk::VK_IMAGE_LAYOUT_GENERAL, *texture2D, refSampler);
+}
+
+void StackTestInstance::calculateRef (tcu::Texture2D& texture2D)
+{
+       const tcu::PixelBufferAccess&   reference       = texture2D.getLevel(0);
+       const tcu::IVec4                                zero;
+
+       for (int x = 0; x < reference.getWidth(); ++x)
+       for (int y = 0; y < reference.getHeight(); ++y)
+               reference.setPixel(zero, x, y);
+}
+
+tcu::TestStatus StackTestInstance::validateResult (vk::VkImage image, vk::VkImageLayout imageLayout, const tcu::Texture2D& texture2D, const tcu::Sampler& refSampler)
+{
+       de::Random                      rnd                     (getSeedValue(m_params));
+       ValidationData          refData;
+
+       for (int ndx = 0; ndx < 4; ++ndx)
+       {
+               const float     lod     = 0.0f;
+               const float     cx      = rnd.getFloat(0.0f, 1.0f);
+               const float     cy      = rnd.getFloat(0.0f, 1.0f);
+
+               refData.coords[ndx] = tcu::Vec4(cx, cy, 0.0f, 0.0f);
+               refData.values[ndx] = texture2D.sample(refSampler, cx, cy, lod);
+       }
+
+       if (!m_validator.validateImage(m_protectedContext, refData, image, vk::VK_FORMAT_R8G8B8A8_UNORM, imageLayout))
+               return tcu::TestStatus::fail("Result validation failed");
+       else
+               return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup*    createStackTests (tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> stackGroup (new tcu::TestCaseGroup(testCtx, "stack", "Protected memory stack tests"));
+
+       static const deUint32 stackMemSizes[] = { 32, 64, 128, 256, 512, 1024 };
+
+       for (int stackMemSizeIdx = 0; stackMemSizeIdx < DE_LENGTH_OF_ARRAY(stackMemSizes); ++stackMemSizeIdx)
+       {
+               std::string testName = std::string("stacksize_") + de::toString(stackMemSizes[stackMemSizeIdx]);
+
+               stackGroup->addChild(new StackTestCase(testCtx, testName, "", Params(stackMemSizes[stackMemSizeIdx])));
+       }
+
+       return stackGroup.release();
+}
+
+} // ProtectedMem
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStackTests.hpp b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStackTests.hpp
new file mode 100644 (file)
index 0000000..8142a9f
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef _VKTPROTECTEDMEMSTACKTESTS_HPP
+#define _VKTPROTECTEDMEMSTACKTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2018 The Khronos Group Inc.
+ * Copyright (c) 2018 Google Inc.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Protected memory stack tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace ProtectedMem
+{
+
+tcu::TestCaseGroup*            createStackTests        (tcu::TestContext& testCtx);
+
+} // ProtectedMem
+} // vkt
+
+#endif // _VKTPROTECTEDMEMSTACKTESTS_HPP
index 12ce141..0c30924 100644 (file)
@@ -40,6 +40,7 @@
 #include "vktProtectedMemWsiSwapchainTests.hpp"
 #include "vktProtectedMemYCbCrConversionTests.hpp"
 #include "vktProtectedMemWorkgroupStorageTests.hpp"
+#include "vktProtectedMemStackTests.hpp"
 
 namespace vkt
 {
@@ -96,6 +97,7 @@ tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
        }
 
        protectedTests->addChild(createWorkgroupStorageTests(testCtx));
+       protectedTests->addChild(createStackTests(testCtx));
 
        return protectedTests.release();
 
index f5728e0..a484925 100644 (file)
@@ -913,5 +913,40 @@ void fillWithRandomColorTiles (const tcu::PixelBufferAccess& dst, const tcu::Vec
        }
 }
 
+void fillWithUniqueColors (const tcu::PixelBufferAccess& dst, deUint32 seed)
+{
+       // This is an implementation of linear congruential generator.
+       // The A and M are prime numbers, thus allowing to generate unique number sequence of length genM-1.
+       // The generator uses C constant as 0, thus value of 0 is not allowed as a seed.
+       const deUint64  genA    = 1573051ull;
+       const deUint64  genM    = 2097023ull;
+       deUint64                genX    = seed % genM;
+
+       DE_ASSERT(deUint64(dst.getWidth()) * deUint64(dst.getHeight()) * deUint64(dst.getDepth()) < genM - 1);
+
+       if (genX == 0)
+               genX = 1;
+
+       const int       numCols         = dst.getWidth();
+       const int       numRows         = dst.getHeight();
+       const int       numSlices       = dst.getDepth();
+
+       for (int z = 0; z < numSlices; z++)
+       for (int y = 0; y < numRows; y++)
+       for (int x = 0; x < numCols; x++)
+       {
+               genX = (genA * genX) % genM;
+
+               DE_ASSERT(genX != seed);
+
+               const float             r               = float(deUint32((genX >> 0)  & 0x7F)) / 127.0f;
+               const float             g               = float(deUint32((genX >> 7)  & 0x7F)) / 127.0f;
+               const float             b               = float(deUint32((genX >> 14) & 0x7F)) / 127.0f;
+               const tcu::Vec4 color   = tcu::Vec4(r, g, b, 1.0f);
+
+               dst.setPixel(color, x, y, z);
+       }
+}
+
 } // ProtectedMem
 } // vkt
index 8671a84..fd338cd 100644 (file)
@@ -177,6 +177,9 @@ void                                                                fillWithRandomColorTiles                        (const tcu::PixelBufferAccess&          dst,
                                                                                                                                                 const tcu::Vec4&                                       maxVal,
                                                                                                                                                 deUint32                                                       seed);
 
+void                                                           fillWithUniqueColors                            (const tcu::PixelBufferAccess&          dst,
+                                                                                                                                                deUint32                                                       seed);
+
 } // ProtectedMem
 } // vkt
 
index 767b094..554334d 100644 (file)
@@ -540498,6 +540498,12 @@ dEQP-VK.protected_memory.workgroupstorage.memsize_5
 dEQP-VK.protected_memory.workgroupstorage.memsize_60
 dEQP-VK.protected_memory.workgroupstorage.memsize_101
 dEQP-VK.protected_memory.workgroupstorage.memsize_503
+dEQP-VK.protected_memory.stack.stacksize_32
+dEQP-VK.protected_memory.stack.stacksize_64
+dEQP-VK.protected_memory.stack.stacksize_128
+dEQP-VK.protected_memory.stack.stacksize_256
+dEQP-VK.protected_memory.stack.stacksize_512
+dEQP-VK.protected_memory.stack.stacksize_1024
 dEQP-VK.device_group.sfr
 dEQP-VK.device_group.sfr_sys
 dEQP-VK.device_group.sfr_dedicated
index d905334..8dff2b0 100644 (file)
@@ -540459,6 +540459,12 @@ dEQP-VK.protected_memory.workgroupstorage.memsize_5
 dEQP-VK.protected_memory.workgroupstorage.memsize_60
 dEQP-VK.protected_memory.workgroupstorage.memsize_101
 dEQP-VK.protected_memory.workgroupstorage.memsize_503
+dEQP-VK.protected_memory.stack.stacksize_32
+dEQP-VK.protected_memory.stack.stacksize_64
+dEQP-VK.protected_memory.stack.stacksize_128
+dEQP-VK.protected_memory.stack.stacksize_256
+dEQP-VK.protected_memory.stack.stacksize_512
+dEQP-VK.protected_memory.stack.stacksize_1024
 dEQP-VK.device_group.sfr
 dEQP-VK.device_group.sfr_sys
 dEQP-VK.device_group.sfr_dedicated