/*------------------------------------------------------------------------ * Vulkan Conformance Tests * ------------------------ * * Copyright (c) 2015 The Khronos Group Inc. * Copyright (c) 2015 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief CreateInfo utilities *//*--------------------------------------------------------------------*/ #include "vktDrawCreateInfoUtil.hpp" #include "vkImageUtil.hpp" namespace vkt { namespace Draw { ImageSubresourceRange::ImageSubresourceRange (vk::VkImageAspectFlags _aspectMask, deUint32 _baseMipLevel, deUint32 _levelCount, deUint32 _baseArrayLayer, deUint32 _layerCount) { aspectMask = _aspectMask; baseMipLevel = _baseMipLevel; levelCount = _levelCount; baseArrayLayer = _baseArrayLayer; layerCount = _layerCount; } ComponentMapping::ComponentMapping (vk::VkComponentSwizzle _r, vk::VkComponentSwizzle _g, vk::VkComponentSwizzle _b, vk::VkComponentSwizzle _a) { r = _r; g = _g; b = _b; a = _a; } ImageViewCreateInfo::ImageViewCreateInfo (vk::VkImage _image, vk::VkImageViewType _viewType, vk::VkFormat _format, const vk::VkImageSubresourceRange& _subresourceRange, const vk::VkComponentMapping& _components, vk::VkImageViewCreateFlags _flags) { sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; pNext = DE_NULL; flags = 0u; image = _image; viewType = _viewType; format = _format; components.r = _components.r; components.g = _components.g; components.b = _components.b; components.a = _components.a; subresourceRange = _subresourceRange; flags = _flags; } ImageViewCreateInfo::ImageViewCreateInfo (vk::VkImage _image, vk::VkImageViewType _viewType, vk::VkFormat _format, const vk::VkComponentMapping& _components, vk::VkImageViewCreateFlags _flags) { sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; pNext = DE_NULL; flags = 0u; image = _image; viewType = _viewType; format = _format; components.r = _components.r; components.g = _components.g; components.b = _components.b; components.a = _components.a; vk::VkImageAspectFlags aspectFlags; const tcu::TextureFormat tcuFormat = vk::mapVkFormat(_format); switch (tcuFormat.order) { case tcu::TextureFormat::D: aspectFlags = vk::VK_IMAGE_ASPECT_DEPTH_BIT; break; case tcu::TextureFormat::S: aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT; break; case tcu::TextureFormat::DS: aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT | vk::VK_IMAGE_ASPECT_DEPTH_BIT; break; default: aspectFlags = vk::VK_IMAGE_ASPECT_COLOR_BIT; break; } subresourceRange = ImageSubresourceRange(aspectFlags); flags = _flags; } BufferViewCreateInfo::BufferViewCreateInfo (vk::VkBuffer _buffer, vk::VkFormat _format, vk::VkDeviceSize _offset, vk::VkDeviceSize _range) { sType = vk::VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; pNext = DE_NULL; flags = 0; buffer = _buffer; format = _format; offset = _offset; range = _range; } BufferCreateInfo::BufferCreateInfo (vk::VkDeviceSize _size, vk::VkBufferUsageFlags _usage, vk::VkSharingMode _sharingMode, deUint32 _queueFamilyIndexCount, const deUint32* _pQueueFamilyIndices, vk::VkBufferCreateFlags _flags) { sType = vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; pNext = DE_NULL; size = _size; usage = _usage; flags = _flags; sharingMode = _sharingMode; queueFamilyIndexCount = _queueFamilyIndexCount; if (_queueFamilyIndexCount) { m_queueFamilyIndices = std::vector( _pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyIndexCount); pQueueFamilyIndices = &m_queueFamilyIndices[0]; } else { pQueueFamilyIndices = _pQueueFamilyIndices; } } BufferCreateInfo::BufferCreateInfo (const BufferCreateInfo &other) { sType = other.sType; pNext = other.pNext; size = other.size; usage = other.usage; flags = other.flags; sharingMode = other.sharingMode; queueFamilyIndexCount = other.queueFamilyIndexCount; m_queueFamilyIndices = other.m_queueFamilyIndices; DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyIndexCount); if (m_queueFamilyIndices.size()) { pQueueFamilyIndices = &m_queueFamilyIndices[0]; } else { pQueueFamilyIndices = DE_NULL; } } BufferCreateInfo & BufferCreateInfo::operator= (const BufferCreateInfo &other) { sType = other.sType; pNext = other.pNext; size = other.size; usage = other.usage; flags = other.flags; sharingMode = other.sharingMode; queueFamilyIndexCount = other.queueFamilyIndexCount; m_queueFamilyIndices = other.m_queueFamilyIndices; DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyIndexCount); if (m_queueFamilyIndices.size()) { pQueueFamilyIndices = &m_queueFamilyIndices[0]; } else { pQueueFamilyIndices = DE_NULL; } return *this; } ImageCreateInfo::ImageCreateInfo (vk::VkImageType _imageType, vk::VkFormat _format, vk::VkExtent3D _extent, deUint32 _mipLevels, deUint32 _arrayLayers, vk::VkSampleCountFlagBits _samples, vk::VkImageTiling _tiling, vk::VkImageUsageFlags _usage, vk::VkSharingMode _sharingMode, deUint32 _queueFamilyIndexCount, const deUint32* _pQueueFamilyIndices, vk::VkImageCreateFlags _flags, vk::VkImageLayout _initialLayout) { if (_queueFamilyIndexCount) { m_queueFamilyIndices = std::vector(_pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyIndexCount); } sType = vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; pNext = DE_NULL; flags = _flags; imageType = _imageType; format = _format; extent = _extent; mipLevels = _mipLevels; arrayLayers = _arrayLayers; samples = _samples; tiling = _tiling; usage = _usage; sharingMode = _sharingMode; queueFamilyIndexCount = _queueFamilyIndexCount; if (m_queueFamilyIndices.size()) { pQueueFamilyIndices = &m_queueFamilyIndices[0]; } else { pQueueFamilyIndices = DE_NULL; } initialLayout = _initialLayout; } FramebufferCreateInfo::FramebufferCreateInfo (vk::VkRenderPass _renderPass, const std::vector& atachments, deUint32 _width, deUint32 _height, deUint32 _layers) { sType = vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; pNext = DE_NULL; flags = 0u; renderPass = _renderPass; attachmentCount = static_cast(atachments.size()); if (attachmentCount) { pAttachments = const_cast(&atachments[0]); } width = _width; height = _height; layers = _layers; } RenderPassCreateInfo::RenderPassCreateInfo (const std::vector& attachments, const std::vector& subpasses, const std::vector& dependiences) : m_attachments (attachments.begin(), attachments.end()) , m_subpasses (subpasses.begin(), subpasses.end()) , m_dependiences (dependiences.begin(), dependiences.end()) , m_attachmentsStructs (m_attachments.begin(), m_attachments.end()) , m_subpassesStructs (m_subpasses.begin(), m_subpasses.end()) , m_dependiencesStructs (m_dependiences.begin(), m_dependiences.end()) { sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; pNext = DE_NULL; flags = 0; attachmentCount = static_cast(m_attachments.size()); pAttachments = &m_attachmentsStructs[0]; subpassCount = static_cast(m_subpasses.size()); pSubpasses = &m_subpassesStructs[0]; dependencyCount = static_cast(m_dependiences.size()); pDependencies = &m_dependiencesStructs[0]; } RenderPassCreateInfo::RenderPassCreateInfo (deUint32 _attachmentCount, const vk::VkAttachmentDescription* _pAttachments, deUint32 _subpassCount, const vk::VkSubpassDescription* _pSubpasses, deUint32 _dependencyCount, const vk::VkSubpassDependency* _pDependiences) { m_attachments = std::vector(_pAttachments, _pAttachments + _attachmentCount); m_subpasses = std::vector(_pSubpasses, _pSubpasses + _subpassCount); m_dependiences = std::vector(_pDependiences, _pDependiences + _dependencyCount); m_attachmentsStructs = std::vector (m_attachments.begin(), m_attachments.end()); m_subpassesStructs = std::vector (m_subpasses.begin(), m_subpasses.end()); m_dependiencesStructs = std::vector (m_dependiences.begin(), m_dependiences.end()); sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; pNext = DE_NULL; flags = 0; attachmentCount = static_cast(m_attachments.size()); if (attachmentCount) { pAttachments = &m_attachmentsStructs[0]; } else { pAttachments = DE_NULL; } subpassCount = static_cast(m_subpasses.size()); if (subpassCount) { pSubpasses = &m_subpassesStructs[0]; } else { pSubpasses = DE_NULL; } dependencyCount = static_cast(m_dependiences.size()); if (dependencyCount) { pDependencies = &m_dependiencesStructs[0]; } else { pDependencies = DE_NULL; } } void RenderPassCreateInfo::addAttachment (vk::VkAttachmentDescription attachment) { m_attachments.push_back(attachment); m_attachmentsStructs = std::vector(m_attachments.begin(), m_attachments.end()); attachmentCount = static_cast(m_attachments.size()); pAttachments = &m_attachmentsStructs[0]; } void RenderPassCreateInfo::addSubpass (vk::VkSubpassDescription subpass) { m_subpasses.push_back(subpass); m_subpassesStructs = std::vector(m_subpasses.begin(), m_subpasses.end()); subpassCount = static_cast(m_subpasses.size()); pSubpasses = &m_subpassesStructs[0]; } void RenderPassCreateInfo::addDependency (vk::VkSubpassDependency dependency) { m_dependiences.push_back(dependency); m_dependiencesStructs = std::vector(m_dependiences.begin(), m_dependiences.end()); dependencyCount = static_cast(m_dependiences.size()); pDependencies = &m_dependiencesStructs[0]; } RenderPassBeginInfo::RenderPassBeginInfo (vk::VkRenderPass _renderPass, vk::VkFramebuffer _framebuffer, vk::VkRect2D _renderArea, const std::vector& _clearValues) { m_clearValues = _clearValues; sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; pNext = DE_NULL; renderPass = _renderPass; framebuffer = _framebuffer; renderArea = _renderArea; clearValueCount = static_cast(m_clearValues.size()); pClearValues = m_clearValues.size() ? &m_clearValues[0] : DE_NULL; } CmdPoolCreateInfo::CmdPoolCreateInfo (deUint32 _queueFamilyIndex, unsigned int _flags) { sType = vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; pNext = DE_NULL; queueFamilyIndex = _queueFamilyIndex; flags = _flags; } AttachmentDescription::AttachmentDescription (vk::VkFormat _format, vk::VkSampleCountFlagBits _samples, vk::VkAttachmentLoadOp _loadOp, vk::VkAttachmentStoreOp _storeOp, vk::VkAttachmentLoadOp _stencilLoadOp, vk::VkAttachmentStoreOp _stencilStoreOp, vk::VkImageLayout _initialLayout, vk::VkImageLayout _finalLayout) { flags = 0; format = _format; samples = _samples; loadOp = _loadOp; storeOp = _storeOp; stencilLoadOp = _stencilLoadOp; stencilStoreOp = _stencilStoreOp; initialLayout = _initialLayout; finalLayout = _finalLayout; } AttachmentDescription::AttachmentDescription (const vk::VkAttachmentDescription& rhs) { flags = rhs.flags; format = rhs.format; samples = rhs.samples; loadOp = rhs.loadOp; storeOp = rhs.storeOp; stencilLoadOp = rhs.stencilLoadOp; stencilStoreOp = rhs.stencilStoreOp; initialLayout = rhs.initialLayout; finalLayout = rhs.finalLayout; } AttachmentReference::AttachmentReference (deUint32 _attachment, vk::VkImageLayout _layout) { attachment = _attachment; layout = _layout; } AttachmentReference::AttachmentReference (void) { attachment = VK_ATTACHMENT_UNUSED; layout = vk::VK_IMAGE_LAYOUT_UNDEFINED; } SubpassDescription::SubpassDescription (vk::VkPipelineBindPoint _pipelineBindPoint, vk::VkSubpassDescriptionFlags _flags, deUint32 _inputAttachmentCount, const vk::VkAttachmentReference* _inputAttachments, deUint32 _colorAttachmentCount, const vk::VkAttachmentReference* _colorAttachments, const vk::VkAttachmentReference* _resolveAttachments, vk::VkAttachmentReference depthStencilAttachment, deUint32 _preserveAttachmentCount, const deUint32* _preserveAttachments) { m_inputAttachments = std::vector(_inputAttachments, _inputAttachments + _inputAttachmentCount); m_colorAttachments = std::vector(_colorAttachments, _colorAttachments + _colorAttachmentCount); if (_resolveAttachments) m_resolveAttachments = std::vector(_resolveAttachments, _resolveAttachments + _colorAttachmentCount); m_preserveAttachments = std::vector(_preserveAttachments, _preserveAttachments + _preserveAttachmentCount); m_depthStencilAttachment = depthStencilAttachment; flags = _flags; pipelineBindPoint = _pipelineBindPoint; inputAttachmentCount = _inputAttachmentCount; pInputAttachments = DE_NULL; colorAttachmentCount = _colorAttachmentCount; pColorAttachments = DE_NULL; pResolveAttachments = DE_NULL; pDepthStencilAttachment = &m_depthStencilAttachment; pPreserveAttachments = DE_NULL; preserveAttachmentCount = _preserveAttachmentCount; if (!m_inputAttachments.empty()) pInputAttachments = &m_inputAttachments[0]; if (!m_colorAttachments.empty()) pColorAttachments = &m_colorAttachments[0]; if (!m_resolveAttachments.empty()) pResolveAttachments = &m_resolveAttachments[0]; if (!m_preserveAttachments.empty()) pPreserveAttachments = &m_preserveAttachments[0]; } SubpassDescription::SubpassDescription (const vk::VkSubpassDescription& rhs) { *static_cast(this) = rhs; m_inputAttachments = std::vector( rhs.pInputAttachments, rhs.pInputAttachments + rhs.inputAttachmentCount); m_colorAttachments = std::vector( rhs.pColorAttachments, rhs.pColorAttachments + rhs.colorAttachmentCount); if (rhs.pResolveAttachments) m_resolveAttachments = std::vector( rhs.pResolveAttachments, rhs.pResolveAttachments + rhs.colorAttachmentCount); m_preserveAttachments = std::vector( rhs.pPreserveAttachments, rhs.pPreserveAttachments + rhs.preserveAttachmentCount); if (rhs.pDepthStencilAttachment) m_depthStencilAttachment = *rhs.pDepthStencilAttachment; if (!m_inputAttachments.empty()) pInputAttachments = &m_inputAttachments[0]; if (!m_colorAttachments.empty()) pColorAttachments = &m_colorAttachments[0]; if (!m_resolveAttachments.empty()) pResolveAttachments = &m_resolveAttachments[0]; pDepthStencilAttachment = &m_depthStencilAttachment; if (!m_preserveAttachments.empty()) pPreserveAttachments = &m_preserveAttachments[0]; } SubpassDescription::SubpassDescription (const SubpassDescription& rhs) { *this = rhs; } SubpassDescription& SubpassDescription::operator= (const SubpassDescription& rhs) { *static_cast(this) = rhs; m_inputAttachments = rhs.m_inputAttachments; m_colorAttachments = rhs.m_colorAttachments; m_resolveAttachments = rhs.m_resolveAttachments; m_preserveAttachments = rhs.m_preserveAttachments; m_depthStencilAttachment = rhs.m_depthStencilAttachment; if (!m_inputAttachments.empty()) pInputAttachments = &m_inputAttachments[0]; if (!m_colorAttachments.empty()) pColorAttachments = &m_colorAttachments[0]; if (!m_resolveAttachments.empty()) pResolveAttachments = &m_resolveAttachments[0]; pDepthStencilAttachment = &m_depthStencilAttachment; if (!m_preserveAttachments.empty()) pPreserveAttachments = &m_preserveAttachments[0]; return *this; } SubpassDependency::SubpassDependency (deUint32 _srcSubpass, deUint32 _dstSubpass, vk::VkPipelineStageFlags _srcStageMask, vk::VkPipelineStageFlags _dstStageMask, vk::VkAccessFlags _srcAccessMask, vk::VkAccessFlags _dstAccessMask, vk::VkDependencyFlags _dependencyFlags) { srcSubpass = _srcSubpass; dstSubpass = _dstSubpass; srcStageMask = _srcStageMask; dstStageMask = _dstStageMask; srcAccessMask = _srcAccessMask; dstAccessMask = _dstAccessMask; dependencyFlags = _dependencyFlags; } SubpassDependency::SubpassDependency (const vk::VkSubpassDependency& rhs) { srcSubpass = rhs.srcSubpass; dstSubpass = rhs.dstSubpass; srcStageMask = rhs.srcStageMask; dstStageMask = rhs.dstStageMask; srcAccessMask = rhs.srcAccessMask; dstAccessMask = rhs.dstAccessMask; dependencyFlags = rhs.dependencyFlags; } CmdBufferBeginInfo::CmdBufferBeginInfo (vk::VkCommandBufferUsageFlags _flags) { sType = vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; pNext = DE_NULL; flags = _flags; pInheritanceInfo = DE_NULL; } DescriptorPoolCreateInfo::DescriptorPoolCreateInfo (const std::vector& poolSizeCounts, vk::VkDescriptorPoolCreateFlags _flags, deUint32 _maxSets) : m_poolSizeCounts(poolSizeCounts) { sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; pNext = DE_NULL; flags = _flags; maxSets = _maxSets; poolSizeCount = static_cast(m_poolSizeCounts.size()); pPoolSizes = &m_poolSizeCounts[0]; } DescriptorPoolCreateInfo& DescriptorPoolCreateInfo::addDescriptors (vk::VkDescriptorType type, deUint32 count) { vk::VkDescriptorPoolSize descriptorTypeCount = { type, count }; m_poolSizeCounts.push_back(descriptorTypeCount); poolSizeCount = static_cast(m_poolSizeCounts.size()); pPoolSizes = &m_poolSizeCounts[0]; return *this; } DescriptorSetLayoutCreateInfo::DescriptorSetLayoutCreateInfo (deUint32 _bindingCount, const vk::VkDescriptorSetLayoutBinding* _pBindings) { sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; pNext = DE_NULL; flags = 0; bindingCount = _bindingCount; pBindings = _pBindings; } PipelineLayoutCreateInfo::PipelineLayoutCreateInfo (deUint32 _descriptorSetCount, const vk::VkDescriptorSetLayout* _pSetLayouts, deUint32 _pushConstantRangeCount, const vk::VkPushConstantRange* _pPushConstantRanges) : m_pushConstantRanges(_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount) { for (unsigned int i = 0; i < _descriptorSetCount; i++) { m_setLayouts.push_back(_pSetLayouts[i]); } sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pNext = DE_NULL; flags = 0; setLayoutCount = static_cast(m_setLayouts.size()); pSetLayouts = setLayoutCount > 0 ? &m_setLayouts[0] : DE_NULL; pushConstantRangeCount = static_cast(m_pushConstantRanges.size()); if (m_pushConstantRanges.size()) { pPushConstantRanges = &m_pushConstantRanges[0]; } else { pPushConstantRanges = DE_NULL; } } PipelineLayoutCreateInfo::PipelineLayoutCreateInfo (const std::vector& setLayouts, deUint32 _pushConstantRangeCount, const vk::VkPushConstantRange* _pPushConstantRanges) : m_setLayouts (setLayouts) , m_pushConstantRanges (_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pNext = DE_NULL; flags = 0; setLayoutCount = static_cast(m_setLayouts.size()); if (setLayoutCount) { pSetLayouts = &m_setLayouts[0]; } else { pSetLayouts = DE_NULL; } pushConstantRangeCount = static_cast(m_pushConstantRanges.size()); if (pushConstantRangeCount) { pPushConstantRanges = &m_pushConstantRanges[0]; } else { pPushConstantRanges = DE_NULL; } } PipelineCreateInfo::PipelineShaderStage::PipelineShaderStage (vk::VkShaderModule _module, const char* _pName, vk::VkShaderStageFlagBits _stage) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; pNext = DE_NULL; flags = 0u; stage = _stage; module = _module; pName = _pName; pSpecializationInfo = DE_NULL; } PipelineCreateInfo::VertexInputState::VertexInputState (deUint32 _vertexBindingDescriptionCount, const vk::VkVertexInputBindingDescription* _pVertexBindingDescriptions, deUint32 _vertexAttributeDescriptionCount, const vk::VkVertexInputAttributeDescription* _pVertexAttributeDescriptions) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0u; vertexBindingDescriptionCount = _vertexBindingDescriptionCount; pVertexBindingDescriptions = _pVertexBindingDescriptions; vertexAttributeDescriptionCount = _vertexAttributeDescriptionCount; pVertexAttributeDescriptions = _pVertexAttributeDescriptions; } PipelineCreateInfo::VertexInputState& PipelineCreateInfo::VertexInputState::addDivisors (deUint32 _vertexBindingDivisorCount, const vk::VkVertexInputBindingDivisorDescriptionEXT* _pVertexBindingDivisors) { m_divisorState.sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT; m_divisorState.vertexBindingDivisorCount = _vertexBindingDivisorCount; m_divisorState.pVertexBindingDivisors = _pVertexBindingDivisors; // Link it into the chainadd m_divisorState.pNext = this->pNext; pNext = &m_divisorState; return *this; } PipelineCreateInfo::InputAssemblerState::InputAssemblerState (vk::VkPrimitiveTopology _topology, vk::VkBool32 _primitiveRestartEnable) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0u; topology = _topology; primitiveRestartEnable = _primitiveRestartEnable; } PipelineCreateInfo::TessellationState::TessellationState (deUint32 _patchControlPoints) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0; patchControlPoints = _patchControlPoints; } PipelineCreateInfo::ViewportState::ViewportState (deUint32 _viewportCount, std::vector _viewports, std::vector _scissors) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0u; viewportCount = _viewportCount; scissorCount = _viewportCount; if (!_viewports.size()) { m_viewports.resize(viewportCount); deMemset(&m_viewports[0], 0, sizeof(m_viewports[0]) * m_viewports.size()); } else { m_viewports = _viewports; } if (!_scissors.size()) { m_scissors.resize(scissorCount); deMemset(&m_scissors[0], 0, sizeof(m_scissors[0]) * m_scissors.size()); } else { m_scissors = _scissors; } pViewports = &m_viewports[0]; pScissors = &m_scissors[0]; } PipelineCreateInfo::ViewportState::ViewportState (const ViewportState& other) { sType = other.sType; pNext = other.pNext; flags = other.flags; viewportCount = other.viewportCount; scissorCount = other.scissorCount; m_viewports = std::vector(other.pViewports, other.pViewports + viewportCount); m_scissors = std::vector(other.pScissors, other.pScissors + scissorCount); pViewports = &m_viewports[0]; pScissors = &m_scissors[0]; } PipelineCreateInfo::ViewportState& PipelineCreateInfo::ViewportState::operator= (const ViewportState& other) { sType = other.sType; pNext = other.pNext; flags = other.flags; viewportCount = other.viewportCount; scissorCount = other.scissorCount; m_viewports = std::vector(other.pViewports, other.pViewports + scissorCount); m_scissors = std::vector(other.pScissors, other.pScissors + scissorCount); pViewports = &m_viewports[0]; pScissors = &m_scissors[0]; return *this; } PipelineCreateInfo::RasterizerState::RasterizerState (vk::VkBool32 _depthClampEnable, vk::VkBool32 _rasterizerDiscardEnable, vk::VkPolygonMode _polygonMode, vk::VkCullModeFlags _cullMode, vk::VkFrontFace _frontFace, vk::VkBool32 _depthBiasEnable, float _depthBiasConstantFactor, float _depthBiasClamp, float _depthBiasSlopeFactor, float _lineWidth) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0u; depthClampEnable = _depthClampEnable; rasterizerDiscardEnable = _rasterizerDiscardEnable; polygonMode = _polygonMode; cullMode = _cullMode; frontFace = _frontFace; depthBiasEnable = _depthBiasEnable; depthBiasConstantFactor = _depthBiasConstantFactor; depthBiasClamp = _depthBiasClamp; depthBiasSlopeFactor = _depthBiasSlopeFactor; lineWidth = _lineWidth; } PipelineCreateInfo::MultiSampleState::MultiSampleState (vk::VkSampleCountFlagBits _rasterizationSamples, vk::VkBool32 _sampleShadingEnable, float _minSampleShading, const std::vector& _sampleMask, bool _alphaToCoverageEnable, bool _alphaToOneEnable) : m_sampleMask(_sampleMask) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0u; rasterizationSamples = _rasterizationSamples; sampleShadingEnable = _sampleShadingEnable; minSampleShading = _minSampleShading; pSampleMask = &m_sampleMask[0]; alphaToCoverageEnable = _alphaToCoverageEnable; alphaToOneEnable = _alphaToOneEnable; } PipelineCreateInfo::MultiSampleState::MultiSampleState (const MultiSampleState& other) { sType = other.sType; pNext = other.pNext; flags = other.flags; rasterizationSamples = other.rasterizationSamples; sampleShadingEnable = other.sampleShadingEnable; minSampleShading = other.minSampleShading; const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterizationSamples) / (sizeof(vk::VkSampleMask) * 8); m_sampleMask = std::vector(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen); pSampleMask = &m_sampleMask[0]; } PipelineCreateInfo::MultiSampleState& PipelineCreateInfo::MultiSampleState::operator= (const MultiSampleState& other) { sType = other.sType; pNext = other.pNext; flags = other.flags; rasterizationSamples = other.rasterizationSamples; sampleShadingEnable = other.sampleShadingEnable; minSampleShading = other.minSampleShading; const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterizationSamples) / (sizeof(vk::VkSampleMask) * 8); m_sampleMask = std::vector(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen); pSampleMask = &m_sampleMask[0]; return *this; } PipelineCreateInfo::ColorBlendState::ColorBlendState (const std::vector& _attachments, vk::VkBool32 _logicOpEnable, vk::VkLogicOp _logicOp) : m_attachments(_attachments) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0u; logicOpEnable = _logicOpEnable; logicOp = _logicOp; attachmentCount = static_cast(m_attachments.size()); pAttachments = &m_attachments[0]; deMemset(blendConstants, 0, sizeof(blendConstants)); } PipelineCreateInfo::ColorBlendState::ColorBlendState (deUint32 _attachmentCount, const vk::VkPipelineColorBlendAttachmentState* _attachments, vk::VkBool32 _logicOpEnable, vk::VkLogicOp _logicOp) : m_attachments(_attachments, _attachments + _attachmentCount) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0; logicOpEnable = _logicOpEnable; logicOp = _logicOp; attachmentCount = static_cast(m_attachments.size()); pAttachments = &m_attachments[0]; deMemset(blendConstants, 0, sizeof(blendConstants)); } PipelineCreateInfo::ColorBlendState::ColorBlendState (const vk::VkPipelineColorBlendStateCreateInfo& createInfo) : m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount) { sType = createInfo.sType; pNext = createInfo.pNext; flags = createInfo.flags; logicOpEnable = createInfo.logicOpEnable; logicOp = createInfo.logicOp; attachmentCount = static_cast(m_attachments.size()); pAttachments = &m_attachments[0]; deMemset(blendConstants, 0, sizeof(blendConstants)); } PipelineCreateInfo::ColorBlendState::ColorBlendState (const ColorBlendState& createInfo, std::vector _blendConstants) : m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount) { sType = createInfo.sType; pNext = createInfo.pNext; flags = createInfo.flags; logicOpEnable = createInfo.logicOpEnable; logicOp = createInfo.logicOp; attachmentCount = static_cast(m_attachments.size()); pAttachments = &m_attachments[0]; deMemcpy(blendConstants, &_blendConstants[0], 4 * sizeof(float)); } PipelineCreateInfo::ColorBlendState::Attachment::Attachment (vk::VkBool32 _blendEnable, vk::VkBlendFactor _srcColorBlendFactor, vk::VkBlendFactor _dstColorBlendFactor, vk::VkBlendOp _colorBlendOp, vk::VkBlendFactor _srcAlphaBlendFactor, vk::VkBlendFactor _dstAlphaBlendFactor, vk::VkBlendOp _alphaBlendOp, vk::VkColorComponentFlags _colorWriteMask) { blendEnable = _blendEnable; srcColorBlendFactor = _srcColorBlendFactor; dstColorBlendFactor = _dstColorBlendFactor; colorBlendOp = _colorBlendOp; srcAlphaBlendFactor = _srcAlphaBlendFactor; dstAlphaBlendFactor = _dstAlphaBlendFactor; alphaBlendOp = _alphaBlendOp; colorWriteMask = _colorWriteMask; } PipelineCreateInfo::DepthStencilState::StencilOpState::StencilOpState (vk::VkStencilOp _failOp, vk::VkStencilOp _passOp, vk::VkStencilOp _depthFailOp, vk::VkCompareOp _compareOp, deUint32 _compareMask, deUint32 _writeMask, deUint32 _reference) { failOp = _failOp; passOp = _passOp; depthFailOp = _depthFailOp; compareOp = _compareOp; compareMask = _compareMask; writeMask = _writeMask; reference = _reference; } PipelineCreateInfo::DepthStencilState::DepthStencilState (vk::VkBool32 _depthTestEnable, vk::VkBool32 _depthWriteEnable, vk::VkCompareOp _depthCompareOp, vk::VkBool32 _depthBoundsTestEnable, vk::VkBool32 _stencilTestEnable, StencilOpState _front, StencilOpState _back, float _minDepthBounds, float _maxDepthBounds) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0u; depthTestEnable = _depthTestEnable; depthWriteEnable = _depthWriteEnable; depthCompareOp = _depthCompareOp; depthBoundsTestEnable = _depthBoundsTestEnable; stencilTestEnable = _stencilTestEnable; front = _front; back = _back; minDepthBounds = _minDepthBounds; maxDepthBounds = _maxDepthBounds; } PipelineCreateInfo::DynamicState::DynamicState (const std::vector& _dynamicStates) { sType = vk::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; pNext = DE_NULL; flags = 0; if (!_dynamicStates.size()) { const vk::VkDynamicState dynamicState[] = { vk::VK_DYNAMIC_STATE_VIEWPORT, vk::VK_DYNAMIC_STATE_SCISSOR, vk::VK_DYNAMIC_STATE_LINE_WIDTH, vk::VK_DYNAMIC_STATE_DEPTH_BIAS, vk::VK_DYNAMIC_STATE_BLEND_CONSTANTS, vk::VK_DYNAMIC_STATE_DEPTH_BOUNDS, vk::VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, vk::VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, vk::VK_DYNAMIC_STATE_STENCIL_REFERENCE, }; for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(dynamicState); ++i) { m_dynamicStates.push_back(dynamicState[i]); } } else m_dynamicStates = _dynamicStates; dynamicStateCount = static_cast(m_dynamicStates.size()); pDynamicStates = &m_dynamicStates[0]; } PipelineCreateInfo::DynamicState::DynamicState (const DynamicState &other) { sType = other.sType; pNext = other.pNext; flags = other.flags; dynamicStateCount = other.dynamicStateCount; m_dynamicStates = std::vector(other.pDynamicStates, other.pDynamicStates + dynamicStateCount); pDynamicStates = &m_dynamicStates[0]; } PipelineCreateInfo::DynamicState& PipelineCreateInfo::DynamicState::operator= (const DynamicState& other) { sType = other.sType; pNext = other.pNext; flags = other.flags; dynamicStateCount = other.dynamicStateCount; m_dynamicStates = std::vector(other.pDynamicStates, other.pDynamicStates + dynamicStateCount); pDynamicStates = &m_dynamicStates[0]; return *this; } PipelineCreateInfo::PipelineCreateInfo (vk::VkPipelineLayout _layout, vk::VkRenderPass _renderPass, int _subpass, vk::VkPipelineCreateFlags _flags) { deMemset(static_cast(this), 0, sizeof(vk::VkGraphicsPipelineCreateInfo)); sType = vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pNext = DE_NULL; flags = _flags; renderPass = _renderPass; subpass = _subpass; layout = _layout; basePipelineHandle = DE_NULL; basePipelineIndex = 0; pDynamicState = DE_NULL; } PipelineCreateInfo& PipelineCreateInfo::addShader (const vk::VkPipelineShaderStageCreateInfo& shader) { m_shaders.push_back(shader); stageCount = static_cast(m_shaders.size()); pStages = &m_shaders[0]; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineVertexInputStateCreateInfo& state) { m_vertexInputState = state; pVertexInputState = &m_vertexInputState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineInputAssemblyStateCreateInfo& state) { m_inputAssemblyState = state; pInputAssemblyState = &m_inputAssemblyState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineColorBlendStateCreateInfo& state) { m_colorBlendStateAttachments = std::vector(state.pAttachments, state.pAttachments + state.attachmentCount); m_colorBlendState = state; m_colorBlendState.pAttachments = &m_colorBlendStateAttachments[0]; pColorBlendState = &m_colorBlendState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineViewportStateCreateInfo& state) { m_viewports = std::vector(state.pViewports, state.pViewports + state.viewportCount); m_scissors = std::vector(state.pScissors, state.pScissors + state.scissorCount); m_viewportState = state; m_viewportState.pViewports = &m_viewports[0]; m_viewportState.pScissors = &m_scissors[0]; pViewportState = &m_viewportState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDepthStencilStateCreateInfo& state) { m_dynamicDepthStencilState = state; pDepthStencilState = &m_dynamicDepthStencilState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineTessellationStateCreateInfo& state) { m_tessState = state; pTessellationState = &m_tessState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineRasterizationStateCreateInfo& state) { m_rasterState = state; pRasterizationState = &m_rasterState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineMultisampleStateCreateInfo& state) { const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + state.rasterizationSamples) / ( sizeof(vk::VkSampleMask) * 8 ); m_multisampleState = state; if (state.pSampleMask != DE_NULL) { m_multisampleStateSampleMask = std::vector(state.pSampleMask, state.pSampleMask + sampleMaskArrayLen); m_multisampleState.pSampleMask = &m_multisampleStateSampleMask[0]; } pMultisampleState = &m_multisampleState; return *this; } PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDynamicStateCreateInfo& state) { m_dynamicStates = std::vector(state.pDynamicStates, state.pDynamicStates + state.dynamicStateCount); m_dynamicState = state; m_dynamicState.pDynamicStates = &m_dynamicStates[0]; pDynamicState = &m_dynamicState; return *this; } SamplerCreateInfo::SamplerCreateInfo (vk::VkFilter _magFilter, vk::VkFilter _minFilter, vk::VkSamplerMipmapMode _mipmapMode, vk::VkSamplerAddressMode _addressModeU, vk::VkSamplerAddressMode _addressModeV, vk::VkSamplerAddressMode _addressModeW, float _mipLodBias, vk::VkBool32 _anisotropyEnable, float _maxAnisotropy, vk::VkBool32 _compareEnable, vk::VkCompareOp _compareOp, float _minLod, float _maxLod, vk::VkBorderColor _borderColor, vk::VkBool32 _unnormalizedCoordinates) { sType = vk::VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; pNext = DE_NULL; flags = 0u; magFilter = _magFilter; minFilter = _minFilter; mipmapMode = _mipmapMode; addressModeU = _addressModeU; addressModeV = _addressModeV; addressModeW = _addressModeW; mipLodBias = _mipLodBias; anisotropyEnable = _anisotropyEnable; maxAnisotropy = _maxAnisotropy; compareEnable = _compareEnable; compareOp = _compareOp; minLod = _minLod; maxLod = _maxLod; borderColor = _borderColor; unnormalizedCoordinates = _unnormalizedCoordinates; } } // Draw } // vkt