1#ifndef _VKTGEOMETRYTESTSUTIL_HPP 2#define _VKTGEOMETRYTESTSUTIL_HPP 3/*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2014 The Android Open Source Project 8 * Copyright (c) 2016 The Khronos Group Inc. 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 * 22 *//*! 23 * \file 24 * \brief Geometry Utilities 25 *//*--------------------------------------------------------------------*/ 26 27#include "vkDefs.hpp" 28#include "vkMemUtil.hpp" 29#include "vkRef.hpp" 30#include "vkPrograms.hpp" 31#include "vkRefUtil.hpp" 32#include "vkQueryUtil.hpp" 33#include "vktTestCase.hpp" 34 35#include "tcuVector.hpp" 36#include "tcuTexture.hpp" 37 38#include "deStringUtil.hpp" 39#include "deUniquePtr.hpp" 40 41namespace vkt 42{ 43namespace geometry 44{ 45 46struct PrimitiveTestSpec 47{ 48 vk::VkPrimitiveTopology primitiveType; 49 const char* name; 50 vk::VkPrimitiveTopology outputType; 51}; 52 53class Buffer 54{ 55public: 56 Buffer (const vk::DeviceInterface& vk, 57 const vk::VkDevice device, 58 vk::Allocator& allocator, 59 const vk::VkBufferCreateInfo& bufferCreateInfo, 60 const vk::MemoryRequirement memoryRequirement) 61 62 : m_buffer (createBuffer(vk, device, &bufferCreateInfo)) 63 , m_allocation (allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), memoryRequirement)) 64 { 65 VK_CHECK(vk.bindBufferMemory(device, *m_buffer, m_allocation->getMemory(), m_allocation->getOffset())); 66 } 67 68 const vk::VkBuffer& get (void) const { return *m_buffer; } 69 const vk::VkBuffer& operator* (void) const { return get(); } 70 vk::Allocation& getAllocation (void) const { return *m_allocation; } 71 72private: 73 const vk::Unique<vk::VkBuffer> m_buffer; 74 const de::UniquePtr<vk::Allocation> m_allocation; 75 76 // "deleted" 77 Buffer (const Buffer&); 78 Buffer& operator= (const Buffer&); 79}; 80 81class Image 82{ 83public: 84 Image (const vk::DeviceInterface& vk, 85 const vk::VkDevice device, 86 vk::Allocator& allocator, 87 const vk::VkImageCreateInfo& imageCreateInfo, 88 const vk::MemoryRequirement memoryRequirement) 89 90 : m_image (createImage(vk, device, &imageCreateInfo)) 91 , m_allocation (allocator.allocate(getImageMemoryRequirements(vk, device, *m_image), memoryRequirement)) 92 { 93 VK_CHECK(vk.bindImageMemory(device, *m_image, m_allocation->getMemory(), m_allocation->getOffset())); 94 } 95 96 const vk::VkImage& get (void) const { return *m_image; } 97 const vk::VkImage& operator* (void) const { return get(); } 98 vk::Allocation& getAllocation (void) const { return *m_allocation; } 99 100private: 101 const vk::Unique<vk::VkImage> m_image; 102 const de::UniquePtr<vk::Allocation> m_allocation; 103 104 // "deleted" 105 Image (const Image&); 106 Image& operator= (const Image&); 107}; 108 109class GraphicsPipelineBuilder 110{ 111public: 112 GraphicsPipelineBuilder (void) : m_renderSize (0, 0) 113 , m_shaderStageFlags (0u) 114 , m_cullModeFlags (vk::VK_CULL_MODE_NONE) 115 , m_frontFace (vk::VK_FRONT_FACE_COUNTER_CLOCKWISE) 116 , m_patchControlPoints (1u) 117 , m_blendEnable (false) 118 , m_primitiveTopology (vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST) {} 119 120 GraphicsPipelineBuilder& setRenderSize (const tcu::IVec2& size) { m_renderSize = size; return *this; } 121 GraphicsPipelineBuilder& setShader (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkShaderStageFlagBits stage, const vk::ProgramBinary& binary, const vk::VkSpecializationInfo* specInfo); 122 GraphicsPipelineBuilder& setPatchControlPoints (const deUint32 controlPoints) { m_patchControlPoints = controlPoints; return *this; } 123 GraphicsPipelineBuilder& setCullModeFlags (const vk::VkCullModeFlags cullModeFlags) { m_cullModeFlags = cullModeFlags; return *this; } 124 GraphicsPipelineBuilder& setFrontFace (const vk::VkFrontFace frontFace) { m_frontFace = frontFace; return *this; } 125 GraphicsPipelineBuilder& setBlend (const bool enable) { m_blendEnable = enable; return *this; } 126 127 //! Applies only to pipelines without tessellation shaders. 128 GraphicsPipelineBuilder& setPrimitiveTopology (const vk::VkPrimitiveTopology topology) { m_primitiveTopology = topology; return *this; } 129 130 GraphicsPipelineBuilder& addVertexBinding (const vk::VkVertexInputBindingDescription vertexBinding) { m_vertexInputBindings.push_back(vertexBinding); return *this; } 131 GraphicsPipelineBuilder& addVertexAttribute (const vk::VkVertexInputAttributeDescription vertexAttribute) { m_vertexInputAttributes.push_back(vertexAttribute); return *this; } 132 133 //! Basic vertex input configuration (uses biding 0, location 0, etc.) 134 GraphicsPipelineBuilder& setVertexInputSingleAttribute (const vk::VkFormat vertexFormat, const deUint32 stride); 135 136 vk::Move<vk::VkPipeline> build (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkPipelineLayout pipelineLayout, const vk::VkRenderPass renderPass); 137 138private: 139 tcu::IVec2 m_renderSize; 140 vk::Move<vk::VkShaderModule> m_vertexShaderModule; 141 vk::Move<vk::VkShaderModule> m_fragmentShaderModule; 142 vk::Move<vk::VkShaderModule> m_geometryShaderModule; 143 vk::Move<vk::VkShaderModule> m_tessControlShaderModule; 144 vk::Move<vk::VkShaderModule> m_tessEvaluationShaderModule; 145 std::vector<vk::VkPipelineShaderStageCreateInfo> m_shaderStages; 146 std::vector<vk::VkVertexInputBindingDescription> m_vertexInputBindings; 147 std::vector<vk::VkVertexInputAttributeDescription> m_vertexInputAttributes; 148 vk::VkShaderStageFlags m_shaderStageFlags; 149 vk::VkCullModeFlags m_cullModeFlags; 150 vk::VkFrontFace m_frontFace; 151 deUint32 m_patchControlPoints; 152 bool m_blendEnable; 153 vk::VkPrimitiveTopology m_primitiveTopology; 154 155 GraphicsPipelineBuilder (const GraphicsPipelineBuilder&); // "deleted" 156 GraphicsPipelineBuilder& operator= (const GraphicsPipelineBuilder&); 157}; 158 159template<typename T> 160inline std::size_t sizeInBytes (const std::vector<T>& vec) 161{ 162 return vec.size() * sizeof(vec[0]); 163} 164 165std::string inputTypeToGLString (const vk::VkPrimitiveTopology& inputType); 166std::string outputTypeToGLString (const vk::VkPrimitiveTopology& outputType); 167std::size_t calcOutputVertices (const vk::VkPrimitiveTopology& inputType); 168 169vk::VkBufferCreateInfo makeBufferCreateInfo (const vk::VkDeviceSize bufferSize, const vk::VkBufferUsageFlags usage); 170vk::VkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const vk::VkFormat format, const vk::VkImageUsageFlags usage, const deUint32 numArrayLayers = 1u); 171vk::Move<vk::VkDescriptorSet> makeDescriptorSet (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkDescriptorPool descriptorPool, const vk::VkDescriptorSetLayout setLayout); 172vk::Move<vk::VkRenderPass> makeRenderPass (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkFormat colorFormat); 173vk::Move<vk::VkImageView> makeImageView (const vk::DeviceInterface& vk, const vk::VkDevice vkDevice, const vk::VkImage image, const vk::VkImageViewType viewType, const vk::VkFormat format, const vk::VkImageSubresourceRange subresourceRange); 174vk::VkBufferImageCopy makeBufferImageCopy (const vk::VkExtent3D extent, const vk::VkImageSubresourceLayers subresourceLayers); 175vk::Move<vk::VkPipelineLayout> makePipelineLayout (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkDescriptorSetLayout descriptorSetLayout = DE_NULL); 176vk::Move<vk::VkFramebuffer> makeFramebuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkRenderPass renderPass, const vk::VkImageView colorAttachment, const deUint32 width, const deUint32 height, const deUint32 layers); 177vk::VkImageMemoryBarrier makeImageMemoryBarrier (const vk::VkAccessFlags srcAccessMask, const vk::VkAccessFlags dstAccessMask, const vk::VkImageLayout oldLayout, const vk::VkImageLayout newLayout, const vk::VkImage image, const vk::VkImageSubresourceRange subresourceRange); 178vk::VkBufferMemoryBarrier makeBufferMemoryBarrier (const vk::VkAccessFlags srcAccessMask, const vk::VkAccessFlags dstAccessMask, const vk::VkBuffer buffer, const vk::VkDeviceSize offset, const vk::VkDeviceSize bufferSizeBytes); 179de::MovePtr<vk::Allocation> bindImage (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkImage image, const vk::MemoryRequirement requirement); 180de::MovePtr<vk::Allocation> bindBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkBuffer buffer, const vk::MemoryRequirement requirement); 181 182void beginRenderPass (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer, const vk::VkRenderPass renderPass, const vk::VkFramebuffer framebuffer, const vk::VkRect2D& renderArea, const tcu::Vec4& clearColor); 183void endRenderPass (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer); 184void beginCommandBuffer (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer); 185void endCommandBuffer (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer); 186void submitCommandsAndWait (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkQueue queue, const vk::VkCommandBuffer commandBuffer); 187 188bool compareWithFileImage (Context& context, const tcu::ConstPixelBufferAccess& resultImage, std::string name); 189 190void zeroBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::Allocation& alloc, const vk::VkDeviceSize size); 191 192void checkGeometryShaderSupport (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice, const int numGeometryShaderInvocations = 0); 193vk::VkBool32 checkPointSize (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice); 194 195inline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo) 196{ 197 return createBuffer(vk, device, &createInfo); 198} 199 200inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo) 201{ 202 return createImage(vk, device, &createInfo); 203} 204 205} //vkt 206} //geometry 207 208#endif // _VKTGEOMETRYTESTSUTIL_HPP 209