private void InitRenderParams() { VkSwapchainKHR swapchain = this.swapchain; VkSemaphore semaphore = this.vkSemaphore; VkCommandBuffer[] commandBuffers = this.commandBuffers; submitInfos = VkSubmitInfo.Alloc(2); presentInfos = VkPresentInfoKHR.Alloc(2); for (uint index = 0; index < 2; index++) { //submitInfos[index].waitSemaphoresDstStageMasks.Set(semaphore); submitInfos[index].waitSemaphores = semaphore; submitInfos[index].waitSemaphoresDstStageMasks.Set(VkPipelineStageFlagBits.AllGraphics); submitInfos[index].commandBuffers = commandBuffers[index]; presentInfos[index].swapchains = swapchain; //presentInfo->swapchainsImages.Set(swapchain); presentInfos[index].swapchainsImages.Set(index); } }
internal extern static unsafe Result vkQueueSubmit(IntPtr queue, UInt32 submitCount, VkSubmitInfo *pSubmits, UInt64 fence);
//protected InputSnapshot snapshot; public void InitVulkan() { VkResult err; err = CreateInstance(false); if (err != VkResult.Success) { throw new InvalidOperationException("Could not create Vulkan instance. Error: " + err); } if (Settings.Validation) { } // Physical Device uint gpuCount = 0; vkEnumeratePhysicalDevices(Instance, &gpuCount, null); Debug.Assert(gpuCount > 0); // Enumerate devices IntPtr *physicalDevices = stackalloc IntPtr[(int)gpuCount]; err = vkEnumeratePhysicalDevices(Instance, &gpuCount, (VkPhysicalDevice *)physicalDevices); if (err != VkResult.Success) { throw new InvalidOperationException("Could not enumerate physical devices."); } // GPU selection // Select physical Device to be used for the Vulkan example // Defaults to the first Device unless specified by command line uint selectedDevice = 0; // TODO: Implement arg parsing, etc. physicalDevice = ((VkPhysicalDevice *)physicalDevices)[selectedDevice]; // Store properties (including limits) and features of the phyiscal Device // So examples can check against them and see if a feature is actually supported VkPhysicalDeviceProperties deviceProperties; vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties); DeviceProperties = deviceProperties; VkPhysicalDeviceFeatures deviceFeatures; vkGetPhysicalDeviceFeatures(physicalDevice, &deviceFeatures); DeviceFeatures = deviceFeatures; // Gather physical Device memory properties VkPhysicalDeviceMemoryProperties deviceMemoryProperties; vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties); DeviceMemoryProperties = deviceMemoryProperties; // Derived examples can override this to set actual features (based on above readings) to enable for logical device creation getEnabledFeatures(); // Vulkan Device creation // This is handled by a separate class that gets a logical Device representation // and encapsulates functions related to a Device vulkanDevice = new vksVulkanDevice(physicalDevice); VkResult res = vulkanDevice.CreateLogicalDevice(enabledFeatures, EnabledExtensions); if (res != VkResult.Success) { throw new InvalidOperationException("Could not create Vulkan Device."); } device = vulkanDevice.LogicalDevice; // Get a graphics queue from the Device VkQueue queue; vkGetDeviceQueue(device, vulkanDevice.QFIndices.Graphics, 0, &queue); this.queue = queue; // Find a suitable depth format VkFormat depthFormat; uint validDepthFormat = Tools.getSupportedDepthFormat(physicalDevice, &depthFormat); Debug.Assert(validDepthFormat == True); DepthFormat = depthFormat; Swapchain.Connect(Instance, physicalDevice, device); // Create synchronization objects VkSemaphoreCreateInfo semaphoreCreateInfo = new VkSemaphoreCreateInfo(); semaphoreCreateInfo.sType = SemaphoreCreateInfo; // Create a semaphore used to synchronize image presentation // Ensures that the image is displayed before we start submitting new commands to the queu vkCreateSemaphore(device, &semaphoreCreateInfo, null, &GetSemaphoresPtr()->PresentComplete); // Create a semaphore used to synchronize command submission // Ensures that the image is not presented until all commands have been sumbitted and executed vkCreateSemaphore(device, &semaphoreCreateInfo, null, &GetSemaphoresPtr()->RenderComplete); // Create a semaphore used to synchronize command submission // Ensures that the image is not presented until all commands for the text overlay have been sumbitted and executed // Will be inserted after the render complete semaphore if the text overlay is enabled vkCreateSemaphore(device, &semaphoreCreateInfo, null, &GetSemaphoresPtr()->TextOverlayComplete); // Set up submit info structure // Semaphores will stay the same during application lifetime // Command buffer submission info is set by each example submitInfo = VkSubmitInfo.Alloc(); submitInfo->waitSemaphoresDstStageMasks.Set(submitPipelineStages); submitInfo->waitSemaphoresDstStageMasks.Set(GetSemaphoresPtr()->PresentComplete); submitInfo->signalSemaphores = GetSemaphoresPtr()->RenderComplete; }