1e5c31af7Sopenharmony_ci#ifndef _VKOBJUTIL_HPP 2e5c31af7Sopenharmony_ci#define _VKOBJUTIL_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci * Vulkan CTS Framework 5e5c31af7Sopenharmony_ci * -------------------- 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright (c) 2015 Google Inc. 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci *//*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief Utilities for creating commonly used Vulkan objects 24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include <vector> 27e5c31af7Sopenharmony_ci#include <memory> 28e5c31af7Sopenharmony_ci#include "vkRef.hpp" 29e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp" 30e5c31af7Sopenharmony_ci 31e5c31af7Sopenharmony_cinamespace vk 32e5c31af7Sopenharmony_ci{ 33e5c31af7Sopenharmony_ci 34e5c31af7Sopenharmony_cistruct CommandPoolWithBuffer { 35e5c31af7Sopenharmony_ci Move<VkCommandPool> cmdPool; 36e5c31af7Sopenharmony_ci Move<VkCommandBuffer> cmdBuffer; 37e5c31af7Sopenharmony_ci 38e5c31af7Sopenharmony_ci CommandPoolWithBuffer(const DeviceInterface& vkd, const VkDevice device, const deUint32 queueFamilyIndex); 39e5c31af7Sopenharmony_ci}; 40e5c31af7Sopenharmony_ci 41e5c31af7Sopenharmony_ciMove<VkPipeline> makeComputePipeline (const DeviceInterface& vk, 42e5c31af7Sopenharmony_ci const VkDevice device, 43e5c31af7Sopenharmony_ci const VkPipelineLayout pipelineLayout, 44e5c31af7Sopenharmony_ci const VkPipelineCreateFlags pipelineFlags, 45e5c31af7Sopenharmony_ci const void* pipelinePNext, 46e5c31af7Sopenharmony_ci const VkShaderModule shaderModule, 47e5c31af7Sopenharmony_ci const VkPipelineShaderStageCreateFlags shaderFlags, 48e5c31af7Sopenharmony_ci const VkSpecializationInfo* specializationInfo = DE_NULL, 49e5c31af7Sopenharmony_ci const VkPipelineCache pipelineCache = DE_NULL, 50e5c31af7Sopenharmony_ci const uint32_t subgroupSize = 0); 51e5c31af7Sopenharmony_ci 52e5c31af7Sopenharmony_ciMove<VkPipeline> makeComputePipeline (const DeviceInterface& vk, 53e5c31af7Sopenharmony_ci VkDevice device, 54e5c31af7Sopenharmony_ci VkPipelineLayout pipelineLayout, 55e5c31af7Sopenharmony_ci VkShaderModule shaderModule); 56e5c31af7Sopenharmony_ci 57e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk, 58e5c31af7Sopenharmony_ci const VkDevice device, 59e5c31af7Sopenharmony_ci const VkPipelineLayout pipelineLayout, 60e5c31af7Sopenharmony_ci const VkShaderModule vertexShaderModule, 61e5c31af7Sopenharmony_ci const VkShaderModule tessellationControlShaderModule, 62e5c31af7Sopenharmony_ci const VkShaderModule tessellationEvalShaderModule, 63e5c31af7Sopenharmony_ci const VkShaderModule geometryShaderModule, 64e5c31af7Sopenharmony_ci const VkShaderModule fragmentShaderModule, 65e5c31af7Sopenharmony_ci const VkRenderPass renderPass, 66e5c31af7Sopenharmony_ci const std::vector<VkViewport>& viewports, 67e5c31af7Sopenharmony_ci const std::vector<VkRect2D>& scissors, 68e5c31af7Sopenharmony_ci const VkPrimitiveTopology topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 69e5c31af7Sopenharmony_ci const deUint32 subpass = 0u, 70e5c31af7Sopenharmony_ci const deUint32 patchControlPoints = 0u, 71e5c31af7Sopenharmony_ci const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo = DE_NULL, 72e5c31af7Sopenharmony_ci const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo = DE_NULL, 73e5c31af7Sopenharmony_ci const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo = DE_NULL, 74e5c31af7Sopenharmony_ci const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo = DE_NULL, 75e5c31af7Sopenharmony_ci const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo = DE_NULL, 76e5c31af7Sopenharmony_ci const VkPipelineDynamicStateCreateInfo* dynamicStateCreateInfo = DE_NULL, 77e5c31af7Sopenharmony_ci const void* pNext = DE_NULL, 78e5c31af7Sopenharmony_ci const VkPipelineCreateFlags pipelineCreateFlags = 0u); 79e5c31af7Sopenharmony_ci 80e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk, 81e5c31af7Sopenharmony_ci const VkDevice device, 82e5c31af7Sopenharmony_ci const VkPipelineLayout pipelineLayout, 83e5c31af7Sopenharmony_ci const VkShaderModule vertexShaderModule, 84e5c31af7Sopenharmony_ci const VkShaderModule tessellationControlShaderModule, 85e5c31af7Sopenharmony_ci const VkShaderModule tessellationEvalShaderModule, 86e5c31af7Sopenharmony_ci const VkShaderModule geometryShaderModule, 87e5c31af7Sopenharmony_ci const VkShaderModule fragmentShaderModule, 88e5c31af7Sopenharmony_ci const VkRenderPass renderPass, 89e5c31af7Sopenharmony_ci const deUint32 subpass = 0u, 90e5c31af7Sopenharmony_ci const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo = DE_NULL, 91e5c31af7Sopenharmony_ci const VkPipelineInputAssemblyStateCreateInfo* inputAssemblyStateCreateInfo = DE_NULL, 92e5c31af7Sopenharmony_ci const VkPipelineTessellationStateCreateInfo* tessStateCreateInfo = DE_NULL, 93e5c31af7Sopenharmony_ci const VkPipelineViewportStateCreateInfo* viewportStateCreateInfo = DE_NULL, 94e5c31af7Sopenharmony_ci const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo = DE_NULL, 95e5c31af7Sopenharmony_ci const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo = DE_NULL, 96e5c31af7Sopenharmony_ci const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo = DE_NULL, 97e5c31af7Sopenharmony_ci const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo = DE_NULL, 98e5c31af7Sopenharmony_ci const VkPipelineDynamicStateCreateInfo* dynamicStateCreateInfo = DE_NULL, 99e5c31af7Sopenharmony_ci const void* pNext = DE_NULL, 100e5c31af7Sopenharmony_ci const VkPipelineCreateFlags pipelineCreateFlags = 0u); 101e5c31af7Sopenharmony_ci 102e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 103e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk, 104e5c31af7Sopenharmony_ci const VkDevice device, 105e5c31af7Sopenharmony_ci const VkPipelineLayout pipelineLayout, 106e5c31af7Sopenharmony_ci const VkShaderModule taskShaderModule, 107e5c31af7Sopenharmony_ci const VkShaderModule meshShaderModule, 108e5c31af7Sopenharmony_ci const VkShaderModule fragmentShaderModule, 109e5c31af7Sopenharmony_ci const VkRenderPass renderPass, 110e5c31af7Sopenharmony_ci const std::vector<VkViewport>& viewports, 111e5c31af7Sopenharmony_ci const std::vector<VkRect2D>& scissors, 112e5c31af7Sopenharmony_ci const deUint32 subpass = 0u, 113e5c31af7Sopenharmony_ci const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo = nullptr, 114e5c31af7Sopenharmony_ci const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo = nullptr, 115e5c31af7Sopenharmony_ci const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo = nullptr, 116e5c31af7Sopenharmony_ci const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo = nullptr, 117e5c31af7Sopenharmony_ci const VkPipelineDynamicStateCreateInfo* dynamicStateCreateInfo = nullptr, 118e5c31af7Sopenharmony_ci const VkPipelineCreateFlags pipelineCreateFlags = 0u, 119e5c31af7Sopenharmony_ci const void* pNext = nullptr); 120e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 121e5c31af7Sopenharmony_ci 122e5c31af7Sopenharmony_ciMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk, 123e5c31af7Sopenharmony_ci const VkDevice device, 124e5c31af7Sopenharmony_ci const VkPipeline basePipelineHandle, 125e5c31af7Sopenharmony_ci const VkPipelineLayout pipelineLayout, 126e5c31af7Sopenharmony_ci const VkPipelineCreateFlags pipelineCreateFlags, 127e5c31af7Sopenharmony_ci const std::vector<VkPipelineShaderStageCreateInfo>& shaderCreateInfos, 128e5c31af7Sopenharmony_ci const VkRenderPass renderPass, 129e5c31af7Sopenharmony_ci const std::vector<VkViewport>& viewports, 130e5c31af7Sopenharmony_ci const std::vector<VkRect2D>& scissors, 131e5c31af7Sopenharmony_ci const deUint32 subpass = 0u, 132e5c31af7Sopenharmony_ci const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo = nullptr, 133e5c31af7Sopenharmony_ci const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo = nullptr, 134e5c31af7Sopenharmony_ci const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo = nullptr, 135e5c31af7Sopenharmony_ci const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo = nullptr, 136e5c31af7Sopenharmony_ci const VkPipelineDynamicStateCreateInfo* dynamicStateCreateInfo = nullptr, 137e5c31af7Sopenharmony_ci const void* pNext = nullptr); 138e5c31af7Sopenharmony_ci 139e5c31af7Sopenharmony_ciMove<VkRenderPass> makeRenderPass (const DeviceInterface& vk, 140e5c31af7Sopenharmony_ci const VkDevice device, 141e5c31af7Sopenharmony_ci const VkFormat colorFormat = VK_FORMAT_UNDEFINED, 142e5c31af7Sopenharmony_ci const VkFormat depthStencilFormat = VK_FORMAT_UNDEFINED, 143e5c31af7Sopenharmony_ci const VkAttachmentLoadOp loadOperation = VK_ATTACHMENT_LOAD_OP_CLEAR, 144e5c31af7Sopenharmony_ci const VkImageLayout finalLayoutColor = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 145e5c31af7Sopenharmony_ci const VkImageLayout finalLayoutDepthStencil = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 146e5c31af7Sopenharmony_ci const VkImageLayout subpassLayoutColor = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 147e5c31af7Sopenharmony_ci const VkImageLayout subpassLayoutDepthStencil = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 148e5c31af7Sopenharmony_ci const VkAllocationCallbacks* const allocationCallbacks = nullptr, 149e5c31af7Sopenharmony_ci const void* pNext = nullptr); 150e5c31af7Sopenharmony_ci 151e5c31af7Sopenharmony_ciMove<VkImageView> makeImageView (const DeviceInterface& vk, 152e5c31af7Sopenharmony_ci const VkDevice vkDevice, 153e5c31af7Sopenharmony_ci const VkImage image, 154e5c31af7Sopenharmony_ci const VkImageViewType imageViewType, 155e5c31af7Sopenharmony_ci const VkFormat format, 156e5c31af7Sopenharmony_ci const VkImageSubresourceRange subresourceRange, 157e5c31af7Sopenharmony_ci const vk::VkImageViewUsageCreateInfo* imageUsageCreateInfo = DE_NULL); 158e5c31af7Sopenharmony_ci 159e5c31af7Sopenharmony_ciMove<VkBufferView> makeBufferView (const DeviceInterface& vk, 160e5c31af7Sopenharmony_ci const VkDevice vkDevice, 161e5c31af7Sopenharmony_ci const VkBuffer buffer, 162e5c31af7Sopenharmony_ci const VkFormat format, 163e5c31af7Sopenharmony_ci const VkDeviceSize offset, 164e5c31af7Sopenharmony_ci const VkDeviceSize size); 165e5c31af7Sopenharmony_ci 166e5c31af7Sopenharmony_ciMove<VkDescriptorSet> makeDescriptorSet (const DeviceInterface& vk, 167e5c31af7Sopenharmony_ci const VkDevice device, 168e5c31af7Sopenharmony_ci const VkDescriptorPool descriptorPool, 169e5c31af7Sopenharmony_ci const VkDescriptorSetLayout setLayout, 170e5c31af7Sopenharmony_ci const void* pNext = DE_NULL); 171e5c31af7Sopenharmony_ci 172e5c31af7Sopenharmony_ciVkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize size, 173e5c31af7Sopenharmony_ci const VkBufferUsageFlags usage); 174e5c31af7Sopenharmony_ci 175e5c31af7Sopenharmony_ciVkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize size, 176e5c31af7Sopenharmony_ci const VkBufferUsageFlags usage, 177e5c31af7Sopenharmony_ci const std::vector<deUint32>& queueFamilyIndices, 178e5c31af7Sopenharmony_ci const VkBufferCreateFlags createFlags = 0); 179e5c31af7Sopenharmony_ci 180e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk, 181e5c31af7Sopenharmony_ci const VkDevice device, 182e5c31af7Sopenharmony_ci const VkDescriptorSetLayout descriptorSetLayout = DE_NULL, 183e5c31af7Sopenharmony_ci const VkPushConstantRange* pushConstantRange = nullptr); 184e5c31af7Sopenharmony_ci 185e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk, 186e5c31af7Sopenharmony_ci const VkDevice device, 187e5c31af7Sopenharmony_ci const std::vector<VkDescriptorSetLayout> &descriptorSetLayouts); 188e5c31af7Sopenharmony_ci 189e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk, 190e5c31af7Sopenharmony_ci const VkDevice device, 191e5c31af7Sopenharmony_ci const std::vector<vk::Move<VkDescriptorSetLayout>> &descriptorSetLayouts); 192e5c31af7Sopenharmony_ci 193e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk, 194e5c31af7Sopenharmony_ci const VkDevice device, 195e5c31af7Sopenharmony_ci const deUint32 setLayoutCount, 196e5c31af7Sopenharmony_ci const VkDescriptorSetLayout* descriptorSetLayout, 197e5c31af7Sopenharmony_ci const VkPipelineLayoutCreateFlags flags = 0u); 198e5c31af7Sopenharmony_ci 199e5c31af7Sopenharmony_ciMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk, 200e5c31af7Sopenharmony_ci const VkDevice device, 201e5c31af7Sopenharmony_ci const deUint32 setLayoutCount, 202e5c31af7Sopenharmony_ci const VkDescriptorSetLayout* descriptorSetLayout, 203e5c31af7Sopenharmony_ci const deUint32 pushConstantRangeCount, 204e5c31af7Sopenharmony_ci const VkPushConstantRange* pPushConstantRanges, 205e5c31af7Sopenharmony_ci const VkPipelineLayoutCreateFlags flags = 0u); 206e5c31af7Sopenharmony_ci 207e5c31af7Sopenharmony_ciMove<VkFramebuffer> makeFramebuffer (const DeviceInterface& vk, 208e5c31af7Sopenharmony_ci const VkDevice device, 209e5c31af7Sopenharmony_ci const VkRenderPass renderPass, 210e5c31af7Sopenharmony_ci const VkImageView colorAttachment, 211e5c31af7Sopenharmony_ci const deUint32 width, 212e5c31af7Sopenharmony_ci const deUint32 height, 213e5c31af7Sopenharmony_ci const deUint32 layers = 1u); 214e5c31af7Sopenharmony_ci 215e5c31af7Sopenharmony_ciMove<VkFramebuffer> makeFramebuffer (const DeviceInterface& vk, 216e5c31af7Sopenharmony_ci const VkDevice device, 217e5c31af7Sopenharmony_ci const VkRenderPass renderPass, 218e5c31af7Sopenharmony_ci const deUint32 attachmentCount, 219e5c31af7Sopenharmony_ci const VkImageView* attachmentsArray, 220e5c31af7Sopenharmony_ci const deUint32 width, 221e5c31af7Sopenharmony_ci const deUint32 height, 222e5c31af7Sopenharmony_ci const deUint32 layers = 1u); 223e5c31af7Sopenharmony_ci 224e5c31af7Sopenharmony_ciMove<VkCommandPool> makeCommandPool (const DeviceInterface& vk, 225e5c31af7Sopenharmony_ci const VkDevice device, 226e5c31af7Sopenharmony_ci const deUint32 queueFamilyIndex); 227e5c31af7Sopenharmony_ci 228e5c31af7Sopenharmony_ciinline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, 229e5c31af7Sopenharmony_ci const VkDevice device, 230e5c31af7Sopenharmony_ci const VkDeviceSize bufferSize, 231e5c31af7Sopenharmony_ci const VkBufferUsageFlags usage) 232e5c31af7Sopenharmony_ci{ 233e5c31af7Sopenharmony_ci const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage); 234e5c31af7Sopenharmony_ci return createBuffer(vk, device, &bufferCreateInfo); 235e5c31af7Sopenharmony_ci} 236e5c31af7Sopenharmony_ci 237e5c31af7Sopenharmony_ciinline Move<VkBuffer> makeBuffer (const vk::DeviceInterface& vk, 238e5c31af7Sopenharmony_ci const vk::VkDevice device, 239e5c31af7Sopenharmony_ci const vk::VkBufferCreateInfo& createInfo) 240e5c31af7Sopenharmony_ci{ 241e5c31af7Sopenharmony_ci return createBuffer(vk, device, &createInfo); 242e5c31af7Sopenharmony_ci} 243e5c31af7Sopenharmony_ci 244e5c31af7Sopenharmony_ciinline Move<VkImage> makeImage (const DeviceInterface& vk, 245e5c31af7Sopenharmony_ci const VkDevice device, 246e5c31af7Sopenharmony_ci const VkImageCreateInfo& createInfo) 247e5c31af7Sopenharmony_ci{ 248e5c31af7Sopenharmony_ci return createImage(vk, device, &createInfo); 249e5c31af7Sopenharmony_ci} 250e5c31af7Sopenharmony_ci 251e5c31af7Sopenharmony_ciVkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent, 252e5c31af7Sopenharmony_ci const VkImageSubresourceLayers subresourceLayers); 253e5c31af7Sopenharmony_ci 254e5c31af7Sopenharmony_ci} // vk 255e5c31af7Sopenharmony_ci 256e5c31af7Sopenharmony_ci#endif // _VKOBJUTIL_HPP 257