now Allocator accepts GpuMat* instead of 3 pointers

This commit is contained in:
Vladislav Vinogradov 2013-10-08 16:17:41 +04:00
parent 3b412b51ac
commit 342e007dc6
4 changed files with 28 additions and 29 deletions

View File

@ -66,8 +66,9 @@ public:
public: public:
virtual ~Allocator() {} virtual ~Allocator() {}
virtual bool allocate(uchar** devPtr, size_t* step, int** refcount, int rows, int cols, size_t elemSize) = 0; // allocator must fill data, step and refcount fields
virtual void free(uchar* devPtr, int* refcount) = 0; virtual bool allocate(GpuMat* mat, int rows, int cols, size_t elemSize) = 0;
virtual void free(GpuMat* mat) = 0;
}; };
//! default allocator //! default allocator

View File

@ -98,8 +98,8 @@ namespace cv { namespace cuda
explicit StackAllocator(cudaStream_t stream); explicit StackAllocator(cudaStream_t stream);
~StackAllocator(); ~StackAllocator();
bool allocate(uchar** devPtr, size_t* step, int** refcount, int rows, int cols, size_t elemSize); bool allocate(GpuMat* mat, int rows, int cols, size_t elemSize);
void free(uchar* devPtr, int* refcount); void free(GpuMat* mat);
private: private:
StackAllocator(const StackAllocator&); StackAllocator(const StackAllocator&);

View File

@ -60,32 +60,32 @@ namespace
class DefaultAllocator : public GpuMat::Allocator class DefaultAllocator : public GpuMat::Allocator
{ {
public: public:
bool allocate(uchar** devPtr, size_t* step, int** refcount, int rows, int cols, size_t elemSize); bool allocate(GpuMat* mat, int rows, int cols, size_t elemSize);
void free(uchar* devPtr, int* refcount); void free(GpuMat* mat);
}; };
bool DefaultAllocator::allocate(uchar** devPtr, size_t* step, int** refcount, int rows, int cols, size_t elemSize) bool DefaultAllocator::allocate(GpuMat* mat, int rows, int cols, size_t elemSize)
{ {
if (rows > 1 && cols > 1) if (rows > 1 && cols > 1)
{ {
CV_CUDEV_SAFE_CALL( cudaMallocPitch(devPtr, step, elemSize * cols, rows) ); CV_CUDEV_SAFE_CALL( cudaMallocPitch(&mat->data, &mat->step, elemSize * cols, rows) );
} }
else else
{ {
// Single row or single column must be continuous // Single row or single column must be continuous
CV_CUDEV_SAFE_CALL( cudaMalloc(devPtr, elemSize * cols * rows) ); CV_CUDEV_SAFE_CALL( cudaMalloc(&mat->data, elemSize * cols * rows) );
*step = elemSize * cols; mat->step = elemSize * cols;
} }
*refcount = static_cast<int*>(fastMalloc(sizeof(int))); mat->refcount = (int*) fastMalloc(sizeof(int));
return true; return true;
} }
void DefaultAllocator::free(uchar* devPtr, int* refcount) void DefaultAllocator::free(GpuMat* mat)
{ {
cudaFree(devPtr); cudaFree(mat->datastart);
fastFree(refcount); fastFree(mat->refcount);
} }
DefaultAllocator cudaDefaultAllocator; DefaultAllocator cudaDefaultAllocator;
@ -124,16 +124,15 @@ void cv::cuda::GpuMat::create(int _rows, int _cols, int _type)
rows = _rows; rows = _rows;
cols = _cols; cols = _cols;
uchar* devPtr;
const size_t esz = elemSize(); const size_t esz = elemSize();
bool allocSuccess = allocator->allocate(&devPtr, &step, &refcount, rows, cols, esz); bool allocSuccess = allocator->allocate(this, rows, cols, esz);
if (!allocSuccess) if (!allocSuccess)
{ {
// custom allocator fails, try default allocator // custom allocator fails, try default allocator
allocator = defaultAllocator(); allocator = defaultAllocator();
allocSuccess = allocator->allocate(&devPtr, &step, &refcount, rows, cols, esz); allocSuccess = allocator->allocate(this, rows, cols, esz);
CV_Assert( allocSuccess ); CV_Assert( allocSuccess );
} }
@ -143,11 +142,11 @@ void cv::cuda::GpuMat::create(int _rows, int _cols, int _type)
int64 _nettosize = static_cast<int64>(step) * rows; int64 _nettosize = static_cast<int64>(step) * rows;
size_t nettosize = static_cast<size_t>(_nettosize); size_t nettosize = static_cast<size_t>(_nettosize);
datastart = data = static_cast<uchar*>(devPtr); datastart = data;
dataend = data + nettosize; dataend = data + nettosize;
refcount = static_cast<int*>(fastMalloc(sizeof(*refcount))); if (refcount)
*refcount = 1; *refcount = 1;
} }
} }
@ -159,7 +158,7 @@ void cv::cuda::GpuMat::release()
CV_DbgAssert( allocator != 0 ); CV_DbgAssert( allocator != 0 );
if (refcount && CV_XADD(refcount, -1) == 1) if (refcount && CV_XADD(refcount, -1) == 1)
allocator->free(datastart, refcount); allocator->free(this);
data = datastart = dataend = 0; data = datastart = dataend = 0;
step = rows = cols = 0; step = rows = cols = 0;

View File

@ -337,7 +337,7 @@ namespace
} }
} }
bool cv::cuda::StackAllocator::allocate(uchar** devPtr, size_t* step, int** refcount, int rows, int cols, size_t elemSize) bool cv::cuda::StackAllocator::allocate(GpuMat* mat, int rows, int cols, size_t elemSize)
{ {
if (memStack_ == 0) if (memStack_ == 0)
return false; return false;
@ -361,21 +361,20 @@ bool cv::cuda::StackAllocator::allocate(uchar** devPtr, size_t* step, int** refc
if (ptr == 0) if (ptr == 0)
return false; return false;
*devPtr = ptr; mat->data = ptr;
*step = pitch; mat->step = pitch;
mat->refcount = (int*) fastMalloc(sizeof(int));
*refcount = static_cast<int*>(fastMalloc(sizeof(int)));
return true; return true;
} }
void cv::cuda::StackAllocator::free(uchar* devPtr, int* refcount) void cv::cuda::StackAllocator::free(GpuMat* mat)
{ {
if (memStack_ == 0) if (memStack_ == 0)
return; return;
memStack_->returnMemory(devPtr); memStack_->returnMemory(mat->datastart);
fastFree(refcount); fastFree(mat->refcount);
} }
void cv::cuda::setBufferPoolUsage(bool on) void cv::cuda::setBufferPoolUsage(bool on)