diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-01-04 00:57:33 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-01-04 00:57:33 +0000 |
commit | 8748247dc23093761cc62c8feda4ff88bab46d22 (patch) | |
tree | e7f31917f28b7f0bf617e555de1c3ca4e751e8da | |
parent | f70c68cbe6d31ee8dcbd3fd32409ed15f5f15c86 (diff) | |
parent | 4009a41cdc770b63cd65f42aa820fbd821beab76 (diff) | |
download | native-8748247dc23093761cc62c8feda4ff88bab46d22.tar.gz |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/25705108', 'googleplex-android-review.googlesource.com/25781673'] into 24Q1-release.
Change-Id: I10da613b9b37cefe00ff0ba787b3ef83799a3616
-rw-r--r-- | libs/binder/ndk/include_cpp/android/persistable_bundle_aidl.h | 54 | ||||
-rw-r--r-- | vulkan/libvulkan/swapchain.cpp | 35 |
2 files changed, 65 insertions, 24 deletions
diff --git a/libs/binder/ndk/include_cpp/android/persistable_bundle_aidl.h b/libs/binder/ndk/include_cpp/android/persistable_bundle_aidl.h index f178027b35..a0e4f7b63b 100644 --- a/libs/binder/ndk/include_cpp/android/persistable_bundle_aidl.h +++ b/libs/binder/ndk/include_cpp/android/persistable_bundle_aidl.h @@ -31,7 +31,11 @@ namespace aidl::android::os { */ class PersistableBundle { public: - PersistableBundle() noexcept : mPBundle(APersistableBundle_new()) {} + PersistableBundle() noexcept { + if (__builtin_available(android __ANDROID_API_V__, *)) { + mPBundle = APersistableBundle_new(); + } + } // takes ownership of the APersistableBundle* PersistableBundle(APersistableBundle* _Nonnull bundle) noexcept : mPBundle(bundle) {} // takes ownership of the APersistableBundle* @@ -327,20 +331,32 @@ class PersistableBundle { } bool getBooleanVector(const std::string& key, std::vector<bool>* _Nonnull vec) { - return getVecInternal<bool>(&APersistableBundle_getBooleanVector, mPBundle, key.c_str(), - vec); + if (__builtin_available(android __ANDROID_API_V__, *)) { + return getVecInternal<bool>(&APersistableBundle_getBooleanVector, mPBundle, key.c_str(), + vec); + } + return false; } bool getIntVector(const std::string& key, std::vector<int32_t>* _Nonnull vec) { - return getVecInternal<int32_t>(&APersistableBundle_getIntVector, mPBundle, key.c_str(), - vec); + if (__builtin_available(android __ANDROID_API_V__, *)) { + return getVecInternal<int32_t>(&APersistableBundle_getIntVector, mPBundle, key.c_str(), + vec); + } + return false; } bool getLongVector(const std::string& key, std::vector<int64_t>* _Nonnull vec) { - return getVecInternal<int64_t>(&APersistableBundle_getLongVector, mPBundle, key.c_str(), - vec); + if (__builtin_available(android __ANDROID_API_V__, *)) { + return getVecInternal<int64_t>(&APersistableBundle_getLongVector, mPBundle, key.c_str(), + vec); + } + return false; } bool getDoubleVector(const std::string& key, std::vector<double>* _Nonnull vec) { - return getVecInternal<double>(&APersistableBundle_getDoubleVector, mPBundle, key.c_str(), - vec); + if (__builtin_available(android __ANDROID_API_V__, *)) { + return getVecInternal<double>(&APersistableBundle_getDoubleVector, mPBundle, + key.c_str(), vec); + } + return false; } // Takes ownership of and frees the char** and its elements. @@ -361,15 +377,17 @@ class PersistableBundle { } bool getStringVector(const std::string& key, std::vector<std::string>* _Nonnull vec) { - int32_t bytes = APersistableBundle_getStringVector(mPBundle, key.c_str(), nullptr, 0, - &stringAllocator, nullptr); - if (bytes > 0) { - char** strings = (char**)malloc(bytes); - if (strings) { - bytes = APersistableBundle_getStringVector(mPBundle, key.c_str(), strings, bytes, - &stringAllocator, nullptr); - *vec = moveStringsInternal<std::vector<std::string>>(strings, bytes); - return true; + if (__builtin_available(android __ANDROID_API_V__, *)) { + int32_t bytes = APersistableBundle_getStringVector(mPBundle, key.c_str(), nullptr, 0, + &stringAllocator, nullptr); + if (bytes > 0) { + char** strings = (char**)malloc(bytes); + if (strings) { + bytes = APersistableBundle_getStringVector(mPBundle, key.c_str(), strings, + bytes, &stringAllocator, nullptr); + *vec = moveStringsInternal<std::vector<std::string>>(strings, bytes); + return true; + } } } return false; diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp index 0df5e77181..6b3c37932d 100644 --- a/vulkan/libvulkan/swapchain.cpp +++ b/vulkan/libvulkan/swapchain.cpp @@ -1762,6 +1762,8 @@ VkResult CreateSwapchainKHR(VkDevice device, } int query_value; + // TODO: Now that we are calling into GPDSC2 directly, this query may be redundant + // the call to std::max(min_buffer_count, num_images) may be redundant as well err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value); if (err != android::OK || query_value < 0) { @@ -1778,12 +1780,33 @@ VkResult CreateSwapchainKHR(VkDevice device, // with extra images (which they can't actually use!). const uint32_t min_buffer_count = min_undequeued_buffers + 1; - uint32_t num_images; - if (create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR) { - num_images = std::max(3u, create_info->minImageCount); - } else { - num_images = create_info->minImageCount; - } + // Call into GPDSC2 to get the minimum and maximum allowable buffer count for the surface of + // interest. This step is only necessary if the app requests a number of images + // (create_info->minImageCount) that is less or more than the surface capabilities. + // An app should be calling GPDSC2 and using those values to set create_info, but in the + // event that the app has hard-coded image counts an error can occur + VkSurfacePresentModeEXT present_mode = { + VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT, + nullptr, + create_info->presentMode + }; + VkPhysicalDeviceSurfaceInfo2KHR surface_info2 = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR, + &present_mode, + create_info->surface + }; + VkSurfaceCapabilities2KHR surface_capabilities2 = { + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR, + nullptr, + {}, + }; + result = GetPhysicalDeviceSurfaceCapabilities2KHR(GetData(device).driver_physical_device, + &surface_info2, &surface_capabilities2); + + uint32_t num_images = create_info->minImageCount; + num_images = std::clamp(num_images, + surface_capabilities2.surfaceCapabilities.minImageCount, + surface_capabilities2.surfaceCapabilities.maxImageCount); const uint32_t buffer_count = std::max(min_buffer_count, num_images); err = native_window_set_buffer_count(window, buffer_count); |