Beispiel #1
0
 private void DestroySwapchain()
 {
     if (swapchain != SharpVulkan.Swapchain.Null)
     {
         context.WaitForFence(swapchainDestroyFenceValue);
         swapchainDestroyFenceValue = context.NextFenceValue;
         foreach (var i in framebuffers)
         {
             context.Release(i);
         }
         foreach (var i in backbufferViews)
         {
             context.Release(i);
         }
         foreach (var i in acquirementSemaphores)
         {
             context.Release(i);
         }
         context.Release(depthStencilView);
         context.Release(depthStencilBuffer);
         context.Release(depthStencilMemory);
         context.Release(renderPass);
         context.Release(swapchain);
         context.Flush();
         swapchain = SharpVulkan.Swapchain.Null;
     }
 }
Beispiel #2
0
        private void CreateSwapchain()
        {
            var surfaceFormats = context.PhysicalDevice.GetSurfaceFormats(surface);

            if (surfaceFormats.Length == 1 && surfaceFormats[0].Format == SharpVulkan.Format.Undefined)
            {
                backbufferFormat = SharpVulkan.Format.B8G8R8A8UNorm;
            }
            else
            {
                backbufferFormat = surfaceFormats[0].Format;
            }
            context.PhysicalDevice.GetSurfaceCapabilities(surface, out var surfaceCapabilities);
            if (width < surfaceCapabilities.MinImageExtent.Width || height < surfaceCapabilities.MinImageExtent.Height ||
                width > surfaceCapabilities.MaxImageExtent.Width || height > surfaceCapabilities.MaxImageExtent.Height
                )
            {
                throw new InvalidOperationException();
            }
            var desiredBufferCount = 3U;

            if (desiredBufferCount < surfaceCapabilities.MinImageCount)
            {
                desiredBufferCount = surfaceCapabilities.MinImageCount;
            }
            else if (surfaceCapabilities.MaxImageCount > 0 && desiredBufferCount > surfaceCapabilities.MaxImageCount)
            {
                desiredBufferCount = surfaceCapabilities.MaxImageCount;
            }
            var preTransform = SharpVulkan.SurfaceTransformFlags.Identity;

            if ((surfaceCapabilities.SupportedTransforms & preTransform) == 0)
            {
                throw new NotSupportedException();
            }
            var compositeAlpha = SharpVulkan.CompositeAlphaFlags.Opaque;

            if ((surfaceCapabilities.SupportedCompositeAlpha & compositeAlpha) == 0)
            {
                throw new NotSupportedException();
            }
            var backbufferUsage = SharpVulkan.ImageUsageFlags.ColorAttachment;

            if ((surfaceCapabilities.SupportedUsageFlags & backbufferUsage) == 0)
            {
                throw new NotSupportedException();
            }
            var supportedPresentModes = context.PhysicalDevice.GetSurfacePresentModes(surface);
            var presentMode           = SharpVulkan.PresentMode.Fifo;

            if (!vSync)
            {
                if (Array.IndexOf(supportedPresentModes, SharpVulkan.PresentMode.Immediate) >= 0)
                {
                    presentMode = SharpVulkan.PresentMode.Immediate;
                }
                else if (Array.IndexOf(supportedPresentModes, SharpVulkan.PresentMode.Mailbox) >= 0)
                {
                    presentMode = SharpVulkan.PresentMode.Mailbox;
                }
            }
            var oldSwapchain = swapchain;

            DestroySwapchain();
            var createInfo = new SharpVulkan.SwapchainCreateInfo {
                StructureType    = SharpVulkan.StructureType.SwapchainCreateInfo,
                Surface          = surface,
                PresentMode      = presentMode,
                PreTransform     = preTransform,
                CompositeAlpha   = compositeAlpha,
                ImageUsage       = backbufferUsage,
                ImageFormat      = backbufferFormat,
                ImageColorSpace  = SharpVulkan.ColorSpace.SRgbNonlinear,
                ImageExtent      = new SharpVulkan.Extent2D((uint)width, (uint)height),
                ImageArrayLayers = 1,
                ImageSharingMode = SharpVulkan.SharingMode.Exclusive,
                MinImageCount    = desiredBufferCount,
                Clipped          = true,
                OldSwapchain     = oldSwapchain
            };

            swapchain = context.Device.CreateSwapchain(ref createInfo);
            CreateBackbuffers();
            CreateDepthStencilBuffer();
            CreateRenderPass();
            CreateFramebuffers();
            AcquireNextImage();
        }