diff options
author | 2016-03-24 16:16:21 +0800 | |
---|---|---|
committer | 2016-04-11 07:37:19 +0800 | |
commit | 01cf305325f3789c573d7eff435e409f04677c66 (patch) | |
tree | c7aa635840bffb8096791a2e838cd6cf1e888d42 | |
parent | 4901db70b12801cf1966937a58eb7566bfdeb4ce (diff) |
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
-rw-r--r-- | vulkan/libvulkan/code-generator.tmpl | 10 | ||||
-rw-r--r-- | vulkan/libvulkan/driver.cpp | 31 | ||||
-rw-r--r-- | vulkan/libvulkan/driver.h | 2 | ||||
-rw-r--r-- | vulkan/libvulkan/driver_gen.cpp | 2 | ||||
-rw-r--r-- | vulkan/libvulkan/loader.cpp | 34 | ||||
-rw-r--r-- | vulkan/libvulkan/loader.h | 1 |
6 files changed, 39 insertions, 41 deletions
diff --git a/vulkan/libvulkan/code-generator.tmpl b/vulkan/libvulkan/code-generator.tmpl index 3a6f0a97b5..e06ce121ae 100644 --- a/vulkan/libvulkan/code-generator.tmpl +++ b/vulkan/libvulkan/code-generator.tmpl @@ -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, diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index 02e60b7f9a..b20962fbeb 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -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, diff --git a/vulkan/libvulkan/driver.h b/vulkan/libvulkan/driver.h index b3678dc242..f8daa00a9b 100644 --- a/vulkan/libvulkan/driver.h +++ b/vulkan/libvulkan/driver.h @@ -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); diff --git a/vulkan/libvulkan/driver_gen.cpp b/vulkan/libvulkan/driver_gen.cpp index 81299fc28f..e88299de5e 100644 --- a/vulkan/libvulkan/driver_gen.cpp +++ b/vulkan/libvulkan/driver_gen.cpp @@ -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, }, diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp index 0313f7e87e..34ec77cd79 100644 --- a/vulkan/libvulkan/loader.cpp +++ b/vulkan/libvulkan/loader.cpp @@ -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); diff --git a/vulkan/libvulkan/loader.h b/vulkan/libvulkan/loader.h index 8c8c8fc0c3..38bdaa415b 100644 --- a/vulkan/libvulkan/loader.h +++ b/vulkan/libvulkan/loader.h @@ -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 |