// Copyright (c) 2012-2017 VideoStitch SAS // Copyright (c) 2018 stitchEm #pragma once #include "2dBuffer.hpp" #include "buffer.hpp" #include "surface.hpp" #include "hostBuffer.hpp" #include "stream.hpp" namespace VideoStitch { namespace GPU { // Device --> Device // * async template Status memcpyAsync(Buffer dst, Buffer src, size_t copySize, const Stream& stream); template inline Status memcpyAsync(Buffer dst, Buffer src, size_t copySize, const Stream& stream) { return memcpyAsync(dst, src.as_const(), copySize, stream); } // * blocking template Status memcpyBlocking(Buffer dst, Buffer src, size_t copySize); template inline Status memcpyBlocking(Buffer dst, Buffer src, size_t copySize) { return memcpyBlocking(dst, src.as_const(), copySize); } template inline Status memcpyBlocking(Buffer dst, Buffer src) { return memcpyBlocking(dst, src.as_const()); } template inline Status memcpyBlocking(Buffer dst, Buffer src) { if (dst.byteSize() < src.byteSize()) { return {Origin::GPU, ErrType::ImplementationError, "Copy destination is too small"}; } return memcpyBlocking(dst, src, src.byteSize()); } // Host --> Device // * async template Status memcpyAsync(Buffer dst, const T* src, size_t copySize, const Stream& stream); template inline Status memcpyAsync(Buffer dst, const T* src, const Stream& stream) { return memcpyAsync(dst, src, dst.byteSize(), stream); } template inline Status memcpyAsync(Buffer dst, HostBuffer src, const Stream& stream) { if (dst.byteSize() < src.byteSize()) { return {Origin::GPU, ErrType::ImplementationError, "Copy destination is too small"}; } return memcpyAsync(dst, src.hostPtr(), src.byteSize(), stream); } template inline Status memcpyAsync(Buffer dst, HostBuffer src, size_t copySize, const Stream& stream) { assert(copySize <= src.byteSize()); return memcpyAsync(dst, src.hostPtr(), copySize, stream); } template inline Status memcpyAsync(Buffer dst, HostBuffer src, size_t copySize, const Stream& stream) { return memcpyAsync(dst, src.as_const(), copySize, stream); } // * blocking template Status memcpyBlocking(Buffer dst, const T* src, size_t copySize); template inline Status memcpyBlocking(Buffer dst, const T* src) { return memcpyBlocking(dst, src, dst.byteSize()); } template inline Status memcpyBlocking(typename Buffer::PotentialBuffer dst, const T* src) { if (!dst.status()) { return dst.status(); } return memcpyBlocking(dst.value(), src, dst.byteSize()); } // Copy memory Device --> Host // * async template Status memcpyAsync(T* dst, Buffer src, size_t copySize, const Stream& stream); template inline Status memcpyAsync(T* dst, Buffer src, const Stream& stream) { return memcpyAsync(dst, src, src.byteSize(), stream); } template inline Status memcpyAsync(HostBuffer dst, Buffer src, size_t copySize, const Stream& stream) { assert(copySize <= dst.byteSize()); return memcpyAsync(dst.hostPtr(), src, copySize, stream); } template inline Status memcpyAsync(HostBuffer dst, Buffer src, const Stream& stream) { if (dst.byteSize() < src.byteSize()) { return {Origin::GPU, ErrType::ImplementationError, "Copy destination is too small"}; } return memcpyAsync(dst.hostPtr(), src, src.byteSize(), stream); } Status memcpyAsync(unsigned char* dst, Buffer2D src, const Stream& stream); inline Status memcpyAsync(HostBuffer dst, Buffer2D src, const Stream& stream) { if (dst.byteSize() < src.getWidth() * src.getHeight()) { return {Origin::GPU, ErrType::ImplementationError, "Copy destination is too small"}; } return memcpyAsync(dst.hostPtr(), src, stream); } // * blocking template Status memcpyBlocking(T* dst, Buffer src, size_t copySize); template inline Status memcpyBlocking(T* dst, Buffer src) { return memcpyBlocking(dst, src, src.byteSize()); } template inline Status memcpyBlocking(T* dst, Buffer src) { return memcpyBlocking(dst, src.as_const()); } template inline Status memcpyBlocking(HostBuffer dst, Buffer src) { if (dst.byteSize() < src.byteSize()) { return {Origin::GPU, ErrType::ImplementationError, "Copy destination is too small"}; } return memcpyBlocking(dst.hostPtr(), src); } Status memcpyBlocking(unsigned char* dst, Buffer2D src); inline Status memcpyBlocking(HostBuffer dst, Buffer2D src) { if (dst.byteSize() < src.getWidth() * src.getHeight()) { return {Origin::GPU, ErrType::ImplementationError, "Copy destination is too small"}; } return memcpyBlocking(dst.hostPtr(), src); } Status memcpyBlocking(Buffer2D dst, const unsigned char* src); inline Status memcpyBlocking(Buffer2D dst, HostBuffer src) { if (src.byteSize() < dst.getWidth() * dst.getHeight()) { return {Origin::GPU, ErrType::ImplementationError, "Copy destination is too small"}; } return memcpyBlocking(dst, src.hostPtr()); } // Memset // Note: memset to value implemented in render.hpp // Set settingSize Bytes of GPU memory to 0 template Status memsetToZeroAsync(Buffer devPtr, size_t settingSize, const Stream& stream); template inline Status memsetToZeroAsync(Buffer devPtr, const Stream& stream) { return memsetToZeroAsync(devPtr, devPtr.byteSize(), stream); } template Status memsetToZeroBlocking(Buffer devPtr, size_t settingSize); Status memsetToZeroAsync(Surface& dst, const Stream& stream); // Device buffer to texture memory template Status memcpyAsync(Surface& dst, Buffer src, const Stream& stream); Status memcpyBlocking(Surface& dst, Buffer src); // Texture memory to device buffer template Status memcpyAsync(Buffer dst, Surface& src, const Stream& stream); template Status memcpyBlocking(Buffer dst, Surface& src); // Texture memory to host buffer template Status memcpyAsync(T* dst, Surface& src, const Stream& stream); template Status memcpyBlocking(T* dst, Surface& src); // Host to texture memory Status memcpyAsync(Surface& dst, uint32_t* src, const Stream& stream); Status memcpyBlocking(Surface& dst, uint32_t* src); Status memcpy2DAsync(Buffer dst, Buffer src, size_t src_origin_width, size_t src_origin_height, size_t dst_origin_width, size_t dst_origin_height, size_t region_width, size_t region_height, size_t src_pitch, size_t dst_pitch, const Stream& stream); Status memcpyCubemapAsync(CubemapSurface& dst, Buffer srcXP, Buffer srcXN, Buffer srcYP, Buffer srcYN, Buffer srcZP, Buffer srcZN, size_t faceDim, const Stream& stream); } // namespace GPU } // namespace VideoStitch