diff options
| author | 2017-11-02 10:15:13 -0600 | |
|---|---|---|
| committer | 2017-11-03 17:56:24 +0000 | |
| commit | 205e4611654c36dc8d5a496732c4f9681f0065e1 (patch) | |
| tree | 49f20defdb9928790d7c6e81419fd1e229857f3f /vulkan/libvulkan/driver.cpp | |
| parent | c090b0984eb1e7c99c12969a203b1342e3be2f05 (diff) | |
Vulkan1.1: CreateInstance downgrades apiVersion for 1.0 ICDs
Test: Vulkan CTS 1.1.0
Change-Id: I73a44799eeb24c949524bcf6efeed8248a59e033
(cherry picked from commit 7216d79cee3a4b169c910d2cf5a0fa627a80c9a9)
Diffstat (limited to 'vulkan/libvulkan/driver.cpp')
| -rw-r--r-- | vulkan/libvulkan/driver.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index ade0bde8f9..dded1e397e 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -94,6 +94,7 @@ class CreateInfoWrapper { ~CreateInfoWrapper(); VkResult Validate(); + void DowngradeApiVersion(); const std::bitset<ProcHook::EXTENSION_COUNT>& GetHookExtensions() const; const std::bitset<ProcHook::EXTENSION_COUNT>& GetHalExtensions() const; @@ -131,6 +132,8 @@ class CreateInfoWrapper { VkDeviceCreateInfo dev_info_; }; + VkApplicationInfo application_info_; + ExtensionFilter extension_filter_; std::bitset<ProcHook::EXTENSION_COUNT> hook_extensions_; @@ -537,6 +540,15 @@ void CreateInfoWrapper::FilterExtension(const char* name) { } } +void CreateInfoWrapper::DowngradeApiVersion() { + // If pApplicationInfo is NULL, apiVersion is assumed to be 1.0: + if (instance_info_.pApplicationInfo) { + application_info_ = *instance_info_.pApplicationInfo; + instance_info_.pApplicationInfo = &application_info_; + application_info_.apiVersion = VK_API_VERSION_1_0; + } +} + VKAPI_ATTR void* DefaultAllocate(void*, size_t size, size_t alignment, @@ -891,6 +903,33 @@ VkResult CreateInstance(const VkInstanceCreateInfo* pCreateInfo, data->hook_extensions |= wrapper.GetHookExtensions(); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wold-style-cast" + uint32_t api_version = ((pCreateInfo->pApplicationInfo) + ? pCreateInfo->pApplicationInfo->apiVersion + : VK_API_VERSION_1_0); + uint32_t api_major_version = VK_VERSION_MAJOR(api_version); + uint32_t api_minor_version = VK_VERSION_MINOR(api_version); + uint32_t icd_api_version; + PFN_vkEnumerateInstanceVersion pfn_enumerate_instance_version = + reinterpret_cast<PFN_vkEnumerateInstanceVersion>( + Hal::Device().GetInstanceProcAddr(NULL, + "vkEnumerateInstanceVersion")); + if (!pfn_enumerate_instance_version) { + icd_api_version = VK_API_VERSION_1_0; + } else { + result = (*pfn_enumerate_instance_version)(&icd_api_version); + } + uint32_t icd_api_major_version = VK_VERSION_MAJOR(icd_api_version); + uint32_t icd_api_minor_version = VK_VERSION_MINOR(icd_api_version); + + if ((icd_api_major_version == 1) && (icd_api_minor_version == 0) && + ((api_major_version > 1) || (api_minor_version > 0))) { + api_version = VK_API_VERSION_1_0; + wrapper.DowngradeApiVersion(); + } +#pragma clang diagnostic pop + // call into the driver VkInstance instance; result = Hal::Device().CreateInstance( |