Home | History | Annotate | Download | only in vulkan
      1 #ifndef _VKBUILDERUTIL_HPP
      2 #define _VKBUILDERUTIL_HPP
      3 /*-------------------------------------------------------------------------
      4  * Vulkan CTS Framework
      5  * --------------------
      6  *
      7  * Copyright (c) 2015 Google 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 Vulkan object builder utilities.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "vkDefs.hpp"
     27 #include "vkRef.hpp"
     28 
     29 #include <vector>
     30 
     31 namespace vk
     32 {
     33 
     34 class DescriptorSetLayoutBuilder
     35 {
     36 public:
     37 												DescriptorSetLayoutBuilder		(void);
     38 
     39 	DescriptorSetLayoutBuilder&					addBinding						(VkDescriptorType	descriptorType,
     40 																				 deUint32			descriptorCount,
     41 																				 VkShaderStageFlags	stageFlags,
     42 																				 const VkSampler*	pImmutableSamplers);
     43 
     44 	DescriptorSetLayoutBuilder&					addIndexedBinding				(VkDescriptorType	descriptorType,
     45 																				 deUint32			descriptorCount,
     46 																				 VkShaderStageFlags	stageFlags,
     47 																				 deUint32			dstBinding,
     48 																				 const VkSampler*	pImmutableSamplers);
     49 
     50 	Move<VkDescriptorSetLayout>					build							(const DeviceInterface& vk, VkDevice device, VkDescriptorSetLayoutCreateFlags extraFlags = 0) const;
     51 
     52 	// helpers
     53 
     54 	inline DescriptorSetLayoutBuilder&			addSingleBinding				(VkDescriptorType	descriptorType,
     55 																				 VkShaderStageFlags	stageFlags)
     56 	{
     57 		return addBinding(descriptorType, 1u, stageFlags, (VkSampler*)DE_NULL);
     58 	}
     59 	inline DescriptorSetLayoutBuilder&			addSingleIndexedBinding			(VkDescriptorType	descriptorType,
     60 																				 VkShaderStageFlags	stageFlags,
     61 																				 deUint32			dstBinding)
     62 	{
     63 		return addIndexedBinding(descriptorType, 1u, stageFlags, dstBinding, (VkSampler*)DE_NULL);
     64 	}
     65 	inline DescriptorSetLayoutBuilder&			addArrayBinding					(VkDescriptorType	descriptorType,
     66 																				 deUint32			descriptorCount,
     67 																				 VkShaderStageFlags	stageFlags)
     68 	{
     69 		return addBinding(descriptorType, descriptorCount, stageFlags, (VkSampler*)DE_NULL);
     70 	}
     71 	inline DescriptorSetLayoutBuilder&			addSingleSamplerBinding			(VkDescriptorType	descriptorType,
     72 																				 VkShaderStageFlags	stageFlags,
     73 																				 const VkSampler*	immutableSampler)	//!< \note: Using pointer to sampler to clarify that handle is not
     74 																														//!<        copied and argument lifetime is expected to cover build()
     75 																														//!<        call.
     76 	{
     77 		return addBinding(descriptorType, 1u, stageFlags, immutableSampler);
     78 	}
     79 	inline DescriptorSetLayoutBuilder&			addSingleIndexedSamplerBinding	(VkDescriptorType	descriptorType,
     80 																				 VkShaderStageFlags	stageFlags,
     81 																				 deUint32			dstBinding,
     82 																				 const VkSampler*	immutableSampler)	//!< \note: Using pointer to sampler to clarify that handle is not
     83 																														//!<        copied and argument lifetime is expected to cover build()
     84 																														//!<        call.
     85 	{
     86 		return addIndexedBinding(descriptorType, 1u, stageFlags, dstBinding, immutableSampler);
     87 	}
     88 	inline DescriptorSetLayoutBuilder&			addArraySamplerBinding			(VkDescriptorType	descriptorType,
     89 																				 deUint32			descriptorCount,
     90 																				 VkShaderStageFlags	stageFlags,
     91 																				 const VkSampler*	pImmutableSamplers)
     92 	{
     93 		return addBinding(descriptorType, descriptorCount, stageFlags, pImmutableSamplers);
     94 	}
     95 
     96 private:
     97 												DescriptorSetLayoutBuilder		(const DescriptorSetLayoutBuilder&); // delete
     98 	DescriptorSetLayoutBuilder&					operator=						(const DescriptorSetLayoutBuilder&); // delete
     99 
    100 	std::vector<VkDescriptorSetLayoutBinding>	m_bindings;
    101 
    102 	struct ImmutableSamplerInfo
    103 	{
    104 		deUint32 bindingIndex;
    105 		deUint32 samplerBaseIndex;
    106 	};
    107 
    108 	std::vector<ImmutableSamplerInfo>			m_immutableSamplerInfos;
    109 	std::vector<VkSampler>						m_immutableSamplers;
    110 };
    111 
    112 class DescriptorPoolBuilder
    113 {
    114 public:
    115 										DescriptorPoolBuilder	(void);
    116 
    117 	DescriptorPoolBuilder&				addType					(VkDescriptorType type, deUint32 numDescriptors = 1u);
    118 	Move<VkDescriptorPool>				build					(const DeviceInterface& vk, VkDevice device, VkDescriptorPoolCreateFlags flags, deUint32 maxSets, const void *pNext = DE_NULL) const;
    119 
    120 private:
    121 										DescriptorPoolBuilder	(const DescriptorPoolBuilder&); // delete
    122 	DescriptorPoolBuilder&				operator=				(const DescriptorPoolBuilder&); // delete
    123 
    124 	std::vector<VkDescriptorPoolSize>	m_counts;
    125 };
    126 
    127 class DescriptorSetUpdateBuilder
    128 {
    129 public:
    130 	class Location
    131 	{
    132 	public:
    133 		static inline Location	binding				(deUint32 binding_)
    134 		{
    135 			return Location(binding_, 0u);
    136 		}
    137 		static inline Location	bindingArrayElement	(deUint32 binding_, deUint32 arrayElement)
    138 		{
    139 			return Location(binding_, arrayElement);
    140 		}
    141 
    142 	private:
    143 		// \note private to force use of factory methods that have more descriptive names
    144 		inline					Location			(deUint32 binding_, deUint32 arrayElement)
    145 			: m_binding			(binding_)
    146 			, m_arrayElement	(arrayElement)
    147 		{
    148 		}
    149 
    150 		friend class DescriptorSetUpdateBuilder;
    151 
    152 		const deUint32			m_binding;
    153 		const deUint32			m_arrayElement;
    154 	};
    155 
    156 										DescriptorSetUpdateBuilder	(void);
    157 										/* DescriptorSetUpdateBuilder	(const DescriptorSetUpdateBuilder&); // do not delete */
    158 
    159 	DescriptorSetUpdateBuilder&			write						(VkDescriptorSet				destSet,
    160 																	 deUint32						destBinding,
    161 																	 deUint32						destArrayElement,
    162 																	 deUint32						count,
    163 																	 VkDescriptorType				descriptorType,
    164 																	 const VkDescriptorImageInfo*	pImageInfo,
    165 																	 const VkDescriptorBufferInfo*	pBufferInfo,
    166 																	 const VkBufferView*			pTexelBufferView);
    167 
    168 	DescriptorSetUpdateBuilder&			copy						(VkDescriptorSet	srcSet,
    169 																	 deUint32			srcBinding,
    170 																	 deUint32			srcArrayElement,
    171 																	 VkDescriptorSet	destSet,
    172 																	 deUint32			destBinding,
    173 																	 deUint32			destArrayElement,
    174 																	 deUint32			count);
    175 
    176 	void								update						(const DeviceInterface& vk, VkDevice device) const;
    177 	void								updateWithPush				(const DeviceInterface& vk, VkCommandBuffer cmd, VkPipelineBindPoint bindPoint, VkPipelineLayout pipelineLayout, deUint32 setIdx, deUint32 descriptorIdx = 0, deUint32 numDescriptors = 0) const;
    178 	void								clear						(void);
    179 
    180 	// helpers
    181 
    182 	inline DescriptorSetUpdateBuilder&	writeSingle					(VkDescriptorSet				destSet,
    183 																	 const Location&				destLocation,
    184 																	 VkDescriptorType				descriptorType,
    185 																	 const VkDescriptorImageInfo*	pImageInfo)
    186 	{
    187 		return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u, descriptorType, pImageInfo, DE_NULL, DE_NULL);
    188 	}
    189 
    190 	inline DescriptorSetUpdateBuilder&	writeSingle					(VkDescriptorSet				destSet,
    191 																	 const Location&				destLocation,
    192 																	 VkDescriptorType				descriptorType,
    193 																	 const VkDescriptorBufferInfo*	pBufferInfo)
    194 	{
    195 		return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u, descriptorType, DE_NULL, pBufferInfo, DE_NULL);
    196 	}
    197 
    198 	inline DescriptorSetUpdateBuilder&	writeSingle					(VkDescriptorSet				destSet,
    199 																	 const Location&				destLocation,
    200 																	 VkDescriptorType				descriptorType,
    201 																	 const VkBufferView*			pTexelBufferView)
    202 	{
    203 		return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u, descriptorType, DE_NULL, DE_NULL, pTexelBufferView);
    204 	}
    205 
    206 	inline DescriptorSetUpdateBuilder&	writeArray					(VkDescriptorSet				destSet,
    207 																	 const Location&				destLocation,
    208 																	 VkDescriptorType				descriptorType,
    209 																	 deUint32						numDescriptors,
    210 																	 const VkDescriptorImageInfo*	pImageInfo)
    211 	{
    212 		return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, numDescriptors, descriptorType, pImageInfo, DE_NULL, DE_NULL);
    213 	}
    214 
    215 	inline DescriptorSetUpdateBuilder&	writeArray					(VkDescriptorSet				destSet,
    216 																	 const Location&				destLocation,
    217 																	 VkDescriptorType				descriptorType,
    218 																	 deUint32						numDescriptors,
    219 																	 const VkDescriptorBufferInfo*	pBufferInfo)
    220 	{
    221 		return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, numDescriptors, descriptorType, DE_NULL, pBufferInfo, DE_NULL);
    222 	}
    223 
    224 	inline DescriptorSetUpdateBuilder&	writeArray					(VkDescriptorSet				destSet,
    225 																	 const Location&				destLocation,
    226 																	 VkDescriptorType				descriptorType,
    227 																	 deUint32						numDescriptors,
    228 																	 const VkBufferView*			pTexelBufferView)
    229 	{
    230 		return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, numDescriptors, descriptorType, DE_NULL, DE_NULL, pTexelBufferView);
    231 	}
    232 
    233 	inline DescriptorSetUpdateBuilder&	copySingle					(VkDescriptorSet	srcSet,
    234 																	 const Location&	srcLocation,
    235 																	 VkDescriptorSet	destSet,
    236 																	 const Location&	destLocation)
    237 	{
    238 		return copy(srcSet, srcLocation.m_binding, srcLocation.m_arrayElement, destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u);
    239 	}
    240 
    241 	inline DescriptorSetUpdateBuilder&	copyArray					(VkDescriptorSet	srcSet,
    242 																	 const Location&	srcLocation,
    243 																	 VkDescriptorSet	destSet,
    244 																	 const Location&	destLocation,
    245 																	 deUint32			count)
    246 	{
    247 		return copy(srcSet, srcLocation.m_binding, srcLocation.m_arrayElement, destSet, destLocation.m_binding, destLocation.m_arrayElement, count);
    248 	}
    249 
    250 private:
    251 	DescriptorSetUpdateBuilder&			operator=					(const DescriptorSetUpdateBuilder&); // delete
    252 
    253 	struct WriteDescriptorInfo
    254 	{
    255 		std::vector<VkDescriptorImageInfo>	imageInfos;
    256 		std::vector<VkDescriptorBufferInfo>	bufferInfos;
    257 		std::vector<VkBufferView>			texelBufferViews;
    258 	};
    259 
    260 	std::vector<WriteDescriptorInfo>	m_writeDescriptorInfos;
    261 
    262 	std::vector<VkWriteDescriptorSet>	m_writes;
    263 	std::vector<VkCopyDescriptorSet>	m_copies;
    264 };
    265 
    266 } // vk
    267 
    268 #endif // _VKBUILDERUTIL_HPP
    269