public static SurfaceKhr CreateSurface(Instance instance, System.Windows.Forms.Form window) { Win32SurfaceCreateInfoKhr surfaceCreateInfo = new Win32SurfaceCreateInfoKhr { Hinstance = System.Diagnostics.Process.GetCurrentProcess().Handle, Hwnd = window.Handle, }; return(instance.CreateWin32SurfaceKHR(surfaceCreateInfo)); }
public static SurfaceKhr CreateWin32SurfaceKHR(this Instance instance, Win32SurfaceCreateInfoKhr pCreateInfo, AllocationCallbacks pAllocator) { Result result; SurfaceKhr pSurface; unsafe { pSurface = new SurfaceKhr (); fixed (UInt64* ptrpSurface = &pSurface.m) { result = Windows.Interop.NativeMethods.vkCreateWin32SurfaceKHR (instance.m, pCreateInfo.m, pAllocator != null ? pAllocator.m : null, ptrpSurface); } if (result != Result.Success) throw new ResultException (result); return pSurface; } }
/// <summary> /// Create a <see cref="SurfaceKhr"/> object for a Win32 window. /// </summary> /// <param name="instance">The <see cref="Instance"/> to associate with the surface.</param> /// <param name="createInfo"> /// The structure containing the parameters affecting the creation of the surface object. /// </param> /// <param name="allocator"> /// The allocator used for host memory allocated for the surface object. /// </param> /// <returns>The resulting surface object handle.</returns> /// <exception cref="VulkanException">Vulkan returns an error code.</exception> public static SurfaceKhr CreateWin32SurfaceKhr(this Instance instance, Win32SurfaceCreateInfoKhr createInfo, AllocationCallbacks?allocator = null) { return(new SurfaceKhr(instance, &createInfo, ref allocator)); }
public void CreateSwapChain(PresentModeKhr presentMode, uint imageCount) { SwapchainKhr oldSwapChain = SwapChain; if (SwapSurface == null) { // == Create Surface for Swap Chain IntPtr hInstance = System.Runtime.InteropServices.Marshal.GetHINSTANCE(this.GetType().Module); Win32SurfaceCreateInfoKhr surfaceInfo = new Win32SurfaceCreateInfoKhr() { Hwnd = window.Handle, Flags = 0, Hinstance = hInstance, }; SurfaceKhr surface = Instance.CreateWin32SurfaceKHR(surfaceInfo, null); QueueInfo graphicsQueueInfo = GetQueue(QueueFlags.Graphics); Queue graphicsQueue = Device.GetQueue(graphicsQueueInfo.queueFamilyIndex, graphicsQueueInfo.queueIndex); SwapSurface = surface; } // == Create Swap Chain // TODO : this is bugged in Vulkan-Mono PresentModeKhr can not be called from Marshal.SizeOf /*bool presentModeSupported = false; * PresentModeKhr[] presentModes = Gpu.GetSurfacePresentModesKHR(SwapSurface); * foreach (PresentModeKhr checkMode in presentModes) * { * if(checkMode == presentMode) * { * presentModeSupported = true; * break; * } * } * if(!presentModeSupported ) * { * throw new Exception("PresentMode :" + presentMode + " not supported by gpu."); * }*/ SurfaceCapabilitiesKhr surfaceCapabilities = Gpu.GetSurfaceCapabilitiesKHR(SwapSurface); if (surfaceCapabilities.CurrentExtent.Width == uint.MaxValue) { BackBufferWidth = (uint)window.Width; BackBufferHeight = (uint)window.Height; } else { BackBufferWidth = surfaceCapabilities.CurrentExtent.Width; BackBufferHeight = surfaceCapabilities.CurrentExtent.Height; } uint reqImageCount = surfaceCapabilities.MinImageCount + imageCount; if (reqImageCount > 0 && reqImageCount > surfaceCapabilities.MaxImageCount) { reqImageCount = surfaceCapabilities.MaxImageCount; } SurfaceFormatKhr[] surfaceFormats = Gpu.GetSurfaceFormatsKHR(SwapSurface); Format format = surfaceFormats.Length == 1 && surfaceFormats[0].Format == Format.Undefined ? Format.B8g8r8a8Unorm : surfaceFormats[0].Format; SurfaceTransformFlagsKhr preTransform = (surfaceCapabilities.SupportedTransforms & SurfaceTransformFlagsKhr.Identity) == SurfaceTransformFlagsKhr.Identity ? SurfaceTransformFlagsKhr.Identity : surfaceCapabilities.CurrentTransform; SwapchainCreateInfoKhr swapChainInfo = new SwapchainCreateInfoKhr { Surface = SwapSurface, MinImageCount = reqImageCount, ImageFormat = format, ImageColorSpace = surfaceFormats[0].ColorSpace, ImageExtent = new Extent2D { Width = BackBufferWidth, Height = BackBufferHeight, }, ImageUsage = (uint)ImageUsageFlags.ColorAttachment, PreTransform = preTransform, CompositeAlpha = CompositeAlphaFlagsKhr.Opaque, ImageArrayLayers = 1, ImageSharingMode = SharingMode.Exclusive, PresentMode = presentMode, // TODO : Vulkan : we cant assing a null swapChain //OldSwapchain = oldSwapChain != null ? oldSwapChain : null, Clipped = true, }; if (oldSwapChain != null) { // this is a workaround as we cant assing a null one swapChainInfo.OldSwapchain = oldSwapChain; Device.DestroySwapchainKHR(oldSwapChain, null); oldSwapChain = null; } SwapchainKhr swapChain = Device.CreateSwapchainKHR(swapChainInfo, null); // == Create Images Image[] swapImages = Device.GetSwapchainImagesKHR(swapChain); SwapChainBuffer[] buffers = new SwapChainBuffer[swapImages.Length]; for (uint i = 0; i < buffers.Length; i++) { ImageViewCreateInfo imageViewInfo = new ImageViewCreateInfo { Format = format, Components = new ComponentMapping { R = ComponentSwizzle.R, G = ComponentSwizzle.G, B = ComponentSwizzle.B, A = ComponentSwizzle.A, }, SubresourceRange = new ImageSubresourceRange { AspectMask = (uint)ImageAspectFlags.Color, BaseMipLevel = 1, BaseArrayLayer = 0, LayerCount = 1, }, ViewType = ImageViewType.View2D, Flags = 0, Image = swapImages[i], }; ImageView view = Device.CreateImageView(imageViewInfo, null); buffers[i] = new SwapChainBuffer { image = swapImages[i], view = view, }; } }
internal static unsafe extern Result vkCreateWin32SurfaceKHR(IntPtr instance, Win32SurfaceCreateInfoKhr* pCreateInfo, Vulkan.Interop.AllocationCallbacks* pAllocator, UInt64* pSurface);