libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
hostbufferimpl.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <cstring>
14#include <promeki/namespace.h>
15#include <promeki/bufferimpl.h>
17#include <promeki/error.h>
18
19PROMEKI_NAMESPACE_BEGIN
20
48class HostMappedBufferImpl : public BufferImpl {
49 public:
50 PROMEKI_SHARED_DERIVED(HostMappedBufferImpl)
51
52
65 HostMappedBufferImpl(const MemSpace &ms, void *hostPtr, size_t allocSize, size_t align)
66 : _hostPtr(hostPtr), _allocSize(allocSize), _align(align), _memSpace(ms) {
67 seedMapRefcount(MemDomain::Host, 1);
68 }
69
70 MemSpace memSpace() const override { return _memSpace; }
71 size_t allocSize() const override { return _allocSize; }
72 size_t align() const override { return _align; }
73
74 void *mappedHostData() const override { return _hostPtr; }
75
76 BufferRequest mapAcquire(MemDomain domain, MapFlags flags) override {
77 (void)flags;
78 if (domain.id() != MemDomain::Host) return resolvedMap(domain, flags, nullptr, Error::NotSupported);
79 incrementMapRefcount(MemDomain::Host);
80 return resolvedMap(domain, flags, _hostPtr, Error::Ok);
81 }
82
83 BufferRequest mapRelease(MemDomain domain) override {
84 if (domain.id() != MemDomain::Host) return resolvedUnmap(domain, Error::Invalid);
85 int newCount = decrementMapRefcount(MemDomain::Host);
86 return resolvedUnmap(domain, newCount < 0 ? Error::Invalid : Error::Ok);
87 }
88
89 Error fill(char value, size_t offset, size_t bytes) override {
90 if (_hostPtr == nullptr) return Error::Invalid;
91 std::memset(static_cast<uint8_t *>(_hostPtr) + offset, value, bytes);
92 return Error::Ok;
93 }
94
95 Error copyFromHost(const void *src, size_t bytes, size_t offset) override {
96 if (_hostPtr == nullptr) return Error::Invalid;
97 std::memcpy(static_cast<uint8_t *>(_hostPtr) + offset, src, bytes);
98 return Error::Ok;
99 }
100
101 protected:
109 static BufferRequest resolvedMap(MemDomain target, MapFlags flags, void *hostPtr, Error result) {
110 auto *cmd = new BufferMapCommand();
111 cmd->target = target;
112 cmd->flags = flags;
113 cmd->hostPtr = hostPtr;
114 cmd->result = result;
115 return BufferRequest::resolved(BufferCommand::Ptr::takeOwnership(cmd));
116 }
117
124 static BufferRequest resolvedUnmap(MemDomain target, Error result) {
125 auto *cmd = new BufferUnmapCommand();
126 cmd->target = target;
127 cmd->result = result;
128 return BufferRequest::resolved(BufferCommand::Ptr::takeOwnership(cmd));
129 }
130
131 // _hostPtr is mutable because backends with a producer→post-producer
132 // transition (e.g. MemfdBufferImpl::seal()) need to swap the pointer
133 // through a const seal API. The Buffer wrapper always re-fetches
134 // through mappedHostData(); no caller caches across the swap.
135 mutable void *_hostPtr = nullptr;
136 size_t _allocSize = 0;
137 size_t _align = 0;
138 MemSpace _memSpace;
139};
140
154class HostBufferImpl : public HostMappedBufferImpl {
155 public:
162 HostBufferImpl(const MemSpace &ms, size_t bytes, size_t align);
163
165 ~HostBufferImpl() override;
166
177 HostBufferImpl *_promeki_clone() const override;
178};
179
190class HostSecureBufferImpl : public HostMappedBufferImpl {
191 public:
198 HostSecureBufferImpl(const MemSpace &ms, size_t bytes, size_t align);
199
201 ~HostSecureBufferImpl() override;
202
211 HostSecureBufferImpl *_promeki_clone() const override;
212};
213
228class WrappedHostBufferImpl : public HostMappedBufferImpl {
229 public:
230 PROMEKI_SHARED_DERIVED(WrappedHostBufferImpl)
231
232
239 WrappedHostBufferImpl(const MemSpace &ms, void *ptr, size_t bytes, size_t align)
240 : HostMappedBufferImpl(ms, ptr, bytes, align) {}
241
243 ~WrappedHostBufferImpl() override = default;
244
246 bool canClone() const override { return false; }
247};
248
249PROMEKI_NAMESPACE_END
250
251#endif // PROMEKI_ENABLE_CORE