1 #ifndef _VKBUILDERUTIL_HPP
2 #define _VKBUILDERUTIL_HPP
3 /*-------------------------------------------------------------------------
7 * Copyright (c) 2015 Google Inc.
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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.
23 * \brief Vulkan object builder utilities.
24 *//*--------------------------------------------------------------------*/
34 class DescriptorSetLayoutBuilder
37 DescriptorSetLayoutBuilder (void);
39 DescriptorSetLayoutBuilder& addBinding (VkDescriptorType descriptorType,
40 deUint32 descriptorCount,
41 VkShaderStageFlags stageFlags,
42 const VkSampler* pImmutableSamplers);
44 DescriptorSetLayoutBuilder& addIndexedBinding (VkDescriptorType descriptorType,
45 deUint32 descriptorCount,
46 VkShaderStageFlags stageFlags,
48 const VkSampler* pImmutableSamplers);
50 Move<VkDescriptorSetLayout> build (const DeviceInterface& vk, VkDevice device, VkDescriptorSetLayoutCreateFlags extraFlags = 0) const;
54 inline DescriptorSetLayoutBuilder& addSingleBinding (VkDescriptorType descriptorType,
55 VkShaderStageFlags stageFlags)
57 return addBinding(descriptorType, 1u, stageFlags, (VkSampler*)DE_NULL);
59 inline DescriptorSetLayoutBuilder& addSingleIndexedBinding (VkDescriptorType descriptorType,
60 VkShaderStageFlags stageFlags,
63 return addIndexedBinding(descriptorType, 1u, stageFlags, dstBinding, (VkSampler*)DE_NULL);
65 inline DescriptorSetLayoutBuilder& addArrayBinding (VkDescriptorType descriptorType,
66 deUint32 descriptorCount,
67 VkShaderStageFlags stageFlags)
69 return addBinding(descriptorType, descriptorCount, stageFlags, (VkSampler*)DE_NULL);
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()
77 return addBinding(descriptorType, 1u, stageFlags, immutableSampler);
79 inline DescriptorSetLayoutBuilder& addArraySamplerBinding (VkDescriptorType descriptorType,
80 deUint32 descriptorCount,
81 VkShaderStageFlags stageFlags,
82 const VkSampler* pImmutableSamplers)
84 return addBinding(descriptorType, descriptorCount, stageFlags, pImmutableSamplers);
88 DescriptorSetLayoutBuilder (const DescriptorSetLayoutBuilder&); // delete
89 DescriptorSetLayoutBuilder& operator= (const DescriptorSetLayoutBuilder&); // delete
91 std::vector<VkDescriptorSetLayoutBinding> m_bindings;
93 struct ImmutableSamplerInfo
95 deUint32 bindingIndex;
96 deUint32 samplerBaseIndex;
99 std::vector<ImmutableSamplerInfo> m_immutableSamplerInfos;
100 std::vector<VkSampler> m_immutableSamplers;
103 class DescriptorPoolBuilder
106 DescriptorPoolBuilder (void);
108 DescriptorPoolBuilder& addType (VkDescriptorType type, deUint32 numDescriptors = 1u);
109 Move<VkDescriptorPool> build (const DeviceInterface& vk, VkDevice device, VkDescriptorPoolCreateFlags flags, deUint32 maxSets) const;
112 DescriptorPoolBuilder (const DescriptorPoolBuilder&); // delete
113 DescriptorPoolBuilder& operator= (const DescriptorPoolBuilder&); // delete
115 std::vector<VkDescriptorPoolSize> m_counts;
118 class DescriptorSetUpdateBuilder
124 static inline Location binding (deUint32 binding_)
126 return Location(binding_, 0u);
128 static inline Location bindingArrayElement (deUint32 binding_, deUint32 arrayElement)
130 return Location(binding_, arrayElement);
134 // \note private to force use of factory methods that have more descriptive names
135 inline Location (deUint32 binding_, deUint32 arrayElement)
136 : m_binding (binding_)
137 , m_arrayElement (arrayElement)
141 friend class DescriptorSetUpdateBuilder;
143 const deUint32 m_binding;
144 const deUint32 m_arrayElement;
147 DescriptorSetUpdateBuilder (void);
148 /* DescriptorSetUpdateBuilder (const DescriptorSetUpdateBuilder&); // do not delete */
150 DescriptorSetUpdateBuilder& write (VkDescriptorSet destSet,
151 deUint32 destBinding,
152 deUint32 destArrayElement,
154 VkDescriptorType descriptorType,
155 const VkDescriptorImageInfo* pImageInfo,
156 const VkDescriptorBufferInfo* pBufferInfo,
157 const VkBufferView* pTexelBufferView);
159 DescriptorSetUpdateBuilder& copy (VkDescriptorSet srcSet,
161 deUint32 srcArrayElement,
162 VkDescriptorSet destSet,
163 deUint32 destBinding,
164 deUint32 destArrayElement,
167 void update (const DeviceInterface& vk, VkDevice device) const;
168 void updateWithPush (const DeviceInterface& vk, VkCommandBuffer cmd, VkPipelineBindPoint bindPoint, VkPipelineLayout pipelineLayout, deUint32 setIdx) const;
172 inline DescriptorSetUpdateBuilder& writeSingle (VkDescriptorSet destSet,
173 const Location& destLocation,
174 VkDescriptorType descriptorType,
175 const VkDescriptorImageInfo* pImageInfo)
177 return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u, descriptorType, pImageInfo, DE_NULL, DE_NULL);
180 inline DescriptorSetUpdateBuilder& writeSingle (VkDescriptorSet destSet,
181 const Location& destLocation,
182 VkDescriptorType descriptorType,
183 const VkDescriptorBufferInfo* pBufferInfo)
185 return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u, descriptorType, DE_NULL, pBufferInfo, DE_NULL);
188 inline DescriptorSetUpdateBuilder& writeSingle (VkDescriptorSet destSet,
189 const Location& destLocation,
190 VkDescriptorType descriptorType,
191 const VkBufferView* pTexelBufferView)
193 return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u, descriptorType, DE_NULL, DE_NULL, pTexelBufferView);
196 inline DescriptorSetUpdateBuilder& writeArray (VkDescriptorSet destSet,
197 const Location& destLocation,
198 VkDescriptorType descriptorType,
199 deUint32 numDescriptors,
200 const VkDescriptorImageInfo* pImageInfo)
202 return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, numDescriptors, descriptorType, pImageInfo, DE_NULL, DE_NULL);
205 inline DescriptorSetUpdateBuilder& writeArray (VkDescriptorSet destSet,
206 const Location& destLocation,
207 VkDescriptorType descriptorType,
208 deUint32 numDescriptors,
209 const VkDescriptorBufferInfo* pBufferInfo)
211 return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, numDescriptors, descriptorType, DE_NULL, pBufferInfo, DE_NULL);
214 inline DescriptorSetUpdateBuilder& writeArray (VkDescriptorSet destSet,
215 const Location& destLocation,
216 VkDescriptorType descriptorType,
217 deUint32 numDescriptors,
218 const VkBufferView* pTexelBufferView)
220 return write(destSet, destLocation.m_binding, destLocation.m_arrayElement, numDescriptors, descriptorType, DE_NULL, DE_NULL, pTexelBufferView);
223 inline DescriptorSetUpdateBuilder& copySingle (VkDescriptorSet srcSet,
224 const Location& srcLocation,
225 VkDescriptorSet destSet,
226 const Location& destLocation)
228 return copy(srcSet, srcLocation.m_binding, srcLocation.m_arrayElement, destSet, destLocation.m_binding, destLocation.m_arrayElement, 1u);
231 inline DescriptorSetUpdateBuilder& copyArray (VkDescriptorSet srcSet,
232 const Location& srcLocation,
233 VkDescriptorSet destSet,
234 const Location& destLocation,
237 return copy(srcSet, srcLocation.m_binding, srcLocation.m_arrayElement, destSet, destLocation.m_binding, destLocation.m_arrayElement, count);
241 DescriptorSetUpdateBuilder& operator= (const DescriptorSetUpdateBuilder&); // delete
243 struct WriteDescriptorInfo
245 std::vector<VkDescriptorImageInfo> imageInfos;
246 std::vector<VkDescriptorBufferInfo> bufferInfos;
247 std::vector<VkBufferView> texelBufferViews;
250 std::vector<WriteDescriptorInfo> m_writeDescriptorInfos;
252 std::vector<VkWriteDescriptorSet> m_writes;
253 std::vector<VkCopyDescriptorSet> m_copies;
258 #endif // _VKBUILDERUTIL_HPP