コード例 #1
0
ファイル: Program.cs プロジェクト: liuzhaolovezt/CSGL_Samples
        void MainLoop()
        {
            var waitSemaphores = new List <VkSemaphore> {
                imageAvailableSemaphore
            };
            var waitStages = new List <VkPipelineStageFlags> {
                VkPipelineStageFlags.ColorAttachmentOutputBit
            };
            var signalSemaphores = new List <VkSemaphore> {
                renderFinishedSemaphore
            };
            var swapchains = new List <VkSwapchain> {
                swapchain
            };

            var commandBuffer = new List <VkCommandBuffer>()
            {
                null
            };
            var index = new List <int>()
            {
                0
            };

            var submitInfo = new VkSubmitInfo();

            submitInfo.waitSemaphores   = waitSemaphores;
            submitInfo.waitDstStageMask = waitStages;
            submitInfo.commandBuffers   = commandBuffer;
            submitInfo.signalSemaphores = signalSemaphores;

            var presentInfo = new VkPresentInfo();

            presentInfo.waitSemaphores = signalSemaphores;
            presentInfo.swapchains     = swapchains;
            presentInfo.imageIndices   = index;

            var submitInfos = new List <VkSubmitInfo> {
                submitInfo
            };

            GLFW.ShowWindow(window);

            while (true)
            {
                GLFW.PollEvents();
                if (GLFW.GetKey(window, CSGL.Input.KeyCode.Enter) == CSGL.Input.KeyAction.Press)
                {
                    break;
                }
                if (GLFW.WindowShouldClose(window))
                {
                    break;
                }

                if (recreateSwapchainFlag)
                {
                    recreateSwapchainFlag = false;
                    RecreateSwapchain();
                }

                int imageIndex;
                var result = swapchain.AcquireNextImage(-1, imageAvailableSemaphore, null, out imageIndex);

                if (result == VkResult.ErrorOutOfDateKhr || result == VkResult.SuboptimalKhr)
                {
                    RecreateSwapchain();
                    continue;
                }

                commandBuffer[0] = commandBuffers[(int)imageIndex];
                swapchains[0]    = swapchain;
                index[0]         = imageIndex;

                graphicsQueue.Submit(submitInfos, null);
                result = presentQueue.Present(presentInfo);

                if (result == VkResult.ErrorOutOfDateKhr || result == VkResult.SuboptimalKhr)
                {
                    RecreateSwapchain();
                }
            }

            device.WaitIdle();
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: liuzhaolovezt/CSGL_Samples
        void MainLoop()
        {
            var waitSemaphores = new List <VkSemaphore> {
                imageAvailableSemaphore
            };
            var waitStages = new List <VkPipelineStageFlags> {
                VkPipelineStageFlags.ColorAttachmentOutputBit
            };
            var signalSemaphores = new List <VkSemaphore> {
                renderFinishedSemaphore
            };
            var swapchains = new List <VkSwapchain> {
                swapchain
            };

            var commandBuffers = new List <VkCommandBuffer> {
                null
            };
            var index = new List <int> {
                0
            };

            var submitInfo = new VkSubmitInfo();

            submitInfo.waitSemaphores   = waitSemaphores;
            submitInfo.waitDstStageMask = waitStages;
            submitInfo.commandBuffers   = commandBuffers;
            submitInfo.signalSemaphores = signalSemaphores;

            var presentInfo = new VkPresentInfo();

            presentInfo.waitSemaphores = signalSemaphores;
            presentInfo.swapchains     = swapchains;
            presentInfo.imageIndices   = index;

            var submitInfos = new List <VkSubmitInfo> {
                submitInfo
            };

            GLFW.ShowWindow(window.Native);
            generator.Start();

            while (!window.ShouldClose)
            {
                GLFW.PollEvents();

                UpdateUniformBuffer();

                if (recreateSwapchainFlag)
                {
                    recreateSwapchainFlag = false;
                    RecreateSwapchain();
                }

                int imageIndex;
                var result = swapchain.AcquireNextImage(-1, imageAvailableSemaphore, null, out imageIndex);

                Interop.Copy(generator.Pixels, stagingBufferPtr);
                commandBuffers[0] = this.commandBuffers[(int)imageIndex];

                swapchains[0] = swapchain;
                index[0]      = imageIndex;

                graphicsQueue.Submit(submitInfos, null);
                result = presentQueue.Present(presentInfo);
            }

            device.WaitIdle();
        }