OSDN Git Service

vulkan: rework EnumerateDeviceExtensionProperties_Bottom
authorChia-I Wu <olv@google.com>
Thu, 24 Mar 2016 08:16:21 +0000 (16:16 +0800)
committerChia-I Wu <olv@google.com>
Sun, 10 Apr 2016 23:37:19 +0000 (07:37 +0800)
The reworked driver::EnumerateDeviceExtensionProperties will simply return
all extensions enumerated by HAL, with VK_ANDROID_native_buffer replaced
by VK_KHR_swapchain.  This allows extensions unknown to the loader to be
enumerated.

Change-Id: Iceed8ee3f16a968d005ae3ba42f1bd1839c2ab9f

vulkan/libvulkan/code-generator.tmpl
vulkan/libvulkan/driver.cpp
vulkan/libvulkan/driver.h
vulkan/libvulkan/driver_gen.cpp
vulkan/libvulkan/loader.cpp
vulkan/libvulkan/loader.h

index 3a6f0a9..e06ce12 100644 (file)
@@ -790,12 +790,12 @@ VK_KHR_swapchain
     {{else}}
       ProcHook::EXTENSION_CORE,
 
-      {{if eq $.Name "vkGetInstanceProcAddr"}}
-        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
-      {{else if eq $.Name "vkCreateDevice"}}
-        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
-      {{else}}
+      {{if eq $.Name "vkDestroyInstance"}}
         reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
+      {{else if eq $.Name "vkEnumeratePhysicalDevices"}}
+        reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
+      {{else}}
+        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
       {{end}}
       nullptr,
       nullptr,
index 02e60b7..b20962f 100644 (file)
@@ -496,6 +496,37 @@ PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName) {
                : hook->disabled_proc;
 }
 
+VkResult EnumerateDeviceExtensionProperties(
+    VkPhysicalDevice physicalDevice,
+    const char* pLayerName,
+    uint32_t* pPropertyCount,
+    VkExtensionProperties* pProperties) {
+    const InstanceData& data = GetData(physicalDevice);
+
+    VkResult result = data.driver.EnumerateDeviceExtensionProperties(
+        physicalDevice, pLayerName, pPropertyCount, pProperties);
+    if (result != VK_SUCCESS && result != VK_INCOMPLETE)
+        return result;
+
+    if (!pProperties)
+        return result;
+
+    // map VK_ANDROID_native_buffer to VK_KHR_swapchain
+    for (uint32_t i = 0; i < *pPropertyCount; i++) {
+        auto& prop = pProperties[i];
+
+        if (strcmp(prop.extensionName,
+                   VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME) != 0)
+            continue;
+
+        memcpy(prop.extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME,
+               sizeof(VK_KHR_SWAPCHAIN_EXTENSION_NAME));
+        prop.specVersion = VK_KHR_SWAPCHAIN_SPEC_VERSION;
+    }
+
+    return result;
+}
+
 VkResult CreateDevice(VkPhysicalDevice physicalDevice,
                       const VkDeviceCreateInfo* pCreateInfo,
                       const VkAllocationCallbacks* pAllocator,
index b3678dc..f8daa00 100644 (file)
@@ -109,6 +109,8 @@ VKAPI_ATTR PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const cha
 VKAPI_ATTR PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName);
 VKAPI_ATTR VkResult EnumerateInstanceExtensionProperties(const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);
 
+VKAPI_ATTR VkResult EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);
+
 VKAPI_ATTR VkResult CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);
 VKAPI_ATTR void DestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator);
 
index 81299fc..e88299d 100644 (file)
@@ -236,7 +236,7 @@ const ProcHook g_proc_hooks[] = {
         "vkEnumerateDeviceExtensionProperties",
         ProcHook::INSTANCE,
         ProcHook::EXTENSION_CORE,
-        reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties_Bottom),
+        reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties),
         nullptr,
         nullptr,
     },
index 0313f7e..34ec77c 100644 (file)
@@ -455,40 +455,6 @@ VkResult EnumeratePhysicalDevices_Bottom(VkInstance vkinstance,
     return VK_SUCCESS;
 }
 
-VKAPI_ATTR
-VkResult EnumerateDeviceExtensionProperties_Bottom(
-    VkPhysicalDevice pdev,
-    const char* layer_name,
-    uint32_t* properties_count,
-    VkExtensionProperties* properties) {
-    (void)layer_name;
-
-    Instance& instance = GetDispatchParent(pdev);
-
-    size_t gpu_idx = 0;
-    while (instance.physical_devices[gpu_idx] != pdev)
-        gpu_idx++;
-    const DeviceExtensionSet driver_extensions =
-        instance.physical_device_driver_extensions[gpu_idx];
-
-    // We only support VK_KHR_swapchain if the GPU supports
-    // VK_ANDROID_native_buffer
-    VkExtensionProperties* available = static_cast<VkExtensionProperties*>(
-        alloca(kDeviceExtensionCount * sizeof(VkExtensionProperties)));
-    uint32_t num_extensions = 0;
-    if (driver_extensions[kANDROID_native_buffer]) {
-        available[num_extensions++] = VkExtensionProperties{
-            VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_SWAPCHAIN_SPEC_VERSION};
-    }
-
-    if (!properties || *properties_count > num_extensions)
-        *properties_count = num_extensions;
-    if (properties)
-        std::copy(available, available + *properties_count, properties);
-
-    return *properties_count < num_extensions ? VK_INCOMPLETE : VK_SUCCESS;
-}
-
 void DestroyInstance_Bottom(VkInstance vkinstance,
                             const VkAllocationCallbacks* allocator) {
     Instance& instance = GetDispatchParent(vkinstance);
index 8c8c8fc..38bdaa4 100644 (file)
@@ -49,7 +49,6 @@ bool InitLoader(hwvulkan_device_t* dev);
 // clang-format off
 VKAPI_ATTR VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info, const VkAllocationCallbacks* allocator, VkInstance* vkinstance);
 VKAPI_ATTR VkResult EnumeratePhysicalDevices_Bottom(VkInstance vkinstance, uint32_t* pdev_count, VkPhysicalDevice* pdevs);
-VKAPI_ATTR VkResult EnumerateDeviceExtensionProperties_Bottom(VkPhysicalDevice pdev, const char* layer_name, uint32_t* properties_count, VkExtensionProperties* properties);
 VKAPI_ATTR void DestroyInstance_Bottom(VkInstance vkinstance, const VkAllocationCallbacks* allocator);
 // clang-format on