Skip to content

Commit abd5853

Browse files
committed
add a drm_dumb allocator
1 parent f5ed91d commit abd5853

File tree

12 files changed

+369
-107
lines changed

12 files changed

+369
-107
lines changed

include/aquamarine/allocator/Allocator.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace Aquamarine {
1616

1717
enum eAllocatorType {
1818
AQ_ALLOCATOR_TYPE_GBM = 0,
19+
AQ_ALLOCATOR_TYPE_DRM_DUMB,
1920
};
2021

2122
class IAllocator {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#pragma once
2+
3+
#include "Allocator.hpp"
4+
5+
namespace Aquamarine {
6+
class CDRMDumbAllocator;
7+
class CBackend;
8+
class CSwapchain;
9+
10+
class CDRMDumbBuffer : public IBuffer {
11+
public:
12+
virtual ~CDRMDumbBuffer();
13+
14+
virtual eBufferCapability caps();
15+
virtual eBufferType type();
16+
virtual void update(const Hyprutils::Math::CRegion& damage);
17+
virtual bool isSynchronous();
18+
virtual bool good();
19+
virtual SSHMAttrs shm();
20+
virtual std::tuple<uint8_t*, uint32_t, size_t> beginDataPtr(uint32_t flags);
21+
virtual void endDataPtr();
22+
virtual uint32_t drmHandle();
23+
24+
private:
25+
CDRMDumbBuffer(const SAllocatorBufferParams& params, Hyprutils::Memory::CWeakPointer<CDRMDumbAllocator> allocator_,
26+
Hyprutils::Memory::CSharedPointer<CSwapchain> swapchain);
27+
28+
Hyprutils::Memory::CWeakPointer<CDRMDumbAllocator> allocator;
29+
30+
//
31+
uint32_t drmID = 0;
32+
Hyprutils::Math::Vector2D pixelSize;
33+
uint32_t stride = 0, handle = 0;
34+
uint64_t size = 0;
35+
uint8_t* data = nullptr;
36+
37+
//
38+
SSHMAttrs attrs{.success = false};
39+
40+
friend class CDRMDumbAllocator;
41+
};
42+
43+
class CDRMDumbAllocator : public IAllocator {
44+
public:
45+
~CDRMDumbAllocator();
46+
static Hyprutils::Memory::CSharedPointer<CDRMDumbAllocator> create(int drmfd_, Hyprutils::Memory::CWeakPointer<CBackend> backend_);
47+
48+
virtual Hyprutils::Memory::CSharedPointer<IBuffer> acquire(const SAllocatorBufferParams& params, Hyprutils::Memory::CSharedPointer<CSwapchain> swapchain_);
49+
virtual Hyprutils::Memory::CSharedPointer<CBackend> getBackend();
50+
virtual int drmFD();
51+
virtual eAllocatorType type();
52+
53+
//
54+
Hyprutils::Memory::CWeakPointer<CDRMDumbAllocator> self;
55+
56+
private:
57+
CDRMDumbAllocator(int fd_, Hyprutils::Memory::CWeakPointer<CBackend> backend_);
58+
59+
// a vector purely for tracking (debugging) the buffers and nothing more
60+
std::vector<Hyprutils::Memory::CWeakPointer<CDRMDumbBuffer>> buffers;
61+
62+
Hyprutils::Memory::CWeakPointer<CBackend> backend;
63+
64+
int drmfd = -1;
65+
66+
friend class CDRMDumbBuffer;
67+
friend class CDRMRenderer;
68+
};
69+
};

include/aquamarine/backend/Backend.hpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,19 @@ namespace Aquamarine {
6666
AQ_BACKEND_CAPABILITY_POINTER = (1 << 0),
6767
};
6868

69-
virtual eBackendType type() = 0;
70-
virtual bool start() = 0;
71-
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs() = 0;
72-
virtual int drmFD() = 0;
73-
virtual bool dispatchEvents() = 0;
74-
virtual uint32_t capabilities() = 0;
75-
virtual void onReady() = 0;
76-
virtual std::vector<SDRMFormat> getRenderFormats() = 0;
77-
virtual std::vector<SDRMFormat> getCursorFormats() = 0;
78-
virtual bool createOutput(const std::string& name = "") = 0; // "" means auto
79-
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator() = 0;
80-
virtual std::vector<SDRMFormat> getRenderableFormats(); // empty = use getRenderFormats
69+
virtual eBackendType type() = 0;
70+
virtual bool start() = 0;
71+
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs() = 0;
72+
virtual int drmFD() = 0;
73+
virtual bool dispatchEvents() = 0;
74+
virtual uint32_t capabilities() = 0;
75+
virtual void onReady() = 0;
76+
virtual std::vector<SDRMFormat> getRenderFormats() = 0;
77+
virtual std::vector<SDRMFormat> getCursorFormats() = 0;
78+
virtual bool createOutput(const std::string& name = "") = 0; // "" means auto
79+
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator() = 0;
80+
virtual std::vector<SDRMFormat> getRenderableFormats(); // empty = use getRenderFormats
81+
virtual std::vector<Hyprutils::Memory::CSharedPointer<IAllocator>> getAllocators() = 0;
8182
};
8283

8384
class CBackend {

include/aquamarine/backend/DRM.hpp

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ namespace Aquamarine {
1515
class CDRMOutput;
1616
struct SDRMConnector;
1717
class CDRMRenderer;
18+
class CDRMDumbAllocator;
1819

1920
typedef std::function<void(void)> FIdleCallback;
2021

@@ -340,28 +341,29 @@ namespace Aquamarine {
340341
class CDRMBackend : public IBackendImplementation {
341342
public:
342343
virtual ~CDRMBackend();
343-
virtual eBackendType type();
344-
virtual bool start();
345-
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs();
346-
virtual int drmFD();
347-
virtual bool dispatchEvents();
348-
virtual uint32_t capabilities();
349-
virtual bool setCursor(Hyprutils::Memory::CSharedPointer<IBuffer> buffer, const Hyprutils::Math::Vector2D& hotspot);
350-
virtual void onReady();
351-
virtual std::vector<SDRMFormat> getRenderFormats();
352-
virtual std::vector<SDRMFormat> getCursorFormats();
353-
virtual bool createOutput(const std::string& name = "");
354-
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator();
355-
virtual std::vector<SDRMFormat> getRenderableFormats();
356-
357-
Hyprutils::Memory::CWeakPointer<CDRMBackend> self;
358-
359-
void log(eBackendLogLevel, const std::string&);
360-
bool sessionActive();
361-
int getNonMasterFD();
362-
363-
std::vector<FIdleCallback> idleCallbacks;
364-
std::string gpuName;
344+
virtual eBackendType type();
345+
virtual bool start();
346+
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs();
347+
virtual int drmFD();
348+
virtual bool dispatchEvents();
349+
virtual uint32_t capabilities();
350+
virtual bool setCursor(Hyprutils::Memory::CSharedPointer<IBuffer> buffer, const Hyprutils::Math::Vector2D& hotspot);
351+
virtual void onReady();
352+
virtual std::vector<SDRMFormat> getRenderFormats();
353+
virtual std::vector<SDRMFormat> getCursorFormats();
354+
virtual bool createOutput(const std::string& name = "");
355+
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator();
356+
virtual std::vector<SDRMFormat> getRenderableFormats();
357+
virtual std::vector<Hyprutils::Memory::CSharedPointer<IAllocator>> getAllocators();
358+
359+
Hyprutils::Memory::CWeakPointer<CDRMBackend> self;
360+
361+
void log(eBackendLogLevel, const std::string&);
362+
bool sessionActive();
363+
int getNonMasterFD();
364+
365+
std::vector<FIdleCallback> idleCallbacks;
366+
std::string gpuName;
365367

366368
private:
367369
CDRMBackend(Hyprutils::Memory::CSharedPointer<CBackend> backend);
@@ -396,6 +398,8 @@ namespace Aquamarine {
396398
std::vector<SDRMFormat> formats;
397399
std::vector<SDRMFormat> glFormats;
398400

401+
Hyprutils::Memory::CSharedPointer<CDRMDumbAllocator> dumbAllocator;
402+
399403
bool atomic = false;
400404

401405
struct {

include/aquamarine/backend/Headless.hpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Aquamarine {
99
class CBackend;
1010
class CHeadlessBackend;
11+
class IAllocator;
1112

1213
class CHeadlessOutput : public IOutput {
1314
public:
@@ -35,20 +36,21 @@ namespace Aquamarine {
3536
class CHeadlessBackend : public IBackendImplementation {
3637
public:
3738
virtual ~CHeadlessBackend();
38-
virtual eBackendType type();
39-
virtual bool start();
40-
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs();
41-
virtual int drmFD();
42-
virtual bool dispatchEvents();
43-
virtual uint32_t capabilities();
44-
virtual bool setCursor(Hyprutils::Memory::CSharedPointer<IBuffer> buffer, const Hyprutils::Math::Vector2D& hotspot);
45-
virtual void onReady();
46-
virtual std::vector<SDRMFormat> getRenderFormats();
47-
virtual std::vector<SDRMFormat> getCursorFormats();
48-
virtual bool createOutput(const std::string& name = "");
49-
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator();
50-
51-
Hyprutils::Memory::CWeakPointer<CHeadlessBackend> self;
39+
virtual eBackendType type();
40+
virtual bool start();
41+
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs();
42+
virtual int drmFD();
43+
virtual bool dispatchEvents();
44+
virtual uint32_t capabilities();
45+
virtual bool setCursor(Hyprutils::Memory::CSharedPointer<IBuffer> buffer, const Hyprutils::Math::Vector2D& hotspot);
46+
virtual void onReady();
47+
virtual std::vector<SDRMFormat> getRenderFormats();
48+
virtual std::vector<SDRMFormat> getCursorFormats();
49+
virtual bool createOutput(const std::string& name = "");
50+
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator();
51+
virtual std::vector<Hyprutils::Memory::CSharedPointer<IAllocator>> getAllocators();
52+
53+
Hyprutils::Memory::CWeakPointer<CHeadlessBackend> self;
5254

5355
private:
5456
CHeadlessBackend(Hyprutils::Memory::CSharedPointer<CBackend> backend_);

include/aquamarine/backend/Wayland.hpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -123,20 +123,21 @@ namespace Aquamarine {
123123
class CWaylandBackend : public IBackendImplementation {
124124
public:
125125
virtual ~CWaylandBackend();
126-
virtual eBackendType type();
127-
virtual bool start();
128-
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs();
129-
virtual int drmFD();
130-
virtual bool dispatchEvents();
131-
virtual uint32_t capabilities();
132-
virtual bool setCursor(Hyprutils::Memory::CSharedPointer<IBuffer> buffer, const Hyprutils::Math::Vector2D& hotspot);
133-
virtual void onReady();
134-
virtual std::vector<SDRMFormat> getRenderFormats();
135-
virtual std::vector<SDRMFormat> getCursorFormats();
136-
virtual bool createOutput(const std::string& name = "");
137-
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator();
138-
139-
Hyprutils::Memory::CWeakPointer<CWaylandBackend> self;
126+
virtual eBackendType type();
127+
virtual bool start();
128+
virtual std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> pollFDs();
129+
virtual int drmFD();
130+
virtual bool dispatchEvents();
131+
virtual uint32_t capabilities();
132+
virtual bool setCursor(Hyprutils::Memory::CSharedPointer<IBuffer> buffer, const Hyprutils::Math::Vector2D& hotspot);
133+
virtual void onReady();
134+
virtual std::vector<SDRMFormat> getRenderFormats();
135+
virtual std::vector<SDRMFormat> getCursorFormats();
136+
virtual bool createOutput(const std::string& name = "");
137+
virtual Hyprutils::Memory::CSharedPointer<IAllocator> preferredAllocator();
138+
virtual std::vector<Hyprutils::Memory::CSharedPointer<IAllocator>> getAllocators();
139+
140+
Hyprutils::Memory::CWeakPointer<CWaylandBackend> self;
140141

141142
private:
142143
CWaylandBackend(Hyprutils::Memory::CSharedPointer<CBackend> backend);

include/aquamarine/buffer/Buffer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ namespace Aquamarine {
6060
virtual void lock();
6161
virtual void unlock();
6262
virtual bool locked();
63+
virtual uint32_t drmHandle();
6364

6465
Hyprutils::Math::Vector2D size;
6566
bool opaque = false;

0 commit comments

Comments
 (0)