@@ -1011,17 +1011,17 @@ pi_result piMemBufferCreate(pi_context Context, pi_mem_flags Flags, size_t Size,
1011
1011
}
1012
1012
1013
1013
char *MapBasePtr = nullptr ;
1014
- cm_buffer_ptr_slot CmBuf;
1014
+ cm_surface_ptr_t CmBuf;
1015
1015
cm_support::SurfaceIndex *CmIndex;
1016
1016
int Status = cm_support::CM_FAILURE;
1017
1017
1018
1018
if (Flags & PI_MEM_FLAGS_HOST_PTR_USE) {
1019
- CmBuf.tag = cm_buffer_ptr_slot::type_user_provided ;
1019
+ CmBuf.tag = cm_surface_ptr_t ::TypeUserProvidedBuffer ;
1020
1020
Status = Context->Device ->CmDevicePtr ->CreateBufferUP (
1021
1021
static_cast <unsigned int >(Size), HostPtr, CmBuf.UPBufPtr );
1022
1022
CmBuf.UPBufPtr ->GetIndex (CmIndex);
1023
1023
} else {
1024
- CmBuf.tag = cm_buffer_ptr_slot::type_regular ;
1024
+ CmBuf.tag = cm_surface_ptr_t ::TypeRegularBuffer ;
1025
1025
Status = Context->Device ->CmDevicePtr ->CreateBuffer (
1026
1026
static_cast <unsigned int >(Size), CmBuf.RegularBufPtr );
1027
1027
CmBuf.RegularBufPtr ->GetIndex (CmIndex);
@@ -1077,58 +1077,40 @@ pi_result piMemRelease(pi_mem Mem) {
1077
1077
}
1078
1078
1079
1079
if (--(Mem->RefCount ) == 0 ) {
1080
- int Status = cm_support::CM_FAILURE;
1081
-
1082
- if (Mem->getMemType () == PI_MEM_TYPE_BUFFER) {
1083
- _pi_buffer *PiBuf = static_cast <_pi_buffer *>(Mem);
1084
- if (PiBuf->BufferPtr .tag == cm_buffer_ptr_slot::type_user_provided) {
1085
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroyBufferUP (
1086
- PiBuf->BufferPtr .UPBufPtr );
1087
- } else {
1088
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroySurface (
1089
- PiBuf->BufferPtr .RegularBufPtr );
1090
- }
1091
- } else if (Mem->getMemType () == PI_MEM_TYPE_IMAGE2D) {
1092
- _pi_image *PiImg = static_cast <_pi_image *>(Mem);
1093
- if (PiImg->ImagePtr .tag == cm_image_ptr_slot::type_user_provided) {
1094
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroySurface2DUP (
1095
- PiImg->ImagePtr .UPImgPtr );
1096
- } else {
1097
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroySurface (
1098
- PiImg->ImagePtr .RegularImgPtr );
1099
- }
1100
- }
1101
-
1102
- if (Status != cm_support::CM_SUCCESS) {
1103
- return PI_INVALID_MEM_OBJECT;
1104
- }
1105
-
1106
1080
// Removing Surface-map entry
1107
1081
std::lock_guard<std::mutex> Lock{*PiESimdSurfaceMapLock};
1108
1082
auto MapEntryIt = PiESimdSurfaceMap->find (Mem->SurfaceIndex );
1109
- if (MapEntryIt != PiESimdSurfaceMap->end ()) {
1110
- PiESimdSurfaceMap->erase (MapEntryIt);
1111
- } else {
1112
- if (PrintPiTrace) {
1113
- std::cerr << " Failure from CM-managed buffer/image deletion"
1114
- << std::endl;
1115
- }
1116
- return PI_INVALID_MEM_OBJECT;
1117
- }
1118
-
1119
- // TODO : Erasing should be done during 'piMemRelease'? Or Host has
1120
- // to call 'piEnqueueMemUnmap' for all mapped addresses before
1121
- // calling 'piMemRelease'?
1122
- std::lock_guard<std::mutex> MapLock{Mem->MappingsMutex };
1123
- for (auto mapit = Mem->Mappings .begin (); mapit != Mem->Mappings .end ();) {
1124
- mapit = Mem->Mappings .erase (mapit);
1125
- }
1126
-
1083
+ assert (MapEntryIt != PiESimdSurfaceMap->end () &&
1084
+ " Failure from Buffer/Image deletion" );
1085
+ PiESimdSurfaceMap->erase (MapEntryIt);
1127
1086
delete Mem;
1128
1087
}
1129
1088
return PI_SUCCESS;
1130
1089
}
1131
1090
1091
+ _pi_mem::~_pi_mem () {
1092
+ int Status = cm_support::CM_FAILURE;
1093
+
1094
+ cm_support::CmDevice *CmDevice = Context->Device ->CmDevicePtr ;
1095
+
1096
+ if (SurfacePtr.tag == cm_surface_ptr_t ::TypeUserProvidedBuffer) {
1097
+ Status = CmDevice->DestroyBufferUP (SurfacePtr.UPBufPtr );
1098
+ } else if (SurfacePtr.tag == cm_surface_ptr_t ::TypeRegularBuffer) {
1099
+ Status = CmDevice->DestroySurface (SurfacePtr.RegularBufPtr );
1100
+ } else if (SurfacePtr.tag == cm_surface_ptr_t ::TypeUserProvidedImage) {
1101
+ Status = CmDevice->DestroySurface2DUP (SurfacePtr.UPImgPtr );
1102
+ } else if (SurfacePtr.tag == cm_surface_ptr_t ::TypeRegularImage) {
1103
+ Status = CmDevice->DestroySurface (SurfacePtr.RegularImgPtr );
1104
+ }
1105
+
1106
+ assert (Status == cm_support::CM_SUCCESS &&
1107
+ " Surface Deletion Failure from CM_EMU" );
1108
+
1109
+ for (auto mapit = Mappings.begin (); mapit != Mappings.end ();) {
1110
+ mapit = Mappings.erase (mapit);
1111
+ }
1112
+ }
1113
+
1132
1114
cm_support::CM_SURFACE_FORMAT
1133
1115
ConvertPiImageFormatToCmFormat (const pi_image_format *PiFormat) {
1134
1116
using ULongPair = std::pair<unsigned long , unsigned long >;
@@ -1219,18 +1201,19 @@ pi_result piMemImageCreate(pi_context Context, pi_mem_flags Flags,
1219
1201
}
1220
1202
1221
1203
char *MapBasePtr = nullptr ;
1222
- cm_image_ptr_slot CmImg;
1204
+ cm_surface_ptr_t CmImg;
1223
1205
cm_support::SurfaceIndex *CmIndex;
1224
1206
int Status = cm_support::CM_SUCCESS;
1225
1207
1226
1208
if (Flags & PI_MEM_FLAGS_HOST_PTR_USE) {
1227
- CmImg.tag = cm_image_ptr_slot::type_user_provided ;
1209
+ CmImg.tag = cm_surface_ptr_t ::TypeUserProvidedImage ;
1228
1210
Status = Context->Device ->CmDevicePtr ->CreateSurface2DUP (
1229
1211
static_cast <unsigned int >(ImageDesc->image_width ),
1230
1212
static_cast <unsigned int >(ImageDesc->image_height ), CmSurfFormat,
1231
1213
HostPtr, CmImg.UPImgPtr );
1232
1214
CmImg.UPImgPtr ->GetIndex (CmIndex);
1233
1215
} else {
1216
+ CmImg.tag = cm_surface_ptr_t ::TypeRegularImage;
1234
1217
Status = Context->Device ->CmDevicePtr ->CreateSurface2D (
1235
1218
static_cast <unsigned int >(ImageDesc->image_width ),
1236
1219
static_cast <unsigned int >(ImageDesc->image_height ), CmSurfFormat,
@@ -1520,12 +1503,13 @@ pi_result piEnqueueMemBufferRead(pi_queue Queue, pi_mem Src,
1520
1503
RetEv->IsDummyEvent = true ;
1521
1504
}
1522
1505
1523
- if (buf->BufferPtr .tag == cm_buffer_ptr_slot::type_user_provided ) {
1506
+ if (buf->SurfacePtr .tag == cm_surface_ptr_t ::TypeUserProvidedBuffer ) {
1524
1507
// CM does not provide 'ReadSurface' call for 'User-Provided'
1525
1508
// Surface. memcpy is used for BufferRead PI_API call.
1526
1509
memcpy (Dst, buf->MapHostPtr , Size);
1527
1510
} else {
1528
- int Status = buf->BufferPtr .RegularBufPtr ->ReadSurface (
1511
+ assert (buf->SurfacePtr .tag == cm_surface_ptr_t ::TypeRegularBuffer);
1512
+ int Status = buf->SurfacePtr .RegularBufPtr ->ReadSurface (
1529
1513
reinterpret_cast <unsigned char *>(Dst),
1530
1514
nullptr , // event
1531
1515
static_cast <uint64_t >(Size));
@@ -1706,12 +1690,13 @@ pi_result piEnqueueMemImageRead(pi_queue CommandQueue, pi_mem Image,
1706
1690
}
1707
1691
1708
1692
size_t Size = RowPitch * (Region->height );
1709
- if (PiImg->ImagePtr .tag == cm_image_ptr_slot::type_user_provided ) {
1693
+ if (PiImg->SurfacePtr .tag == cm_surface_ptr_t ::TypeUserProvidedImage ) {
1710
1694
// CM does not provide 'ReadSurface' call for 'User-Provided'
1711
1695
// Surface. memcpy is used for ImageRead PI_API call.
1712
1696
memcpy (Ptr, PiImg->MapHostPtr , Size);
1713
1697
} else {
1714
- int Status = PiImg->ImagePtr .RegularImgPtr ->ReadSurface (
1698
+ assert (PiImg->SurfacePtr .tag == cm_surface_ptr_t ::TypeRegularImage);
1699
+ int Status = PiImg->SurfacePtr .RegularImgPtr ->ReadSurface (
1715
1700
reinterpret_cast <unsigned char *>(Ptr),
1716
1701
nullptr , // event
1717
1702
static_cast <uint64_t >(Size));
@@ -1974,43 +1959,9 @@ pi_result piTearDown(void *) {
1974
1959
1975
1960
for (auto it = PiESimdSurfaceMap->begin (); it != PiESimdSurfaceMap->end ();) {
1976
1961
auto Mem = it->second ;
1977
- if (Mem == nullptr ) {
1978
- // / Skipping map entry for SLM_BTI
1979
- it = PiESimdSurfaceMap->erase (it);
1980
- continue ;
1981
- }
1982
- int Status = cm_support::CM_FAILURE;
1983
-
1984
- if (Mem->getMemType () == PI_MEM_TYPE_BUFFER) {
1985
- _pi_buffer *PiBuf = static_cast <_pi_buffer *>(Mem);
1986
- if (PiBuf->BufferPtr .tag == cm_buffer_ptr_slot::type_user_provided) {
1987
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroyBufferUP (
1988
- PiBuf->BufferPtr .UPBufPtr );
1989
- } else {
1990
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroySurface (
1991
- PiBuf->BufferPtr .RegularBufPtr );
1992
- }
1993
- } else if (Mem->getMemType () == PI_MEM_TYPE_IMAGE2D) {
1994
- _pi_image *PiImg = static_cast <_pi_image *>(Mem);
1995
- if (PiImg->ImagePtr .tag == cm_image_ptr_slot::type_user_provided) {
1996
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroySurface2DUP (
1997
- PiImg->ImagePtr .UPImgPtr );
1998
- } else {
1999
- Status = Mem->Context ->Device ->CmDevicePtr ->DestroySurface (
2000
- PiImg->ImagePtr .RegularImgPtr );
2001
- }
2002
- }
2003
-
2004
- if (Status != cm_support::CM_SUCCESS) {
2005
- return PI_INVALID_MEM_OBJECT;
2006
- }
2007
-
2008
- // No "MappingsMutex" as piTearDown is guaranteed to be called
2009
- // from single thread for plug-in
2010
- for (auto mapit = Mem->Mappings .begin (); mapit != Mem->Mappings .end ();) {
2011
- mapit = Mem->Mappings .erase (mapit);
2012
- }
2013
-
1962
+ if (Mem != nullptr ) {
1963
+ delete Mem;
1964
+ } // else { /* Null-entry for SLM_BTI */ }
2014
1965
it = PiESimdSurfaceMap->erase (it);
2015
1966
}
2016
1967
return PI_SUCCESS;
0 commit comments