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 }