From 3ec2f7f5f08fe854865ae1defe41090c6b5d0b87 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Fri, 27 Jan 2012 13:10:30 +0000 Subject: [PATCH] fixed gpu::device::transform with non-aligned sources (Ticket #1567) --- modules/gpu/src/opencv2/gpu/device/common.hpp | 5 +++++ .../gpu/src/opencv2/gpu/device/detail/transform_detail.hpp | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/gpu/src/opencv2/gpu/device/common.hpp b/modules/gpu/src/opencv2/gpu/device/common.hpp index a513bccb5c..24a447b818 100644 --- a/modules/gpu/src/opencv2/gpu/device/common.hpp +++ b/modules/gpu/src/opencv2/gpu/device/common.hpp @@ -72,6 +72,11 @@ namespace cv { namespace gpu { return reinterpret_cast(ptr) % size == 0; } + + static inline bool isAligned(size_t step, size_t size) + { + return step % size == 0; + } }} static inline void ___cudaSafeCall(cudaError_t err, const char *file, const int line, const char *func = "") diff --git a/modules/gpu/src/opencv2/gpu/device/detail/transform_detail.hpp b/modules/gpu/src/opencv2/gpu/device/detail/transform_detail.hpp index dfa33ff411..c5163fa8c1 100644 --- a/modules/gpu/src/opencv2/gpu/device/detail/transform_detail.hpp +++ b/modules/gpu/src/opencv2/gpu/device/detail/transform_detail.hpp @@ -347,7 +347,8 @@ namespace cv { namespace gpu { namespace device StaticAssert::check(); - if (!isAligned(src.data, ft::smart_shift * sizeof(T)) || !isAligned(dst.data, ft::smart_shift * sizeof(D))) + if (!isAligned(src.data, ft::smart_shift * sizeof(T)) || !isAligned(src.step, ft::smart_shift * sizeof(T)) || + !isAligned(dst.data, ft::smart_shift * sizeof(D)) || !isAligned(dst.step, ft::smart_shift * sizeof(D))) { TransformDispatcher::call(src, dst, op, mask, stream); return; @@ -370,7 +371,9 @@ namespace cv { namespace gpu { namespace device StaticAssert::check(); - if (!isAligned(src1.data, ft::smart_shift * sizeof(T1)) || !isAligned(src2.data, ft::smart_shift * sizeof(T2)) || !isAligned(dst.data, ft::smart_shift * sizeof(D))) + if (!isAligned(src1.data, ft::smart_shift * sizeof(T1)) || !isAligned(src1.step, ft::smart_shift * sizeof(T1)) || + !isAligned(src2.data, ft::smart_shift * sizeof(T2)) || !isAligned(src2.step, ft::smart_shift * sizeof(T2)) || + !isAligned(dst.data, ft::smart_shift * sizeof(D)) || !isAligned(dst.step, ft::smart_shift * sizeof(D))) { TransformDispatcher::call(src1, src2, dst, op, mask, stream); return;