From ad1de346cc4f566521c76919385c4cc6d74c108d Mon Sep 17 00:00:00 2001 From: Tarek Ismail Date: Thu, 12 Sep 2024 13:11:26 +0300 Subject: [PATCH] Use GEM handles instead of DMABuf FDs --- .../atomic-kms/server/kms/display_buffer.cpp | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src/platforms/atomic-kms/server/kms/display_buffer.cpp b/src/platforms/atomic-kms/server/kms/display_buffer.cpp index e188226466..d600abbd03 100644 --- a/src/platforms/atomic-kms/server/kms/display_buffer.cpp +++ b/src/platforms/atomic-kms/server/kms/display_buffer.cpp @@ -21,6 +21,7 @@ #include "gbm_display_allocator.h" #include "mir/fd.h" #include "mir/graphics/display_report.h" +#include "mir/graphics/drm_formats.h" #include "mir/graphics/platform.h" #include "mir/graphics/transformation.h" #include "bypass.h" @@ -40,9 +41,12 @@ #include #include +#include +#include #include #include #include +#include #include namespace mg = mir::graphics; @@ -349,13 +353,32 @@ auto mga::DmaBufDisplayAllocator::framebuffer_for(std::shared_ptr auto height = buffer->size().height; auto pixel_format = buffer->format(); - uint32_t bo_handles[4] = {0}; + uint32_t gem_handles[4] = {0}; uint32_t pitches[4] = {0}; uint32_t offsets[4] = {0}; - for (std::size_t i = 0; i < std::min(4zu, plane_descriptors.size()); i++) + uint64_t modifiers[4] = {}; + std::fill_n(modifiers, 4, 0); + + mir::log_debug( + "Buffer format %s", + mir::graphics::drm_format_to_string(buffer->format()) + /* mir::graphics::drm_modifier_to_string(buffer->modifier().value_or(0)).c_str(), */ + /* buffer->modifier().value_or(0) */ + ); + + for (std::size_t i = 0; i < std::min(1zu, plane_descriptors.size()); i++) { - bo_handles[i] = plane_descriptors[i].dma_buf; + uint32_t gem_handle = 0; + int ret = drmPrimeFDToHandle(drm_fd(), plane_descriptors[i].dma_buf, &gem_handle); + + if(ret) + { + mir::log_debug("Failed to convert buffer"); + return {}; + } + + gem_handles[i] = gem_handle; pitches[i] = plane_descriptors[i].stride; offsets[i] = plane_descriptors[i].offset; } @@ -371,19 +394,24 @@ auto mga::DmaBufDisplayAllocator::framebuffer_for(std::shared_ptr delete fb_id; }}; - int ret = drmModeAddFB2( + + int ret = drmModeAddFB2WithModifiers( drm_fd(), width.as_uint32_t(), height.as_uint32_t(), pixel_format, - bo_handles, + gem_handles, pitches, offsets, + modifiers, fb_id.get(), 0); if (ret) + { + mir::log_debug("drmModeAddFB2WithModifiers returned an error: %d", ret); return {}; + } struct AtomicKmsFbHandle : public mg::FBHandle {