コード例 #1
0
ファイル: ExampleBase.cs プロジェクト: jcoder58/Tanagra
        protected SwapchainData CreateSwapchain(PhysicalDevice physicalDevice, SurfaceKHR surface, uint windowWidth, uint windowHeight)
        {
            var data = new SwapchainData();

            var surfaceFormats = physicalDevice.GetSurfaceFormatsKHR(surface);
            var surfaceFormat  = surfaceFormats[0].Format;

            var surfaceCapabilities = physicalDevice.GetSurfaceCapabilitiesKHR(surface);

            var desiredImageCount = Math.Min(surfaceCapabilities.MinImageCount + 1, surfaceCapabilities.MaxImageCount);

            SurfaceTransformFlagsKHR preTransform;

            if ((surfaceCapabilities.SupportedTransforms & SurfaceTransformFlagsKHR.Identity) != 0)
            {
                preTransform = SurfaceTransformFlagsKHR.Identity;
            }
            else
            {
                preTransform = surfaceCapabilities.CurrentTransform;
            }

            var presentModes = physicalDevice.GetSurfacePresentModesKHR(surface);

            var swapChainPresentMode = PresentModeKHR.Fifo;

            if (presentModes.Contains(PresentModeKHR.Mailbox))
            {
                swapChainPresentMode = PresentModeKHR.Mailbox;
            }
            else if (presentModes.Contains(PresentModeKHR.Immediate))
            {
                swapChainPresentMode = PresentModeKHR.Immediate;
            }

            var imageExtent         = new Extent2D(windowWidth, windowHeight);
            var swapchainCreateInfo = new SwapchainCreateInfoKHR
            {
                Surface       = surface,
                MinImageCount = desiredImageCount,

                ImageFormat      = surfaceFormat,
                ImageExtent      = imageExtent,
                ImageArrayLayers = 1,
                ImageUsage       = ImageUsageFlags.ColorAttachment,
                ImageSharingMode = SharingMode.Exclusive,
                //ImageColorSpace    = ColorSpaceKHR.SrgbNonlinear,

                QueueFamilyIndices = null,
                PreTransform       = preTransform,
                CompositeAlpha     = CompositeAlphaFlagsKHR.Opaque,
                PresentMode        = swapChainPresentMode,
                Clipped            = true,
            };

            data.Swapchain   = device.CreateSwapchainKHR(swapchainCreateInfo);
            data.ImageFormat = surfaceFormat;

            return(data);
        }
コード例 #2
0
        public static bool CheckSwapchainCreateInfo(PhysicalDevice physicalDevice, SwapchainCreateInfoKhr createInfo, bool fixExtend)
        {
            SurfaceKhr surface = createInfo.Surface;

            foreach (uint index in createInfo.QueueFamilyIndices)
            {
                if (!physicalDevice.GetSurfaceSupportKHR(index, surface))
                {
                    return(false);
                }
            }

            bool supportImageFormat = false;

            foreach (SurfaceFormatKhr suportedFormat in physicalDevice.GetSurfaceFormatsKHR(surface))
            {
                if (suportedFormat.Format == createInfo.ImageFormat &&
                    suportedFormat.ColorSpace == createInfo.ImageColorSpace)
                {
                    supportImageFormat = true;
                    break;
                }
            }
            if (!supportImageFormat)
            {
                return(false);
            }

            SurfaceCapabilitiesKhr capabilities = physicalDevice.GetSurfaceCapabilitiesKHR(surface);

            if (fixExtend)
            {
                var extend = createInfo.ImageExtent;
                extend.Width           = Clamp(extend.Width, capabilities.MinImageExtent.Width, capabilities.MaxImageExtent.Width);
                extend.Height          = Clamp(extend.Height, capabilities.MinImageExtent.Height, capabilities.MaxImageExtent.Height);
                createInfo.ImageExtent = extend;
            }
            if (createInfo.PreTransform == SurfaceTransformFlagsKhr.Inherit)
            {
                createInfo.PreTransform = capabilities.CurrentTransform;
            }
            // TODO: Fix up CompositeAlpha if Inherit is set

            if (capabilities.MinImageCount <= createInfo.MinImageCount &&
                capabilities.MaxImageCount >= createInfo.MinImageCount &&
                capabilities.MaxImageArrayLayers <= createInfo.ImageArrayLayers &&
                ((capabilities.SupportedTransforms & createInfo.PreTransform) == createInfo.PreTransform) &&
                ((capabilities.SupportedCompositeAlpha & createInfo.CompositeAlpha) == createInfo.CompositeAlpha) &&
                ((capabilities.SupportedUsageFlags & createInfo.ImageUsage) == createInfo.ImageUsage) &&
                createInfo.ImageExtent.Width >= capabilities.MinImageExtent.Width &&
                createInfo.ImageExtent.Width <= capabilities.MaxImageExtent.Width &&
                createInfo.ImageExtent.Height >= capabilities.MinImageExtent.Height &&
                createInfo.ImageExtent.Height <= capabilities.MaxImageExtent.Height)
            {
                return(true);
            }
            return(false);
        }
コード例 #3
0
 private SurfaceFormatKhr SelectFormat(PhysicalDevice physicalDevice, SurfaceKhr surface)
 {
     foreach (var f in physicalDevice.GetSurfaceFormatsKHR(surface))
     {
         if (f.Format == Format.R8g8b8a8Unorm || f.Format == Format.B8g8r8a8Unorm)
         {
             return(f);
         }
     }
     throw new Exception("didn't find the R8g8b8a8Unorm format");
 }
コード例 #4
0
        protected SurfaceFormatKhr SelectFormat(PhysicalDevice physicalDevice, SurfaceKhr surface)
        {
            foreach (var f in physicalDevice.GetSurfaceFormatsKHR(surface))
            {
                if (f.Format == Format.R8G8B8A8Unorm || f.Format == Format.B8G8R8A8Unorm)
                {
                    return(f);
                }
            }

            throw new System.Exception("didn't find the R8G8B8A8Unorm or B8G8R8A8Unorm format");
        }
コード例 #5
0
ファイル: SwapChain.cs プロジェクト: CloneDeath/Illustrate
		public void Initialize(IWindow window) {
			CreateSurface(window);

			NodeIndex = PhysicalDevice.GetQueueFamilyPropertiesExt()
			                          .First(q => q.SupportsGraphics && q.Supports(Surface))
			                          .QueueIndex;

			var surfaceFormats = PhysicalDevice.GetSurfaceFormatsKHR(Surface);
			if (surfaceFormats.Length == 1 && surfaceFormats.First().Format == Format.Undefined) ColorFormat = Format.B8G8R8A8Unorm;
			else ColorFormat = surfaceFormats.First().Format;
			ColorSpace = surfaceFormats.First().ColorSpace;
		}
コード例 #6
0
ファイル: GraphicsManager.cs プロジェクト: Ciastex/Prisma
        private SurfaceFormatKhr SelectSurfaceFormat(PhysicalDevice physDev, SurfaceKhr surface)
        {
            foreach (var f in physDev.GetSurfaceFormatsKHR(surface))
            {
                if (f.Format == Format.R8G8B8A8Unorm || f.Format == Format.B8G8R8A8Unorm)
                {
                    return(f);
                }
            }

            throw new EngineException(
                      "didn't find the R8G8B8A8Unorm or B8G8R8A8Unorm format",
                      string.Empty
                      );
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: CloneDeath/Illustrate
        private static SwapchainKhr GetSwapchain(PhysicalDevice physicalDevice, SurfaceKhr surface, Device device, SurfaceCapabilitiesKhr surfaceInfo)
        {
            var format = physicalDevice.GetSurfaceFormatsKHR(surface).First();

            return(device.CreateSwapchainKHR(new SwapchainCreateInfoKhr
            {
                Surface = surface,
                MinImageCount = 2,
                ImageFormat = format.Format,
                ImageColorSpace = format.ColorSpace,
                ImageExtent = surfaceInfo.CurrentExtent,
                ImageArrayLayers = 1,
                ImageUsage = ImageUsageFlags.ColorAttachment | ImageUsageFlags.Sampled,
                ImageSharingMode = SharingMode.Exclusive,
                PreTransform = surfaceInfo.CurrentTransform,
                CompositeAlpha = CompositeAlphaFlagsKhr.Opaque,
                PresentMode = PresentModeKhr.Fifo,
                Clipped = true
            }));
        }
コード例 #8
0
 public SwapChainSupportDetails(PhysicalDevice device, SurfaceKhr surface)
 {
     capabilities = device.GetSurfaceCapabilitiesKHR(surface);
     formats      = device.GetSurfaceFormatsKHR(surface);
     presentModes = device.GetSurfacePresentModesKHR(surface);
 }
コード例 #9
0
        static void CreateSwapchain()
        {
            // surface format
            var surfaceFormats = physicalDevice.GetSurfaceFormatsKHR(surface);

            if (surfaceFormats.Count == 1 && surfaceFormats[0].Format == Format.Undefined)
            {
                backBufferFormat = Format.B8g8r8a8Unorm;
                Console.WriteLine($"using default backBufferFormat {backBufferFormat}");
            }
            else
            {
                backBufferFormat = surfaceFormats[0].Format;
                Console.WriteLine($"backBufferFormat {backBufferFormat}");
            }

            var surfaceCapabilities = physicalDevice.GetSurfaceCapabilitiesKHR(surface);

            // Buffer count
            var desiredImageCount = surfaceCapabilities.MinImageCount + 1;

            if (surfaceCapabilities.MaxImageCount > 0 && desiredImageCount > surfaceCapabilities.MaxImageCount)
            {
                desiredImageCount = surfaceCapabilities.MaxImageCount;
            }

            // Transform
            SurfaceTransformFlagsKhr preTransform;

            if ((surfaceCapabilities.SupportedTransforms & SurfaceTransformFlagsKhr.Identity) != 0)
            {
                preTransform = SurfaceTransformFlagsKhr.Identity;
            }
            else
            {
                preTransform = surfaceCapabilities.CurrentTransform;
            }

            // Present mode
            var presentModes = physicalDevice.GetSurfacePresentModesKHR(surface);

            var swapChainPresentMode = PresentModeKhr.Fifo;

            if (presentModes.Contains(PresentModeKhr.Mailbox))
            {
                swapChainPresentMode = PresentModeKhr.Mailbox;
            }
            else if (presentModes.Contains(PresentModeKhr.Immediate))
            {
                swapChainPresentMode = PresentModeKhr.Immediate;
            }

            Console.WriteLine($"swapChainPresentMode {swapChainPresentMode}");

            // Create swapchain

            /*var swapchainCreateInfo = new SwapchainCreateInfoKhr
             * {
             *  Surface = surface,
             *  ImageSharingMode = SharingMode.Exclusive,
             *  ImageExtent = new Extent2D { Width = 800, Height = 600 },
             *  ImageArrayLayers = 1,
             *  ImageFormat = backBufferFormat,
             *  ImageColorSpace = ColorSpaceKhr.SrgbNonlinear,
             *  ImageUsage = (uint)ImageUsageFlags.ColorAttachment,
             *  PresentMode = swapChainPresentMode,
             *  CompositeAlpha = CompositeAlphaFlagsKhr.Opaque,
             *  MinImageCount = desiredImageCount,
             *  PreTransform = preTransform,
             *  Clipped = true,
             * };
             * swapchain = device.CreateSwapchainKHR(swapchainCreateInfo, null);
             * Console.WriteLine("[ OK ] Swapchain");
             *
             * backBuffers = device.GetSwapchainImagesKHR(swapchain);*/
        }
コード例 #10
0
ファイル: MeteoraWindow.cs プロジェクト: Amatsugu/Meteora
 private (SurfaceCapabilitiesKhr surfaceCapablities, SurfaceFormatKhr[] formats, PresentModeKhr[] presentModes) QuerySwapchainSupport(PhysicalDevice device)
 {
     return(device.GetSurfaceCapabilitiesKHR(data.surface), device.GetSurfaceFormatsKHR(data.surface), device.GetSurfacePresentModesKHR(data.surface));
 }
コード例 #11
0
 public SurfaceFormatKhr[] GetSurfaceFormats(MySurface surface)
 {
     return(_physicalDevice.GetSurfaceFormatsKHR(surface.Handle));
 }