diff options
-rw-r--r-- | src/cam/drm.cpp | 29 | ||||
-rw-r--r-- | src/cam/drm.h | 2 |
2 files changed, 18 insertions, 13 deletions
diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp index d5a75d03..f2530091 100644 --- a/src/cam/drm.cpp +++ b/src/cam/drm.cpp @@ -283,9 +283,9 @@ FrameBuffer::FrameBuffer(Device *dev) FrameBuffer::~FrameBuffer() { - for (FrameBuffer::Plane &plane : planes_) { + for (const auto &plane : planes_) { struct drm_gem_close gem_close = { - .handle = plane.handle, + .handle = plane.second.handle, .pad = 0, }; int ret; @@ -605,23 +605,28 @@ std::unique_ptr<FrameBuffer> Device::createFrameBuffer( int ret; const std::vector<libcamera::FrameBuffer::Plane> &planes = buffer.planes(); - fb->planes_.reserve(planes.size()); unsigned int i = 0; for (const libcamera::FrameBuffer::Plane &plane : planes) { + int fd = plane.fd.fd(); uint32_t handle; - ret = drmPrimeFDToHandle(fd_, plane.fd.fd(), &handle); - if (ret < 0) { - ret = -errno; - std::cerr - << "Unable to import framebuffer dmabuf: " - << strerror(-ret) << std::endl; - return nullptr; + auto iter = fb->planes_.find(fd); + if (iter == fb->planes_.end()) { + ret = drmPrimeFDToHandle(fd_, plane.fd.fd(), &handle); + if (ret < 0) { + ret = -errno; + std::cerr + << "Unable to import framebuffer dmabuf: " + << strerror(-ret) << std::endl; + return nullptr; + } + + fb->planes_[fd] = { handle }; + } else { + handle = iter->second.handle; } - fb->planes_.push_back({ handle }); - handles[i] = handle; offsets[i] = plane.offset; ++i; diff --git a/src/cam/drm.h b/src/cam/drm.h index 00f7e798..0b88f9a3 100644 --- a/src/cam/drm.h +++ b/src/cam/drm.h @@ -242,7 +242,7 @@ private: FrameBuffer(Device *dev); - std::vector<Plane> planes_; + std::map<int, Plane> planes_; }; class AtomicRequest |