1#ifndef _VKTPIPELINESPECCONSTANTUTIL_HPP 2#define _VKTPIPELINESPECCONSTANTUTIL_HPP 3/*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2016 The Khronos Group Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Pipeline specialization constants test utilities 24 *//*--------------------------------------------------------------------*/ 25 26#include "vkDefs.hpp" 27#include "vkRef.hpp" 28#include "vkPrograms.hpp" 29#include "vkMemUtil.hpp" 30#include "vkRefUtil.hpp" 31#include "vkQueryUtil.hpp" 32 33namespace vkt 34{ 35namespace pipeline 36{ 37 38class GraphicsPipelineBuilder 39{ 40public: 41 GraphicsPipelineBuilder (void) : m_renderSize (16, 16) 42 , m_shaderStageFlags (0u) {} 43 44 GraphicsPipelineBuilder& setRenderSize (const tcu::IVec2& size) { m_renderSize = size; return *this; } 45 GraphicsPipelineBuilder& setShader (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkShaderStageFlagBits stage, const vk::ProgramBinary& binary, const vk::VkSpecializationInfo* specInfo); 46 vk::Move<vk::VkPipeline> build (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkPipelineLayout pipelineLayout, const vk::VkRenderPass renderPass); 47 48private: 49 tcu::IVec2 m_renderSize; 50 vk::Move<vk::VkShaderModule> m_vertexShaderModule; 51 vk::Move<vk::VkShaderModule> m_fragmentShaderModule; 52 vk::Move<vk::VkShaderModule> m_geometryShaderModule; 53 vk::Move<vk::VkShaderModule> m_tessControlShaderModule; 54 vk::Move<vk::VkShaderModule> m_tessEvaluationShaderModule; 55 std::vector<vk::VkPipelineShaderStageCreateInfo> m_shaderStages; 56 vk::VkShaderStageFlags m_shaderStageFlags; 57 58 GraphicsPipelineBuilder (const GraphicsPipelineBuilder&); // "deleted" 59 GraphicsPipelineBuilder& operator= (const GraphicsPipelineBuilder&); 60}; 61 62enum FeatureFlagBits 63{ 64 FEATURE_TESSELLATION_SHADER = 1u << 0, 65 FEATURE_GEOMETRY_SHADER = 1u << 1, 66 FEATURE_SHADER_FLOAT_64 = 1u << 2, 67 FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS = 1u << 3, 68 FEATURE_FRAGMENT_STORES_AND_ATOMICS = 1u << 4, 69}; 70typedef deUint32 FeatureFlags; 71 72vk::VkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const vk::VkFormat format, const vk::VkImageUsageFlags usage); 73vk::Move<vk::VkRenderPass> makeRenderPass (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkFormat colorFormat); 74void 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); 75void requireFeatures (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice, const FeatureFlags flags); 76 77// Ugly, brute-force replacement for the initializer list 78 79template<typename T> 80std::vector<T> makeVector (const T& o1) 81{ 82 std::vector<T> vec; 83 vec.reserve(1); 84 vec.push_back(o1); 85 return vec; 86} 87 88template<typename T> 89std::vector<T> makeVector (const T& o1, const T& o2) 90{ 91 std::vector<T> vec; 92 vec.reserve(2); 93 vec.push_back(o1); 94 vec.push_back(o2); 95 return vec; 96} 97 98template<typename T> 99std::vector<T> makeVector (const T& o1, const T& o2, const T& o3) 100{ 101 std::vector<T> vec; 102 vec.reserve(3); 103 vec.push_back(o1); 104 vec.push_back(o2); 105 vec.push_back(o3); 106 return vec; 107} 108 109template<typename T> 110std::vector<T> makeVector (const T& o1, const T& o2, const T& o3, const T& o4) 111{ 112 std::vector<T> vec; 113 vec.reserve(4); 114 vec.push_back(o1); 115 vec.push_back(o2); 116 vec.push_back(o3); 117 vec.push_back(o4); 118 return vec; 119} 120 121} // pipeline 122} // vkt 123 124#endif // _VKTPIPELINESPECCONSTANTUTIL_HPP 125