@@ -423,7 +423,7 @@ struct OpenCLBinaryCacheConfigurator
423
423
{
424
424
CV_LOG_WARNING (NULL , " - " << remove_entries[i]);
425
425
}
426
- CV_LOG_WARNING (NULL ," Note: You can disable this behavior via this option: CV_OPENCL_CACHE_CLEANUP =0" );
426
+ CV_LOG_WARNING (NULL , " Note: You can disable this behavior via this option: OPENCV_OPENCL_CACHE_CLEANUP =0" );
427
427
428
428
for (size_t i = 0 ; i < remove_entries.size (); i++)
429
429
{
@@ -781,18 +781,34 @@ class BinaryProgramFile
781
781
#endif // OPENCV_HAVE_FILESYSTEM_SUPPORT
782
782
783
783
784
+ // true if we have initialized OpenCL subsystem with available platforms
785
+ static bool g_isOpenCVActivated = false ;
786
+
784
787
bool haveOpenCL ()
785
788
{
789
+ CV_TRACE_FUNCTION ();
786
790
#ifdef HAVE_OPENCL
787
791
static bool g_isOpenCLInitialized = false ;
788
792
static bool g_isOpenCLAvailable = false ;
789
793
790
794
if (!g_isOpenCLInitialized)
791
795
{
796
+ CV_TRACE_REGION (" Init_OpenCL_Runtime" );
797
+ const char * envPath = getenv (" OPENCV_OPENCL_RUNTIME" );
798
+ if (envPath)
799
+ {
800
+ if (cv::String (envPath) == " disabled" )
801
+ {
802
+ g_isOpenCLAvailable = false ;
803
+ g_isOpenCLInitialized = true ;
804
+ }
805
+ }
806
+ CV_LOG_INFO (NULL , " Initialize OpenCL runtime..." );
792
807
try
793
808
{
794
809
cl_uint n = 0 ;
795
810
g_isOpenCLAvailable = ::clGetPlatformIDs (0 , NULL , &n) == CL_SUCCESS;
811
+ g_isOpenCVActivated = n > 0 ;
796
812
}
797
813
catch (...)
798
814
{
@@ -813,7 +829,7 @@ bool useOpenCL()
813
829
{
814
830
try
815
831
{
816
- data->useOpenCL = (int )haveOpenCL () && Device::getDefault ().ptr () && Device::getDefault ().available ();
832
+ data->useOpenCL = (int )( haveOpenCL () && Device::getDefault ().ptr () && Device::getDefault ().available ()) ? 1 : 0 ;
817
833
}
818
834
catch (...)
819
835
{
@@ -823,12 +839,27 @@ bool useOpenCL()
823
839
return data->useOpenCL > 0 ;
824
840
}
825
841
842
+ #ifdef HAVE_OPENCL
843
+ bool isOpenCLActivated ()
844
+ {
845
+ if (!g_isOpenCVActivated)
846
+ return false ; // prevent unnecessary OpenCL activation via useOpenCL()->haveOpenCL() calls
847
+ return useOpenCL ();
848
+ }
849
+ #endif
850
+
826
851
void setUseOpenCL (bool flag)
827
852
{
828
- if ( haveOpenCL () )
853
+ CV_TRACE_FUNCTION ();
854
+
855
+ CoreTLSData* data = getCoreTlsData ().get ();
856
+ if (!flag)
829
857
{
830
- CoreTLSData* data = getCoreTlsData ().get ();
831
- data->useOpenCL = (flag && Device::getDefault ().ptr () != NULL ) ? 1 : 0 ;
858
+ data->useOpenCL = 0 ;
859
+ }
860
+ else if ( haveOpenCL () )
861
+ {
862
+ data->useOpenCL = (Device::getDefault ().ptr () != NULL ) ? 1 : 0 ;
832
863
}
833
864
}
834
865
@@ -5289,9 +5320,15 @@ class OpenCLAllocator : public MatAllocator
5289
5320
}
5290
5321
};
5291
5322
5323
+ static OpenCLAllocator* getOpenCLAllocator_ () // call once guarantee
5324
+ {
5325
+ static OpenCLAllocator* g_allocator = new OpenCLAllocator (); // avoid destrutor call (using of this object is too wide)
5326
+ g_isOpenCVActivated = true ;
5327
+ return g_allocator;
5328
+ }
5292
5329
MatAllocator* getOpenCLAllocator ()
5293
5330
{
5294
- CV_SINGLETON_LAZY_INIT (MatAllocator, new OpenCLAllocator ())
5331
+ CV_SINGLETON_LAZY_INIT (MatAllocator, getOpenCLAllocator_ ())
5295
5332
}
5296
5333
5297
5334
}} // namespace cv::ocl
0 commit comments