Merge vk-gl-cts/vulkan-cts-1.1.5 into vk-gl-cts/master
authorAlexander Galazin <alexander.galazin@arm.com>
Thu, 29 Aug 2019 14:02:15 +0000 (16:02 +0200)
committerAlexander Galazin <alexander.galazin@arm.com>
Thu, 29 Aug 2019 14:02:15 +0000 (16:02 +0200)
Change-Id: I3a8423407ccb77943a3ce85b6dfbfaf679508c49

1  2 
external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp
external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp

@@@ -23,8 -23,9 +23,9 @@@
   * \brief GraphicsFuzz tests
   *//*--------------------------------------------------------------------*/
  
+ #include "vktTestGroupUtil.hpp"
  #include "vktAmberGraphicsFuzzTests.hpp"
- #include "vktAmberTestCaseUtil.hpp"
+ #include "vktAmberTestCase.hpp"
  
  namespace vkt
  {
@@@ -45,28 -46,16 +46,28 @@@ void createAmberTests (tcu::TestCaseGro
        }
        tests[] =
        {
 +              {       "barrier-in-loop-with-break.amber",                             "barrier-in-loop-with-break",                   "A compute shader with a barrier in a loop with a break"                                                                },
 +              {       "color-write-in-loop.amber",                                    "color-write-in-loop",                                  "A fragment shader that writes to color in a loop"                                                                              },
                {       "continue-and-merge.amber",                                             "continue-and-merge",                                   "A fragment shader with two nested loops"                                                                                               },
                {       "control-flow-switch.amber",                                    "control-flow-switch",                                  "A fragment shader with somewhat complex control flow and a switch"                                             },
 +              {       "dead-barriers-in-loops.amber",                                 "dead-barriers-in-loops",                               "A compute shader with dead barriers"                                                                                                   },
                {       "dead-struct-init.amber",                                               "dead-struct-init",                                             "A fragment shader that uses struct initializers"                                                                               },
 +              {       "early-return-and-barrier.amber",                               "early-return-and-barrier",                             "A compute shader with an early return and a barrier"                                                                   },
                {       "fragcoord-control-flow.amber",                                 "fragcoord-control-flow",                               "A fragment shader that uses FragCoord and somewhat complex control flow"                               },
                {       "fragcoord-control-flow-2.amber",                               "fragcoord-control-flow-2",                             "A fragment shader that uses FragCoord and somewhat complex control flow"                               },
 +              {       "if-and-switch.amber",                                                  "if-and-switch",                                                "A fragment shader with a switch and some data flow"                                                                    },
                {       "mat-array-deep-control-flow.amber",                    "mat-array-deep-control-flow",                  "A fragment shader that uses an array of matrices and has deep control flow"                    },
                {       "mat-array-distance.amber",                                             "mat-array-distance",                                   "A fragment shader that uses an array of matrices and distance"                                                 },
 +              {       "matrices-and-return-in-loop.amber",                    "matrices-and-return-in-loop",                  "A fragment shader with matrices and a return in a loop"                                                                },
 +              {       "nested-ifs-and-return-in-for-loop.amber",              "nested-ifs-and-return-in-for-loop",    "A fragment shader with return in nest of ifs, inside loop"                                                             },
                {       "pow-vec4.amber",                                                               "pow-vec4",                                                             "A fragment shader that uses pow"                                                                                                               },
 +              {       "return-in-loop-in-function.amber",                             "return-in-loop-in-function",                   "A fragment shader with early return from loop in function"                                                             },
 +              {       "struct-used-as-temporary.amber",                               "struct-used-as-temporary",                             "A fragment shader that uses a temporary struct variable"                                                               },
                {       "swizzle-struct-init-min.amber",                                "swizzle-struct-init-min",                              "A fragment shader that uses vector swizzles, struct initializers, and min"                             },
 +              {       "unreachable-barrier-in-loops.amber",                   "unreachable-barrier-in-loops",                 "A compute shader with an unreachable barrier in a loop nest"                                                   },
 +              {       "unreachable-loops-in-switch.amber",                    "unreachable-loops-in-switch",                  "A fragment shader with unreachable loops in a switch"                                                                  },
                {       "while-inside-switch.amber",                                    "while-inside-switch",                                  "A fragment shader that uses a while loop inside a switch"                                                              },
 +              {       "write-red-after-search.amber",                                 "write-red-after-search",                               "A fragment shader performing a search computation, then writing red regardless"                },
        };
  
        for (size_t i = 0; i < sizeof tests / sizeof tests[0]; i++)
@@@ -249,39 -249,6 +249,39 @@@ BoolOp boolOpFromIndex (size_t index
        return ops[index % DE_LENGTH_OF_ARRAY(ops)];
  }
  
 +static float requiredDepthEpsilon(VkFormat format)
 +{
 +      // Possible precision loss in the unorm depth pipeline means that we need to check depths
 +      // that go in and back out of the depth buffer with an epsilon rather than an exact match
 +      deUint32 unormBits = 0;
 +
 +      switch (format)
 +      {
 +      case VK_FORMAT_D16_UNORM:
 +              unormBits = 16;
 +              break;
 +      case VK_FORMAT_X8_D24_UNORM_PACK32:
 +      case VK_FORMAT_D24_UNORM_S8_UINT:
 +              unormBits = 24;
 +              break;
 +      case VK_FORMAT_D32_SFLOAT:
 +      case VK_FORMAT_D32_SFLOAT_S8_UINT:
 +      default:
 +              unormBits = 0;
 +              break;
 +      }
 +
 +      if (unormBits > 0)
 +              return 1.0f / (float)((1 << unormBits) - 1);
 +
 +      return 0.0f; // Require exact match
 +}
 +
 +static bool depthsEqual(float a, float b, float epsilon)
 +{
 +      return fabs(a - b) <= epsilon;
 +}
 +
  Move<VkFramebuffer> createFramebuffer (const DeviceInterface& vk,
                                                                           VkDevice                                     device,
                                                                           VkFramebufferCreateFlags     pCreateInfo_flags,
@@@ -3579,8 -3546,7 +3579,8 @@@ bool verifyColorAttachment (const vecto
  bool verifyDepthAttachment (const vector<PixelValue>&         reference,
                                                        const ConstPixelBufferAccess&   result,
                                                        const PixelBufferAccess&                errorImage,
 -                                                      const DepthValuesArray&                 depthValues)
 +                                                      const DepthValuesArray&                 depthValues,
 +                                                      float                                                   epsilon)
  {
        const Vec4      red             (1.0f, 0.0f, 0.0f, 1.0f);
        const Vec4      green   (0.0f, 1.0f, 0.0f, 1.0f);
                {
                        const bool value = *maybeValue;
  
 -                      if ((value && (resultDepth != float(depthValues[1]) / 255.0f))
 -                              || (!value && resultDepth != float(depthValues[0]) / 255.0f))
 +                      if ((value && !depthsEqual(resultDepth, float(depthValues[1]) / 255.0f, epsilon))
 +                              || (!value && !depthsEqual(resultDepth, float(depthValues[0]) / 255.0f, epsilon)))
                                pixelOk = false;
                }
  
@@@ -3713,7 -3679,7 +3713,7 @@@ bool logAndVerifyImages (TestLog
                                        log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
  
                                        if (renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE
 -                                              && !verifyDepthAttachment(referenceValues[attachmentNdx], depthAccess, depthErrorImage.getAccess(), config.depthValues))
 +                                              && !verifyDepthAttachment(referenceValues[attachmentNdx], depthAccess, depthErrorImage.getAccess(), config.depthValues, requiredDepthEpsilon(attachment.getFormat())))
                                        {
                                                log << TestLog::Image("DepthAttachmentError" + de::toString(attachmentNdx), "Depth Attachment Error " + de::toString(attachmentNdx), depthErrorImage.getAccess());
                                                isOk = false;
                                if (tcu::hasDepthComponent(format.order))
                                {
                                        if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
 -                                              && !verifyDepthAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess(), config.depthValues))
 +                                              && !verifyDepthAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess(), config.depthValues, requiredDepthEpsilon(attachment.getFormat())))
                                        {
                                                log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
                                                isOk = false;
@@@ -3853,8 -3819,6 +3853,8 @@@ void createTestShaders (SourceCollectio
                        fragmentShader << "#version 310 es\n"
                                                   << "precision highp float;\n";
  
 +                      bool hasAnyDepthFormats = false;
 +
                        for (size_t attachmentNdx = config.drawStartNdx; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++)
                        {
                                const deUint32                          attachmentIndex = subpass.getInputAttachments()[attachmentNdx].getAttachment();
                                {
                                        if (isDepthFormat && layout != VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL)
                                        {
 +                                              hasAnyDepthFormats = true;
                                                fragmentShader << "layout(input_attachment_index = " << attachmentNdx << ", set=0, binding=" << inputAttachmentBinding << ") uniform highp subpassInput i_depth" << attachmentNdx << ";\n";
                                                inputAttachmentBinding++;
                                        }
                                fragmentShader << "layout(location = " << attachmentNdx << ") out highp " << attachmentType << " o_color" << attachmentNdx << ";\n";
                        }
  
 +                      if (hasAnyDepthFormats)
 +                              fragmentShader << "\nbool depthsEqual(float a, float b, float epsilon) {\n"
 +                                                              << "\treturn abs(a - b) <= epsilon;\n}\n\n";
 +
                        fragmentShader << "void main (void) {\n";
  
                        if (subpass.getInputAttachments().empty())
                                                {
                                                        if (isDepthFormat && layout != VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL)
                                                        {
 -                                                              fragmentShader << "\tinputs[" << inputValueNdx << "] = " << deUint32(config.depthValues[1]) << ".0f/255.0f == float(subpassLoad(i_depth" << attachmentNdx << ").x);\n";
 +                                                              fragmentShader << "\tinputs[" << inputValueNdx << "] = depthsEqual(" << deUint32(config.depthValues[1]) <<
 +                                                                      ".0f/255.0f, float(subpassLoad(i_depth" << attachmentNdx << ").x), " <<
 +                                                                      std::fixed << std::setprecision(12) << requiredDepthEpsilon(attachment.getFormat()) << ");\n";
                                                                inputValueNdx++;
                                                        }
  
@@@ -5839,10 -5796,10 +5839,10 @@@ void addSimpleTests (tcu::TestCaseGroup
                                           VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
                        Attachment(VK_FORMAT_S8_UINT,
                                           VK_SAMPLE_COUNT_1_BIT,
-                                          VK_ATTACHMENT_LOAD_OP_CLEAR,
-                                          VK_ATTACHMENT_STORE_OP_STORE,
                                           VK_ATTACHMENT_LOAD_OP_DONT_CARE,
                                           VK_ATTACHMENT_STORE_OP_DONT_CARE,
+                                          VK_ATTACHMENT_LOAD_OP_CLEAR,
+                                          VK_ATTACHMENT_STORE_OP_STORE,
                                           VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
                                           VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
                };
@@@ -73,29 -73,19 +73,29 @@@ enum TestTyp
        TEST_TYPE_MULTISTREAMS,
        TEST_TYPE_DRAW_INDIRECT,
        TEST_TYPE_BACKWARD_DEPENDENCY,
 -      TEST_TYPE_QUERY,
 +      TEST_TYPE_QUERY_GET,
 +      TEST_TYPE_QUERY_COPY,
        TEST_TYPE_QUERY_RESET,
        TEST_TYPE_LAST
  };
  
 +enum StreamId0Mode
 +{
 +      STREAM_ID_0_NORMAL                                      = 0,
 +      STREAM_ID_0_BEGIN_QUERY_INDEXED         = 1,
 +      STREAM_ID_0_END_QUERY_INDEXED           = 2,
 +};
 +
  struct TestParameters
  {
 -      TestType        testType;
 -      deUint32        bufferSize;
 -      deUint32        partCount;
 -      deUint32        streamId;
 -      deUint32        pointSize;
 -      deUint32        vertexStride;
 +      TestType                testType;
 +      deUint32                bufferSize;
 +      deUint32                partCount;
 +      deUint32                streamId;
 +      deUint32                pointSize;
 +      deUint32                vertexStride;
 +      StreamId0Mode   streamId0Mode;
 +      bool                    query64bits;
  };
  
  const deUint32 MINIMUM_TF_BUFFER_SIZE = (1<<27);
@@@ -330,6 -320,45 +330,6 @@@ VkMemoryBarrier makeMemoryBarrier (cons
        return barrier;
  }
  
 -VkBufferImageCopy makeBufferImageCopy (const VkExtent3D                                       extent,
 -                                                                         const VkImageSubresourceLayers       subresourceLayers)
 -{
 -      const VkBufferImageCopy copyParams =
 -      {
 -              0ull,                                                                           //      VkDeviceSize                            bufferOffset;
 -              0u,                                                                                     //      deUint32                                        bufferRowLength;
 -              0u,                                                                                     //      deUint32                                        bufferImageHeight;
 -              subresourceLayers,                                                      //      VkImageSubresourceLayers        imageSubresource;
 -              makeOffset3D(0, 0, 0),                                          //      VkOffset3D                                      imageOffset;
 -              extent,                                                                         //      VkExtent3D                                      imageExtent;
 -      };
 -      return copyParams;
 -}
 -
 -inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkBufferCreateInfo& createInfo)
 -{
 -      return createBuffer(vk, device, &createInfo);
 -}
 -
 -inline Move<VkImage> makeImage (const DeviceInterface& vk, const VkDevice device, const VkImageCreateInfo& createInfo)
 -{
 -      return createImage(vk, device, &createInfo);
 -}
 -
 -de::MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
 -{
 -      de::MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
 -      VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
 -      return alloc;
 -}
 -
 -de::MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
 -{
 -      de::MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
 -      VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
 -      return alloc;
 -}
 -
  VkQueryPoolCreateInfo makeQueryPoolCreateInfo (const deUint32 queryCountersNumber)
  {
        const VkQueryPoolCreateInfo                     queryPoolCreateInfo             =
@@@ -789,9 -818,17 +789,17 @@@ protected
  TransformFeedbackBuiltinTestInstance::TransformFeedbackBuiltinTestInstance (Context& context, const TestParameters& parameters)
        : TransformFeedbackTestInstance (context, parameters)
  {
+       const InstanceInterface&                vki                     = m_context.getInstanceInterface();
+       const VkPhysicalDevice                  physDevice      = m_context.getPhysicalDevice();
+       const VkPhysicalDeviceFeatures  features        = getPhysicalDeviceFeatures(vki, physDevice);
        const deUint32 tfBuffersSupported       = m_transformFeedbackProperties.maxTransformFeedbackBuffers;
        const deUint32 tfBuffersRequired        = m_parameters.partCount;
  
+       if ((m_parameters.testType == TEST_TYPE_XFB_CLIPDISTANCE || m_parameters.testType == TEST_TYPE_XFB_CLIP_AND_CULL) && !features.shaderClipDistance)
+               TCU_THROW(NotSupportedError, std::string("shaderClipDistance feature is not supported"));
+       if ((m_parameters.testType == TEST_TYPE_XFB_CULLDISTANCE || m_parameters.testType == TEST_TYPE_XFB_CLIP_AND_CULL) && !features.shaderCullDistance)
+               TCU_THROW(NotSupportedError, std::string("shaderCullDistance feature is not supported"));
        if (tfBuffersSupported < tfBuffersRequired)
                TCU_THROW(NotSupportedError, std::string("maxTransformFeedbackBuffers=" + de::toString(tfBuffersSupported) + ", while test requires " + de::toString(tfBuffersRequired)).c_str());
  }
@@@ -1127,7 -1164,7 +1135,7 @@@ tcu::TestStatus TransformFeedbackStream
        const Unique<VkImage>                           colorImage                      (makeImage                                                              (vk, device, makeImageCreateInfo(0u, VK_IMAGE_TYPE_2D, colorFormat, m_imageExtent2D, 1u, imageUsageFlags)));
        const UniquePtr<Allocation>                     colorImageAlloc         (bindImage                                                              (vk, device, allocator, *colorImage, MemoryRequirement::Any));
        const Unique<VkImageView>                       colorAttachment         (makeImageView                                                  (vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
 -      const Unique<VkBuffer>                          colorBuffer                     (makeBuffer                                                             (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
 +      const Unique<VkBuffer>                          colorBuffer                     (makeBuffer                                                             (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
        const UniquePtr<Allocation>                     colorBufferAlloc        (bindBuffer                                                             (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
  
        const Unique<VkFramebuffer>                     framebuffer                     (makeFramebuffer                                                (vk, device, *renderPass, *colorAttachment, m_imageExtent2D.width, m_imageExtent2D.height));
@@@ -1245,13 -1282,13 +1253,13 @@@ tcu::TestStatus TransformFeedbackIndire
        const Unique<VkImage>                           colorImage                      (makeImage                              (vk, device, makeImageCreateInfo(0u, VK_IMAGE_TYPE_2D, colorFormat, m_imageExtent2D, 1u, imageUsageFlags)));
        const UniquePtr<Allocation>                     colorImageAlloc         (bindImage                              (vk, device, allocator, *colorImage, MemoryRequirement::Any));
        const Unique<VkImageView>                       colorAttachment         (makeImageView                  (vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresRange));
 -      const Unique<VkBuffer>                          colorBuffer                     (makeBuffer                             (vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
 +      const Unique<VkBuffer>                          colorBuffer                     (makeBuffer                             (vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
        const UniquePtr<Allocation>                     colorBufferAlloc        (bindBuffer                             (vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
  
        const deUint32                                          vertexCount                     = 6u;
        const VkDeviceSize                                      vertexBufferSize        = vertexCount * m_parameters.vertexStride;
        const VkBufferUsageFlags                        vertexBufferUsage       = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
 -      const Unique<VkBuffer>                          vertexBuffer            (makeBuffer                             (vk, device, makeBufferCreateInfo(vertexBufferSize, vertexBufferUsage)));
 +      const Unique<VkBuffer>                          vertexBuffer            (makeBuffer                             (vk, device, vertexBufferSize, vertexBufferUsage));
        const UniquePtr<Allocation>                     vertexBufferAlloc       (bindBuffer                             (vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
        const VkDeviceSize                                      vertexBufferOffset      (0u);
        const float                                                     vertexBufferVals[]      =
        const deUint32                                          counterBufferValue      = m_parameters.vertexStride * vertexCount;
        const VkDeviceSize                                      counterBufferSize       = sizeof(counterBufferValue);
        const VkBufferUsageFlags                        counterBufferUsage      = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
 -      const Unique<VkBuffer>                          counterBuffer           (makeBuffer                                                             (vk, device, makeBufferCreateInfo(counterBufferSize, counterBufferUsage)));
 +      const Unique<VkBuffer>                          counterBuffer           (makeBuffer                                                             (vk, device, counterBufferSize, counterBufferUsage));
        const UniquePtr<Allocation>                     counterBufferAlloc      (bindBuffer                                                             (vk, device, allocator, *counterBuffer, MemoryRequirement::HostVisible));
  
        const Unique<VkFramebuffer>                     framebuffer                     (makeFramebuffer                                                (vk, device, *renderPass, *colorAttachment, m_imageExtent2D.width, m_imageExtent2D.height));
@@@ -1324,6 -1361,8 +1332,8 @@@ protected
  TransformFeedbackBackwardDependencyTestInstance::TransformFeedbackBackwardDependencyTestInstance (Context& context, const TestParameters& parameters)
        : TransformFeedbackTestInstance (context, parameters)
  {
+       if (m_transformFeedbackProperties.transformFeedbackDraw == DE_FALSE)
+               TCU_THROW(NotSupportedError, "transformFeedbackDraw feature is not supported");
  }
  
  std::vector<VkDeviceSize> TransformFeedbackBackwardDependencyTestInstance::generateSizesList (const size_t bufBytes, const size_t chunkCount)
@@@ -1474,8 -1513,8 +1484,8 @@@ tcu::TestStatus TransformFeedbackQueryT
  
        const deUint32                                          overflowVertices                = 3u;
        const deUint32                                          bytesPerVertex                  = static_cast<deUint32>(4 * sizeof(float));
 -      const deUint32                                          numVerticesInBuffer             = m_parameters.bufferSize / bytesPerVertex;
 -      const deUint32                                          numVerticesToWrite              = numVerticesInBuffer + overflowVertices;
 +      const deUint64                                          numVerticesInBuffer             = m_parameters.bufferSize / bytesPerVertex;
 +      const deUint64                                          numVerticesToWrite              = numVerticesInBuffer + overflowVertices;
        const Unique<VkRenderPass>                      renderPass                              (makeRenderPass                                                 (vk, device, VK_FORMAT_UNDEFINED));
  
        const Unique<VkShaderModule>            vertModule                              (createShaderModule                                             (vk, device, m_context.getBinaryCollection().get("vert"), 0u));
        const VkDeviceSize                                      tfBufBindingSize                = m_parameters.bufferSize;
        const VkDeviceSize                                      tfBufBindingOffset              = 0ull;
  
 +      const size_t                                            queryResultWidth                = (m_parameters.query64bits ? sizeof(deUint64) : sizeof(deUint32));
 +      const vk::VkQueryControlFlags           queryExtraFlags                 = (m_parameters.query64bits ? vk::VK_QUERY_RESULT_64_BIT : 0);
        const deUint32                                          queryCountersNumber             = 1u;
        const deUint32                                          queryIndex                              = 0u;
 +      constexpr deUint32                                      queryResultElements             = 2u;
 +      const deUint32                                          queryDataSize                   = static_cast<deUint32>(queryResultElements * queryResultWidth);
        const VkQueryPoolCreateInfo                     queryPoolCreateInfo             = makeQueryPoolCreateInfo(queryCountersNumber);
        const Unique<VkQueryPool>                       queryPool                               (createQueryPool(vk, device, &queryPoolCreateInfo));
  
 +      Move<VkBuffer>                                          queryPoolResultsBuffer;
 +      de::MovePtr<Allocation>                         queryPoolResultsBufferAlloc;
 +
        DE_ASSERT(numVerticesInBuffer * bytesPerVertex == m_parameters.bufferSize);
  
 +      if (m_parameters.testType == TEST_TYPE_QUERY_COPY)
 +      {
 +              const VkBufferCreateInfo bufferParams =
 +              {
 +                      VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,       // VkStructureType      sType;
 +                      DE_NULL,                                    // const void*          pNext;
 +                      0u,                                         // VkBufferCreateFlags  flags;
 +                      queryDataSize,                              // VkDeviceSize         size;
 +                      VK_BUFFER_USAGE_TRANSFER_DST_BIT,           // VkBufferUsageFlags   usage;
 +                      VK_SHARING_MODE_EXCLUSIVE,                  // VkSharingMode        sharingMode;
 +                      1u,                                         // deUint32             queueFamilyCount;
 +                      &queueFamilyIndex                           // const deUint32*      pQueueFamilyIndices;
 +              };
 +
 +              queryPoolResultsBuffer = createBuffer(vk, device, &bufferParams);
 +              queryPoolResultsBufferAlloc = allocator.allocate(getBufferMemoryRequirements(vk, device, *queryPoolResultsBuffer), MemoryRequirement::HostVisible);
 +
 +              VK_CHECK(vk.bindBufferMemory(device, *queryPoolResultsBuffer, queryPoolResultsBufferAlloc->getMemory(), queryPoolResultsBufferAlloc->getOffset()));
 +      }
 +
        beginCommandBuffer(vk, *cmdBuffer);
        {
 -              vk.cmdResetQueryPool(*cmdBuffer, *queryPool, queryIndex, queryCountersNumber);
 +              if (m_parameters.testType != TEST_TYPE_QUERY_RESET)
 +                      vk.cmdResetQueryPool(*cmdBuffer, *queryPool, queryIndex, queryCountersNumber);
  
                beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D));
                {
  
                        vk.cmdBindTransformFeedbackBuffersEXT(*cmdBuffer, 0u, 1u, &*tfBuf, &tfBufBindingOffset, &tfBufBindingSize);
  
 -                      if (m_parameters.streamId == 0)
 +                      if (m_parameters.streamId == 0 && m_parameters.streamId0Mode != STREAM_ID_0_BEGIN_QUERY_INDEXED)
                                vk.cmdBeginQuery(*cmdBuffer, *queryPool, queryIndex, 0u);
                        else
                                vk.cmdBeginQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex, 0u, m_parameters.streamId);
                        {
                                vk.cmdBeginTransformFeedbackEXT(*cmdBuffer, 0, 0, DE_NULL, DE_NULL);
                                {
 -                                      vk.cmdDraw(*cmdBuffer, numVerticesToWrite, 1u, 0u, 0u);
 +                                      vk.cmdDraw(*cmdBuffer, static_cast<deUint32>(numVerticesToWrite), 1u, 0u, 0u);
                                }
                                vk.cmdEndTransformFeedbackEXT(*cmdBuffer, 0, 0, DE_NULL, DE_NULL);
                        }
 -                      if (m_parameters.streamId == 0)
 +                      if (m_parameters.streamId == 0 && m_parameters.streamId0Mode != STREAM_ID_0_END_QUERY_INDEXED)
                                vk.cmdEndQuery(*cmdBuffer, *queryPool, queryIndex);
                        else
                                vk.cmdEndQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex, m_parameters.streamId);
                }
                endRenderPass(vk, *cmdBuffer);
 +
 +              if (m_parameters.testType == TEST_TYPE_QUERY_COPY)
 +              {
 +                      vk.cmdCopyQueryPoolResults(*cmdBuffer, *queryPool, queryIndex, queryCountersNumber, *queryPoolResultsBuffer, 0u, queryDataSize, (vk::VK_QUERY_RESULT_WAIT_BIT | queryExtraFlags));
 +
 +                      const VkBufferMemoryBarrier bufferBarrier =
 +                      {
 +                              VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,        // VkStructureType      sType;
 +                              DE_NULL,                                                                        // const void*          pNext;
 +                              VK_ACCESS_TRANSFER_WRITE_BIT,                           // VkAccessFlags        srcAccessMask;
 +                              VK_ACCESS_HOST_READ_BIT,                                        // VkAccessFlags        dstAccessMask;
 +                              VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                     srcQueueFamilyIndex;
 +                              VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                     dstQueueFamilyIndex;
 +                              *queryPoolResultsBuffer,                                        // VkBuffer                     buffer;
 +                              0ull,                                                                           // VkDeviceSize         offset;
 +                              VK_WHOLE_SIZE                                                           // VkDeviceSize         size;
 +                      };
 +                      vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
 +              }
 +
        }
        endCommandBuffer(vk, *cmdBuffer);
  
        submitCommandsAndWait(vk, device, queue, *cmdBuffer);
  
        {
 -              const deUint32                  queryDataSize                   (static_cast<deUint32>(2u * sizeof(deUint32)));
 -              std::vector<deUint8>    queryData                               (queryDataSize, 0u);
 -              const deUint32*                 numPrimitivesWritten    = reinterpret_cast<deUint32*>(&queryData[0]);
 -              const deUint32*                 numPrimitivesNeeded             = numPrimitivesWritten + 1;
 +              union Results {
 +                      deUint32        elements32[queryResultElements];
 +                      deUint64        elements64[queryResultElements];
 +              };
 +
 +              std::vector<deUint8>    queryData               (queryDataSize, 0u);
 +              const Results*                  queryResults    = reinterpret_cast<Results*>(queryData.data());
 +
 +              if (m_parameters.testType != TEST_TYPE_QUERY_COPY)
 +              {
 +                      vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataSize, queryData.data(), queryDataSize, (vk::VK_QUERY_RESULT_WAIT_BIT | queryExtraFlags));
 +              }
 +              else
 +              {
 +                      invalidateAlloc(vk, device, *queryPoolResultsBufferAlloc);
 +                      deMemcpy(queryData.data(), queryPoolResultsBufferAlloc->getHostPtr(), queryData.size());
 +              }
  
 -              vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataSize, &queryData[0], queryDataSize, 0u);
 +              const deUint64  numPrimitivesWritten    = (m_parameters.query64bits ? queryResults->elements64[0] : queryResults->elements32[0]);
 +              const deUint64  numPrimitivesNeeded             = (m_parameters.query64bits ? queryResults->elements64[1] : queryResults->elements32[1]);
  
 -              if (*numPrimitivesWritten != numVerticesInBuffer)
 -                      return tcu::TestStatus::fail("numPrimitivesWritten=" + de::toString(*numPrimitivesWritten) + " while expected " + de::toString(numVerticesInBuffer));
 +              if (numPrimitivesWritten != numVerticesInBuffer)
 +                      return tcu::TestStatus::fail("numPrimitivesWritten=" + de::toString(numPrimitivesWritten) + " while expected " + de::toString(numVerticesInBuffer));
  
 -              if (*numPrimitivesNeeded != numVerticesToWrite)
 -                      return tcu::TestStatus::fail("numPrimitivesNeeded=" + de::toString(*numPrimitivesNeeded) + " while expected " + de::toString(numVerticesToWrite));
 +              if (numPrimitivesNeeded != numVerticesToWrite)
 +                      return tcu::TestStatus::fail("numPrimitivesNeeded=" + de::toString(numPrimitivesNeeded) + " while expected " + de::toString(numVerticesToWrite));
        }
  
        if (m_parameters.testType == TEST_TYPE_QUERY_RESET)
        {
 +              constexpr deUint32              queryResetElements              = queryResultElements + 1; // For the availability bit.
  
 -              const deUint32                  queryDataSize                   (static_cast<deUint32>(3u * sizeof(deUint32)));
 -              std::vector<deUint8>    queryData                               (queryDataSize, 0u);
 -              deUint32*                       numPrimitivesWritten    = reinterpret_cast<deUint32*>(&queryData[0]);
 -              deUint32*                       numPrimitivesNeeded             = numPrimitivesWritten + 1;
 -              deUint32*                       availabilityState               = numPrimitivesNeeded + 1;
 +              union Results {
 +                      deUint32        elements32[queryResetElements];
 +                      deUint64        elements64[queryResetElements];
 +              };
 +
 +              const deUint32                  queryDataAvailSize              (static_cast<deUint32>(queryResetElements * queryResultWidth));
 +              std::vector<deUint8>    queryData                               (queryDataAvailSize, 0u);
 +              Results*                                queryResults                    = reinterpret_cast<Results*>(queryData.data());
  
                // Initialize values
 -              *numPrimitivesNeeded    = 1u;
 -              *numPrimitivesWritten   = 1u;
 -              *availabilityState              = 1u;
 +              if (m_parameters.query64bits)
 +              {
 +                      queryResults->elements64[0] = 1u;       // numPrimitivesWritten
 +                      queryResults->elements64[1] = 1u;       // numPrimitivesNeeded
 +                      queryResults->elements64[2] = 1u;       // Availability bit
 +              }
 +              else
 +              {
 +                      queryResults->elements32[0] = 1u;       // numPrimitivesWritten
 +                      queryResults->elements32[1] = 1u;       // numPrimitivesNeeded
 +                      queryResults->elements32[2] = 1u;       // Availability bit
 +              }
  
                vk.resetQueryPoolEXT(device, *queryPool, queryIndex, queryCountersNumber);
  
 -              vk::VkResult res = vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataSize, &queryData[0], queryDataSize, VK_QUERY_RESULT_WITH_AVAILABILITY_BIT);
 -              /* From Vulkan spec:
 +              vk::VkResult    res                                             = vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataAvailSize, queryData.data(), queryDataAvailSize, (vk::VK_QUERY_RESULT_WITH_AVAILABILITY_BIT | queryExtraFlags));
 +              const deUint64  numPrimitivesWritten    = (m_parameters.query64bits ? queryResults->elements64[0] : queryResults->elements32[0]);
 +              const deUint64  numPrimitivesNeeded             = (m_parameters.query64bits ? queryResults->elements64[1] : queryResults->elements32[1]);
 +              const deUint64  availabilityState               = (m_parameters.query64bits ? queryResults->elements64[2] : queryResults->elements32[2]);
 +
 +              /* From the Vulkan spec:
                        *
                        * If VK_QUERY_RESULT_WAIT_BIT and VK_QUERY_RESULT_PARTIAL_BIT are both not set then no result values are written to pData
                        * for queries that are in the unavailable state at the time of the call, and vkGetQueryPoolResults returns VK_NOT_READY.
                        * However, availability state is still written to pData for those queries if VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
                        */
 -              if (res != vk::VK_NOT_READY || *availabilityState != 0u)
 +              if (res != vk::VK_NOT_READY || availabilityState != 0u)
                        return tcu::TestStatus::fail("QueryPoolResults incorrect reset");
 -          if (*numPrimitivesWritten != 1u || *numPrimitivesNeeded != 1u )
 +          if (numPrimitivesWritten != 1u || numPrimitivesNeeded != 1u)
                        return tcu::TestStatus::fail("QueryPoolResults data was modified");
  
        }
@@@ -1723,9 -1683,7 +1733,9 @@@ vkt::TestInstance*      TransformFeedbackTes
        if (m_parameters.testType == TEST_TYPE_BACKWARD_DEPENDENCY)
                return new TransformFeedbackBackwardDependencyTestInstance(context, m_parameters);
  
 -      if (m_parameters.testType == TEST_TYPE_QUERY || m_parameters.testType == TEST_TYPE_QUERY_RESET)
 +      if (m_parameters.testType == TEST_TYPE_QUERY_GET        ||
 +              m_parameters.testType == TEST_TYPE_QUERY_COPY   ||
 +          m_parameters.testType == TEST_TYPE_QUERY_RESET)
                return new TransformFeedbackQueryTestInstance(context, m_parameters);
  
        TCU_THROW(InternalError, "Specified test type not found");
@@@ -2075,9 -2033,7 +2085,9 @@@ void TransformFeedbackTestCase::initPro
                return;
        }
  
 -      if (m_parameters.testType == TEST_TYPE_QUERY || m_parameters.testType == TEST_TYPE_QUERY_RESET)
 +      if (m_parameters.testType == TEST_TYPE_QUERY_GET        ||
 +              m_parameters.testType == TEST_TYPE_QUERY_COPY   ||
 +              m_parameters.testType == TEST_TYPE_QUERY_RESET)
        {
                // Vertex shader
                {
@@@ -2143,14 -2099,10 +2153,14 @@@ void createTransformFeedbackSimpleTest
  
                                for (deUint32 bufferSizesNdx = 0; bufferSizesNdx < DE_LENGTH_OF_ARRAY(bufferSizes); ++bufferSizesNdx)
                                {
 -                                      const deUint32                  bufferSize      = bufferSizes[bufferSizesNdx];
 -                                      const TestParameters    parameters      = { testType, bufferSize, partCount, 0u, 0u, 0u };
 +                                      const deUint32  bufferSize      = bufferSizes[bufferSizesNdx];
 +                                      TestParameters  parameters      = { testType, bufferSize, partCount, 0u, 0u, 0u, STREAM_ID_0_NORMAL, false };
  
                                        group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(partCount) + "_" + de::toString(bufferSize)).c_str(), "Simple Transform Feedback test", parameters));
 +                                      parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
 +                                      group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0_" + de::toString(partCount) + "_" + de::toString(bufferSize)).c_str(), "Simple Transform Feedback test", parameters));
 +                                      parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
 +                                      group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0_" + de::toString(partCount) + "_" + de::toString(bufferSize)).c_str(), "Simple Transform Feedback test", parameters));
                                }
                        }
                }
                        for (deUint32 bufferCountsNdx = 0; bufferCountsNdx < DE_LENGTH_OF_ARRAY(bufferCounts); ++bufferCountsNdx)
                        {
                                const deUint32                  vertexCount     = bufferCounts[bufferCountsNdx];
 -                              const TestParameters    parameters      = { testType, 0u, vertexCount, 0u, 0u, 0u };
 +                              TestParameters  parameters      = { testType, 0u, vertexCount, 0u, 0u, 0u, STREAM_ID_0_NORMAL, false };
  
                                group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(vertexCount)).c_str(), "Triangle Strip With Adjacency Transform Feedback test", parameters));
 +                              parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
 +                              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0_" + de::toString(vertexCount)).c_str(), "Triangle Strip With Adjacency Transform Feedback test", parameters));
 +                              parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
 +                              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0_" + de::toString(vertexCount)).c_str(), "Triangle Strip With Adjacency Transform Feedback test", parameters));
                        }
                }
        }
  
                for (deUint32 vertexStridesNdx = 0; vertexStridesNdx < DE_LENGTH_OF_ARRAY(vertexStrides); ++vertexStridesNdx)
                {
 -                      const deUint32                  vertexStride    = static_cast<deUint32>(sizeof(deUint32) * vertexStrides[vertexStridesNdx]);
 -                      const TestParameters    parameters              = { testType, 0u, 0u, 0u, 0u, vertexStride };
 +                      const deUint32  vertexStride    = static_cast<deUint32>(sizeof(deUint32) * vertexStrides[vertexStridesNdx]);
 +                      TestParameters  parameters              = { testType, 0u, 0u, 0u, 0u, vertexStride, STREAM_ID_0_NORMAL, false };
  
                        group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(vertexStride)).c_str(), "Rendering tests with various strides", parameters));
 +                      parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
 +                      group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0_" + de::toString(vertexStride)).c_str(), "Rendering tests with various strides", parameters));
 +                      parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
 +                      group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0_" + de::toString(vertexStride)).c_str(), "Rendering tests with various strides", parameters));
                }
        }
  
        {
 -              const TestType                  testType        = TEST_TYPE_BACKWARD_DEPENDENCY;
 -              const std::string               testName        = "backward_dependency";
 -              const TestParameters    parameters      = { testType, 512u, 2u, 0u, 0u, 0u };
 +              const TestType          testType        = TEST_TYPE_BACKWARD_DEPENDENCY;
 +              const std::string       testName        = "backward_dependency";
 +              TestParameters          parameters      = { testType, 512u, 2u, 0u, 0u, 0u, STREAM_ID_0_NORMAL, false };
  
                group->addChild(new TransformFeedbackTestCase(group->getTestContext(), testName.c_str(), "Rendering test checks backward pipeline dependency", parameters));
 +              parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
 +              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_beginqueryindexed_streamid_0").c_str(), "Rendering test checks backward pipeline dependency", parameters));
 +              parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
 +              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_endqueryindexed_streamid_0").c_str(), "Rendering test checks backward pipeline dependency", parameters));
        }
  
        {
                const deUint32          usedStreamId[]                  = { 0, 1, 3, 6, 14 };
                const deUint32          vertexCount[]                   = { 4, 61, 127, 251, 509 };
 -              const TestType          testType                                = TEST_TYPE_QUERY;
 +              const TestType          testType                                = TEST_TYPE_QUERY_GET;
                const std::string       testName                                = "query";
 +              const TestType          testTypeCopy                    = TEST_TYPE_QUERY_COPY;
 +              const std::string       testNameCopy                    = "query_copy";
                const TestType          testTypeHostQueryReset  = TEST_TYPE_QUERY_RESET;
                const std::string       testNameHostQueryReset  = "host_query_reset";
  
  
                        for (deUint32 vertexCountNdx = 0; vertexCountNdx < DE_LENGTH_OF_ARRAY(vertexCount); ++vertexCountNdx)
                        {
 -                              const deUint32                  bytesPerVertex  = static_cast<deUint32>(4 * sizeof(float));
 -                              const deUint32                  bufferSize              = bytesPerVertex * vertexCount[vertexCountNdx];
 -                              const TestParameters    parameters              = { testType, bufferSize, 0u, streamId, 0u, 0u };
 -                              const std::string               fullTestName    = testName + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]);
 -
 -                              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestName.c_str(), "Written primitives query test", parameters));
 -
 -                              const std::string               fullTestNameHostQueryReset      = testNameHostQueryReset + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]);
 -                              const TestParameters    parametersHostQueryReset        = { testTypeHostQueryReset, bufferSize, 0u, streamId, 0u, 0u };
 -                              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestNameHostQueryReset.c_str(), "Written primitives query test", parametersHostQueryReset));
 +                              for (deUint32 i = 0; i < 2; ++i)
 +                              {
 +                                      const bool                              query64Bits             = (i == 1);
 +                                      const std::string               widthStr                = (query64Bits ? "_64bits" : "_32bits");
 +
 +                                      const deUint32                  bytesPerVertex  = static_cast<deUint32>(4 * sizeof(float));
 +                                      const deUint32                  bufferSize              = bytesPerVertex * vertexCount[vertexCountNdx];
 +                                      TestParameters                  parameters              = { testType, bufferSize, 0u, streamId, 0u, 0u, STREAM_ID_0_NORMAL, query64Bits };
 +                                      const std::string               fullTestName    = testName + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]) + widthStr;
 +                                      group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestName.c_str(), "Written primitives query test", parameters));
 +
 +                                      const TestParameters    parametersCopy          = { testTypeCopy, bufferSize, 0u, streamId, 0u, 0u, STREAM_ID_0_NORMAL, query64Bits };
 +                                      const std::string               fullTestNameCopy        = testNameCopy + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]) + widthStr;
 +                                      group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestNameCopy.c_str(), "Written primitives query test", parametersCopy));
 +
 +                                      const TestParameters    parametersHostQueryReset        = { testTypeHostQueryReset, bufferSize, 0u, streamId, 0u, 0u, STREAM_ID_0_NORMAL, query64Bits };
 +                                      const std::string               fullTestNameHostQueryReset      = testNameHostQueryReset + "_" + de::toString(streamId) + "_" + de::toString(vertexCount[vertexCountNdx]) + widthStr;
 +                                      group->addChild(new TransformFeedbackTestCase(group->getTestContext(), fullTestNameHostQueryReset.c_str(), "Written primitives query test", parametersHostQueryReset));
 +
 +                                      if (streamId == 0)
 +                                      {
 +                                              std::string     testNameStream0 = fullTestName;
 +                                              testNameStream0 += "_beginqueryindexed_streamid_0";
 +                                              parameters.streamId0Mode = STREAM_ID_0_BEGIN_QUERY_INDEXED;
 +                                              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), testNameStream0.c_str(), "Written primitives query test", parameters));
 +                                              testNameStream0 = fullTestName;
 +                                              testNameStream0 += "_endqueryindexed_streamid_0";
 +                                              parameters.streamId0Mode = STREAM_ID_0_END_QUERY_INDEXED;
 +                                              group->addChild(new TransformFeedbackTestCase(group->getTestContext(), testNameStream0.c_str(), "Written primitives query test", parameters));
 +                                      }
 +                              }
                        }
                }
        }
  
  void createTransformFeedbackStreamsSimpleTests (tcu::TestCaseGroup* group)
  {
 -      const deUint32          usedStreamId[]  = { 1, 3, 6, 14 };
 -      const TestType          testTypes[]             = { TEST_TYPE_STREAMS, TEST_TYPE_STREAMS_POINTSIZE, TEST_TYPE_STREAMS_CLIPDISTANCE, TEST_TYPE_STREAMS_CULLDISTANCE };
 -      const std::string       testTypeNames[] = { "streams",         "streams_pointsize",         "streams_clipdistance",         "streams_culldistance"         };
 +      const deUint32          usedStreamId[]          = { 1, 3, 6, 14 };
 +      const TestType          testTypes[]                     = { TEST_TYPE_STREAMS, TEST_TYPE_STREAMS_POINTSIZE, TEST_TYPE_STREAMS_CLIPDISTANCE, TEST_TYPE_STREAMS_CULLDISTANCE };
 +      const std::string       testTypeNames[]         = { "streams",         "streams_pointsize",         "streams_clipdistance",         "streams_culldistance"         };
  
        for (deUint32 testTypesNdx = 0; testTypesNdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypesNdx)
        {
  
                for (deUint32 streamCountsNdx = 0; streamCountsNdx < DE_LENGTH_OF_ARRAY(usedStreamId); ++streamCountsNdx)
                {
 -                      const deUint32                  streamId        = usedStreamId[streamCountsNdx];
 -                      const TestParameters    parameters      = { testType, 0u, 0u, streamId, pointSize, 0u };
 +                      const deUint32  streamId        = usedStreamId[streamCountsNdx];
 +                      TestParameters  parameters      = { testType, 0u, 0u, streamId, pointSize, 0u, STREAM_ID_0_NORMAL, false };
  
                        group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(streamId)).c_str(), "Streams usage test", parameters));
                }
                        const deUint32                  streamId                        = usedStreamId[bufferCountsNdx];
                        const deUint32                  streamsUsed                     = 2u;
                        const deUint32                  maxBytesPerVertex       = 256u;
 -                      const TestParameters    parameters                      = { testType, maxBytesPerVertex * streamsUsed, streamsUsed, streamId, 0u, 0u };
 +                      const TestParameters    parameters                      = { testType, maxBytesPerVertex * streamsUsed, streamsUsed, streamId, 0u, 0u, STREAM_ID_0_NORMAL, false };
  
                        group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(streamId)).c_str(), "Simultaneous multiple streams usage test", parameters));
                }