11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
19PROMEKI_NAMESPACE_BEGIN
48class HostMappedBufferImpl :
public BufferImpl {
50 PROMEKI_SHARED_DERIVED(HostMappedBufferImpl)
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);
70 MemSpace memSpace()
const override {
return _memSpace; }
71 size_t allocSize()
const override {
return _allocSize; }
72 size_t align()
const override {
return _align; }
74 void *mappedHostData()
const override {
return _hostPtr; }
76 BufferRequest mapAcquire(MemDomain domain, MapFlags flags)
override {
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);
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);
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);
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);
109 static BufferRequest resolvedMap(MemDomain target, MapFlags flags,
void *hostPtr, Error result) {
110 auto *cmd =
new BufferMapCommand();
111 cmd->target = target;
113 cmd->hostPtr = hostPtr;
114 cmd->result = result;
115 return BufferRequest::resolved(BufferCommand::Ptr::takeOwnership(cmd));
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));
135 mutable void *_hostPtr =
nullptr;
136 size_t _allocSize = 0;
154class HostBufferImpl :
public HostMappedBufferImpl {
162 HostBufferImpl(
const MemSpace &ms,
size_t bytes,
size_t align);
165 ~HostBufferImpl()
override;
177 HostBufferImpl *_promeki_clone()
const override;
190class HostSecureBufferImpl :
public HostMappedBufferImpl {
198 HostSecureBufferImpl(
const MemSpace &ms,
size_t bytes,
size_t align);
201 ~HostSecureBufferImpl()
override;
211 HostSecureBufferImpl *_promeki_clone()
const override;
228class WrappedHostBufferImpl :
public HostMappedBufferImpl {
230 PROMEKI_SHARED_DERIVED(WrappedHostBufferImpl)
239 WrappedHostBufferImpl(
const MemSpace &ms,
void *ptr,
size_t bytes,
size_t align)
240 : HostMappedBufferImpl(ms, ptr, bytes, align) {}
243 ~WrappedHostBufferImpl()
override =
default;
246 bool canClone()
const override {
return false; }