internal Platform(CLPlatformID openclPlatform) { this.CLPlatformID = openclPlatform; this.Name = GetPlatformInfo(this, CLPlatformInfo.Name); this.Vendor = GetPlatformInfo(this, CLPlatformInfo.Vendor); this.Profile = GetPlatformInfo(this, CLPlatformInfo.Profile); this.Version = GetPlatformInfo(this, CLPlatformInfo.Version); this.Extensions = GetPlatformInfo(this, CLPlatformInfo.Extensions); }
public static Context ShareWithCGL(IntPtr cglShareGroup) { IntPtr[] properties = { new IntPtr(0x10000000), // CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE cglShareGroup, new IntPtr(0) }; CLError error = CLError.None; // TODO: Add parameter pfn_notify (logging function) CLContext openclContext = OpenCLDriver.clCreateContext(properties, 0, null, null, IntPtr.Zero, ref error); OpenCLError.Validate(error); SizeT devicesSize = SizeT.Zero; OpenCLError.Validate(OpenCLDriver.clGetContextInfo(openclContext, CLContextInfo.Devices, SizeT.Zero, IntPtr.Zero, ref devicesSize)); CLDeviceID[] devices = new CLDeviceID[((Int64)(devicesSize)) / IntPtr.Size]; GCHandle devicesHandle = GCHandle.Alloc(devices, GCHandleType.Pinned); try { OpenCLError.Validate(OpenCLDriver.clGetContextInfo(openclContext, CLContextInfo.Devices, devicesSize, devicesHandle.AddrOfPinnedObject(), ref devicesSize)); Dictionary<CLPlatformID, CLPlatformID> platformsDictionary = new Dictionary<CLPlatformID, CLPlatformID>(); CLPlatformID[] platforms = null; foreach (CLDeviceID device in devices) { SizeT platformsSize = SizeT.Zero; OpenCLError.Validate(OpenCLDriver.clGetDeviceInfo(device, CLDeviceInfo.Platform, SizeT.Zero, platforms, ref platformsSize)); platforms = new CLPlatformID[((Int64)(platformsSize)) / IntPtr.Size]; OpenCLError.Validate(OpenCLDriver.clGetDeviceInfo(device, CLDeviceInfo.Platform, platformsSize, platforms, ref platformsSize)); foreach (CLPlatformID platform in platforms) { if (!platformsDictionary.ContainsKey(platform)) { platformsDictionary.Add(platform, platform); } } } platforms = new CLPlatformID[platformsDictionary.Count]; Int32 index = 0; foreach (var platform in platformsDictionary.Keys) { platforms[index++] = platform; } return new Context(openclContext, new Platforms(platforms), new Devices(devices)); } finally { devicesHandle.Free(); } }
internal static extern CLError clGetPlatformInfo(CLPlatformID platform, CLPlatformInfo param_name, SizeT param_value_size, IntPtr param_value, ref SizeT param_value_size_ret);
internal static extern CLError clGetDeviceIDs(CLPlatformID platform_id, CLDeviceType device_type, int num_entries, IntPtr devices, ref int num_devices);
public static Context Share(IntPtr openclContext) { SizeT devicesSize = SizeT.Zero; CLContext clContext = new CLContext { Value = openclContext }; OpenCLError.Validate(OpenCLDriver.clGetContextInfo(clContext, CLContextInfo.Devices, SizeT.Zero, IntPtr.Zero, ref devicesSize)); CLDeviceID[] devices = new CLDeviceID[((Int64)(devicesSize)) / IntPtr.Size]; GCHandle devicesHandle = GCHandle.Alloc(devices, GCHandleType.Pinned); try { OpenCLError.Validate(OpenCLDriver.clGetContextInfo(clContext, CLContextInfo.Devices, devicesSize, devicesHandle.AddrOfPinnedObject(), ref devicesSize)); Dictionary<CLPlatformID, CLPlatformID> platformsDictionary = new Dictionary<CLPlatformID, CLPlatformID>(); CLPlatformID[] platforms = null; foreach (CLDeviceID device in devices) { SizeT platformsSize = SizeT.Zero; OpenCLError.Validate(OpenCLDriver.clGetDeviceInfo(device, CLDeviceInfo.Platform, SizeT.Zero, platforms, ref platformsSize)); platforms = new CLPlatformID[((Int64)(platformsSize)) / IntPtr.Size]; OpenCLError.Validate(OpenCLDriver.clGetDeviceInfo(device, CLDeviceInfo.Platform, platformsSize, platforms, ref platformsSize)); foreach (CLPlatformID platform in platforms) { if (!platformsDictionary.ContainsKey(platform)) { platformsDictionary.Add(platform, platform); } } } platforms = new CLPlatformID[platformsDictionary.Count]; Int32 index = 0; foreach (var platform in platformsDictionary.Keys) { platforms[index++] = platform; } return new Context(clContext, new Platforms(platforms), new Devices(devices)); } finally { devicesHandle.Free(); } }