1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Intel Corporation
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and/or associated documentation files (the
10 * "Materials"), to deal in the Materials without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sublicense, and/or sell copies of the Materials, and to
13 * permit persons to whom the Materials are furnished to do so, subject to
14 * the following conditions:
16 * The above copyright notice(s) and this permission notice shall be included
17 * in all copies or substantial portions of the Materials.
19 * The Materials are Confidential Information as defined by the
20 * Khronos Membership Agreement until designated non-confidential by Khronos,
21 * at which point this condition clause shall be removed.
23 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
26 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
27 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
33 * \brief CreateInfo utilities
34 *//*--------------------------------------------------------------------*/
36 #include "vktDynamicStateCreateInfoUtil.hpp"
38 #include "vkImageUtil.hpp"
42 namespace DynamicState
45 ImageSubresourceRange::ImageSubresourceRange ( vk::VkImageAspectFlags _aspectMask,
46 deUint32 _baseMipLevel,
48 deUint32 _baseArrayLayer,
51 aspectMask = _aspectMask;
52 baseMipLevel = _baseMipLevel;
53 mipLevels = _mipLevels;
54 baseArrayLayer = _baseArrayLayer;
55 arraySize = _arraySize;
58 ChannelMapping::ChannelMapping (vk::VkChannelSwizzle _r,
59 vk::VkChannelSwizzle _g,
60 vk::VkChannelSwizzle _b,
61 vk::VkChannelSwizzle _a)
69 ImageViewCreateInfo::ImageViewCreateInfo ( vk::VkImage _image,
70 vk::VkImageViewType _viewType,
72 const vk::VkImageSubresourceRange& _subresourceRange,
73 const vk::VkChannelMapping& _channels,
74 vk::VkImageViewCreateFlags _flags)
76 sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
81 channels.r = _channels.r;
82 channels.g = _channels.g;
83 channels.b = _channels.b;
84 channels.a = _channels.a;
85 subresourceRange = _subresourceRange;
89 ImageViewCreateInfo::ImageViewCreateInfo ( vk::VkImage _image,
90 vk::VkImageViewType _viewType,
92 const vk::VkChannelMapping& _channels,
93 vk::VkImageViewCreateFlags _flags)
95 sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
100 channels.r = _channels.r;
101 channels.g = _channels.g;
102 channels.b = _channels.b;
103 channels.a = _channels.a;
105 vk::VkImageAspectFlags aspectFlags;
106 const tcu::TextureFormat tcuFormat = vk::mapVkFormat(_format);
108 switch (tcuFormat.order)
110 case tcu::TextureFormat::R:
\r
111 case tcu::TextureFormat::A:
\r
112 case tcu::TextureFormat::I:
\r
113 case tcu::TextureFormat::L:
\r
114 case tcu::TextureFormat::LA:
\r
115 case tcu::TextureFormat::RG:
\r
116 case tcu::TextureFormat::RA:
\r
117 case tcu::TextureFormat::RGB:
\r
118 case tcu::TextureFormat::RGBA:
\r
119 case tcu::TextureFormat::ARGB:
\r
120 case tcu::TextureFormat::BGRA:
\r
121 case tcu::TextureFormat::sR:
\r
122 case tcu::TextureFormat::sRG:
\r
123 case tcu::TextureFormat::sRGB:
\r
124 case tcu::TextureFormat::sRGBA:
125 aspectFlags = vk::VK_IMAGE_ASPECT_COLOR_BIT;
127 case tcu::TextureFormat::D:
128 aspectFlags = vk::VK_IMAGE_ASPECT_DEPTH_BIT;
130 case tcu::TextureFormat::S:
131 aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT;
133 case tcu::TextureFormat::DS:
134 aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT | vk::VK_IMAGE_ASPECT_DEPTH_BIT;
137 TCU_FAIL("unhandled format");
140 subresourceRange = ImageSubresourceRange(aspectFlags);;
144 BufferViewCreateInfo::BufferViewCreateInfo (vk::VkBuffer _buffer,
145 vk::VkFormat _format,
146 vk::VkDeviceSize _offset,
147 vk::VkDeviceSize _range)
149 sType = vk::VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
159 BufferCreateInfo::BufferCreateInfo ( vk::VkDeviceSize _size,
160 vk::VkBufferUsageFlags _usage,
161 vk::VkSharingMode _sharingMode,
162 deUint32 _queueFamilyCount,
163 const deUint32* _pQueueFamilyIndices,
164 vk::VkBufferCreateFlags _flags)
166 sType = vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
171 sharingMode = _sharingMode;
172 queueFamilyCount = _queueFamilyCount;
174 if (_queueFamilyCount)
176 m_queueFamilyIndices = std::vector<deUint32>(
177 _pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyCount);
178 pQueueFamilyIndices = &m_queueFamilyIndices[0];
180 pQueueFamilyIndices = _pQueueFamilyIndices;
185 BufferCreateInfo::BufferCreateInfo (const BufferCreateInfo &other)
192 sharingMode = other.sharingMode;
193 queueFamilyCount = other.queueFamilyCount;
195 m_queueFamilyIndices = other.m_queueFamilyIndices;
196 DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyCount);
198 if (m_queueFamilyIndices.size())
200 pQueueFamilyIndices = &m_queueFamilyIndices[0];
204 pQueueFamilyIndices = DE_NULL;
208 BufferCreateInfo & BufferCreateInfo::operator= (const BufferCreateInfo &other)
215 sharingMode = other.sharingMode;
216 queueFamilyCount = other.queueFamilyCount;
218 m_queueFamilyIndices = other.m_queueFamilyIndices;
220 DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyCount);
222 if (m_queueFamilyIndices.size())
224 pQueueFamilyIndices = &m_queueFamilyIndices[0];
228 pQueueFamilyIndices = DE_NULL;
234 ImageCreateInfo::ImageCreateInfo ( vk::VkImageType _imageType,
235 vk::VkFormat _format,
236 vk::VkExtent3D _extent,
240 vk::VkImageTiling _tiling,
241 vk::VkImageUsageFlags _usage,
242 vk::VkSharingMode _sharingMode,
243 deUint32 _queueFamilyCount,
244 const deUint32* _pQueueFamilyIndices,
245 vk::VkImageCreateFlags _flags,
246 vk::VkImageLayout _initialLayout)
248 if (_queueFamilyCount)
250 m_queueFamilyIndices = std::vector<deUint32>(_pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyCount);
253 sType = vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
255 imageType = _imageType;
258 mipLevels = _mipLevels;
259 arraySize = _arraySize;
263 sharingMode = _sharingMode;
264 queueFamilyCount = _queueFamilyCount;
266 if (m_queueFamilyIndices.size())
268 pQueueFamilyIndices = &m_queueFamilyIndices[0];
272 pQueueFamilyIndices = DE_NULL;
276 initialLayout = _initialLayout;
279 FramebufferCreateInfo::FramebufferCreateInfo ( vk::VkRenderPass _renderPass,
280 const std::vector<vk::VkImageView>& atachments,
285 sType = vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
288 renderPass = _renderPass;
289 attachmentCount = static_cast<deUint32>(atachments.size());
293 pAttachments = const_cast<vk::VkImageView *>(&atachments[0]);
301 RenderPassCreateInfo::RenderPassCreateInfo (const std::vector<vk::VkAttachmentDescription>& attachments,
302 const std::vector<vk::VkSubpassDescription>& subpasses,
303 const std::vector<vk::VkSubpassDependency>& dependiences)
305 : m_attachments (attachments.begin(), attachments.end())
306 , m_subpasses (subpasses.begin(), subpasses.end())
307 , m_dependiences (dependiences.begin(), dependiences.end())
308 , m_attachmentsStructs (m_attachments.begin(), m_attachments.end())
309 , m_subpassesStructs (m_subpasses.begin(), m_subpasses.end())
310 , m_dependiencesStructs (m_dependiences.begin(), m_dependiences.end())
312 sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
315 attachmentCount = static_cast<deUint32>(m_attachments.size());
316 pAttachments = &m_attachmentsStructs[0];
317 subpassCount = static_cast<deUint32>(m_subpasses.size());
318 pSubpasses = &m_subpassesStructs[0];
319 dependencyCount = static_cast<deUint32>(m_dependiences.size());
320 pDependencies = &m_dependiencesStructs[0];
323 RenderPassCreateInfo::RenderPassCreateInfo ( deUint32 _attachmentCount,
324 const vk::VkAttachmentDescription* _pAttachments,
325 deUint32 _subpassCount,
326 const vk::VkSubpassDescription* _pSubpasses,
327 deUint32 _dependencyCount,
328 const vk::VkSubpassDependency* _pDependiences)
331 m_attachments = std::vector<AttachmentDescription>(_pAttachments, _pAttachments + _attachmentCount);
332 m_subpasses = std::vector<SubpassDescription>(_pSubpasses, _pSubpasses + _subpassCount);
333 m_dependiences = std::vector<SubpassDependency>(_pDependiences, _pDependiences + _dependencyCount);
335 m_attachmentsStructs = std::vector<vk::VkAttachmentDescription> (m_attachments.begin(), m_attachments.end());
336 m_subpassesStructs = std::vector<vk::VkSubpassDescription> (m_subpasses.begin(), m_subpasses.end());
337 m_dependiencesStructs = std::vector<vk::VkSubpassDependency> (m_dependiences.begin(), m_dependiences.end());
339 sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
342 attachmentCount = static_cast<deUint32>(m_attachments.size());
344 if (attachmentCount) {
345 pAttachments = &m_attachmentsStructs[0];
349 pAttachments = DE_NULL;
352 subpassCount = static_cast<deUint32>(m_subpasses.size());
355 pSubpasses = &m_subpassesStructs[0];
359 pSubpasses = DE_NULL;
362 dependencyCount = static_cast<deUint32>(m_dependiences.size());
364 if (dependencyCount) {
365 pDependencies = &m_dependiencesStructs[0];
369 pDependencies = DE_NULL;
374 RenderPassCreateInfo::addAttachment (vk::VkAttachmentDescription attachment)
377 m_attachments.push_back(attachment);
378 m_attachmentsStructs = std::vector<vk::VkAttachmentDescription>(m_attachments.begin(), m_attachments.end());
379 attachmentCount = static_cast<deUint32>(m_attachments.size());
380 pAttachments = &m_attachmentsStructs[0];
384 RenderPassCreateInfo::addSubpass (vk::VkSubpassDescription subpass)
387 m_subpasses.push_back(subpass);
388 m_subpassesStructs = std::vector<vk::VkSubpassDescription>(m_subpasses.begin(), m_subpasses.end());
389 subpassCount = static_cast<deUint32>(m_subpasses.size());
390 pSubpasses = &m_subpassesStructs[0];
394 RenderPassCreateInfo::addDependency (vk::VkSubpassDependency dependency)
397 m_dependiences.push_back(dependency);
398 m_dependiencesStructs = std::vector<vk::VkSubpassDependency>(m_dependiences.begin(), m_dependiences.end());
400 dependencyCount = static_cast<deUint32>(m_dependiences.size());
401 pDependencies = &m_dependiencesStructs[0];
404 RenderPassBeginInfo::RenderPassBeginInfo ( vk::VkRenderPass _renderPass,
405 vk::VkFramebuffer _framebuffer,
406 vk::VkRect2D _renderArea,
407 const std::vector<vk::VkClearValue>& _clearValues)
410 m_clearValues = _clearValues;
412 sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
414 renderPass = _renderPass;
415 framebuffer = _framebuffer;
416 renderArea = _renderArea;
417 clearValueCount = static_cast<deUint32>(m_clearValues.size());
418 pClearValues = m_clearValues.size() ? &m_clearValues[0] : DE_NULL;
421 CmdPoolCreateInfo::CmdPoolCreateInfo (deUint32 _queueFamilyIndex, unsigned int _flags)
423 sType = vk::VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO;
426 queueFamilyIndex = _queueFamilyIndex;
430 CmdBufferCreateInfo::CmdBufferCreateInfo (vk::VkCmdPool _pool, vk::VkCmdBufferLevel _level, unsigned int _flags)
432 sType = vk::VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
439 AttachmentDescription::AttachmentDescription ( vk::VkFormat _format,
441 vk::VkAttachmentLoadOp _loadOp,
442 vk::VkAttachmentStoreOp _storeOp,
443 vk::VkAttachmentLoadOp _stencilLoadOp,
444 vk::VkAttachmentStoreOp _stencilStoreOp,
445 vk::VkImageLayout _initialLayout,
446 vk::VkImageLayout _finalLayout)
448 sType = vk::VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION;
454 stencilLoadOp = _stencilLoadOp;
455 stencilStoreOp = _stencilStoreOp;
456 initialLayout = _initialLayout;
457 finalLayout = _finalLayout;
460 AttachmentDescription::AttachmentDescription (const vk::VkAttachmentDescription &rhs)
463 DE_ASSERT(rhs.sType == vk::VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION);
464 DE_ASSERT(rhs.pNext == DE_NULL);
469 samples = rhs.samples;
471 storeOp = rhs.storeOp;
472 stencilLoadOp = rhs.stencilLoadOp;
473 stencilStoreOp = rhs.stencilStoreOp;
474 initialLayout = rhs.initialLayout;
475 finalLayout = rhs.finalLayout;
478 AttachmentReference::AttachmentReference (deUint32 _attachment, vk::VkImageLayout _layout)
480 attachment = _attachment;
484 AttachmentReference::AttachmentReference (void)
486 attachment = vk::VK_ATTACHMENT_UNUSED;
487 layout = vk::VK_IMAGE_LAYOUT_UNDEFINED;
490 SubpassDescription::SubpassDescription( vk::VkPipelineBindPoint _pipelineBindPoint,
491 vk::VkSubpassDescriptionFlags _flags,
492 deUint32 _inputCount,
493 const vk::VkAttachmentReference* _inputAttachments,
494 deUint32 _colorCount,
495 const vk::VkAttachmentReference* _colorAttachments,
496 const vk::VkAttachmentReference* _resolveAttachments,
497 vk::VkAttachmentReference _depthStencilAttachment,
498 deUint32 _preserveCount,
499 const vk::VkAttachmentReference* _preserveAttachments)
501 m_InputAttachments = std::vector<vk::VkAttachmentReference>(_inputAttachments, _inputAttachments + _inputCount);
502 m_ColorAttachments = std::vector<vk::VkAttachmentReference>(_colorAttachments, _colorAttachments + _colorCount);
504 if (_resolveAttachments)
506 m_ResolveAttachments = std::vector<vk::VkAttachmentReference>(_resolveAttachments, _resolveAttachments + _colorCount);
509 m_PreserveAttachments = std::vector<vk::VkAttachmentReference>(_preserveAttachments, _preserveAttachments + _preserveCount);
511 sType = vk::VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION;
513 pipelineBindPoint = _pipelineBindPoint;
515 inputCount = _inputCount;
516 pInputAttachments = DE_NULL;
517 colorCount = _colorCount;
518 pColorAttachments = DE_NULL;
519 pResolveAttachments = DE_NULL;
520 depthStencilAttachment = _depthStencilAttachment;
521 pPreserveAttachments = DE_NULL;
522 preserveCount = _preserveCount;
524 if (m_InputAttachments.size()) {
525 pInputAttachments = &m_InputAttachments[0];
528 if (m_ColorAttachments.size()) {
529 pColorAttachments = &m_ColorAttachments[0];
532 if (m_ResolveAttachments.size()) {
533 pResolveAttachments = &m_ResolveAttachments[0];
536 if (m_PreserveAttachments.size()) {
537 pPreserveAttachments = &m_PreserveAttachments[0];
541 SubpassDescription::SubpassDescription (const vk::VkSubpassDescription &rhs)
544 DE_ASSERT(rhs.sType == vk::VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION);
545 DE_ASSERT(rhs.pNext == DE_NULL);
547 *static_cast<vk::VkSubpassDescription*>(this) = rhs;
549 m_InputAttachments = std::vector<vk::VkAttachmentReference>(
550 rhs.pInputAttachments, rhs.pInputAttachments + rhs.inputCount);
552 m_ColorAttachments = std::vector<vk::VkAttachmentReference>(
553 rhs.pColorAttachments, rhs.pColorAttachments + rhs.colorCount);
555 if (rhs.pResolveAttachments) {
556 m_ResolveAttachments = std::vector<vk::VkAttachmentReference>(
557 rhs.pResolveAttachments, rhs.pResolveAttachments + rhs.colorCount);
559 m_PreserveAttachments = std::vector<vk::VkAttachmentReference>(
560 rhs.pPreserveAttachments, rhs.pPreserveAttachments + rhs.preserveCount);
562 if (m_InputAttachments.size()) {
563 pInputAttachments = &m_InputAttachments[0];
565 if (m_ColorAttachments.size()) {
566 pColorAttachments = &m_ColorAttachments[0];
569 if (m_ResolveAttachments.size()) {
570 pResolveAttachments = &m_ResolveAttachments[0];
573 if (m_PreserveAttachments.size()) {
574 pPreserveAttachments = &m_PreserveAttachments[0];
578 SubpassDescription::SubpassDescription (const SubpassDescription &rhs) {
582 SubpassDescription &SubpassDescription::operator= (const SubpassDescription &rhs)
584 *static_cast<vk::VkSubpassDescription*>(this) = rhs;
586 m_InputAttachments = rhs.m_InputAttachments;
587 m_ColorAttachments = rhs.m_ColorAttachments;
588 m_ResolveAttachments = rhs.m_ResolveAttachments;
589 m_PreserveAttachments = rhs.m_PreserveAttachments;
591 if (m_InputAttachments.size()) {
592 pInputAttachments = &m_InputAttachments[0];
594 if (m_ColorAttachments.size()) {
595 pColorAttachments = &m_ColorAttachments[0];
598 if (m_ResolveAttachments.size()) {
599 pResolveAttachments = &m_ResolveAttachments[0];
602 if (m_PreserveAttachments.size()) {
603 pPreserveAttachments = &m_PreserveAttachments[0];
609 SubpassDependency::SubpassDependency ( deUint32 _srcSubpass,
610 deUint32 _destSubpass,
611 vk::VkPipelineStageFlags _srcStageMask,
612 vk::VkPipelineStageFlags _destStageMask,
613 vk::VkMemoryOutputFlags _outputMask,
614 vk::VkMemoryInputFlags _inputMask,
615 vk::VkBool32 _byRegion)
618 sType = vk::VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY;
620 srcSubpass = _srcSubpass;
621 destSubpass = _destSubpass;
622 srcStageMask = _srcStageMask;
623 destStageMask = _destStageMask;
624 outputMask = _outputMask;
625 inputMask = _inputMask;
626 byRegion = _byRegion;
629 SubpassDependency::SubpassDependency (const vk::VkSubpassDependency &rhs)
632 DE_ASSERT(rhs.sType == vk::VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY);
633 DE_ASSERT(rhs.pNext == DE_NULL);
637 srcSubpass = rhs.srcSubpass;
638 destSubpass = rhs.destSubpass;
639 srcStageMask = rhs.srcStageMask;
640 destStageMask = rhs.destStageMask;
641 outputMask = rhs.outputMask;
642 inputMask = rhs.inputMask;
643 byRegion = rhs.byRegion;
646 CmdBufferBeginInfo::CmdBufferBeginInfo (vk::VkCmdBufferOptimizeFlags _flags)
648 sType = vk::VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
650 renderPass = DE_NULL;
652 framebuffer = DE_NULL;
656 CmdBufferBeginInfo::CmdBufferBeginInfo (vk::VkRenderPass _renderPass,
658 vk::VkFramebuffer _framebuffer,
659 vk::VkCmdBufferOptimizeFlags _flags)
662 sType = vk::VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
664 renderPass = _renderPass;
666 framebuffer = _framebuffer;
670 DescriptorPoolCreateInfo::DescriptorPoolCreateInfo (const std::vector<vk::VkDescriptorTypeCount>& typeCounts,
\r
671 vk::VkDescriptorPoolUsage _poolUsage,
\r
673 : m_typeCounts(typeCounts)
675 sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
677 poolUsage = _poolUsage;
679 count = static_cast<deUint32>(m_typeCounts.size());
680 pTypeCount = &m_typeCounts[0];
683 DescriptorPoolCreateInfo& DescriptorPoolCreateInfo::addDescriptors (vk::VkDescriptorType type, deUint32 count)
685 vk::VkDescriptorTypeCount typeCount = { type, count };
686 m_typeCounts.push_back(typeCount);
688 count = static_cast<deUint32>(m_typeCounts.size());
689 pTypeCount = &m_typeCounts[0];
694 DescriptorSetLayoutCreateInfo::DescriptorSetLayoutCreateInfo (deUint32 _count, const vk::VkDescriptorSetLayoutBinding* _pBinding)
696 sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
699 pBinding = _pBinding;
703 PipelineLayoutCreateInfo::PipelineLayoutCreateInfo (deUint32 _descriptorSetCount,
704 const vk::VkDescriptorSetLayout* _pSetLayouts,
705 deUint32 _pushConstantRangeCount,
706 const vk::VkPushConstantRange* _pPushConstantRanges)
707 : m_pushConstantRanges(_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount)
709 for (unsigned int i = 0; i < _descriptorSetCount; i++)
711 m_setLayouts.push_back(_pSetLayouts[i]);
714 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
716 descriptorSetCount = static_cast<deUint32>(m_setLayouts.size());
717 pSetLayouts = descriptorSetCount > 0 ? &m_setLayouts[0] : DE_NULL;
718 pushConstantRangeCount = static_cast<deUint32>(m_pushConstantRanges.size());
720 if (m_pushConstantRanges.size()) {
721 pPushConstantRanges = &m_pushConstantRanges[0];
725 pPushConstantRanges = DE_NULL;
729 PipelineLayoutCreateInfo::PipelineLayoutCreateInfo ( const std::vector<vk::VkDescriptorSetLayout>& setLayouts,
730 deUint32 _pushConstantRangeCount,
731 const vk::VkPushConstantRange* _pPushConstantRanges)
732 : m_setLayouts (setLayouts)
733 , m_pushConstantRanges (_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount)
735 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
738 descriptorSetCount = static_cast<deUint32>(m_setLayouts.size());
740 if (descriptorSetCount)
742 pSetLayouts = &m_setLayouts[0];
746 pSetLayouts = DE_NULL;
749 pushConstantRangeCount = static_cast<deUint32>(m_pushConstantRanges.size());
750 if (pushConstantRangeCount) {
751 pPushConstantRanges = &m_pushConstantRanges[0];
755 pPushConstantRanges = DE_NULL;
760 PipelineCreateInfo::PipelineShaderStage::PipelineShaderStage (vk::VkShader _shader, vk::VkShaderStage _stage)
762 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
766 pSpecializationInfo = DE_NULL;
769 PipelineCreateInfo::VertexInputState::VertexInputState ( deUint32 _bindingCount,
770 const vk::VkVertexInputBindingDescription* _pVertexBindingDescriptions,
771 deUint32 _attributeCount,
772 const vk::VkVertexInputAttributeDescription* _pVertexAttributeDescriptions)
774 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
776 bindingCount = _bindingCount;
777 pVertexBindingDescriptions = _pVertexBindingDescriptions;
778 attributeCount = _attributeCount;
779 pVertexAttributeDescriptions = _pVertexAttributeDescriptions;
782 PipelineCreateInfo::InputAssemblerState::InputAssemblerState ( vk::VkPrimitiveTopology _topology,
783 vk::VkBool32 _primitiveRestartEnable)
785 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
787 topology = _topology;
788 primitiveRestartEnable = _primitiveRestartEnable;
791 PipelineCreateInfo::TesselationState::TesselationState (deUint32 _patchControlPoints)
793 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
795 patchControlPoints = _patchControlPoints;
798 PipelineCreateInfo::ViewportState::ViewportState ( deUint32 _viewportCount,
799 std::vector<vk::VkViewport> _viewports,
800 std::vector<vk::VkRect2D> _scissors)
802 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
804 viewportCount = _viewportCount;
\r
805 scissorCount = _viewportCount;
\r
807 if (!_viewports.size())
\r
809 m_viewports.resize(viewportCount);
\r
810 deMemset(&m_viewports[0], 0, sizeof(m_viewports[0]) * m_viewports.size());
\r
814 m_viewports = _viewports;
\r
817 if (!_scissors.size())
\r
819 m_scissors.resize(scissorCount);
\r
820 deMemset(&m_scissors[0], 0, sizeof(m_scissors[0]) * m_scissors.size());
\r
824 m_scissors = _scissors;
\r
827 pViewports = &m_viewports[0];
\r
828 pScissors = &m_scissors[0];
831 PipelineCreateInfo::ViewportState::ViewportState (const ViewportState &other)
833 sType = other.sType;
\r
835 viewportCount = other.viewportCount;
\r
836 scissorCount = other.scissorCount;
838 m_viewports = std::vector<vk::VkViewport>(other.pViewports, other.pViewports + viewportCount);
839 m_scissors = std::vector<vk::VkRect2D>(other.pScissors, other.pScissors + scissorCount);
841 pViewports = &m_viewports[0];
\r
842 pScissors = &m_scissors[0];
845 PipelineCreateInfo::ViewportState & PipelineCreateInfo::ViewportState::operator= (const ViewportState &other)
847 sType = other.sType;
\r
849 viewportCount = other.viewportCount;
\r
850 scissorCount = other.scissorCount;
852 m_viewports = std::vector<vk::VkViewport>(other.pViewports, other.pViewports + scissorCount);
853 m_scissors = std::vector<vk::VkRect2D>(other.pScissors, other.pScissors + scissorCount);
855 pViewports = &m_viewports[0];
\r
856 pScissors = &m_scissors[0];
860 PipelineCreateInfo::RasterizerState::RasterizerState ( vk::VkBool32 _depthClipEnable,
861 vk::VkBool32 _rasterizerDiscardEnable,
862 vk::VkFillMode _fillMode,
863 vk::VkCullMode _cullMode,
864 vk::VkFrontFace _frontFace,
865 vk::VkBool32 _depthBiasEnable,
\r
867 float _depthBiasClamp,
868 float _slopeScaledDepthBias,
871 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO;
873 depthClipEnable = _depthClipEnable;
874 rasterizerDiscardEnable = _rasterizerDiscardEnable;
875 fillMode = _fillMode;
876 cullMode = _cullMode;
877 frontFace = _frontFace;
879 depthBiasEnable = _depthBiasEnable;
\r
880 depthBias = _depthBias;
881 depthBiasClamp = _depthBiasClamp;
882 slopeScaledDepthBias = _slopeScaledDepthBias;
883 lineWidth = _lineWidth;
886 PipelineCreateInfo::MultiSampleState::MultiSampleState ( deUint32 _rasterSamples,
887 vk::VkBool32 _sampleShadingEnable,
888 float _minSampleShading,
889 const std::vector<vk::VkSampleMask>& _sampleMask)
890 : m_sampleMask(_sampleMask)
892 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
894 rasterSamples = _rasterSamples;
895 sampleShadingEnable = _sampleShadingEnable;
896 minSampleShading = _minSampleShading;
897 pSampleMask = &m_sampleMask[0];
900 PipelineCreateInfo::MultiSampleState::MultiSampleState (const MultiSampleState &other)
902 sType = other.sType;
\r
903 pNext = other.pNext;
\r
904 rasterSamples = other.rasterSamples;
\r
905 sampleShadingEnable = other.sampleShadingEnable;
\r
906 minSampleShading = other.minSampleShading;
\r
908 const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterSamples) / (sizeof(vk::VkSampleMask) * 8);
910 m_sampleMask = std::vector<vk::VkSampleMask>(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen);
\r
911 pSampleMask = &m_sampleMask[0];
914 PipelineCreateInfo::MultiSampleState& PipelineCreateInfo::MultiSampleState::operator= (const MultiSampleState & other)
916 sType = other.sType;
\r
917 pNext = other.pNext;
\r
918 rasterSamples = other.rasterSamples;
\r
919 sampleShadingEnable = other.sampleShadingEnable;
\r
920 minSampleShading = other.minSampleShading;
\r
922 const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterSamples) / (sizeof(vk::VkSampleMask) * 8);
924 m_sampleMask = std::vector<vk::VkSampleMask>(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen);
\r
925 pSampleMask = &m_sampleMask[0];
930 PipelineCreateInfo::ColorBlendState::ColorBlendState ( const std::vector<vk::VkPipelineColorBlendAttachmentState>& _attachments,
931 vk::VkBool32 _alphaToCoverageEnable,
932 vk::VkBool32 _logicOpEnable,
933 vk::VkLogicOp _logicOp,
934 vk::VkBool32 _alphaToOneEnable)
935 : m_attachments(_attachments)
937 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
939 alphaToCoverageEnable = _alphaToCoverageEnable;
940 alphaToOneEnable = _alphaToOneEnable;
941 logicOpEnable = _logicOpEnable;
943 attachmentCount = static_cast<deUint32>(m_attachments.size());
944 pAttachments = &m_attachments[0];
947 PipelineCreateInfo::ColorBlendState::ColorBlendState ( deUint32 _attachmentCount,
948 const vk::VkPipelineColorBlendAttachmentState* _attachments,
949 vk::VkBool32 _alphaToCoverageEnable,
950 vk::VkBool32 _logicOpEnable,
951 vk::VkLogicOp _logicOp,
952 vk::VkBool32 _alphaToOneEnable)
953 : m_attachments(_attachments, _attachments + _attachmentCount)
955 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
957 alphaToCoverageEnable = _alphaToCoverageEnable;
958 alphaToOneEnable = _alphaToOneEnable;
960 logicOpEnable = _logicOpEnable;
962 attachmentCount = _attachmentCount;
963 attachmentCount = static_cast<deUint32>(m_attachments.size());
964 pAttachments = &m_attachments[0];
967 PipelineCreateInfo::ColorBlendState::ColorBlendState (const vk::VkPipelineColorBlendStateCreateInfo &createInfo)
968 : m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount)
970 sType = createInfo.sType;
971 pNext = createInfo.pNext;
972 alphaToCoverageEnable = createInfo.alphaToCoverageEnable;
973 logicOpEnable = createInfo.logicOpEnable;
974 logicOp = createInfo.logicOp;
975 attachmentCount = static_cast<deUint32>(m_attachments.size());
976 pAttachments = &m_attachments[0];
979 PipelineCreateInfo::ColorBlendState::ColorBlendState (const ColorBlendState &createInfo, std::vector<float> _blendConst)
980 : m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount)
982 sType = createInfo.sType;
983 pNext = createInfo.pNext;
984 alphaToCoverageEnable = createInfo.alphaToCoverageEnable;
985 logicOpEnable = createInfo.logicOpEnable;
986 logicOp = createInfo.logicOp;
987 attachmentCount = static_cast<deUint32>(m_attachments.size());
988 pAttachments = &m_attachments[0];
989 deMemcpy(blendConst, &_blendConst[0], 4 * sizeof(float));
992 PipelineCreateInfo::ColorBlendState::Attachment::Attachment ( vk::VkBool32 _blendEnable,
993 vk::VkBlend _srcBlendColor,
994 vk::VkBlend _destBlendColor,
995 vk::VkBlendOp _blendOpColor,
996 vk::VkBlend _srcBlendAlpha,
997 vk::VkBlend _destBlendAlpha,
998 vk::VkBlendOp _blendOpAlpha,
999 deUint8 _channelWriteMask)
1001 blendEnable = _blendEnable;
1002 srcBlendColor = _srcBlendColor;
1003 destBlendColor = _destBlendColor;
1004 blendOpColor = _blendOpColor;
1005 srcBlendAlpha = _srcBlendAlpha;
1006 destBlendAlpha = _destBlendAlpha;
1007 blendOpAlpha = _blendOpAlpha;
1008 channelWriteMask = _channelWriteMask;
1011 PipelineCreateInfo::DepthStencilState::StencilOpState::StencilOpState ( vk::VkStencilOp _stencilFailOp,
1012 vk::VkStencilOp _stencilPassOp,
1013 vk::VkStencilOp _stencilDepthFailOp,
1014 vk::VkCompareOp _stencilCompareOp,
1015 deUint32 _stencilCompareMask,
\r
1016 deUint32 _stencilWriteMask,
\r
1017 deUint32 _stencilReference)
1019 stencilFailOp = _stencilFailOp;
1020 stencilPassOp = _stencilPassOp;
1021 stencilDepthFailOp = _stencilDepthFailOp;
1022 stencilCompareOp = _stencilCompareOp;
1024 stencilCompareMask = _stencilCompareMask;
1025 stencilWriteMask = _stencilWriteMask;
1026 stencilReference = _stencilReference;
1029 PipelineCreateInfo::DepthStencilState::DepthStencilState (vk::VkBool32 _depthTestEnable,
1030 vk::VkBool32 _depthWriteEnable,
1031 vk::VkCompareOp _depthCompareOp,
1032 vk::VkBool32 _depthBoundsTestEnable,
1033 vk::VkBool32 _stencilTestEnable,
1034 StencilOpState _front,
1035 StencilOpState _back,
1036 float _minDepthBounds,
1037 float _maxDepthBounds)
1039 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
1041 depthTestEnable = _depthTestEnable;
1042 depthWriteEnable = _depthWriteEnable;
1043 depthCompareOp = _depthCompareOp;
1044 depthBoundsTestEnable = _depthBoundsTestEnable;
1045 stencilTestEnable = _stencilTestEnable;
1049 minDepthBounds = _minDepthBounds;
1050 maxDepthBounds = _maxDepthBounds;
1053 PipelineCreateInfo::DynamicState::DynamicState (const std::vector<vk::VkDynamicState>& _dynamicStates)
1055 sType = vk::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
1058 if (!_dynamicStates.size())
1060 for (size_t i = 0; i < vk::VK_DYNAMIC_STATE_LAST; ++i)
1062 m_dynamicStates.push_back(static_cast<vk::VkDynamicState>(i));
1066 m_dynamicStates = _dynamicStates;
1068 dynamicStateCount = static_cast<deUint32>(m_dynamicStates.size());
1069 pDynamicStates = &m_dynamicStates[0];
1072 PipelineCreateInfo::DynamicState::DynamicState (const DynamicState &other)
1074 sType = other.sType;
\r
1075 pNext = other.pNext;
1077 dynamicStateCount = other.dynamicStateCount;
1079 m_dynamicStates = std::vector<vk::VkDynamicState>(other.pDynamicStates, other.pDynamicStates + dynamicStateCount);
1080 pDynamicStates = &m_dynamicStates[0];
1083 PipelineCreateInfo::DynamicState & PipelineCreateInfo::DynamicState::operator= (const DynamicState &other)
1085 sType = other.sType;
\r
1086 pNext = other.pNext;
1088 dynamicStateCount = other.dynamicStateCount;
1090 m_dynamicStates = std::vector<vk::VkDynamicState>(other.pDynamicStates, other.pDynamicStates + dynamicStateCount);
1091 pDynamicStates = &m_dynamicStates[0];
1096 PipelineCreateInfo::PipelineCreateInfo (vk::VkPipelineLayout _layout,
1097 vk::VkRenderPass _renderPass,
1099 vk::VkPipelineCreateFlags _flags)
1101 memset(static_cast<vk::VkGraphicsPipelineCreateInfo *>(this), 0,
1102 sizeof(vk::VkGraphicsPipelineCreateInfo));
1104 sType = vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1106 renderPass = _renderPass;
1111 basePipelineHandle = DE_NULL;
1112 basePipelineIndex = 0;
1113 pDynamicState = DE_NULL;
1116 PipelineCreateInfo& PipelineCreateInfo::addShader (const vk::VkPipelineShaderStageCreateInfo &shader)
1118 m_shaders.push_back(shader);
1120 stageCount = static_cast<deUint32>(m_shaders.size());
1121 pStages = &m_shaders[0];
1126 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineVertexInputStateCreateInfo& state)
1128 m_vertexInputState = de::SharedPtr<vk::VkPipelineVertexInputStateCreateInfo>(
1129 new vk::VkPipelineVertexInputStateCreateInfo(state));
1131 pVertexInputState = m_vertexInputState.get();
1136 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineInputAssemblyStateCreateInfo& state)
1138 m_iputAssemblyState = de::SharedPtr<vk::VkPipelineInputAssemblyStateCreateInfo>(
1139 new vk::VkPipelineInputAssemblyStateCreateInfo(state));
1141 pInputAssemblyState = m_iputAssemblyState.get();
1146 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineColorBlendStateCreateInfo& state)
1148 m_colorBlendStateAttachments = std::vector<vk::VkPipelineColorBlendAttachmentState>(
1149 state.pAttachments, state.pAttachments + state.attachmentCount);
1151 m_colorBlendState = de::SharedPtr<vk::VkPipelineColorBlendStateCreateInfo>(
1152 new vk::VkPipelineColorBlendStateCreateInfo(state));
1154 m_colorBlendState->pAttachments = &m_colorBlendStateAttachments[0];
1156 pColorBlendState = m_colorBlendState.get();
1161 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineViewportStateCreateInfo& state)
1163 m_viewports = std::vector<vk::VkViewport>(state.pViewports, state.pViewports + state.viewportCount);
1164 m_scissors = std::vector<vk::VkRect2D>(state.pScissors, state.pScissors + state.scissorCount);
1166 m_viewportState = de::SharedPtr<vk::VkPipelineViewportStateCreateInfo>(
1167 new vk::VkPipelineViewportStateCreateInfo(state));
1169 m_viewportState->pViewports = &m_viewports[0];
1170 m_viewportState->pScissors = &m_scissors[0];
1172 pViewportState = m_viewportState.get();
1177 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDepthStencilStateCreateInfo& state)
1179 m_dynamicDepthStencilState = de::SharedPtr<vk::VkPipelineDepthStencilStateCreateInfo>(
1180 new vk::VkPipelineDepthStencilStateCreateInfo(state));
1182 pDepthStencilState = m_dynamicDepthStencilState.get();
1187 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineTessellationStateCreateInfo& state)
1189 m_tessState = de::SharedPtr<vk::VkPipelineTessellationStateCreateInfo>(
1190 new vk::VkPipelineTessellationStateCreateInfo(state));
1192 pTessellationState = m_tessState.get();
1197 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineRasterStateCreateInfo& state)
1199 m_rasterState = de::SharedPtr<vk::VkPipelineRasterStateCreateInfo>(new vk::VkPipelineRasterStateCreateInfo(state));
1200 pRasterState = m_rasterState.get();
1205 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineMultisampleStateCreateInfo& state)
1208 const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + state.rasterSamples) / ( sizeof(vk::VkSampleMask) * 8 );
1209 m_multisampleStateSampleMask = std::vector<vk::VkSampleMask>(state.pSampleMask, state.pSampleMask + sampleMaskArrayLen);
1211 m_multisampleState = de::SharedPtr<vk::VkPipelineMultisampleStateCreateInfo>(new vk::VkPipelineMultisampleStateCreateInfo(state));
1213 m_multisampleState->pSampleMask = &m_multisampleStateSampleMask[0];
1215 pMultisampleState = m_multisampleState.get();
1219 PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDynamicStateCreateInfo& state)
1221 m_dynamicStates = std::vector<vk::VkDynamicState>(state.pDynamicStates, state.pDynamicStates + state.dynamicStateCount);
1222 m_dynamicState = de::SharedPtr<vk::VkPipelineDynamicStateCreateInfo>(new vk::VkPipelineDynamicStateCreateInfo(state));
1224 m_dynamicState->pDynamicStates = &m_dynamicStates[0];
1226 pDynamicState = m_dynamicState.get();
1231 SamplerCreateInfo::SamplerCreateInfo ( vk::VkTexFilter _magFilter,
1232 vk::VkTexFilter _minFilter,
1233 vk::VkTexMipmapMode _mipMode,
1234 vk::VkTexAddressMode _addressModeU,
1235 vk::VkTexAddressMode _addressModeV,
1236 vk::VkTexAddressMode _addressModeW,
1238 float _maxAnisotropy,
1239 vk::VkBool32 _compareEnable,
1240 vk::VkCompareOp _compareOp,
1243 vk::VkBorderColor _borderColor,
1244 vk::VkBool32 _unnormalizedCoordinates)
1246 sType = vk::VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1248 magFilter = _magFilter;
1249 minFilter = _minFilter;
1251 addressModeU = _addressModeU;
1252 addressModeV = _addressModeV;
1253 addressModeW = _addressModeW;
1254 mipLodBias = _mipLodBias;
1255 maxAnisotropy = _maxAnisotropy;
1256 compareEnable = _compareEnable;
1257 compareOp = _compareOp;
1260 borderColor = _borderColor;
1261 unnormalizedCoordinates = _unnormalizedCoordinates;