Inverted samplers/bound textures in descriptor binding 97/321597/1
authorDavid Steele <david.steele@samsung.com>
Tue, 25 Mar 2025 14:53:08 +0000 (14:53 +0000)
committerDavid Steele <david.steele@samsung.com>
Tue, 25 Mar 2025 14:53:57 +0000 (14:53 +0000)
Change-Id: I1c3d57b0a79d11d6118271ba38b1d5948b1dafe3

dali/internal/graphics/vulkan-impl/vulkan-command-buffer-impl.cpp

index 15b1024a60d3d5d78b8dd92644408610f1c6e417..1c14a033c1dfbe4af3eeede3defe78d478df5217 100644 (file)
@@ -517,35 +517,45 @@ void CommandBufferImpl::BindResources(vk::DescriptorSet descriptorSet)
   auto& samplers   = reflection.GetSamplers();
 
   // Deferred texture bindings:
-  uint32_t binding = 1;
-  imageInfos.reserve(mDeferredTextureBindings.size() + 1);
-  for(auto& textureBinding : mDeferredTextureBindings)
+  if(!samplers.empty()) // Ignore any texture bindings if the program is not expecting them
   {
-    imageInfos.emplace_back();
-    imageInfos.back()
-      .setImageLayout(vk::ImageLayout::eShaderReadOnlyOptimal)
-      .setImageView(textureBinding.imageView)
-      .setSampler(textureBinding.sampler);
-
-    descriptorWrites.emplace_back();
+    imageInfos.reserve(samplers.size() + 1); // mDeferredTextureBindings.size() + 1);
     for(auto& info : samplers)
     {
-      if(info.location == textureBinding.binding)
+      bool     found   = false;
+      uint32_t binding = 1;
+      for(auto& textureBinding : mDeferredTextureBindings)
+      {
+        if(info.location == textureBinding.binding)
+        {
+          found   = true;
+          binding = info.binding;
+          imageInfos.emplace_back();
+          imageInfos.back()
+            .setImageLayout(vk::ImageLayout::eShaderReadOnlyOptimal)
+            .setImageView(textureBinding.imageView)
+            .setSampler(textureBinding.sampler);
+          break;
+        }
+      }
+      if(found)
       {
-        binding = info.binding;
-        break;
+        descriptorWrites.emplace_back();
+
+        descriptorWrites.back()
+          .setPImageInfo(&imageInfos.back())
+          .setDescriptorType(vk::DescriptorType::eCombinedImageSampler)
+          .setDescriptorCount(1)
+          .setDstSet(descriptorSet)
+          .setDstBinding(binding)
+          .setDstArrayElement(0);
       }
     }
-
-    descriptorWrites.back()
-      .setPImageInfo(&imageInfos.back())
-      .setDescriptorType(vk::DescriptorType::eCombinedImageSampler)
-      .setDescriptorCount(1)
-      .setDstSet(descriptorSet)
-      .setDstBinding(binding)
-      .setDstArrayElement(0);
   }
-  mGraphicsDevice->GetLogicalDevice().updateDescriptorSets(uint32_t(descriptorWrites.size()), descriptorWrites.data(), 0, nullptr);
+  if(!descriptorWrites.empty())
+  {
+    mGraphicsDevice->GetLogicalDevice().updateDescriptorSets(uint32_t(descriptorWrites.size()), descriptorWrites.data(), 0, nullptr);
+  }
 
   auto pipelineLayout = reflection.GetVkPipelineLayout();