| 215 | } |
| 216 | |
| 217 | void NvOFBufferCudaDevicePtr::DownloadData(void* pData, CUmemorytype mem_type) { |
| 218 | CUstream stream = m_NvOFAPI->GetCudaStream(getBufferUsage()); |
| 219 | CUDA_DRVAPI_CALL(cuCtxPushCurrent(m_cuContext)); |
| 220 | CUDA_MEMCPY2D cuCopy2d; |
| 221 | memset(&cuCopy2d, 0, sizeof(cuCopy2d)); |
| 222 | cuCopy2d.WidthInBytes = getWidth() * getElementSize(); |
| 223 | |
| 224 | mgb_assert( |
| 225 | CU_MEMORYTYPE_HOST == mem_type || CU_MEMORYTYPE_DEVICE == mem_type, |
| 226 | "do not imp mem type!!!"); |
| 227 | cuCopy2d.dstMemoryType = mem_type; |
| 228 | if (CU_MEMORYTYPE_HOST == mem_type) { |
| 229 | cuCopy2d.dstHost = pData; |
| 230 | } else if (CU_MEMORYTYPE_DEVICE == mem_type) { |
| 231 | cuCopy2d.dstDevice = (CUdeviceptr)pData; |
| 232 | } |
| 233 | cuCopy2d.dstPitch = cuCopy2d.WidthInBytes; |
| 234 | cuCopy2d.srcMemoryType = CU_MEMORYTYPE_DEVICE; |
| 235 | cuCopy2d.srcDevice = getCudaDevicePtr(); |
| 236 | cuCopy2d.srcPitch = m_strideInfo.strideInfo[0].strideXInBytes; |
| 237 | cuCopy2d.Height = getHeight(); |
| 238 | CUDA_DRVAPI_CALL(cuMemcpy2DAsync(&cuCopy2d, stream)); |
| 239 | if (getBufferFormat() == NV_OF_BUFFER_FORMAT_NV12) { |
| 240 | cuCopy2d.Height = (getHeight() + 1) / 2; |
| 241 | cuCopy2d.dstHost = ((uint8_t*)pData + (cuCopy2d.dstPitch * cuCopy2d.Height)); |
| 242 | cuCopy2d.srcY = m_strideInfo.strideInfo[0].strideYInBytes; |
| 243 | CUDA_DRVAPI_CALL(cuMemcpy2DAsync(&cuCopy2d, stream)); |
| 244 | } |
| 245 | CUDA_DRVAPI_CALL(cuStreamSynchronize(stream)); |
| 246 | CUDA_DRVAPI_CALL(cuCtxPopCurrent(&m_cuContext)); |
| 247 | } |
| 248 | |
| 249 | NvOFBufferCudaArray::NvOFBufferCudaArray( |
| 250 | std::shared_ptr<NvOFCudaAPI> ofAPI, const NV_OF_BUFFER_DESCRIPTOR& desc, |
no test coverage detected