Cherry-pick dEQP-VK.pipeline.cache fixes to nougat-cts-dev
authorPyry Haulos <phaulos@google.com>
Mon, 21 Nov 2016 23:54:55 +0000 (15:54 -0800)
committerPyry Haulos <phaulos@google.com>
Tue, 29 Nov 2016 23:22:45 +0000 (15:22 -0800)
Bug: 33041922

Validation fixes in dEQP-VK.pipeline

- Corrected out of range minDepthBounds value
- Added missing image layout transitions
- timestamp, cache tests: pass data through geometry shader
- cache test: use correct initialLayout in attachment when starting
  a second render pass

(cherry picked from commit 1d3585c5ec71cf90d6519913db6a01ef2c0f840c)

Fix use of out-of-scope struct in pipeline cache tests

Fixes #363

(cherry picked from commit 1ec71c633e5755a1932c1da7692aef69b66999db)

Pipeline cache test: fix SPIRV validation error

(cherry picked from commit 89cce75bae9beb123311281386fb59b8da59052b)

Change-Id: I4862cca352955c33d04540f2f881760f4e4ffd65

external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp

index 07338fa..642ae95 100644 (file)
@@ -397,23 +397,20 @@ Move<VkPipeline> SimpleGraphicsPipelineBuilder::buildPipeline (tcu::UVec2 render
                        0u,                     // deUint32     writeMask;
                        0u,                     // deUint32     reference;
                },
-               -1.0f,                                                      // float                                    minDepthBounds;
-               +1.0f,                                                      // float                                    maxDepthBounds;
+               0.0f,                                                      // float                                    minDepthBounds;
+               1.0f,                                                      // float                                    maxDepthBounds;
        };
 
-       const VkPipelineTessellationStateCreateInfo* pTessCreateInfo = DE_NULL;
-       if (m_patchControlPoints > 0)
+       const VkPipelineTessellationStateCreateInfo tessStateCreateInfo =
        {
-               const VkPipelineTessellationStateCreateInfo tessStateCreateInfo =
-               {
-                       VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,  // VkStructureType                          sType;
-                       DE_NULL,                                                    // const void*                              pNext;
-                       0u,                                                         // VkPipelineTesselationStateCreateFlags    flags;
-                       m_patchControlPoints,                                       // deUint32                                 patchControlPoints;
-               };
-
-               pTessCreateInfo = &tessStateCreateInfo;
-       }
+               VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,  // VkStructureType                          sType;
+               DE_NULL,                                                    // const void*                              pNext;
+               0u,                                                         // VkPipelineTesselationStateCreateFlags    flags;
+               m_patchControlPoints,                                       // deUint32                                 patchControlPoints;
+       };
+       const VkPipelineTessellationStateCreateInfo* pTessCreateInfo = (m_patchControlPoints > 0)
+                                                                                                                                 ? &tessStateCreateInfo
+                                                                                                                                 : DE_NULL;
 
        const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
        {
@@ -696,6 +693,7 @@ protected:
        de::MovePtr<Allocation>             m_depthImageAlloc;
        de::MovePtr<Allocation>             m_colorImageAlloc[PIPELINE_CACHE_NDX_COUNT];
        Move<VkImageView>                   m_depthAttachmentView;
+       VkImageMemoryBarrier                            m_imageLayoutBarriers[3];
 
        Move<VkBuffer>                      m_vertexBuffer;
        de::MovePtr<Allocation>                         m_vertexBufferMemory;
@@ -743,13 +741,18 @@ void GraphicsCacheTest::initPrograms (SourceCollections& programCollection) cons
                        case VK_SHADER_STAGE_GEOMETRY_BIT:
                                programCollection.glslSources.add("dummy_geo") << glu::GeometrySource(
                                        "#version 450 \n"
-                                       "layout (triangles) in;\n"
-                                       "layout (triangle_strip, max_vertices = 3) out;\n"
+                                       "layout(triangles) in;\n"
+                                       "layout(triangle_strip, max_vertices = 3) out;\n"
+                                       "layout(location = 0) in highp vec4 in_vtxColor[];\n"
+                                       "layout(location = 0) out highp vec4 vtxColor;\n"
+                                       "out gl_PerVertex { vec4 gl_Position; };\n"
+                                       "in gl_PerVertex { vec4 gl_Position; } gl_in[];\n"
                                        "void main (void)\n"
                                        "{\n"
                                        "  for(int ndx=0; ndx<3; ndx++)\n"
                                        "  {\n"
                                        "    gl_Position = gl_in[ndx].gl_Position;\n"
+                                       "    vtxColor    = in_vtxColor[ndx];\n"
                                        "    EmitVertex();\n"
                                        "  }\n"
                                        "  EndPrimitive();\n"
@@ -762,6 +765,8 @@ void GraphicsCacheTest::initPrograms (SourceCollections& programCollection) cons
                                        "layout(vertices = 3) out;\n"
                                        "layout(location = 0) in highp vec4 color[];\n"
                                        "layout(location = 0) out highp vec4 vtxColor[];\n"
+                                       "out gl_PerVertex { vec4 gl_Position; } gl_out[3];\n"
+                                       "in gl_PerVertex { vec4 gl_Position; } gl_in[gl_MaxPatchVertices];\n"
                                        "void main()\n"
                                        "{\n"
                                        "  gl_TessLevelOuter[0] = 4.0;\n"
@@ -779,6 +784,8 @@ void GraphicsCacheTest::initPrograms (SourceCollections& programCollection) cons
                                        "layout(triangles, fractional_even_spacing, ccw) in;\n"
                                        "layout(location = 0) in highp vec4 colors[];\n"
                                        "layout(location = 0) out highp vec4 vtxColor;\n"
+                                       "out gl_PerVertex { vec4 gl_Position; };\n"
+                                       "in gl_PerVertex { vec4 gl_Position; } gl_in[gl_MaxPatchVertices];\n"
                                        "void main() \n"
                                        "{\n"
                                        "  float u = gl_TessCoord.x;\n"
@@ -843,7 +850,7 @@ GraphicsCacheTestInstance::GraphicsCacheTestInstance (Context&              cont
                        VK_ATTACHMENT_STORE_OP_STORE,                       // VkAttachmentStoreOp             storeOp;
                        VK_ATTACHMENT_LOAD_OP_DONT_CARE,                    // VkAttachmentLoadOp              stencilLoadOp;
                        VK_ATTACHMENT_STORE_OP_DONT_CARE,                   // VkAttachmentStoreOp             stencilStoreOp;
-                       VK_IMAGE_LAYOUT_UNDEFINED,                          // VkImageLayout                   initialLayout;
+                       VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,           // VkImageLayout                   initialLayout;
                        VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,           // VkImageLayout                   finalLayout;
                };
 
@@ -856,7 +863,7 @@ GraphicsCacheTestInstance::GraphicsCacheTestInstance (Context&              cont
                        VK_ATTACHMENT_STORE_OP_DONT_CARE,                   // VkAttachmentStoreOp          storeOp;
                        VK_ATTACHMENT_LOAD_OP_DONT_CARE,                    // VkAttachmentLoadOp           stencilLoadOp;
                        VK_ATTACHMENT_STORE_OP_DONT_CARE,                   // VkAttachmentStoreOp          stencilStoreOp;
-                       VK_IMAGE_LAYOUT_UNDEFINED,                          // VkImageLayout                initialLayout;
+                       VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,   // VkImageLayout                initialLayout;
                        VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,   // VkImageLayout                finalLayout;
                };
 
@@ -938,6 +945,43 @@ GraphicsCacheTestInstance::GraphicsCacheTestInstance (Context&              cont
                                                                                                  &m_depthImageAlloc);
        }
 
+       // Set up image layout transition barriers
+       {
+               VkImageMemoryBarrier colorImageBarrier =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType                      sType;
+                       DE_NULL,                                                                                        // const void*                          pNext;
+                       0u,                                                                                                     // VkAccessFlags                        srcAccessMask;
+                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                           // VkAccessFlags                        dstAccessMask;
+                       VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                        oldLayout;
+                       VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,                       // VkImageLayout                        newLayout;
+                       VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     dstQueueFamilyIndex;
+                       *m_colorImage[PIPELINE_CACHE_NDX_NO_CACHE],                     // VkImage                                      image;
+                       { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u },          // VkImageSubresourceRange      subresourceRange;
+               };
+
+               m_imageLayoutBarriers[0] = colorImageBarrier;
+
+               colorImageBarrier.image = *m_colorImage[PIPELINE_CACHE_NDX_CACHED];
+               m_imageLayoutBarriers[1] = colorImageBarrier;
+
+               const VkImageMemoryBarrier depthImageBarrier =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType                      sType;
+                       DE_NULL,                                                                                        // const void*                          pNext;
+                       0u,                                                                                                     // VkAccessFlags                        srcAccessMask;
+                       VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,           // VkAccessFlags                        dstAccessMask;
+                       VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                        oldLayout;
+                       VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,       // VkImageLayout                        newLayout;
+                       VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     dstQueueFamilyIndex;
+                       *m_depthImage,                                                                          // VkImage                                      image;
+                       { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u },          // VkImageSubresourceRange      subresourceRange;
+               };
+
+               m_imageLayoutBarriers[2] = depthImageBarrier;
+       }
        // Create color attachment view
        {
                VkImageViewCreateInfo colorAttachmentViewParams =
@@ -1105,8 +1149,13 @@ void GraphicsCacheTestInstance::prepareCommandBuffer (void)
 
        VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
 
+       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0,
+               0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(m_imageLayoutBarriers), m_imageLayoutBarriers);
+
        prepareRenderPass(*m_framebuffer[PIPELINE_CACHE_NDX_NO_CACHE], *m_pipeline[PIPELINE_CACHE_NDX_NO_CACHE]);
 
+       // After the first render pass, the images are in correct layouts
+
        prepareRenderPass(*m_framebuffer[PIPELINE_CACHE_NDX_CACHED], *m_pipeline[PIPELINE_CACHE_NDX_CACHED]);
 
        VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));