diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/buffer_usm.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/buffer_usm.cpp
index 9d93397a6c94e..82ac7b27e8931 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/buffer_usm.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/buffer_usm.cpp
@@ -2,7 +2,7 @@
 // REQUIRES: vulkan
 
 // RUN: %{build} %link-vulkan -o %t.out %if target-spir %{ -Wno-ignored-attributes %}
-// RUN: %{run} env NEOReadDebugKeys=1 UseBindlessMode=1 UseExternalAllocatorForSshAndDsh=1 %t.out
+// RUN: %{run} %t.out
 
 /**
  * This test does not use any image specific APIs.
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/depth_format.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/depth_format.cpp
index 4b78f18900f56..afd4960919f06 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/depth_format.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/depth_format.cpp
@@ -1,3 +1,4 @@
+// REQUIRES: aspect-ext_oneapi_bindless_images
 // REQUIRES: aspect-ext_oneapi_external_memory_import || (windows && level_zero && aspect-ext_oneapi_bindless_images)
 // REQUIRES: vulkan
 
@@ -128,9 +129,8 @@ bool runTest(const sycl::device &syclDevice, sycl::range<2> dims,
   {
     vkInputImage = vkutil::createImage(imgType, imgInFormat, imgExtent,
                                        VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
-                                           VK_IMAGE_USAGE_TRANSFER_DST_BIT |
-                                           VK_IMAGE_USAGE_STORAGE_BIT,
-                                       1);
+                                           VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+                                       1 /*mipLevels*/);
     VkMemoryRequirements memRequirements;
     auto inputImageMemoryTypeIndex = vkutil::getImageMemoryTypeIndex(
         vkInputImage, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, memRequirements);
@@ -141,9 +141,8 @@ bool runTest(const sycl::device &syclDevice, sycl::range<2> dims,
 
     vkOutputImage = vkutil::createImage(imgType, imgOutFormat, imgExtent,
                                         VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
-                                            VK_IMAGE_USAGE_TRANSFER_DST_BIT |
-                                            VK_IMAGE_USAGE_STORAGE_BIT,
-                                        1);
+                                            VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+                                        1 /*mipLevels*/);
     VkMemoryRequirements outputMemRequirements;
     auto outputImageMemoryTypeIndex = vkutil::getImageMemoryTypeIndex(
         vkOutputImage, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
@@ -373,7 +372,7 @@ int main() {
     return EXIT_FAILURE;
   }
 
-  auto testPassed = runTest(syclDevice, {16, 16}, {16, 16});
+  auto testPassed = runTest(syclDevice, {128, 128}, {16, 16});
 
   if (vkutil::cleanup() != VK_SUCCESS) {
     std::cerr << "Cleanup failed!\n";
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/mipmaps.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/mipmaps.cpp
index d9e72f104f6be..4594e4da59ae1 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/mipmaps.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/mipmaps.cpp
@@ -1,3 +1,4 @@
+// REQUIRES: aspect-ext_oneapi_bindless_images
 // REQUIRES: aspect-ext_oneapi_external_memory_import
 // REQUIRES: aspect-ext_oneapi_mipmap
 // REQUIRES: vulkan
@@ -267,8 +268,7 @@ bool run_test(sycl::range<NDims> dims, sycl::range<NDims> localSize,
   // Create input image memory
   auto inputImage = vkutil::createImage(imgType, format, {width, height, depth},
                                         VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
-                                            VK_IMAGE_USAGE_TRANSFER_DST_BIT |
-                                            VK_IMAGE_USAGE_STORAGE_BIT,
+                                            VK_IMAGE_USAGE_TRANSFER_DST_BIT,
                                         mipLevels);
   VkMemoryRequirements memRequirements;
   auto inputImageMemoryTypeIndex = vkutil::getImageMemoryTypeIndex(
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images.cpp
index 9c13b5b445438..319fe8b2a4f3f 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images.cpp
@@ -1,3 +1,4 @@
+// REQUIRES: aspect-ext_oneapi_bindless_images
 // REQUIRES: aspect-ext_oneapi_external_memory_import || (windows && level_zero && aspect-ext_oneapi_bindless_images)
 // REQUIRES: vulkan
 
@@ -302,14 +303,13 @@ bool run_test(sycl::range<NDims> dims, sycl::range<NDims> localSize,
 
   printString("Creating input image\n");
   // Create input image memory
-  auto inputImage = vkutil::createImage(imgType, format, {width, height, depth},
-                                        VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
-                                            VK_IMAGE_USAGE_TRANSFER_DST_BIT |
-                                            VK_IMAGE_USAGE_STORAGE_BIT,
-                                        1 /*mipLevels*/
+  auto inputImage = vkutil::createImage(
+      imgType, format, {width, height, depth},
+      VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+      1 /*mipLevels*/
 #ifdef ENABLE_LINEAR_TILING
-                                        ,
-                                        true /*linearTiling*/
+      ,
+      true /*linearTiling*/
 #endif
   );
   VkMemoryRequirements memRequirements;
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images_semaphore.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images_semaphore.cpp
index 9b3409defe00f..321c9a489455c 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images_semaphore.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/sampled_images_semaphore.cpp
@@ -1,3 +1,4 @@
+// REQUIRES: aspect-ext_oneapi_bindless_images
 // REQUIRES: target-nvidia || (windows && level_zero && aspect-ext_oneapi_bindless_images)
 // REQUIRES: vulkan
 
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images.cpp
index 96e03e7730e42..fc1a6b90911b8 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images.cpp
@@ -1,3 +1,4 @@
+// REQUIRES: aspect-ext_oneapi_bindless_images
 // REQUIRES: aspect-ext_oneapi_external_memory_import || (windows && level_zero && aspect-ext_oneapi_bindless_images)
 // REQUIRES: vulkan
 
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_semaphore.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_semaphore.cpp
index 2a2c907e58e2e..53497f0b0af6a 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_semaphore.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_semaphore.cpp
@@ -1,3 +1,4 @@
+// REQUIRES: aspect-ext_oneapi_bindless_images
 // REQUIRES: aspect-ext_oneapi_external_semaphore_import
 // REQUIRES: aspect-ext_oneapi_external_memory_import
 // REQUIRES: vulkan
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_timeline_semaphore.cpp b/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_timeline_semaphore.cpp
index ac410be34df1a..fff6de90d09f0 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_timeline_semaphore.cpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/unsampled_images_timeline_semaphore.cpp
@@ -1,3 +1,4 @@
+// REQUIRES: aspect-ext_oneapi_bindless_images
 // REQUIRES: aspect-ext_oneapi_external_memory_import
 // REQUIRES: aspect-ext_oneapi_external_semaphore_import
 // REQUIRES: vulkan
diff --git a/sycl/test-e2e/bindless_images/vulkan_interop/vulkan_common.hpp b/sycl/test-e2e/bindless_images/vulkan_interop/vulkan_common.hpp
index 85cfa272ba0d3..e14f5f65230f0 100644
--- a/sycl/test-e2e/bindless_images/vulkan_interop/vulkan_common.hpp
+++ b/sycl/test-e2e/bindless_images/vulkan_interop/vulkan_common.hpp
@@ -61,8 +61,11 @@ static VkCommandPool vk_transferCmdPool;
 static VkCommandBuffer vk_computeCmdBuffer;
 static VkCommandBuffer vk_transferCmdBuffers[2];
 
+static bool supportsDedicatedAllocation = false;
 static bool requiresDedicatedAllocation = false;
 
+static bool supportsExternalSemaphore = false;
+
 // A static debug callback function that relays messages from the Vulkan
 // validation layer to the terminal.
 static VKAPI_ATTR VkBool32 VKAPI_CALL
@@ -137,8 +140,11 @@ VkResult setupInstance() {
   std::vector<const char *> requiredInstanceExtensions = {
       VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
       VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
-      VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,
-      VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME};
+      VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME};
+
+  std::vector<const char *> optionalInstanceExtensions = {
+      VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME,
+      VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME};
 
   // Make sure that our required instance extensions are supported by the
   // running Vulkan instance.
@@ -146,8 +152,23 @@ VkResult setupInstance() {
     std::string requiredExtension = requiredInstanceExtensions[i];
     if (std::find(supportedInstanceExtensions.begin(),
                   supportedInstanceExtensions.end(),
-                  requiredExtension) == supportedInstanceExtensions.end())
+                  requiredExtension) == supportedInstanceExtensions.end()) {
       return VK_ERROR_EXTENSION_NOT_PRESENT;
+    }
+  }
+
+  // Add any optional instance extensions that are supported by the
+  // running Vulkan instance.
+  for (int i = 0; i < optionalInstanceExtensions.size(); ++i) {
+    std::string optionalExtension = optionalInstanceExtensions[i];
+    if (std::find(supportedInstanceExtensions.begin(),
+                  supportedInstanceExtensions.end(),
+                  optionalExtension) != supportedInstanceExtensions.end()) {
+      requiredInstanceExtensions.push_back(optionalInstanceExtensions[i]);
+      if (optionalExtension == VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME) {
+        supportsDedicatedAllocation = true;
+      }
+    }
   }
 
   // Create the vulkan instance with our required extensions and layers.
@@ -227,16 +248,25 @@ VkResult setupDevice(const sycl::device &dev) {
   static constexpr const char *requiredExtensions[] = {
       VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
       VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
-      VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
 #ifdef _WIN32
       VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME,
+#else
+      VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
+#endif
+  };
+
+  static constexpr const char *optionalExtensions[] = {
+      VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
+#ifdef _WIN32
       VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME,
 #else
       VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
-      VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
 #endif
   };
 
+  std::vector<const char *> enabledDeviceExtensions(
+      std::begin(requiredExtensions), std::end(requiredExtensions));
+
   const auto UUID = dev.get_info<sycl::ext::intel::info::device::uuid>();
 
   // From all physical devices, find the first one with a matching UUID
@@ -259,6 +289,7 @@ VkResult setupDevice(const sycl::device &dev) {
       continue;
     }
 
+    // Check if the device supports the required extensions.
     std::vector<VkExtensionProperties> supportedDeviceExtensions;
     getSupportedDeviceExtensions(supportedDeviceExtensions, vk_physical_device);
     const bool hasRequiredExtensions = std::all_of(
@@ -271,10 +302,29 @@ VkResult setupDevice(const sycl::device &dev) {
                                  });
           return (it != std::end(supportedDeviceExtensions));
         });
+    // Skip this device if it does not support all required extensions.
     if (!hasRequiredExtensions) {
       continue;
     }
 
+    // Check if the device supports the optional extensions, if so add them to
+    // the list of enabled device extensions.
+    for (const char *optionalExt : optionalExtensions) {
+      auto it = std::find_if(std::begin(supportedDeviceExtensions),
+                             std::end(supportedDeviceExtensions),
+                             [&](const VkExtensionProperties &ext) {
+                               return (ext.extensionName ==
+                                       std::string_view(optionalExt));
+                             });
+      if (it != std::end(supportedDeviceExtensions)) {
+        enabledDeviceExtensions.push_back(optionalExt);
+        if (std::string_view(optionalExt) ==
+            VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME) {
+          supportsExternalSemaphore = true;
+        }
+      }
+    }
+
     foundDevice = true;
     std::cout << "Found suitable Vulkan device: "
               << devProps2.properties.deviceName << std::endl;
@@ -348,9 +398,8 @@ VkResult setupDevice(const sycl::device &dev) {
   dci.pQueueCreateInfos = qcis.data();
   dci.queueCreateInfoCount = qcis.size();
   dci.pEnabledFeatures = &deviceFeatures;
-  dci.enabledExtensionCount =
-      sizeof(requiredExtensions) / sizeof(requiredExtensions[0]);
-  dci.ppEnabledExtensionNames = &requiredExtensions[0];
+  dci.enabledExtensionCount = enabledDeviceExtensions.size();
+  dci.ppEnabledExtensionNames = enabledDeviceExtensions.data();
 
   VK_CHECK_CALL_RET(
       vkCreateDevice(vk_physical_device, &dci, nullptr, &vk_device));
@@ -371,13 +420,15 @@ VkResult setupDevice(const sycl::device &dev) {
         << "Could not get func pointer to \"vkGetMemoryWin32HandleKHR\"!\n";
     return VK_ERROR_UNKNOWN;
   }
-  vk_getSemaphoreWin32HandleKHR =
-      (PFN_vkGetSemaphoreWin32HandleKHR)vkGetDeviceProcAddr(
-          vk_device, "vkGetSemaphoreWin32HandleKHR");
-  if (!vk_getSemaphoreWin32HandleKHR) {
-    std::cerr
-        << "Could not get func pointer to \"vkGetSemaphoreWin32HandleKHR\"!\n";
-    return VK_ERROR_UNKNOWN;
+  if (supportsExternalSemaphore) {
+    vk_getSemaphoreWin32HandleKHR =
+        (PFN_vkGetSemaphoreWin32HandleKHR)vkGetDeviceProcAddr(
+            vk_device, "vkGetSemaphoreWin32HandleKHR");
+    if (!vk_getSemaphoreWin32HandleKHR) {
+      std::cerr << "Could not get func pointer to "
+                   "\"vkGetSemaphoreWin32HandleKHR\"!\n";
+      return VK_ERROR_UNKNOWN;
+    }
   }
 #else
   vk_getMemoryFdKHR =
@@ -386,11 +437,13 @@ VkResult setupDevice(const sycl::device &dev) {
     std::cerr << "Could not get func pointer to \"vkGetMemoryFdKHR\"!\n";
     return VK_ERROR_UNKNOWN;
   }
-  vk_getSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)vkGetDeviceProcAddr(
-      vk_device, "vkGetSemaphoreFdKHR");
-  if (!vk_getSemaphoreFdKHR) {
-    std::cerr << "Could not get func pointer to \"vkGetSemaphoreFdKHR\"!\n";
-    return VK_ERROR_UNKNOWN;
+  if (supportsExternalSemaphore) {
+    vk_getSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)vkGetDeviceProcAddr(
+        vk_device, "vkGetSemaphoreFdKHR");
+    if (!vk_getSemaphoreFdKHR) {
+      std::cerr << "Could not get func pointer to \"vkGetSemaphoreFdKHR\"!\n";
+      return VK_ERROR_UNKNOWN;
+    }
   }
 #endif
 
@@ -580,10 +633,11 @@ VkDeviceMemory allocateDeviceMemory(size_t size, uint32_t memoryTypeIndex,
 #else
     emai.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
 #endif
-    if (requiresDedicatedAllocation)
+    if (requiresDedicatedAllocation) {
       dedicatedInfo.pNext = &emai;
-    else
+    } else {
       mai.pNext = &emai;
+    }
   }
 
   VkDeviceMemory memory;
@@ -601,12 +655,15 @@ property flags passed.
 */
 uint32_t getImageMemoryTypeIndex(VkImage image, VkMemoryPropertyFlags flags,
                                  VkMemoryRequirements &memRequirements) {
-  VkMemoryDedicatedRequirements dedicatedRequirements{};
-  dedicatedRequirements.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS;
-
   VkMemoryRequirements2 memoryRequirements2{};
   memoryRequirements2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
-  memoryRequirements2.pNext = &dedicatedRequirements;
+
+  VkMemoryDedicatedRequirements dedicatedRequirements{};
+  if (supportsDedicatedAllocation) {
+    dedicatedRequirements.sType =
+        VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS;
+    memoryRequirements2.pNext = &dedicatedRequirements;
+  }
 
   VkImageMemoryRequirementsInfo2 imageRequirementsInfo{};
   imageRequirementsInfo.sType =
@@ -616,8 +673,9 @@ uint32_t getImageMemoryTypeIndex(VkImage image, VkMemoryPropertyFlags flags,
   vk_getImageMemoryRequirements2(vk_device, &imageRequirementsInfo,
                                  &memoryRequirements2);
 
-  if (dedicatedRequirements.requiresDedicatedAllocation)
+  if (dedicatedRequirements.requiresDedicatedAllocation) {
     requiresDedicatedAllocation = true;
+  }
 
   VkPhysicalDeviceMemoryProperties memProperties;
   vkGetPhysicalDeviceMemoryProperties(vk_physical_device, &memProperties);
@@ -715,6 +773,11 @@ HANDLE getSemaphoreWin32Handle(VkSemaphore semaphore) {
   sghwi.semaphore = semaphore;
   sghwi.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT;
 
+  if (!supportsExternalSemaphore) {
+    std::cerr << "External semaphore support is not enabled!\n";
+    return 0;
+  }
+
   if (vk_getSemaphoreWin32HandleKHR != nullptr) {
     VK_CHECK_CALL(vk_getSemaphoreWin32HandleKHR(vk_device, &sghwi, &retHandle));
   } else {
@@ -757,6 +820,12 @@ int getSemaphoreOpaqueFD(VkSemaphore semaphore) {
   sgfi.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT;
 
   int fd = 0;
+
+  if (!supportsExternalSemaphore) {
+    std::cerr << "External semaphore support is not enabled!\n";
+    return 0;
+  }
+
   if (vk_getSemaphoreFdKHR != nullptr) {
     VK_CHECK_CALL(vk_getSemaphoreFdKHR(vk_device, &sgfi, &fd));
   } else {
@@ -805,11 +874,9 @@ struct vulkan_image_test_resources_t {
 
   vulkan_image_test_resources_t(VkImageType imgType, VkFormat format,
                                 VkExtent3D ext, const size_t imageSizeBytes) {
-    vkImage = vkutil::createImage(imgType, format, ext,
-                                  VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
-                                      VK_IMAGE_USAGE_TRANSFER_DST_BIT |
-                                      VK_IMAGE_USAGE_STORAGE_BIT,
-                                  1);
+    vkImage = vkutil::createImage(
+        imgType, format, ext,
+        VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 1);
     VkMemoryRequirements memRequirements;
     auto inputImageMemoryTypeIndex = vkutil::getImageMemoryTypeIndex(
         vkImage, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, memRequirements);
diff --git a/unified-runtime/source/adapters/level_zero/device.cpp b/unified-runtime/source/adapters/level_zero/device.cpp
index c372443d07ec2..1d135b9466eb1 100644
--- a/unified-runtime/source/adapters/level_zero/device.cpp
+++ b/unified-runtime/source/adapters/level_zero/device.cpp
@@ -1087,21 +1087,18 @@ ur_result_t urDeviceGetInfo(
   case UR_DEVICE_INFO_COMMAND_BUFFER_SUBGRAPH_SUPPORT_EXP:
     return ReturnValue(false);
   case UR_DEVICE_INFO_BINDLESS_IMAGES_SUPPORT_EXP: {
-    return ReturnValue(Device->isIntelDG2OrNewer() &&
-                       Device->ZeDeviceImageProperties->maxImageDims1D > 0 &&
-                       Device->ZeDeviceImageProperties->maxImageDims2D > 0 &&
-                       Device->ZeDeviceImageProperties->maxImageDims3D > 0);
+    return ReturnValue(Device->Platform->ZeBindlessImagesExtensionSupported);
   }
   case UR_DEVICE_INFO_BINDLESS_IMAGES_SHARED_USM_SUPPORT_EXP: {
     // On L0 bindless images can not be backed by shared (managed) USM.
     return ReturnValue(false);
   }
   case UR_DEVICE_INFO_BINDLESS_IMAGES_1D_USM_SUPPORT_EXP: {
-    return ReturnValue(Device->isIntelDG2OrNewer() &&
+    return ReturnValue(Device->Platform->ZeBindlessImagesExtensionSupported &&
                        Device->ZeDeviceImageProperties->maxImageDims1D > 0);
   }
   case UR_DEVICE_INFO_BINDLESS_IMAGES_2D_USM_SUPPORT_EXP: {
-    return ReturnValue(Device->isIntelDG2OrNewer() &&
+    return ReturnValue(Device->Platform->ZeBindlessImagesExtensionSupported &&
                        Device->ZeDeviceImageProperties->maxImageDims2D > 0);
   }
   case UR_DEVICE_INFO_IMAGE_PITCH_ALIGN_EXP:
diff --git a/unified-runtime/source/adapters/level_zero/platform.cpp b/unified-runtime/source/adapters/level_zero/platform.cpp
index 2602f75e30ef3..50a2ce1080964 100644
--- a/unified-runtime/source/adapters/level_zero/platform.cpp
+++ b/unified-runtime/source/adapters/level_zero/platform.cpp
@@ -294,6 +294,12 @@ ur_result_t ur_platform_handle_t_::initialize() {
         ZeCopyOffloadExtensionSupported = true;
       }
     }
+    if (strncmp(extension.name, ZE_BINDLESS_IMAGE_EXP_NAME,
+                strlen(ZE_BINDLESS_IMAGE_EXP_NAME) + 1) == 0) {
+      if (extension.version == ZE_BINDLESS_IMAGE_EXP_VERSION_1_0) {
+        ZeBindlessImagesExtensionSupported = true;
+      }
+    }
     zeDriverExtensionMap[extension.name] = extension.version;
   }
 
diff --git a/unified-runtime/source/adapters/level_zero/platform.hpp b/unified-runtime/source/adapters/level_zero/platform.hpp
index 62b36867304a0..192cd063c19e5 100644
--- a/unified-runtime/source/adapters/level_zero/platform.hpp
+++ b/unified-runtime/source/adapters/level_zero/platform.hpp
@@ -68,6 +68,7 @@ struct ur_platform_handle_t_ : ur::handle_base<ur::level_zero::ddi_getter>,
   bool zeDriverImmediateCommandListAppendFound{false};
   bool ZeDriverEuCountExtensionFound{false};
   bool ZeCopyOffloadExtensionSupported{false};
+  bool ZeBindlessImagesExtensionSupported{false};
 
   // Cache UR devices for reuse
   std::vector<std::unique_ptr<ur_device_handle_t_>> URDevicesCache;