]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | //---------------------------------------------------------------------------// |
2 | // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com> | |
3 | // | |
4 | // Distributed under the Boost Software License, Version 1.0 | |
5 | // See accompanying file LICENSE_1_0.txt or copy at | |
6 | // http://www.boost.org/LICENSE_1_0.txt | |
7 | // | |
8 | // See http://boostorg.github.com/compute for more information. | |
9 | //---------------------------------------------------------------------------// | |
10 | ||
11 | #ifndef BOOST_COMPUTE_EXCEPTION_OPENCL_ERROR_HPP | |
12 | #define BOOST_COMPUTE_EXCEPTION_OPENCL_ERROR_HPP | |
13 | ||
14 | #include <exception> | |
15 | #include <string> | |
16 | #include <sstream> | |
17 | ||
18 | #include <boost/compute/cl.hpp> | |
19 | ||
20 | namespace boost { | |
21 | namespace compute { | |
22 | ||
23 | /// \class opencl_error | |
24 | /// \brief A run-time OpenCL error. | |
25 | /// | |
26 | /// The opencl_error class represents an error returned from an OpenCL | |
27 | /// function. | |
28 | /// | |
29 | /// \see context_error | |
30 | class opencl_error : public std::exception | |
31 | { | |
32 | public: | |
33 | /// Creates a new opencl_error exception object for \p error. | |
34 | explicit opencl_error(cl_int error) throw() | |
35 | : m_error(error), | |
36 | m_error_string(to_string(error)) | |
37 | { | |
38 | } | |
39 | ||
40 | /// Destroys the opencl_error object. | |
41 | ~opencl_error() throw() | |
42 | { | |
43 | } | |
44 | ||
45 | /// Returns the numeric error code. | |
46 | cl_int error_code() const throw() | |
47 | { | |
48 | return m_error; | |
49 | } | |
50 | ||
51 | /// Returns a string description of the error. | |
52 | std::string error_string() const throw() | |
53 | { | |
54 | return m_error_string; | |
55 | } | |
56 | ||
57 | /// Returns a C-string description of the error. | |
58 | const char* what() const throw() | |
59 | { | |
60 | return m_error_string.c_str(); | |
61 | } | |
62 | ||
63 | /// Static function which converts the numeric OpenCL error code \p error | |
64 | /// to a human-readable string. | |
65 | /// | |
66 | /// For example: | |
67 | /// \code | |
68 | /// std::cout << opencl_error::to_string(CL_INVALID_KERNEL_ARGS) << std::endl; | |
69 | /// \endcode | |
70 | /// | |
71 | /// Will print "Invalid Kernel Arguments". | |
72 | /// | |
73 | /// If the error code is unknown (e.g. not a valid OpenCL error), a string | |
74 | /// containing "Unknown OpenCL Error" along with the error number will be | |
75 | /// returned. | |
76 | static std::string to_string(cl_int error) | |
77 | { | |
78 | switch(error){ | |
79 | case CL_SUCCESS: return "Success"; | |
80 | case CL_DEVICE_NOT_FOUND: return "Device Not Found"; | |
81 | case CL_DEVICE_NOT_AVAILABLE: return "Device Not Available"; | |
82 | case CL_COMPILER_NOT_AVAILABLE: return "Compiler Not Available"; | |
83 | case CL_MEM_OBJECT_ALLOCATION_FAILURE: return "Memory Object Allocation Failure"; | |
84 | case CL_OUT_OF_RESOURCES: return "Out of Resources"; | |
85 | case CL_OUT_OF_HOST_MEMORY: return "Out of Host Memory"; | |
86 | case CL_PROFILING_INFO_NOT_AVAILABLE: return "Profiling Information Not Available"; | |
87 | case CL_MEM_COPY_OVERLAP: return "Memory Copy Overlap"; | |
88 | case CL_IMAGE_FORMAT_MISMATCH: return "Image Format Mismatch"; | |
89 | case CL_IMAGE_FORMAT_NOT_SUPPORTED: return "Image Format Not Supported"; | |
90 | case CL_BUILD_PROGRAM_FAILURE: return "Build Program Failure"; | |
91 | case CL_MAP_FAILURE: return "Map Failure"; | |
92 | case CL_INVALID_VALUE: return "Invalid Value"; | |
93 | case CL_INVALID_DEVICE_TYPE: return "Invalid Device Type"; | |
94 | case CL_INVALID_PLATFORM: return "Invalid Platform"; | |
95 | case CL_INVALID_DEVICE: return "Invalid Device"; | |
96 | case CL_INVALID_CONTEXT: return "Invalid Context"; | |
97 | case CL_INVALID_QUEUE_PROPERTIES: return "Invalid Queue Properties"; | |
98 | case CL_INVALID_COMMAND_QUEUE: return "Invalid Command Queue"; | |
99 | case CL_INVALID_HOST_PTR: return "Invalid Host Pointer"; | |
100 | case CL_INVALID_MEM_OBJECT: return "Invalid Memory Object"; | |
101 | case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return "Invalid Image Format Descriptor"; | |
102 | case CL_INVALID_IMAGE_SIZE: return "Invalid Image Size"; | |
103 | case CL_INVALID_SAMPLER: return "Invalid Sampler"; | |
104 | case CL_INVALID_BINARY: return "Invalid Binary"; | |
105 | case CL_INVALID_BUILD_OPTIONS: return "Invalid Build Options"; | |
106 | case CL_INVALID_PROGRAM: return "Invalid Program"; | |
107 | case CL_INVALID_PROGRAM_EXECUTABLE: return "Invalid Program Executable"; | |
108 | case CL_INVALID_KERNEL_NAME: return "Invalid Kernel Name"; | |
109 | case CL_INVALID_KERNEL_DEFINITION: return "Invalid Kernel Definition"; | |
110 | case CL_INVALID_KERNEL: return "Invalid Kernel"; | |
111 | case CL_INVALID_ARG_INDEX: return "Invalid Argument Index"; | |
112 | case CL_INVALID_ARG_VALUE: return "Invalid Argument Value"; | |
113 | case CL_INVALID_ARG_SIZE: return "Invalid Argument Size"; | |
114 | case CL_INVALID_KERNEL_ARGS: return "Invalid Kernel Arguments"; | |
115 | case CL_INVALID_WORK_DIMENSION: return "Invalid Work Dimension"; | |
116 | case CL_INVALID_WORK_GROUP_SIZE: return "Invalid Work Group Size"; | |
117 | case CL_INVALID_WORK_ITEM_SIZE: return "Invalid Work Item Size"; | |
118 | case CL_INVALID_GLOBAL_OFFSET: return "Invalid Global Offset"; | |
119 | case CL_INVALID_EVENT_WAIT_LIST: return "Invalid Event Wait List"; | |
120 | case CL_INVALID_EVENT: return "Invalid Event"; | |
121 | case CL_INVALID_OPERATION: return "Invalid Operation"; | |
122 | case CL_INVALID_GL_OBJECT: return "Invalid GL Object"; | |
123 | case CL_INVALID_BUFFER_SIZE: return "Invalid Buffer Size"; | |
124 | case CL_INVALID_MIP_LEVEL: return "Invalid MIP Level"; | |
125 | case CL_INVALID_GLOBAL_WORK_SIZE: return "Invalid Global Work Size"; | |
b32b8144 | 126 | #ifdef BOOST_COMPUTE_CL_VERSION_1_2 |
7c673cae FG |
127 | case CL_COMPILE_PROGRAM_FAILURE: return "Compile Program Failure"; |
128 | case CL_LINKER_NOT_AVAILABLE: return "Linker Not Available"; | |
129 | case CL_LINK_PROGRAM_FAILURE: return "Link Program Failure"; | |
130 | case CL_DEVICE_PARTITION_FAILED: return "Device Partition Failed"; | |
131 | case CL_KERNEL_ARG_INFO_NOT_AVAILABLE: return "Kernel Argument Info Not Available"; | |
132 | case CL_INVALID_PROPERTY: return "Invalid Property"; | |
133 | case CL_INVALID_IMAGE_DESCRIPTOR: return "Invalid Image Descriptor"; | |
134 | case CL_INVALID_COMPILER_OPTIONS: return "Invalid Compiler Options"; | |
135 | case CL_INVALID_LINKER_OPTIONS: return "Invalid Linker Options"; | |
136 | case CL_INVALID_DEVICE_PARTITION_COUNT: return "Invalid Device Partition Count"; | |
b32b8144 FG |
137 | #endif // BOOST_COMPUTE_CL_VERSION_1_2 |
138 | #ifdef BOOST_COMPUTE_CL_VERSION_2_0 | |
7c673cae FG |
139 | case CL_INVALID_PIPE_SIZE: return "Invalid Pipe Size"; |
140 | case CL_INVALID_DEVICE_QUEUE: return "Invalid Device Queue"; | |
141 | #endif | |
142 | default: { | |
143 | std::stringstream s; | |
144 | s << "Unknown OpenCL Error (" << error << ")"; | |
145 | return s.str(); | |
146 | } | |
147 | } | |
148 | } | |
149 | ||
150 | private: | |
151 | cl_int m_error; | |
152 | std::string m_error_string; | |
153 | }; | |
154 | ||
155 | } // end compute namespace | |
156 | } // end boost namespace | |
157 | ||
158 | #endif // BOOST_COMPUTE_EXCEPTION_OPENCL_ERROR_HPP |