@@ -109,11 +109,10 @@ VulkanSurface::VulkanSurface(
109109 uint32_t buffer_id)
110110 : vulkan_provider_(vulkan_provider),
111111 session_ (session),
112- buffer_id_(buffer_id),
113112 wait_(this ) {
114113 FML_DCHECK (session_);
115114
116- if (!AllocateDeviceMemory (sysmem_allocator, std::move (context), size)) {
115+ if (!AllocateDeviceMemory (sysmem_allocator, std::move (context), size, buffer_id )) {
117116 FML_DLOG (INFO) << " Could not allocate device memory." ;
118117 return ;
119118 }
@@ -135,6 +134,12 @@ VulkanSurface::VulkanSurface(
135134}
136135
137136VulkanSurface::~VulkanSurface () {
137+ if (image_id_) {
138+ session_->Enqueue (scenic::NewReleaseResourceCmd (image_id_));
139+ }
140+ if (buffer_id_) {
141+ session_->DeregisterBufferCollection (buffer_id_);
142+ }
138143 wait_.Cancel ();
139144 wait_.set_object (ZX_HANDLE_INVALID);
140145}
@@ -221,7 +226,8 @@ bool VulkanSurface::CreateFences() {
221226bool VulkanSurface::AllocateDeviceMemory (
222227 fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
223228 sk_sp<GrDirectContext> context,
224- const SkISize& size) {
229+ const SkISize& size,
230+ uint32_t buffer_id) {
225231 if (size.isEmpty ()) {
226232 return false ;
227233 }
@@ -237,16 +243,24 @@ bool VulkanSurface::AllocateDeviceMemory(
237243 status = vulkan_token->Sync ();
238244 LOG_AND_RETURN (status != ZX_OK, " Failed to sync token" );
239245
240- session_->RegisterBufferCollection (buffer_id_, std::move (scenic_token));
246+ session_->RegisterBufferCollection (buffer_id, std::move (scenic_token));
247+ buffer_id_ = buffer_id;
241248
242249 VkBufferCollectionCreateInfoFUCHSIA import_info;
243250 import_info.collectionToken = vulkan_token.Unbind ().TakeChannel ().release ();
251+ VkBufferCollectionFUCHSIA collection;
244252 if (VK_CALL_LOG_ERROR (vulkan_provider_.vk ().CreateBufferCollectionFUCHSIA (
245- vulkan_provider_.vk_device (), &import_info, nullptr , &collection_ )) !=
253+ vulkan_provider_.vk_device (), &import_info, nullptr , &collection )) !=
246254 VK_SUCCESS) {
247255 return false ;
248256 }
249257
258+ collection_ = {collection,
259+ [&vulkan_provider = vulkan_provider_](VkBufferCollectionFUCHSIA collection) {
260+ vulkan_provider.vk ().DestroyBufferCollectionFUCHSIA (
261+ vulkan_provider.vk_device (), collection, nullptr );
262+ }};
263+
250264 VulkanImage vulkan_image;
251265 LOG_AND_RETURN (!CreateVulkanImage (vulkan_provider_, size, &vulkan_image),
252266 " Failed to create VkImage" );
0 commit comments