1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Synchronization tests utilities
22 *//*--------------------------------------------------------------------*/
24 #include "vktSynchronizationUtil.hpp"
25 #include "vkTypeUtil.hpp"
26 #include "vkCmdUtil.hpp"
27 #include "deStringUtil.hpp"
31 namespace synchronization
35 VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize bufferSize,
36 const VkBufferUsageFlags usage)
38 const VkBufferCreateInfo bufferCreateInfo =
40 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
41 DE_NULL, // const void* pNext;
42 (VkBufferCreateFlags)0, // VkBufferCreateFlags flags;
43 bufferSize, // VkDeviceSize size;
44 usage, // VkBufferUsageFlags usage;
45 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
46 0u, // deUint32 queueFamilyIndexCount;
47 DE_NULL, // const deUint32* pQueueFamilyIndices;
49 return bufferCreateInfo;
52 VkMemoryBarrier makeMemoryBarrier (const VkAccessFlags srcAccessMask,
53 const VkAccessFlags dstAccessMask)
55 const VkMemoryBarrier barrier =
57 VK_STRUCTURE_TYPE_MEMORY_BARRIER, // VkStructureType sType;
58 DE_NULL, // const void* pNext;
59 srcAccessMask, // VkAccessFlags srcAccessMask;
60 dstAccessMask, // VkAccessFlags dstAccessMask;
65 VkBufferMemoryBarrier makeBufferMemoryBarrier (const VkAccessFlags srcAccessMask,
66 const VkAccessFlags dstAccessMask,
67 const VkBuffer buffer,
68 const VkDeviceSize offset,
69 const VkDeviceSize bufferSizeBytes)
71 const VkBufferMemoryBarrier barrier =
73 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
74 DE_NULL, // const void* pNext;
75 srcAccessMask, // VkAccessFlags srcAccessMask;
76 dstAccessMask, // VkAccessFlags dstAccessMask;
77 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
78 VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex;
79 buffer, // VkBuffer buffer;
80 offset, // VkDeviceSize offset;
81 bufferSizeBytes, // VkDeviceSize size;
86 VkImageMemoryBarrier makeImageMemoryBarrier (const VkAccessFlags srcAccessMask,
87 const VkAccessFlags dstAccessMask,
88 const VkImageLayout oldLayout,
89 const VkImageLayout newLayout,
91 const VkImageSubresourceRange subresourceRange)
93 const VkImageMemoryBarrier barrier =
95 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
96 DE_NULL, // const void* pNext;
97 srcAccessMask, // VkAccessFlags outputMask;
98 dstAccessMask, // VkAccessFlags inputMask;
99 oldLayout, // VkImageLayout oldLayout;
100 newLayout, // VkImageLayout newLayout;
101 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
102 VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex;
103 image, // VkImage image;
104 subresourceRange, // VkImageSubresourceRange subresourceRange;
109 Move<VkCommandBuffer> makeCommandBuffer (const DeviceInterface& vk, const VkDevice device, const VkCommandPool commandPool)
111 const VkCommandBufferAllocateInfo info =
113 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
114 DE_NULL, // const void* pNext;
115 commandPool, // VkCommandPool commandPool;
116 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
117 1u, // deUint32 commandBufferCount;
119 return allocateCommandBuffer(vk, device, &info);
122 Move<VkDescriptorSet> makeDescriptorSet (const DeviceInterface& vk,
123 const VkDevice device,
124 const VkDescriptorPool descriptorPool,
125 const VkDescriptorSetLayout setLayout)
127 const VkDescriptorSetAllocateInfo info =
129 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType;
130 DE_NULL, // const void* pNext;
131 descriptorPool, // VkDescriptorPool descriptorPool;
132 1u, // deUint32 descriptorSetCount;
133 &setLayout, // const VkDescriptorSetLayout* pSetLayouts;
135 return allocateDescriptorSet(vk, device, &info);
138 Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk,
139 const VkDevice device,
140 const VkDescriptorSetLayout descriptorSetLayout)
142 const VkPipelineLayoutCreateInfo info =
144 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
145 DE_NULL, // const void* pNext;
146 (VkPipelineLayoutCreateFlags)0, // VkPipelineLayoutCreateFlags flags;
147 1u, // deUint32 setLayoutCount;
148 &descriptorSetLayout, // const VkDescriptorSetLayout* pSetLayouts;
149 0u, // deUint32 pushConstantRangeCount;
150 DE_NULL, // const VkPushConstantRange* pPushConstantRanges;
152 return createPipelineLayout(vk, device, &info);
155 Move<VkPipelineLayout> makePipelineLayoutWithoutDescriptors (const DeviceInterface& vk,
156 const VkDevice device)
158 const VkPipelineLayoutCreateInfo info =
160 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
161 DE_NULL, // const void* pNext;
162 (VkPipelineLayoutCreateFlags)0, // VkPipelineLayoutCreateFlags flags;
163 0u, // deUint32 setLayoutCount;
164 DE_NULL, // const VkDescriptorSetLayout* pSetLayouts;
165 0u, // deUint32 pushConstantRangeCount;
166 DE_NULL, // const VkPushConstantRange* pPushConstantRanges;
168 return createPipelineLayout(vk, device, &info);
171 Move<VkPipeline> makeComputePipeline (const DeviceInterface& vk,
172 const VkDevice device,
173 const VkPipelineLayout pipelineLayout,
174 const VkShaderModule shaderModule,
175 const VkSpecializationInfo* specInfo,
176 PipelineCacheData& pipelineCacheData)
178 const VkPipelineShaderStageCreateInfo shaderStageInfo =
180 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
181 DE_NULL, // const void* pNext;
182 (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags;
183 VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
184 shaderModule, // VkShaderModule module;
185 "main", // const char* pName;
186 specInfo, // const VkSpecializationInfo* pSpecializationInfo;
188 const VkComputePipelineCreateInfo pipelineInfo =
190 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
191 DE_NULL, // const void* pNext;
192 (VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags;
193 shaderStageInfo, // VkPipelineShaderStageCreateInfo stage;
194 pipelineLayout, // VkPipelineLayout layout;
195 DE_NULL, // VkPipeline basePipelineHandle;
196 0, // deInt32 basePipelineIndex;
200 const vk::Unique<vk::VkPipelineCache> pipelineCache (pipelineCacheData.createPipelineCache(vk, device));
201 vk::Move<vk::VkPipeline> pipeline (createComputePipeline(vk, device, *pipelineCache, &pipelineInfo));
203 // Refresh data from cache
204 pipelineCacheData.setFromPipelineCache(vk, device, *pipelineCache);
210 VkImageCreateInfo makeImageCreateInfo (const VkImageType imageType, const VkExtent3D& extent, const VkFormat format, const VkImageUsageFlags usage)
212 const VkImageCreateInfo imageInfo =
214 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
215 DE_NULL, // const void* pNext;
216 (VkImageCreateFlags)0, // VkImageCreateFlags flags;
217 imageType, // VkImageType imageType;
218 format, // VkFormat format;
219 extent, // VkExtent3D extent;
220 1u, // uint32_t mipLevels;
221 1u, // uint32_t arrayLayers;
222 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
223 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
224 usage, // VkImageUsageFlags usage;
225 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
226 0u, // uint32_t queueFamilyIndexCount;
227 DE_NULL, // const uint32_t* pQueueFamilyIndices;
228 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
233 Move<VkImageView> makeImageView (const DeviceInterface& vk,
234 const VkDevice device,
236 const VkImageViewType viewType,
237 const VkFormat format,
238 const VkImageSubresourceRange subresourceRange)
240 const VkImageViewCreateInfo imageViewParams =
242 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
243 DE_NULL, // const void* pNext;
244 (VkImageViewCreateFlags)0, // VkImageViewCreateFlags flags;
245 image, // VkImage image;
246 viewType, // VkImageViewType viewType;
247 format, // VkFormat format;
248 makeComponentMappingRGBA(), // VkComponentMapping components;
249 subresourceRange, // VkImageSubresourceRange subresourceRange;
251 return createImageView(vk, device, &imageViewParams);
254 VkBufferImageCopy makeBufferImageCopy (const VkImageSubresourceLayers subresourceLayers,
255 const VkExtent3D extent)
257 const VkBufferImageCopy copyParams =
259 0ull, // VkDeviceSize bufferOffset;
260 0u, // deUint32 bufferRowLength;
261 0u, // deUint32 bufferImageHeight;
262 subresourceLayers, // VkImageSubresourceLayers imageSubresource;
263 makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
264 extent, // VkExtent3D imageExtent;
269 void beginRenderPassWithRasterizationDisabled (const DeviceInterface& vk,
270 const VkCommandBuffer commandBuffer,
271 const VkRenderPass renderPass,
272 const VkFramebuffer framebuffer)
274 const VkRect2D renderArea = {{ 0, 0 }, { 0, 0 }};
276 beginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea);
279 Move<VkRenderPass> makeRenderPass (const DeviceInterface& vk,
280 const VkDevice device,
281 const VkFormat colorFormat)
283 const VkAttachmentDescription colorAttachmentDescription =
285 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
286 colorFormat, // VkFormat format;
287 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
288 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
289 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
290 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
291 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
292 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout;
293 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout;
296 const VkAttachmentReference colorAttachmentReference =
298 0u, // deUint32 attachment;
299 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout;
302 const VkAttachmentReference depthAttachmentReference =
304 VK_ATTACHMENT_UNUSED, // deUint32 attachment;
305 VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout layout;
308 const VkSubpassDescription subpassDescription =
310 (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags;
311 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
312 0u, // deUint32 inputAttachmentCount;
313 DE_NULL, // const VkAttachmentReference* pInputAttachments;
314 1u, // deUint32 colorAttachmentCount;
315 &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments;
316 DE_NULL, // const VkAttachmentReference* pResolveAttachments;
317 &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment;
318 0u, // deUint32 preserveAttachmentCount;
319 DE_NULL // const deUint32* pPreserveAttachments;
322 const VkRenderPassCreateInfo renderPassInfo =
324 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
325 DE_NULL, // const void* pNext;
326 (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags;
327 1u, // deUint32 attachmentCount;
328 &colorAttachmentDescription, // const VkAttachmentDescription* pAttachments;
329 1u, // deUint32 subpassCount;
330 &subpassDescription, // const VkSubpassDescription* pSubpasses;
331 0u, // deUint32 dependencyCount;
332 DE_NULL // const VkSubpassDependency* pDependencies;
335 return createRenderPass(vk, device, &renderPassInfo);
338 Move<VkFramebuffer> makeFramebuffer (const DeviceInterface& vk,
339 const VkDevice device,
340 const VkRenderPass renderPass,
341 const VkImageView colorAttachment,
342 const deUint32 width,
343 const deUint32 height,
344 const deUint32 layers)
346 const VkFramebufferCreateInfo framebufferInfo = {
347 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
348 DE_NULL, // const void* pNext;
349 (VkFramebufferCreateFlags)0, // VkFramebufferCreateFlags flags;
350 renderPass, // VkRenderPass renderPass;
351 1u, // uint32_t attachmentCount;
352 &colorAttachment, // const VkImageView* pAttachments;
353 width, // uint32_t width;
354 height, // uint32_t height;
355 layers, // uint32_t layers;
358 return createFramebuffer(vk, device, &framebufferInfo);
361 GraphicsPipelineBuilder& GraphicsPipelineBuilder::setShader (const DeviceInterface& vk,
362 const VkDevice device,
363 const VkShaderStageFlagBits stage,
364 const ProgramBinary& binary,
365 const VkSpecializationInfo* specInfo)
367 VkShaderModule module;
370 case (VK_SHADER_STAGE_VERTEX_BIT):
371 DE_ASSERT(m_vertexShaderModule.get() == DE_NULL);
372 m_vertexShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
373 module = *m_vertexShaderModule;
376 case (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT):
377 DE_ASSERT(m_tessControlShaderModule.get() == DE_NULL);
378 m_tessControlShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
379 module = *m_tessControlShaderModule;
382 case (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT):
383 DE_ASSERT(m_tessEvaluationShaderModule.get() == DE_NULL);
384 m_tessEvaluationShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
385 module = *m_tessEvaluationShaderModule;
388 case (VK_SHADER_STAGE_GEOMETRY_BIT):
389 DE_ASSERT(m_geometryShaderModule.get() == DE_NULL);
390 m_geometryShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
391 module = *m_geometryShaderModule;
394 case (VK_SHADER_STAGE_FRAGMENT_BIT):
395 DE_ASSERT(m_fragmentShaderModule.get() == DE_NULL);
396 m_fragmentShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
397 module = *m_fragmentShaderModule;
401 DE_FATAL("Invalid shader stage");
405 const VkPipelineShaderStageCreateInfo pipelineShaderStageInfo =
407 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
408 DE_NULL, // const void* pNext;
409 (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags;
410 stage, // VkShaderStageFlagBits stage;
411 module, // VkShaderModule module;
412 "main", // const char* pName;
413 specInfo, // const VkSpecializationInfo* pSpecializationInfo;
416 m_shaderStageFlags |= stage;
417 m_shaderStages.push_back(pipelineShaderStageInfo);
422 GraphicsPipelineBuilder& GraphicsPipelineBuilder::setVertexInputSingleAttribute (const VkFormat vertexFormat, const deUint32 stride)
424 const VkVertexInputBindingDescription bindingDesc =
426 0u, // uint32_t binding;
427 stride, // uint32_t stride;
428 VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
430 const VkVertexInputAttributeDescription attributeDesc =
432 0u, // uint32_t location;
433 0u, // uint32_t binding;
434 vertexFormat, // VkFormat format;
435 0u, // uint32_t offset;
438 m_vertexInputBindings.clear();
439 m_vertexInputBindings.push_back(bindingDesc);
441 m_vertexInputAttributes.clear();
442 m_vertexInputAttributes.push_back(attributeDesc);
448 inline const T* dataPointer (const std::vector<T>& vec)
450 return (vec.size() != 0 ? &vec[0] : DE_NULL);
453 Move<VkPipeline> GraphicsPipelineBuilder::build (const DeviceInterface& vk,
454 const VkDevice device,
455 const VkPipelineLayout pipelineLayout,
456 const VkRenderPass renderPass,
457 PipelineCacheData& pipelineCacheData)
459 const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
461 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
462 DE_NULL, // const void* pNext;
463 (VkPipelineVertexInputStateCreateFlags)0, // VkPipelineVertexInputStateCreateFlags flags;
464 static_cast<deUint32>(m_vertexInputBindings.size()), // uint32_t vertexBindingDescriptionCount;
465 dataPointer(m_vertexInputBindings), // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
466 static_cast<deUint32>(m_vertexInputAttributes.size()), // uint32_t vertexAttributeDescriptionCount;
467 dataPointer(m_vertexInputAttributes), // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
470 const VkPrimitiveTopology topology = (m_shaderStageFlags & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
471 : m_primitiveTopology;
472 const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
474 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
475 DE_NULL, // const void* pNext;
476 (VkPipelineInputAssemblyStateCreateFlags)0, // VkPipelineInputAssemblyStateCreateFlags flags;
477 topology, // VkPrimitiveTopology topology;
478 VK_FALSE, // VkBool32 primitiveRestartEnable;
481 const VkPipelineTessellationStateCreateInfo pipelineTessellationStateInfo =
483 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, // VkStructureType sType;
484 DE_NULL, // const void* pNext;
485 (VkPipelineTessellationStateCreateFlags)0, // VkPipelineTessellationStateCreateFlags flags;
486 m_patchControlPoints, // uint32_t patchControlPoints;
489 const VkViewport viewport = makeViewport(
491 static_cast<float>(m_renderSize.x()), static_cast<float>(m_renderSize.y()),
494 const VkRect2D scissor = {
496 makeExtent2D(m_renderSize.x(), m_renderSize.y()),
499 const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
501 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
502 DE_NULL, // const void* pNext;
503 (VkPipelineViewportStateCreateFlags)0, // VkPipelineViewportStateCreateFlags flags;
504 1u, // uint32_t viewportCount;
505 &viewport, // const VkViewport* pViewports;
506 1u, // uint32_t scissorCount;
507 &scissor, // const VkRect2D* pScissors;
510 const bool isRasterizationDisabled = ((m_shaderStageFlags & VK_SHADER_STAGE_FRAGMENT_BIT) == 0);
511 const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
513 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
514 DE_NULL, // const void* pNext;
515 (VkPipelineRasterizationStateCreateFlags)0, // VkPipelineRasterizationStateCreateFlags flags;
516 VK_FALSE, // VkBool32 depthClampEnable;
517 isRasterizationDisabled, // VkBool32 rasterizerDiscardEnable;
518 VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
519 m_cullModeFlags, // VkCullModeFlags cullMode;
520 m_frontFace, // VkFrontFace frontFace;
521 VK_FALSE, // VkBool32 depthBiasEnable;
522 0.0f, // float depthBiasConstantFactor;
523 0.0f, // float depthBiasClamp;
524 0.0f, // float depthBiasSlopeFactor;
525 1.0f, // float lineWidth;
528 const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
530 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType;
531 DE_NULL, // const void* pNext;
532 (VkPipelineMultisampleStateCreateFlags)0, // VkPipelineMultisampleStateCreateFlags flags;
533 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples;
534 VK_FALSE, // VkBool32 sampleShadingEnable;
535 0.0f, // float minSampleShading;
536 DE_NULL, // const VkSampleMask* pSampleMask;
537 VK_FALSE, // VkBool32 alphaToCoverageEnable;
538 VK_FALSE // VkBool32 alphaToOneEnable;
541 const VkStencilOpState stencilOpState = makeStencilOpState(
542 VK_STENCIL_OP_KEEP, // stencil fail
543 VK_STENCIL_OP_KEEP, // depth & stencil pass
544 VK_STENCIL_OP_KEEP, // depth only fail
545 VK_COMPARE_OP_NEVER, // compare op
550 const VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
552 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
553 DE_NULL, // const void* pNext;
554 (VkPipelineDepthStencilStateCreateFlags)0, // VkPipelineDepthStencilStateCreateFlags flags;
555 VK_FALSE, // VkBool32 depthTestEnable;
556 VK_FALSE, // VkBool32 depthWriteEnable;
557 VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp;
558 VK_FALSE, // VkBool32 depthBoundsTestEnable;
559 VK_FALSE, // VkBool32 stencilTestEnable;
560 stencilOpState, // VkStencilOpState front;
561 stencilOpState, // VkStencilOpState back;
562 0.0f, // float minDepthBounds;
563 1.0f, // float maxDepthBounds;
566 const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
567 const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState =
569 m_blendEnable, // VkBool32 blendEnable;
570 VK_BLEND_FACTOR_SRC_ALPHA, // VkBlendFactor srcColorBlendFactor;
571 VK_BLEND_FACTOR_ONE, // VkBlendFactor dstColorBlendFactor;
572 VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp;
573 VK_BLEND_FACTOR_SRC_ALPHA, // VkBlendFactor srcAlphaBlendFactor;
574 VK_BLEND_FACTOR_ONE, // VkBlendFactor dstAlphaBlendFactor;
575 VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp;
576 colorComponentsAll, // VkColorComponentFlags colorWriteMask;
579 const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
581 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType;
582 DE_NULL, // const void* pNext;
583 (VkPipelineColorBlendStateCreateFlags)0, // VkPipelineColorBlendStateCreateFlags flags;
584 VK_FALSE, // VkBool32 logicOpEnable;
585 VK_LOGIC_OP_COPY, // VkLogicOp logicOp;
586 1u, // deUint32 attachmentCount;
587 &pipelineColorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments;
588 { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConstants[4];
591 const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
593 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
594 DE_NULL, // const void* pNext;
595 (VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags;
596 static_cast<deUint32>(m_shaderStages.size()), // deUint32 stageCount;
597 &m_shaderStages[0], // const VkPipelineShaderStageCreateInfo* pStages;
598 &vertexInputStateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
599 &pipelineInputAssemblyStateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
600 (m_shaderStageFlags & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ? &pipelineTessellationStateInfo : DE_NULL), // const VkPipelineTessellationStateCreateInfo* pTessellationState;
601 (isRasterizationDisabled ? DE_NULL : &pipelineViewportStateInfo), // const VkPipelineViewportStateCreateInfo* pViewportState;
602 &pipelineRasterizationStateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState;
603 (isRasterizationDisabled ? DE_NULL : &pipelineMultisampleStateInfo), // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
604 (isRasterizationDisabled ? DE_NULL : &pipelineDepthStencilStateInfo), // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
605 (isRasterizationDisabled ? DE_NULL : &pipelineColorBlendStateInfo), // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
606 DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
607 pipelineLayout, // VkPipelineLayout layout;
608 renderPass, // VkRenderPass renderPass;
609 0u, // deUint32 subpass;
610 DE_NULL, // VkPipeline basePipelineHandle;
611 0, // deInt32 basePipelineIndex;
615 const vk::Unique<vk::VkPipelineCache> pipelineCache (pipelineCacheData.createPipelineCache(vk, device));
616 vk::Move<vk::VkPipeline> pipeline (createGraphicsPipeline(vk, device, *pipelineCache, &graphicsPipelineInfo));
618 // Refresh data from cache
619 pipelineCacheData.setFromPipelineCache(vk, device, *pipelineCache);
625 void requireFeatures (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const FeatureFlags flags)
627 const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
629 if (((flags & FEATURE_TESSELLATION_SHADER) != 0) && !features.tessellationShader)
630 throw tcu::NotSupportedError("Tessellation shader not supported");
632 if (((flags & FEATURE_GEOMETRY_SHADER) != 0) && !features.geometryShader)
633 throw tcu::NotSupportedError("Geometry shader not supported");
635 if (((flags & FEATURE_SHADER_FLOAT_64) != 0) && !features.shaderFloat64)
636 throw tcu::NotSupportedError("Double-precision floats not supported");
638 if (((flags & FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS) != 0) && !features.vertexPipelineStoresAndAtomics)
639 throw tcu::NotSupportedError("SSBO and image writes not supported in vertex pipeline");
641 if (((flags & FEATURE_FRAGMENT_STORES_AND_ATOMICS) != 0) && !features.fragmentStoresAndAtomics)
642 throw tcu::NotSupportedError("SSBO and image writes not supported in fragment shader");
644 if (((flags & FEATURE_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE) != 0) && !features.shaderTessellationAndGeometryPointSize)
645 throw tcu::NotSupportedError("Tessellation and geometry shaders don't support PointSize built-in");
647 if (((flags & FEATURE_SHADER_STORAGE_IMAGE_EXTENDED_FORMATS) != 0) && !features.shaderStorageImageExtendedFormats)
648 throw tcu::NotSupportedError("Storage image extended formats not supported");
651 std::string getResourceName (const ResourceDescription& resource)
653 std::ostringstream str;
655 if (resource.type == RESOURCE_TYPE_BUFFER)
656 str << "buffer_" << resource.size.x();
657 else if (resource.type == RESOURCE_TYPE_IMAGE)
659 str << "image_" << resource.size.x()
660 << (resource.size.y() > 0 ? "x" + de::toString(resource.size.y()) : "")
661 << (resource.size.z() > 0 ? "x" + de::toString(resource.size.z()) : "")
662 << "_" << de::toLower(getFormatName(resource.imageFormat)).substr(10);
664 else if (isIndirectBuffer(resource.type))
665 str << "indirect_buffer";
672 bool isIndirectBuffer (const ResourceType type)
676 case RESOURCE_TYPE_INDIRECT_BUFFER_DRAW:
677 case RESOURCE_TYPE_INDIRECT_BUFFER_DRAW_INDEXED:
678 case RESOURCE_TYPE_INDIRECT_BUFFER_DISPATCH:
686 PipelineCacheData::PipelineCacheData (void)
690 PipelineCacheData::~PipelineCacheData (void)
694 vk::Move<VkPipelineCache> PipelineCacheData::createPipelineCache (const vk::DeviceInterface& vk, const vk::VkDevice device) const
696 const de::ScopedLock dataLock (m_lock);
697 const struct vk::VkPipelineCacheCreateInfo params =
699 vk::VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
701 (vk::VkPipelineCacheCreateFlags)0,
702 (deUintptr)m_data.size(),
703 (m_data.empty() ? DE_NULL : &m_data[0])
706 return vk::createPipelineCache(vk, device, ¶ms);
709 void PipelineCacheData::setFromPipelineCache (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkPipelineCache pipelineCache)
711 const de::ScopedLock dataLock (m_lock);
712 deUintptr dataSize = 0;
714 VK_CHECK(vk.getPipelineCacheData(device, pipelineCache, &dataSize, DE_NULL));
716 m_data.resize(dataSize);
719 VK_CHECK(vk.getPipelineCacheData(device, pipelineCache, &dataSize, &m_data[0]));