summaryrefslogtreecommitdiff
path: root/src/protocols/types/WLBuffer.cpp
blob: 8b8e730ea4c4f53fef1d63e3f27d146fb8d12a07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "WLBuffer.hpp"
#include "Buffer.hpp"
#include "../core/Compositor.hpp"
#include "../DRMSyncobj.hpp"
#include "../../helpers/sync/SyncTimeline.hpp"
#include <xf86drm.h>

CWLBufferResource::CWLBufferResource(WP<CWlBuffer> resource_) : m_resource(resource_.lock()) {
    if UNLIKELY (!good())
        return;

    m_resource->setOnDestroy([this](CWlBuffer* r) {
        if (m_buffer.expired())
            return;
        m_buffer->events.destroy.emit();
    });
    m_resource->setDestroy([this](CWlBuffer* r) {
        if (m_buffer.expired())
            return;
        m_buffer->events.destroy.emit();
    });

    m_resource->setData(this);
}

bool CWLBufferResource::good() {
    return m_resource->resource();
}

void CWLBufferResource::sendRelease() {
    m_resource->sendRelease();
}

wl_resource* CWLBufferResource::getResource() {
    return m_resource->resource();
}

SP<CWLBufferResource> CWLBufferResource::fromResource(wl_resource* res) {
    auto data = sc<CWLBufferResource*>(sc<CWlBuffer*>(wl_resource_get_user_data(res))->data());
    return data ? data->m_self.lock() : nullptr;
}

SP<CWLBufferResource> CWLBufferResource::create(WP<CWlBuffer> resource) {
    auto p    = SP<CWLBufferResource>(new CWLBufferResource(resource));
    p->m_self = p;
    return p;
}