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 41 namespace vkt 42 { 43 namespace geometry 44 { 45 46 struct PrimitiveTestSpec 47 { 48 vk::VkPrimitiveTopology primitiveType; 49 const char* name; 50 vk::VkPrimitiveTopology outputType; 51 }; 52 53 class Buffer 54 { 55 public: 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 72 private: 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 81 class Image 82 { 83 public: 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 100 private: 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 109 class GraphicsPipelineBuilder 110 { 111 public: 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 138 private: 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 159 template<typename T> 160 inline std::size_t sizeInBytes (const std::vector<T>& vec) 161 { 162 return vec.size() * sizeof(vec[0]); 163 } 164 165 std::string inputTypeToGLString (const vk::VkPrimitiveTopology& inputType); 166 std::string outputTypeToGLString (const vk::VkPrimitiveTopology& outputType); 167 std::size_t calcOutputVertices (const vk::VkPrimitiveTopology& inputType); 168 169 vk::VkBufferCreateInfo makeBufferCreateInfo (const vk::VkDeviceSize bufferSize, const vk::VkBufferUsageFlags usage); 170 vk::VkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const vk::VkFormat format, const vk::VkImageUsageFlags usage, const deUint32 numArrayLayers = 1u); 171 vk::Move<vk::VkDescriptorSet> makeDescriptorSet (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkDescriptorPool descriptorPool, const vk::VkDescriptorSetLayout setLayout); 172 vk::Move<vk::VkRenderPass> makeRenderPass (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkFormat colorFormat); 173 vk::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); 174 vk::VkBufferImageCopy makeBufferImageCopy (const vk::VkExtent3D extent, const vk::VkImageSubresourceLayers subresourceLayers); 175 vk::Move<vk::VkPipelineLayout> makePipelineLayout (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkDescriptorSetLayout descriptorSetLayout = DE_NULL); 176 vk::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); 177 vk::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); 178 vk::VkBufferMemoryBarrier makeBufferMemoryBarrier (const vk::VkAccessFlags srcAccessMask, const vk::VkAccessFlags dstAccessMask, const vk::VkBuffer buffer, const vk::VkDeviceSize offset, const vk::VkDeviceSize bufferSizeBytes); 179 de::MovePtr<vk::Allocation> bindImage (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkImage image, const vk::MemoryRequirement requirement); 180 de::MovePtr<vk::Allocation> bindBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, vk::Allocator& allocator, const vk::VkBuffer buffer, const vk::MemoryRequirement requirement); 181 182 void 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); 183 void endRenderPass (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer); 184 void beginCommandBuffer (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer); 185 void endCommandBuffer (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer); 186 void submitCommandsAndWait (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkQueue queue, const vk::VkCommandBuffer commandBuffer); 187 188 bool compareWithFileImage (Context& context, const tcu::ConstPixelBufferAccess& resultImage, std::string name); 189 190 void zeroBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::Allocation& alloc, const vk::VkDeviceSize size); 191 192 void checkGeometryShaderSupport (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice, const int numGeometryShaderInvocations = 0); 193 vk::VkBool32 checkPointSize (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice); 194 195 inline 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 200 inline 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