OpenVX calls updated to use single common OpenVX context per thread

pull/8204/head
Vitaly Tuzov 8 years ago committed by Alexander Alekhin
parent ec7f74f7b4
commit 9a4b5a4545
  1. 13
      3rdparty/openvx/hal/openvx_hal.cpp
  2. 6
      modules/core/include/opencv2/core/openvx/ovx_defs.hpp
  3. 4
      modules/core/src/convert.cpp
  4. 34
      modules/core/src/ovx.cpp
  5. 4
      modules/core/src/stat.cpp
  6. 2
      modules/features2d/src/fast.cpp
  7. 2
      modules/imgproc/src/accum.cpp
  8. 2
      modules/imgproc/src/canny.cpp
  9. 2
      modules/imgproc/src/deriv.cpp
  10. 2
      modules/imgproc/src/featureselect.cpp
  11. 4
      modules/imgproc/src/histogram.cpp
  12. 2
      modules/imgproc/src/imgwarp.cpp
  13. 2
      modules/imgproc/src/pyramids.cpp
  14. 6
      modules/imgproc/src/smooth.cpp
  15. 2
      modules/imgproc/src/thresh.cpp
  16. 2
      modules/video/src/lkpyramid.cpp

@ -52,8 +52,17 @@ struct Tick
inline ivx::Context& getOpenVXHALContext() inline ivx::Context& getOpenVXHALContext()
{ {
// not thread safe #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
static ivx::Context instance = ivx::Context::create(); //CXX11
static thread_local ivx::Context instance = ivx::Context::create();
#else //__cplusplus >= 201103L || _MSC_VER >= 1800
//CXX98
#ifdef WIN32
static __declspec(thread) ivx::Context instance = ivx::Context::create();
#else
static __thread ivx::Context instance = ivx::Context::create();
#endif
#endif
return instance; return instance;
} }

@ -20,6 +20,12 @@
#define IVX_USE_OPENCV #define IVX_USE_OPENCV
#include "ivx.hpp" #include "ivx.hpp"
namespace cv{
namespace ovx{
// Get common thread local OpenVX context
CV_EXPORTS_W ivx::Context& getOpenVXContext();
}}
#define CV_OVX_RUN(condition, func, ...) \ #define CV_OVX_RUN(condition, func, ...) \
if (cv::useOpenVX() && (condition) && func) \ if (cv::useOpenVX() && (condition) && func) \
{ \ { \

@ -4673,7 +4673,7 @@ static bool _openvx_cvt(const T* src, size_t sstep,
try try
{ {
Context context = Context::create(); Context context = ovx::getOpenVXContext();
// Other conversions are marked as "experimental" // Other conversions are marked as "experimental"
if(context.vendorID() == VX_ID_KHRONOS && if(context.vendorID() == VX_ID_KHRONOS &&
@ -5406,7 +5406,7 @@ static bool openvx_LUT(Mat src, Mat dst, Mat _lut)
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
ivx::Image ivx::Image
ia = ivx::Image::createFromHandle(ctx, VX_DF_IMAGE_U8, ia = ivx::Image::createFromHandle(ctx, VX_DF_IMAGE_U8,

@ -14,6 +14,38 @@
namespace cv namespace cv
{ {
namespace ovx
{
#ifdef HAVE_OPENVX
// Simple TLSData<ivx::Context> doesn't work, because default constructor doesn't create any OpenVX context.
struct OpenVXTLSData
{
OpenVXTLSData() : ctx(ivx::Context::create()) {}
ivx::Context ctx;
};
static TLSData<OpenVXTLSData>& getOpenVXTLSData()
{
CV_SINGLETON_LAZY_INIT_REF(TLSData<OpenVXTLSData>, new TLSData<OpenVXTLSData>())
}
struct OpenVXCleanupFunctor
{
~OpenVXCleanupFunctor() { getOpenVXTLSData().cleanup(); }
};
static OpenVXCleanupFunctor g_openvx_cleanup_functor;
ivx::Context& getOpenVXContext()
{
return getOpenVXTLSData().get()->ctx;
}
#endif
} // namespace
bool haveOpenVX() bool haveOpenVX()
{ {
#ifdef HAVE_OPENVX #ifdef HAVE_OPENVX
@ -22,7 +54,7 @@ bool haveOpenVX()
{ {
try try
{ {
ivx::Context context = ivx::Context::create(); ivx::Context context = ovx::getOpenVXContext();
vx_uint16 vComp = ivx::compiledWithVersion(); vx_uint16 vComp = ivx::compiledWithVersion();
vx_uint16 vCurr = context.version(); vx_uint16 vCurr = context.version();
g_haveOpenVX = g_haveOpenVX =

@ -1665,7 +1665,7 @@ namespace cv
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
#ifndef VX_VERSION_1_1 #ifndef VX_VERSION_1_1
if (ctx.vendorID() == VX_ID_KHRONOS) if (ctx.vendorID() == VX_ID_KHRONOS)
return false; // Do not use OpenVX meanStdDev estimation for sample 1.0.1 implementation due to lack of accuracy return false; // Do not use OpenVX meanStdDev estimation for sample 1.0.1 implementation due to lack of accuracy
@ -2312,7 +2312,7 @@ static bool openvx_minMaxIdx(Mat &src, double* minVal, double* maxVal, int* minI
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
ivx::Image ivx::Image
ia = ivx::Image::createFromHandle(ctx, stype == CV_8UC1 ? VX_DF_IMAGE_U8 : VX_DF_IMAGE_S16, ia = ivx::Image::createFromHandle(ctx, stype == CV_8UC1 ? VX_DF_IMAGE_U8 : VX_DF_IMAGE_S16,
ivx::Image::createAddressing(cols, rows, stype == CV_8UC1 ? 1 : 2, (vx_int32)(src.step[0])), src.ptr()); ivx::Image::createAddressing(cols, rows, stype == CV_8UC1 ? 1 : 2, (vx_int32)(src.step[0])), src.ptr());

@ -354,7 +354,7 @@ static bool openvx_FAST(InputArray _img, std::vector<KeyPoint>& keypoints,
try try
{ {
Context context = Context::create(); Context context = ovx::getOpenVXContext();
Image img = Image::createFromHandle(context, Image::matTypeToFormat(imgMat.type()), Image img = Image::createFromHandle(context, Image::matTypeToFormat(imgMat.type()),
Image::createAddressing(imgMat), (void*)imgMat.data); Image::createAddressing(imgMat), (void*)imgMat.data);
ivx::Scalar threshold = ivx::Scalar::create<VX_TYPE_FLOAT32>(context, _threshold); ivx::Scalar threshold = ivx::Scalar::create<VX_TYPE_FLOAT32>(context, _threshold);

@ -1958,7 +1958,7 @@ static bool openvx_accumulate(InputArray _src, InputOutputArray _dst, InputArray
try try
{ {
ivx::Context context = ivx::Context::create(); ivx::Context context = ovx::getOpenVXContext();
ivx::Image srcImage = ivx::Image::createFromHandle(context, ivx::Image::matTypeToFormat(srcMat.type()), ivx::Image srcImage = ivx::Image::createFromHandle(context, ivx::Image::matTypeToFormat(srcMat.type()),
ivx::Image::createAddressing(srcMat), srcMat.data); ivx::Image::createAddressing(srcMat), srcMat.data);
ivx::Image dstImage = ivx::Image::createFromHandle(context, ivx::Image::matTypeToFormat(dstMat.type()), ivx::Image dstImage = ivx::Image::createFromHandle(context, ivx::Image::matTypeToFormat(dstMat.type()),

@ -782,7 +782,7 @@ static bool openvx_canny(const Mat& src, Mat& dst, int loVal, int hiVal, int kSi
{ {
using namespace ivx; using namespace ivx;
Context context = Context::create(); Context context = ovx::getOpenVXContext();
try try
{ {
Image _src = Image::createFromHandle( Image _src = Image::createFromHandle(

@ -236,7 +236,7 @@ namespace cv
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
if ((vx_size)ksize > ctx.convolutionMaxDimension()) if ((vx_size)ksize > ctx.convolutionMaxDimension())
return false; return false;

@ -286,7 +286,7 @@ static bool openvx_harris(Mat image, OutputArray _corners,
try try
{ {
Context context = Context::create(); Context context = ovx::getOpenVXContext();
Image ovxImage = Image::createFromHandle(context, Image::matTypeToFormat(image.type()), Image ovxImage = Image::createFromHandle(context, Image::matTypeToFormat(image.type()),
Image::createAddressing(image), image.data); Image::createAddressing(image), image.data);

@ -1282,7 +1282,7 @@ namespace cv
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
#if VX_VERSION <= VX_VERSION_1_0 #if VX_VERSION <= VX_VERSION_1_0
if (ctx.vendorID() == VX_ID_KHRONOS && (range % histSize)) if (ctx.vendorID() == VX_ID_KHRONOS && (range % histSize))
return false; return false;
@ -3773,7 +3773,7 @@ static bool openvx_equalize_hist(Mat srcMat, Mat dstMat)
try try
{ {
Context context = Context::create(); Context context = ovx::getOpenVXContext();
Image srcImage = Image::createFromHandle(context, Image::matTypeToFormat(srcMat.type()), Image srcImage = Image::createFromHandle(context, Image::matTypeToFormat(srcMat.type()),
Image::createAddressing(srcMat), srcMat.data); Image::createAddressing(srcMat), srcMat.data);
Image dstImage = Image::createFromHandle(context, Image::matTypeToFormat(dstMat.type()), Image dstImage = Image::createFromHandle(context, Image::matTypeToFormat(dstMat.type()),

@ -4795,7 +4795,7 @@ static bool openvx_remap(Mat src, Mat dst, Mat map1, Mat map2, int interpolation
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
Mat a; Mat a;
if (dst.data != src.data) if (dst.data != src.data)

@ -1290,7 +1290,7 @@ static bool openvx_pyrDown( InputArray _src, OutputArray _dst, const Size& _dsz,
try try
{ {
Context context = Context::create(); Context context = ovx::getOpenVXContext();
if(context.vendorID() == VX_ID_KHRONOS) if(context.vendorID() == VX_ID_KHRONOS)
{ {
// This implementation performs floor-like rounding // This implementation performs floor-like rounding

@ -1677,7 +1677,7 @@ namespace cv
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
if ((vx_size)(ksize.width) > ctx.convolutionMaxDimension() || (vx_size)(ksize.height) > ctx.convolutionMaxDimension()) if ((vx_size)(ksize.width) > ctx.convolutionMaxDimension() || (vx_size)(ksize.height) > ctx.convolutionMaxDimension())
return false; return false;
@ -2239,7 +2239,7 @@ static bool openvx_gaussianBlur(InputArray _src, OutputArray _dst, Size ksize,
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
if ((vx_size)(ksize.width) > ctx.convolutionMaxDimension() || (vx_size)(ksize.height) > ctx.convolutionMaxDimension()) if ((vx_size)(ksize.width) > ctx.convolutionMaxDimension() || (vx_size)(ksize.height) > ctx.convolutionMaxDimension())
return false; return false;
@ -3361,7 +3361,7 @@ namespace cv
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
#ifdef VX_VERSION_1_1 #ifdef VX_VERSION_1_1
if ((vx_size)ksize > ctx.nonlinearMaxDimension()) if ((vx_size)ksize > ctx.nonlinearMaxDimension())
return false; return false;

@ -1301,7 +1301,7 @@ static bool openvx_threshold(Mat src, Mat dst, int thresh, int maxval, int type)
try try
{ {
ivx::Context ctx = ivx::Context::create(); ivx::Context ctx = ovx::getOpenVXContext();
ivx::Threshold thh = ivx::Threshold::createBinary(ctx, VX_TYPE_UINT8, thresh); ivx::Threshold thh = ivx::Threshold::createBinary(ctx, VX_TYPE_UINT8, thresh);
thh.setValueTrue(trueVal); thh.setValueTrue(trueVal);

@ -1099,7 +1099,7 @@ namespace
try try
{ {
Context context = Context::create(); Context context = ovx::getOpenVXContext();
if(context.vendorID() == VX_ID_KHRONOS) if(context.vendorID() == VX_ID_KHRONOS)
{ {

Loading…
Cancel
Save