-
Notifications
You must be signed in to change notification settings - Fork 298
Expand file tree
/
Copy pathcuda_gl.hpp
More file actions
340 lines (273 loc) · 7.71 KB
/
Copy pathcuda_gl.hpp
File metadata and controls
340 lines (273 loc) · 7.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
#ifndef _AFJDFJSDFSD_PYCUDA_HEADER_SEEN_CUDA_GL_HPP
#define _AFJDFJSDFSD_PYCUDA_HEADER_SEEN_CUDA_GL_HPP
#include <cuda.hpp>
#if defined(__APPLE__) || defined(MACOSX)
#include <OpenGL/gl.h>
#else /* __APPLE__ */
#include <GL/gl.h>
#endif
#include <cudaGL.h>
namespace pycuda { namespace gl {
// {{{ pre-3.0-style API
inline
void gl_init()
{
CUDAPP_CALL_GUARDED(cuGLInit, ());
PyErr_Warn(
PyExc_DeprecationWarning,
"gl_init() has been deprecated since CUDA 3.0 "
"and PyCUDA 2011.1.");
}
inline
std::shared_ptr<context> make_gl_context(device const &dev, unsigned int flags)
{
CUcontext ctx;
CUDAPP_CALL_GUARDED(cuGLCtxCreate, (&ctx, flags, dev.handle()));
std::shared_ptr<context> result(new context(ctx));
context_stack::get().push(result);
return result;
}
class buffer_object : public context_dependent
{
private:
GLuint m_handle;
bool m_valid;
public:
buffer_object(GLuint handle)
: m_handle(handle), m_valid(true)
{
CUDAPP_CALL_GUARDED(cuGLRegisterBufferObject, (handle));
PyErr_Warn(
PyExc_DeprecationWarning,
"buffer_object has been deprecated since CUDA 3.0 "
"and PyCUDA 2011.1.");
}
~buffer_object()
{
if (m_valid)
unregister();
}
GLuint handle()
{ return m_handle; }
void unregister()
{
if (m_valid)
{
try
{
scoped_context_activation ca(get_context());
CUDAPP_CALL_GUARDED_CLEANUP(cuGLUnregisterBufferObject, (m_handle));
m_valid = false;
}
CUDAPP_CATCH_CLEANUP_ON_DEAD_CONTEXT(buffer_object);
}
else
throw pycuda::error("buffer_object::unregister", CUDA_ERROR_INVALID_HANDLE);
}
};
class buffer_object_mapping : public context_dependent
{
private:
std::shared_ptr<buffer_object> m_buffer_object;
CUdeviceptr m_devptr;
size_t m_size;
bool m_valid;
public:
buffer_object_mapping(
std::shared_ptr<buffer_object> bobj,
CUdeviceptr devptr,
size_t size)
: m_buffer_object(bobj), m_devptr(devptr), m_size(size), m_valid(true)
{
PyErr_Warn(
PyExc_DeprecationWarning,
"buffer_object_mapping has been deprecated since CUDA 3.0 "
"and PyCUDA 2011.1.");
}
~buffer_object_mapping()
{
if (m_valid)
unmap();
}
void unmap()
{
if (m_valid)
{
try
{
scoped_context_activation ca(get_context());
CUDAPP_CALL_GUARDED_CLEANUP(cuGLUnmapBufferObject, (m_buffer_object->handle()));
m_valid = false;
}
CUDAPP_CATCH_CLEANUP_ON_DEAD_CONTEXT(buffer_object_mapping)
}
else
throw pycuda::error("buffer_object_mapping::unmap", CUDA_ERROR_INVALID_HANDLE);
}
CUdeviceptr device_ptr() const
{ return m_devptr; }
size_t size() const
{ return m_size; }
};
inline buffer_object_mapping *map_buffer_object(
std::shared_ptr<buffer_object> bobj)
{
CUdeviceptr devptr;
pycuda_size_t size;
CUDAPP_CALL_GUARDED(cuGLMapBufferObject, (&devptr, &size, bobj->handle()));
PyErr_Warn(
PyExc_DeprecationWarning,
"map_buffer_object has been deprecated since CUDA 3.0 "
"and PyCUDA 2011.1.");
return new buffer_object_mapping(bobj, devptr, size);
}
// }}}
// {{{ new-style (3.0+) API
#if CUDAPP_CUDA_VERSION >= 3000
class registered_object : public context_dependent
{
protected:
GLuint m_gl_handle;
bool m_valid;
CUgraphicsResource m_resource;
public:
registered_object(GLuint gl_handle)
: m_gl_handle(gl_handle), m_valid(true)
{
}
~registered_object()
{
if (m_valid)
unregister();
}
GLuint gl_handle()
{ return m_gl_handle; }
CUgraphicsResource resource()
{ return m_resource; }
void unregister()
{
if (m_valid)
{
try
{
scoped_context_activation ca(get_context());
CUDAPP_CALL_GUARDED_CLEANUP(
cuGraphicsUnregisterResource, (m_resource));
m_valid = false;
}
CUDAPP_CATCH_CLEANUP_ON_DEAD_CONTEXT(registered_object);
}
else
throw pycuda::error("registered_object::unregister",
CUDA_ERROR_INVALID_HANDLE);
}
};
class registered_buffer : public registered_object
{
public:
registered_buffer(GLuint gl_handle,
CUgraphicsMapResourceFlags flags=CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE)
: registered_object(gl_handle)
{
CUDAPP_CALL_GUARDED(cuGraphicsGLRegisterBuffer,
(&m_resource, gl_handle, flags));
}
};
class registered_image : public registered_object
{
public:
registered_image(GLuint gl_handle, GLenum target,
CUgraphicsMapResourceFlags flags=CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE)
: registered_object(gl_handle)
{
CUDAPP_CALL_GUARDED(cuGraphicsGLRegisterImage,
(&m_resource, gl_handle, target, flags));
}
};
class registered_mapping : public context_dependent
{
private:
std::shared_ptr<registered_object> m_object;
std::shared_ptr<stream> m_stream;
bool m_valid;
public:
registered_mapping(
std::shared_ptr<registered_object> robj,
std::shared_ptr<stream> strm)
: m_object(robj), m_stream(strm), m_valid(true)
{ }
~registered_mapping()
{
if (m_valid)
unmap_no_strm();
}
void unmap_no_strm()
{
unmap(m_stream);
}
void unmap(std::shared_ptr<stream> const &strm)
{
CUstream s_handle;
if (!strm.get())
s_handle = 0;
else
s_handle = strm->handle();
if (m_valid)
{
try
{
scoped_context_activation ca(get_context());
CUgraphicsResource res = m_object->resource();
CUDAPP_CALL_GUARDED_CLEANUP(cuGraphicsUnmapResources,
(1, &res, s_handle));
m_valid = false;
}
CUDAPP_CATCH_CLEANUP_ON_DEAD_CONTEXT(registered_mapping)
}
else
throw pycuda::error("registered_mapping::unmap", CUDA_ERROR_INVALID_HANDLE);
}
py::tuple device_ptr_and_size() const
{
CUdeviceptr devptr;
pycuda_size_t size;
CUDAPP_CALL_GUARDED(cuGraphicsResourceGetMappedPointer,
(&devptr, &size, m_object->resource()));
return py::make_tuple(devptr, size);
}
inline
pycuda::array *array(unsigned int index, unsigned int level) const
{
CUarray devptr;
CUDAPP_CALL_GUARDED(cuGraphicsSubResourceGetMappedArray,
(&devptr, m_object->resource(), index, level));
std::unique_ptr<pycuda::array> result(
new pycuda::array(devptr, false));
return result.release();
}
};
inline registered_mapping *map_registered_object(
std::shared_ptr<registered_object> const &robj,
py::object strm_py)
{
CUstream s_handle;
std::shared_ptr<stream> strm_sptr;
if (strm_py.is_none())
{
s_handle = 0;
}
else
{
strm_sptr = strm_py.cast<std::shared_ptr<stream>>();
s_handle = strm_sptr->handle();
}
CUgraphicsResource res = robj->resource();
CUDAPP_CALL_GUARDED(cuGraphicsMapResources,
(1, &res, s_handle));
return new registered_mapping(robj, strm_sptr);
}
#endif
// }}}
} }
#endif
// vim: foldmethod=marker