[Impeller] Port a recent Vulkan swapchain fence waiting fix to the AHB version of the swapchain#185763
Conversation
…B version of the swapchain WaitForFence should only wait if there is a pending frame presentation that will cause the fence to become signaled. This was fixed in the KHR swapchain by flutter@c5d0a84. This PR implements the same fix for the AHB swapchain and adds a unit test for AHBSwapchainVK.
There was a problem hiding this comment.
Code Review
This pull request refactors SurfaceControl into an abstract base class to facilitate testing and introduces unit tests for the Android AHB swapchain. It also updates AHBFrameSynchronizerVK to track whether an acquire fence is pending, ensuring that fence waits only occur when a fence has actually been submitted. A high-severity issue was identified in the mock Vulkan implementation where vkEnumerateDeviceExtensionProperties could cause a buffer overflow by failing to validate the capacity of the output array and potentially missing null-termination for extension names.
| uint32_t count = 0; | ||
| for (const std::string& ext : GetMockVulkanState().device_extensions) { | ||
| strncpy(pProperties[count].extensionName, ext.c_str(), | ||
| sizeof(VkExtensionProperties::extensionName)); | ||
| pProperties[count].specVersion = 0; | ||
| count++; | ||
| } |
There was a problem hiding this comment.
The current implementation of vkEnumerateDeviceExtensionProperties in the mock has a potential buffer overflow. It iterates through all device_extensions without checking if the provided pProperties array has enough capacity (indicated by *pPropertyCount). Additionally, strncpy is used without guaranteeing null-termination if the extension name length equals the buffer size.
According to the Vulkan specification, if pProperties is not NULL, *pPropertyCount structures should be written at most, and the function should return VK_INCOMPLETE if the buffer is too small.
uint32_t count = 0;
VkResult result = VK_SUCCESS;
for (const std::string& ext : GetMockVulkanState().device_extensions) {
if (count >= *pPropertyCount) {
result = VK_INCOMPLETE;
break;
}
snprintf(pProperties[count].extensionName,
sizeof(pProperties[count].extensionName), "%s", ext.c_str());
pProperties[count].specVersion = 0;
count++;
}
*pPropertyCount = count;
return result;There was a problem hiding this comment.
Fixed this (and the similar implementations of vkEnumerateInstanceExtensionProperties and vkEnumerateInstanceLayerProperties)
| auto surface_control = | ||
| android::SurfaceControl::Create(window.GetHandle(), "ImpellerSurface"); | ||
| auto ahb_swapchain = | ||
| std::shared_ptr<AHBSwapchainVK>(new AHBSwapchainVK(context, // |
There was a problem hiding this comment.
std::make_shared? (I know sometimes that doesn't work because of friend)
There was a problem hiding this comment.
std::make_shared is not usable here because this is invoking a private constructor
| /// | ||
| explicit SurfaceControl(ANativeWindow* window, | ||
| const char* debug_name = nullptr); | ||
| static std::shared_ptr<SurfaceControl> Create( |
There was a problem hiding this comment.
Please make this return a std::unique_ptr, that can be implicitly cast to shared_ptr and doesn't force clients to have to make it shared.
| friend class SurfaceControl; | ||
|
|
||
| struct UniqueASurfaceControlTraits { | ||
| static ASurfaceControl* InvalidValue() { return nullptr; } |
There was a problem hiding this comment.
Just make this a field instead of a function?
There was a problem hiding this comment.
This must be a method to match the declaration of the fml::UniqueObjectTraits concept (see https://github.com/flutter/flutter/blob/master/engine/src/flutter/fml/unique_object.h)
|
heads up, there are tidy errors |
Roll Flutter from 81bc3d69535f to 707dbc0420a3 (85 revisions) flutter/flutter@81bc3d6...707dbc0 2026-05-01 [email protected] Removing TODOs from the WebParagraph code and addressing technical debts. (flutter/flutter#185168) 2026-05-01 [email protected] Ensure that vulkan_interface.h gets included before vk_mem_alloc.h (flutter/flutter#185777) 2026-05-01 [email protected] [flutter_tools] Bump dwds dependency to v27.1.1 (flutter/flutter#185357) 2026-05-01 [email protected] Roll Dart SDK from 6d4a319cbdac to 9aa7097f2e3e (3 revisions) (flutter/flutter#185888) 2026-05-01 [email protected] Roll Skia from fa1dcb289709 to 7ac6d42f2fd0 (1 revision) (flutter/flutter#185887) 2026-05-01 [email protected] Roll Skia from 54cc00adde38 to fa1dcb289709 (3 revisions) (flutter/flutter#185880) 2026-05-01 [email protected] [iOS] Migrate to FlutterFMLTaskRunner(s) (flutter/flutter#185815) 2026-05-01 [email protected] Remove material imports from navigator_on_did_remove_page_test and scrollable_in_overlay_test (flutter/flutter#182546) 2026-05-01 [email protected] Roll Skia from 2e279266f06a to 54cc00adde38 (3 revisions) (flutter/flutter#185872) 2026-05-01 [email protected] dev: Remove unused parameters (flutter/flutter#185345) 2026-05-01 [email protected] Roll Fuchsia Linux SDK from HN5VYzftnf_B8T-n9... to VnzuUefDQR0UhQ1L1... (flutter/flutter#185870) 2026-05-01 [email protected] Use g_free when using glib memory allocation (flutter/flutter#185519) 2026-05-01 [email protected] Roll Dart SDK from d30df3428f2e to 6d4a319cbdac (2 revisions) (flutter/flutter#185862) 2026-05-01 [email protected] Remove trivial test utility cross-imports from material and cupertino… (flutter/flutter#184295) 2026-05-01 [email protected] Inline test callback painter in tab scaffold test (flutter/flutter#184851) 2026-05-01 [email protected] [a11y] Add support for high contrast themes in the a11y assessments app (flutter/flutter#185801) 2026-05-01 [email protected] [a11y assessment app] Use default color for banner (flutter/flutter#185804) 2026-04-30 [email protected] Added name to AUTHORS (flutter/flutter#185586) 2026-04-30 [email protected] Remove semantics_tester import from raw_material_button_test.dart (flutter/flutter#184806) 2026-04-30 [email protected] Remove semantics_tester import from user_accounts_drawer_header_test.dart (flutter/flutter#184809) 2026-04-30 [email protected] Roll Skia from 7b88c5c281e5 to 2e279266f06a (5 revisions) (flutter/flutter#185854) 2026-04-30 [email protected] Handle symmetric rectangular and elliptical round super ellipses in the uber SDF renderer (flutter/flutter#185695) 2026-04-30 [email protected] Match on process name before killing for SwiftPM (flutter/flutter#185774) 2026-04-30 [email protected] Sync CHANGELOG.md from stable (flutter/flutter#185838) 2026-04-30 [email protected] Roll Dart SDK from 25910e31a6d2 to d30df3428f2e (5 revisions) (flutter/flutter#185839) 2026-04-30 [email protected] Check cross imports test subfolders (flutter/flutter#185493) 2026-04-30 [email protected] test: inline TestCallbackPainter in cupertino/picker_test.dart (flutter/flutter#185398) 2026-04-30 [email protected] Update customer testing version (flutter/flutter#185830) 2026-04-30 [email protected] Adapt the Metal shader library output list for debug versus release mode (flutter/flutter#185798) 2026-04-30 [email protected] [Impeller] Port a recent Vulkan swapchain fence waiting fix to the AHB version of the swapchain (flutter/flutter#185763) 2026-04-30 [email protected] Roll Skia from 26a59aa71eff to 7b88c5c281e5 (1 revision) (flutter/flutter#185821) 2026-04-30 [email protected] Roll Skia from 6b4167b4e204 to 26a59aa71eff (4 revisions) (flutter/flutter#185808) 2026-04-30 [email protected] [a11y] Mark SemanticsNode dirty when customSemanticsActions change (flutter/flutter#185707) 2026-04-30 [email protected] Roll Skia from 1bd2f1cc2746 to 6b4167b4e204 (8 revisions) (flutter/flutter#185799) 2026-04-30 [email protected] [iOS] Extract FlutterVSyncClient from vsync_waiter_ios (flutter/flutter#185737) 2026-04-30 [email protected] Roll Fuchsia Linux SDK from nnv8-SSam6yE8dw4z... to HN5VYzftnf_B8T-n9... (flutter/flutter#185782) 2026-04-29 [email protected] [iOS] Soften TaskRunner.postTask(delay:task:) delay check (flutter/flutter#185729) 2026-04-29 [email protected] Add reportErrors to ImageStreamListener (flutter/flutter#180327) 2026-04-29 [email protected] Roll Skia from f5c781c083c7 to 1bd2f1cc2746 (5 revisions) (flutter/flutter#185761) 2026-04-29 [email protected] Update merge semantics logic to merge sibling nodes (flutter/flutter#183745) 2026-04-29 [email protected] Roll Packages from ba80f8f to cde5b36 (12 revisions) (flutter/flutter#185748) 2026-04-29 [email protected] examples: Remove unused parameters (flutter/flutter#185346) 2026-04-29 [email protected] Update TickerMode.getValuesNotifier to handle initialization during State.dispose (flutter/flutter#185248) 2026-04-29 [email protected] Update triage links (flutter/flutter#185714) 2026-04-29 [email protected] Add support for high contrast and color inversion on Android (flutter/flutter#182263) 2026-04-29 [email protected] Roll Skia from 05251260fda6 to f5c781c083c7 (2 revisions) (flutter/flutter#185743) ...
WaitForFence should only wait if there is a pending frame presentation that will cause the fence to become signaled.
This was fixed in the KHR swapchain by c5d0a84. This PR implements the same fix for the AHB swapchain and adds a unit test for AHBSwapchainVK.