now Allocator accepts GpuMat* instead of 3 pointers
This commit is contained in:
parent
3b412b51ac
commit
342e007dc6
@ -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
|
||||||
|
@ -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&);
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user