void CreateDevice(DeviceCreateInfo mInfo) { var extensionsMarshalled = new NativeStringArray(mInfo.extensions); MarshalledArray <VkDeviceQueueCreateInfo> queueInfos = null; DisposableList <NativeArray <float> > prioritiesMarshalled = null; Marshalled <VkPhysicalDeviceFeatures> features = new Marshalled <VkPhysicalDeviceFeatures>(mInfo.features); var info = new VkDeviceCreateInfo(); info.sType = VkStructureType.DeviceCreateInfo; info.enabledExtensionCount = (uint)extensionsMarshalled.Count; info.ppEnabledExtensionNames = extensionsMarshalled.Address; info.pEnabledFeatures = features.Address; if (mInfo.queueCreateInfos != null) { int length = mInfo.queueCreateInfos.Count; info.queueCreateInfoCount = (uint)length; queueInfos = new MarshalledArray <VkDeviceQueueCreateInfo>(length); prioritiesMarshalled = new DisposableList <NativeArray <float> >(length); for (int i = 0; i < length; i++) { var mi = mInfo.queueCreateInfos[i]; var qInfo = new VkDeviceQueueCreateInfo(); qInfo.sType = VkStructureType.DeviceQueueCreateInfo; var priorityMarshalled = new NativeArray <float>(mi.priorities); prioritiesMarshalled.Add(priorityMarshalled); qInfo.pQueuePriorities = priorityMarshalled.Address; qInfo.queueCount = mi.queueCount; qInfo.queueFamilyIndex = mi.queueFamilyIndex; queueInfos[i] = qInfo; } info.pQueueCreateInfos = queueInfos.Address; } using (extensionsMarshalled) using (queueInfos) using (features) using (prioritiesMarshalled) { var result = Instance.Commands.createDevice(PhysicalDevice.Native, ref info, Instance.AllocationCallbacks, out device); if (result != VkResult.Success) { throw new DeviceException(string.Format("Error creating device: {0}", result)); } } }
void CreateDevice() { var features = new Native <VkPhysicalDeviceFeatures>(); VK.GetPhysicalDeviceFeatures(physicalDevice, features.Address); HashSet <uint> uniqueIndices = new HashSet <uint> { graphicsIndex, presentIndex }; var queueInfos = new NativeArray <VkDeviceQueueCreateInfo>(uniqueIndices.Count); var priorities = new Native <float>(1); int i = 0; foreach (var ind in uniqueIndices) { var queueInfo = new VkDeviceQueueCreateInfo(); queueInfo.sType = CSGL.Vulkan.VkStructureType.DeviceQueueCreateInfo; queueInfo.queueFamilyIndex = ind; queueInfo.queueCount = 1; queueInfo.pQueuePriorities = priorities.Address; queueInfos[i] = queueInfo; i++; } var info = new VkDeviceCreateInfo(); info.sType = CSGL.Vulkan.VkStructureType.DeviceCreateInfo; info.pQueueCreateInfos = queueInfos.Address; info.queueCreateInfoCount = (uint)uniqueIndices.Count; info.pEnabledFeatures = features.Address; var extensionsNative = new NativeStringArray(deviceExtensions); info.ppEnabledExtensionNames = extensionsNative.Address; info.enabledExtensionCount = (uint)deviceExtensions.Length; var result = VK.CreateDevice(physicalDevice, ref info, alloc, out device); VK.GetDeviceQueue(device, graphicsIndex, 0, out graphicsQueue); VK.GetDeviceQueue(device, presentIndex, 0, out presentQueue); features.Dispose(); priorities.Dispose(); queueInfos.Dispose(); extensionsNative.Dispose(); }
void CreateInstance(InstanceCreateInfo mInfo) { InteropString appName = null; InteropString engineName = null; Marshalled <VkApplicationInfo> appInfoMarshalled = null; var extensionsMarshalled = new NativeStringArray(mInfo.extensions); var layersMarshalled = new NativeStringArray(mInfo.layers); var info = new VkInstanceCreateInfo(); info.sType = VkStructureType.InstanceCreateInfo; info.enabledExtensionCount = (uint)extensionsMarshalled.Count; info.ppEnabledExtensionNames = extensionsMarshalled.Address; info.enabledLayerCount = (uint)layersMarshalled.Count; info.ppEnabledLayerNames = layersMarshalled.Address; if (mInfo.applicationInfo != null) { var appInfo = new VkApplicationInfo(); appInfo.sType = VkStructureType.ApplicationInfo; appInfo.apiVersion = mInfo.applicationInfo.apiVersion; appInfo.engineVersion = mInfo.applicationInfo.engineVersion; appInfo.applicationVersion = mInfo.applicationInfo.applicationVersion; appName = new InteropString(mInfo.applicationInfo.applicationName); appInfo.pApplicationName = appName.Address; engineName = new InteropString(mInfo.applicationInfo.engineName); appInfo.pEngineName = engineName.Address; appInfoMarshalled = new Marshalled <VkApplicationInfo>(appInfo); info.pApplicationInfo = appInfoMarshalled.Address; } using (appName) //appName, engineName, and appInfoMarshalled may be null using (engineName) using (appInfoMarshalled) using (extensionsMarshalled) using (layersMarshalled) { var result = createInstance(ref info, alloc, out instance); if (result != VkResult.Success) { throw new InstanceException(string.Format("Error creating instance: {0}", result)); } } }
void CreateInstance() { var appName = new InteropString("Hello Triangle"); var appInfo = new VkApplicationInfo(); appInfo.sType = CSGL.Vulkan.VkStructureType.ApplicationInfo; appInfo.pApplicationName = appName.Address; appInfo.applicationVersion = new CSGL.Vulkan.VkVersion(1, 0, 0); appInfo.engineVersion = new CSGL.Vulkan.VkVersion(0, 0, 1); appInfo.apiVersion = new CSGL.Vulkan.VkVersion(1, 0, 0); var appInfoNative = new Native <VkApplicationInfo>(appInfo); var info = new VkInstanceCreateInfo(); info.sType = CSGL.Vulkan.VkStructureType.InstanceCreateInfo; info.pApplicationInfo = appInfoNative.Address; var extensions = GLFW.GetRequiredInstanceExceptions(); var extensionsNative = new NativeStringArray(extensions); info.ppEnabledExtensionNames = extensionsNative.Address; info.enabledExtensionCount = (uint)extensions.Count; var layersNative = new NativeStringArray(layers); info.ppEnabledLayerNames = layersNative.Address; info.enabledLayerCount = (uint)layers.Length; var result = VK.CreateInstance(ref info, alloc, out instance); appName.Dispose(); appInfoNative.Dispose(); extensionsNative.Dispose(); layersNative.Dispose(); }