@@ -257,4 +257,76 @@ TEST_F(VulkanFeaturesTest, CheckSelectedFeatures_MissingShaderDrawParameters) {
257257#endif
258258}
259259
260+ // allAvailableExtensions initial state ********************************************
261+ TEST_F (VulkanFeaturesTest, AllAvailableExtensionsInitiallyEmpty) {
262+ const igl::vulkan::VulkanContextConfig config;
263+ const igl::vulkan::VulkanFeatures features (config);
264+
265+ EXPECT_TRUE (features.allAvailableExtensions (igl::vulkan::VulkanFeatures::ExtensionType::Instance)
266+ .empty ());
267+ EXPECT_TRUE (
268+ features.allAvailableExtensions (igl::vulkan::VulkanFeatures::ExtensionType::Device).empty ());
269+ }
270+
271+ // available initial state **********************************************************
272+ TEST_F (VulkanFeaturesTest, AvailableReturnsFalseWhenNoExtensionsEnumerated) {
273+ const igl::vulkan::VulkanContextConfig config;
274+ const igl::vulkan::VulkanFeatures features (config);
275+
276+ EXPECT_FALSE (
277+ features.available (" VK_KHR_swapchain" , igl::vulkan::VulkanFeatures::ExtensionType::Device));
278+ EXPECT_FALSE (features.available (VK_KHR_SURFACE_EXTENSION_NAME ,
279+ igl::vulkan::VulkanFeatures::ExtensionType::Instance));
280+ }
281+
282+ // enableCommonInstanceExtensions without available extensions *********************
283+ TEST_F (VulkanFeaturesTest, EnableCommonInstanceExtensionsNoAvailableExtensions) {
284+ const igl::vulkan::VulkanContextConfig config;
285+ igl::vulkan::VulkanFeatures features (config);
286+
287+ // Without enumerate(), extensions_ is empty, so enable() is a no-op for all ext.
288+ features.enableCommonInstanceExtensions (config);
289+
290+ EXPECT_FALSE (features.has_VK_KHR_portability_enumeration );
291+ EXPECT_FALSE (features.has_VK_KHR_get_surface_capabilities2 );
292+ EXPECT_FALSE (features.has_VK_EXT_headless_surface );
293+ }
294+
295+ // enableCommonDeviceExtensions without available extensions / descriptor buffer always off
296+ TEST_F (VulkanFeaturesTest, EnableCommonDeviceExtensionsNoAvailableExtensions) {
297+ const igl::vulkan::VulkanContextConfig config;
298+ igl::vulkan::VulkanFeatures features (config);
299+
300+ features.enableCommonDeviceExtensions (config);
301+
302+ EXPECT_FALSE (features.has_VK_EXT_index_type_uint8 );
303+ EXPECT_FALSE (features.has_VK_KHR_timeline_semaphore );
304+ EXPECT_FALSE (features.has_VK_KHR_synchronization2 );
305+ EXPECT_FALSE (features.has_VK_KHR_8bit_storage );
306+ EXPECT_FALSE (features.has_VK_KHR_buffer_device_address );
307+ // Descriptor buffer is intentionally always disabled (hardcoded false in
308+ // enableCommonDeviceExtensions).
309+ EXPECT_FALSE (features.has_VK_EXT_descriptor_buffer );
310+ }
311+
312+ // checkSelectedFeatures negative case with descriptor indexing enabled ***********
313+ TEST_F (VulkanFeaturesTest, CheckSelectedFeaturesDescriptorIndexingEnabledMissingFeature) {
314+ igl::setDebugBreakEnabled (false );
315+
316+ igl::vulkan::VulkanContextConfig config;
317+ config.enableDescriptorIndexing = true ;
318+
319+ const igl::vulkan::VulkanFeatures requested (config);
320+ igl::vulkan::VulkanFeatures available (config);
321+ // Remove one of the required descriptor-indexing features from "available"
322+ available.featuresDescriptorIndexing .shaderSampledImageArrayNonUniformIndexing = VK_FALSE ;
323+
324+ const igl::Result result = requested.checkSelectedFeatures (available);
325+ #if IGL_PLATFORM_APPLE
326+ EXPECT_TRUE (result.isOk ());
327+ #else
328+ EXPECT_FALSE (result.isOk ());
329+ #endif
330+ }
331+
260332} // namespace igl::tests
0 commit comments