accept dumb buffers

This commit is contained in:
UjinT34 2024-07-26 14:58:01 +03:00
parent 95d6c8ac0e
commit 36e4934c13
3 changed files with 19 additions and 11 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -1550,14 +1550,14 @@ SP<IBackendImplementation> Aquamarine::CDRMOutput::getBackend() {
}
bool Aquamarine::CDRMOutput::setCursor(SP<IBuffer> 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<CDRMFB> fb;
if (backend->primary) {
@ -1572,8 +1572,8 @@ bool Aquamarine::CDRMOutput::setCursor(SP<IBuffer> 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<IBuffer> 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<uint64_t, 4> mods = {0, 0, 0, 0};
for (size_t i = 0; i < attrs.planes; ++i) {