changed InputArray's enumeration constant for UMat, since it may potentially conflict with existing OpenCL module. refactored Kernel's setArg API (now UMat is passed to a kernel as a structure, as Alexander A suggested). removed Kernel's cleanup callback from the external API; now each kernel keeps track of used matrices and they are dereferenced after it's complete.

This commit is contained in:
Vadim Pisarevsky
2013-10-25 16:46:03 +04:00
parent 6416c33020
commit 485d36d3c0
3 changed files with 171 additions and 114 deletions

View File

@@ -83,9 +83,9 @@ public:
CUDA_MEM = 8 << KIND_SHIFT,
GPU_MAT = 9 << KIND_SHIFT,
OCL_MAT =10 << KIND_SHIFT,
UMAT =OCL_MAT,
STD_VECTOR_UMAT =11 << KIND_SHIFT,
UEXPR =12 << KIND_SHIFT
UMAT =11 << KIND_SHIFT,
STD_VECTOR_UMAT =12 << KIND_SHIFT,
UEXPR =13 << KIND_SHIFT
};
_InputArray();

View File

@@ -264,13 +264,6 @@ public:
class CV_EXPORTS Kernel
{
public:
class CV_EXPORTS Callback
{
public:
virtual ~Callback() {}
virtual void operator()() = 0;
};
Kernel();
Kernel(const char* kname, const Program& prog);
Kernel(const char* kname, const ProgramSource& prog,
@@ -283,118 +276,115 @@ public:
bool create(const char* kname, const ProgramSource& prog,
const String& buildopts, String& errmsg);
int set(int i, const void* value, size_t sz);
int set(int i, const UMat& m);
int set(int i, const KernelArg& arg);
template<typename _Tp> int set(int i, const _Tp& value)
void set(int i, const void* value, size_t sz);
void set(int i, const UMat& m);
void set(int i, const KernelArg& arg);
template<typename _Tp> void set(int i, const _Tp& value)
{ return set(i, &value, sizeof(value)); }
template<typename _Tp1>
Kernel& args(_Tp1 a1)
template<typename _Tp0>
Kernel& args(const _Tp0& a0)
{
set(0, a1); return *this;
set(0, a0); return *this;
}
template<typename _Tp1, typename _Tp2>
Kernel& args(_Tp1 a1, _Tp2 a2)
template<typename _Tp0, typename _Tp1>
Kernel& args(const _Tp0& a0, const _Tp1& a1)
{
int i = set(0, a1); set(i, a2); return *this;
set(0, a0); set(1, a1); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3)
template<typename _Tp0, typename _Tp1, typename _Tp2>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2)
{
int i = set(0, a1); i = set(i, a2); set(i, a3); return *this;
set(0, a0); set(1, a1); set(2, a2); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4)
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); set(i, a4);
return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4, typename _Tp5>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5)
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
const _Tp3& a3, const _Tp4& a4)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); set(i, a5);
return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3,
template<typename _Tp0, typename _Tp1, typename _Tp2,
typename _Tp3, typename _Tp4, typename _Tp5>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
const _Tp3& a3, const _Tp4& a4, const _Tp5& a5)
{
set(0, a0); set(1, a1); set(2, a2);
set(3, a3); set(4, a4); set(5, a5); return *this;
}
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
typename _Tp4, typename _Tp5, typename _Tp6>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5, _Tp6 a6)
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
i = set(i, a5); set(i, a6); return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3);
set(4, a4); set(5, a5); set(6, a6); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
typename _Tp5, typename _Tp6, typename _Tp7>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5, _Tp6 a6, _Tp7 a7)
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
i = set(i, a5); i = set(i, a6); set(i, a7); return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3);
set(4, a4); set(5, a5); set(6, a6); set(7, a7); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5, _Tp6 a6, _Tp7 a7, _Tp8 a8)
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
const _Tp8& a8)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
i = set(i, a5); i = set(i, a6); i = set(i, a7); set(i, a8);
return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4);
set(5, a5); set(6, a6); set(7, a7); set(8, a8); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4, typename _Tp5,
typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5, _Tp6 a6, _Tp7 a7, _Tp8 a8, _Tp9 a9)
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
const _Tp8& a8, const _Tp9& a9)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
i = set(i, a5); i = set(i, a6); i = set(i, a7); i = set(i, a8);
set(i, a9); return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); set(5, a5);
set(6, a6); set(7, a7); set(8, a8); set(9, a9); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4, typename _Tp5,
typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9, typename _Tp10>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5, _Tp6 a6, _Tp7 a7,
_Tp8 a8, _Tp9 a9, _Tp10 a10)
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
typename _Tp8, typename _Tp9, typename _Tp10>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
const _Tp8& a8, const _Tp9& a9, const _Tp10& a10)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
i = set(i, a5); i = set(i, a6); i = set(i, a7); i = set(i, a8);
i = set(i, a9); set(i, a10); return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); set(5, a5);
set(6, a6); set(7, a7); set(8, a8); set(9, a9); set(10, a10); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4, typename _Tp5,
typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9,
typename _Tp10, typename _Tp11>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5, _Tp6 a6, _Tp7 a7,
_Tp8 a8, _Tp9 a9, _Tp10 a10, _Tp11 a11)
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11>
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
i = set(i, a5); i = set(i, a6); i = set(i, a7); i = set(i, a8);
i = set(i, a9); i = set(i, a10); set(i, a11); return *this;
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); set(5, a5);
set(6, a6); set(7, a7); set(8, a8); set(9, a9); set(10, a10); set(11, a11); return *this;
}
template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4, typename _Tp5,
typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9,
typename _Tp10, typename _Tp11, typename _Tp12>
Kernel& args(_Tp1 a1, _Tp2 a2, _Tp3 a3, _Tp4 a4, _Tp5 a5, _Tp6 a6, _Tp7 a7,
_Tp8 a8, _Tp9 a9, _Tp10 a10, _Tp11 a11, _Tp12 a12)
{
int i = set(0, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
i = set(i, a5); i = set(i, a6); i = set(i, a7); i = set(i, a8);
i = set(i, a9); i = set(i, a10); i = set(i, a11); set(i, a12);
return *this;
}
void run(int dims, size_t offset[],
size_t globalsize[], size_t localsize[], bool sync,
const Ptr<Callback>& cleanupCallback=Ptr<Callback>(),
const Queue& q=Queue());
void runTask(bool sync,
const Ptr<Callback>& cleanupCallback=Ptr<Callback>(),
const Queue& q=Queue());
void run(int dims, size_t offset[], size_t globalsize[],
size_t localsize[], bool sync, const Queue& q=Queue());
void runTask(bool sync, const Queue& q=Queue());
size_t workGroupSize() const;
bool compileWorkGroupSize(size_t wsz[]) const;