Add base of the copy image to image
authorKristof Kosztyo <kkosztyo.u-szeged@samsung.com>
Mon, 14 Dec 2015 18:54:04 +0000 (19:54 +0100)
committerKristof Kosztyo <kkosztyo.u-szeged@samsung.com>
Wed, 23 Dec 2015 17:22:34 +0000 (18:22 +0100)
external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
external/vulkancts/modules/vulkan/api/vktApiTests.cpp

index c01e893b858aaa45a0b22700c9203122c9525baf..59d81b83790d5020501c2793425bb707cbf4a660 100644 (file)
 
 #include "deStringUtil.hpp"
 #include "deUniquePtr.hpp"
+#include "vkMemUtil.hpp"
 #include "vktTestCase.hpp"
 #include "vktTestCaseUtil.hpp"
+#include "vkQueryUtil.hpp"
 #include "vkRefUtil.hpp"
 #include "vkTypeUtil.hpp"
 #include "tcuVectorType.hpp"
@@ -60,17 +62,30 @@ public:
                                                                                CopiesAndBlittingTestInstance           (Context&       context);
        virtual                                                         ~CopiesAndBlittingTestInstance          (void);
        virtual tcu::TestStatus                         iterate                                                         (void);
-private:
+protected:
        Move<VkCommandPool>                                     m_cmdPool;
        Move<VkCommandBuffer>                           m_cmdBuffer;
        Move<VkFence>                                           m_fence;
-};
 
-static void generateBuffer     (std::vector<tcu::IVec4>& uniformData, deUint32 bufferSize)
-{
-       for (deUint32 i = 0; i < bufferSize; ++i)
-               uniformData.push_back(tcu::IVec4(i, i + 1, i + 2, i + 3));
-}
+       virtual void                                            generateTestBuffer                                      ()
+                                                                               {};
+       virtual void                                            generateExpectedResult                          ()
+                                                                               {};
+       virtual deBool                                          checkTestResult                                         (std::vector<deUint32> expected, std::vector<deUint32> actual);
+
+       const VkCommandBufferBeginInfo          m_cmdBufferBeginInfo =
+       {
+               VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,                    // VkStructureType                                      sType;
+               DE_NULL,                                                                                                // const void*                                          pNext;
+               VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,                    // VkCommandBufferUsageFlags            flags;
+               DE_NULL,                                                                                                // VkRenderPass                                         renderPass;
+               0u,                                                                                                             // deUint32                                                     subpass;
+               DE_NULL,                                                                                                // VkFramebuffer                                        framebuffer;
+               false,                                                                                                  // VkBool32                                                     occlusionQueryEnable;
+               0u,                                                                                                             // VkQueryControlFlags                          queryFlags;
+               0u                                                                                                              // VkQueryPipelineStatisticFlags        pipelineStatistics;
+       };
+};
 
 CopiesAndBlittingTestInstance::~CopiesAndBlittingTestInstance  (void)
 {
@@ -123,6 +138,18 @@ CopiesAndBlittingTestInstance::CopiesAndBlittingTestInstance       (Context& context)
        }
 }
 
+deBool CopiesAndBlittingTestInstance::checkTestResult(std::vector<deUint32> expected, std::vector<deUint32> actual)
+{
+       if (expected.size() != actual.size())
+               return DE_FALSE;
+
+       for (deUint32 i = 0; i < expected.size(); i++) {
+               if (expected[i] != actual[i])
+                       return DE_FALSE;
+       }
+       return DE_TRUE;
+}
+
 tcu::TestStatus CopiesAndBlittingTestInstance::iterate (void)
 {
        return tcu::TestStatus::pass("CopiesAndBlitting test");
@@ -139,7 +166,7 @@ public:
 
        virtual                                 ~CopiesAndBlittingTestCase      (void) {}
        virtual void                    initPrograms                            (SourceCollections&                     programCollection) const
-                                                       {};
+                                                       {}
 
        virtual TestInstance*   createInstance                          (Context&                                       context) const
                                                        {
@@ -147,6 +174,157 @@ public:
                                                        }
 };
 
+struct ImageToImageCaseParams {
+       const VkExtent3D        srcExtent;
+       const VkFormat          srcColorFormat;
+       const VkExtent3D        dstExtent;
+       const VkFormat          dstColorFormat;
+};
+
+//
+class ImageToImageCopies : public CopiesAndBlittingTestInstance
+{
+public:
+                                                                               ImageToImageCopies              (Context&       context, ImageToImageCaseParams params);
+       //virtual                                                               ~ImageToImageCopies             (void);
+       virtual tcu::TestStatus                         iterate                                 (void);
+private:
+       Move<VkImage>                                           m_source;
+       de::MovePtr<Allocation>                         m_sourceImageAlloc;
+       Move<VkImage>                                           m_destination;
+       de::MovePtr<Allocation>                         m_destinationImageAlloc;
+       ImageToImageCaseParams                          m_testParams;
+};
+
+ImageToImageCopies::ImageToImageCopies (Context &context, ImageToImageCaseParams params)
+       : CopiesAndBlittingTestInstance(context)
+       , m_testParams(params)
+{
+       const DeviceInterface&          vk                                      = context.getDeviceInterface();
+       const VkDevice                          vkDevice                        = context.getDevice();
+       const deUint32                          queueFamilyIndex        = context.getUniversalQueueFamilyIndex();
+       SimpleAllocator                         memAlloc                        (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
+
+       const VkImageCreateInfo sourceImageParams =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // VkStructureType              sType;
+               DE_NULL,                                                                // const void*                  pNext;
+               0u,                                                                             // VkImageCreateFlags   flags;
+               VK_IMAGE_TYPE_2D,                                               // VkImageType                  imageType;
+               m_testParams.srcColorFormat,                    // VkFormat                             format;
+               m_testParams.srcExtent,                                 // VkExtent3D                   extent;
+               1u,                                                                             // deUint32                             mipLevels;
+               1u,                                                                             // deUint32                             arraySize;
+               VK_SAMPLE_COUNT_1_BIT,                                  // deUint32                             samples;
+               VK_IMAGE_TILING_OPTIMAL,                                // VkImageTiling                tiling;
+               VK_IMAGE_USAGE_TRANSFER_SRC_BIT,                // VkImageUsageFlags    usage;
+               VK_SHARING_MODE_EXCLUSIVE,                              // VkSharingMode                sharingMode;
+               1u,                                                                             // deUint32                             queueFamilyCount;
+               &queueFamilyIndex,                                              // const deUint32*              pQueueFamilyIndices;
+               VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,   // VkImageLayout                initialLayout;
+       };
+
+       m_source = createImage(vk, vkDevice, &sourceImageParams);
+       m_sourceImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_source), MemoryRequirement::Any);
+       VK_CHECK(vk.bindImageMemory(vkDevice, *m_source, m_sourceImageAlloc->getMemory(), m_sourceImageAlloc->getOffset()));
+
+       const VkImageCreateInfo destinationImageParams =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // VkStructureType              sType;
+               DE_NULL,                                                                // const void*                  pNext;
+               0u,                                                                             // VkImageCreateFlags   flags;
+               VK_IMAGE_TYPE_2D,                                               // VkImageType                  imageType;
+               m_testParams.dstColorFormat,                    // VkFormat                             format;
+               m_testParams.dstExtent,                                 // VkExtent3D                   extent;
+               1u,                                                                             // deUint32                             mipLevels;
+               1u,                                                                             // deUint32                             arraySize;
+               VK_SAMPLE_COUNT_1_BIT,                                  // deUint32                             samples;
+               VK_IMAGE_TILING_OPTIMAL,                                // VkImageTiling                tiling;
+               VK_BUFFER_USAGE_TRANSFER_DST_BIT,               // VkImageUsageFlags    usage;
+               VK_SHARING_MODE_EXCLUSIVE,                              // VkSharingMode                sharingMode;
+               1u,                                                                             // deUint32                             queueFamilyCount;
+               &queueFamilyIndex,                                              // const deUint32*              pQueueFamilyIndices;
+               VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,   // VkImageLayout                initialLayout;
+       };
+
+       m_destination = createImage(vk, vkDevice, &destinationImageParams);
+       m_destinationImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_destination), MemoryRequirement::Any);
+       VK_CHECK(vk.bindImageMemory(vkDevice, *m_destination, m_destinationImageAlloc->getMemory(), m_destinationImageAlloc->getOffset()));
+}
+
+tcu::TestStatus ImageToImageCopies::iterate()
+{
+       generateTestBuffer();
+       generateExpectedResult();
+
+       const DeviceInterface&          vk                      = m_context.getDeviceInterface();
+       const VkDevice                          vkDevice        = m_context.getDevice();
+       const VkQueue                           queue           = m_context.getUniversalQueue();
+
+       const VkImageSubresourceLayers sourceLayer {
+               VK_IMAGE_ASPECT_COLOR_BIT,      // VkImageAspectFlags   aspectMask;
+               0u,                                                     // uint32_t                             mipLevel;
+               0u,                                                     // uint32_t                             baseArrayLayer;
+               1u,                                                     // uint32_t                             layerCount;
+       };
+
+       const VkImageCopy imageCopy =
+       {
+               sourceLayer,    // VkImageSubresourceLayers     srcSubresource;
+               {0, 0, 0},              // VkOffset3D                           srcOffset;
+               sourceLayer,    // VkImageSubresourceLayers     dstSubresource;
+               {0, 0, 0},              // VkOffset3D                           dstOffset;
+               {16, 16, 1},    // VkExtent3D                           extent;
+       };
+
+       VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &m_cmdBufferBeginInfo));
+       vk.cmdCopyImage(*m_cmdBuffer, m_source.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_destination.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &imageCopy);
+       VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
+
+       const VkSubmitInfo submitInfo =
+       {
+               VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
+               DE_NULL,                                                // const void*                          pNext;
+               0u,                                                             // deUint32                                     waitSemaphoreCount;
+               DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
+               1u,                                                             // deUint32                                     commandBufferCount;
+               &m_cmdBuffer.get(),                             // const VkCommandBuffer*       pCommandBuffers;
+               0u,                                                             // deUint32                                     signalSemaphoreCount;
+               DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
+       };
+
+       VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
+       VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
+       VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+
+       // checkTestResult();
+
+       return tcu::TestStatus::fail("Unimplemented!");
+}
+
+class ImageToImageTestCase : public vkt::TestCase
+{
+public:
+                                                       ImageToImageTestCase            (tcu::TestContext&                              testCtx,
+                                                                                                                const std::string&                             name,
+                                                                                                                const std::string&                             description,
+                                                                                                                const ImageToImageCaseParams   params)
+                                                               : vkt::TestCase                 (testCtx, name, description)
+                                                               , m_testParams                  (params)
+                                                       {}
+
+       virtual                                 ~ImageToImageTestCase           (void) {}
+       virtual void                    initPrograms                            (SourceCollections&                             programCollection) const
+                                                       {}
+
+       virtual TestInstance*   createInstance                          (Context&                                               context) const
+                                                       {
+                                                               return new ImageToImageCopies(context, m_testParams);
+                                                       }
+private:
+       ImageToImageCaseParams          m_testParams;
+};
+
 } // anonymous
 
 tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
@@ -159,6 +337,19 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                copiesAndBlittingTests->addChild(new CopiesAndBlittingTestCase(testCtx, "copies_and_blitting_tests_complete", description.str()));
        }
 
+       {
+               std::ostringstream description;
+               const ImageToImageCaseParams params =
+               {
+                       {256, 256, 1},
+                       VK_FORMAT_R32_UINT,
+                       {256, 256, 1},
+                       VK_FORMAT_R8G8B8A8_UINT,
+               };
+               description << "Copy from image to image";
+               copiesAndBlittingTests->addChild(new ImageToImageTestCase(testCtx, "imageToImageWhole", description.str(), params));
+       }
+
        return copiesAndBlittingTests.release();
 }
 
index 0b6770a481709c0ecaa7d3931a5b13531cc30784..85acfb3518833543b154866f5211df1be2cf0d8f 100644 (file)
@@ -44,6 +44,7 @@
 #include "vktApiBufferViewAccessTests.hpp"
 #include "vktApiFeatureInfo.hpp"
 #include "vktApiCommandBuffersTests.hpp"
+#include "vktApiCopiesAndBlittingTests.hpp"
 
 namespace vkt
 {
@@ -73,9 +74,11 @@ tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
        apiTests->addChild(api::createFeatureInfoTests          (testCtx));
        apiTests->addChild(createDeviceInitializationTests      (testCtx));
        apiTests->addChild(createObjectManagementTests          (testCtx));
-       apiTests->addChild(createBufferTests                    (testCtx));
-       apiTests->addChild(createBufferViewTests                (testCtx));
+       apiTests->addChild(createBufferTests                            (testCtx));
+       apiTests->addChild(createBufferViewTests                        (testCtx));
        apiTests->addChild(createCommandBuffersTests            (testCtx));
+       apiTests->addChild(createCopiesAndBlittingTests         (testCtx));
+
        return apiTests.release();
 }