@@ -26,29 +26,23 @@ namespace FCT
2626
2727 void VK_PassResource::addConstBuffer (RHI ::ConstBuffer* buffer)
2828 {
29- if (buffer) {
30- m_constBuffers.push_back (buffer);
31- markAllDescriptorSetsDirty ();
32- markAllDescriptorSetsNeedRecreate ();
33- }
29+ m_constBuffers.push_back (buffer);
30+ markAllDescriptorSetsDirty ();
31+ markAllDescriptorSetsNeedRecreate ();
3432 }
3533
3634 void VK_PassResource::addSampler (Sampler* sampler, SamplerElement element)
3735 {
38- if (sampler) {
39- m_samplers.emplace_back (sampler, element);
40- markAllDescriptorSetsDirty ();
41- markAllDescriptorSetsNeedRecreate ();
42- }
36+ m_samplers.emplace_back (sampler, element);
37+ markAllDescriptorSetsDirty ();
38+ markAllDescriptorSetsNeedRecreate ();
4339 }
4440
4541 void VK_PassResource::addTexture (Image* texture, TextureElement element)
4642 {
47- if (texture) {
48- m_textures[element] = texture;
49- markAllDescriptorSetsDirty ();
50- markAllDescriptorSetsNeedRecreate ();
51- }
43+ m_textures[element] = texture;
44+ markAllDescriptorSetsDirty ();
45+ markAllDescriptorSetsNeedRecreate ();
5246 }
5347
5448 void VK_PassResource::setTexture (Image* texture, TextureElement element)
@@ -103,6 +97,7 @@ bool VK_PassResource::createDescriptorSetsAndLayouts(uint32_t frameIdx,
10397 std::map<uint32_t , std::vector<vk::DescriptorSetLayoutBinding>> setBindings;
10498
10599 for (auto * constBuffer : m_constBuffers) {
100+ if (!constBuffer) continue ;
106101 auto * vkConstBuffer = static_cast <RHI ::VK_ConstBuffer*>(constBuffer);
107102 auto uniformLayout = vkConstBuffer->layout ();
108103 auto [setIndex, binding] = m_ctx->getGenerator ()->getLayoutBinding (uniformLayout);
@@ -246,6 +241,9 @@ bool VK_PassResource::createDescriptorSetsAndLayouts(uint32_t frameIdx,
246241
247242 for (size_t i = 0 ; i < m_constBuffers.size (); ++i) {
248243 auto * srcConstBuffer = m_constBuffers[i];
244+ if (!srcConstBuffer) {
245+ continue ;
246+ }
249247 auto * constBuffer = static_cast <RHI ::VK_ConstBuffer*>(srcConstBuffer);
250248 auto uniformLayout = constBuffer->layout ();
251249 auto [setIndex, binding] = m_ctx->getGenerator ()->getLayoutBinding (uniformLayout);
@@ -268,17 +266,23 @@ bool VK_PassResource::createDescriptorSetsAndLayouts(uint32_t frameIdx,
268266 }
269267
270268 for (auto & [element, texture ] : m_textures) {
271- auto * vkTexture = static_cast <RHI ::VK_TextureView*>(texture->currentTextureView ());
272269 auto [setIndex, binding] = m_ctx->getGenerator ()->getTextureBinding (element);
273270
274- if (setIndex >= m_descriptorSets[frameIdx].size () || !vkTexture ) {
271+ if (setIndex >= m_descriptorSets[frameIdx].size ()) {
275272 continue ;
276273 }
277274
278275 vk::DescriptorImageInfo imageInfo;
279276 imageInfo.setImageLayout (vk::ImageLayout::eShaderReadOnlyOptimal);
280- imageInfo.setImageView (vkTexture->view ());
281277 imageInfo.setSampler (nullptr );
278+
279+ if (texture) {
280+ auto * vkTexture = static_cast <RHI ::VK_TextureView*>(texture->currentTextureView ());
281+ imageInfo.setImageView (vkTexture ? vkTexture->view () : VK_NULL_HANDLE );
282+ } else {
283+ imageInfo.setImageView (VK_NULL_HANDLE );
284+ }
285+
282286 textureInfos.push_back (imageInfo);
283287
284288 vk::WriteDescriptorSet descriptorWrite;
@@ -287,24 +291,30 @@ bool VK_PassResource::createDescriptorSetsAndLayouts(uint32_t frameIdx,
287291 descriptorWrite.setDstArrayElement (0 );
288292 descriptorWrite.setDescriptorType (vk::DescriptorType::eSampledImage);
289293 descriptorWrite.setDescriptorCount (1 );
290- descriptorWrite.setPImageInfo (&textureInfos[textureInfos. size () - 1 ] );
294+ descriptorWrite.setPImageInfo (&textureInfos. back () );
291295
292296 descriptorWrites.push_back (descriptorWrite);
293297 }
294298
295299 for (size_t i = 0 ; i < m_samplers.size (); ++i) {
296300 auto & [sampler, element] = m_samplers[i];
297- auto * vkSampler = static_cast <RHI ::VK_Sampler*>(sampler);
298301 auto [setIndex, binding] = m_ctx->getGenerator ()->getSamplerBinding (element);
299302
300- if (setIndex >= m_descriptorSets[frameIdx].size () || !vkSampler ) {
303+ if (setIndex >= m_descriptorSets[frameIdx].size ()) {
301304 continue ;
302305 }
303306
304307 vk::DescriptorImageInfo samplerInfo;
305- samplerInfo.setSampler (vkSampler->getSampler ());
306308 samplerInfo.setImageView (nullptr );
307309 samplerInfo.setImageLayout (vk::ImageLayout::eUndefined);
310+
311+ if (sampler) {
312+ auto * vkSampler = static_cast <RHI ::VK_Sampler*>(sampler);
313+ samplerInfo.setSampler (vkSampler->getSampler ());
314+ } else {
315+ samplerInfo.setSampler (VK_NULL_HANDLE );
316+ }
317+
308318 samplerInfos.push_back (samplerInfo);
309319
310320 vk::WriteDescriptorSet descriptorWrite;
@@ -313,7 +323,7 @@ bool VK_PassResource::createDescriptorSetsAndLayouts(uint32_t frameIdx,
313323 descriptorWrite.setDstArrayElement (0 );
314324 descriptorWrite.setDescriptorType (vk::DescriptorType::eSampler);
315325 descriptorWrite.setDescriptorCount (1 );
316- descriptorWrite.setPImageInfo (&samplerInfos[samplerInfos. size () - 1 ] );
326+ descriptorWrite.setPImageInfo (&samplerInfos. back () );
317327
318328 descriptorWrites.push_back (descriptorWrite);
319329 }
0 commit comments