Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
17ca7f95
Commit
17ca7f95
authored
Dec 12, 2013
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ocl: add support for initialization from user-provided OpenCL handles
parent
658282fc
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
109 additions
and
2 deletions
+109
-2
CMakeLists.txt
modules/ocl/CMakeLists.txt
+3
-0
structures_and_utility_functions.rst
modules/ocl/doc/structures_and_utility_functions.rst
+15
-1
ocl.hpp
modules/ocl/include/opencv2/ocl/ocl.hpp
+6
-0
cl_context.cpp
modules/ocl/src/cl_context.cpp
+0
-0
test_api.cpp
modules/ocl/test/test_api.cpp
+85
-1
No files found.
modules/ocl/CMakeLists.txt
View file @
17ca7f95
...
...
@@ -5,4 +5,7 @@ endif()
set
(
the_description
"OpenCL-accelerated Computer Vision"
)
ocv_define_module
(
ocl opencv_core opencv_imgproc opencv_features2d opencv_objdetect opencv_video opencv_calib3d opencv_ml
"
${
OPENCL_LIBRARIES
}
"
)
if
(
TARGET opencv_test_ocl
)
target_link_libraries
(
opencv_test_ocl
"
${
OPENCL_LIBRARIES
}
"
)
endif
()
ocv_warnings_disable
(
CMAKE_CXX_FLAGS -Wshadow
)
modules/ocl/doc/structures_and_utility_functions.rst
View file @
17ca7f95
...
...
@@ -25,12 +25,26 @@ Returns the list of devices
ocl::setDevice
--------------
Returns void
Initialize OpenCL computation context
.. ocv:function:: void ocl::setDevice( const DeviceInfo* info )
:param info: device info
ocl::initializeContext
--------------------------------
Alternative way to initialize OpenCL computation context.
.. ocv:function:: void ocl::initializeContext(void* pClPlatform, void* pClContext, void* pClDevice)
:param pClPlatform: selected ``platform_id`` (via pointer, parameter type is ``cl_platform_id*``)
:param pClContext: selected ``cl_context`` (via pointer, parameter type is ``cl_context*``)
:param pClDevice: selected ``cl_device_id`` (via pointer, parameter type is ``cl_device_id*``)
This function can be used for context initialization with D3D/OpenGL interoperability.
ocl::setBinaryPath
------------------
Returns void
...
...
modules/ocl/include/opencv2/ocl/ocl.hpp
View file @
17ca7f95
...
...
@@ -118,6 +118,7 @@ namespace cv
const
PlatformInfo
*
platform
;
DeviceInfo
();
~
DeviceInfo
();
};
struct
PlatformInfo
...
...
@@ -136,6 +137,7 @@ namespace cv
std
::
vector
<
const
DeviceInfo
*>
devices
;
PlatformInfo
();
~
PlatformInfo
();
};
//////////////////////////////// Initialization & Info ////////////////////////
...
...
@@ -151,6 +153,10 @@ namespace cv
// set device you want to use
CV_EXPORTS
void
setDevice
(
const
DeviceInfo
*
info
);
// Initialize from OpenCL handles directly.
// Argument types is (pointers): cl_platform_id*, cl_context*, cl_device_id*
CV_EXPORTS
void
initializeContext
(
void
*
pClPlatform
,
void
*
pClContext
,
void
*
pClDevice
);
//////////////////////////////// Error handling ////////////////////////
CV_EXPORTS
void
error
(
const
char
*
error_string
,
const
char
*
file
,
const
int
line
,
const
char
*
func
);
...
...
modules/ocl/src/cl_context.cpp
View file @
17ca7f95
This diff is collapsed.
Click to expand it.
modules/ocl/test/test_api.cpp
View file @
17ca7f95
...
...
@@ -40,7 +40,7 @@
//M*/
#include "test_precomp.hpp"
#include "opencv2/ocl/cl_runtime/cl_runtime.hpp" // for OpenCL types
: cl_mem
#include "opencv2/ocl/cl_runtime/cl_runtime.hpp" // for OpenCL types
& functions
TEST
(
TestAPI
,
openCLExecuteKernelInterop
)
{
...
...
@@ -78,3 +78,87 @@ TEST(TestAPI, openCLExecuteKernelInterop)
EXPECT_LE
(
checkNorm
(
cpuMat
,
dst
),
1e-3
);
}
// This test must be DISABLED by default!
// (We can't restore original context for other tests)
TEST
(
TestAPI
,
DISABLED_InitializationFromHandles
)
{
#define MAX_PLATFORMS 16
cl_platform_id
platforms
[
MAX_PLATFORMS
]
=
{
NULL
};
cl_uint
numPlatforms
=
0
;
cl_int
status
=
::
clGetPlatformIDs
(
MAX_PLATFORMS
,
&
platforms
[
0
],
&
numPlatforms
);
ASSERT_EQ
(
CL_SUCCESS
,
status
)
<<
"clGetPlatformIDs"
;
ASSERT_NE
(
0
,
(
int
)
numPlatforms
);
int
selectedPlatform
=
0
;
cl_platform_id
platform
=
platforms
[
selectedPlatform
];
ASSERT_NE
((
void
*
)
NULL
,
platform
);
cl_device_id
device
=
NULL
;
status
=
::
clGetDeviceIDs
(
platform
,
CL_DEVICE_TYPE_ALL
,
1
,
&
device
,
NULL
);
ASSERT_EQ
(
CL_SUCCESS
,
status
)
<<
"clGetDeviceIDs"
;
ASSERT_NE
((
void
*
)
NULL
,
device
);
cl_context_properties
cps
[
3
]
=
{
CL_CONTEXT_PLATFORM
,
(
cl_context_properties
)(
platform
),
0
};
cl_context
context
=
::
clCreateContext
(
cps
,
1
,
&
device
,
NULL
,
NULL
,
&
status
);
ASSERT_EQ
(
CL_SUCCESS
,
status
)
<<
"clCreateContext"
;
ASSERT_NE
((
void
*
)
NULL
,
context
);
ASSERT_NO_THROW
(
cv
::
ocl
::
initializeContext
(
&
platform
,
&
context
,
&
device
));
status
=
::
clReleaseContext
(
context
);
ASSERT_EQ
(
CL_SUCCESS
,
status
)
<<
"clReleaseContext"
;
#ifdef CL_VERSION_1_2
#if 1
{
cv
::
ocl
::
Context
*
ctx
=
cv
::
ocl
::
Context
::
getContext
();
ASSERT_NE
((
void
*
)
NULL
,
ctx
);
if
(
ctx
->
supportsFeature
(
cv
::
ocl
::
FEATURE_CL_VER_1_2
))
// device supports OpenCL 1.2+
{
status
=
::
clReleaseDevice
(
device
);
ASSERT_EQ
(
CL_SUCCESS
,
status
)
<<
"clReleaseDevice"
;
}
}
#else // code below doesn't work on Linux (SEGFAULTs on 1.1- devices are not handled via exceptions)
try
{
status
=
::
clReleaseDevice
(
device
);
// NOTE This works only with !DEVICES! that supports OpenCL 1.2
(
void
)
status
;
// no check
}
catch
(...)
{
// nothing, there is no problem
}
#endif
#endif
// print the name of current device
cv
::
ocl
::
Context
*
ctx
=
cv
::
ocl
::
Context
::
getContext
();
ASSERT_NE
((
void
*
)
NULL
,
ctx
);
const
cv
::
ocl
::
DeviceInfo
&
deviceInfo
=
ctx
->
getDeviceInfo
();
std
::
cout
<<
"Device name: "
<<
deviceInfo
.
deviceName
<<
std
::
endl
;
std
::
cout
<<
"Platform name: "
<<
deviceInfo
.
platform
->
platformName
<<
std
::
endl
;
ASSERT_EQ
(
context
,
*
(
cl_context
*
)
ctx
->
getOpenCLContextPtr
());
ASSERT_EQ
(
device
,
*
(
cl_device_id
*
)
ctx
->
getOpenCLDeviceIDPtr
());
// do some calculations and check results
cv
::
RNG
rng
;
Size
sz
(
100
,
100
);
cv
::
Mat
srcMat
=
cvtest
::
randomMat
(
rng
,
sz
,
CV_32FC4
,
-
10
,
10
,
false
);
cv
::
Mat
dstMat
;
cv
::
ocl
::
oclMat
srcGpuMat
(
srcMat
);
cv
::
ocl
::
oclMat
dstGpuMat
;
cv
::
Scalar
v
=
cv
::
Scalar
::
all
(
1
);
cv
::
add
(
srcMat
,
v
,
dstMat
);
cv
::
ocl
::
add
(
srcGpuMat
,
v
,
dstGpuMat
);
cv
::
Mat
dstGpuMatMap
;
dstGpuMat
.
download
(
dstGpuMatMap
);
EXPECT_LE
(
checkNorm
(
dstMat
,
dstGpuMatMap
),
1e-3
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment