diff --git a/src/platforms/atomic-kms/server/kms/display_buffer.cpp b/src/platforms/atomic-kms/server/kms/display_buffer.cpp index ab9b2bd52a..0b7371d3e1 100644 --- a/src/platforms/atomic-kms/server/kms/display_buffer.cpp +++ b/src/platforms/atomic-kms/server/kms/display_buffer.cpp @@ -368,7 +368,7 @@ auto import_gbm_bo( std::shared_ptr buffer, std::array dmabuf_fds, std::array pitches, - std::array offsets) -> struct gbm_bo* + std::array offsets) -> std::shared_ptr { auto const plane_descriptors = buffer->planes(); @@ -383,7 +383,8 @@ auto import_gbm_bo( .modifier = buffer->modifier().value_or(DRM_FORMAT_MOD_NONE), }; - return gbm_bo_import(gbm.get(), GBM_BO_IMPORT_FD_MODIFIER, (void*)&import_data, GBM_BO_USE_SCANOUT); + auto* gbm_bo = gbm_bo_import(gbm.get(), GBM_BO_IMPORT_FD_MODIFIER, (void*)&import_data, GBM_BO_USE_SCANOUT); + return std::shared_ptr(gbm_bo, &gbm_bo_destroy); } auto drm_fb_id_from_dma_buffer( @@ -391,7 +392,7 @@ auto drm_fb_id_from_dma_buffer( -> std::shared_ptr { auto [dmabuf_fds, pitches, offsets, modifiers] = get_import_buffers(buffer); - auto* gbm_bo = import_gbm_bo(gbm, buffer, dmabuf_fds, pitches, offsets); + auto gbm_bo = import_gbm_bo(gbm, buffer, dmabuf_fds, pitches, offsets); if (!gbm_bo) { mir::log_warning("Failed to import buffer"); @@ -401,16 +402,16 @@ auto drm_fb_id_from_dma_buffer( auto const plane_descriptors = buffer->planes(); uint32_t gem_handles[MAX_PLANES] = {0}; for (std::size_t i = 0; i < std::min(MAX_PLANES, plane_descriptors.size()); i++) - gem_handles[i] = gbm_bo_get_handle_for_plane(gbm_bo, i).u32; + gem_handles[i] = gbm_bo_get_handle_for_plane(gbm_bo.get(), i).u32; + // Note that we capture `gbm_bo` so that its lifetime matches that of the fb_id auto fb_id = std::shared_ptr{ new uint32_t{0}, - [drm_fd](uint32_t* fb_id) + [drm_fd, gbm_bo](uint32_t* fb_id) { if (*fb_id) - { drmModeRmFB(drm_fd, *fb_id); - } + delete fb_id; }};