Ejemplo n.º 1
0
        public Result CreateInstance(MgInstanceCreateInfo createInfo, IMgAllocationCallbacks allocator, out IMgInstance instance)
        {
            var allocatedItems = new List <IntPtr>();

            try
            {
                uint enabledLayerCount;
                var  ppEnabledLayerNames = VkInteropsUtility.CopyStringArrays(allocatedItems, createInfo.EnabledLayerNames, out enabledLayerCount);

                uint enabledExtensionCount;
                var  ppEnabledExtensionNames = VkInteropsUtility.CopyStringArrays(allocatedItems, createInfo.EnabledExtensionNames, out enabledExtensionCount);

                var pApplicationInfo = IntPtr.Zero;
                if (createInfo.ApplicationInfo != null)
                {
                    var acInfo = new VkApplicationInfo
                    {
                        sType              = VkStructureType.StructureTypeApplicationInfo,
                        pNext              = IntPtr.Zero,
                        apiVersion         = createInfo.ApplicationInfo.ApiVersion,
                        applicationVersion = createInfo.ApplicationInfo.ApplicationVersion,
                        engineVersion      = createInfo.ApplicationInfo.EngineVersion,
                        pApplicationName   = CopySingleString(allocatedItems, createInfo.ApplicationInfo.ApplicationName),
                        pEngineName        = CopySingleString(allocatedItems, createInfo.ApplicationInfo.EngineName),
                    };

                    var destPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VkApplicationInfo)));
                    allocatedItems.Add(destPtr);

                    Marshal.StructureToPtr(acInfo, destPtr, false);

                    pApplicationInfo = destPtr;
                }

                var ici = new VkInstanceCreateInfo
                {
                    sType                   = VkStructureType.StructureTypeInstanceCreateInfo,
                    pNext                   = IntPtr.Zero,
                    enabledLayerCount       = enabledLayerCount,
                    ppEnabledLayerNames     = ppEnabledLayerNames,
                    enabledExtensionCount   = enabledExtensionCount,
                    ppEnabledExtensionNames = ppEnabledExtensionNames,
                    pApplicationInfo        = pApplicationInfo,
                };

                var    bAllocator   = allocator as MgVkAllocationCallbacks;
                IntPtr allocatorPtr = bAllocator != null ? bAllocator.Handle : IntPtr.Zero;

                IntPtr handle = IntPtr.Zero;
                var    result = Interops.vkCreateInstance(ref ici, allocatorPtr, ref handle);

                instance = new VkInstance(handle);

                return((Result)result);
            }
            finally
            {
                //foreach (var mem in allocatedItems)
                //{
                //	Marshal.FreeHGlobal(mem);
                //}
            }
        }