diff --git a/modules/core/include/opencv2/core/cuda.hpp b/modules/core/include/opencv2/core/cuda.hpp index c538392cbd..4c5c522e24 100644 --- a/modules/core/include/opencv2/core/cuda.hpp +++ b/modules/core/include/opencv2/core/cuda.hpp @@ -327,6 +327,34 @@ The function does not reallocate memory if the matrix has proper attributes alre */ CV_EXPORTS void ensureSizeIsEnough(int rows, int cols, int type, OutputArray arr); +/** @brief BufferPool for use with CUDA streams + + * BufferPool utilizes cuda::Stream's allocator to create new buffers. It is + * particularly useful when BufferPoolUsage is set to true, or a custom + * allocator is specified for the cuda::Stream, and you want to implement your + * own stream based functions utilizing the same underlying GPU memory + * management. + */ +class CV_EXPORTS BufferPool +{ +public: + + //! Gets the BufferPool for the given stream. + explicit BufferPool(Stream& stream); + + //! Allocates a new GpuMat of given size and type. + GpuMat getBuffer(int rows, int cols, int type); + + //! Allocates a new GpuMat of given size and type. + GpuMat getBuffer(Size size, int type) { return getBuffer(size.height, size.width, type); } + + //! Returns the allocator associated with the stream. + Ptr getAllocator() const { return allocator_; } + +private: + Ptr allocator_; +}; + //! BufferPool management (must be called before Stream creation) CV_EXPORTS void setBufferPoolUsage(bool on); CV_EXPORTS void setBufferPoolConfig(int deviceId, size_t stackSize, int stackCount); diff --git a/modules/core/include/opencv2/core/private.cuda.hpp b/modules/core/include/opencv2/core/private.cuda.hpp index 01a4ab3bf9..1214d70304 100644 --- a/modules/core/include/opencv2/core/private.cuda.hpp +++ b/modules/core/include/opencv2/core/private.cuda.hpp @@ -102,20 +102,6 @@ static inline void throw_no_cuda() { CV_Error(cv::Error::StsNotImplemented, "The namespace cv { namespace cuda { - class CV_EXPORTS BufferPool - { - public: - explicit BufferPool(Stream& stream); - - GpuMat getBuffer(int rows, int cols, int type); - GpuMat getBuffer(Size size, int type) { return getBuffer(size.height, size.width, type); } - - GpuMat::Allocator* getAllocator() const { return allocator_; } - - private: - GpuMat::Allocator* allocator_; - }; - static inline void checkNppError(int code, const char* file, const int line, const char* func) { if (code < 0) diff --git a/modules/core/src/cuda_stream.cpp b/modules/core/src/cuda_stream.cpp index 1ea8df37b9..24ecbd4ab0 100644 --- a/modules/core/src/cuda_stream.cpp +++ b/modules/core/src/cuda_stream.cpp @@ -668,20 +668,33 @@ void cv::cuda::setBufferPoolConfig(int deviceId, size_t stackSize, int stackCoun #endif } -#ifdef HAVE_CUDA - -cv::cuda::BufferPool::BufferPool(Stream& stream) : allocator_(stream.impl_->stackAllocator.get()) +#ifndef HAVE_CUDA +cv::cuda::BufferPool::BufferPool(Stream& stream) +{ + (void) stream; + throw_no_cuda(); +} +#else +cv::cuda::BufferPool::BufferPool(Stream& stream) : allocator_(stream.impl_->stackAllocator) { } +#endif GpuMat cv::cuda::BufferPool::getBuffer(int rows, int cols, int type) { +#ifndef HAVE_CUDA + (void) rows; + (void) cols; + (void) type; + throw_no_cuda(); + return GpuMat(); +#else GpuMat buf(allocator_); buf.create(rows, cols, type); return buf; +#endif } -#endif //////////////////////////////////////////////////////////////// // Event