Ejemplo n.º 1
0
        public static IMTLDevice [] GetAllDevices(ref NSObject observer, MTLDeviceNotificationHandler handler)
        {
            if (observer == null)
            {
                throw new ArgumentNullException("observer");
            }

            IntPtr handle = observer.Handle;

            unsafe
            {
                BlockLiteral *block_ptr_handler;
                BlockLiteral  block_handler;
                block_handler     = new BlockLiteral();
                block_ptr_handler = &block_handler;
                block_handler.SetupBlockUnsafe(static_notificationHandler, handler);

                var rv  = MTLCopyAllDevicesWithObserver(ref handle, (void *)block_ptr_handler);
                var obj = NSArray.ArrayFromHandle <IMTLDevice> (rv);

                if (handle != observer.Handle)
                {
                    observer = Runtime.GetNSObject(handle);
                }

                return(obj);
            }
        }
Ejemplo n.º 2
0
        public static IMTLDevice [] GetAllDevices(ref NSObject observer, MTLDeviceNotificationHandler handler)
        {
            var rv = GetAllDevices(handler, out var obs);

            observer = obs;
            return(rv);
        }
Ejemplo n.º 3
0
        public static IMTLDevice [] GetAllDevices(MTLDeviceNotificationHandler handler, out NSObject observer)
        {
            var block_handler = new BlockLiteral();

            block_handler.SetupBlockUnsafe(static_notificationHandler, handler);

            var rv  = MTLCopyAllDevicesWithObserver(out var observer_handle, ref block_handler);
            var obj = NSArray.ArrayFromHandle <IMTLDevice> (rv);

            NSObject.DangerousRelease(rv);

            block_handler.CleanupBlock();

            observer = Runtime.GetNSObject(observer_handle);
            NSObject.DangerousRelease(observer_handle);              // Apple's documentation says "The observer out parameter is returned with a +1 retain count [...]."

            return(obj);
        }