Move OpticalFlowPyrLK from ocl module to video module
This commit is contained in:
@@ -1705,6 +1705,9 @@ String Device::OpenCL_C_Version() const
|
||||
String Device::OpenCLVersion() const
|
||||
{ return p ? p->getStrProp(CL_DEVICE_EXTENSIONS) : String(); }
|
||||
|
||||
String Device::deviceVersion() const
|
||||
{ return p ? p->getStrProp(CL_DEVICE_VERSION) : String(); }
|
||||
|
||||
String Device::driverVersion() const
|
||||
{ return p ? p->getStrProp(CL_DRIVER_VERSION) : String(); }
|
||||
|
||||
@@ -2689,6 +2692,12 @@ int Kernel::set(int i, const void* value, size_t sz)
|
||||
return i+1;
|
||||
}
|
||||
|
||||
int Kernel::set(int i, const Image2D& image2D)
|
||||
{
|
||||
cl_mem h = (cl_mem)image2D.ptr();
|
||||
return set(i, &h, sizeof(h));
|
||||
}
|
||||
|
||||
int Kernel::set(int i, const UMat& m)
|
||||
{
|
||||
return set(i, KernelArg(KernelArg::READ_WRITE, (UMat*)&m, 0, 0));
|
||||
@@ -3785,4 +3794,149 @@ const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf)
|
||||
return buf;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// deviceVersion has format
|
||||
// OpenCL<space><major_version.minor_version><space><vendor-specific information>
|
||||
// by specification
|
||||
// http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html
|
||||
// http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clGetDeviceInfo.html
|
||||
static void parseDeviceVersion(const String &deviceVersion, int &major, int &minor)
|
||||
{
|
||||
major = minor = 0;
|
||||
if (10 >= deviceVersion.length())
|
||||
return;
|
||||
const char *pstr = deviceVersion.c_str();
|
||||
if (0 != strncmp(pstr, "OpenCL ", 7))
|
||||
return;
|
||||
size_t ppos = deviceVersion.find('.', 7);
|
||||
if (String::npos == ppos)
|
||||
return;
|
||||
String temp = deviceVersion.substr(7, ppos - 7);
|
||||
major = atoi(temp.c_str());
|
||||
temp = deviceVersion.substr(ppos + 1);
|
||||
minor = atoi(temp.c_str());
|
||||
}
|
||||
|
||||
struct Image2D::Impl
|
||||
{
|
||||
Impl(const UMat &src)
|
||||
{
|
||||
init(src);
|
||||
}
|
||||
~Impl()
|
||||
{
|
||||
if (handle)
|
||||
clReleaseMemObject(handle);
|
||||
}
|
||||
void init(const UMat &src)
|
||||
{
|
||||
cl_image_format format;
|
||||
int err;
|
||||
int depth = src.depth();
|
||||
int channels = src.channels();
|
||||
|
||||
switch(depth)
|
||||
{
|
||||
case CV_8U:
|
||||
format.image_channel_data_type = CL_UNSIGNED_INT8;
|
||||
break;
|
||||
case CV_32S:
|
||||
format.image_channel_data_type = CL_UNSIGNED_INT32;
|
||||
break;
|
||||
case CV_32F:
|
||||
format.image_channel_data_type = CL_FLOAT;
|
||||
break;
|
||||
default:
|
||||
CV_Error(-1, "Image forma is not supported");
|
||||
break;
|
||||
}
|
||||
switch(channels)
|
||||
{
|
||||
case 1:
|
||||
format.image_channel_order = CL_R;
|
||||
break;
|
||||
case 3:
|
||||
format.image_channel_order = CL_RGB;
|
||||
break;
|
||||
case 4:
|
||||
format.image_channel_order = CL_RGBA;
|
||||
break;
|
||||
default:
|
||||
CV_Error(-1, "Image format is not supported");
|
||||
break;
|
||||
}
|
||||
#ifdef CL_VERSION_1_2
|
||||
//this enables backwards portability to
|
||||
//run on OpenCL 1.1 platform if library binaries are compiled with OpenCL 1.2 support
|
||||
int minor, major;
|
||||
parseDeviceVersion(Device::getDefault().deviceVersion(), major, minor);
|
||||
if ((1 < major) || ((1 == major) && (2 <= minor)))
|
||||
{
|
||||
cl_image_desc desc;
|
||||
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
|
||||
desc.image_width = src.cols;
|
||||
desc.image_height = src.rows;
|
||||
desc.image_depth = 0;
|
||||
desc.image_array_size = 1;
|
||||
desc.image_row_pitch = 0;
|
||||
desc.image_slice_pitch = 0;
|
||||
desc.buffer = NULL;
|
||||
desc.num_mip_levels = 0;
|
||||
desc.num_samples = 0;
|
||||
handle = clCreateImage((cl_context)Context2::getDefault().ptr(), CL_MEM_READ_WRITE, &format, &desc, NULL, &err);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
handle = clCreateImage2D((cl_context)Context2::getDefault().ptr(), CL_MEM_READ_WRITE, &format, src.cols, src.rows, 0, NULL, &err);
|
||||
}
|
||||
size_t origin[] = { 0, 0, 0 };
|
||||
size_t region[] = { src.cols, src.rows, 1 };
|
||||
|
||||
cl_mem devData;
|
||||
if (!src.isContinuous())
|
||||
{
|
||||
devData = clCreateBuffer((cl_context)Context2::getDefault().ptr(), CL_MEM_READ_ONLY, src.cols * src.rows * src.elemSize(), NULL, NULL);
|
||||
const size_t roi[3] = {src.cols * src.elemSize(), src.rows, 1};
|
||||
clEnqueueCopyBufferRect((cl_command_queue)Queue::getDefault().ptr(), (cl_mem)src.handle(ACCESS_READ), devData, origin, origin,
|
||||
roi, src.step, 0, src.cols * src.elemSize(), 0, 0, NULL, NULL);
|
||||
clFlush((cl_command_queue)Queue::getDefault().ptr());
|
||||
}
|
||||
else
|
||||
{
|
||||
devData = (cl_mem)src.handle(ACCESS_READ);
|
||||
}
|
||||
|
||||
clEnqueueCopyBufferToImage((cl_command_queue)Queue::getDefault().ptr(), devData, handle, 0, origin, region, 0, NULL, 0);
|
||||
if (!src.isContinuous())
|
||||
{
|
||||
clFlush((cl_command_queue)Queue::getDefault().ptr());
|
||||
clReleaseMemObject(devData);
|
||||
}
|
||||
}
|
||||
|
||||
IMPLEMENT_REFCOUNTABLE();
|
||||
|
||||
cl_mem handle;
|
||||
};
|
||||
|
||||
Image2D::Image2D()
|
||||
{
|
||||
p = NULL;
|
||||
}
|
||||
Image2D::Image2D(const UMat &src)
|
||||
{
|
||||
p = new Impl(src);
|
||||
}
|
||||
Image2D::~Image2D()
|
||||
{
|
||||
if (p)
|
||||
p->release();
|
||||
}
|
||||
|
||||
void* Image2D::ptr() const
|
||||
{
|
||||
return p ? p->handle : 0;
|
||||
}
|
||||
|
||||
}}
|
||||
|
Reference in New Issue
Block a user