Пример #1
0
        public IMgLogicalDevice CreateDevice(IMgPhysicalDevice gpu, IMgSurfaceKHR presentationSurface, MgQueueAllocation requestCount, MgQueueFlagBits requestedQueueType, string[] enabledExtensions)
        {
            // Find a queue that supports graphics operations
            MgQueueFamilyProperties[] queueProps;
            gpu.GetPhysicalDeviceQueueFamilyProperties(out queueProps);
            Debug.Assert(queueProps != null);
            Debug.Assert(queueProps.Length >= 1);

            uint queueFamilyIndex = 0;

            queueFamilyIndex = presentationSurface != null
                                ? FindAppropriateQueueFamilyForSurface(gpu, presentationSurface, queueProps, requestedQueueType)
                                : FindAppropriateQueueFamily(queueProps, requestedQueueType);

            uint noOfQueues = (requestCount == MgQueueAllocation.One) ? 1 : queueProps [queueFamilyIndex].QueueCount;

            var queuePriorities = new float[noOfQueues];

            for (uint i = 0; i < noOfQueues; ++i)
            {
                queuePriorities [i] = 0f;
            }

            var queueCreateInfo = new MgDeviceQueueCreateInfo {
                QueueFamilyIndex = queueFamilyIndex,
                QueueCount       = noOfQueues,
                QueuePriorities  = queuePriorities,
            };

            return(CreateDevice(gpu, queueCreateInfo, enabledExtensions));
        }
Пример #2
0
        public IMgLogicalDevice CreateDevice(IMgPhysicalDevice gpu, MgDeviceQueueCreateInfo queueCreateInfo, string[] enabledExtensions)
        {
            if (gpu == null)
            {
                throw new ArgumentNullException(nameof(gpu));
            }

            if (queueCreateInfo == null)
            {
                throw new ArgumentNullException(nameof(queueCreateInfo));
            }

            var deviceCreateInfo = new MgDeviceCreateInfo {
                EnabledExtensionNames = enabledExtensions,
                QueueCreateInfos      = new[] {
                    queueCreateInfo
                },
            };

            IMgDevice device;
            var       errorCode = gpu.CreateDevice(deviceCreateInfo, null, out device);

            Debug.Assert(errorCode == Result.SUCCESS, errorCode + " != Result.SUCCESS");

            // Get the graphics queue
            var availableQueues = new IMgQueueInfo[queueCreateInfo.QueueCount];

            for (uint i = 0; i < queueCreateInfo.QueueCount; ++i)
            {
                IMgQueue queue;
                device.GetDeviceQueue(queueCreateInfo.QueueFamilyIndex, i, out queue);
                availableQueues [i] = new MgQueueInfo(i, gpu, device, queueCreateInfo.QueueFamilyIndex, queue);
            }

            return(new MgLogicalDevice(gpu, device, availableQueues));
        }