@@ -573,6 +573,7 @@ class __SYCL_EXPORT AccessorBaseHost {
573573 const range<3 > &getMemoryRange () const ;
574574 void *getPtr () const noexcept ;
575575 bool isPlaceholder () const ;
576+ bool isMemoryObjectUsedByGraph () const ;
576577
577578 detail::AccHostDataT &getAccData ();
578579
@@ -1487,6 +1488,18 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
14871488 typename std::iterator_traits<iterator>::difference_type;
14881489 using size_type = std::size_t ;
14891490
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+
14901503 // The list of accessor constructors with their arguments
14911504 // -------+---------+-------+----+-----+--------------
14921505 // Dimensions = 0
@@ -1566,6 +1579,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
15661579 detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
15671580 IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
15681581 PropertyList) {
1582+ throwIfUsedByGraph ();
15691583 preScreenAccessor (PropertyList);
15701584 if (!AccessorBaseHost::isPlaceholder ())
15711585 addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1605,6 +1619,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
16051619 detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
16061620 IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
16071621 PropertyList) {
1622+ throwIfUsedByGraph ();
16081623 preScreenAccessor (PropertyList);
16091624 if (!AccessorBaseHost::isPlaceholder ())
16101625 addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1640,6 +1655,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
16401655 getAdjustedMode (PropertyList),
16411656 detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
16421657 BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1658+ throwIfUsedByGraph ();
16431659 preScreenAccessor (PropertyList);
16441660 detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
16451661 initHostAcc ();
@@ -1676,6 +1692,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
16761692 getAdjustedMode (PropertyList),
16771693 detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
16781694 BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1695+ throwIfUsedByGraph ();
16791696 preScreenAccessor (PropertyList);
16801697 detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
16811698 initHostAcc ();
@@ -1708,6 +1725,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
17081725 detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
17091726 IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
17101727 PropertyList) {
1728+ throwIfUsedByGraph ();
17111729 preScreenAccessor (PropertyList);
17121730 if (!AccessorBaseHost::isPlaceholder ())
17131731 addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1743,6 +1761,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
17431761 detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
17441762 IsPlaceH, BufferRef.OffsetInBytes , BufferRef.IsSubBuffer ,
17451763 PropertyList) {
1764+ throwIfUsedByGraph ();
17461765 preScreenAccessor (PropertyList);
17471766 if (!AccessorBaseHost::isPlaceholder ())
17481767 addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -1805,6 +1824,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
18051824 getAdjustedMode (PropertyList),
18061825 detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
18071826 BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1827+ throwIfUsedByGraph ();
18081828 preScreenAccessor (PropertyList);
18091829 detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
18101830 initHostAcc ();
@@ -1839,6 +1859,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
18391859 getAdjustedMode (PropertyList),
18401860 detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
18411861 BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1862+ throwIfUsedByGraph ();
18421863 preScreenAccessor (PropertyList);
18431864 initHostAcc ();
18441865 detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
@@ -2014,6 +2035,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
20142035 detail::getSyclObjImpl (BufferRef).get (), Dimensions,
20152036 sizeof (DataT), IsPlaceH, BufferRef.OffsetInBytes ,
20162037 BufferRef.IsSubBuffer , PropertyList) {
2038+ throwIfUsedByGraph ();
20172039 preScreenAccessor (PropertyList);
20182040 if (!AccessorBaseHost::isPlaceholder ())
20192041 addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -2056,6 +2078,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
20562078 detail::getSyclObjImpl (BufferRef).get (), Dimensions,
20572079 sizeof (DataT), IsPlaceH, BufferRef.OffsetInBytes ,
20582080 BufferRef.IsSubBuffer , PropertyList) {
2081+ throwIfUsedByGraph ();
20592082 preScreenAccessor (PropertyList);
20602083 if (!AccessorBaseHost::isPlaceholder ())
20612084 addHostAccessorAndWait (AccessorBaseHost::impl.get ());
@@ -2127,6 +2150,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
21272150 detail::getSyclObjImpl (BufferRef).get (), Dimensions,
21282151 sizeof (DataT), BufferRef.OffsetInBytes ,
21292152 BufferRef.IsSubBuffer , PropertyList) {
2153+ throwIfUsedByGraph ();
21302154 preScreenAccessor (PropertyList);
21312155 if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
21322156 BufferRef.get_range ()))
@@ -2169,6 +2193,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
21692193 detail::getSyclObjImpl (BufferRef).get (), Dimensions,
21702194 sizeof (DataT), BufferRef.OffsetInBytes ,
21712195 BufferRef.IsSubBuffer , PropertyList) {
2196+ throwIfUsedByGraph ();
21722197 preScreenAccessor (PropertyList);
21732198 if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
21742199 BufferRef.get_range ()))
0 commit comments