Commit 8d3850ac authored by Vladislav Vinogradov's avatar Vladislav Vinogradov

add cv::gpu::StreamAccessor::wrapStream method

it allows to import existed CUDA stream to OpenCV
parent 1862d199
...@@ -57,6 +57,7 @@ namespace cv ...@@ -57,6 +57,7 @@ namespace cv
struct StreamAccessor struct StreamAccessor
{ {
CV_EXPORTS static cudaStream_t getStream(const Stream& stream); CV_EXPORTS static cudaStream_t getStream(const Stream& stream);
CV_EXPORTS static Stream wrapStream(cudaStream_t stream);
}; };
} }
} }
......
...@@ -89,6 +89,7 @@ struct Stream::Impl ...@@ -89,6 +89,7 @@ struct Stream::Impl
} }
cudaStream_t stream; cudaStream_t stream;
bool own_stream;
int ref_counter; int ref_counter;
}; };
...@@ -335,6 +336,7 @@ void cv::gpu::Stream::create() ...@@ -335,6 +336,7 @@ void cv::gpu::Stream::create()
impl = (Stream::Impl*) fastMalloc(sizeof(Stream::Impl)); impl = (Stream::Impl*) fastMalloc(sizeof(Stream::Impl));
impl->stream = stream; impl->stream = stream;
impl->own_stream = true;
impl->ref_counter = 1; impl->ref_counter = 1;
} }
...@@ -342,9 +344,23 @@ void cv::gpu::Stream::release() ...@@ -342,9 +344,23 @@ void cv::gpu::Stream::release()
{ {
if (impl && CV_XADD(&impl->ref_counter, -1) == 1) if (impl && CV_XADD(&impl->ref_counter, -1) == 1)
{ {
cudaSafeCall( cudaStreamDestroy(impl->stream) ); if (impl->own_stream)
{
cudaSafeCall( cudaStreamDestroy(impl->stream) );
}
cv::fastFree(impl); cv::fastFree(impl);
} }
} }
Stream StreamAccessor::wrapStream(cudaStream_t stream)
{
Stream::Impl* impl = (Stream::Impl*) fastMalloc(sizeof(Stream::Impl));
impl->stream = stream;
impl->own_stream = false;
impl->ref_counter = 1;
return Stream(impl);
}
#endif /* !defined (HAVE_CUDA) */ #endif /* !defined (HAVE_CUDA) */
...@@ -44,6 +44,8 @@ ...@@ -44,6 +44,8 @@
#ifdef HAVE_CUDA #ifdef HAVE_CUDA
#include "opencv2/gpu/stream_accessor.hpp"
using namespace cvtest; using namespace cvtest;
#if CUDART_VERSION >= 5000 #if CUDART_VERSION >= 5000
...@@ -125,6 +127,25 @@ GPU_TEST_P(Async, Convert) ...@@ -125,6 +127,25 @@ GPU_TEST_P(Async, Convert)
stream.waitForCompletion(); stream.waitForCompletion();
} }
GPU_TEST_P(Async, WrapStream)
{
cudaStream_t cuda_stream = NULL;
ASSERT_EQ(cudaSuccess, cudaStreamCreate(&cuda_stream));
cv::gpu::Stream stream = cv::gpu::StreamAccessor::wrapStream(cuda_stream);
stream.enqueueUpload(src, d_src);
stream.enqueueConvert(d_src, d_dst, CV_32S);
stream.enqueueDownload(d_dst, dst);
Async* test = this;
stream.enqueueHostCallback(checkConvert, test);
stream.waitForCompletion();
ASSERT_EQ(cudaSuccess, cudaStreamDestroy(cuda_stream));
}
INSTANTIATE_TEST_CASE_P(GPU_Stream, Async, ALL_DEVICES); INSTANTIATE_TEST_CASE_P(GPU_Stream, Async, ALL_DEVICES);
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment