From 8031474f95f9af721d0d5009cfccee282e1cba89 Mon Sep 17 00:00:00 2001 From: Tarek Ismail Date: Mon, 23 Sep 2024 18:34:51 +0300 Subject: [PATCH] Pass `gbm_device` directly instead of smuggling it through `DisplaySink` --- include/platform/mir/graphics/platform.h | 2 +- .../atomic-kms/server/kms/display_buffer.cpp | 21 +++++++------------ .../atomic-kms/server/kms/display_sink.h | 7 +++++-- .../gbm-kms/server/buffer_allocator.cpp | 7 +++---- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/include/platform/mir/graphics/platform.h b/include/platform/mir/graphics/platform.h index 5e5f709a8c..193e3988dc 100644 --- a/include/platform/mir/graphics/platform.h +++ b/include/platform/mir/graphics/platform.h @@ -396,7 +396,7 @@ class DmaBufDisplayAllocator : public DisplayAllocator { }; - virtual auto framebuffer_for(mir::graphics::DisplaySink& sink, std::shared_ptr buffer) + virtual auto framebuffer_for(std::shared_ptr buffer) -> std::unique_ptr = 0; }; diff --git a/src/platforms/atomic-kms/server/kms/display_buffer.cpp b/src/platforms/atomic-kms/server/kms/display_buffer.cpp index 6a6d5439b4..66cab58630 100644 --- a/src/platforms/atomic-kms/server/kms/display_buffer.cpp +++ b/src/platforms/atomic-kms/server/kms/display_buffer.cpp @@ -64,7 +64,7 @@ mga::DisplaySink::DisplaySink( std::vector> const& outputs, geom::Rectangle const& area, glm::mat2 const& transformation) - : DmaBufDisplayAllocator(drm_fd), + : DmaBufDisplayAllocator(gbm, drm_fd), gbm{std::move(gbm)}, listener(listener), outputs(outputs), @@ -371,16 +371,12 @@ namespace { } auto import_gbm_bo( - mg::DisplaySink const& sink, + std::shared_ptr gbm, std::shared_ptr buffer, std::array dmabuf_fds, std::array pitches, std::array offsets) -> struct gbm_bo* { - auto* ds = dynamic_cast(&sink); - if (!ds) - return nullptr; - auto const plane_descriptors = buffer->planes(); gbm_import_fd_modifier_data import_data = { @@ -394,16 +390,15 @@ namespace { .modifier = buffer->modifier().value_or(DRM_FORMAT_MOD_NONE), }; - return gbm_bo_import( - ds->gbm_device().get(), GBM_BO_IMPORT_FD_MODIFIER, (void*)&import_data, GBM_BO_USE_SCANOUT); + return gbm_bo_import(gbm.get(), GBM_BO_IMPORT_FD_MODIFIER, (void*)&import_data, GBM_BO_USE_SCANOUT); } - auto drm_fb_id_from_dma_buffer(mir::Fd drm_fd, mg::DisplaySink const& sink, std::shared_ptr buffer) + auto drm_fb_id_from_dma_buffer(mir::Fd drm_fd, std::shared_ptr const gbm, std::shared_ptr buffer) -> std::shared_ptr { auto [dmabuf_fds, pitches, offsets, modifiers] = get_import_buffers(buffer); - auto* gbm_bo = import_gbm_bo(sink, 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"); @@ -449,9 +444,9 @@ namespace { } } -auto mga::DmaBufDisplayAllocator::framebuffer_for(mg::DisplaySink& sink, std::shared_ptr buffer) -> std::unique_ptr +auto mga::DmaBufDisplayAllocator::framebuffer_for(std::shared_ptr buffer) -> std::unique_ptr { - auto fb_id = drm_fb_id_from_dma_buffer(drm_fd(), sink, buffer); + auto fb_id = drm_fb_id_from_dma_buffer(drm_fd(), gbm, buffer); struct AtomicKmsFbHandle : public mg::FBHandle { @@ -502,7 +497,7 @@ auto mga::DisplaySink::maybe_create_allocator(DisplayAllocator::Tag const& type_ { if (!bypass_allocator) { - bypass_allocator = std::make_shared(drm_fd()); + bypass_allocator = std::make_shared(gbm, drm_fd()); } return bypass_allocator.get(); } diff --git a/src/platforms/atomic-kms/server/kms/display_sink.h b/src/platforms/atomic-kms/server/kms/display_sink.h index b925dd8783..45ccefe664 100644 --- a/src/platforms/atomic-kms/server/kms/display_sink.h +++ b/src/platforms/atomic-kms/server/kms/display_sink.h @@ -54,11 +54,13 @@ class KMSOutput; class DmaBufDisplayAllocator : public graphics::DmaBufDisplayAllocator { public: - DmaBufDisplayAllocator(mir::Fd drm_fd) : drm_fd_{drm_fd} + DmaBufDisplayAllocator(std::shared_ptr const gbm, mir::Fd drm_fd) : + drm_fd_{drm_fd}, + gbm{gbm} { } - virtual auto framebuffer_for(mir::graphics::DisplaySink& sink, std::shared_ptr buffer) -> std::unique_ptr override; + virtual auto framebuffer_for(std::shared_ptr buffer) -> std::unique_ptr override; auto drm_fd() -> mir::Fd const { @@ -67,6 +69,7 @@ class DmaBufDisplayAllocator : public graphics::DmaBufDisplayAllocator private: mir::Fd const drm_fd_; + std::shared_ptr const gbm; }; class DisplaySink : diff --git a/src/platforms/gbm-kms/server/buffer_allocator.cpp b/src/platforms/gbm-kms/server/buffer_allocator.cpp index 5792b216aa..cbb7f7c315 100644 --- a/src/platforms/gbm-kms/server/buffer_allocator.cpp +++ b/src/platforms/gbm-kms/server/buffer_allocator.cpp @@ -561,7 +561,7 @@ auto mgg::GLRenderingProvider::make_framebuffer_provider(DisplaySink& sink) struct FooFramebufferProvider: public FramebufferProvider { public: - FooFramebufferProvider(DmaBufDisplayAllocator* allocator, mg::DisplaySink& sink) : allocator{allocator}, sink{sink} + FooFramebufferProvider(DmaBufDisplayAllocator* allocator) : allocator{allocator} { } @@ -569,7 +569,7 @@ auto mgg::GLRenderingProvider::make_framebuffer_provider(DisplaySink& sink) { if(auto dma_buf = std::dynamic_pointer_cast(buffer)) { - return allocator->framebuffer_for(sink, dma_buf); + return allocator->framebuffer_for(dma_buf); } return {}; @@ -577,10 +577,9 @@ auto mgg::GLRenderingProvider::make_framebuffer_provider(DisplaySink& sink) private: DmaBufDisplayAllocator* allocator; - mg::DisplaySink& sink; }; - return std::make_unique(allocator, sink); + return std::make_unique(allocator); } // TODO: Make this not a null implementation, so bypass/overlays can work again