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
f4cb8c0d
Commit
f4cb8c0d
authored
9 years ago
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #4127 from avershov:opengl-opencl-sample
parents
172c00fa
9dfa9a81
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
829 additions
and
14 deletions
+829
-14
opencl_gl.hpp
...e/opencv2/core/opencl/runtime/autogenerated/opencl_gl.hpp
+58
-0
opencl_gl_wrappers.hpp
.../core/opencl/runtime/autogenerated/opencl_gl_wrappers.hpp
+38
-0
opencl_gl.hpp
...es/core/include/opencv2/core/opencl/runtime/opencl_gl.hpp
+65
-0
opencl_gl_wrappers.hpp
...nclude/opencv2/core/opencl/runtime/opencl_gl_wrappers.hpp
+47
-0
opengl.hpp
modules/core/include/opencv2/core/opengl.hpp
+25
-1
opencl_gl_impl.hpp
.../core/src/opencl/runtime/autogenerated/opencl_gl_impl.hpp
+0
-0
opencl_gl_functions.list
.../opencl/runtime/generator/filter/opencl_gl_functions.list
+11
-0
generate.sh
modules/core/src/opencl/runtime/generator/generate.sh
+2
-0
parser_cl.py
modules/core/src/opencl/runtime/generator/parser_cl.py
+22
-12
opencl_gl.hpp.in
...re/src/opencl/runtime/generator/template/opencl_gl.hpp.in
+15
-0
opencl_gl_impl.hpp.in
...c/opencl/runtime/generator/template/opencl_gl_impl.hpp.in
+11
-0
opencl_gl_wrappers.hpp.in
...encl/runtime/generator/template/opencl_gl_wrappers.hpp.in
+5
-0
opencl_core.cpp
modules/core/src/opencl/runtime/opencl_core.cpp
+26
-0
opengl.cpp
modules/core/src/opengl.cpp
+234
-1
CMakeLists.txt
samples/CMakeLists.txt
+4
-0
CMakeLists.txt
samples/opengl/CMakeLists.txt
+45
-0
opengl_interop.cpp
samples/opengl/opengl_interop.cpp
+0
-0
winapp.hpp
samples/opengl/winapp.hpp
+221
-0
No files found.
modules/core/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl.hpp
0 → 100644
View file @
f4cb8c0d
//
// AUTOGENERATED, DO NOT EDIT
//
#ifndef __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP__
#error "Invalid usage"
#endif
// generated by parser_cl.py
#define clCreateFromGLBuffer clCreateFromGLBuffer_
#define clCreateFromGLRenderbuffer clCreateFromGLRenderbuffer_
#define clCreateFromGLTexture clCreateFromGLTexture_
#define clCreateFromGLTexture2D clCreateFromGLTexture2D_
#define clCreateFromGLTexture3D clCreateFromGLTexture3D_
#define clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects_
#define clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects_
#define clGetGLContextInfoKHR clGetGLContextInfoKHR_
#define clGetGLObjectInfo clGetGLObjectInfo_
#define clGetGLTextureInfo clGetGLTextureInfo_
#if defined __APPLE__
#include <OpenCL/cl_gl.h>
#else
#include <CL/cl_gl.h>
#endif
// generated by parser_cl.py
#undef clCreateFromGLBuffer
#define clCreateFromGLBuffer clCreateFromGLBuffer_pfn
#undef clCreateFromGLRenderbuffer
#define clCreateFromGLRenderbuffer clCreateFromGLRenderbuffer_pfn
#undef clCreateFromGLTexture
#define clCreateFromGLTexture clCreateFromGLTexture_pfn
#undef clCreateFromGLTexture2D
#define clCreateFromGLTexture2D clCreateFromGLTexture2D_pfn
#undef clCreateFromGLTexture3D
#define clCreateFromGLTexture3D clCreateFromGLTexture3D_pfn
#undef clEnqueueAcquireGLObjects
#define clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects_pfn
#undef clEnqueueReleaseGLObjects
#define clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects_pfn
#undef clGetGLContextInfoKHR
#define clGetGLContextInfoKHR clGetGLContextInfoKHR_pfn
#undef clGetGLObjectInfo
#define clGetGLObjectInfo clGetGLObjectInfo_pfn
#undef clGetGLTextureInfo
#define clGetGLTextureInfo clGetGLTextureInfo_pfn
// generated by parser_cl.py
extern
CL_RUNTIME_EXPORT
cl_mem
(
CL_API_CALL
*
clCreateFromGLBuffer
)(
cl_context
,
cl_mem_flags
,
cl_GLuint
,
int
*
);
extern
CL_RUNTIME_EXPORT
cl_mem
(
CL_API_CALL
*
clCreateFromGLRenderbuffer
)(
cl_context
,
cl_mem_flags
,
cl_GLuint
,
cl_int
*
);
extern
CL_RUNTIME_EXPORT
cl_mem
(
CL_API_CALL
*
clCreateFromGLTexture
)(
cl_context
,
cl_mem_flags
,
cl_GLenum
,
cl_GLint
,
cl_GLuint
,
cl_int
*
);
extern
CL_RUNTIME_EXPORT
cl_mem
(
CL_API_CALL
*
clCreateFromGLTexture2D
)(
cl_context
,
cl_mem_flags
,
cl_GLenum
,
cl_GLint
,
cl_GLuint
,
cl_int
*
);
extern
CL_RUNTIME_EXPORT
cl_mem
(
CL_API_CALL
*
clCreateFromGLTexture3D
)(
cl_context
,
cl_mem_flags
,
cl_GLenum
,
cl_GLint
,
cl_GLuint
,
cl_int
*
);
extern
CL_RUNTIME_EXPORT
cl_int
(
CL_API_CALL
*
clEnqueueAcquireGLObjects
)(
cl_command_queue
,
cl_uint
,
const
cl_mem
*
,
cl_uint
,
const
cl_event
*
,
cl_event
*
);
extern
CL_RUNTIME_EXPORT
cl_int
(
CL_API_CALL
*
clEnqueueReleaseGLObjects
)(
cl_command_queue
,
cl_uint
,
const
cl_mem
*
,
cl_uint
,
const
cl_event
*
,
cl_event
*
);
extern
CL_RUNTIME_EXPORT
cl_int
(
CL_API_CALL
*
clGetGLContextInfoKHR
)(
const
cl_context_properties
*
,
cl_gl_context_info
,
size_t
,
void
*
,
size_t
*
);
extern
CL_RUNTIME_EXPORT
cl_int
(
CL_API_CALL
*
clGetGLObjectInfo
)(
cl_mem
,
cl_gl_object_type
*
,
cl_GLuint
*
);
extern
CL_RUNTIME_EXPORT
cl_int
(
CL_API_CALL
*
clGetGLTextureInfo
)(
cl_mem
,
cl_gl_texture_info
,
size_t
,
void
*
,
size_t
*
);
This diff is collapsed.
Click to expand it.
modules/core/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl_wrappers.hpp
0 → 100644
View file @
f4cb8c0d
//
// AUTOGENERATED, DO NOT EDIT
//
#ifndef __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP__
#error "Invalid usage"
#endif
// generated by parser_cl.py
#undef clCreateFromGLBuffer
#define clCreateFromGLBuffer clCreateFromGLBuffer_fn
inline
cl_mem
clCreateFromGLBuffer
(
cl_context
p0
,
cl_mem_flags
p1
,
cl_GLuint
p2
,
int
*
p3
)
{
return
clCreateFromGLBuffer_pfn
(
p0
,
p1
,
p2
,
p3
);
}
#undef clCreateFromGLRenderbuffer
#define clCreateFromGLRenderbuffer clCreateFromGLRenderbuffer_fn
inline
cl_mem
clCreateFromGLRenderbuffer
(
cl_context
p0
,
cl_mem_flags
p1
,
cl_GLuint
p2
,
cl_int
*
p3
)
{
return
clCreateFromGLRenderbuffer_pfn
(
p0
,
p1
,
p2
,
p3
);
}
#undef clCreateFromGLTexture
#define clCreateFromGLTexture clCreateFromGLTexture_fn
inline
cl_mem
clCreateFromGLTexture
(
cl_context
p0
,
cl_mem_flags
p1
,
cl_GLenum
p2
,
cl_GLint
p3
,
cl_GLuint
p4
,
cl_int
*
p5
)
{
return
clCreateFromGLTexture_pfn
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
);
}
#undef clCreateFromGLTexture2D
#define clCreateFromGLTexture2D clCreateFromGLTexture2D_fn
inline
cl_mem
clCreateFromGLTexture2D
(
cl_context
p0
,
cl_mem_flags
p1
,
cl_GLenum
p2
,
cl_GLint
p3
,
cl_GLuint
p4
,
cl_int
*
p5
)
{
return
clCreateFromGLTexture2D_pfn
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
);
}
#undef clCreateFromGLTexture3D
#define clCreateFromGLTexture3D clCreateFromGLTexture3D_fn
inline
cl_mem
clCreateFromGLTexture3D
(
cl_context
p0
,
cl_mem_flags
p1
,
cl_GLenum
p2
,
cl_GLint
p3
,
cl_GLuint
p4
,
cl_int
*
p5
)
{
return
clCreateFromGLTexture3D_pfn
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
);
}
#undef clEnqueueAcquireGLObjects
#define clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects_fn
inline
cl_int
clEnqueueAcquireGLObjects
(
cl_command_queue
p0
,
cl_uint
p1
,
const
cl_mem
*
p2
,
cl_uint
p3
,
const
cl_event
*
p4
,
cl_event
*
p5
)
{
return
clEnqueueAcquireGLObjects_pfn
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
);
}
#undef clEnqueueReleaseGLObjects
#define clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects_fn
inline
cl_int
clEnqueueReleaseGLObjects
(
cl_command_queue
p0
,
cl_uint
p1
,
const
cl_mem
*
p2
,
cl_uint
p3
,
const
cl_event
*
p4
,
cl_event
*
p5
)
{
return
clEnqueueReleaseGLObjects_pfn
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
);
}
#undef clGetGLContextInfoKHR
#define clGetGLContextInfoKHR clGetGLContextInfoKHR_fn
inline
cl_int
clGetGLContextInfoKHR
(
const
cl_context_properties
*
p0
,
cl_gl_context_info
p1
,
size_t
p2
,
void
*
p3
,
size_t
*
p4
)
{
return
clGetGLContextInfoKHR_pfn
(
p0
,
p1
,
p2
,
p3
,
p4
);
}
#undef clGetGLObjectInfo
#define clGetGLObjectInfo clGetGLObjectInfo_fn
inline
cl_int
clGetGLObjectInfo
(
cl_mem
p0
,
cl_gl_object_type
*
p1
,
cl_GLuint
*
p2
)
{
return
clGetGLObjectInfo_pfn
(
p0
,
p1
,
p2
);
}
#undef clGetGLTextureInfo
#define clGetGLTextureInfo clGetGLTextureInfo_fn
inline
cl_int
clGetGLTextureInfo
(
cl_mem
p0
,
cl_gl_texture_info
p1
,
size_t
p2
,
void
*
p3
,
size_t
*
p4
)
{
return
clGetGLTextureInfo_pfn
(
p0
,
p1
,
p2
,
p3
,
p4
);
}
This diff is collapsed.
Click to expand it.
modules/core/include/opencv2/core/opencl/runtime/opencl_gl.hpp
0 → 100644
View file @
f4cb8c0d
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the OpenCV Foundation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP__
#define __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP__
#if defined HAVE_OPENCL && defined HAVE_OPENGL
#include "opencl_core.hpp"
#if defined(HAVE_OPENCL_STATIC)
#if defined __APPLE__
#include <OpenCL/cl_gl.h>
#else
#include <CL/cl_gl.h>
#endif
#else // HAVE_OPENCL_STATIC
#include "autogenerated/opencl_gl.hpp"
#endif // HAVE_OPENCL_STATIC
#endif // defined HAVE_OPENCL && defined HAVE_OPENGL
#endif // __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP__
This diff is collapsed.
Click to expand it.
modules/core/include/opencv2/core/opencl/runtime/opencl_gl_wrappers.hpp
0 → 100644
View file @
f4cb8c0d
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the OpenCV Foundation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP__
#define __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP__
#include "autogenerated/opencl_gl_wrappers.hpp"
#endif // __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP__
This diff is collapsed.
Click to expand it.
modules/core/include/opencv2/core/opengl.hpp
View file @
f4cb8c0d
...
...
@@ -48,6 +48,7 @@
#endif
#include "opencv2/core.hpp"
#include "ocl.hpp"
namespace
cv
{
namespace
ogl
{
...
...
@@ -511,7 +512,30 @@ CV_EXPORTS void render(const Arrays& arr, int mode = POINTS, Scalar color = Scal
*/
CV_EXPORTS
void
render
(
const
Arrays
&
arr
,
InputArray
indices
,
int
mode
=
POINTS
,
Scalar
color
=
Scalar
::
all
(
255
));
//! @} core_opengl
/////////////////// CL-GL Interoperability Functions ///////////////////
namespace
ocl
{
using
namespace
cv
::
ocl
;
// TODO static functions in the Context class
/** @brief Creates OpenCL context from GL.
@return Returns reference to OpenCL Context
*/
CV_EXPORTS
Context
&
initializeContextFromGL
();
}
// namespace cv::ogl::ocl
/** @brief Converts InputArray to Texture2D object.
@param src - source InputArray.
@param texture - destination Texture2D object.
*/
CV_EXPORTS
void
convertToGLTexture2D
(
InputArray
src
,
Texture2D
&
texture
);
/** @brief Converts Texture2D object to OutputArray.
@param texture - source Texture2D object.
@param dst - destination OutputArray.
*/
CV_EXPORTS
void
convertFromGLTexture2D
(
const
Texture2D
&
texture
,
OutputArray
dst
);
}}
// namespace cv::ogl
...
...
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/autogenerated/opencl_gl_impl.hpp
0 → 100644
View file @
f4cb8c0d
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/generator/filter/opencl_gl_functions.list
0 → 100644
View file @
f4cb8c0d
clCreateFromGLBuffer
clCreateFromGLRenderbuffer
clCreateFromGLTexture
clCreateFromGLTexture2D
clCreateFromGLTexture3D
clEnqueueAcquireGLObjects
clEnqueueReleaseGLObjects
clGetGLContextInfoKHR
clGetGLObjectInfo
clGetGLTextureInfo
#total 10
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/generator/generate.sh
View file @
f4cb8c0d
...
...
@@ -3,4 +3,6 @@ echo "Generate files for CL runtime..."
python parser_cl.py opencl_core < sources/cl.h
python parser_clamdblas.py < sources/clAmdBlas.h
python parser_clamdfft.py < sources/clAmdFft.h
python parser_cl.py opencl_gl < sources/cl_gl.h
echo
"Generate files for CL runtime... Done"
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/generator/parser_cl.py
View file @
f4cb8c0d
...
...
@@ -8,9 +8,10 @@ from common import remove_comments, getTokens, getParameters, postProcessParamet
try
:
if
len
(
sys
.
argv
)
>
1
:
outfile
=
open
(
'../../../../include/opencv2/core/opencl/runtime/autogenerated/'
+
sys
.
argv
[
1
]
+
'.hpp'
,
'wb'
)
outfile_impl
=
open
(
'../autogenerated/'
+
sys
.
argv
[
1
]
+
'_impl.hpp'
,
'wb'
)
outfile_wrappers
=
open
(
'../../../../include/opencv2/core/opencl/runtime/autogenerated/'
+
sys
.
argv
[
1
]
+
'_wrappers.hpp'
,
'wb'
)
module_name
=
sys
.
argv
[
1
]
outfile
=
open
(
'../../../../include/opencv2/core/opencl/runtime/autogenerated/
%
s.hpp'
%
module_name
,
'wb'
)
outfile_impl
=
open
(
'../autogenerated/
%
s_impl.hpp'
%
module_name
,
'wb'
)
outfile_wrappers
=
open
(
'../../../../include/opencv2/core/opencl/runtime/autogenerated/
%
s_wrappers.hpp'
%
module_name
,
'wb'
)
if
len
(
sys
.
argv
)
>
2
:
f
=
open
(
sys
.
argv
[
2
],
"r"
)
else
:
...
...
@@ -95,7 +96,7 @@ pprint(fns)
from
common
import
*
filterFileName
=
'./filter/opencl_core_functions.list'
filterFileName
=
'./filter/
%
s_functions.list'
%
module_name
numEnabled
=
readFunctionFilter
(
fns
,
filterFileName
)
functionsFilter
=
generateFilterNames
(
fns
)
...
...
@@ -108,18 +109,27 @@ ctx['CL_REMAP_DYNAMIC'] = generateRemapDynamic(fns)
ctx
[
'CL_FN_DECLARATIONS'
]
=
generateFnDeclaration
(
fns
)
sys
.
stdout
=
outfile
ProcessTemplate
(
'template/
opencl_core.hpp.in'
,
ctx
)
ProcessTemplate
(
'template/
%
s.hpp.in'
%
module_name
,
ctx
)
ctx
[
'CL_FN_INLINE_WRAPPERS'
]
=
generateInlineWrappers
(
fns
)
sys
.
stdout
=
outfile_wrappers
ProcessTemplate
(
'template/opencl_core_wrappers.hpp.in'
,
ctx
)
ctx
[
'CL_FN_ENTRY_DEFINITIONS'
]
=
generateStructDefinitions
(
fns
)
ctx
[
'CL_FN_ENTRY_LIST'
]
=
generateListOfDefinitions
(
fns
)
ctx
[
'CL_FN_ENUMS'
]
=
generateEnums
(
fns
)
ctx
[
'CL_FN_SWITCH'
]
=
generateTemplates
(
15
,
'opencl_fn'
,
'opencl_check_fn'
,
'CL_API_CALL'
)
ProcessTemplate
(
'template/
%
s_wrappers.hpp.in'
%
module_name
,
ctx
)
if
module_name
==
'opencl_core'
:
ctx
[
'CL_FN_ENTRY_DEFINITIONS'
]
=
generateStructDefinitions
(
fns
)
ctx
[
'CL_FN_ENTRY_LIST'
]
=
generateListOfDefinitions
(
fns
)
ctx
[
'CL_FN_ENUMS'
]
=
generateEnums
(
fns
)
ctx
[
'CL_FN_SWITCH'
]
=
generateTemplates
(
15
,
'opencl_fn'
,
'opencl_check_fn'
,
'CL_API_CALL'
)
else
:
lprefix
=
module_name
+
'_fn'
enumprefix
=
module_name
.
upper
()
+
'_FN'
fn_list_name
=
module_name
+
'_fn_list'
ctx
[
'CL_FN_ENTRY_DEFINITIONS'
]
=
generateStructDefinitions
(
fns
,
lprefix
=
lprefix
,
enumprefix
=
enumprefix
)
ctx
[
'CL_FN_ENTRY_LIST'
]
=
generateListOfDefinitions
(
fns
,
fn_list_name
)
ctx
[
'CL_FN_ENUMS'
]
=
generateEnums
(
fns
,
prefix
=
enumprefix
)
ctx
[
'CL_FN_SWITCH'
]
=
generateTemplates
(
15
,
lprefix
,
'
%
s_check_fn'
%
module_name
,
'CL_API_CALL'
)
ctx
[
'CL_NUMBER_OF_ENABLED_FUNCTIONS'
]
=
'// number of enabled functions:
%
d'
%
(
numEnabled
)
sys
.
stdout
=
outfile_impl
ProcessTemplate
(
'template/
opencl_core_impl.hpp.in'
,
ctx
)
ProcessTemplate
(
'template/
%
s_impl.hpp.in'
%
module_name
,
ctx
)
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/generator/template/opencl_gl.hpp.in
0 → 100644
View file @
f4cb8c0d
#ifndef __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP__
#error "Invalid usage"
#endif
@CL_REMAP_ORIGIN@
#if defined __APPLE__
#include <OpenCL/cl_gl.h>
#else
#include <CL/cl_gl.h>
#endif
@CL_REMAP_DYNAMIC@
@CL_FN_DECLARATIONS@
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/generator/template/opencl_gl_impl.hpp.in
0 → 100644
View file @
f4cb8c0d
@CL_FN_ENUMS@
namespace {
@CL_FN_SWITCH@
} // anonymous namespace
@CL_FN_ENTRY_DEFINITIONS@
@CL_FN_ENTRY_LIST@
@CL_NUMBER_OF_ENABLED_FUNCTIONS@
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/generator/template/opencl_gl_wrappers.hpp.in
0 → 100644
View file @
f4cb8c0d
#ifndef __OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP__
#error "Invalid usage"
#endif
@CL_FN_INLINE_WRAPPERS@
This diff is collapsed.
Click to expand it.
modules/core/src/opencl/runtime/opencl_core.cpp
View file @
f4cb8c0d
...
...
@@ -279,4 +279,30 @@ static void* opencl_check_fn(int ID)
return
func
;
}
#ifdef HAVE_OPENGL
#include "opencv2/core/opencl/runtime/opencl_gl.hpp"
static
void
*
opencl_gl_check_fn
(
int
ID
);
#include "autogenerated/opencl_gl_impl.hpp"
static
void
*
opencl_gl_check_fn
(
int
ID
)
{
const
struct
DynamicFnEntry
*
e
=
NULL
;
assert
(
ID
>=
0
&&
ID
<
(
int
)(
sizeof
(
opencl_gl_fn_list
)
/
sizeof
(
opencl_gl_fn_list
[
0
])));
e
=
opencl_gl_fn_list
[
ID
];
void
*
func
=
CV_CL_GET_PROC_ADDRESS
(
e
->
fnName
);
if
(
!
func
)
{
throw
cv
::
Exception
(
cv
::
Error
::
OpenCLApiCallError
,
cv
::
format
(
"OpenCL function is not available: [%s]"
,
e
->
fnName
),
CV_Func
,
__FILE__
,
__LINE__
);
}
*
(
e
->
ppFn
)
=
func
;
return
func
;
}
#endif // HAVE_OPENGL
#endif
This diff is collapsed.
Click to expand it.
modules/core/src/opengl.cpp
View file @
f4cb8c0d
...
...
@@ -47,7 +47,9 @@
# ifdef HAVE_CUDA
# include <cuda_gl_interop.h>
# endif
#endif
#else // HAVE_OPENGL
# define NO_OPENGL_SUPPORT_ERROR CV_ErrorNoReturn(cv::Error::StsBadFunc, "OpenCV was build without OpenGL support")
#endif // HAVE_OPENGL
using
namespace
cv
;
using
namespace
cv
::
cuda
;
...
...
@@ -1572,3 +1574,234 @@ void cv::ogl::render(const ogl::Arrays& arr, InputArray indices, int mode, Scala
}
#endif
}
////////////////////////////////////////////////////////////////////////
// CL-GL Interoperability
#ifdef HAVE_OPENCL
# include "opencv2/core/opencl/runtime/opencl_gl.hpp"
#else // HAVE_OPENCL
# define NO_OPENCL_SUPPORT_ERROR CV_ErrorNoReturn(cv::Error::StsBadFunc, "OpenCV was build without OpenCL support")
#endif // HAVE_OPENCL
#if defined(HAVE_OPENGL)
# if defined(ANDROID)
# include <EGL/egl.h>
# elif defined(__linux__)
# include <GL/glx.h>
# endif
#endif // HAVE_OPENGL
namespace
cv
{
namespace
ogl
{
namespace
ocl
{
Context
&
initializeContextFromGL
()
{
#if !defined(HAVE_OPENGL)
NO_OPENGL_SUPPORT_ERROR
;
#elif !defined(HAVE_OPENCL)
NO_OPENCL_SUPPORT_ERROR
;
#else
cl_uint
numPlatforms
;
cl_int
status
=
clGetPlatformIDs
(
0
,
NULL
,
&
numPlatforms
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLInitError
,
"OpenCL: Can't get number of platforms"
);
if
(
numPlatforms
==
0
)
CV_Error
(
cv
::
Error
::
OpenCLInitError
,
"OpenCL: No available platforms"
);
std
::
vector
<
cl_platform_id
>
platforms
(
numPlatforms
);
status
=
clGetPlatformIDs
(
numPlatforms
,
&
platforms
[
0
],
NULL
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLInitError
,
"OpenCL: Can't get number of platforms"
);
// TODO Filter platforms by name from OPENCV_OPENCL_DEVICE
int
found
=
-
1
;
cl_device_id
device
=
NULL
;
cl_context
context
=
NULL
;
for
(
int
i
=
0
;
i
<
(
int
)
numPlatforms
;
i
++
)
{
// query platform extension: presence of "cl_khr_gl_sharing" extension is requred
{
AutoBuffer
<
char
>
extensionStr
;
size_t
extensionSize
;
status
=
clGetPlatformInfo
(
platforms
[
i
],
CL_PLATFORM_EXTENSIONS
,
0
,
NULL
,
&
extensionSize
);
if
(
status
==
CL_SUCCESS
)
{
extensionStr
.
allocate
(
extensionSize
+
1
);
status
=
clGetPlatformInfo
(
platforms
[
i
],
CL_PLATFORM_EXTENSIONS
,
extensionSize
,
(
char
*
)
extensionStr
,
NULL
);
}
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLInitError
,
"OpenCL: Can't get platform extension string"
);
if
(
!
strstr
((
const
char
*
)
extensionStr
,
"cl_khr_gl_sharing"
))
continue
;
}
clGetGLContextInfoKHR_fn
clGetGLContextInfoKHR
=
(
clGetGLContextInfoKHR_fn
)
clGetExtensionFunctionAddressForPlatform
(
platforms
[
i
],
"clGetGLContextInfoKHR"
);
if
(
!
clGetGLContextInfoKHR
)
continue
;
cl_context_properties
properties
[]
=
{
#if defined(WIN32) || defined(_WIN32)
CL_CONTEXT_PLATFORM
,
(
cl_context_properties
)
platforms
[
i
],
CL_GL_CONTEXT_KHR
,
(
cl_context_properties
)
wglGetCurrentContext
(),
CL_WGL_HDC_KHR
,
(
cl_context_properties
)
wglGetCurrentDC
(),
#elif defined(ANDROID)
CL_CONTEXT_PLATFORM
,
(
cl_context_properties
)
platforms
[
i
],
CL_GL_CONTEXT_KHR
,
(
cl_context_properties
)
eglGetCurrentContext
(),
CL_EGL_DISPLAY_KHR
,
(
cl_context_properties
)
eglGetCurrentDisplay
(),
#elif defined(__linux__)
CL_CONTEXT_PLATFORM
,
(
cl_context_properties
)
platforms
[
i
],
CL_GL_CONTEXT_KHR
,
(
cl_context_properties
)
glXGetCurrentContext
(),
CL_GLX_DISPLAY_KHR
,
(
cl_context_properties
)
glXGetCurrentDisplay
(),
#endif
0
};
// query device
device
=
NULL
;
status
=
clGetGLContextInfoKHR
(
properties
,
CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR
,
sizeof
(
cl_device_id
),
(
void
*
)
&
device
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
continue
;
// create context
context
=
clCreateContext
(
properties
,
1
,
&
device
,
NULL
,
NULL
,
&
status
);
if
(
status
!=
CL_SUCCESS
)
{
clReleaseDevice
(
device
);
}
else
{
found
=
i
;
break
;
}
}
if
(
found
<
0
)
CV_Error
(
cv
::
Error
::
OpenCLInitError
,
"OpenCL: Can't create context for OpenGL interop"
);
Context
&
ctx
=
Context
::
getDefault
(
false
);
initializeContextFromHandle
(
ctx
,
platforms
[
found
],
context
,
device
);
return
ctx
;
#endif
}
}
// namespace cv::ogl::ocl
void
convertToGLTexture2D
(
InputArray
src
,
Texture2D
&
texture
)
{
(
void
)
src
;
(
void
)
texture
;
#if !defined(HAVE_OPENGL)
NO_OPENGL_SUPPORT_ERROR
;
#elif !defined(HAVE_OPENCL)
NO_OPENCL_SUPPORT_ERROR
;
#else
Size
srcSize
=
src
.
size
();
CV_Assert
(
srcSize
.
width
==
(
int
)
texture
.
cols
()
&&
srcSize
.
height
==
(
int
)
texture
.
rows
());
using
namespace
cv
::
ocl
;
Context
&
ctx
=
Context
::
getDefault
();
cl_context
context
=
(
cl_context
)
ctx
.
ptr
();
UMat
u
=
src
.
getUMat
();
// TODO Add support for roi
CV_Assert
(
u
.
offset
==
0
);
CV_Assert
(
u
.
isContinuous
());
cl_int
status
=
0
;
cl_mem
clImage
=
clCreateFromGLTexture
(
context
,
CL_MEM_WRITE_ONLY
,
gl
::
TEXTURE_2D
,
0
,
texture
.
texId
(),
&
status
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clCreateFromGLTexture failed"
);
cl_mem
clBuffer
=
(
cl_mem
)
u
.
handle
(
ACCESS_READ
);
cl_command_queue
q
=
(
cl_command_queue
)
Queue
::
getDefault
().
ptr
();
status
=
clEnqueueAcquireGLObjects
(
q
,
1
,
&
clImage
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clEnqueueAcquireGLObjects failed"
);
size_t
offset
=
0
;
// TODO
size_t
dst_origin
[
3
]
=
{
0
,
0
,
0
};
size_t
region
[
3
]
=
{
u
.
cols
,
u
.
rows
,
1
};
status
=
clEnqueueCopyBufferToImage
(
q
,
clBuffer
,
clImage
,
offset
,
dst_origin
,
region
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clEnqueueCopyBufferToImage failed"
);
status
=
clEnqueueReleaseGLObjects
(
q
,
1
,
&
clImage
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clEnqueueReleaseGLObjects failed"
);
status
=
clFinish
(
q
);
// TODO Use events
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clFinish failed"
);
status
=
clReleaseMemObject
(
clImage
);
// TODO RAII
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clReleaseMemObject failed"
);
#endif
}
void
convertFromGLTexture2D
(
const
Texture2D
&
texture
,
OutputArray
dst
)
{
(
void
)
texture
;
(
void
)
dst
;
#if !defined(HAVE_OPENGL)
NO_OPENGL_SUPPORT_ERROR
;
#elif !defined(HAVE_OPENCL)
NO_OPENCL_SUPPORT_ERROR
;
#else
// check texture format
const
int
dtype
=
CV_8UC4
;
CV_Assert
(
texture
.
format
()
==
Texture2D
::
RGBA
);
int
textureType
=
dtype
;
CV_Assert
(
textureType
>=
0
);
using
namespace
cv
::
ocl
;
Context
&
ctx
=
Context
::
getDefault
();
cl_context
context
=
(
cl_context
)
ctx
.
ptr
();
// TODO Need to specify ACCESS_WRITE here somehow to prevent useless data copying!
dst
.
create
(
texture
.
size
(),
textureType
);
UMat
u
=
dst
.
getUMat
();
// TODO Add support for roi
CV_Assert
(
u
.
offset
==
0
);
CV_Assert
(
u
.
isContinuous
());
cl_int
status
=
0
;
cl_mem
clImage
=
clCreateFromGLTexture
(
context
,
CL_MEM_READ_ONLY
,
gl
::
TEXTURE_2D
,
0
,
texture
.
texId
(),
&
status
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clCreateFromGLTexture failed"
);
cl_mem
clBuffer
=
(
cl_mem
)
u
.
handle
(
ACCESS_READ
);
cl_command_queue
q
=
(
cl_command_queue
)
Queue
::
getDefault
().
ptr
();
status
=
clEnqueueAcquireGLObjects
(
q
,
1
,
&
clImage
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clEnqueueAcquireGLObjects failed"
);
size_t
offset
=
0
;
// TODO
size_t
src_origin
[
3
]
=
{
0
,
0
,
0
};
size_t
region
[
3
]
=
{
u
.
cols
,
u
.
rows
,
1
};
status
=
clEnqueueCopyImageToBuffer
(
q
,
clImage
,
clBuffer
,
src_origin
,
region
,
offset
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clEnqueueCopyImageToBuffer failed"
);
status
=
clEnqueueReleaseGLObjects
(
q
,
1
,
&
clImage
,
0
,
NULL
,
NULL
);
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clEnqueueReleaseGLObjects failed"
);
status
=
clFinish
(
q
);
// TODO Use events
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clFinish failed"
);
status
=
clReleaseMemObject
(
clImage
);
// TODO RAII
if
(
status
!=
CL_SUCCESS
)
CV_Error
(
cv
::
Error
::
OpenCLApiCallError
,
"OpenCL: clReleaseMemObject failed"
);
#endif
}
}}
// namespace cv::ogl
This diff is collapsed.
Click to expand it.
samples/CMakeLists.txt
View file @
f4cb8c0d
...
...
@@ -18,6 +18,10 @@ if(WIN32 AND HAVE_DIRECTX)
add_subdirectory
(
directx
)
endif
()
if
((
NOT ANDROID
)
AND HAVE_OPENGL
)
add_subdirectory
(
opengl
)
endif
()
if
(
ANDROID AND BUILD_ANDROID_EXAMPLES
)
add_subdirectory
(
android
)
endif
()
...
...
This diff is collapsed.
Click to expand it.
samples/opengl/CMakeLists.txt
0 → 100644
View file @
f4cb8c0d
SET
(
OPENCV_OPENGL_SAMPLES_REQUIRED_DEPS opencv_core opencv_imgproc opencv_imgcodecs opencv_videoio opencv_highgui
)
ocv_check_dependencies
(
${
OPENCV_OPENGL_SAMPLES_REQUIRED_DEPS
}
)
if
(
BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND
)
set
(
project
"opengl"
)
string
(
TOUPPER
"
${
project
}
"
project_upper
)
project
(
"
${
project
}
_samples"
)
ocv_include_modules_recurse
(
${
OPENCV_OPENGL_SAMPLES_REQUIRED_DEPS
}
)
# ---------------------------------------------
# Define executable targets
# ---------------------------------------------
MACRO
(
OPENCV_DEFINE_OPENGL_EXAMPLE name srcs
)
set
(
the_target
"example_
${
project
}
_
${
name
}
"
)
add_executable
(
${
the_target
}
${
srcs
}
)
ocv_target_link_libraries
(
${
the_target
}
${
OPENCV_LINKER_LIBS
}
${
OPENCV_OPENGL_SAMPLES_REQUIRED_DEPS
}
)
set_target_properties
(
${
the_target
}
PROPERTIES
OUTPUT_NAME
"
${
project
}
-example-
${
name
}
"
PROJECT_LABEL
"(EXAMPLE_
${
project_upper
}
)
${
name
}
"
)
if
(
ENABLE_SOLUTION_FOLDERS
)
set_target_properties
(
${
the_target
}
PROPERTIES FOLDER
"samples//
${
project
}
"
)
endif
()
if
(
WIN32
)
if
(
MSVC AND NOT BUILD_SHARED_LIBS
)
set_target_properties
(
${
the_target
}
PROPERTIES LINK_FLAGS
"/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG"
)
endif
()
install
(
TARGETS
${
the_target
}
RUNTIME DESTINATION
"
${
OPENCV_SAMPLES_BIN_INSTALL_PATH
}
/
${
project
}
"
COMPONENT samples
)
endif
()
ENDMACRO
()
file
(
GLOB all_samples RELATIVE
${
CMAKE_CURRENT_SOURCE_DIR
}
*.cpp
)
foreach
(
sample_filename
${
all_samples
}
)
get_filename_component
(
sample
${
sample_filename
}
NAME_WE
)
file
(
GLOB sample_srcs RELATIVE
${
CMAKE_CURRENT_SOURCE_DIR
}
${
sample
}
.*
)
OPENCV_DEFINE_OPENGL_EXAMPLE
(
${
sample
}
${
sample_srcs
}
)
endforeach
()
endif
()
This diff is collapsed.
Click to expand it.
samples/opengl/opengl_interop.cpp
0 → 100644
View file @
f4cb8c0d
This diff is collapsed.
Click to expand it.
samples/opengl/winapp.hpp
0 → 100644
View file @
f4cb8c0d
#if defined(WIN32) || defined(_WIN32)
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
#elif defined(__linux__)
# include <X11/X.h>
# include <X11/Xlib.h>
# include <X11/Xutil.h>
#endif
#include <string>
#include <GL/gl.h>
#if defined(WIN32) || defined(_WIN32)
# include <GL/glu.h>
#elif defined(__linux__)
# include <GL/glx.h>
#endif
#if defined(WIN32) || defined(_WIN32)
# define WINCLASS "WinAppWnd"
#endif
#define SAFE_RELEASE(p) if (p) { p->Release(); p = NULL; }
class
WinApp
{
public
:
WinApp
(
int
width
,
int
height
,
std
::
string
&
window_name
)
{
m_width
=
width
;
m_height
=
height
;
m_window_name
=
window_name
;
#if defined(WIN32) || defined(_WIN32)
m_hInstance
=
::
GetModuleHandle
(
NULL
);
#endif
}
virtual
~
WinApp
()
{
#if defined(WIN32) || defined(_WIN32)
::
UnregisterClass
(
WINCLASS
,
m_hInstance
);
#endif
}
int
create
()
{
#if defined(WIN32) || defined(_WIN32)
WNDCLASSEX
wcex
;
wcex
.
cbSize
=
sizeof
(
WNDCLASSEX
);
wcex
.
style
=
CS_HREDRAW
|
CS_VREDRAW
;
wcex
.
lpfnWndProc
=
&
WinApp
::
StaticWndProc
;
wcex
.
cbClsExtra
=
0
;
wcex
.
cbWndExtra
=
0
;
wcex
.
hInstance
=
m_hInstance
;
wcex
.
hIcon
=
LoadIcon
(
0
,
IDI_APPLICATION
);
wcex
.
hCursor
=
LoadCursor
(
0
,
IDC_ARROW
);
wcex
.
hbrBackground
=
0
;
wcex
.
lpszMenuName
=
0L
;
wcex
.
lpszClassName
=
WINCLASS
;
wcex
.
hIconSm
=
0
;
ATOM
wc
=
::
RegisterClassEx
(
&
wcex
);
RECT
rc
=
{
0
,
0
,
m_width
,
m_height
};
::
AdjustWindowRect
(
&
rc
,
WS_OVERLAPPEDWINDOW
,
false
);
m_hWnd
=
::
CreateWindow
(
(
LPCTSTR
)
wc
,
m_window_name
.
c_str
(),
WS_OVERLAPPEDWINDOW
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
rc
.
right
-
rc
.
left
,
rc
.
bottom
-
rc
.
top
,
NULL
,
NULL
,
m_hInstance
,
(
void
*
)
this
);
if
(
!
m_hWnd
)
return
-
1
;
::
ShowWindow
(
m_hWnd
,
SW_SHOW
);
::
UpdateWindow
(
m_hWnd
);
::
SetFocus
(
m_hWnd
);
#elif defined(__linux__)
m_display
=
XOpenDisplay
(
NULL
);
if
(
m_display
==
NULL
)
{
return
-
1
;
}
m_WM_DELETE_WINDOW
=
XInternAtom
(
m_display
,
"WM_DELETE_WINDOW"
,
False
);
static
GLint
visual_attributes
[]
=
{
GLX_RGBA
,
GLX_DEPTH_SIZE
,
24
,
GLX_DOUBLEBUFFER
,
None
};
m_visual_info
=
glXChooseVisual
(
m_display
,
0
,
visual_attributes
);
if
(
m_visual_info
==
NULL
)
{
XCloseDisplay
(
m_display
);
return
-
2
;
}
Window
root
=
DefaultRootWindow
(
m_display
);
m_event_mask
=
ExposureMask
|
KeyPressMask
;
XSetWindowAttributes
window_attributes
;
window_attributes
.
colormap
=
XCreateColormap
(
m_display
,
root
,
m_visual_info
->
visual
,
AllocNone
);
window_attributes
.
event_mask
=
m_event_mask
;
m_window
=
XCreateWindow
(
m_display
,
root
,
0
,
0
,
m_width
,
m_height
,
0
,
m_visual_info
->
depth
,
InputOutput
,
m_visual_info
->
visual
,
CWColormap
|
CWEventMask
,
&
window_attributes
);
XMapWindow
(
m_display
,
m_window
);
XSetWMProtocols
(
m_display
,
m_window
,
&
m_WM_DELETE_WINDOW
,
1
);
XStoreName
(
m_display
,
m_window
,
m_window_name
.
c_str
());
#endif
return
init
();
}
virtual
void
cleanup
()
{
#if defined(WIN32) || defined(_WIN32)
::
DestroyWindow
(
m_hWnd
);
#elif defined(__linux__)
XDestroyWindow
(
m_display
,
m_window
);
XCloseDisplay
(
m_display
);
#endif
}
#if defined(WIN32) || defined(_WIN32)
virtual
LRESULT
CALLBACK
WndProc
(
HWND
hWnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
=
0
;
#endif
int
run
()
{
#if defined(WIN32) || defined(_WIN32)
MSG
msg
;
::
ZeroMemory
(
&
msg
,
sizeof
(
msg
));
while
(
msg
.
message
!=
WM_QUIT
)
{
if
(
::
PeekMessage
(
&
msg
,
NULL
,
0U
,
0U
,
PM_REMOVE
))
{
::
TranslateMessage
(
&
msg
);
::
DispatchMessage
(
&
msg
);
}
else
{
idle
();
}
}
return
static_cast
<
int
>
(
msg
.
wParam
);
#elif defined(__linux__)
m_end_loop
=
false
;
do
{
XEvent
e
;
if
(
!
XCheckWindowEvent
(
m_display
,
m_window
,
m_event_mask
,
&
e
)
||
!
handle_event
(
e
))
{
idle
();
}
}
while
(
!
m_end_loop
);
#endif
return
0
;
}
protected
:
#if defined(WIN32) || defined(_WIN32)
static
LRESULT
CALLBACK
StaticWndProc
(
HWND
hWnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
WinApp
*
pWnd
;
if
(
message
==
WM_NCCREATE
)
{
LPCREATESTRUCT
pCreateStruct
=
((
LPCREATESTRUCT
)
lParam
);
pWnd
=
(
WinApp
*
)(
pCreateStruct
->
lpCreateParams
);
::
SetWindowLongPtr
(
hWnd
,
GWLP_USERDATA
,
(
LONG_PTR
)
pWnd
);
}
pWnd
=
GetObjectFromWindow
(
hWnd
);
if
(
pWnd
)
return
pWnd
->
WndProc
(
hWnd
,
message
,
wParam
,
lParam
);
else
return
::
DefWindowProc
(
hWnd
,
message
,
wParam
,
lParam
);
}
inline
static
WinApp
*
GetObjectFromWindow
(
HWND
hWnd
)
{
return
(
WinApp
*
)
::
GetWindowLongPtr
(
hWnd
,
GWLP_USERDATA
);
}
#endif
#if defined(__linux__)
virtual
int
handle_event
(
XEvent
&
e
)
=
0
;
#endif
virtual
int
init
()
=
0
;
virtual
int
render
()
=
0
;
virtual
void
idle
()
=
0
;
#if defined(WIN32) || defined(_WIN32)
HINSTANCE
m_hInstance
;
HWND
m_hWnd
;
#elif defined(__linux__)
Display
*
m_display
;
XVisualInfo
*
m_visual_info
;
Window
m_window
;
long
m_event_mask
;
Atom
m_WM_DELETE_WINDOW
;
bool
m_end_loop
;
#endif
int
m_width
;
int
m_height
;
std
::
string
m_window_name
;
};
This diff is collapsed.
Click to expand it.
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