Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01cf3053 authored by Chia-I Wu's avatar Chia-I Wu
Browse files

vulkan: rework EnumerateDeviceExtensionProperties_Bottom

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
parent 4901db70
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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,
+31 −0
Original line number Diff line number Diff line
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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,
    },
+0 −34
Original line number Diff line number Diff line
@@ -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);
Loading