From 36e4934c136f8e5ff03da16c1185387f56ecf16b Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Fri, 26 Jul 2024 14:58:01 +0300 Subject: [PATCH] accept dumb buffers --- include/aquamarine/buffer/Buffer.hpp | 2 +- src/allocator/Dumb.cpp | 2 +- src/backend/drm/DRM.cpp | 26 +++++++++++++++++--------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/include/aquamarine/buffer/Buffer.hpp b/include/aquamarine/buffer/Buffer.hpp index 94b1d7e..644650f 100644 --- a/include/aquamarine/buffer/Buffer.hpp +++ b/include/aquamarine/buffer/Buffer.hpp @@ -16,7 +16,7 @@ namespace Aquamarine { BUFFER_TYPE_DMABUF = 0, BUFFER_TYPE_SHM, BUFFER_TYPE_MISC, - BUFFER_TYPE_DMABUF_DUMB, + BUFFER_TYPE_DUMB, }; class CWLBufferResource; diff --git a/src/allocator/Dumb.cpp b/src/allocator/Dumb.cpp index 403af02..f78f9e0 100644 --- a/src/allocator/Dumb.cpp +++ b/src/allocator/Dumb.cpp @@ -75,7 +75,7 @@ eBufferCapability Aquamarine::CDumbBuffer::caps() { } eBufferType Aquamarine::CDumbBuffer::type() { - return Aquamarine::eBufferType::BUFFER_TYPE_DMABUF_DUMB; + return Aquamarine::eBufferType::BUFFER_TYPE_DUMB; } void Aquamarine::CDumbBuffer::update(const Hyprutils::Math::CRegion& damage) { diff --git a/src/backend/drm/DRM.cpp b/src/backend/drm/DRM.cpp index 957cec4..943bfa4 100644 --- a/src/backend/drm/DRM.cpp +++ b/src/backend/drm/DRM.cpp @@ -1550,14 +1550,14 @@ SP Aquamarine::CDRMOutput::getBackend() { } bool Aquamarine::CDRMOutput::setCursor(SP buffer, const Vector2D& hotspot) { - if (buffer && !buffer->dmabuf().success) { - backend->backend->log(AQ_LOG_ERROR, "drm: Cursor buffer has to be a dmabuf"); - return false; - } - if (!buffer) setCursorVisible(false); else { + auto isDumb = buffer->type() == BUFFER_TYPE_DUMB; + if (!(buffer->dmabuf().success || (isDumb && buffer->shm().success))) { + backend->backend->log(AQ_LOG_ERROR, "drm: Cursor buffer has to be a dmabuf or dumb"); + return false; + } SP fb; if (backend->primary) { @@ -1572,8 +1572,8 @@ bool Aquamarine::CDRMOutput::setCursor(SP buffer, const Vector2D& hotsp OPTIONS.multigpu = false; OPTIONS.scanout = true; OPTIONS.cursor = true; - OPTIONS.format = buffer->dmabuf().format; - OPTIONS.size = buffer->dmabuf().size; + OPTIONS.format = isDumb ? buffer->shm().format : buffer->dmabuf().format; + OPTIONS.size = isDumb ? buffer->shm().size : buffer->dmabuf().size; OPTIONS.length = 2; if (!mgpu.cursorSwapchain->reconfigure(OPTIONS)) { @@ -1702,7 +1702,11 @@ Aquamarine::CDRMFB::CDRMFB(SP buffer_, Hyprutils::Memory::CWeakPointer< } void Aquamarine::CDRMFB::import() { - auto attrs = buffer->dmabuf(); + // FIXME easier to pretend that we are a dmabuf then to change everything. shm and dmabuf should have the same offset and stride types? + auto attrs = buffer->type() == BUFFER_TYPE_DUMB ? + SDMABUFAttrs{buffer->shm().success, buffer->shm().size, buffer->shm().format, 0, 1, {(uint32_t)buffer->shm().offset}, {(uint32_t)buffer->shm().stride}, + {buffer->shm().fd, -1, -1, -1}} : + buffer->dmabuf(); if (!attrs.success) { backend->backend->log(AQ_LOG_ERROR, "drm: Buffer submitted has no dmabuf"); return; @@ -1811,7 +1815,11 @@ void Aquamarine::CDRMFB::drop() { } uint32_t Aquamarine::CDRMFB::submitBuffer() { - auto attrs = buffer->dmabuf(); + // FIXME easier to pretend that we are a dmabuf then to change everything. shm and dmabuf should have the same offset and stride types? + auto attrs = buffer->type() == BUFFER_TYPE_DUMB ? + SDMABUFAttrs{buffer->shm().success, buffer->shm().size, buffer->shm().format, 0, 1, {(uint32_t)buffer->shm().offset}, {(uint32_t)buffer->shm().stride}, + {buffer->shm().fd, -1, -1, -1}} : + buffer->dmabuf(); uint32_t newID = 0; std::array mods = {0, 0, 0, 0}; for (size_t i = 0; i < attrs.planes; ++i) {