31#ifndef DW_FRAMEWORK_BUFFER_HPP_
32#define DW_FRAMEWORK_BUFFER_HPP_
35#include <dwcgf/Types.hpp>
37#include <dw/core/language/Optional.hpp>
38#include <dw/cuda/misc/DevicePtr.hpp>
56 return (
static_cast<uint32_t
>(flags) & (1U <<
static_cast<uint32_t
>(type))) != 0U;
61 flags |= (1U <<
static_cast<uint32_t
>(type));
73 static constexpr char LOG_TAG[] =
"Buffer";
89 throw Exception(DW_CALL_NOT_ALLOWED,
"BufferBase: Cannot bind NvSciBufObj twice");
96 const NvSciBufType bufferType = NvSciBufType_RawBuffer;
97 const NvSciBufAttrValAccessPerm permissions = NvSciBufAccessPerm_ReadWrite;
98 const uint64_t rawAlign = 4;
100 Array<NvSciBufAttrKeyValuePair, 3> rawBufferAttributes =
101 {{{NvSciBufGeneralAttrKey_Types, &bufferType,
sizeof(bufferType)},
102 {NvSciBufGeneralAttrKey_RequiredPerm, &permissions,
sizeof(permissions)},
103 {NvSciBufRawBufferAttrKey_Align, &rawAlign,
sizeof(rawAlign)}}};
106 rawBufferAttributes.data(),
107 rawBufferAttributes.size()));
112 Array<NvSciBufAttrKeyValuePair, 1> rawBufferSizeAttributes =
113 {{{NvSciBufRawBufferAttrKey_Size, &rawSize,
sizeof(rawSize)}}};
115 rawBufferSizeAttributes.data(),
116 rawBufferSizeAttributes.size()));
140 const bool cpuAccessFlag =
true;
142 Array<NvSciBufAttrKeyValuePair, 1> rawBufferAttributes =
143 {{{NvSciBufGeneralAttrKey_NeedCpuAccess, &cpuAccessFlag,
sizeof(cpuAccessFlag)}}};
146 rawBufferAttributes.data(),
147 rawBufferAttributes.size()));
158 return &(
static_cast<uint8_t*
>(m_ptr)[offset]);
187 NvSciRmGpuId gpuIds[] = {{0}};
191 cudaDeviceProp deviceProps{};
193 static_assert(
sizeof(deviceProps.uuid) ==
sizeof(gpuIds[0]),
"BufferCUDA: cuda uuid size does not match size of NvSciRmGpuId");
194 memcpy(
static_cast<void*
>(&gpuIds[0]),
static_cast<void*
>(&deviceProps.uuid),
sizeof(gpuIds[0]));
196 Array<NvSciBufAttrKeyValuePair, 1> rawBufferAttributes =
197 {{{NvSciBufGeneralAttrKey_GpuId, &gpuIds,
sizeof(gpuIds)}}};
200 rawBufferAttributes.data(),
201 rawBufferAttributes.size()));
208 cudaExternalMemoryHandleDesc cudaMemHandleDesc = {};
209 cudaMemHandleDesc.type = cudaExternalMemoryHandleTypeNvSciBuf;
210 cudaMemHandleDesc.handle.nvSciBufObject = bufObj;
212 cudaMemHandleDesc.flags = 0;
215 cudaExternalMemoryBufferDesc cudaBufferDesc = {};
216 memset(&cudaBufferDesc, 0,
sizeof(cudaBufferDesc));
218 cudaBufferDesc.offset = 0;
224 void* ptr = &(
static_cast<uint8_t*
>(m_ptr)[offset]);
225 return core::MakeDevicePtr(ptr);
229 cudaExternalMemory_t m_cudaHandle{};
246 m_bufferCpu.emplace(properties);
250 m_bufferCuda.emplace(properties);
259 m_bufferCpu.value().bindNvSciBufObj(bufObj);
263 m_bufferCuda.value().bindNvSciBufObj(bufObj);
272 m_bufferCpu.value().fillSpecificAttributes(attrList);
276 m_bufferCuda.value().fillSpecificAttributes(attrList);
282 return m_bufferCpu.value().getCpuPtr(offset);
287 return m_bufferCuda.value().getCudaPtr(offset);
291 dw::core::Optional<BufferCPU> m_bufferCpu{};
292 dw::core::Optional<BufferCUDA> m_bufferCuda{};
#define FRWK_CHECK_CUDA_ERROR_NOTHROW(x)
#define FRWK_CHECK_CUDA_ERROR(x)
#define FRWK_CHECK_NVSCI_ERROR(e)
const BufferProperties & getProperties() const
void fillNvSciBufAttrs(NvSciBufAttrList attrList) const
BufferBase(BufferProperties properties)
virtual void bindNvSciBufObj(NvSciBufObj bufObj)
static constexpr char LOG_TAG[]
BufferProperties m_properties
BufferCPU(BufferProperties properties)
void * getCpuPtr(size_t offset)
void bindNvSciBufObj(NvSciBufObj bufObj) override
void fillSpecificAttributes(NvSciBufAttrList attrList) const
void fillSpecificAttributes(NvSciBufAttrList attrList) const
core::DevicePtr< void > getCudaPtr(size_t offset)
void bindNvSciBufObj(NvSciBufObj bufObj) override
BufferCUDA(BufferProperties properties)
void * getCpuPtr(size_t offset)
void bindNvSciBufObj(NvSciBufObj bufObj) override
void fillNvSciBufAttrs(NvSciBufAttrList attrList) const
Buffer(BufferProperties properties)
core::DevicePtr< void > getCudaPtr(size_t offset)
void BufferFlagsEnableBackend(BufferFlags &flags, BufferBackendType type)
bool BufferFlagsBackendEnabled(BufferFlags flags, BufferBackendType type)
BufferFlags enabledBackends