diff --git a/modules/algorithm/src/vkcv/algorithm/SinglePassDownsampler.cpp b/modules/algorithm/src/vkcv/algorithm/SinglePassDownsampler.cpp
index ea6331b022437dcb7eb623bd268467e7deca1e8f..d022fbed739255bac4fec06136d873c08cae380a 100644
--- a/modules/algorithm/src/vkcv/algorithm/SinglePassDownsampler.cpp
+++ b/modules/algorithm/src/vkcv/algorithm/SinglePassDownsampler.cpp
@@ -146,7 +146,7 @@ namespace vkcv::algorithm {
 		 vkcv::Downsampler(core),
 		 m_pipeline(),
 		
-		 m_descriptorSetLayout(m_core.createDescriptorSetLayout(getDescriptorBindings(sampler))),
+		 m_descriptorSetLayout(),
 		 m_descriptorSets(),
 		
 		 m_globalCounter(m_core.createBuffer<uint32_t>(
@@ -155,6 +155,21 @@ namespace vkcv::algorithm {
 		 )),
 		 
 		 m_sampler(sampler) {
+		const auto& featureManager = m_core.getContext().getFeatureManager();
+		
+		const bool partialBound = featureManager.checkFeatures<vk::PhysicalDeviceDescriptorIndexingFeatures>(
+				vk::StructureType::ePhysicalDeviceDescriptorIndexingFeatures,
+				[](const vk::PhysicalDeviceDescriptorIndexingFeatures& features) {
+					return features.descriptorBindingPartiallyBound;
+				}
+		);
+		
+		if (!partialBound) {
+			return;
+		}
+		
+		m_descriptorSetLayout = m_core.createDescriptorSetLayout(getDescriptorBindings(sampler));
+		
 		vkcv::shader::GLSLCompiler compiler (vkcv::shader::GLSLCompileTarget::SUBGROUP_OP);
 		
 		vk::PhysicalDeviceSubgroupProperties subgroupProperties;
@@ -169,8 +184,6 @@ namespace vkcv::algorithm {
 			compiler.setDefine("SPD_NO_WAVE_OPERATIONS", "1");
 		}
 		
-		const auto& featureManager = m_core.getContext().getFeatureManager();
-		
 		const bool float16Support = (
 				featureManager.checkFeatures<vk::PhysicalDeviceFloat16Int8FeaturesKHR>(
 						vk::StructureType::ePhysicalDeviceShaderFloat16Int8FeaturesKHR,
@@ -229,13 +242,20 @@ namespace vkcv::algorithm {
 	
 	void SinglePassDownsampler::recordDownsampling(const CommandStreamHandle &cmdStream,
 												   const ImageHandle &image) {
+		Downsampler& fallback = m_core.getDownsampler();
+		
+		if (m_pipeline) {
+			fallback.recordDownsampling(cmdStream, image);
+			return;
+		}
+		
 		const uint32_t mipLevels = m_core.getImageMipLevels(image);
 		const uint32_t depth = m_core.getImageDepth(image);
 		
 		m_core.prepareImageForSampling(cmdStream, image);
 		
 		if ((mipLevels < 4) || (depth > 1) || (!m_core.isImageSupportingStorage(image))) {
-			m_core.getDownsampler().recordDownsampling(cmdStream, image);
+			fallback.recordDownsampling(cmdStream, image);
 			return;
 		}
 		
diff --git a/modules/scene/src/vkcv/scene/Scene.cpp b/modules/scene/src/vkcv/scene/Scene.cpp
index cb8193708efcac7eb5e614353aa0b30101078833..9a8ded0f70880125ed1efeda9a6845e1dc735d22 100644
--- a/modules/scene/src/vkcv/scene/Scene.cpp
+++ b/modules/scene/src/vkcv/scene/Scene.cpp
@@ -284,26 +284,12 @@ namespace vkcv::scene {
 		);
 		
 		const vkcv::FeatureManager& featureManager = core.getContext().getFeatureManager();
-		const bool partialBound = featureManager.checkFeatures<vk::PhysicalDeviceDescriptorIndexingFeatures>(
-				vk::StructureType::ePhysicalDeviceDescriptorIndexingFeatures,
-				[](const vk::PhysicalDeviceDescriptorIndexingFeatures& features) {
-					return features.descriptorBindingPartiallyBound;
-				}
-		);
 		
-		vkcv::Downsampler& downsampler = core.getDownsampler();
 		vkcv::algorithm::SinglePassDownsampler spdDownsampler (core, sampler);
-		
 		auto mipStream = core.createCommandStream(vkcv::QueueType::Graphics);
 		
-		if (partialBound) {
-			for (auto& material : scene.m_materials) {
-				material.m_data.recordMipChainGeneration(mipStream, spdDownsampler);
-			}
-		} else {
-			for (auto& material : scene.m_materials) {
-				material.m_data.recordMipChainGeneration(mipStream, downsampler);
-			}
+		for (auto& material : scene.m_materials) {
+			material.m_data.recordMipChainGeneration(mipStream, spdDownsampler);
 		}
 		
 		core.submitCommandStream(mipStream, false);