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";
76 : m_properties(std::move(properties))
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()));
109 if (m_properties.byteSize > 0U)
111 const uint64_t rawSize = m_properties.byteSize;
112 Array<NvSciBufAttrKeyValuePair, 1> rawBufferSizeAttributes =
113 {{{NvSciBufRawBufferAttrKey_Size, &rawSize,
sizeof(rawSize)}}};
115 rawBufferSizeAttributes.data(),
116 rawBufferSizeAttributes.size()));
127 NvSciBufObj m_bufObj{};
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}};
189 cudaDeviceProp deviceProps{};
192 static_assert(
sizeof(deviceProps.uuid) ==
sizeof(gpuIds[0]),
"BufferCUDA: cuda uuid size does not match size of NvSciRmGpuId");
193 memcpy(static_cast<void*>(&gpuIds[0]), static_cast<void*>(&deviceProps.uuid),
sizeof(gpuIds[0]));
195 Array<NvSciBufAttrKeyValuePair, 1> rawBufferAttributes =
196 {{{NvSciBufGeneralAttrKey_GpuId, &gpuIds,
sizeof(gpuIds)}}};
199 rawBufferAttributes.data(),
200 rawBufferAttributes.size()));
206 cudaExternalMemoryHandleDesc cudaMemHandleDesc = {};
207 cudaMemHandleDesc.type = cudaExternalMemoryHandleTypeNvSciBuf;
208 cudaMemHandleDesc.handle.nvSciBufObject = bufObj;
209 cudaMemHandleDesc.size = m_properties.byteSize;
210 cudaMemHandleDesc.flags = 0;
213 cudaExternalMemoryBufferDesc cudaBufferDesc = {};
214 memset(&cudaBufferDesc, 0,
sizeof(cudaBufferDesc));
215 cudaBufferDesc.size = m_properties.byteSize;
216 cudaBufferDesc.offset = 0;
222 void* ptr = &(
static_cast<uint8_t*
>(m_ptr)[offset]);
223 return core::MakeDevicePtr(ptr);
227 cudaExternalMemory_t m_cudaHandle{};
241 auto enabledBackends = m_properties.enabledBackends;
244 m_bufferCpu.emplace(properties);
248 m_bufferCuda.emplace(properties);
257 m_bufferCpu.value().bindNvSciBufObj(bufObj);
261 m_bufferCuda.value().bindNvSciBufObj(bufObj);
270 m_bufferCpu.value().fillSpecificAttributes(attrList);
274 m_bufferCuda.value().fillSpecificAttributes(attrList);
280 return m_bufferCpu.value().getCpuPtr(offset);
285 return m_bufferCuda.value().getCudaPtr(offset);
289 dw::core::Optional<BufferCPU> m_bufferCpu{};
290 dw::core::Optional<BufferCUDA> m_bufferCuda{};
296 #endif // DW_FRAMEWORK_BUFFER_HPP_ void bindNvSciBufObj(NvSciBufObj bufObj) override
virtual void bindNvSciBufObj(NvSciBufObj bufObj)
void fillNvSciBufAttrs(NvSciBufAttrList attrList) const
void fillSpecificAttributes(NvSciBufAttrList attrList) const
void * getCpuPtr(size_t offset)
BufferBase(BufferProperties properties)
BufferFlags enabledBackends
#define FRWK_CHECK_NVSCI_ERROR(e)
void bindNvSciBufObj(NvSciBufObj bufObj) override
#define FRWK_CHECK_CUDA_ERROR_NOTHROW(x)
void fillNvSciBufAttrs(NvSciBufAttrList attrList) const
void * getCpuPtr(size_t offset)
#define FRWK_CHECK_CUDA_ERROR(x)
void bindNvSciBufObj(NvSciBufObj bufObj) override
bool BufferFlagsBackendEnabled(BufferFlags flags, BufferBackendType type)
void BufferFlagsEnableBackend(BufferFlags &flags, BufferBackendType type)
const BufferProperties & getProperties() const
Buffer(BufferProperties properties)
BufferCUDA(BufferProperties properties)
core::DevicePtr< void > getCudaPtr(size_t offset)
void fillSpecificAttributes(NvSciBufAttrList attrList) const
core::DevicePtr< void > getCudaPtr(size_t offset)
BufferCPU(BufferProperties properties)