diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc index 56fb5605e4e..495a532ebcc 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc @@ -527,6 +527,28 @@ std::unique_ptr ContextVK::AcquireSurface(size_t current_frame) { return surface_producer_->AcquireSurface(current_frame); } +#ifdef FML_OS_ANDROID + +vk::UniqueSurfaceKHR ContextVK::CreateAndroidSurface( + ANativeWindow* window) const { + if (!instance_) { + return vk::UniqueSurfaceKHR{VK_NULL_HANDLE}; + } + + auto create_info = vk::AndroidSurfaceCreateInfoKHR().setWindow(window); + auto surface_res = instance_->createAndroidSurfaceKHRUnique(create_info); + + if (surface_res.result != vk::Result::eSuccess) { + VALIDATION_LOG << "Could not create Android surface, error: " + << vk::to_string(surface_res.result); + return vk::UniqueSurfaceKHR{VK_NULL_HANDLE}; + } + + return std::move(surface_res.value); +} + +#endif // FML_OS_ANDROID + void ContextVK::SetupSwapchain(vk::UniqueSurfaceKHR surface) { surface_ = std::move(surface); auto present_queue_out = PickPresentQueue(physical_device_, *surface_); diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h index 081525d3f75..4c9cdefc35f 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.h @@ -66,6 +66,10 @@ class ContextVK final : public Context, public BackendCast { std::shared_ptr GetDescriptorPool() const; +#ifdef FML_OS_ANDROID + vk::UniqueSurfaceKHR CreateAndroidSurface(ANativeWindow* window) const; +#endif // FML_OS_ANDROID + private: std::shared_ptr worker_task_runner_; vk::UniqueInstance instance_;