Lugdunum  0.1.0
DescriptorSet.cpp
Go to the documentation of this file.
2 
5 
6 namespace lug {
7 namespace Graphics {
8 namespace Vulkan {
9 namespace API {
10 namespace Builder {
11 
13 
14 bool DescriptorSet::build(API::DescriptorSet& instance, VkResult* returnResult) {
15  std::vector<API::DescriptorSet> descriptorSets(1);
16  if (!build(descriptorSets, returnResult)) {
17  return false;
18  }
19  instance = std::move(descriptorSets[0]);
20  return true;
21 }
22 
23 std::unique_ptr<API::DescriptorSet> DescriptorSet::build(VkResult* returnResult) {
24  std::vector<API::DescriptorSet> descriptorSets(1);
25  return build(descriptorSets, returnResult) ? std::make_unique<API::DescriptorSet>(std::move(descriptorSets[0])) : nullptr;
26 }
27 
28 bool DescriptorSet::build(std::vector<API::DescriptorSet>& descriptorSets, VkResult* returnResult) {
29  // Create the descriptorSet creation information for vkCreateDescriptorSet
30  const VkDescriptorSetAllocateInfo allocateInfo{
31  /* allocateInfo.sType */ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
32  /* allocateInfo.pNext */ nullptr,
33  /* allocateInfo.descriptorPool */ static_cast<VkDescriptorPool>(_descriptorPool),
34  /* allocateInfo.descriptorSetCount */ static_cast<uint32_t>(descriptorSets.size()),
35  /* allocateInfo.pSetLayouts */ _descriptorSetLayouts.data(),
36  };
37 
38  std::vector<VkDescriptorSet> vkDescriptorSets(descriptorSets.size());
39 
40  // Create the descriptorSets
41  VkResult result = vkAllocateDescriptorSets(static_cast<VkDevice>(_device), &allocateInfo, vkDescriptorSets.data());
42 
43  if (returnResult) {
44  *returnResult = result;
45  }
46 
47  if (result != VK_SUCCESS) {
48  return false;
49  }
50 
51  for (uint32_t i = 0; i < descriptorSets.size(); ++i) {
52  descriptorSets[i] = API::DescriptorSet(vkDescriptorSets[i], &_device);
53  }
54 
55  return true;
56 }
57 
58 std::vector<std::unique_ptr<API::DescriptorSet>> DescriptorSet::build(uint32_t count, VkResult* returnResult) {
59  // Output vector
60  std::vector<API::DescriptorSet> descriptorSets(count);
61  std::vector<std::unique_ptr<API::DescriptorSet>> outDescriptorSets(count);
62 
63  // Build the command buffers
64  if (!build(descriptorSets, returnResult)) {
65  return {};
66  }
67 
68  // Initialize the unique_ptr array
69  for (uint32_t i = 0; i < count; ++i) {
70  outDescriptorSets[i] = std::make_unique<API::DescriptorSet>(std::move(descriptorSets[i]));
71  }
72 
73  return outDescriptorSets;
74 }
75 
76 } // Builder
77 } // API
78 } // Vulkan
79 } // Graphics
80 } // lug
std::vector< VkDescriptorSetLayout > _descriptorSetLayouts
bool build(API::DescriptorSet &instance, VkResult *returnResult=nullptr)
DescriptorSet(const API::Device &device, const API::DescriptorPool &descriptorPool)