diff --git a/include/aquamarine/backend/Backend.hpp b/include/aquamarine/backend/Backend.hpp index 32a6e05..8a34899 100644 --- a/include/aquamarine/backend/Backend.hpp +++ b/include/aquamarine/backend/Backend.hpp @@ -25,6 +25,7 @@ namespace Aquamarine { AQ_BACKEND_WAYLAND = 0, AQ_BACKEND_DRM, AQ_BACKEND_HEADLESS, + AQ_BACKEND_NULL, }; enum eBackendRequestMode : uint32_t { diff --git a/include/aquamarine/backend/Null.hpp b/include/aquamarine/backend/Null.hpp new file mode 100644 index 0000000..aaca6d2 --- /dev/null +++ b/include/aquamarine/backend/Null.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "./Backend.hpp" +#include "../allocator/Swapchain.hpp" +#include "../output/Output.hpp" +#include + +namespace Aquamarine { + class CBackend; + class IAllocator; + + class CNullBackend : public IBackendImplementation { + public: + virtual ~CNullBackend(); + virtual eBackendType type(); + virtual bool start(); + virtual std::vector> pollFDs(); + virtual int drmFD(); + virtual bool dispatchEvents(); + virtual uint32_t capabilities(); + virtual bool setCursor(Hyprutils::Memory::CSharedPointer buffer, const Hyprutils::Math::Vector2D& hotspot); + virtual void onReady(); + virtual std::vector getRenderFormats(); + virtual std::vector getCursorFormats(); + virtual bool createOutput(const std::string& name = ""); + virtual Hyprutils::Memory::CSharedPointer preferredAllocator(); + virtual std::vector> getAllocators(); + virtual Hyprutils::Memory::CWeakPointer getPrimary(); + + Hyprutils::Memory::CWeakPointer self; + virtual int drmRenderNodeFD(); + + void setFormats(const std::vector& fmts); + + private: + CNullBackend(Hyprutils::Memory::CSharedPointer backend_); + + Hyprutils::Memory::CWeakPointer backend; + + std::vector m_formats; + + friend class CBackend; + friend class CHeadlessOutput; + }; +}; diff --git a/src/backend/Backend.cpp b/src/backend/Backend.cpp index 7d63fe1..f0d782f 100644 --- a/src/backend/Backend.cpp +++ b/src/backend/Backend.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -83,6 +84,10 @@ Hyprutils::Memory::CSharedPointer Aquamarine::CBackend::create(const s auto ref = SP(new CHeadlessBackend(backend)); backend->implementations.emplace_back(ref); ref->self = ref; + } else if (b.backendType == AQ_BACKEND_NULL) { + auto ref = SP(new CNullBackend(backend)); + backend->implementations.emplace_back(ref); + ref->self = ref; } else { backend->log(AQ_LOG_ERROR, std::format("Unknown backend id: {}", (int)b.backendType)); continue; @@ -133,7 +138,7 @@ bool Aquamarine::CBackend::start() { // erase failed impls std::erase_if(implementations, [this](const auto& i) { - bool failed = i->pollFDs().empty(); + bool failed = i->pollFDs().empty() && i->type() != AQ_BACKEND_NULL; if (failed) log(AQ_LOG_ERROR, std::format("Implementation {} failed, erasing.", backendTypeToName(i->type()))); return failed; @@ -153,7 +158,7 @@ bool Aquamarine::CBackend::start() { } } - if (!primaryAllocator) { + if (!primaryAllocator && (implementations.empty() || implementations.at(0)->type() != AQ_BACKEND_NULL)) { log(AQ_LOG_CRITICAL, "Cannot open backend: no allocator available"); return false; } diff --git a/src/backend/Null.cpp b/src/backend/Null.cpp new file mode 100644 index 0000000..84c655e --- /dev/null +++ b/src/backend/Null.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include "Shared.hpp" + +using namespace Aquamarine; +using namespace Hyprutils::Memory; +using namespace Hyprutils::Math; +#define SP CSharedPointer + +Aquamarine::CNullBackend::~CNullBackend() { + ; +} + +Aquamarine::CNullBackend::CNullBackend(SP backend_) : backend(backend_) { + ; +} + +eBackendType Aquamarine::CNullBackend::type() { + return eBackendType::AQ_BACKEND_NULL; +} + +bool Aquamarine::CNullBackend::start() { + return true; +} + +std::vector> Aquamarine::CNullBackend::pollFDs() { + return {}; +} + +int Aquamarine::CNullBackend::drmFD() { + return -1; +} + +int Aquamarine::CNullBackend::drmRenderNodeFD() { + return -1; +} + +bool Aquamarine::CNullBackend::dispatchEvents() { + return true; +} + +uint32_t Aquamarine::CNullBackend::capabilities() { + return 0; +} + +bool Aquamarine::CNullBackend::setCursor(SP buffer, const Hyprutils::Math::Vector2D& hotspot) { + return false; +} + +void Aquamarine::CNullBackend::onReady() { + ; +} + +std::vector Aquamarine::CNullBackend::getRenderFormats() { + for (const auto& impl : backend->getImplementations()) { + if (impl->type() != AQ_BACKEND_DRM || impl->getRenderableFormats().empty()) + continue; + return impl->getRenderableFormats(); + } + + return m_formats; +} + +void Aquamarine::CNullBackend::setFormats(const std::vector& fmts) { + m_formats = fmts; +} + +std::vector Aquamarine::CNullBackend::getCursorFormats() { + return {}; // No cursor support +} + +bool Aquamarine::CNullBackend::createOutput(const std::string& name) { + return false; +} + +SP Aquamarine::CNullBackend::preferredAllocator() { + return backend->primaryAllocator; +} + +std::vector> Aquamarine::CNullBackend::getAllocators() { + return {backend->primaryAllocator}; +} + +Hyprutils::Memory::CWeakPointer Aquamarine::CNullBackend::getPrimary() { + return {}; +} diff --git a/src/backend/drm/impl/Atomic.cpp b/src/backend/drm/impl/Atomic.cpp index ba71c0e..2eb0f7b 100644 --- a/src/backend/drm/impl/Atomic.cpp +++ b/src/backend/drm/impl/Atomic.cpp @@ -196,7 +196,6 @@ void Aquamarine::CDRMAtomicRequest::addConnector(Hyprutils::Memory::CSharedPoint } } - void Aquamarine::CDRMAtomicRequest::addConnectorModeset(Hyprutils::Memory::CSharedPointer connector, SDRMConnectorCommitData& data) { if (!data.modeset) return;