@@ -4453,8 +4453,11 @@ class OpenCLAllocator : public MatAllocator
4453
4453
#endif
4454
4454
{
4455
4455
tempUMatFlags = UMatData::TEMP_UMAT;
4456
- handle = clCreateBuffer (ctx_handle, CL_MEM_USE_HOST_PTR|createFlags,
4457
- u->size , u->origdata , &retval);
4456
+ if (u->origdata == cv::alignPtr (u->origdata , 4 )) // There are OpenCL runtime issues for less aligned data
4457
+ {
4458
+ handle = clCreateBuffer (ctx_handle, CL_MEM_USE_HOST_PTR|createFlags,
4459
+ u->size , u->origdata , &retval);
4460
+ }
4458
4461
if ((!handle || retval < 0 ) && !(accessFlags & ACCESS_FAST))
4459
4462
{
4460
4463
handle = clCreateBuffer (ctx_handle, CL_MEM_COPY_HOST_PTR|CL_MEM_READ_WRITE|createFlags,
@@ -4510,16 +4513,17 @@ class OpenCLAllocator : public MatAllocator
4510
4513
if (!u)
4511
4514
return ;
4512
4515
4513
- CV_Assert (u->urefcount > = 0 );
4514
- CV_Assert (u->refcount >= 0 );
4516
+ CV_Assert (u->urefcount = = 0 );
4517
+ CV_Assert (u->refcount == 0 && " UMat deallocation error: some derived Mat is still alive " );
4515
4518
4516
- CV_Assert (u->handle != 0 && u->urefcount == 0 );
4519
+ CV_Assert (u->handle != 0 );
4520
+ CV_Assert (u->mapcount == 0 );
4517
4521
if (u->tempUMat ())
4518
4522
{
4519
4523
CV_Assert (u->origdata );
4520
4524
// UMatDataAutoLock lock(u);
4521
4525
4522
- if ( u->hostCopyObsolete () && u-> refcount > 0 )
4526
+ if ( u->hostCopyObsolete ())
4523
4527
{
4524
4528
#ifdef HAVE_OPENCL_SVM
4525
4529
if ((u->allocatorFlags_ & svm::OPENCL_SVM_BUFFER_MASK) != 0 )
@@ -4572,16 +4576,29 @@ class OpenCLAllocator : public MatAllocator
4572
4576
else
4573
4577
{
4574
4578
cl_int retval = 0 ;
4575
- void * data = clEnqueueMapBuffer (q, (cl_mem)u->handle , CL_TRUE,
4576
- (CL_MAP_READ | CL_MAP_WRITE),
4577
- 0 , u->size , 0 , 0 , 0 , &retval);
4578
- CV_OclDbgAssert (retval == CL_SUCCESS);
4579
- CV_OclDbgAssert (clEnqueueUnmapMemObject (q, (cl_mem)u->handle , data, 0 , 0 , 0 ) == CL_SUCCESS);
4580
- CV_OclDbgAssert (clFinish (q) == CL_SUCCESS);
4579
+ if (u->tempUMat ())
4580
+ {
4581
+ CV_Assert (u->mapcount == 0 );
4582
+ void * data = clEnqueueMapBuffer (q, (cl_mem)u->handle , CL_TRUE,
4583
+ (CL_MAP_READ | CL_MAP_WRITE),
4584
+ 0 , u->size , 0 , 0 , 0 , &retval);
4585
+ CV_Assert (u->origdata == data);
4586
+ CV_OclDbgAssert (retval == CL_SUCCESS);
4587
+ if (u->originalUMatData )
4588
+ {
4589
+ CV_Assert (u->originalUMatData ->data == data);
4590
+ }
4591
+ CV_OclDbgAssert (clEnqueueUnmapMemObject (q, (cl_mem)u->handle , data, 0 , 0 , 0 ) == CL_SUCCESS);
4592
+ CV_OclDbgAssert (clFinish (q) == CL_SUCCESS);
4593
+ }
4581
4594
}
4582
4595
}
4583
4596
u->markHostCopyObsolete (false );
4584
4597
}
4598
+ else
4599
+ {
4600
+ // nothing
4601
+ }
4585
4602
#ifdef HAVE_OPENCL_SVM
4586
4603
if ((u->allocatorFlags_ & svm::OPENCL_SVM_BUFFER_MASK) != 0 )
4587
4604
{
@@ -4607,16 +4624,12 @@ class OpenCLAllocator : public MatAllocator
4607
4624
if (u->data && u->copyOnMap () && u->data != u->origdata )
4608
4625
fastFree (u->data );
4609
4626
u->data = u->origdata ;
4610
- if (u->refcount == 0 )
4611
- {
4612
- u->currAllocator ->deallocate (u);
4613
- u = NULL ;
4614
- }
4627
+ u->currAllocator ->deallocate (u);
4628
+ u = NULL ;
4615
4629
}
4616
4630
else
4617
4631
{
4618
4632
CV_Assert (u->origdata == NULL );
4619
- CV_Assert (u->refcount == 0 );
4620
4633
if (u->data && u->copyOnMap () && u->data != u->origdata )
4621
4634
{
4622
4635
fastFree (u->data );
@@ -4665,17 +4678,13 @@ class OpenCLAllocator : public MatAllocator
4665
4678
delete u;
4666
4679
u = NULL ;
4667
4680
}
4668
- CV_Assert (u == NULL || u-> refcount );
4681
+ CV_Assert (u == NULL );
4669
4682
}
4670
4683
4684
+ // synchronized call (external UMatDataAutoLock, see UMat::getMat)
4671
4685
void map (UMatData* u, int accessFlags) const
4672
4686
{
4673
- if (!u)
4674
- return ;
4675
-
4676
- CV_Assert ( u->handle != 0 );
4677
-
4678
- UMatDataAutoLock autolock (u);
4687
+ CV_Assert (u && u->handle );
4679
4688
4680
4689
if (accessFlags & ACCESS_WRITE)
4681
4690
u->markDeviceCopyObsolete (true );
@@ -4715,11 +4724,16 @@ class OpenCLAllocator : public MatAllocator
4715
4724
}
4716
4725
#endif
4717
4726
4718
- cl_int retval = 0 ;
4719
- u->data = (uchar*)clEnqueueMapBuffer (q, (cl_mem)u->handle , CL_TRUE,
4720
- (CL_MAP_READ | CL_MAP_WRITE),
4721
- 0 , u->size , 0 , 0 , 0 , &retval);
4722
- if (u->data && retval == CL_SUCCESS)
4727
+ cl_int retval = CL_SUCCESS;
4728
+ if (!u->deviceMemMapped ())
4729
+ {
4730
+ CV_Assert (u->refcount == 1 );
4731
+ CV_Assert (u->mapcount ++ == 0 );
4732
+ u->data = (uchar*)clEnqueueMapBuffer (q, (cl_mem)u->handle , CL_TRUE,
4733
+ (CL_MAP_READ | CL_MAP_WRITE),
4734
+ 0 , u->size , 0 , 0 , 0 , &retval);
4735
+ }
4736
+ if (u->data && retval == CL_SUCCESS)
4723
4737
{
4724
4738
u->markHostCopyObsolete (false );
4725
4739
u->markDeviceMemMapped (true );
@@ -4765,7 +4779,6 @@ class OpenCLAllocator : public MatAllocator
4765
4779
if ( !u->copyOnMap () && u->deviceMemMapped () )
4766
4780
{
4767
4781
CV_Assert (u->data != NULL );
4768
- u->markDeviceMemMapped (false );
4769
4782
#ifdef HAVE_OPENCL_SVM
4770
4783
if ((u->allocatorFlags_ & svm::OPENCL_SVM_BUFFER_MASK) != 0 )
4771
4784
{
@@ -4792,16 +4805,21 @@ class OpenCLAllocator : public MatAllocator
4792
4805
return ;
4793
4806
}
4794
4807
#endif
4795
- CV_Assert ( (retval = clEnqueueUnmapMemObject (q,
4796
- (cl_mem)u->handle , u->data , 0 , 0 , 0 )) == CL_SUCCESS );
4797
- if (Device::getDefault ().isAMD ())
4798
- {
4799
- // required for multithreaded applications (see stitching test)
4800
- CV_OclDbgAssert (clFinish (q) == CL_SUCCESS);
4801
- }
4802
-
4803
4808
if (u->refcount == 0 )
4809
+ {
4810
+ CV_Assert (u->mapcount -- == 1 );
4811
+ CV_Assert ((retval = clEnqueueUnmapMemObject (q,
4812
+ (cl_mem)u->handle , u->data , 0 , 0 , 0 )) == CL_SUCCESS);
4813
+ if (Device::getDefault ().isAMD ())
4814
+ {
4815
+ // required for multithreaded applications (see stitching test)
4816
+ CV_OclDbgAssert (clFinish (q) == CL_SUCCESS);
4817
+ }
4818
+ u->markDeviceMemMapped (false );
4804
4819
u->data = 0 ;
4820
+ u->markDeviceCopyObsolete (false );
4821
+ u->markHostCopyObsolete (true );
4822
+ }
4805
4823
}
4806
4824
else if ( u->copyOnMap () && u->deviceCopyObsolete () )
4807
4825
{
@@ -4811,9 +4829,9 @@ class OpenCLAllocator : public MatAllocator
4811
4829
#endif
4812
4830
CV_Assert ( (retval = clEnqueueWriteBuffer (q, (cl_mem)u->handle , CL_TRUE, 0 ,
4813
4831
u->size , alignedPtr.getAlignedPtr (), 0 , 0 , 0 )) == CL_SUCCESS );
4832
+ u->markDeviceCopyObsolete (false );
4833
+ u->markHostCopyObsolete (true );
4814
4834
}
4815
- u->markDeviceCopyObsolete (false );
4816
- u->markHostCopyObsolete (true );
4817
4835
}
4818
4836
4819
4837
bool checkContinuous (int dims, const size_t sz[],
0 commit comments