@@ -2252,6 +2252,8 @@ struct Context::Impl
2252
2252
return ;
2253
2253
}
2254
2254
#endif
2255
+
2256
+ friend class Program ;
2255
2257
};
2256
2258
2257
2259
@@ -3463,19 +3465,20 @@ struct Program::Impl
3463
3465
{
3464
3466
IMPLEMENT_REFCOUNTABLE ();
3465
3467
3466
- Impl (const ProgramSource& _src ,
3468
+ Impl (const ProgramSource& src ,
3467
3469
const String& _buildflags, String& errmsg) :
3468
- src (_src ),
3469
- buildflags (_buildflags ),
3470
- handle ( NULL )
3470
+ refcount ( 1 ),
3471
+ handle ( NULL ),
3472
+ buildflags (_buildflags )
3471
3473
{
3472
- refcount = 1 ;
3474
+ const ProgramSource::Impl* src_ = src.getImpl ();
3475
+ CV_Assert (src_);
3476
+ sourceModule_ = src_->module_ ;
3477
+ sourceName_ = src_->name_ ;
3473
3478
const Context ctx = Context::getDefault ();
3474
3479
Device device = ctx.device (0 );
3475
3480
if (ctx.ptr () == NULL || device.ptr () == NULL )
3476
3481
return ;
3477
- const ProgramSource::Impl* src_ = src.getImpl ();
3478
- CV_Assert (src_);
3479
3482
buildflags = joinBuildOptions (buildflags, src_->buildOptions_ );
3480
3483
if (src.getImpl ()->kind_ == ProgramSource::Impl::PROGRAM_SOURCE_CODE)
3481
3484
{
@@ -3484,13 +3487,12 @@ struct Program::Impl
3484
3487
else if (device.isIntel ())
3485
3488
buildflags = joinBuildOptions (buildflags, " -D INTEL_DEVICE" );
3486
3489
}
3487
- compile (ctx, errmsg);
3490
+ compile (ctx, src_, errmsg);
3488
3491
}
3489
3492
3490
- bool compile (const Context& ctx, String& errmsg)
3493
+ bool compile (const Context& ctx, const ProgramSource::Impl* src_, String& errmsg)
3491
3494
{
3492
3495
CV_Assert (ctx.getImpl ());
3493
- const ProgramSource::Impl* src_ = src.getImpl ();
3494
3496
CV_Assert (src_);
3495
3497
3496
3498
// We don't cache OpenCL binaries
@@ -3499,13 +3501,12 @@ struct Program::Impl
3499
3501
bool isLoaded = createFromBinary (ctx, src_->sourceAddr_ , src_->sourceSize_ , errmsg);
3500
3502
return isLoaded;
3501
3503
}
3502
- return compileWithCache (ctx, errmsg);
3504
+ return compileWithCache (ctx, src_, errmsg);
3503
3505
}
3504
3506
3505
- bool compileWithCache (const Context& ctx, String& errmsg)
3507
+ bool compileWithCache (const Context& ctx, const ProgramSource::Impl* src_, String& errmsg)
3506
3508
{
3507
3509
CV_Assert (ctx.getImpl ());
3508
- const ProgramSource::Impl* src_ = src.getImpl ();
3509
3510
CV_Assert (src_);
3510
3511
CV_Assert (src_->kind_ != ProgramSource::Impl::PROGRAM_BINARIES);
3511
3512
@@ -3557,7 +3558,7 @@ struct Program::Impl
3557
3558
CV_Assert (handle == NULL );
3558
3559
if (src_->kind_ == ProgramSource::Impl::PROGRAM_SOURCE_CODE)
3559
3560
{
3560
- if (!buildFromSources (ctx, errmsg))
3561
+ if (!buildFromSources (ctx, src_, errmsg))
3561
3562
{
3562
3563
return false ;
3563
3564
}
@@ -3648,23 +3649,22 @@ struct Program::Impl
3648
3649
3649
3650
errmsg = String (buffer);
3650
3651
printf (" OpenCL program build log: %s/%s\n Status %d: %s\n %s\n %s\n " ,
3651
- src. getImpl ()-> module_ . c_str (), src. getImpl ()-> name_ .c_str (),
3652
+ sourceModule_. c_str (), sourceName_ .c_str (),
3652
3653
result, getOpenCLErrorString (result),
3653
3654
buildflags.c_str (), errmsg.c_str ());
3654
3655
fflush (stdout);
3655
3656
}
3656
3657
3657
- bool buildFromSources (const Context& ctx, String& errmsg)
3658
+ bool buildFromSources (const Context& ctx, const ProgramSource::Impl* src_, String& errmsg)
3658
3659
{
3659
- const ProgramSource::Impl* src_ = src.getImpl ();
3660
3660
CV_Assert (src_);
3661
3661
CV_Assert (src_->kind_ == ProgramSource::Impl::PROGRAM_SOURCE_CODE);
3662
3662
CV_Assert (handle == NULL );
3663
3663
CV_INSTRUMENT_REGION_OPENCL_COMPILE (cv::format (" Build OpenCL program: %s/%s %" PRIx64 " options: %s" ,
3664
- src_-> module_ .c_str (), src_-> name_ .c_str (),
3664
+ sourceModule_ .c_str (), sourceName_ .c_str (),
3665
3665
src.hash (), buildflags.c_str ()).c_str ());
3666
3666
3667
- CV_LOG_VERBOSE (NULL , 0 , " Compile... " << src_-> module_ .c_str () << " /" << src_-> name_ .c_str ());
3667
+ CV_LOG_VERBOSE (NULL , 0 , " Compile... " << sourceModule_ .c_str () << " /" << sourceName_ .c_str ());
3668
3668
3669
3669
const char * srcptr = src_->sourceAddr_ ? ((const char *)src_->sourceAddr_ ) : src_->codeStr_ .c_str ();
3670
3670
size_t srclen = src_->sourceAddr_ ? src_->sourceSize_ : src_->codeStr_ .size ();
@@ -3721,58 +3721,6 @@ struct Program::Impl
3721
3721
return handle != NULL ;
3722
3722
}
3723
3723
3724
- Impl (const String& _buf, const String& _buildflags)
3725
- {
3726
- refcount = 1 ;
3727
- handle = 0 ;
3728
- buildflags = _buildflags;
3729
- if (_buf.empty ())
3730
- return ;
3731
- String prefix0 = Program::getPrefix (buildflags);
3732
- const Context& ctx = Context::getDefault ();
3733
- const Device& dev = Device::getDefault ();
3734
- const char * pos0 = _buf.c_str ();
3735
- const char * pos1 = strchr (pos0, ' \n ' );
3736
- if (!pos1)
3737
- return ;
3738
- const char * pos2 = strchr (pos1+1 , ' \n ' );
3739
- if (!pos2)
3740
- return ;
3741
- const char * pos3 = strchr (pos2+1 , ' \n ' );
3742
- if (!pos3)
3743
- return ;
3744
- size_t prefixlen = (pos3 - pos0)+1 ;
3745
- String prefix (pos0, prefixlen);
3746
- if ( prefix != prefix0 )
3747
- return ;
3748
- const uchar* bin = (uchar*)(pos3+1 );
3749
- void * devid = dev.ptr ();
3750
- size_t codelen = _buf.length () - prefixlen;
3751
- cl_int binstatus = 0 , retval = 0 ;
3752
- handle = clCreateProgramWithBinary ((cl_context)ctx.ptr (), 1 , (cl_device_id*)&devid,
3753
- &codelen, &bin, &binstatus, &retval);
3754
- CV_OCL_DBG_CHECK_RESULT (retval, " clCreateProgramWithBinary" );
3755
- }
3756
-
3757
- String store ()
3758
- {
3759
- if (!handle)
3760
- return String ();
3761
- size_t progsz = 0 , retsz = 0 ;
3762
- String prefix = Program::getPrefix (buildflags);
3763
- size_t prefixlen = prefix.length ();
3764
- if (clGetProgramInfo (handle, CL_PROGRAM_BINARY_SIZES, sizeof (progsz), &progsz, &retsz) != CL_SUCCESS)
3765
- return String ();
3766
- AutoBuffer<uchar> bufbuf (prefixlen + progsz + 16 );
3767
- uchar* buf = bufbuf;
3768
- memcpy (buf, prefix.c_str (), prefixlen);
3769
- buf += prefixlen;
3770
- if (clGetProgramInfo (handle, CL_PROGRAM_BINARIES, sizeof (buf), &buf, &retsz) != CL_SUCCESS)
3771
- return String ();
3772
- buf[progsz] = (uchar)' \0 ' ;
3773
- return String ((const char *)(uchar*)bufbuf, prefixlen + progsz);
3774
- }
3775
-
3776
3724
void getProgramBinary (std::vector<char >& buf)
3777
3725
{
3778
3726
CV_Assert (handle);
@@ -3836,7 +3784,7 @@ struct Program::Impl
3836
3784
else
3837
3785
{
3838
3786
result = clBuildProgram (handle, (cl_uint)ndevices, (cl_device_id*)devices_, buildflags.c_str (), 0 , 0 );
3839
- CV_OCL_DBG_CHECK_RESULT (result, cv::format (" clBuildProgram(binary: %s/%s)" , src. getImpl ()-> module_ . c_str (), src. getImpl ()-> name_ .c_str ()).c_str ());
3787
+ CV_OCL_DBG_CHECK_RESULT (result, cv::format (" clBuildProgram(binary: %s/%s)" , sourceModule_. c_str (), sourceName_ .c_str ()).c_str ());
3840
3788
if (result != CL_SUCCESS)
3841
3789
{
3842
3790
dumpBuildLog_ (result, devices, errmsg);
@@ -3905,9 +3853,11 @@ struct Program::Impl
3905
3853
}
3906
3854
}
3907
3855
3908
- ProgramSource src;
3909
- String buildflags;
3910
3856
cl_program handle;
3857
+
3858
+ String buildflags;
3859
+ String sourceModule_;
3860
+ String sourceName_;
3911
3861
};
3912
3862
3913
3863
#else // HAVE_OPENCL
@@ -3969,55 +3919,41 @@ bool Program::create(const ProgramSource& src,
3969
3919
#endif
3970
3920
}
3971
3921
3972
- const ProgramSource& Program::source () const
3922
+ void * Program::ptr () const
3973
3923
{
3974
3924
#ifdef HAVE_OPENCL
3975
- static ProgramSource dummy;
3976
- return p ? p->src : dummy;
3925
+ return p ? p->handle : 0 ;
3977
3926
#else
3978
3927
CV_OPENCL_NO_SUPPORT ();
3979
3928
#endif
3980
3929
}
3981
3930
3982
- void * Program::ptr () const
3931
+ #ifndef OPENCV_REMOVE_DEPRECATED_API
3932
+ const ProgramSource& Program::source () const
3983
3933
{
3984
- #ifdef HAVE_OPENCL
3985
- return p ? p->handle : 0 ;
3986
- #else
3987
- CV_OPENCL_NO_SUPPORT ();
3988
- #endif
3934
+ CV_ErrorNoReturn (Error::StsNotImplemented, " Removed API" );
3989
3935
}
3990
3936
3991
3937
bool Program::read (const String& bin, const String& buildflags)
3992
3938
{
3993
- #ifdef HAVE_OPENCL
3994
- if (p)
3995
- p->release ();
3996
- p = new Impl (bin, buildflags);
3997
- return p->handle != 0 ;
3998
- #else
3999
- CV_OPENCL_NO_SUPPORT ();
4000
- #endif
3939
+ CV_UNUSED (bin); CV_UNUSED (buildflags);
3940
+ CV_ErrorNoReturn (Error::StsNotImplemented, " Removed API" );
4001
3941
}
4002
3942
4003
3943
bool Program::write (String& bin) const
4004
3944
{
4005
- #ifdef HAVE_OPENCL
4006
- if (!p)
4007
- return false ;
4008
- bin = p->store ();
4009
- return !bin.empty ();
4010
- #else
4011
- CV_OPENCL_NO_SUPPORT ();
4012
- #endif
3945
+ CV_UNUSED (bin);
3946
+ CV_ErrorNoReturn (Error::StsNotImplemented, " Removed API" );
4013
3947
}
4014
3948
4015
3949
String Program::getPrefix () const
4016
3950
{
4017
3951
#ifdef HAVE_OPENCL
4018
3952
if (!p)
4019
3953
return String ();
4020
- return getPrefix (p->buildflags );
3954
+ Context::Impl* ctx_ = Context::getDefault ().getImpl ();
3955
+ CV_Assert (ctx_);
3956
+ return cv::format (" opencl=%s\n buildflags=%s" , ctx_->getPrefixString ().c_str (), p->buildflags .c_str ());
4021
3957
#else
4022
3958
CV_OPENCL_NO_SUPPORT ();
4023
3959
#endif
@@ -4026,20 +3962,19 @@ String Program::getPrefix() const
4026
3962
String Program::getPrefix (const String& buildflags)
4027
3963
{
4028
3964
#ifdef HAVE_OPENCL
4029
- const Context& ctx = Context::getDefault ();
4030
- const Device& dev = ctx.device (0 );
4031
- return format (" name=%s\n driver=%s\n buildflags=%s\n " ,
4032
- dev.name ().c_str (), dev.driverVersion ().c_str (), buildflags.c_str ());
3965
+ Context::Impl* ctx_ = Context::getDefault ().getImpl ();
3966
+ CV_Assert (ctx_);
3967
+ return cv::format (" opencl=%s\n buildflags=%s" , ctx_->getPrefixString ().c_str (), buildflags.c_str ());
4033
3968
#else
4034
- CV_UNUSED (buildflags);
4035
3969
CV_OPENCL_NO_SUPPORT ();
4036
3970
#endif
4037
3971
}
3972
+ #endif
4038
3973
4039
3974
void Program::getBinary (std::vector<char >& binary) const
4040
3975
{
4041
3976
#ifdef HAVE_OPENCL
4042
- CV_Assert (p);
3977
+ CV_Assert (p && " Empty program " );
4043
3978
p->getProgramBinary (binary);
4044
3979
#else
4045
3980
binary.clear ();
@@ -4054,7 +3989,10 @@ Program Context::Impl::getProg(const ProgramSource& src,
4054
3989
size_t limit = getProgramCountLimit ();
4055
3990
const ProgramSource::Impl* src_ = src.getImpl ();
4056
3991
CV_Assert (src_);
4057
- String key = cv::format (" module=%s name=%s codehash=%s " , src_->module_ .c_str (), src_->name_ .c_str (), src_->sourceHash_ .c_str ()) + Program::getPrefix (buildflags);
3992
+ String key = cv::format (" module=%s name=%s codehash=%s\n opencl=%s\n buildflags=%s" ,
3993
+ src_->module_ .c_str (), src_->name_ .c_str (), src_->sourceHash_ .c_str (),
3994
+ getPrefixString ().c_str (),
3995
+ buildflags.c_str ());
4058
3996
{
4059
3997
cv::AutoLock lock (program_cache_mutex);
4060
3998
phash_t ::iterator it = phash.find (key);
0 commit comments