Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 292a1ca

Browse files
committed
[Impeller] Wire up hardware buffer backed swapchains on Android.
1 parent 2d85d12 commit 292a1ca

26 files changed

+975
-73
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40292,6 +40292,15 @@ ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/shared_object_vk.cc +
4029240292
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/shared_object_vk.h + ../../../flutter/LICENSE
4029340293
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/surface_context_vk.cc + ../../../flutter/LICENSE
4029440294
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/surface_context_vk.h + ../../../flutter/LICENSE
40295+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_formats.h + ../../../flutter/LICENSE
40296+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_impl_vk.cc + ../../../flutter/LICENSE
40297+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_impl_vk.h + ../../../flutter/LICENSE
40298+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_vk.cc + ../../../flutter/LICENSE
40299+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_vk.h + ../../../flutter/LICENSE
40300+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_texture_pool_vk.cc + ../../../flutter/LICENSE
40301+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_texture_pool_vk.h + ../../../flutter/LICENSE
40302+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/external_fence_vk.cc + ../../../flutter/LICENSE
40303+
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/external_fence_vk.h + ../../../flutter/LICENSE
4029540304
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_image_vk.cc + ../../../flutter/LICENSE
4029640305
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_image_vk.h + ../../../flutter/LICENSE
4029740306
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_impl_vk.cc + ../../../flutter/LICENSE
@@ -43174,6 +43183,15 @@ FILE: ../../../flutter/impeller/renderer/backend/vulkan/shared_object_vk.cc
4317443183
FILE: ../../../flutter/impeller/renderer/backend/vulkan/shared_object_vk.h
4317543184
FILE: ../../../flutter/impeller/renderer/backend/vulkan/surface_context_vk.cc
4317643185
FILE: ../../../flutter/impeller/renderer/backend/vulkan/surface_context_vk.h
43186+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_formats.h
43187+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_impl_vk.cc
43188+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_impl_vk.h
43189+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_vk.cc
43190+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_vk.h
43191+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_texture_pool_vk.cc
43192+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/ahb_texture_pool_vk.h
43193+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/external_fence_vk.cc
43194+
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/ahb/external_fence_vk.h
4317743195
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_image_vk.cc
4317843196
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_image_vk.h
4317943197
FILE: ../../../flutter/impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_impl_vk.cc

impeller/renderer/backend/vulkan/BUILD.gn

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,15 @@ impeller_component("vulkan") {
133133
sources += [
134134
"android/ahb_texture_source_vk.cc",
135135
"android/ahb_texture_source_vk.h",
136+
"swapchain/ahb/ahb_formats.h",
137+
"swapchain/ahb/ahb_swapchain_impl_vk.cc",
138+
"swapchain/ahb/ahb_swapchain_impl_vk.h",
139+
"swapchain/ahb/ahb_swapchain_vk.cc",
140+
"swapchain/ahb/ahb_swapchain_vk.h",
141+
"swapchain/ahb/ahb_texture_pool_vk.cc",
142+
"swapchain/ahb/ahb_texture_pool_vk.h",
143+
"swapchain/ahb/external_fence_vk.cc",
144+
"swapchain/ahb/external_fence_vk.h",
136145
]
137146
}
138147

@@ -144,4 +153,8 @@ impeller_component("vulkan") {
144153
"//flutter/third_party/vulkan-deps/vulkan-headers/src:vulkan_headers",
145154
"//flutter/third_party/vulkan_memory_allocator",
146155
]
156+
157+
if (is_android) {
158+
public_deps += [ "../../../toolkit/android" ]
159+
}
147160
}

impeller/renderer/backend/vulkan/android/ahb_texture_source_vk.cc

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -280,17 +280,18 @@ static TextureDescriptor ToTextureDescriptor(
280280
}
281281

282282
AHBTextureSourceVK::AHBTextureSourceVK(
283-
const std::shared_ptr<ContextVK>& context,
283+
const std::shared_ptr<Context>& p_context,
284284
struct AHardwareBuffer* ahb,
285285
const AHardwareBuffer_Desc& ahb_desc)
286286
: TextureSourceVK(ToTextureDescriptor(ahb_desc)) {
287-
if (!context) {
288-
VALIDATION_LOG << "Invalid context.";
287+
if (!p_context) {
289288
return;
290289
}
291290

292-
const auto& device = context->GetDevice();
293-
const auto& physical_device = context->GetPhysicalDevice();
291+
const auto& context = ContextVK::Cast(*p_context);
292+
293+
const auto& device = context.GetDevice();
294+
const auto& physical_device = context.GetPhysicalDevice();
294295

295296
AHBProperties ahb_props;
296297

@@ -327,7 +328,7 @@ AHBTextureSourceVK::AHBTextureSourceVK(
327328
}
328329

329330
// Figure out how to perform YUV conversions.
330-
auto yuv_conversion = CreateYUVConversion(*context, ahb_props);
331+
auto yuv_conversion = CreateYUVConversion(context, ahb_props);
331332
if (!yuv_conversion || !yuv_conversion->IsValid()) {
332333
return;
333334
}
@@ -350,15 +351,26 @@ AHBTextureSourceVK::AHBTextureSourceVK(
350351
image_view_ = std::move(image_view);
351352

352353
#ifdef IMPELLER_DEBUG
353-
context->SetDebugName(device_memory_.get(), "AHB Device Memory");
354-
context->SetDebugName(image_.get(), "AHB Image");
355-
context->SetDebugName(yuv_conversion_->GetConversion(), "AHB YUV Conversion");
356-
context->SetDebugName(image_view_.get(), "AHB ImageView");
354+
context.SetDebugName(device_memory_.get(), "AHB Device Memory");
355+
context.SetDebugName(image_.get(), "AHB Image");
356+
context.SetDebugName(yuv_conversion_->GetConversion(), "AHB YUV Conversion");
357+
context.SetDebugName(image_view_.get(), "AHB ImageView");
357358
#endif // IMPELLER_DEBUG
358359

359360
is_valid_ = true;
360361
}
361362

363+
AHBTextureSourceVK::AHBTextureSourceVK(
364+
const std::shared_ptr<Context>& context,
365+
std::unique_ptr<android::HardwareBuffer> backing_store,
366+
bool is_swapchain_image)
367+
: AHBTextureSourceVK(context,
368+
backing_store->GetHandle(),
369+
backing_store->GetAndroidDescriptor()) {
370+
backing_store_ = std::move(backing_store);
371+
is_swapchain_image_ = is_swapchain_image;
372+
}
373+
362374
// |TextureSourceVK|
363375
AHBTextureSourceVK::~AHBTextureSourceVK() = default;
364376

@@ -383,12 +395,16 @@ vk::ImageView AHBTextureSourceVK::GetRenderTargetView() const {
383395

384396
// |TextureSourceVK|
385397
bool AHBTextureSourceVK::IsSwapchainImage() const {
386-
return false;
398+
return is_swapchain_image_;
387399
}
388400

389401
// |TextureSourceVK|
390402
std::shared_ptr<YUVConversionVK> AHBTextureSourceVK::GetYUVConversion() const {
391403
return needs_yuv_conversion_ ? yuv_conversion_ : nullptr;
392404
}
393405

406+
const android::HardwareBuffer* AHBTextureSourceVK::GetBackingStore() const {
407+
return backing_store_.get();
408+
}
409+
394410
} // namespace impeller

impeller/renderer/backend/vulkan/android/ahb_texture_source_vk.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "impeller/renderer/backend/vulkan/texture_source_vk.h"
1212
#include "impeller/renderer/backend/vulkan/vk.h"
1313
#include "impeller/renderer/backend/vulkan/yuv_conversion_vk.h"
14+
#include "impeller/toolkit/android/hardware_buffer.h"
1415

1516
#include <android/hardware_buffer.h>
1617
#include <android/hardware_buffer_jni.h>
@@ -33,10 +34,14 @@ class ContextVK;
3334
///
3435
class AHBTextureSourceVK final : public TextureSourceVK {
3536
public:
36-
AHBTextureSourceVK(const std::shared_ptr<ContextVK>& context,
37+
AHBTextureSourceVK(const std::shared_ptr<Context>& context,
3738
struct AHardwareBuffer* hardware_buffer,
3839
const AHardwareBuffer_Desc& hardware_buffer_desc);
3940

41+
AHBTextureSourceVK(const std::shared_ptr<Context>& context,
42+
std::unique_ptr<android::HardwareBuffer> backing_store,
43+
bool is_swapchain_image);
44+
4045
// |TextureSourceVK|
4146
~AHBTextureSourceVK() override;
4247

@@ -57,12 +62,16 @@ class AHBTextureSourceVK final : public TextureSourceVK {
5762
// |TextureSourceVK|
5863
std::shared_ptr<YUVConversionVK> GetYUVConversion() const override;
5964

65+
const android::HardwareBuffer* GetBackingStore() const;
66+
6067
private:
68+
std::unique_ptr<android::HardwareBuffer> backing_store_;
6169
vk::UniqueDeviceMemory device_memory_ = {};
6270
vk::UniqueImage image_ = {};
6371
vk::UniqueImageView image_view_ = {};
6472
std::shared_ptr<YUVConversionVK> yuv_conversion_ = {};
6573
bool needs_yuv_conversion_ = false;
74+
bool is_swapchain_image_ = false;
6675
bool is_valid_ = false;
6776

6877
AHBTextureSourceVK(const AHBTextureSourceVK&) = delete;

impeller/renderer/backend/vulkan/capabilities_vk.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ static const char* GetExtensionName(RequiredAndroidDeviceExtensionVK ext) {
179179
return VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME;
180180
case RequiredAndroidDeviceExtensionVK::kKHRDedicatedAllocation:
181181
return VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME;
182+
case RequiredAndroidDeviceExtensionVK::kKHRExternalFenceFd:
183+
return VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME;
184+
case RequiredAndroidDeviceExtensionVK::kKHRExternalFence:
185+
return VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME;
182186
case RequiredAndroidDeviceExtensionVK::kLast:
183187
return "Unknown";
184188
}

impeller/renderer/backend/vulkan/capabilities_vk.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,20 @@ enum class RequiredAndroidDeviceExtensionVK : uint32_t {
7878
///
7979
kKHRDedicatedAllocation,
8080

81+
//----------------------------------------------------------------------------
82+
/// For exporting file descriptors from fences to interact with platform APIs.
83+
///
84+
/// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_fence_fd.html
85+
///
86+
kKHRExternalFenceFd,
87+
88+
//----------------------------------------------------------------------------
89+
/// Dependency of kKHRExternalFenceFd.
90+
///
91+
/// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_fence.html
92+
///
93+
kKHRExternalFence,
94+
8195
kLast,
8296
};
8397

impeller/renderer/backend/vulkan/driver_info_vk_unittests.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ INSTANTIATE_VULKAN_PLAYGROUND_SUITE(DriverInfoVKTest);
1414
TEST_P(DriverInfoVKTest, CanQueryDriverInfo) {
1515
ASSERT_TRUE(GetContext());
1616
const auto& driver_info =
17-
SurfaceContextVK::Cast(*GetContext()).GetParent().GetDriverInfo();
17+
SurfaceContextVK::Cast(*GetContext()).GetParent()->GetDriverInfo();
1818
ASSERT_NE(driver_info, nullptr);
1919
// 1.1 is the base Impeller version. The driver can't be lower than that.
2020
ASSERT_TRUE(driver_info->GetAPIVersion().IsAtLeast(Version{1, 1, 0}));

impeller/renderer/backend/vulkan/queue_vk.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ vk::Result QueueVK::Submit(const vk::SubmitInfo& submit_info,
2323
return queue_.submit(submit_info, fence);
2424
}
2525

26+
vk::Result QueueVK::Submit(const vk::Fence& fence) const {
27+
Lock lock(queue_mutex_);
28+
return queue_.submit({}, fence);
29+
}
30+
2631
vk::Result QueueVK::Present(const vk::PresentInfoKHR& present_info) {
2732
Lock lock(queue_mutex_);
2833
return queue_.presentKHR(present_info);

impeller/renderer/backend/vulkan/queue_vk.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class QueueVK {
3939
vk::Result Submit(const vk::SubmitInfo& submit_info,
4040
const vk::Fence& fence) const;
4141

42+
vk::Result Submit(const vk::Fence& fence) const;
43+
4244
vk::Result Present(const vk::PresentInfoKHR& present_info);
4345

4446
void InsertDebugMarker(std::string_view label) const;

impeller/renderer/backend/vulkan/surface_context_vk.cc

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,12 @@ void SurfaceContextVK::Shutdown() {
6464

6565
bool SurfaceContextVK::SetWindowSurface(vk::UniqueSurfaceKHR surface,
6666
const ISize& size) {
67-
auto swapchain = SwapchainVK::Create(parent_, std::move(surface), size);
68-
if (!swapchain) {
69-
VALIDATION_LOG << "Could not create swapchain.";
70-
return false;
71-
}
72-
if (!swapchain->IsValid()) {
73-
VALIDATION_LOG << "Could not create valid swapchain.";
67+
return SetSwapchain(SwapchainVK::Create(parent_, std::move(surface), size));
68+
}
69+
70+
bool SurfaceContextVK::SetSwapchain(std::shared_ptr<SwapchainVK> swapchain) {
71+
if (!swapchain || !swapchain->IsValid()) {
72+
VALIDATION_LOG << "Invalid swapchain.";
7473
return false;
7574
}
7675
swapchain_ = std::move(swapchain);
@@ -96,29 +95,6 @@ void SurfaceContextVK::UpdateSurfaceSize(const ISize& size) const {
9695
swapchain_->UpdateSurfaceSize(size);
9796
}
9897

99-
#ifdef FML_OS_ANDROID
100-
101-
vk::UniqueSurfaceKHR SurfaceContextVK::CreateAndroidSurface(
102-
ANativeWindow* window) const {
103-
if (!parent_->GetInstance()) {
104-
return vk::UniqueSurfaceKHR{VK_NULL_HANDLE};
105-
}
106-
107-
auto create_info = vk::AndroidSurfaceCreateInfoKHR().setWindow(window);
108-
auto surface_res =
109-
parent_->GetInstance().createAndroidSurfaceKHRUnique(create_info);
110-
111-
if (surface_res.result != vk::Result::eSuccess) {
112-
VALIDATION_LOG << "Could not create Android surface, error: "
113-
<< vk::to_string(surface_res.result);
114-
return vk::UniqueSurfaceKHR{VK_NULL_HANDLE};
115-
}
116-
117-
return std::move(surface_res.value);
118-
}
119-
120-
#endif // FML_OS_ANDROID
121-
12298
const vk::Device& SurfaceContextVK::GetDevice() const {
12399
return parent_->GetDevice();
124100
}
@@ -127,8 +103,8 @@ void SurfaceContextVK::InitializeCommonlyUsedShadersIfNeeded() const {
127103
parent_->InitializeCommonlyUsedShadersIfNeeded();
128104
}
129105

130-
const ContextVK& SurfaceContextVK::GetParent() const {
131-
return *parent_;
106+
const std::shared_ptr<ContextVK>& SurfaceContextVK::GetParent() const {
107+
return parent_;
132108
}
133109

134110
} // namespace impeller

0 commit comments

Comments
 (0)