@@ -963,9 +963,9 @@ dpct_memcpy(sycl::ext::oneapi::experimental::image_mem_handle src,
963963 sycl::range<3 >(w_offset_src / ele_size, h_offset_src, 0 );
964964 const auto dest_offset = sycl::range<3 >(0 , 0 , 0 );
965965 const auto dest_extend = sycl::range<3 >(p / ele_size, 0 , 0 );
966- const auto copy_extend = sycl::range<3 >(w / ele_size, h, 0 );
966+ const auto copy_extend = sycl::range<3 >(w / ele_size, h, 1 );
967967 return q.ext_oneapi_copy (src, src_offset, desc_src, dest, dest_offset,
968- dest_extend , copy_extend);
968+ desc_src, p , copy_extend);
969969}
970970
971971static inline std::vector<sycl::event> dpct_memcpy_to_host (
@@ -983,7 +983,7 @@ static inline std::vector<sycl::event> dpct_memcpy_to_host(
983983 const auto dest_offset = sycl::range<3 >(offset_dest / ele_size, 0 , 0 );
984984 const auto dest_extend = sycl::range<3 >(0 , 0 , 0 );
985985 const auto copy_extend =
986- sycl::range<3 >((w - w_offset_src) / ele_size, 1 , 0 );
986+ sycl::range<3 >((w - w_offset_src) / ele_size, 1 , 1 );
987987 event_list.push_back (q.ext_oneapi_copy (src, src_offset, desc_src,
988988 dest_host_ptr, dest_offset,
989989 dest_extend, copy_extend));
@@ -996,7 +996,7 @@ static inline std::vector<sycl::event> dpct_memcpy_to_host(
996996 sycl::range<3 >(w_offset_src / ele_size, h_offset_src, 0 );
997997 const auto dest_offset = sycl::range<3 >(offset_dest / ele_size, 0 , 0 );
998998 const auto dest_extend = sycl::range<3 >(0 , 0 , 0 );
999- const auto copy_extend = sycl::range<3 >((s - offset_dest) / ele_size, 1 , 0 );
999+ const auto copy_extend = sycl::range<3 >((s - offset_dest) / ele_size, 1 , 1 );
10001000 event_list.push_back (q.ext_oneapi_copy (src, src_offset, desc_src,
10011001 dest_host_ptr, dest_offset,
10021002 dest_extend, copy_extend));
@@ -1035,7 +1035,7 @@ dpct_memcpy(const void *src,
10351035 const auto src_extend = sycl::range<3 >(p / ele_size, 0 , 0 );
10361036 const auto dest_offset =
10371037 sycl::range<3 >(w_offset_dest / ele_size, h_offset_dest, 0 );
1038- const auto copy_extend = sycl::range<3 >(w / ele_size, h, 0 );
1038+ const auto copy_extend = sycl::range<3 >(w / ele_size, h, 1 );
10391039 // TODO: Remove const_cast after refining the signature of ext_oneapi_copy.
10401040 return q.ext_oneapi_copy (const_cast <void *>(src), src_offset, src_extend,
10411041 dest, dest_offset, desc_dest, copy_extend);
@@ -1056,7 +1056,7 @@ static inline std::vector<sycl::event> dpct_memcpy_from_host(
10561056 const auto dest_offset =
10571057 sycl::range<3 >(w_offset_dest / ele_size, h_offset_dest, 0 );
10581058 const auto copy_extend =
1059- sycl::range<3 >((w - w_offset_dest) / ele_size, 1 , 0 );
1059+ sycl::range<3 >((w - w_offset_dest) / ele_size, 1 , 1 );
10601060 // TODO: Remove const_cast after refining the signature of ext_oneapi_copy.
10611061 event_list.push_back (q.ext_oneapi_copy (
10621062 const_cast <void *>(src_host_ptr), src_offset, src_extend, dest,
@@ -1070,7 +1070,7 @@ static inline std::vector<sycl::event> dpct_memcpy_from_host(
10701070 const auto src_extend = sycl::range<3 >(0 , 0 , 0 );
10711071 const auto dest_offset =
10721072 sycl::range<3 >(w_offset_dest / ele_size, h_offset_dest, 0 );
1073- const auto copy_extend = sycl::range<3 >((s - offset_src) / ele_size, 1 , 0 );
1073+ const auto copy_extend = sycl::range<3 >((s - offset_src) / ele_size, 1 , 1 );
10741074 // TODO: Remove const_cast after refining the signature of ext_oneapi_copy.
10751075 event_list.push_back (q.ext_oneapi_copy (
10761076 const_cast <void *>(src_host_ptr), src_offset, src_extend, dest,
@@ -1115,7 +1115,7 @@ dpct_memcpy(const image_mem_wrapper *src, const sycl::id<3> &src_id,
11151115 sycl::range<3 >(dest.get_pitch () / ele_size, dest.get_y (), 1 );
11161116 const auto copy_extend = sycl::range<3 >(
11171117 copy_x_size_byte != 0 ? copy_x_size_byte / ele_size : size[0 ], size[1 ],
1118- size[2 ]);
1118+ size[2 ] != 0 ? size[ 2 ] : 1 );
11191119 return q.ext_oneapi_copy (src->get_handle (), src_offset, src->get_desc (),
11201120 dest.get_data_ptr (), dest_offset, dest_extend,
11211121 copy_extend);
@@ -1946,11 +1946,19 @@ static inline void dpct_memcpy(image_mem_wrapper *dest, size_t w_offset_dest,
19461946 size_t w_offset_src, size_t h_offset_src,
19471947 size_t w, size_t h,
19481948 sycl::queue q = get_default_queue()) {
1949- auto temp = (void *)sycl::malloc_device (w * h, q);
1950- // TODO: Need change logic when sycl support image_mem to image_mem copy.
1951- dpct_memcpy (temp, w, src, w_offset_src, h_offset_src, w, h, q);
1952- dpct_memcpy (dest, w_offset_dest, h_offset_dest, temp, w, w, h, q);
1953- sycl::free (temp, q);
1949+ const auto from_ele_size = detail::get_ele_size (src->get_desc ());
1950+ const auto src_offset = sycl::range<3 >(
1951+ w_offset_src != 0 ? w_offset_src / from_ele_size : w_offset_src,
1952+ h_offset_src, 0 );
1953+ const auto to_ele_size = detail::get_ele_size (dest->get_desc ());
1954+ const auto dest_offset = sycl::range<3 >(
1955+ w_offset_dest != 0 ? w_offset_dest / to_ele_size : w_offset_dest,
1956+ h_offset_dest, 0 );
1957+ const auto copy_extent = sycl::range<3 >(w / from_ele_size, h, 1 );
1958+ q.ext_oneapi_copy (src->get_handle (), src_offset, src->get_desc (),
1959+ dest->get_handle (), dest_offset, dest->get_desc (),
1960+ copy_extent)
1961+ .wait ();
19541962}
19551963
19561964// / Synchronously copies from image memory to the image memory, The function
@@ -1968,11 +1976,19 @@ static inline void dpct_memcpy(image_mem_wrapper *dest, size_t w_offset_dest,
19681976 const image_mem_wrapper *src,
19691977 size_t w_offset_src, size_t h_offset_src,
19701978 size_t s, sycl::queue q = get_default_queue()) {
1971- auto temp = (void *)sycl::malloc_device (s, q);
1972- // TODO: Need change logic when sycl support image_mem to image_mem copy.
1973- dpct_memcpy (temp, src, w_offset_src, h_offset_src, s, q);
1974- dpct_memcpy (dest, w_offset_dest, h_offset_dest, temp, s, q);
1975- sycl::free (temp, q);
1979+ const auto from_ele_size = detail::get_ele_size (src->get_desc ());
1980+ const auto src_offset = sycl::range<3 >(
1981+ w_offset_src != 0 ? w_offset_src / from_ele_size : w_offset_src,
1982+ h_offset_src, 0 );
1983+ const auto to_ele_size = detail::get_ele_size (dest->get_desc ());
1984+ const auto dest_offset = sycl::range<3 >(
1985+ w_offset_dest != 0 ? w_offset_dest / to_ele_size : w_offset_dest,
1986+ h_offset_dest, 0 );
1987+ const auto copy_extent = sycl::range<3 >(s / from_ele_size, 1 , 1 );
1988+ q.ext_oneapi_copy (src->get_handle (), src_offset, src->get_desc (),
1989+ dest->get_handle (), dest_offset, dest->get_desc (),
1990+ copy_extent)
1991+ .wait ();
19761992}
19771993// A wrapper for sycl fetch_image function for the byte addressing image.
19781994template <typename DataT, typename HintT = DataT, typename CoordT>
0 commit comments