Merge "Merge "Try to determine renderable format in lifetime tests am: c0a5dc217f...
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / pipeline / vktPipelineTimestampTests.cpp
1 /*------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2015 The Khronos Group Inc.
6  * Copyright (c) 2015 ARM Ltd.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *//*!
21  * \file
22  * \brief Timestamp Tests
23  *//*--------------------------------------------------------------------*/
24
25 #include "vktPipelineTimestampTests.hpp"
26 #include "vktPipelineClearUtil.hpp"
27 #include "vktPipelineImageUtil.hpp"
28 #include "vktPipelineVertexUtil.hpp"
29 #include "vktPipelineReferenceRenderer.hpp"
30 #include "vktTestCase.hpp"
31 #include "vktTestCaseUtil.hpp"
32 #include "vkImageUtil.hpp"
33 #include "vkMemUtil.hpp"
34 #include "vkPrograms.hpp"
35 #include "vkBuilderUtil.hpp"
36 #include "vkQueryUtil.hpp"
37 #include "vkRef.hpp"
38 #include "vkRefUtil.hpp"
39 #include "tcuImageCompare.hpp"
40 #include "deUniquePtr.hpp"
41 #include "deStringUtil.hpp"
42 #include "deMemory.h"
43 #include "vkTypeUtil.hpp"
44
45 #include <sstream>
46 #include <vector>
47 #include <cctype>
48 #include <locale>
49
50 namespace vkt
51 {
52 namespace pipeline
53 {
54
55 using namespace vk;
56
57 namespace
58 {
59 typedef std::vector<VkPipelineStageFlagBits> StageFlagVector;
60
61 // helper functions
62 #define GEN_DESC_STRING(name,postfix)                                      \
63                 do {                                                               \
64                    for (std::string::size_type ndx = 0; ndx<strlen(#name); ++ndx)  \
65                          if(isDescription && #name[ndx] == '_')                        \
66                            desc << " ";                                                \
67                          else                                                          \
68                            desc << std::tolower(#name[ndx],loc);                       \
69                    if (isDescription)                                              \
70                          desc << " " << #postfix;                                      \
71                    else                                                            \
72                          desc << "_" << #postfix;                                      \
73                 } while (deGetFalse())
74
75 std::string getPipelineStageFlagStr (const VkPipelineStageFlagBits stage,
76                                                                          bool                          isDescription)
77 {
78         std::ostringstream desc;
79         std::locale loc;
80         switch(stage)
81         {
82 #define STAGE_CASE(p)                              \
83                 case VK_PIPELINE_STAGE_##p##_BIT:          \
84                 {                                          \
85                         GEN_DESC_STRING(p, stage);             \
86                         break;                                 \
87                 }
88                 STAGE_CASE(TOP_OF_PIPE);
89                 STAGE_CASE(DRAW_INDIRECT);
90                 STAGE_CASE(VERTEX_INPUT);
91                 STAGE_CASE(VERTEX_SHADER);
92                 STAGE_CASE(TESSELLATION_CONTROL_SHADER);
93                 STAGE_CASE(TESSELLATION_EVALUATION_SHADER);
94                 STAGE_CASE(GEOMETRY_SHADER);
95                 STAGE_CASE(FRAGMENT_SHADER);
96                 STAGE_CASE(EARLY_FRAGMENT_TESTS);
97                 STAGE_CASE(LATE_FRAGMENT_TESTS);
98                 STAGE_CASE(COLOR_ATTACHMENT_OUTPUT);
99                 STAGE_CASE(COMPUTE_SHADER);
100                 STAGE_CASE(TRANSFER);
101                 STAGE_CASE(HOST);
102                 STAGE_CASE(ALL_GRAPHICS);
103                 STAGE_CASE(ALL_COMMANDS);
104 #undef STAGE_CASE
105           default:
106                 desc << "unknown stage!";
107                 DE_FATAL("Unknown Stage!");
108                 break;
109         };
110
111         return desc.str();
112 }
113
114 enum TransferMethod
115 {
116         TRANSFER_METHOD_COPY_BUFFER = 0,
117         TRANSFER_METHOD_COPY_IMAGE,
118         TRANSFER_METHOD_BLIT_IMAGE,
119         TRANSFER_METHOD_COPY_BUFFER_TO_IMAGE,
120         TRANSFER_METHOD_COPY_IMAGE_TO_BUFFER,
121         TRANSFER_METHOD_UPDATE_BUFFER,
122         TRANSFER_METHOD_FILL_BUFFER,
123         TRANSFER_METHOD_CLEAR_COLOR_IMAGE,
124         TRANSFER_METHOD_CLEAR_DEPTH_STENCIL_IMAGE,
125         TRANSFER_METHOD_RESOLVE_IMAGE,
126         TRANSFER_METHOD_COPY_QUERY_POOL_RESULTS,
127         TRANSFER_METHOD_LAST
128 };
129
130 std::string getTransferMethodStr(const TransferMethod method,
131                                                                  bool                 isDescription)
132 {
133         std::ostringstream desc;
134         std::locale loc;
135         switch(method)
136         {
137 #define METHOD_CASE(p)                             \
138                 case TRANSFER_METHOD_##p:                  \
139                 {                                          \
140                         GEN_DESC_STRING(p, method);            \
141                         break;                                 \
142                 }
143           METHOD_CASE(COPY_BUFFER)
144           METHOD_CASE(COPY_IMAGE)
145           METHOD_CASE(BLIT_IMAGE)
146           METHOD_CASE(COPY_BUFFER_TO_IMAGE)
147           METHOD_CASE(COPY_IMAGE_TO_BUFFER)
148           METHOD_CASE(UPDATE_BUFFER)
149           METHOD_CASE(FILL_BUFFER)
150           METHOD_CASE(CLEAR_COLOR_IMAGE)
151           METHOD_CASE(CLEAR_DEPTH_STENCIL_IMAGE)
152           METHOD_CASE(RESOLVE_IMAGE)
153           METHOD_CASE(COPY_QUERY_POOL_RESULTS)
154 #undef METHOD_CASE
155           default:
156                 desc << "unknown method!";
157                 DE_FATAL("Unknown method!");
158                 break;
159         };
160
161         return desc.str();
162 }
163
164 // helper classes
165 class TimestampTestParam
166 {
167 public:
168                                                           TimestampTestParam      (const VkPipelineStageFlagBits* stages,
169                                                                                                            const deUint32                 stageCount,
170                                                                                                            const bool                     inRenderPass);
171                                                           ~TimestampTestParam     (void);
172         virtual const std::string generateTestName        (void) const;
173         virtual const std::string generateTestDescription (void) const;
174         StageFlagVector           getStageVector          (void) const { return m_stageVec; }
175         bool                      getInRenderPass         (void) const { return m_inRenderPass; }
176         void                      toggleInRenderPass      (void)       { m_inRenderPass = !m_inRenderPass; }
177 protected:
178         StageFlagVector           m_stageVec;
179         bool                      m_inRenderPass;
180 };
181
182 TimestampTestParam::TimestampTestParam(const VkPipelineStageFlagBits* stages,
183                                                                            const deUint32                 stageCount,
184                                                                            const bool                     inRenderPass)
185         : m_inRenderPass(inRenderPass)
186 {
187         for (deUint32 ndx = 0; ndx < stageCount; ndx++)
188         {
189                 m_stageVec.push_back(stages[ndx]);
190         }
191 }
192
193 TimestampTestParam::~TimestampTestParam(void)
194 {
195 }
196
197 const std::string TimestampTestParam::generateTestName(void) const
198 {
199         std::string result("");
200
201         for (StageFlagVector::const_iterator it = m_stageVec.begin(); it != m_stageVec.end(); it++)
202         {
203                 if(*it != VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
204                 {
205                         result += getPipelineStageFlagStr(*it, false) + '_';
206                 }
207         }
208         if(m_inRenderPass)
209                 result += "in_render_pass";
210         else
211                 result += "out_of_render_pass";
212
213         return result;
214 }
215
216 const std::string TimestampTestParam::generateTestDescription(void) const
217 {
218         std::string result("Record timestamp after ");
219
220         for (StageFlagVector::const_iterator it = m_stageVec.begin(); it != m_stageVec.end(); it++)
221         {
222                 if(*it != VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
223                 {
224                         result += getPipelineStageFlagStr(*it, true) + ' ';
225                 }
226         }
227         if(m_inRenderPass)
228                 result += " in the renderpass";
229         else
230                 result += " out of the render pass";
231
232         return result;
233 }
234
235 class TransferTimestampTestParam : public TimestampTestParam
236 {
237 public:
238                                           TransferTimestampTestParam  (const VkPipelineStageFlagBits* stages,
239                                                                                                    const deUint32                 stageCount,
240                                                                                                    const bool                     inRenderPass,
241                                                                                                    const deUint32                 methodNdx);
242                                           ~TransferTimestampTestParam (void)       { }
243         const std::string generateTestName            (void) const;
244         const std::string generateTestDescription     (void) const;
245         TransferMethod    getMethod                   (void) const { return m_method; }
246 protected:
247         TransferMethod    m_method;
248 };
249
250 TransferTimestampTestParam::TransferTimestampTestParam(const VkPipelineStageFlagBits* stages,
251                                                                                                            const deUint32                 stageCount,
252                                                                                                            const bool                     inRenderPass,
253                                                                                                            const deUint32                 methodNdx)
254         : TimestampTestParam(stages, stageCount, inRenderPass)
255 {
256         DE_ASSERT(methodNdx < (deUint32)TRANSFER_METHOD_LAST);
257
258         m_method = (TransferMethod)methodNdx;
259 }
260
261 const std::string TransferTimestampTestParam::generateTestName(void) const
262 {
263         std::string result("");
264
265         for (StageFlagVector::const_iterator it = m_stageVec.begin(); it != m_stageVec.end(); it++)
266         {
267                 if(*it != VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
268                 {
269                         result += getPipelineStageFlagStr(*it, false) + '_';
270                 }
271         }
272
273         result += "with_" + getTransferMethodStr(m_method, false);
274
275         return result;
276
277 }
278
279 const std::string TransferTimestampTestParam::generateTestDescription(void) const
280 {
281         std::string result("");
282
283         for (StageFlagVector::const_iterator it = m_stageVec.begin(); it != m_stageVec.end(); it++)
284         {
285                 if(*it != VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
286                 {
287                         result += getPipelineStageFlagStr(*it, true) + ' ';
288                 }
289         }
290
291         result += "with " + getTransferMethodStr(m_method, true);
292
293         return result;
294
295 }
296
297 class SimpleGraphicsPipelineBuilder
298 {
299 public:
300                                          SimpleGraphicsPipelineBuilder  (Context&              context);
301                                          ~SimpleGraphicsPipelineBuilder (void) { }
302         void             bindShaderStage                (VkShaderStageFlagBits stage,
303                                                                                                          const char*           source_name,
304                                                                                                          const char*           entry_name);
305         void             enableTessellationStage        (deUint32              patchControlPoints);
306         Move<VkPipeline> buildPipeline                  (tcu::UVec2            renderSize,
307                                                                                                          VkRenderPass          renderPass);
308 protected:
309         enum
310         {
311                 VK_MAX_SHADER_STAGES = 6,
312         };
313
314         Context&                            m_context;
315
316         Move<VkShaderModule>                m_shaderModules[VK_MAX_SHADER_STAGES];
317         deUint32                            m_shaderStageCount;
318         VkPipelineShaderStageCreateInfo     m_shaderStageInfo[VK_MAX_SHADER_STAGES];
319
320         deUint32                            m_patchControlPoints;
321
322         Move<VkPipelineLayout>              m_pipelineLayout;
323         Move<VkPipeline>                    m_graphicsPipelines;
324
325 };
326
327 SimpleGraphicsPipelineBuilder::SimpleGraphicsPipelineBuilder(Context& context)
328         : m_context(context)
329 {
330         m_patchControlPoints = 0;
331         m_shaderStageCount   = 0;
332 }
333
334 void SimpleGraphicsPipelineBuilder::bindShaderStage(VkShaderStageFlagBits stage,
335                                                                                                         const char*           source_name,
336                                                                                                         const char*           entry_name)
337 {
338         const DeviceInterface&  vk        = m_context.getDeviceInterface();
339         const VkDevice          vkDevice  = m_context.getDevice();
340
341         // Create shader module
342         deUint32*               pCode     = (deUint32*)m_context.getBinaryCollection().get(source_name).getBinary();
343         deUint32                codeSize  = (deUint32)m_context.getBinaryCollection().get(source_name).getSize();
344
345         const VkShaderModuleCreateInfo moduleCreateInfo =
346         {
347                 VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,                // VkStructureType             sType;
348                 DE_NULL,                                                    // const void*                 pNext;
349                 0u,                                                         // VkShaderModuleCreateFlags   flags;
350                 codeSize,                                                   // deUintptr                   codeSize;
351                 pCode,                                                      // const deUint32*             pCode;
352         };
353
354         m_shaderModules[m_shaderStageCount] = createShaderModule(vk, vkDevice, &moduleCreateInfo);
355
356         // Prepare shader stage info
357         m_shaderStageInfo[m_shaderStageCount].sType               = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
358         m_shaderStageInfo[m_shaderStageCount].pNext               = DE_NULL;
359         m_shaderStageInfo[m_shaderStageCount].flags               = 0u;
360         m_shaderStageInfo[m_shaderStageCount].stage               = stage;
361         m_shaderStageInfo[m_shaderStageCount].module              = *m_shaderModules[m_shaderStageCount];
362         m_shaderStageInfo[m_shaderStageCount].pName               = entry_name;
363         m_shaderStageInfo[m_shaderStageCount].pSpecializationInfo = DE_NULL;
364
365         m_shaderStageCount++;
366 }
367
368 Move<VkPipeline> SimpleGraphicsPipelineBuilder::buildPipeline(tcu::UVec2 renderSize, VkRenderPass renderPass)
369 {
370         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
371         const VkDevice              vkDevice            = m_context.getDevice();
372
373         // Create pipeline layout
374         {
375                 const VkPipelineLayoutCreateInfo pipelineLayoutParams =
376                 {
377                         VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,      // VkStructureType                  sType;
378                         DE_NULL,                                            // const void*                      pNext;
379                         0u,                                                 // VkPipelineLayoutCreateFlags      flags;
380                         0u,                                                 // deUint32                         setLayoutCount;
381                         DE_NULL,                                            // const VkDescriptorSetLayout*     pSetLayouts;
382                         0u,                                                 // deUint32                         pushConstantRangeCount;
383                         DE_NULL                                             // const VkPushConstantRange*       pPushConstantRanges;
384                 };
385
386                 m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
387         }
388
389         // Create pipeline
390         const VkVertexInputBindingDescription vertexInputBindingDescription =
391         {
392                 0u,                                 // deUint32                 binding;
393                 sizeof(Vertex4RGBA),                // deUint32                 strideInBytes;
394                 VK_VERTEX_INPUT_RATE_VERTEX,        // VkVertexInputRate        inputRate;
395         };
396
397         const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
398         {
399                 {
400                         0u,                                 // deUint32 location;
401                         0u,                                 // deUint32 binding;
402                         VK_FORMAT_R32G32B32A32_SFLOAT,      // VkFormat format;
403                         0u                                  // deUint32 offsetInBytes;
404                 },
405                 {
406                         1u,                                 // deUint32 location;
407                         0u,                                 // deUint32 binding;
408                         VK_FORMAT_R32G32B32A32_SFLOAT,      // VkFormat format;
409                         DE_OFFSET_OF(Vertex4RGBA, color),   // deUint32 offsetInBytes;
410                 }
411         };
412
413         const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
414         {
415                 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,      // VkStructureType                          sType;
416                 DE_NULL,                                                        // const void*                              pNext;
417                 0u,                                                             // VkPipelineVertexInputStateCreateFlags    flags;
418                 1u,                                                             // deUint32                                 vertexBindingDescriptionCount;
419                 &vertexInputBindingDescription,                                 // const VkVertexInputBindingDescription*   pVertexBindingDescriptions;
420                 2u,                                                             // deUint32                                 vertexAttributeDescriptionCount;
421                 vertexInputAttributeDescriptions,                               // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
422         };
423
424         VkPrimitiveTopology primitiveTopology = (m_patchControlPoints > 0) ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
425         const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
426         {
427                 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,    // VkStructureType                          sType;
428                 DE_NULL,                                                        // const void*                              pNext;
429                 0u,                                                             // VkPipelineInputAssemblyStateCreateFlags  flags;
430                 primitiveTopology,                                              // VkPrimitiveTopology                      topology;
431                 VK_FALSE,                                                       // VkBool32                                 primitiveRestartEnable;
432         };
433
434         const VkViewport viewport =
435         {
436                 0.0f,                       // float    originX;
437                 0.0f,                       // float    originY;
438                 (float)renderSize.x(),      // float    width;
439                 (float)renderSize.y(),      // float    height;
440                 0.0f,                       // float    minDepth;
441                 1.0f                        // float    maxDepth;
442         };
443         const VkRect2D scissor =
444         {
445                 { 0u, 0u },                                                     // VkOffset2D  offset;
446                 { renderSize.x(), renderSize.y() }                              // VkExtent2D  extent;
447         };
448         const VkPipelineViewportStateCreateInfo viewportStateParams =
449         {
450                 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,          // VkStructureType                      sType;
451                 DE_NULL,                                                        // const void*                          pNext;
452                 0u,                                                             // VkPipelineViewportStateCreateFlags   flags;
453                 1u,                                                             // deUint32                             viewportCount;
454                 &viewport,                                                      // const VkViewport*                    pViewports;
455                 1u,                                                             // deUint32                             scissorCount;
456                 &scissor                                                        // const VkRect2D*                      pScissors;
457         };
458
459         const VkPipelineRasterizationStateCreateInfo rasterStateParams =
460         {
461                 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,     // VkStructureType                          sType;
462                 DE_NULL,                                                        // const void*                              pNext;
463                 0u,                                                             // VkPipelineRasterizationStateCreateFlags  flags;
464                 VK_FALSE,                                                       // VkBool32                                 depthClampEnable;
465                 VK_FALSE,                                                       // VkBool32                                 rasterizerDiscardEnable;
466                 VK_POLYGON_MODE_FILL,                                           // VkPolygonMode                            polygonMode;
467                 VK_CULL_MODE_NONE,                                              // VkCullModeFlags                          cullMode;
468                 VK_FRONT_FACE_COUNTER_CLOCKWISE,                                // VkFrontFace                              frontFace;
469                 VK_FALSE,                                                       // VkBool32                                 depthBiasEnable;
470                 0.0f,                                                           // float                                    depthBiasConstantFactor;
471                 0.0f,                                                           // float                                    depthBiasClamp;
472                 0.0f,                                                           // float                                    depthBiasSlopeFactor;
473                 1.0f,                                                           // float                                    lineWidth;
474         };
475
476         const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
477         {
478                 VK_FALSE,                                                                   // VkBool32                 blendEnable;
479                 VK_BLEND_FACTOR_ONE,                                                        // VkBlendFactor            srcColorBlendFactor;
480                 VK_BLEND_FACTOR_ZERO,                                                       // VkBlendFactor            dstColorBlendFactor;
481                 VK_BLEND_OP_ADD,                                                            // VkBlendOp                colorBlendOp;
482                 VK_BLEND_FACTOR_ONE,                                                        // VkBlendFactor            srcAlphaBlendFactor;
483                 VK_BLEND_FACTOR_ZERO,                                                       // VkBlendFactor            dstAlphaBlendFactor;
484                 VK_BLEND_OP_ADD,                                                            // VkBlendOp                alphaBlendOp;
485                 VK_COLOR_COMPONENT_R_BIT |
486                 VK_COLOR_COMPONENT_G_BIT |
487                 VK_COLOR_COMPONENT_B_BIT |
488                 VK_COLOR_COMPONENT_A_BIT                                                    // VkColorComponentFlags    colorWriteMask;
489         };
490
491         const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
492         {
493                 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,   // VkStructureType                              sType;
494                 DE_NULL,                                                    // const void*                                  pNext;
495                 0u,                                                         // VkPipelineColorBlendStateCreateFlags         flags;
496                 VK_FALSE,                                                   // VkBool32                                     logicOpEnable;
497                 VK_LOGIC_OP_COPY,                                           // VkLogicOp                                    logicOp;
498                 1u,                                                         // deUint32                                     attachmentCount;
499                 &colorBlendAttachmentState,                                 // const VkPipelineColorBlendAttachmentState*   pAttachments;
500                 { 0.0f, 0.0f, 0.0f, 0.0f },                                 // float                                        blendConst[4];
501         };
502
503         const VkPipelineMultisampleStateCreateInfo  multisampleStateParams  =
504         {
505                 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,   // VkStructureType                          sType;
506                 DE_NULL,                                                    // const void*                              pNext;
507                 0u,                                                         // VkPipelineMultisampleStateCreateFlags    flags;
508                 VK_SAMPLE_COUNT_1_BIT,                                      // VkSampleCountFlagBits                    rasterizationSamples;
509                 VK_FALSE,                                                   // VkBool32                                 sampleShadingEnable;
510                 0.0f,                                                       // float                                    minSampleShading;
511                 DE_NULL,                                                    // const VkSampleMask*                      pSampleMask;
512                 VK_FALSE,                                                   // VkBool32                                 alphaToCoverageEnable;
513                 VK_FALSE,                                                   // VkBool32                                 alphaToOneEnable;
514         };
515
516         VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
517         {
518                 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType                          sType;
519                 DE_NULL,                                                    // const void*                              pNext;
520                 0u,                                                         // VkPipelineDepthStencilStateCreateFlags   flags;
521                 VK_TRUE,                                                    // VkBool32                                 depthTestEnable;
522                 VK_TRUE,                                                    // VkBool32                                 depthWriteEnable;
523                 VK_COMPARE_OP_LESS_OR_EQUAL,                                // VkCompareOp                              depthCompareOp;
524                 VK_FALSE,                                                   // VkBool32                                 depthBoundsTestEnable;
525                 VK_FALSE,                                                   // VkBool32                                 stencilTestEnable;
526                 // VkStencilOpState front;
527                 {
528                         VK_STENCIL_OP_KEEP,     // VkStencilOp  failOp;
529                         VK_STENCIL_OP_KEEP,     // VkStencilOp  passOp;
530                         VK_STENCIL_OP_KEEP,     // VkStencilOp  depthFailOp;
531                         VK_COMPARE_OP_NEVER,    // VkCompareOp  compareOp;
532                         0u,                     // deUint32     compareMask;
533                         0u,                     // deUint32     writeMask;
534                         0u,                     // deUint32     reference;
535                 },
536                 // VkStencilOpState back;
537                 {
538                         VK_STENCIL_OP_KEEP,     // VkStencilOp  failOp;
539                         VK_STENCIL_OP_KEEP,     // VkStencilOp  passOp;
540                         VK_STENCIL_OP_KEEP,     // VkStencilOp  depthFailOp;
541                         VK_COMPARE_OP_NEVER,    // VkCompareOp  compareOp;
542                         0u,                     // deUint32     compareMask;
543                         0u,                     // deUint32     writeMask;
544                         0u,                     // deUint32     reference;
545                 },
546                 0.0f,                                                      // float                                    minDepthBounds;
547                 1.0f,                                                      // float                                    maxDepthBounds;
548         };
549
550         const VkPipelineTessellationStateCreateInfo*    pTessCreateInfo         = DE_NULL;
551         const VkPipelineTessellationStateCreateInfo             tessStateCreateInfo     =
552         {
553                         VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,  // VkStructureType                          sType;
554                         DE_NULL,                                                    // const void*                              pNext;
555                         0u,                                                         // VkPipelineTessellationStateCreateFlags   flags;
556                         m_patchControlPoints,                                       // deUint32                                 patchControlPoints;
557         };
558
559         if (m_patchControlPoints > 0)
560                 pTessCreateInfo = &tessStateCreateInfo;
561
562         const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
563         {
564                 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,    // VkStructureType                                  sType;
565                 DE_NULL,                                            // const void*                                      pNext;
566                 0u,                                                 // VkPipelineCreateFlags                            flags;
567                 m_shaderStageCount,                                 // deUint32                                         stageCount;
568                 m_shaderStageInfo,                                  // const VkPipelineShaderStageCreateInfo*           pStages;
569                 &vertexInputStateParams,                            // const VkPipelineVertexInputStateCreateInfo*      pVertexInputState;
570                 &inputAssemblyStateParams,                          // const VkPipelineInputAssemblyStateCreateInfo*    pInputAssemblyState;
571                 pTessCreateInfo,                                    // const VkPipelineTessellationStateCreateInfo*     pTessellationState;
572                 &viewportStateParams,                               // const VkPipelineViewportStateCreateInfo*         pViewportState;
573                 &rasterStateParams,                                 // const VkPipelineRasterizationStateCreateInfo*    pRasterState;
574                 &multisampleStateParams,                            // const VkPipelineMultisampleStateCreateInfo*      pMultisampleState;
575                 &depthStencilStateParams,                           // const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState;
576                 &colorBlendStateParams,                             // const VkPipelineColorBlendStateCreateInfo*       pColorBlendState;
577                 (const VkPipelineDynamicStateCreateInfo*)DE_NULL,   // const VkPipelineDynamicStateCreateInfo*          pDynamicState;
578                 *m_pipelineLayout,                                  // VkPipelineLayout                                 layout;
579                 renderPass,                                         // VkRenderPass                                     renderPass;
580                 0u,                                                 // deUint32                                         subpass;
581                 0u,                                                 // VkPipeline                                       basePipelineHandle;
582                 0,                                                  // deInt32                                          basePipelineIndex;
583         };
584
585         return createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
586 }
587
588 void SimpleGraphicsPipelineBuilder::enableTessellationStage(deUint32 patchControlPoints)
589 {
590         m_patchControlPoints = patchControlPoints;
591 }
592
593 template <class Test>
594 vkt::TestCase* newTestCase(tcu::TestContext&     testContext,
595                                                    TimestampTestParam*   testParam)
596 {
597         return new Test(testContext,
598                                         testParam->generateTestName().c_str(),
599                                         testParam->generateTestDescription().c_str(),
600                                         testParam);
601 }
602
603 // Test Classes
604 class TimestampTest : public vkt::TestCase
605 {
606 public:
607         enum
608         {
609                 ENTRY_COUNT = 8
610         };
611
612                                                   TimestampTest(tcu::TestContext&         testContext,
613                                                                                 const std::string&        name,
614                                                                                 const std::string&        description,
615                                                                                 const TimestampTestParam* param)
616                                                           : vkt::TestCase  (testContext, name, description)
617                                                           , m_stages       (param->getStageVector())
618                                                           , m_inRenderPass (param->getInRenderPass())
619                                                           { }
620         virtual               ~TimestampTest (void) { }
621         virtual void          initPrograms   (SourceCollections&      programCollection) const;
622         virtual TestInstance* createInstance (Context&                context) const;
623 protected:
624         const StageFlagVector m_stages;
625         const bool            m_inRenderPass;
626 };
627
628 class TimestampTestInstance : public vkt::TestInstance
629 {
630 public:
631                                                         TimestampTestInstance      (Context&                 context,
632                                                                                                                 const StageFlagVector&   stages,
633                                                                                                                 const bool               inRenderPass);
634         virtual                 ~TimestampTestInstance     (void);
635         virtual tcu::TestStatus iterate                    (void);
636 protected:
637         virtual tcu::TestStatus verifyTimestamp            (void);
638         virtual void            configCommandBuffer        (void);
639         Move<VkBuffer>          createBufferAndBindMemory  (VkDeviceSize             size,
640                                                                                                                 VkBufferUsageFlags       usage,
641                                                                                                                 de::MovePtr<Allocation>* pAlloc);
642         Move<VkImage>           createImage2DAndBindMemory (VkFormat                 format,
643                                                                                                                 deUint32                 width,
644                                                                                                                 deUint32                 height,
645                                                                                                                 VkImageUsageFlags        usage,
646                                                                                                                 VkSampleCountFlagBits    sampleCount,
647                                                                                                                 de::MovePtr<Allocation>* pAlloc);
648 protected:
649         const StageFlagVector   m_stages;
650         bool                    m_inRenderPass;
651
652         Move<VkCommandPool>     m_cmdPool;
653         Move<VkCommandBuffer>   m_cmdBuffer;
654         Move<VkFence>           m_fence;
655         Move<VkQueryPool>       m_queryPool;
656         deUint64*               m_timestampValues;
657 };
658
659 void TimestampTest::initPrograms(SourceCollections& programCollection) const
660 {
661         vkt::TestCase::initPrograms(programCollection);
662 }
663
664 TestInstance* TimestampTest::createInstance(Context& context) const
665 {
666         return new TimestampTestInstance(context,m_stages,m_inRenderPass);
667 }
668
669 TimestampTestInstance::TimestampTestInstance(Context&                context,
670                                                                                          const StageFlagVector&  stages,
671                                                                                          const bool              inRenderPass)
672         : TestInstance  (context)
673         , m_stages      (stages)
674         , m_inRenderPass(inRenderPass)
675 {
676         const DeviceInterface&      vk                  = context.getDeviceInterface();
677         const VkDevice              vkDevice            = context.getDevice();
678         const deUint32              queueFamilyIndex    = context.getUniversalQueueFamilyIndex();
679
680         // Check support for timestamp queries
681         {
682                 const std::vector<VkQueueFamilyProperties>   queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
683
684                 DE_ASSERT(queueFamilyIndex < (deUint32)queueProperties.size());
685
686                 if (!queueProperties[queueFamilyIndex].timestampValidBits)
687                         throw tcu::NotSupportedError("Universal queue does not support timestamps");
688         }
689
690         // Create Query Pool
691         {
692                 const VkQueryPoolCreateInfo queryPoolParams =
693                 {
694                    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,    // VkStructureType               sType;
695                    DE_NULL,                                     // const void*                   pNext;
696                    0u,                                          // VkQueryPoolCreateFlags        flags;
697                    VK_QUERY_TYPE_TIMESTAMP,                     // VkQueryType                   queryType;
698                    TimestampTest::ENTRY_COUNT,                  // deUint32                      entryCount;
699                    0u,                                          // VkQueryPipelineStatisticFlags pipelineStatistics;
700                 };
701
702                 m_queryPool = createQueryPool(vk, vkDevice, &queryPoolParams);
703         }
704
705         // Create command pool
706         m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
707
708         // Create command buffer
709         m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
710
711         // Create fence
712         {
713                 const VkFenceCreateInfo fenceParams =
714                 {
715                         VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,        // VkStructureType      sType;
716                         DE_NULL,                                    // const void*          pNext;
717                         0u,                                         // VkFenceCreateFlags   flags;
718                 };
719
720                 m_fence = createFence(vk, vkDevice, &fenceParams);
721         }
722
723         // alloc timestamp values
724         m_timestampValues = new deUint64[m_stages.size()];
725 }
726
727 TimestampTestInstance::~TimestampTestInstance(void)
728 {
729         if(m_timestampValues)
730         {
731                 delete[] m_timestampValues;
732                 m_timestampValues = NULL;
733         }
734 }
735
736 void TimestampTestInstance::configCommandBuffer(void)
737 {
738         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
739
740         const VkCommandBufferBeginInfo cmdBufferBeginInfo =
741         {
742                 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType                  sType;
743                 DE_NULL,                                        // const void*                      pNext;
744                 0u,                                             // VkCommandBufferUsageFlags        flags;
745                 (const VkCommandBufferInheritanceInfo*)DE_NULL,
746         };
747
748         VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
749
750         vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
751
752         deUint32 timestampEntry = 0;
753         for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
754         {
755                 vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
756         }
757
758         VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
759 }
760
761 tcu::TestStatus TimestampTestInstance::iterate(void)
762 {
763         const DeviceInterface&      vk          = m_context.getDeviceInterface();
764         const VkDevice              vkDevice    = m_context.getDevice();
765         const VkQueue               queue       = m_context.getUniversalQueue();
766
767         configCommandBuffer();
768
769         VK_CHECK(vk.resetFences(vkDevice, 1u, &m_fence.get()));
770
771         const VkSubmitInfo          submitInfo =
772         {
773                 VK_STRUCTURE_TYPE_SUBMIT_INFO,                      // VkStructureType         sType;
774                 DE_NULL,                                            // const void*             pNext;
775                 0u,                                                 // deUint32                waitSemaphoreCount;
776                 DE_NULL,                                            // const VkSemaphore*      pWaitSemaphores;
777                 (const VkPipelineStageFlags*)DE_NULL,
778                 1u,                                                 // deUint32                commandBufferCount;
779                 &m_cmdBuffer.get(),                                 // const VkCommandBuffer*  pCommandBuffers;
780                 0u,                                                 // deUint32                signalSemaphoreCount;
781                 DE_NULL,                                            // const VkSemaphore*      pSignalSemaphores;
782         };
783         VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *m_fence));
784
785         VK_CHECK(vk.waitForFences(vkDevice, 1u, &m_fence.get(), true, ~(0ull) /* infinity*/));
786
787         // Generate the timestamp mask
788         deUint64                    timestampMask;
789         const std::vector<VkQueueFamilyProperties>   queueProperties = vk::getPhysicalDeviceQueueFamilyProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
790         if(queueProperties[0].timestampValidBits == 0)
791         {
792                 return tcu::TestStatus::fail("Device does not support timestamp!");
793         }
794         else if(queueProperties[0].timestampValidBits == 64)
795         {
796                 timestampMask = 0xFFFFFFFFFFFFFFFF;
797         }
798         else
799         {
800                 timestampMask = ((deUint64)1 << queueProperties[0].timestampValidBits) - 1;
801         }
802
803         // Get timestamp value from query pool
804         deUint32                    stageSize = (deUint32)m_stages.size();
805
806         vk.getQueryPoolResults(vkDevice, *m_queryPool, 0u, stageSize, sizeof(deUint64) * stageSize, (void*)m_timestampValues, sizeof(deUint64), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
807
808         for (deUint32 ndx = 0; ndx < stageSize; ndx++)
809         {
810                 m_timestampValues[ndx] &= timestampMask;
811         }
812
813         return verifyTimestamp();
814 }
815
816 tcu::TestStatus TimestampTestInstance::verifyTimestamp(void)
817 {
818         for (deUint32 first = 0; first < m_stages.size(); first++)
819         {
820                 for (deUint32 second = 0; second < first; second++)
821                 {
822                         if(m_timestampValues[first] < m_timestampValues[second])
823                         {
824                                 return tcu::TestStatus::fail("Latter stage timestamp is smaller than the former stage timestamp.");
825                         }
826                 }
827         }
828
829         return tcu::TestStatus::pass("Timestamp increases steadily.");
830 }
831
832 Move<VkBuffer> TimestampTestInstance::createBufferAndBindMemory(VkDeviceSize size, VkBufferUsageFlags usage, de::MovePtr<Allocation>* pAlloc)
833 {
834         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
835         const VkDevice              vkDevice            = m_context.getDevice();
836         const deUint32              queueFamilyIndex    = m_context.getUniversalQueueFamilyIndex();
837         SimpleAllocator             memAlloc            (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
838
839         const VkBufferCreateInfo vertexBufferParams =
840         {
841                 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,       // VkStructureType      sType;
842                 DE_NULL,                                    // const void*          pNext;
843                 0u,                                         // VkBufferCreateFlags  flags;
844                 size,                                       // VkDeviceSize         size;
845                 usage,                                      // VkBufferUsageFlags   usage;
846                 VK_SHARING_MODE_EXCLUSIVE,                  // VkSharingMode        sharingMode;
847                 1u,                                         // deUint32             queueFamilyCount;
848                 &queueFamilyIndex                           // const deUint32*      pQueueFamilyIndices;
849         };
850
851         Move<VkBuffer> vertexBuffer = createBuffer(vk, vkDevice, &vertexBufferParams);
852         de::MovePtr<Allocation> vertexBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible);
853
854         VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferAlloc->getMemory(), vertexBufferAlloc->getOffset()));
855
856         DE_ASSERT(pAlloc);
857         *pAlloc = vertexBufferAlloc;
858
859         return vertexBuffer;
860 }
861
862 Move<VkImage> TimestampTestInstance::createImage2DAndBindMemory(VkFormat                          format,
863                                                                                                                                 deUint32                          width,
864                                                                                                                                 deUint32                          height,
865                                                                                                                                 VkImageUsageFlags                 usage,
866                                                                                                                                 VkSampleCountFlagBits             sampleCount,
867                                                                                                                                 de::details::MovePtr<Allocation>* pAlloc)
868 {
869         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
870         const VkDevice              vkDevice            = m_context.getDevice();
871         const deUint32              queueFamilyIndex    = m_context.getUniversalQueueFamilyIndex();
872         SimpleAllocator             memAlloc            (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
873
874         // Optimal tiling feature check
875         VkFormatProperties          formatProperty;
876         m_context.getInstanceInterface().getPhysicalDeviceFormatProperties(m_context.getPhysicalDevice(), format, &formatProperty);
877         if((usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && !(formatProperty.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))
878         {
879                 // Remove color attachment usage if the optimal tiling feature does not support it
880                 usage &= ~VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
881         }
882         if((usage & VK_IMAGE_USAGE_STORAGE_BIT) && !(formatProperty.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT))
883         {
884                 // Remove storage usage if the optimal tiling feature does not support it
885                 usage &= ~VK_IMAGE_USAGE_STORAGE_BIT;
886         }
887
888         const VkImageCreateInfo colorImageParams =
889         {
890                 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                                        // VkStructureType      sType;
891                 DE_NULL,                                                                    // const void*          pNext;
892                 0u,                                                                         // VkImageCreateFlags   flags;
893                 VK_IMAGE_TYPE_2D,                                                           // VkImageType          imageType;
894                 format,                                                                     // VkFormat             format;
895                 { width, height, 1u },                                                      // VkExtent3D           extent;
896                 1u,                                                                         // deUint32             mipLevels;
897                 1u,                                                                         // deUint32             arraySize;
898                 sampleCount,                                                                // deUint32             samples;
899                 VK_IMAGE_TILING_OPTIMAL,                                                    // VkImageTiling        tiling;
900                 usage,                                                                      // VkImageUsageFlags    usage;
901                 VK_SHARING_MODE_EXCLUSIVE,                                                  // VkSharingMode        sharingMode;
902                 1u,                                                                         // deUint32             queueFamilyCount;
903                 &queueFamilyIndex,                                                          // const deUint32*      pQueueFamilyIndices;
904                 VK_IMAGE_LAYOUT_UNDEFINED,                                                  // VkImageLayout        initialLayout;
905         };
906
907         Move<VkImage> image = createImage(vk, vkDevice, &colorImageParams);
908
909         // Allocate and bind image memory
910         de::MovePtr<Allocation> colorImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any);
911         VK_CHECK(vk.bindImageMemory(vkDevice, *image, colorImageAlloc->getMemory(), colorImageAlloc->getOffset()));
912
913         DE_ASSERT(pAlloc);
914         *pAlloc = colorImageAlloc;
915
916         return image;
917 }
918
919 class BasicGraphicsTest : public TimestampTest
920 {
921 public:
922                                                   BasicGraphicsTest(tcu::TestContext&         testContext,
923                                                                                         const std::string&        name,
924                                                                                         const std::string&        description,
925                                                                                         const TimestampTestParam* param)
926                                                           : TimestampTest (testContext, name, description, param)
927                                                           { }
928         virtual               ~BasicGraphicsTest (void) { }
929         virtual void          initPrograms       (SourceCollections&      programCollection) const;
930         virtual TestInstance* createInstance     (Context&                context) const;
931 };
932
933 class BasicGraphicsTestInstance : public TimestampTestInstance
934 {
935 public:
936         enum
937         {
938                 VK_MAX_SHADER_STAGES = 6,
939         };
940                                  BasicGraphicsTestInstance  (Context&              context,
941                                                                                          const StageFlagVector stages,
942                                                                                          const bool            inRenderPass);
943         virtual      ~BasicGraphicsTestInstance (void);
944 protected:
945         virtual void configCommandBuffer        (void);
946         virtual void buildVertexBuffer          (void);
947         virtual void buildRenderPass            (VkFormat colorFormat,
948                                                                                          VkFormat depthFormat);
949         virtual void buildFrameBuffer           (tcu::UVec2 renderSize,
950                                                                                          VkFormat colorFormat,
951                                                                                          VkFormat depthFormat);
952 protected:
953         const tcu::UVec2                    m_renderSize;
954         const VkFormat                      m_colorFormat;
955         const VkFormat                      m_depthFormat;
956
957         Move<VkImage>                       m_colorImage;
958         de::MovePtr<Allocation>             m_colorImageAlloc;
959         Move<VkImage>                       m_depthImage;
960         de::MovePtr<Allocation>             m_depthImageAlloc;
961         Move<VkImageView>                   m_colorAttachmentView;
962         Move<VkImageView>                   m_depthAttachmentView;
963         Move<VkRenderPass>                  m_renderPass;
964         Move<VkFramebuffer>                 m_framebuffer;
965         VkImageMemoryBarrier                            m_imageLayoutBarriers[2];
966
967         de::MovePtr<Allocation>             m_vertexBufferAlloc;
968         Move<VkBuffer>                      m_vertexBuffer;
969         std::vector<Vertex4RGBA>            m_vertices;
970
971         SimpleGraphicsPipelineBuilder       m_pipelineBuilder;
972         Move<VkPipeline>                    m_graphicsPipelines;
973 };
974
975 void BasicGraphicsTest::initPrograms (SourceCollections& programCollection) const
976 {
977         programCollection.glslSources.add("color_vert") << glu::VertexSource(
978                 "#version 310 es\n"
979                 "layout(location = 0) in vec4 position;\n"
980                 "layout(location = 1) in vec4 color;\n"
981                 "layout(location = 0) out highp vec4 vtxColor;\n"
982                 "void main (void)\n"
983                 "{\n"
984                 "  gl_Position = position;\n"
985                 "  vtxColor = color;\n"
986                 "}\n");
987
988         programCollection.glslSources.add("color_frag") << glu::FragmentSource(
989                 "#version 310 es\n"
990                 "layout(location = 0) in highp vec4 vtxColor;\n"
991                 "layout(location = 0) out highp vec4 fragColor;\n"
992                 "void main (void)\n"
993                 "{\n"
994                 "  fragColor = vtxColor;\n"
995                 "}\n");
996 }
997
998 TestInstance* BasicGraphicsTest::createInstance(Context& context) const
999 {
1000         return new BasicGraphicsTestInstance(context,m_stages,m_inRenderPass);
1001 }
1002
1003 void BasicGraphicsTestInstance::buildVertexBuffer(void)
1004 {
1005         const DeviceInterface&      vk       = m_context.getDeviceInterface();
1006         const VkDevice              vkDevice = m_context.getDevice();
1007
1008         // Create vertex buffer
1009         {
1010                 m_vertexBuffer = createBufferAndBindMemory(1024u, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, &m_vertexBufferAlloc);
1011
1012                 m_vertices          = createOverlappingQuads();
1013                 // Load vertices into vertex buffer
1014                 deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA));
1015                 flushMappedMemoryRange(vk, vkDevice, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset(), 1024u);
1016         }
1017 }
1018
1019 void BasicGraphicsTestInstance::buildRenderPass(VkFormat colorFormat, VkFormat depthFormat)
1020 {
1021         const DeviceInterface&      vk       = m_context.getDeviceInterface();
1022         const VkDevice              vkDevice = m_context.getDevice();
1023
1024         // Create render pass
1025         {
1026                 const VkAttachmentDescription colorAttachmentDescription =
1027                 {
1028                         0u,                                                 // VkAttachmentDescriptionFlags    flags;
1029                         colorFormat,                                        // VkFormat                        format;
1030                         VK_SAMPLE_COUNT_1_BIT,                              // VkSampleCountFlagBits           samples;
1031                         VK_ATTACHMENT_LOAD_OP_CLEAR,                        // VkAttachmentLoadOp              loadOp;
1032                         VK_ATTACHMENT_STORE_OP_STORE,                       // VkAttachmentStoreOp             storeOp;
1033                         VK_ATTACHMENT_LOAD_OP_DONT_CARE,                    // VkAttachmentLoadOp              stencilLoadOp;
1034                         VK_ATTACHMENT_STORE_OP_DONT_CARE,                   // VkAttachmentStoreOp             stencilStoreOp;
1035                         VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,           // VkImageLayout                   initialLayout;
1036                         VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,           // VkImageLayout                   finalLayout;
1037                 };
1038
1039                 const VkAttachmentDescription depthAttachmentDescription =
1040                 {
1041                         0u,                                                 // VkAttachmentDescriptionFlags flags;
1042                         depthFormat,                                        // VkFormat                     format;
1043                         VK_SAMPLE_COUNT_1_BIT,                              // VkSampleCountFlagBits        samples;
1044                         VK_ATTACHMENT_LOAD_OP_CLEAR,                        // VkAttachmentLoadOp           loadOp;
1045                         VK_ATTACHMENT_STORE_OP_DONT_CARE,                   // VkAttachmentStoreOp          storeOp;
1046                         VK_ATTACHMENT_LOAD_OP_DONT_CARE,                    // VkAttachmentLoadOp           stencilLoadOp;
1047                         VK_ATTACHMENT_STORE_OP_DONT_CARE,                   // VkAttachmentStoreOp          stencilStoreOp;
1048                         VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,   // VkImageLayout                initialLayout;
1049                         VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,   // VkImageLayout                finalLayout;
1050                 };
1051
1052                 const VkAttachmentDescription attachments[2] =
1053                 {
1054                         colorAttachmentDescription,
1055                         depthAttachmentDescription
1056                 };
1057
1058                 const VkAttachmentReference colorAttachmentReference =
1059                 {
1060                         0u,                                                 // deUint32         attachment;
1061                         VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL            // VkImageLayout    layout;
1062                 };
1063
1064                 const VkAttachmentReference depthAttachmentReference =
1065                 {
1066                         1u,                                                 // deUint32         attachment;
1067                         VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL    // VkImageLayout    layout;
1068                 };
1069
1070                 const VkSubpassDescription subpassDescription =
1071                 {
1072                         0u,                                                 // VkSubpassDescriptionFlags        flags;
1073                         VK_PIPELINE_BIND_POINT_GRAPHICS,                    // VkPipelineBindPoint              pipelineBindPoint;
1074                         0u,                                                 // deUint32                         inputAttachmentCount;
1075                         DE_NULL,                                            // const VkAttachmentReference*     pInputAttachments;
1076                         1u,                                                 // deUint32                         colorAttachmentCount;
1077                         &colorAttachmentReference,                          // const VkAttachmentReference*     pColorAttachments;
1078                         DE_NULL,                                            // const VkAttachmentReference*     pResolveAttachments;
1079                         &depthAttachmentReference,                          // const VkAttachmentReference*     pDepthStencilAttachment;
1080                         0u,                                                 // deUint32                         preserveAttachmentCount;
1081                         DE_NULL                                             // const VkAttachmentReference*     pPreserveAttachments;
1082                 };
1083
1084                 const VkRenderPassCreateInfo renderPassParams =
1085                 {
1086                         VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,          // VkStructureType                  sType;
1087                         DE_NULL,                                            // const void*                      pNext;
1088                         0u,                                                 // VkRenderPassCreateFlags          flags;
1089                         2u,                                                 // deUint32                         attachmentCount;
1090                         attachments,                                        // const VkAttachmentDescription*   pAttachments;
1091                         1u,                                                 // deUint32                         subpassCount;
1092                         &subpassDescription,                                // const VkSubpassDescription*      pSubpasses;
1093                         0u,                                                 // deUint32                         dependencyCount;
1094                         DE_NULL                                             // const VkSubpassDependency*       pDependencies;
1095                 };
1096
1097                 m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
1098         }
1099
1100 }
1101
1102 void BasicGraphicsTestInstance::buildFrameBuffer(tcu::UVec2 renderSize, VkFormat colorFormat, VkFormat depthFormat)
1103 {
1104         const DeviceInterface&      vk                   = m_context.getDeviceInterface();
1105         const VkDevice              vkDevice             = m_context.getDevice();
1106         const VkComponentMapping    ComponentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A};
1107
1108         // Create color image
1109         {
1110                 m_colorImage = createImage2DAndBindMemory(colorFormat,
1111                                                                                                   renderSize.x(),
1112                                                                                                   renderSize.y(),
1113                                                                                                   VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
1114                                                                                                   VK_SAMPLE_COUNT_1_BIT,
1115                                                                                                   &m_colorImageAlloc);
1116         }
1117
1118         // Create depth image
1119         {
1120                 m_depthImage = createImage2DAndBindMemory(depthFormat,
1121                                                                                                   renderSize.x(),
1122                                                                                                   renderSize.y(),
1123                                                                                                   VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1124                                                                                                   VK_SAMPLE_COUNT_1_BIT,
1125                                                                                                   &m_depthImageAlloc);
1126         }
1127
1128         // Set up image layout transition barriers
1129         {
1130                 const VkImageMemoryBarrier colorImageBarrier =
1131                 {
1132                         VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType                      sType;
1133                         DE_NULL,                                                                                        // const void*                          pNext;
1134                         0u,                                                                                                     // VkAccessFlags                        srcAccessMask;
1135                         VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                           // VkAccessFlags                        dstAccessMask;
1136                         VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                        oldLayout;
1137                         VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,                       // VkImageLayout                        newLayout;
1138                         VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     srcQueueFamilyIndex;
1139                         VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     dstQueueFamilyIndex;
1140                         *m_colorImage,                                                                          // VkImage                                      image;
1141                         { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u },          // VkImageSubresourceRange      subresourceRange;
1142                 };
1143                 const VkImageMemoryBarrier depthImageBarrier =
1144                 {
1145                         VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType                      sType;
1146                         DE_NULL,                                                                                        // const void*                          pNext;
1147                         0u,                                                                                                     // VkAccessFlags                        srcAccessMask;
1148                         VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,           // VkAccessFlags                        dstAccessMask;
1149                         VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                        oldLayout;
1150                         VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,       // VkImageLayout                        newLayout;
1151                         VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     srcQueueFamilyIndex;
1152                         VK_QUEUE_FAMILY_IGNORED,                                                        // deUint32                                     dstQueueFamilyIndex;
1153                         *m_depthImage,                                                                          // VkImage                                      image;
1154                         { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u },          // VkImageSubresourceRange      subresourceRange;
1155                 };
1156
1157                 m_imageLayoutBarriers[0] = colorImageBarrier;
1158                 m_imageLayoutBarriers[1] = depthImageBarrier;
1159         }
1160
1161         // Create color attachment view
1162         {
1163                 const VkImageViewCreateInfo colorAttachmentViewParams =
1164                 {
1165                         VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,       // VkStructureType          sType;
1166                         DE_NULL,                                        // const void*              pNext;
1167                         0u,                                             // VkImageViewCreateFlags   flags;
1168                         *m_colorImage,                                  // VkImage                  image;
1169                         VK_IMAGE_VIEW_TYPE_2D,                          // VkImageViewType          viewType;
1170                         colorFormat,                                    // VkFormat                 format;
1171                         ComponentMappingRGBA,                           // VkComponentMapping       components;
1172                         { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u },  // VkImageSubresourceRange  subresourceRange;
1173                 };
1174
1175                 m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams);
1176         }
1177
1178         // Create depth attachment view
1179         {
1180                 const VkImageViewCreateInfo depthAttachmentViewParams =
1181                 {
1182                         VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,       // VkStructureType          sType;
1183                         DE_NULL,                                        // const void*              pNext;
1184                         0u,                                             // VkImageViewCreateFlags   flags;
1185                         *m_depthImage,                                  // VkImage                  image;
1186                         VK_IMAGE_VIEW_TYPE_2D,                          // VkImageViewType          viewType;
1187                         depthFormat,                                    // VkFormat                 format;
1188                         ComponentMappingRGBA,                           // VkComponentMapping       components;
1189                         { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u },  // VkImageSubresourceRange  subresourceRange;
1190                 };
1191
1192                 m_depthAttachmentView = createImageView(vk, vkDevice, &depthAttachmentViewParams);
1193         }
1194
1195         // Create framebuffer
1196         {
1197                 const VkImageView attachmentBindInfos[2] =
1198                 {
1199                         *m_colorAttachmentView,
1200                         *m_depthAttachmentView,
1201                 };
1202
1203                 const VkFramebufferCreateInfo framebufferParams =
1204                 {
1205                         VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,          // VkStructureType              sType;
1206                         DE_NULL,                                            // const void*                  pNext;
1207                         0u,                                                 // VkFramebufferCreateFlags     flags;
1208                         *m_renderPass,                                      // VkRenderPass                 renderPass;
1209                         2u,                                                 // deUint32                     attachmentCount;
1210                         attachmentBindInfos,                                // const VkImageView*           pAttachments;
1211                         (deUint32)renderSize.x(),                           // deUint32                     width;
1212                         (deUint32)renderSize.y(),                           // deUint32                     height;
1213                         1u,                                                 // deUint32                     layers;
1214                 };
1215
1216                 m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
1217         }
1218
1219 }
1220
1221 BasicGraphicsTestInstance::BasicGraphicsTestInstance(Context&              context,
1222                                                                                                          const StageFlagVector stages,
1223                                                                                                          const bool            inRenderPass)
1224                                                                                                          : TimestampTestInstance (context,stages,inRenderPass)
1225                                                                                                          , m_renderSize  (32, 32)
1226                                                                                                          , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
1227                                                                                                          , m_depthFormat (VK_FORMAT_D16_UNORM)
1228                                                                                                          , m_pipelineBuilder (context)
1229 {
1230         buildVertexBuffer();
1231
1232         buildRenderPass(m_colorFormat, m_depthFormat);
1233
1234         buildFrameBuffer(m_renderSize, m_colorFormat, m_depthFormat);
1235
1236         m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_VERTEX_BIT, "color_vert", "main");
1237         m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_FRAGMENT_BIT, "color_frag", "main");
1238
1239         m_graphicsPipelines = m_pipelineBuilder.buildPipeline(m_renderSize, *m_renderPass);
1240
1241 }
1242
1243 BasicGraphicsTestInstance::~BasicGraphicsTestInstance(void)
1244 {
1245 }
1246
1247 void BasicGraphicsTestInstance::configCommandBuffer(void)
1248 {
1249         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
1250
1251         const VkCommandBufferBeginInfo cmdBufferBeginInfo =
1252         {
1253                 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType                  sType;
1254                 DE_NULL,                                        // const void*                      pNext;
1255                 0u,                                             // VkCommandBufferUsageFlags        flags;
1256                 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1257         };
1258
1259         const VkClearValue attachmentClearValues[2] =
1260         {
1261                 defaultClearValue(m_colorFormat),
1262                 defaultClearValue(m_depthFormat),
1263         };
1264
1265         const VkRenderPassBeginInfo renderPassBeginInfo =
1266         {
1267                 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,               // VkStructureType      sType;
1268                 DE_NULL,                                                // const void*          pNext;
1269                 *m_renderPass,                                          // VkRenderPass         renderPass;
1270                 *m_framebuffer,                                         // VkFramebuffer        framebuffer;
1271                 { { 0u, 0u }, { m_renderSize.x(), m_renderSize.y() } }, // VkRect2D             renderArea;
1272                 2u,                                                     // deUint32             clearValueCount;
1273                 attachmentClearValues                                   // const VkClearValue*  pClearValues;
1274         };
1275
1276         VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
1277
1278         vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0,
1279                 0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(m_imageLayoutBarriers), m_imageLayoutBarriers);
1280
1281         vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
1282
1283         vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
1284
1285         vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines);
1286         VkDeviceSize offsets = 0u;
1287         vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &m_vertexBuffer.get(), &offsets);
1288         vk.cmdDraw(*m_cmdBuffer, (deUint32)m_vertices.size(), 1u, 0u, 0u);
1289
1290         if(m_inRenderPass)
1291         {
1292           deUint32 timestampEntry = 0u;
1293           for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
1294           {
1295                   vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
1296           }
1297         }
1298
1299         vk.cmdEndRenderPass(*m_cmdBuffer);
1300
1301         if(!m_inRenderPass)
1302         {
1303           deUint32 timestampEntry = 0u;
1304           for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
1305           {
1306                   vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
1307           }
1308         }
1309
1310         VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1311 }
1312
1313 class AdvGraphicsTest : public BasicGraphicsTest
1314 {
1315 public:
1316                                                   AdvGraphicsTest  (tcu::TestContext&         testContext,
1317                                                                                         const std::string&        name,
1318                                                                                         const std::string&        description,
1319                                                                                         const TimestampTestParam* param)
1320                                                           : BasicGraphicsTest(testContext, name, description, param)
1321                                                           { }
1322         virtual               ~AdvGraphicsTest (void) { }
1323         virtual void          initPrograms     (SourceCollections&        programCollection) const;
1324         virtual TestInstance* createInstance   (Context&                  context) const;
1325 };
1326
1327 class AdvGraphicsTestInstance : public BasicGraphicsTestInstance
1328 {
1329 public:
1330                                  AdvGraphicsTestInstance  (Context&              context,
1331                                                                                    const StageFlagVector stages,
1332                                                                                    const bool            inRenderPass);
1333         virtual      ~AdvGraphicsTestInstance (void);
1334         virtual void configCommandBuffer      (void);
1335 protected:
1336         virtual void featureSupportCheck      (void);
1337 protected:
1338         VkPhysicalDeviceFeatures m_features;
1339         deUint32                 m_draw_count;
1340         de::MovePtr<Allocation>  m_indirectBufferAlloc;
1341         Move<VkBuffer>           m_indirectBuffer;
1342 };
1343
1344 void AdvGraphicsTest::initPrograms(SourceCollections& programCollection) const
1345 {
1346         BasicGraphicsTest::initPrograms(programCollection);
1347
1348         programCollection.glslSources.add("dummy_geo") << glu::GeometrySource(
1349                 "#version 310 es\n"
1350                 "#extension GL_EXT_geometry_shader : enable\n"
1351                 "layout(triangles) in;\n"
1352                 "layout(triangle_strip, max_vertices = 3) out;\n"
1353                 "layout(location = 0) in highp vec4 in_vtxColor[];\n"
1354                 "layout(location = 0) out highp vec4 vtxColor;\n"
1355                 "void main (void)\n"
1356                 "{\n"
1357                 "  for(int ndx=0; ndx<3; ndx++)\n"
1358                 "  {\n"
1359                 "    gl_Position = gl_in[ndx].gl_Position;\n"
1360                 "    vtxColor    = in_vtxColor[ndx];\n"
1361                 "    EmitVertex();\n"
1362                 "  }\n"
1363                 "  EndPrimitive();\n"
1364                 "}\n");
1365
1366         programCollection.glslSources.add("basic_tcs") << glu::TessellationControlSource(
1367                 "#version 310 es\n"
1368                 "#extension GL_EXT_tessellation_shader : enable\n"
1369                 "layout(vertices = 3) out;\n"
1370                 "layout(location = 0) in highp vec4 color[];\n"
1371                 "layout(location = 0) out highp vec4 vtxColor[];\n"
1372                 "void main()\n"
1373                 "{\n"
1374                 "  gl_TessLevelOuter[0] = 4.0;\n"
1375                 "  gl_TessLevelOuter[1] = 4.0;\n"
1376                 "  gl_TessLevelOuter[2] = 4.0;\n"
1377                 "  gl_TessLevelInner[0] = 4.0;\n"
1378                 "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
1379                 "  vtxColor[gl_InvocationID] = color[gl_InvocationID];\n"
1380                 "}\n");
1381
1382         programCollection.glslSources.add("basic_tes") << glu::TessellationEvaluationSource(
1383                 "#version 310 es\n"
1384                 "#extension GL_EXT_tessellation_shader : enable\n"
1385                 "layout(triangles, fractional_even_spacing, ccw) in;\n"
1386                 "layout(location = 0) in highp vec4 colors[];\n"
1387                 "layout(location = 0) out highp vec4 vtxColor;\n"
1388                 "void main() \n"
1389                 "{\n"
1390                 "  float u = gl_TessCoord.x;\n"
1391                 "  float v = gl_TessCoord.y;\n"
1392                 "  float w = gl_TessCoord.z;\n"
1393                 "  vec4 pos = vec4(0);\n"
1394                 "  vec4 color = vec4(0);\n"
1395                 "  pos.xyz += u * gl_in[0].gl_Position.xyz;\n"
1396                 "  color.xyz += u * colors[0].xyz;\n"
1397                 "  pos.xyz += v * gl_in[1].gl_Position.xyz;\n"
1398                 "  color.xyz += v * colors[1].xyz;\n"
1399                 "  pos.xyz += w * gl_in[2].gl_Position.xyz;\n"
1400                 "  color.xyz += w * colors[2].xyz;\n"
1401                 "  pos.w = 1.0;\n"
1402                 "  color.w = 1.0;\n"
1403                 "  gl_Position = pos;\n"
1404                 "  vtxColor = color;\n"
1405                 "}\n");
1406 }
1407
1408 TestInstance* AdvGraphicsTest::createInstance(Context& context) const
1409 {
1410         return new AdvGraphicsTestInstance(context,m_stages,m_inRenderPass);
1411 }
1412
1413 void AdvGraphicsTestInstance::featureSupportCheck(void)
1414 {
1415         for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
1416         {
1417                 switch(*it)
1418                 {
1419                         case VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT:
1420                                 if (m_features.geometryShader == VK_FALSE)
1421                                 {
1422                                         TCU_THROW(NotSupportedError, "Geometry Shader Not Supported");
1423                                 }
1424                                 break;
1425                         case VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT:
1426                         case VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT:
1427                                 if (m_features.tessellationShader == VK_FALSE)
1428                                 {
1429                                         TCU_THROW(NotSupportedError, "Tessellation Not Supported");
1430                                 }
1431                                 break;
1432                         case VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT:
1433                         default:
1434                                 break;
1435                 };
1436         }
1437 }
1438
1439 AdvGraphicsTestInstance::AdvGraphicsTestInstance(Context&              context,
1440                                                                                                  const StageFlagVector stages,
1441                                                                                                  const bool            inRenderPass)
1442         : BasicGraphicsTestInstance(context, stages, inRenderPass)
1443 {
1444         m_features = m_context.getDeviceFeatures();
1445
1446         // If necessary feature is not supported, throw error and fail current test
1447         featureSupportCheck();
1448
1449         if(m_features.geometryShader == VK_TRUE)
1450         {
1451                 m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_GEOMETRY_BIT, "dummy_geo", "main");
1452         }
1453
1454         if(m_features.tessellationShader == VK_TRUE)
1455         {
1456                 m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, "basic_tcs", "main");
1457                 m_pipelineBuilder.bindShaderStage(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "basic_tes", "main");
1458                 m_pipelineBuilder.enableTessellationStage(3);
1459         }
1460
1461         m_graphicsPipelines = m_pipelineBuilder.buildPipeline(m_renderSize, *m_renderPass);
1462
1463         // Prepare the indirect draw buffer
1464         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
1465         const VkDevice              vkDevice            = m_context.getDevice();
1466
1467         if(m_features.multiDrawIndirect == VK_TRUE)
1468         {
1469                 m_draw_count = 2;
1470         }
1471         else
1472         {
1473                 m_draw_count = 1;
1474         }
1475         m_indirectBuffer = createBufferAndBindMemory(32u, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, &m_indirectBufferAlloc);
1476
1477         const VkDrawIndirectCommand indirectCmds[] =
1478         {
1479                 {
1480                         12u,                    // deUint32    vertexCount;
1481                         1u,                     // deUint32    instanceCount;
1482                         0u,                     // deUint32    firstVertex;
1483                         0u,                     // deUint32    firstInstance;
1484                 },
1485                 {
1486                         12u,                    // deUint32    vertexCount;
1487                         1u,                     // deUint32    instanceCount;
1488                         11u,                    // deUint32    firstVertex;
1489                         0u,                     // deUint32    firstInstance;
1490                 },
1491         };
1492         // Load data into indirect draw buffer
1493         deMemcpy(m_indirectBufferAlloc->getHostPtr(), indirectCmds, m_draw_count * sizeof(VkDrawIndirectCommand));
1494         flushMappedMemoryRange(vk, vkDevice, m_indirectBufferAlloc->getMemory(), m_indirectBufferAlloc->getOffset(), 32u);
1495
1496 }
1497
1498 AdvGraphicsTestInstance::~AdvGraphicsTestInstance(void)
1499 {
1500 }
1501
1502 void AdvGraphicsTestInstance::configCommandBuffer(void)
1503 {
1504         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
1505
1506         const VkCommandBufferBeginInfo cmdBufferBeginInfo =
1507         {
1508                 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType              sType;
1509                 DE_NULL,                                        // const void*                  pNext;
1510                 0u,                                             // VkCommandBufferUsageFlags    flags;
1511                 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1512         };
1513
1514         const VkClearValue attachmentClearValues[2] =
1515         {
1516                 defaultClearValue(m_colorFormat),
1517                 defaultClearValue(m_depthFormat),
1518         };
1519
1520         const VkRenderPassBeginInfo renderPassBeginInfo =
1521         {
1522                 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,               // VkStructureType      sType;
1523                 DE_NULL,                                                // const void*          pNext;
1524                 *m_renderPass,                                          // VkRenderPass         renderPass;
1525                 *m_framebuffer,                                         // VkFramebuffer        framebuffer;
1526                 { { 0u, 0u }, { m_renderSize.x(), m_renderSize.y() } }, // VkRect2D             renderArea;
1527                 2u,                                                     // deUint32             clearValueCount;
1528                 attachmentClearValues                                   // const VkClearValue*  pClearValues;
1529         };
1530
1531         VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
1532
1533         vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0,
1534                 0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(m_imageLayoutBarriers), m_imageLayoutBarriers);
1535
1536         vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
1537
1538         vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
1539
1540         vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines);
1541
1542         VkDeviceSize offsets = 0u;
1543         vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &m_vertexBuffer.get(), &offsets);
1544
1545         vk.cmdDrawIndirect(*m_cmdBuffer, *m_indirectBuffer, 0u, m_draw_count, sizeof(VkDrawIndirectCommand));
1546
1547         if(m_inRenderPass)
1548         {
1549           deUint32 timestampEntry = 0u;
1550           for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
1551           {
1552                   vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
1553           }
1554         }
1555
1556         vk.cmdEndRenderPass(*m_cmdBuffer);
1557
1558         if(!m_inRenderPass)
1559         {
1560           deUint32 timestampEntry = 0u;
1561           for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
1562           {
1563                   vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
1564           }
1565         }
1566
1567         VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1568
1569 }
1570
1571 class BasicComputeTest : public TimestampTest
1572 {
1573 public:
1574                                                   BasicComputeTest  (tcu::TestContext&         testContext,
1575                                                                                          const std::string&        name,
1576                                                                                          const std::string&        description,
1577                                                                                          const TimestampTestParam* param)
1578                                                           : TimestampTest(testContext, name, description, param)
1579                                                           { }
1580         virtual               ~BasicComputeTest (void) { }
1581         virtual void          initPrograms      (SourceCollections&        programCollection) const;
1582         virtual TestInstance* createInstance    (Context&                  context) const;
1583 };
1584
1585 class BasicComputeTestInstance : public TimestampTestInstance
1586 {
1587 public:
1588                                  BasicComputeTestInstance  (Context&              context,
1589                                                                                         const StageFlagVector stages,
1590                                                                                         const bool            inRenderPass);
1591         virtual      ~BasicComputeTestInstance (void);
1592         virtual void configCommandBuffer       (void);
1593 protected:
1594         de::MovePtr<Allocation>     m_inputBufAlloc;
1595         Move<VkBuffer>              m_inputBuf;
1596         de::MovePtr<Allocation>     m_outputBufAlloc;
1597         Move<VkBuffer>              m_outputBuf;
1598
1599         Move<VkDescriptorPool>      m_descriptorPool;
1600         Move<VkDescriptorSet>       m_descriptorSet;
1601         Move<VkDescriptorSetLayout> m_descriptorSetLayout;
1602
1603         Move<VkPipelineLayout>      m_pipelineLayout;
1604         Move<VkShaderModule>        m_computeShaderModule;
1605         Move<VkPipeline>            m_computePipelines;
1606 };
1607
1608 void BasicComputeTest::initPrograms(SourceCollections& programCollection) const
1609 {
1610         TimestampTest::initPrograms(programCollection);
1611
1612         programCollection.glslSources.add("basic_compute") << glu::ComputeSource(
1613                 "#version 310 es\n"
1614                 "layout(local_size_x = 128) in;\n"
1615                 "layout(std430) buffer;\n"
1616                 "layout(binding = 0) readonly buffer Input0\n"
1617                 "{\n"
1618                 "  vec4 elements[];\n"
1619                 "} input_data0;\n"
1620                 "layout(binding = 1) writeonly buffer Output\n"
1621                 "{\n"
1622                 "  vec4 elements[];\n"
1623                 "} output_data;\n"
1624                 "void main()\n"
1625                 "{\n"
1626                 "  uint ident = gl_GlobalInvocationID.x;\n"
1627                 "  output_data.elements[ident] = input_data0.elements[ident] * input_data0.elements[ident];\n"
1628                 "}");
1629 }
1630
1631 TestInstance* BasicComputeTest::createInstance(Context& context) const
1632 {
1633         return new BasicComputeTestInstance(context,m_stages,m_inRenderPass);
1634 }
1635
1636 BasicComputeTestInstance::BasicComputeTestInstance(Context&              context,
1637                                                                                                    const StageFlagVector stages,
1638                                                                                                    const bool            inRenderPass)
1639         : TimestampTestInstance(context, stages, inRenderPass)
1640 {
1641         const DeviceInterface&      vk                  = context.getDeviceInterface();
1642         const VkDevice              vkDevice            = context.getDevice();
1643
1644         // Create buffer object, allocate storage, and generate input data
1645         const VkDeviceSize          size                = sizeof(tcu::Vec4) * 128u * 128u;
1646         m_inputBuf = createBufferAndBindMemory(size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, &m_inputBufAlloc);
1647         // Load vertices into buffer
1648         tcu::Vec4* pVec = reinterpret_cast<tcu::Vec4*>(m_inputBufAlloc->getHostPtr());
1649         for (deUint32 ndx = 0u; ndx < (128u * 128u); ndx++)
1650         {
1651                 for (deUint32 component = 0u; component < 4u; component++)
1652                 {
1653                         pVec[ndx][component]= (float)(ndx * (component + 1u));
1654                 }
1655         }
1656         flushMappedMemoryRange(vk, vkDevice, m_inputBufAlloc->getMemory(), m_inputBufAlloc->getOffset(), size);
1657
1658         m_outputBuf = createBufferAndBindMemory(size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, &m_outputBufAlloc);
1659
1660         std::vector<VkDescriptorBufferInfo>        descriptorInfos;
1661         descriptorInfos.push_back(makeDescriptorBufferInfo(*m_inputBuf, 0u, size));
1662         descriptorInfos.push_back(makeDescriptorBufferInfo(*m_outputBuf, 0u, size));
1663
1664         // Create descriptor set layout
1665         DescriptorSetLayoutBuilder descLayoutBuilder;
1666
1667         for (deUint32 bindingNdx = 0u; bindingNdx < 2u; bindingNdx++)
1668         {
1669                 descLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT);
1670         }
1671
1672         m_descriptorSetLayout = descLayoutBuilder.build(vk, vkDevice);
1673
1674         // Create descriptor pool
1675         m_descriptorPool = DescriptorPoolBuilder().addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2).build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
1676
1677         // Create descriptor set
1678         const VkDescriptorSetAllocateInfo descriptorSetAllocInfo =
1679         {
1680                 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,     // VkStructureType                 sType;
1681                 DE_NULL,                                            // const void*                     pNext;
1682                 *m_descriptorPool,                                  // VkDescriptorPool                descriptorPool;
1683                 1u,                                                 // deUint32                        setLayoutCount;
1684                 &m_descriptorSetLayout.get(),                       // const VkDescriptorSetLayout*    pSetLayouts;
1685         };
1686         m_descriptorSet   = allocateDescriptorSet(vk, vkDevice, &descriptorSetAllocInfo);
1687
1688         DescriptorSetUpdateBuilder  builder;
1689         for (deUint32 descriptorNdx = 0u; descriptorNdx < 2u; descriptorNdx++)
1690         {
1691                 builder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(descriptorNdx), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &descriptorInfos[descriptorNdx]);
1692         }
1693         builder.update(vk, vkDevice);
1694
1695         // Create compute pipeline layout
1696         const VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
1697         {
1698                 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,  // VkStructureType                 sType;
1699                 DE_NULL,                                        // const void*                     pNext;
1700                 0u,                                             // VkPipelineLayoutCreateFlags     flags;
1701                 1u,                                             // deUint32                        setLayoutCount;
1702                 &m_descriptorSetLayout.get(),                   // const VkDescriptorSetLayout*    pSetLayouts;
1703                 0u,                                             // deUint32                        pushConstantRangeCount;
1704                 DE_NULL,                                        // const VkPushConstantRange*      pPushConstantRanges;
1705         };
1706
1707         m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutCreateInfo);
1708
1709         // Create compute shader
1710         VkShaderModuleCreateInfo shaderModuleCreateInfo =
1711         {
1712                 VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,                        // VkStructureType             sType;
1713                 DE_NULL,                                                            // const void*                 pNext;
1714                 0u,                                                                 // VkShaderModuleCreateFlags   flags;
1715                 m_context.getBinaryCollection().get("basic_compute").getSize(),     // deUintptr                   codeSize;
1716                 (deUint32*)m_context.getBinaryCollection().get("basic_compute").getBinary(),   // const deUint32*             pCode;
1717
1718         };
1719
1720         m_computeShaderModule = createShaderModule(vk, vkDevice, &shaderModuleCreateInfo);
1721
1722         // Create compute pipeline
1723         const VkPipelineShaderStageCreateInfo stageCreateInfo =
1724         {
1725                 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType                     sType;
1726                 DE_NULL,                                             // const void*                         pNext;
1727                 0u,                                                  // VkPipelineShaderStageCreateFlags    flags;
1728                 VK_SHADER_STAGE_COMPUTE_BIT,                         // VkShaderStageFlagBits               stage;
1729                 *m_computeShaderModule,                              // VkShaderModule                      module;
1730                 "main",                                              // const char*                         pName;
1731                 DE_NULL,                                             // const VkSpecializationInfo*         pSpecializationInfo;
1732         };
1733
1734         const VkComputePipelineCreateInfo pipelineCreateInfo =
1735         {
1736                 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,      // VkStructureType                 sType;
1737                 DE_NULL,                                             // const void*                     pNext;
1738                 0u,                                                  // VkPipelineCreateFlags           flags;
1739                 stageCreateInfo,                                     // VkPipelineShaderStageCreateInfo stage;
1740                 *m_pipelineLayout,                                   // VkPipelineLayout                layout;
1741                 (VkPipeline)0,                                       // VkPipeline                      basePipelineHandle;
1742                 0u,                                                  // deInt32                         basePipelineIndex;
1743         };
1744
1745         m_computePipelines = createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo);
1746
1747 }
1748
1749 BasicComputeTestInstance::~BasicComputeTestInstance(void)
1750 {
1751 }
1752
1753 void BasicComputeTestInstance::configCommandBuffer(void)
1754 {
1755         const DeviceInterface&     vk                 = m_context.getDeviceInterface();
1756
1757         const VkCommandBufferBeginInfo cmdBufferBeginInfo =
1758         {
1759                 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType          sType;
1760                 DE_NULL,                                        // const void*              pNext;
1761                 0u,                                             // VkCmdBufferOptimizeFlags flags;
1762                 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1763
1764         };
1765
1766         VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
1767
1768         vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
1769
1770         vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_computePipelines);
1771         vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipelineLayout, 0u, 1u, &m_descriptorSet.get(), 0u, DE_NULL);
1772         vk.cmdDispatch(*m_cmdBuffer, 128u, 1u, 1u);
1773
1774         deUint32 timestampEntry = 0u;
1775         for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
1776         {
1777                 vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
1778         }
1779
1780         VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1781
1782
1783 }
1784
1785 class TransferTest : public TimestampTest
1786 {
1787 public:
1788                                                   TransferTest   (tcu::TestContext&          testContext,
1789                                                                                   const std::string&         name,
1790                                                                                   const std::string&         description,
1791                                                                                   const TimestampTestParam*  param);
1792         virtual               ~TransferTest  (void) { }
1793         virtual void          initPrograms   (SourceCollections&         programCollection) const;
1794         virtual TestInstance* createInstance (Context&                   context) const;
1795 protected:
1796         TransferMethod        m_method;
1797 };
1798
1799 class TransferTestInstance : public TimestampTestInstance
1800 {
1801 public:
1802                                         TransferTestInstance    (Context&                                       context,
1803                                                                                          const StageFlagVector          stages,
1804                                                                                          const bool                                     inRenderPass,
1805                                                                                          const TransferMethod           method);
1806         virtual         ~TransferTestInstance   (void);
1807         virtual void    configCommandBuffer             (void);
1808         virtual void    initialImageTransition  (VkCommandBuffer                        cmdBuffer,
1809                                                                                          VkImage                                        image,
1810                                                                                          VkImageSubresourceRange        subRange,
1811                                                                                          VkImageLayout                          layout);
1812 protected:
1813         TransferMethod                  m_method;
1814
1815         VkDeviceSize                    m_bufSize;
1816         Move<VkBuffer>                  m_srcBuffer;
1817         Move<VkBuffer>                  m_dstBuffer;
1818         de::MovePtr<Allocation> m_srcBufferAlloc;
1819         de::MovePtr<Allocation> m_dstBufferAlloc;
1820
1821         VkFormat                                m_imageFormat;
1822         deInt32                                 m_imageWidth;
1823         deInt32                                 m_imageHeight;
1824         VkDeviceSize                    m_imageSize;
1825         Move<VkImage>                   m_srcImage;
1826         Move<VkImage>                   m_dstImage;
1827         Move<VkImage>                   m_depthImage;
1828         Move<VkImage>                   m_msImage;
1829         de::MovePtr<Allocation> m_srcImageAlloc;
1830         de::MovePtr<Allocation> m_dstImageAlloc;
1831         de::MovePtr<Allocation> m_depthImageAlloc;
1832         de::MovePtr<Allocation> m_msImageAlloc;
1833 };
1834
1835 TransferTest::TransferTest(tcu::TestContext&                 testContext,
1836                                                    const std::string&                name,
1837                                                    const std::string&                description,
1838                                                    const TimestampTestParam*         param)
1839         : TimestampTest(testContext, name, description, param)
1840 {
1841         const TransferTimestampTestParam* transferParam = dynamic_cast<const TransferTimestampTestParam*>(param);
1842         m_method = transferParam->getMethod();
1843 }
1844
1845 void TransferTest::initPrograms(SourceCollections& programCollection) const
1846 {
1847         TimestampTest::initPrograms(programCollection);
1848 }
1849
1850 TestInstance* TransferTest::createInstance(Context& context) const
1851 {
1852   return new TransferTestInstance(context, m_stages, m_inRenderPass, m_method);
1853 }
1854
1855 TransferTestInstance::TransferTestInstance(Context&              context,
1856                                                                                    const StageFlagVector stages,
1857                                                                                    const bool            inRenderPass,
1858                                                                                    const TransferMethod  method)
1859         : TimestampTestInstance(context, stages, inRenderPass)
1860         , m_method(method)
1861         , m_bufSize(256u)
1862         , m_imageFormat(VK_FORMAT_R8G8B8A8_UNORM)
1863         , m_imageWidth(4u)
1864         , m_imageHeight(4u)
1865         , m_imageSize(256u)
1866 {
1867         const DeviceInterface&      vk                  = context.getDeviceInterface();
1868         const VkDevice              vkDevice            = context.getDevice();
1869
1870         // Create src buffer
1871         m_srcBuffer = createBufferAndBindMemory(m_bufSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, &m_srcBufferAlloc);
1872
1873         // Init the source buffer memory
1874         char* pBuf = reinterpret_cast<char*>(m_srcBufferAlloc->getHostPtr());
1875         memset(pBuf, 0xFF, sizeof(char)*(size_t)m_bufSize);
1876         flushMappedMemoryRange(vk, vkDevice, m_srcBufferAlloc->getMemory(), m_srcBufferAlloc->getOffset(), m_bufSize);
1877
1878         // Create dst buffer
1879         m_dstBuffer = createBufferAndBindMemory(m_bufSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, &m_dstBufferAlloc);
1880
1881         // Create src/dst/depth image
1882         m_srcImage   = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
1883                                                                                           VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
1884                                                                                           VK_SAMPLE_COUNT_1_BIT,
1885                                                                                           &m_srcImageAlloc);
1886         m_dstImage   = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
1887                                                                                           VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1888                                                                                           VK_SAMPLE_COUNT_1_BIT,
1889                                                                                           &m_dstImageAlloc);
1890         m_depthImage = createImage2DAndBindMemory(VK_FORMAT_D16_UNORM, m_imageWidth, m_imageHeight,
1891                                                                                           VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1892                                                                                           VK_SAMPLE_COUNT_1_BIT,
1893                                                                                           &m_depthImageAlloc);
1894         m_msImage    = createImage2DAndBindMemory(m_imageFormat, m_imageWidth, m_imageHeight,
1895                                                                                           VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1896                                                                                           VK_SAMPLE_COUNT_4_BIT,
1897                                                                                           &m_msImageAlloc);
1898 }
1899
1900 TransferTestInstance::~TransferTestInstance(void)
1901 {
1902 }
1903
1904 void TransferTestInstance::configCommandBuffer(void)
1905 {
1906         const DeviceInterface&      vk                  = m_context.getDeviceInterface();
1907
1908         const VkCommandBufferBeginInfo cmdBufferBeginInfo =
1909         {
1910                 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType                  sType;
1911                 DE_NULL,                                        // const void*                      pNext;
1912                 0u,                                             // VkCmdBufferOptimizeFlags         flags;
1913                 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1914         };
1915
1916         VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
1917
1918         // Initialize buffer/image
1919         vk.cmdFillBuffer(*m_cmdBuffer, *m_dstBuffer, 0u, m_bufSize, 0x0);
1920
1921         const VkClearColorValue srcClearValue =
1922         {
1923                 {1.0f, 1.0f, 1.0f, 1.0f}
1924         };
1925         const VkClearColorValue dstClearValue =
1926         {
1927                 {0.0f, 0.0f, 0.0f, 0.0f}
1928         };
1929         const struct VkImageSubresourceRange subRangeColor =
1930         {
1931                 VK_IMAGE_ASPECT_COLOR_BIT,  // VkImageAspectFlags  aspectMask;
1932                 0u,                         // deUint32            baseMipLevel;
1933                 1u,                         // deUint32            mipLevels;
1934                 0u,                         // deUint32            baseArrayLayer;
1935                 1u,                         // deUint32            arraySize;
1936         };
1937         const struct VkImageSubresourceRange subRangeDepth =
1938         {
1939                 VK_IMAGE_ASPECT_DEPTH_BIT,  // VkImageAspectFlags  aspectMask;
1940                 0u,                  // deUint32            baseMipLevel;
1941                 1u,                  // deUint32            mipLevels;
1942                 0u,                  // deUint32            baseArrayLayer;
1943                 1u,                  // deUint32            arraySize;
1944         };
1945
1946         initialImageTransition(*m_cmdBuffer, *m_srcImage, subRangeColor, VK_IMAGE_LAYOUT_GENERAL);
1947         initialImageTransition(*m_cmdBuffer, *m_dstImage, subRangeColor, VK_IMAGE_LAYOUT_GENERAL);
1948
1949         vk.cmdClearColorImage(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, &srcClearValue, 1u, &subRangeColor);
1950         vk.cmdClearColorImage(*m_cmdBuffer, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, &dstClearValue, 1u, &subRangeColor);
1951
1952         vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
1953
1954         // Copy Operations
1955         const VkImageSubresourceLayers imgSubResCopy =
1956         {
1957                 VK_IMAGE_ASPECT_COLOR_BIT,              // VkImageAspectFlags  aspectMask;
1958                 0u,                                     // deUint32            mipLevel;
1959                 0u,                                     // deUint32            baseArrayLayer;
1960                 1u,                                     // deUint32            layerCount;
1961         };
1962
1963         const VkOffset3D nullOffset  = {0u, 0u, 0u};
1964         const VkExtent3D imageExtent = {(deUint32)m_imageWidth, (deUint32)m_imageHeight, 1u};
1965         const VkOffset3D imageOffset = {(int)m_imageWidth, (int)m_imageHeight, 1};
1966         switch(m_method)
1967         {
1968                 case TRANSFER_METHOD_COPY_BUFFER:
1969                         {
1970                                 const VkBufferCopy  copyBufRegion =
1971                                 {
1972                                         0u,      // VkDeviceSize    srcOffset;
1973                                         0u,      // VkDeviceSize    destOffset;
1974                                         512u,    // VkDeviceSize    copySize;
1975                                 };
1976                                 vk.cmdCopyBuffer(*m_cmdBuffer, *m_srcBuffer, *m_dstBuffer, 1u, &copyBufRegion);
1977                                 break;
1978                         }
1979                 case TRANSFER_METHOD_COPY_IMAGE:
1980                         {
1981                                 const VkImageCopy copyImageRegion =
1982                                 {
1983                                         imgSubResCopy,                          // VkImageSubresourceCopy  srcSubresource;
1984                                         nullOffset,                             // VkOffset3D              srcOffset;
1985                                         imgSubResCopy,                          // VkImageSubresourceCopy  destSubresource;
1986                                         nullOffset,                             // VkOffset3D              destOffset;
1987                                         imageExtent,                            // VkExtent3D              extent;
1988
1989                                 };
1990                                 vk.cmdCopyImage(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &copyImageRegion);
1991                                 break;
1992                         }
1993                 case TRANSFER_METHOD_COPY_BUFFER_TO_IMAGE:
1994                         {
1995                                 const VkBufferImageCopy bufImageCopy =
1996                                 {
1997                                         0u,                                     // VkDeviceSize            bufferOffset;
1998                                         (deUint32)m_imageWidth,                 // deUint32                bufferRowLength;
1999                                         (deUint32)m_imageHeight,                // deUint32                bufferImageHeight;
2000                                         imgSubResCopy,                          // VkImageSubresourceCopy  imageSubresource;
2001                                         nullOffset,                             // VkOffset3D              imageOffset;
2002                                         imageExtent,                            // VkExtent3D              imageExtent;
2003                                 };
2004                                 vk.cmdCopyBufferToImage(*m_cmdBuffer, *m_srcBuffer, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &bufImageCopy);
2005                                 break;
2006                         }
2007                 case TRANSFER_METHOD_COPY_IMAGE_TO_BUFFER:
2008                         {
2009                                 const VkBufferImageCopy imgBufferCopy =
2010                                 {
2011                                         0u,                                     // VkDeviceSize            bufferOffset;
2012                                         (deUint32)m_imageWidth,                 // deUint32                bufferRowLength;
2013                                         (deUint32)m_imageHeight,                // deUint32                bufferImageHeight;
2014                                         imgSubResCopy,                          // VkImageSubresourceCopy  imageSubresource;
2015                                         nullOffset,                             // VkOffset3D              imageOffset;
2016                                         imageExtent,                            // VkExtent3D              imageExtent;
2017                                 };
2018                                 vk.cmdCopyImageToBuffer(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstBuffer, 1u, &imgBufferCopy);
2019                                 break;
2020                         }
2021                 case TRANSFER_METHOD_BLIT_IMAGE:
2022                         {
2023                                 const VkImageBlit imageBlt =
2024                                 {
2025                                         imgSubResCopy,                          // VkImageSubresourceCopy  srcSubresource;
2026                                         {
2027                                                 nullOffset,
2028                                                 imageOffset,
2029                                         },
2030                                         imgSubResCopy,                          // VkImageSubresourceCopy  destSubresource;
2031                                         {
2032                                                 nullOffset,
2033                                                 imageOffset,
2034                                         }
2035                                 };
2036                                 vk.cmdBlitImage(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &imageBlt, VK_FILTER_NEAREST);
2037                                 break;
2038                         }
2039                 case TRANSFER_METHOD_CLEAR_COLOR_IMAGE:
2040                         {
2041                                 vk.cmdClearColorImage(*m_cmdBuffer, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, &srcClearValue, 1u, &subRangeColor);
2042                                 break;
2043                         }
2044                 case TRANSFER_METHOD_CLEAR_DEPTH_STENCIL_IMAGE:
2045                         {
2046                                 initialImageTransition(*m_cmdBuffer, *m_depthImage, subRangeDepth, VK_IMAGE_LAYOUT_GENERAL);
2047                                 const VkClearDepthStencilValue clearDSValue =
2048                                 {
2049                                         1.0f,                                   // float       depth;
2050                                         0u,                                     // deUint32    stencil;
2051                                 };
2052                                 vk.cmdClearDepthStencilImage(*m_cmdBuffer, *m_depthImage, VK_IMAGE_LAYOUT_GENERAL, &clearDSValue, 1u, &subRangeDepth);
2053                                 break;
2054                         }
2055                 case TRANSFER_METHOD_FILL_BUFFER:
2056                         {
2057                                 vk.cmdFillBuffer(*m_cmdBuffer, *m_dstBuffer, 0u, m_bufSize, 0x0);
2058                                 break;
2059                         }
2060                 case TRANSFER_METHOD_UPDATE_BUFFER:
2061                         {
2062                                 const deUint32 data[] =
2063                                 {
2064                                         0xdeadbeef, 0xabcdef00, 0x12345678
2065                                 };
2066                                 vk.cmdUpdateBuffer(*m_cmdBuffer, *m_dstBuffer, 0x10, sizeof(data), data);
2067                                 break;
2068                         }
2069                 case TRANSFER_METHOD_COPY_QUERY_POOL_RESULTS:
2070                         {
2071                                 vk.cmdWriteTimestamp(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, *m_queryPool, 0u);
2072                                 vk.cmdCopyQueryPoolResults(*m_cmdBuffer, *m_queryPool, 0u, 1u, *m_dstBuffer, 0u, 8u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
2073                                 vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, 1u);
2074                                 break;
2075                         }
2076                 case TRANSFER_METHOD_RESOLVE_IMAGE:
2077                         {
2078                                 const VkImageResolve imageResolve =
2079                                 {
2080                                         imgSubResCopy,                              // VkImageSubresourceLayers  srcSubresource;
2081                                         nullOffset,                                 // VkOffset3D                srcOffset;
2082                                         imgSubResCopy,                              // VkImageSubresourceLayers  destSubresource;
2083                                         nullOffset,                                 // VkOffset3D                destOffset;
2084                                         imageExtent,                                // VkExtent3D                extent;
2085                                 };
2086                                 initialImageTransition(*m_cmdBuffer, *m_msImage, subRangeColor, VK_IMAGE_LAYOUT_GENERAL);
2087                                 vk.cmdClearColorImage(*m_cmdBuffer, *m_msImage, VK_IMAGE_LAYOUT_GENERAL, &srcClearValue, 1u, &subRangeColor);
2088                                 vk.cmdResolveImage(*m_cmdBuffer, *m_msImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &imageResolve);
2089                                 break;
2090                         }
2091                 default:
2092                         DE_FATAL("Unknown Transfer Method!");
2093                         break;
2094         };
2095
2096         deUint32 timestampEntry = 0u;
2097         for (StageFlagVector::const_iterator it = m_stages.begin(); it != m_stages.end(); it++)
2098         {
2099                 vk.cmdWriteTimestamp(*m_cmdBuffer, *it, *m_queryPool, timestampEntry++);
2100         }
2101
2102         VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2103 }
2104
2105 void TransferTestInstance::initialImageTransition (VkCommandBuffer cmdBuffer, VkImage image, VkImageSubresourceRange subRange, VkImageLayout layout)
2106 {
2107         const DeviceInterface&          vk                              = m_context.getDeviceInterface();
2108         const VkImageMemoryBarrier      imageMemBarrier =
2109         {
2110                 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType          sType;
2111                 DE_NULL,                                // const void*              pNext;
2112                 0u,                                     // VkAccessFlags            srcAccessMask;
2113                 0u,                                     // VkAccessFlags            dstAccessMask;
2114                 VK_IMAGE_LAYOUT_UNDEFINED,              // VkImageLayout            oldLayout;
2115                 layout,                                 // VkImageLayout            newLayout;
2116                 VK_QUEUE_FAMILY_IGNORED,                // uint32_t                 srcQueueFamilyIndex;
2117                 VK_QUEUE_FAMILY_IGNORED,                // uint32_t                 dstQueueFamilyIndex;
2118                 image,                                  // VkImage                  image;
2119                 subRange                                // VkImageSubresourceRange  subresourceRange;
2120         };
2121
2122         vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, DE_NULL, 0, DE_NULL, 1, &imageMemBarrier);
2123 }
2124
2125 } // anonymous
2126
2127 tcu::TestCaseGroup* createTimestampTests (tcu::TestContext& testCtx)
2128 {
2129         de::MovePtr<tcu::TestCaseGroup> timestampTests (new tcu::TestCaseGroup(testCtx, "timestamp", "timestamp tests"));
2130
2131         // Basic Graphics Tests
2132         {
2133                 de::MovePtr<tcu::TestCaseGroup> basicGraphicsTests (new tcu::TestCaseGroup(testCtx, "basic_graphics_tests", "Record timestamp in different pipeline stages of basic graphics tests"));
2134
2135                 const VkPipelineStageFlagBits basicGraphicsStages0[][2] =
2136                 {
2137                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_VERTEX_INPUT_BIT},
2138                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_VERTEX_SHADER_BIT},
2139                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT},
2140                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT},
2141                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT},
2142                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT},
2143                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT},
2144                   {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,   VK_PIPELINE_STAGE_ALL_COMMANDS_BIT},
2145                 };
2146                 for (deUint32 stageNdx = 0u; stageNdx < DE_LENGTH_OF_ARRAY(basicGraphicsStages0); stageNdx++)
2147                 {
2148                         TimestampTestParam param(basicGraphicsStages0[stageNdx], 2u, true);
2149                         basicGraphicsTests->addChild(newTestCase<BasicGraphicsTest>(testCtx, &param));
2150                         param.toggleInRenderPass();
2151                         basicGraphicsTests->addChild(newTestCase<BasicGraphicsTest>(testCtx, &param));
2152                 }
2153
2154                 const VkPipelineStageFlagBits basicGraphicsStages1[][3] =
2155                 {
2156                   {VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,      VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT},
2157                   {VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,  VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT},
2158                 };
2159                 for (deUint32 stageNdx = 0u; stageNdx < DE_LENGTH_OF_ARRAY(basicGraphicsStages1); stageNdx++)
2160                 {
2161                         TimestampTestParam param(basicGraphicsStages1[stageNdx], 3u, true);
2162                         basicGraphicsTests->addChild(newTestCase<BasicGraphicsTest>(testCtx, &param));
2163                         param.toggleInRenderPass();
2164                         basicGraphicsTests->addChild(newTestCase<BasicGraphicsTest>(testCtx, &param));
2165                 }
2166
2167                 timestampTests->addChild(basicGraphicsTests.release());
2168         }
2169
2170         // Advanced Graphics Tests
2171         {
2172                 de::MovePtr<tcu::TestCaseGroup> advGraphicsTests (new tcu::TestCaseGroup(testCtx, "advanced_graphics_tests", "Record timestamp in different pipeline stages of advanced graphics tests"));
2173
2174                 const VkPipelineStageFlagBits advGraphicsStages[][2] =
2175                 {
2176                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT},
2177                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT},
2178                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT},
2179                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT},
2180                 };
2181                 for (deUint32 stageNdx = 0u; stageNdx < DE_LENGTH_OF_ARRAY(advGraphicsStages); stageNdx++)
2182                 {
2183                         TimestampTestParam param(advGraphicsStages[stageNdx], 2u, true);
2184                         advGraphicsTests->addChild(newTestCase<AdvGraphicsTest>(testCtx, &param));
2185                         param.toggleInRenderPass();
2186                         advGraphicsTests->addChild(newTestCase<AdvGraphicsTest>(testCtx, &param));
2187                 }
2188
2189                 timestampTests->addChild(advGraphicsTests.release());
2190         }
2191
2192         // Basic Compute Tests
2193         {
2194                 de::MovePtr<tcu::TestCaseGroup> basicComputeTests (new tcu::TestCaseGroup(testCtx, "basic_compute_tests", "Record timestamp for computer stages"));
2195
2196                 const VkPipelineStageFlagBits basicComputeStages[][2] =
2197                 {
2198                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT},
2199                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT},
2200                 };
2201                 for (deUint32 stageNdx = 0u; stageNdx < DE_LENGTH_OF_ARRAY(basicComputeStages); stageNdx++)
2202                 {
2203                         TimestampTestParam param(basicComputeStages[stageNdx], 2u, false);
2204                         basicComputeTests->addChild(newTestCase<BasicComputeTest>(testCtx, &param));
2205                 }
2206
2207                 timestampTests->addChild(basicComputeTests.release());
2208         }
2209
2210         // Transfer Tests
2211         {
2212                 de::MovePtr<tcu::TestCaseGroup> transferTests (new tcu::TestCaseGroup(testCtx, "transfer_tests", "Record timestamp for transfer stages"));
2213
2214                 const VkPipelineStageFlagBits transferStages[][2] =
2215                 {
2216                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT},
2217                         {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_HOST_BIT},
2218                 };
2219                 for (deUint32 stageNdx = 0u; stageNdx < DE_LENGTH_OF_ARRAY(transferStages); stageNdx++)
2220                 {
2221                         for (deUint32 method = 0u; method < TRANSFER_METHOD_LAST; method++)
2222                         {
2223                                 TransferTimestampTestParam param(transferStages[stageNdx], 2u, false, method);
2224                                 transferTests->addChild(newTestCase<TransferTest>(testCtx, &param));
2225                         }
2226                 }
2227
2228                 timestampTests->addChild(transferTests.release());
2229         }
2230
2231         // Misc Tests
2232         {
2233                 de::MovePtr<tcu::TestCaseGroup> miscTests (new tcu::TestCaseGroup(testCtx, "misc_tests", "Misc tests that can not be categorized to other group."));
2234
2235                 const VkPipelineStageFlagBits miscStages[] = {VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT};
2236                 TimestampTestParam param(miscStages, 1u, false);
2237                 miscTests->addChild(new TimestampTest(testCtx,
2238                                                                                           "timestamp_only",
2239                                                                                           "Only write timestamp command in the commmand buffer",
2240                                                                                           &param));
2241
2242                 timestampTests->addChild(miscTests.release());
2243         }
2244
2245         return timestampTests.release();
2246 }
2247
2248 } // pipeline
2249
2250 } // vkt