diff options
author | 2022-03-09 00:31:38 +0000 | |
---|---|---|
committer | 2022-11-16 18:49:08 +0000 | |
commit | 2cc44689e59f7fea54bcb9fe0bbee0d487fbaa90 (patch) | |
tree | 6fdfbfc8dd6cbc74d41ccaba17a5b7885475e8d9 /vulkan/libvulkan/driver.cpp | |
parent | a8c0dd747c7aa7127d0bf0f53bcea5ac955b8339 (diff) |
Vulkan loader changes to support VK_EXT_image_compression_control
Bug: 218365766
Test: Build
Change-Id: I91cddbee0daac27d838e6201ba63c51a5158412c
Diffstat (limited to 'vulkan/libvulkan/driver.cpp')
-rw-r--r-- | vulkan/libvulkan/driver.cpp | 154 |
1 files changed, 147 insertions, 7 deletions
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index 766451824a..4927150b6a 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -1027,6 +1027,39 @@ void QueryPresentationProperties( } } +bool GetAndroidNativeBufferSpecVersion9Support( + VkPhysicalDevice physicalDevice) { + const InstanceData& data = GetData(physicalDevice); + + // Call to get propertyCount + uint32_t propertyCount = 0; + ATRACE_BEGIN("driver.EnumerateDeviceExtensionProperties"); + VkResult result = data.driver.EnumerateDeviceExtensionProperties( + physicalDevice, nullptr, &propertyCount, nullptr); + ATRACE_END(); + + // Call to enumerate properties + std::vector<VkExtensionProperties> properties(propertyCount); + ATRACE_BEGIN("driver.EnumerateDeviceExtensionProperties"); + result = data.driver.EnumerateDeviceExtensionProperties( + physicalDevice, nullptr, &propertyCount, properties.data()); + ATRACE_END(); + + for (uint32_t i = 0; i < propertyCount; i++) { + auto& prop = properties[i]; + + if (strcmp(prop.extensionName, + VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME) != 0) + continue; + + if (prop.specVersion >= 9) { + return true; + } + } + + return false; +} + VkResult EnumerateDeviceExtensionProperties( VkPhysicalDevice physicalDevice, const char* pLayerName, @@ -1061,6 +1094,37 @@ VkResult EnumerateDeviceExtensionProperties( VK_GOOGLE_DISPLAY_TIMING_SPEC_VERSION}); } + // Conditionally add VK_EXT_IMAGE_COMPRESSION_CONTROL* if feature and ANB + // support is provided by the driver + VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT + swapchainCompFeats = {}; + swapchainCompFeats.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT; + swapchainCompFeats.pNext = nullptr; + VkPhysicalDeviceImageCompressionControlFeaturesEXT imageCompFeats = {}; + imageCompFeats.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT; + imageCompFeats.pNext = &swapchainCompFeats; + + VkPhysicalDeviceFeatures2 feats2 = {}; + feats2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + feats2.pNext = &imageCompFeats; + + GetPhysicalDeviceFeatures2(physicalDevice, &feats2); + + bool anb9 = GetAndroidNativeBufferSpecVersion9Support(physicalDevice); + + if (anb9 && imageCompFeats.imageCompressionControl) { + loader_extensions.push_back( + {VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME, + VK_EXT_IMAGE_COMPRESSION_CONTROL_SPEC_VERSION}); + } + if (anb9 && swapchainCompFeats.imageCompressionControlSwapchain) { + loader_extensions.push_back( + {VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME, + VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION}); + } + // enumerate our extensions first if (!pLayerName && pProperties) { uint32_t count = std::min( @@ -1254,15 +1318,18 @@ VkResult CreateDevice(VkPhysicalDevice physicalDevice, return VK_ERROR_INCOMPATIBLE_DRIVER; } - // sanity check ANDROID_native_buffer implementation, whose set of + // Confirming ANDROID_native_buffer implementation, whose set of // entrypoints varies according to the spec version. if ((wrapper.GetHalExtensions()[ProcHook::ANDROID_native_buffer]) && !data->driver.GetSwapchainGrallocUsageANDROID && - !data->driver.GetSwapchainGrallocUsage2ANDROID) { - ALOGE("Driver's implementation of ANDROID_native_buffer is broken;" - " must expose at least one of " - "vkGetSwapchainGrallocUsageANDROID or " - "vkGetSwapchainGrallocUsage2ANDROID"); + !data->driver.GetSwapchainGrallocUsage2ANDROID && + !data->driver.GetSwapchainGrallocUsage3ANDROID) { + ALOGE( + "Driver's implementation of ANDROID_native_buffer is broken;" + " must expose at least one of " + "vkGetSwapchainGrallocUsageANDROID or " + "vkGetSwapchainGrallocUsage2ANDROID or " + "vkGetSwapchainGrallocUsage3ANDROID"); data->driver.DestroyDevice(dev, pAllocator); FreeDeviceData(data, data_allocator); @@ -1441,10 +1508,83 @@ void GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, if (driver.GetPhysicalDeviceFeatures2) { driver.GetPhysicalDeviceFeatures2(physicalDevice, pFeatures); + } else { + driver.GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures); + } + + // Conditionally add imageCompressionControlSwapchain if + // imageCompressionControl is supported Check for imageCompressionControl in + // the pChain + bool imageCompressionControl = false; + bool imageCompressionControlInChain = false; + bool imageCompressionControlSwapchainInChain = false; + VkPhysicalDeviceFeatures2* pFeats = pFeatures; + while (pFeats) { + switch (pFeats->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT: { + const VkPhysicalDeviceImageCompressionControlFeaturesEXT* + compressionFeat = reinterpret_cast< + const VkPhysicalDeviceImageCompressionControlFeaturesEXT*>( + pFeats); + imageCompressionControl = + compressionFeat->imageCompressionControl; + imageCompressionControlInChain = true; + } break; + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT: { + imageCompressionControlSwapchainInChain = true; + } break; + + default: + break; + } + pFeats = reinterpret_cast<VkPhysicalDeviceFeatures2*>(pFeats->pNext); + } + + if (!imageCompressionControlSwapchainInChain) { return; } - driver.GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures); + // If not in pchain, explicitly query for imageCompressionControl + if (!imageCompressionControlInChain) { + VkPhysicalDeviceImageCompressionControlFeaturesEXT imageCompFeats = {}; + imageCompFeats.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT; + imageCompFeats.pNext = nullptr; + + VkPhysicalDeviceFeatures2 feats2 = {}; + feats2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + feats2.pNext = &imageCompFeats; + + if (driver.GetPhysicalDeviceFeatures2) { + driver.GetPhysicalDeviceFeatures2(physicalDevice, &feats2); + } else { + driver.GetPhysicalDeviceFeatures2KHR(physicalDevice, &feats2); + } + + imageCompressionControl = imageCompFeats.imageCompressionControl; + } + + // Only enumerate imageCompressionControlSwapchin if imageCompressionControl + if (imageCompressionControl) { + pFeats = pFeatures; + while (pFeats) { + switch (pFeats->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT: { + VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT* + compressionFeat = reinterpret_cast< + VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT*>( + pFeats); + compressionFeat->imageCompressionControlSwapchain = true; + } break; + + default: + break; + } + pFeats = + reinterpret_cast<VkPhysicalDeviceFeatures2*>(pFeats->pNext); + } + } } void GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, |