1 module dcl.gl.context;
2 
3 version(clglinterop):
4 
5 import dcl.base;
6 import dcl.context;
7 import dcl.device;
8 import dcl.platform;
9 import dcl.event;
10 import dcl.commandqueue;
11 
12 import dcl.gl.memory;
13 
14 ///
15 class CLGLContext : CLContext
16 {
17 protected:
18 
19     ///
20     CLGLMemory[] acquired_list;
21 
22 package:
23 
24     ///
25     void registerAcquired( CLGLMemory mem )
26     { acquired_list ~= mem; }
27 
28     ///
29     void unregisterAcquired( CLGLMemory mem )
30     {
31         CLGLMemory[] buf;
32         foreach( elem; acquired_list )
33             if( elem.id != mem.id ) buf ~= elem;
34         acquired_list = buf;
35     }
36 
37 public:
38 
39     ///
40     this( CLPlatform pl )
41     {
42         cl_device_id[32] devices; size_t size;
43         clGetGLContextInfoKHR( getProperties(pl).ptr, CL_DEVICES_FOR_GL_CONTEXT_KHR,
44                               32 * cl_device_id.sizeof, devices.ptr, &size);
45         size /= cl_device_id.sizeof;
46         super( devices[0..size].map!(a=>CLDevice.getFromID(a)).array );
47     }
48 
49     ///
50     void releaseAllToGL( CLCommandQueue queue, CLEvent[] wait_list=[], CLEvent* event=null )
51     {
52         checkCallWL!clEnqueueReleaseGLObjects( queue.id,
53                 cast(uint)acquired_list.length,
54                 getIDsPtr(acquired_list),
55                 wait_list, event );
56 
57         foreach( elem; acquired_list ) elem.ctxReleaseToGL();
58         acquired_list.length = 0;
59     }
60 
61 protected:
62     override cl_context_properties[] getProperties( CLPlatform p )
63     {
64         version(linux)
65         {
66             import derelict.opengl3.glx;
67             return [ CL_GL_CONTEXT_KHR,  cast(cl_context_properties)glXGetCurrentContext(),
68                      CL_GLX_DISPLAY_KHR, cast(cl_context_properties)glXGetCurrentDisplay() ] ~
69                 super.getProperties( p );
70         }
71         version(Windows)
72         {
73             import derelict.opengl3.wgl;
74             return [ CL_GL_CONTEXT_KHR,   cast(cl_context_properties)wglGetCurrentContext(),
75                      CL_WGL_HDC_KHR,      cast(cl_context_properties)wglGetCurrentDC() ] ~
76                 super.getProperties( p );
77         }
78         version(OSX)
79         {
80             // TODO
81             static assert(0, "not implemented");
82         }
83     }
84 }