@@ -573,6 +573,7 @@ class __SYCL_EXPORT AccessorBaseHost {
573
573
const range<3 > &getMemoryRange () const ;
574
574
void *getPtr () const noexcept ;
575
575
bool isPlaceholder () const ;
576
+ bool isMemoryObjectUsedByGraph () const ;
576
577
577
578
detail::AccHostDataT &getAccData ();
578
579
@@ -1487,6 +1488,18 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1487
1488
typename std::iterator_traits<iterator>::difference_type;
1488
1489
using size_type = std::size_t ;
1489
1490
1491
+ // / If creating a host_accessor this checks to see if the underlying memory
1492
+ // / object is currently in use by a command_graph, and throws if it is.
1493
+ void throwIfUsedByGraph () const {
1494
+ #ifndef __SYCL_DEVICE_ONLY__
1495
+ if (IsHostBuf && AccessorBaseHost::isMemoryObjectUsedByGraph ()) {
1496
+ throw sycl::exception (make_error_code (errc::invalid),
1497
+ " Host accessors cannot be created for buffers "
1498
+ " which are currently in use by a command graph." );
1499
+ }
1500
+ #endif
1501
+ }
1502
+
1490
1503
// The list of accessor constructors with their arguments
1491
1504
// -------+---------+-------+----+-----+--------------
1492
1505
// Dimensions = 0
@@ -1566,6 +1579,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1566
1579
detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
1567
1580
IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
1568
1581
PropertyList) {
1582
+ throwIfUsedByGraph ();
1569
1583
preScreenAccessor (PropertyList);
1570
1584
if (!AccessorBaseHost::isPlaceholder ())
1571
1585
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1605,6 +1619,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1605
1619
detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
1606
1620
IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
1607
1621
PropertyList) {
1622
+ throwIfUsedByGraph ();
1608
1623
preScreenAccessor (PropertyList);
1609
1624
if (!AccessorBaseHost::isPlaceholder ())
1610
1625
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1640,6 +1655,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1640
1655
getAdjustedMode (PropertyList),
1641
1656
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1642
1657
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1658
+ throwIfUsedByGraph ();
1643
1659
preScreenAccessor (PropertyList);
1644
1660
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1645
1661
initHostAcc ();
@@ -1676,6 +1692,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1676
1692
getAdjustedMode (PropertyList),
1677
1693
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1678
1694
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1695
+ throwIfUsedByGraph ();
1679
1696
preScreenAccessor (PropertyList);
1680
1697
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1681
1698
initHostAcc ();
@@ -1708,6 +1725,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1708
1725
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1709
1726
IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
1710
1727
PropertyList) {
1728
+ throwIfUsedByGraph ();
1711
1729
preScreenAccessor (PropertyList);
1712
1730
if (!AccessorBaseHost::isPlaceholder ())
1713
1731
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1743,6 +1761,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1743
1761
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1744
1762
IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
1745
1763
PropertyList) {
1764
+ throwIfUsedByGraph ();
1746
1765
preScreenAccessor (PropertyList);
1747
1766
if (!AccessorBaseHost::isPlaceholder ())
1748
1767
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1805,6 +1824,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1805
1824
getAdjustedMode (PropertyList),
1806
1825
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1807
1826
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1827
+ throwIfUsedByGraph ();
1808
1828
preScreenAccessor (PropertyList);
1809
1829
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1810
1830
initHostAcc ();
@@ -1839,6 +1859,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1839
1859
getAdjustedMode (PropertyList),
1840
1860
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1841
1861
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1862
+ throwIfUsedByGraph ();
1842
1863
preScreenAccessor (PropertyList);
1843
1864
initHostAcc ();
1844
1865
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
@@ -2014,6 +2035,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2014
2035
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
2015
2036
sizeof (DataT), IsPlaceH, BufferRef.OffsetInBytes ,
2016
2037
BufferRef.IsSubBuffer , PropertyList) {
2038
+ throwIfUsedByGraph ();
2017
2039
preScreenAccessor (PropertyList);
2018
2040
if (!AccessorBaseHost::isPlaceholder ())
2019
2041
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -2056,6 +2078,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2056
2078
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
2057
2079
sizeof (DataT), IsPlaceH, BufferRef.OffsetInBytes ,
2058
2080
BufferRef.IsSubBuffer , PropertyList) {
2081
+ throwIfUsedByGraph ();
2059
2082
preScreenAccessor (PropertyList);
2060
2083
if (!AccessorBaseHost::isPlaceholder ())
2061
2084
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -2127,6 +2150,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2127
2150
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
2128
2151
sizeof (DataT), BufferRef.OffsetInBytes ,
2129
2152
BufferRef.IsSubBuffer , PropertyList) {
2153
+ throwIfUsedByGraph ();
2130
2154
preScreenAccessor (PropertyList);
2131
2155
if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
2132
2156
BufferRef.get_range ()))
@@ -2169,6 +2193,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2169
2193
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
2170
2194
sizeof (DataT), BufferRef.OffsetInBytes ,
2171
2195
BufferRef.IsSubBuffer , PropertyList) {
2196
+ throwIfUsedByGraph ();
2172
2197
preScreenAccessor (PropertyList);
2173
2198
if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
2174
2199
BufferRef.get_range ()))
0 commit comments