11#include " descriptor_manager.h"
22#include < iostream>
33#include < array>
4- #include < string.h >
4+ #include < cstring >
55#include " transform_component.h"
66#include " camera_component.h"
77
@@ -11,9 +11,7 @@ DescriptorManager::DescriptorManager(VulkanDevice& device)
1111}
1212
1313// Destructor
14- DescriptorManager::~DescriptorManager () {
15- // RAII will handle destruction
16- }
14+ DescriptorManager::~DescriptorManager () = default ;
1715
1816// Create descriptor pool
1917bool DescriptorManager::createDescriptorPool (uint32_t maxSets) {
@@ -88,9 +86,58 @@ bool DescriptorManager::createUniformBuffers(Entity* entity, uint32_t maxFramesI
8886 }
8987}
9088
89+ bool DescriptorManager::update_descriptor_sets (Entity* entity, uint32_t maxFramesInFlight, bool & value1) {
90+ assert (entityResources[entity].uniformBuffers .size () == maxFramesInFlight);
91+ // Update descriptor sets
92+ for (size_t i = 0 ; i < maxFramesInFlight; i++) {
93+ // Create descriptor buffer info
94+ vk::DescriptorBufferInfo bufferInfo{
95+ .buffer = *entityResources[entity].uniformBuffers [i],
96+ .offset = 0 ,
97+ .range = sizeof (UniformBufferObject)
98+ };
99+
100+ // Create descriptor image info
101+ vk::DescriptorImageInfo imageInfo{
102+ // These would be set based on the texture resources
103+ // .sampler = textureSampler,
104+ // .imageView = textureImageView,
105+ .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal
106+ };
107+
108+ // Create descriptor writes
109+ std::array<vk::WriteDescriptorSet, 2 > descriptorWrites = {
110+ vk::WriteDescriptorSet{
111+ .dstSet = entityResources[entity].descriptorSets [i],
112+ .dstBinding = 0 ,
113+ .dstArrayElement = 0 ,
114+ .descriptorCount = 1 ,
115+ .descriptorType = vk::DescriptorType::eUniformBuffer,
116+ .pImageInfo = nullptr ,
117+ .pBufferInfo = &bufferInfo,
118+ .pTexelBufferView = nullptr
119+ },
120+ vk::WriteDescriptorSet{
121+ .dstSet = entityResources[entity].descriptorSets [i],
122+ .dstBinding = 1 ,
123+ .dstArrayElement = 0 ,
124+ .descriptorCount = 1 ,
125+ .descriptorType = vk::DescriptorType::eCombinedImageSampler,
126+ .pImageInfo = &imageInfo,
127+ .pBufferInfo = nullptr ,
128+ .pTexelBufferView = nullptr
129+ }
130+ };
131+
132+ // Update descriptor sets
133+ device.getDevice ().updateDescriptorSets (descriptorWrites, nullptr );
134+ }
135+ return false ;
136+ }
91137// Create descriptor sets for an entity
92138bool DescriptorManager::createDescriptorSets (Entity* entity, const std::string& texturePath, vk::DescriptorSetLayout descriptorSetLayout, uint32_t maxFramesInFlight) {
93139 try {
140+ assert (entityResources.find (entity) != entityResources.end ());
94141 // Create descriptor sets for each frame in flight
95142 std::vector<vk::DescriptorSetLayout> layouts (maxFramesInFlight, descriptorSetLayout);
96143
@@ -101,61 +148,10 @@ bool DescriptorManager::createDescriptorSets(Entity* entity, const std::string&
101148 .pSetLayouts = layouts.data ()
102149 };
103150
104- // Allocate descriptor sets
105- auto descriptorSets = device.getDevice ().allocateDescriptorSets (allocInfo);
151+ entityResources[entity].descriptorSets = device.getDevice ().allocateDescriptorSets (allocInfo);
106152
107- // Store descriptor sets
108- // Convert from vk::raii::DescriptorSet to vk::DescriptorSet
109- std::vector<vk::DescriptorSet> nonRaiiDescriptorSets;
110- for (const auto & ds : descriptorSets) {
111- nonRaiiDescriptorSets.push_back (*ds);
112- }
113- entityResources[entity].descriptorSets = nonRaiiDescriptorSets;
114-
115- // Update descriptor sets
116- for (size_t i = 0 ; i < maxFramesInFlight; i++) {
117- // Create descriptor buffer info
118- vk::DescriptorBufferInfo bufferInfo{
119- .buffer = *entityResources[entity].uniformBuffers [i],
120- .offset = 0 ,
121- .range = sizeof (UniformBufferObject)
122- };
123-
124- // Create descriptor image info
125- vk::DescriptorImageInfo imageInfo{
126- // These would be set based on the texture resources
127- // .sampler = textureSampler,
128- // .imageView = textureImageView,
129- .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal
130- };
131-
132- // Create descriptor writes
133- std::array<vk::WriteDescriptorSet, 2 > descriptorWrites = {
134- vk::WriteDescriptorSet{
135- .dstSet = descriptorSets[i],
136- .dstBinding = 0 ,
137- .dstArrayElement = 0 ,
138- .descriptorCount = 1 ,
139- .descriptorType = vk::DescriptorType::eUniformBuffer,
140- .pImageInfo = nullptr ,
141- .pBufferInfo = &bufferInfo,
142- .pTexelBufferView = nullptr
143- },
144- vk::WriteDescriptorSet{
145- .dstSet = descriptorSets[i],
146- .dstBinding = 1 ,
147- .dstArrayElement = 0 ,
148- .descriptorCount = 1 ,
149- .descriptorType = vk::DescriptorType::eCombinedImageSampler,
150- .pImageInfo = &imageInfo,
151- .pBufferInfo = nullptr ,
152- .pTexelBufferView = nullptr
153- }
154- };
155-
156- // Update descriptor sets
157- device.getDevice ().updateDescriptorSets (descriptorWrites, nullptr );
158- }
153+ bool value1;
154+ if (update_descriptor_sets (entity, maxFramesInFlight, value1)) return value1;
159155
160156 return true ;
161157 } catch (const std::exception& e) {
@@ -192,6 +188,8 @@ void DescriptorManager::updateUniformBuffer(uint32_t currentImage, Entity* entit
192188 ubo.lightPos = glm::vec4 (0 .0f , 5 .0f , 0 .0f , 1 .0f );
193189 ubo.lightColor = glm::vec4 (1 .0f , 1 .0f , 1 .0f , 1 .0f );
194190
191+ assert (entityResources.find (entity) != entityResources.end ());
192+ assert (entityResources[entity].uniformBuffers .size () > currentImage);
195193 // Copy data to uniform buffer
196194 memcpy (entityResources[entity].uniformBuffersMapped [currentImage], &ubo, sizeof (ubo));
197195}
0 commit comments