@@ -107,13 +107,11 @@ VulkanSurface::VulkanSurface(
107107 scenic::Session* session,
108108 const SkISize& size,
109109 uint32_t buffer_id)
110- : vulkan_provider_(vulkan_provider),
111- session_ (session),
112- buffer_id_(buffer_id),
113- wait_(this ) {
110+ : vulkan_provider_(vulkan_provider), session_(session), wait_(this ) {
114111 FML_DCHECK (session_);
115112
116- if (!AllocateDeviceMemory (sysmem_allocator, std::move (context), size)) {
113+ if (!AllocateDeviceMemory (sysmem_allocator, std::move (context), size,
114+ buffer_id)) {
117115 FML_DLOG (INFO) << " Could not allocate device memory." ;
118116 return ;
119117 }
@@ -135,6 +133,12 @@ VulkanSurface::VulkanSurface(
135133}
136134
137135VulkanSurface::~VulkanSurface () {
136+ if (image_id_) {
137+ session_->Enqueue (scenic::NewReleaseResourceCmd (image_id_));
138+ }
139+ if (buffer_id_) {
140+ session_->DeregisterBufferCollection (buffer_id_);
141+ }
138142 wait_.Cancel ();
139143 wait_.set_object (ZX_HANDLE_INVALID);
140144}
@@ -221,7 +225,8 @@ bool VulkanSurface::CreateFences() {
221225bool VulkanSurface::AllocateDeviceMemory (
222226 fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
223227 sk_sp<GrDirectContext> context,
224- const SkISize& size) {
228+ const SkISize& size,
229+ uint32_t buffer_id) {
225230 if (size.isEmpty ()) {
226231 return false ;
227232 }
@@ -237,16 +242,24 @@ bool VulkanSurface::AllocateDeviceMemory(
237242 status = vulkan_token->Sync ();
238243 LOG_AND_RETURN (status != ZX_OK, " Failed to sync token" );
239244
240- session_->RegisterBufferCollection (buffer_id_, std::move (scenic_token));
245+ session_->RegisterBufferCollection (buffer_id, std::move (scenic_token));
246+ buffer_id_ = buffer_id;
241247
242248 VkBufferCollectionCreateInfoFUCHSIA import_info;
243249 import_info.collectionToken = vulkan_token.Unbind ().TakeChannel ().release ();
250+ VkBufferCollectionFUCHSIA collection;
244251 if (VK_CALL_LOG_ERROR (vulkan_provider_.vk ().CreateBufferCollectionFUCHSIA (
245- vulkan_provider_.vk_device (), &import_info, nullptr , &collection_ )) !=
252+ vulkan_provider_.vk_device (), &import_info, nullptr , &collection )) !=
246253 VK_SUCCESS) {
247254 return false ;
248255 }
249256
257+ collection_ = {collection, [&vulkan_provider = vulkan_provider_](
258+ VkBufferCollectionFUCHSIA collection) {
259+ vulkan_provider.vk ().DestroyBufferCollectionFUCHSIA (
260+ vulkan_provider.vk_device (), collection, nullptr );
261+ }};
262+
250263 VulkanImage vulkan_image;
251264 LOG_AND_RETURN (!CreateVulkanImage (vulkan_provider_, size, &vulkan_image),
252265 " Failed to create VkImage" );
0 commit comments