@@ -1023,7 +1023,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1023
1023
getAdjustedMode (PropertyList),
1024
1024
detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
1025
1025
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1026
- checkDeviceAccessorBufferSize (BufferRef.size ());
1026
+ preScreenAccessor (BufferRef.size (), PropertyList );
1027
1027
if (!IsPlaceH)
1028
1028
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1029
1029
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
@@ -1054,7 +1054,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1054
1054
getAdjustedMode (PropertyList),
1055
1055
detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
1056
1056
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1057
- checkDeviceAccessorBufferSize (BufferRef.size ());
1057
+ preScreenAccessor (BufferRef.size (), PropertyList );
1058
1058
if (!IsPlaceH)
1059
1059
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1060
1060
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
@@ -1084,7 +1084,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1084
1084
getAdjustedMode (PropertyList),
1085
1085
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1086
1086
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1087
- checkDeviceAccessorBufferSize (BufferRef.size ());
1087
+ preScreenAccessor (BufferRef.size (), PropertyList );
1088
1088
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1089
1089
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1090
1090
detail::AccessorBaseHost::impl.get (),
@@ -1115,7 +1115,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1115
1115
getAdjustedMode (PropertyList),
1116
1116
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1117
1117
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1118
- checkDeviceAccessorBufferSize (BufferRef.size ());
1118
+ preScreenAccessor (BufferRef.size (), PropertyList );
1119
1119
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1120
1120
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1121
1121
detail::AccessorBaseHost::impl.get (),
@@ -1145,7 +1145,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1145
1145
getAdjustedMode (PropertyList),
1146
1146
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1147
1147
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1148
- checkDeviceAccessorBufferSize (BufferRef.size ());
1148
+ preScreenAccessor (BufferRef.size (), PropertyList );
1149
1149
if (!IsPlaceH)
1150
1150
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1151
1151
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
@@ -1178,7 +1178,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1178
1178
getAdjustedMode (PropertyList),
1179
1179
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1180
1180
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1181
- checkDeviceAccessorBufferSize (BufferRef.size ());
1181
+ preScreenAccessor (BufferRef.size (), PropertyList );
1182
1182
if (!IsPlaceH)
1183
1183
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1184
1184
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
@@ -1237,7 +1237,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1237
1237
getAdjustedMode (PropertyList),
1238
1238
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1239
1239
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1240
- checkDeviceAccessorBufferSize (BufferRef.size ());
1240
+ preScreenAccessor (BufferRef.size (), PropertyList );
1241
1241
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1242
1242
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1243
1243
detail::AccessorBaseHost::impl.get (),
@@ -1269,7 +1269,7 @@ class __SYCL_SPECIAL_CLASS accessor :
1269
1269
getAdjustedMode (PropertyList),
1270
1270
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1271
1271
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ) {
1272
- checkDeviceAccessorBufferSize (BufferRef.size ());
1272
+ preScreenAccessor (BufferRef.size (), PropertyList );
1273
1273
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1274
1274
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1275
1275
detail::AccessorBaseHost::impl.get (),
@@ -1443,7 +1443,14 @@ class __SYCL_SPECIAL_CLASS accessor :
1443
1443
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1444
1444
sizeof (DataT), BufferRef.OffsetInBytes ,
1445
1445
BufferRef.IsSubBuffer ) {
1446
- checkDeviceAccessorBufferSize (BufferRef.size ());
1446
+ preScreenAccessor (BufferRef.size (), PropertyList);
1447
+ if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1448
+ BufferRef.get_range ()))
1449
+ throw sycl::invalid_object_error (
1450
+ " accessor with requested offset and range would exceed the bounds of "
1451
+ " the buffer" ,
1452
+ PI_INVALID_VALUE);
1453
+
1447
1454
if (!IsPlaceH)
1448
1455
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1449
1456
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
@@ -1477,7 +1484,14 @@ class __SYCL_SPECIAL_CLASS accessor :
1477
1484
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1478
1485
sizeof (DataT), BufferRef.OffsetInBytes ,
1479
1486
BufferRef.IsSubBuffer ) {
1480
- checkDeviceAccessorBufferSize (BufferRef.size ());
1487
+ preScreenAccessor (BufferRef.size (), PropertyList);
1488
+ if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1489
+ BufferRef.get_range ()))
1490
+ throw sycl::invalid_object_error (
1491
+ " accessor with requested offset and range would exceed the bounds of "
1492
+ " the buffer" ,
1493
+ PI_INVALID_VALUE);
1494
+
1481
1495
if (!IsPlaceH)
1482
1496
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1483
1497
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
@@ -1538,7 +1552,14 @@ class __SYCL_SPECIAL_CLASS accessor :
1538
1552
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1539
1553
sizeof (DataT), BufferRef.OffsetInBytes ,
1540
1554
BufferRef.IsSubBuffer ) {
1541
- checkDeviceAccessorBufferSize (BufferRef.size ());
1555
+ preScreenAccessor (BufferRef.size (), PropertyList);
1556
+ if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1557
+ BufferRef.get_range ()))
1558
+ throw sycl::invalid_object_error (
1559
+ " accessor with requested offset and range would exceed the bounds of "
1560
+ " the buffer" ,
1561
+ PI_INVALID_VALUE);
1562
+
1542
1563
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1543
1564
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1544
1565
detail::AccessorBaseHost::impl.get (),
@@ -1571,7 +1592,14 @@ class __SYCL_SPECIAL_CLASS accessor :
1571
1592
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1572
1593
sizeof (DataT), BufferRef.OffsetInBytes ,
1573
1594
BufferRef.IsSubBuffer ) {
1574
- checkDeviceAccessorBufferSize (BufferRef.size ());
1595
+ preScreenAccessor (BufferRef.size (), PropertyList);
1596
+ if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1597
+ BufferRef.get_range ()))
1598
+ throw sycl::invalid_object_error (
1599
+ " accessor with requested offset and range would exceed the bounds of "
1600
+ " the buffer" ,
1601
+ PI_INVALID_VALUE);
1602
+
1575
1603
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1576
1604
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1577
1605
detail::AccessorBaseHost::impl.get (),
@@ -1761,12 +1789,22 @@ class __SYCL_SPECIAL_CLASS accessor :
1761
1789
return getQualifiedPtr ();
1762
1790
}
1763
1791
1764
- void checkDeviceAccessorBufferSize (const size_t elemInBuffer) {
1792
+ void preScreenAccessor (const size_t elemInBuffer,
1793
+ const PropertyListT &PropertyList) {
1794
+ // check device accessor buffer size
1765
1795
if (!IsHostBuf && elemInBuffer == 0 )
1766
- throw cl:: sycl::invalid_object_error (
1796
+ throw sycl::invalid_object_error (
1767
1797
" SYCL buffer size is zero. To create a device accessor, SYCL "
1768
1798
" buffer size must be greater than zero." ,
1769
1799
PI_INVALID_VALUE);
1800
+
1801
+ // check that no_init property is compatible with access mode
1802
+ if (PropertyList.template has_property <property::no_init>() &&
1803
+ AccessMode == access::mode::read) {
1804
+ throw sycl::invalid_object_error (
1805
+ " accessor would cannot be both read_only and no_init" ,
1806
+ PI_INVALID_VALUE);
1807
+ }
1770
1808
}
1771
1809
};
1772
1810
0 commit comments