swapchain API revision
							parent
							
								
									32a30e1b6b
								
							
						
					
					
						commit
						c4275e7434
					
				|  | @ -1 +1 @@ | ||||||
| Subproject commit eaed76f4dcc60022b3f10997fb34eb8ead9ae7d7 | Subproject commit 7c31601ab48ca0ccf3f475193643ca5f652bd509 | ||||||
|  | @ -13,15 +13,18 @@ namespace MoonWorks.Graphics | ||||||
| 		public IntPtr Handle { get; } | 		public IntPtr Handle { get; } | ||||||
| 
 | 
 | ||||||
| 		// some state for debug validation | 		// some state for debug validation | ||||||
| 		GraphicsPipeline currentGraphicsPipeline = null; | 		GraphicsPipeline currentGraphicsPipeline; | ||||||
| 		ComputePipeline currentComputePipeline = null; | 		ComputePipeline currentComputePipeline; | ||||||
| 		bool renderPassActive = false; | 		bool renderPassActive; | ||||||
| 
 | 
 | ||||||
| 		// called from RefreshDevice | 		// called from RefreshDevice | ||||||
| 		internal CommandBuffer(GraphicsDevice device, IntPtr handle) | 		internal CommandBuffer(GraphicsDevice device, IntPtr handle) | ||||||
| 		{ | 		{ | ||||||
| 			Device = device; | 			Device = device; | ||||||
| 			Handle = handle; | 			Handle = handle; | ||||||
|  | 			currentGraphicsPipeline = null; | ||||||
|  | 			currentComputePipeline = null; | ||||||
|  | 			renderPassActive = false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// FIXME: we can probably use the NativeMemory functions to not have to generate arrays here | 		// FIXME: we can probably use the NativeMemory functions to not have to generate arrays here | ||||||
|  | @ -815,7 +818,7 @@ namespace MoonWorks.Graphics | ||||||
| 			return new Texture( | 			return new Texture( | ||||||
| 				Device, | 				Device, | ||||||
| 				texturePtr, | 				texturePtr, | ||||||
| 				Device.GetSwapchainFormat(window), | 				window.SwapchainFormat, | ||||||
| 				width, | 				width, | ||||||
| 				height | 				height | ||||||
| 			); | 			); | ||||||
|  |  | ||||||
|  | @ -10,6 +10,9 @@ namespace MoonWorks.Graphics | ||||||
| 		public IntPtr Handle { get; } | 		public IntPtr Handle { get; } | ||||||
| 		public Backend Backend { get; } | 		public Backend Backend { get; } | ||||||
| 
 | 
 | ||||||
|  | 		private uint windowFlags; | ||||||
|  | 		public SDL2.SDL.SDL_WindowFlags WindowFlags => (SDL2.SDL.SDL_WindowFlags) windowFlags; | ||||||
|  | 
 | ||||||
| 		// Built-in video pipeline | 		// Built-in video pipeline | ||||||
| 		private ShaderModule VideoVertexShader { get; } | 		private ShaderModule VideoVertexShader { get; } | ||||||
| 		private ShaderModule VideoFragmentShader { get; } | 		private ShaderModule VideoFragmentShader { get; } | ||||||
|  | @ -20,22 +23,13 @@ namespace MoonWorks.Graphics | ||||||
| 		private readonly List<WeakReference<GraphicsResource>> resources = new List<WeakReference<GraphicsResource>>(); | 		private readonly List<WeakReference<GraphicsResource>> resources = new List<WeakReference<GraphicsResource>>(); | ||||||
| 
 | 
 | ||||||
| 		public GraphicsDevice( | 		public GraphicsDevice( | ||||||
| 			IntPtr deviceWindowHandle, |  | ||||||
| 			Backend preferredBackend, | 			Backend preferredBackend, | ||||||
| 			Refresh.PresentMode presentMode, |  | ||||||
| 			bool debugMode | 			bool debugMode | ||||||
| 		) | 		) | ||||||
| 		{ | 		{ | ||||||
| 			Backend = (Backend) Refresh.Refresh_SelectBackend((Refresh.Backend) preferredBackend, out uint flags); | 			Backend = (Backend) Refresh.Refresh_SelectBackend((Refresh.Backend) preferredBackend, out windowFlags); | ||||||
| 
 |  | ||||||
| 			var presentationParameters = new Refresh.PresentationParameters |  | ||||||
| 			{ |  | ||||||
| 				deviceWindowHandle = deviceWindowHandle, |  | ||||||
| 				presentMode = presentMode |  | ||||||
| 			}; |  | ||||||
| 
 | 
 | ||||||
| 			Handle = Refresh.Refresh_CreateDevice( | 			Handle = Refresh.Refresh_CreateDevice( | ||||||
| 				presentationParameters, |  | ||||||
| 				Conversions.BoolToByte(debugMode) | 				Conversions.BoolToByte(debugMode) | ||||||
| 			); | 			); | ||||||
| 
 | 
 | ||||||
|  | @ -60,6 +54,43 @@ namespace MoonWorks.Graphics | ||||||
| 			); | 			); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		public bool ClaimWindow(Window window, PresentMode presentMode) | ||||||
|  | 		{ | ||||||
|  | 			var success = Conversions.ByteToBool( | ||||||
|  | 				Refresh.Refresh_ClaimWindow( | ||||||
|  | 					Handle, | ||||||
|  | 					window.Handle, | ||||||
|  | 					(Refresh.PresentMode) presentMode | ||||||
|  | 				) | ||||||
|  | 			); | ||||||
|  | 
 | ||||||
|  | 			if (success) | ||||||
|  | 			{ | ||||||
|  | 				window.Claimed = true; | ||||||
|  | 				window.SwapchainFormat = GetSwapchainFormat(window); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			return success; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void UnclaimWindow(Window window) | ||||||
|  | 		{ | ||||||
|  | 			Refresh.Refresh_UnclaimWindow( | ||||||
|  | 				Handle, | ||||||
|  | 				window.Handle | ||||||
|  | 			); | ||||||
|  | 			window.Claimed = false; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void SetPresentMode(Window window, PresentMode presentMode) | ||||||
|  | 		{ | ||||||
|  | 			Refresh.Refresh_SetSwapchainPresentMode( | ||||||
|  | 				Handle, | ||||||
|  | 				window.Handle, | ||||||
|  | 				(Refresh.PresentMode) presentMode | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		public CommandBuffer AcquireCommandBuffer() | 		public CommandBuffer AcquireCommandBuffer() | ||||||
| 		{ | 		{ | ||||||
| 			return new CommandBuffer(this, Refresh.Refresh_AcquireCommandBuffer(Handle, 0)); | 			return new CommandBuffer(this, Refresh.Refresh_AcquireCommandBuffer(Handle, 0)); | ||||||
|  | @ -86,7 +117,7 @@ namespace MoonWorks.Graphics | ||||||
| 			Refresh.Refresh_Wait(Handle); | 			Refresh.Refresh_Wait(Handle); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public TextureFormat GetSwapchainFormat(Window window) | 		private TextureFormat GetSwapchainFormat(Window window) | ||||||
| 		{ | 		{ | ||||||
| 			return (TextureFormat) Refresh.Refresh_GetSwapchainFormat(Handle, window.Handle); | 			return (TextureFormat) Refresh.Refresh_GetSwapchainFormat(Handle, window.Handle); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using System; | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
| using SDL2; | using SDL2; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks | namespace MoonWorks | ||||||
|  | @ -10,29 +11,32 @@ namespace MoonWorks | ||||||
| 		public uint Width { get; private set; } | 		public uint Width { get; private set; } | ||||||
| 		public uint Height { get; private set; } | 		public uint Height { get; private set; } | ||||||
| 
 | 
 | ||||||
|  | 		public bool Claimed { get; internal set; } | ||||||
|  | 		public MoonWorks.Graphics.TextureFormat SwapchainFormat { get; internal set; } | ||||||
|  | 
 | ||||||
| 		private bool IsDisposed; | 		private bool IsDisposed; | ||||||
| 
 | 
 | ||||||
| 		public Window(WindowCreateInfo windowCreateInfo) | 		private static Dictionary<uint, Window> idLookup = new Dictionary<uint, Window>(); | ||||||
| 		{ |  | ||||||
| 			var windowFlags = SDL.SDL_WindowFlags.SDL_WINDOW_VULKAN; |  | ||||||
| 
 | 
 | ||||||
|  | 		public Window(WindowCreateInfo windowCreateInfo, SDL.SDL_WindowFlags flags) | ||||||
|  | 		{ | ||||||
| 			if (windowCreateInfo.ScreenMode == ScreenMode.Fullscreen) | 			if (windowCreateInfo.ScreenMode == ScreenMode.Fullscreen) | ||||||
| 			{ | 			{ | ||||||
| 				windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN; | 				flags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN; | ||||||
| 			} | 			} | ||||||
| 			else if (windowCreateInfo.ScreenMode == ScreenMode.BorderlessWindow) | 			else if (windowCreateInfo.ScreenMode == ScreenMode.BorderlessWindow) | ||||||
| 			{ | 			{ | ||||||
| 				windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP; | 				flags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if (windowCreateInfo.SystemResizable) | 			if (windowCreateInfo.SystemResizable) | ||||||
| 			{ | 			{ | ||||||
| 				windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_RESIZABLE; | 				flags |= SDL.SDL_WindowFlags.SDL_WINDOW_RESIZABLE; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if (windowCreateInfo.StartMaximized) | 			if (windowCreateInfo.StartMaximized) | ||||||
| 			{ | 			{ | ||||||
| 				windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_MAXIMIZED; | 				flags |= SDL.SDL_WindowFlags.SDL_WINDOW_MAXIMIZED; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			ScreenMode = windowCreateInfo.ScreenMode; | 			ScreenMode = windowCreateInfo.ScreenMode; | ||||||
|  | @ -43,11 +47,13 @@ namespace MoonWorks | ||||||
| 				SDL.SDL_WINDOWPOS_UNDEFINED, | 				SDL.SDL_WINDOWPOS_UNDEFINED, | ||||||
| 				(int) windowCreateInfo.WindowWidth, | 				(int) windowCreateInfo.WindowWidth, | ||||||
| 				(int) windowCreateInfo.WindowHeight, | 				(int) windowCreateInfo.WindowHeight, | ||||||
| 				windowFlags | 				flags | ||||||
| 			); | 			); | ||||||
| 
 | 
 | ||||||
| 			Width = windowCreateInfo.WindowWidth; | 			Width = windowCreateInfo.WindowWidth; | ||||||
| 			Height = windowCreateInfo.WindowHeight; | 			Height = windowCreateInfo.WindowHeight; | ||||||
|  | 
 | ||||||
|  | 			idLookup.Add(SDL.SDL_GetWindowID(Handle), this); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void ChangeScreenMode(ScreenMode screenMode) | 		public void ChangeScreenMode(ScreenMode screenMode) | ||||||
|  | @ -81,6 +87,11 @@ namespace MoonWorks | ||||||
| 			Height = height; | 			Height = height; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		internal static Window Lookup(uint windowID) | ||||||
|  | 		{ | ||||||
|  | 			return idLookup.ContainsKey(windowID) ? idLookup[windowID] : null; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		internal void SizeChanged(uint width, uint height) | 		internal void SizeChanged(uint width, uint height) | ||||||
| 		{ | 		{ | ||||||
| 			Width = width; | 			Width = width; | ||||||
|  | @ -96,6 +107,7 @@ namespace MoonWorks | ||||||
| 					// dispose managed state (managed objects) | 					// dispose managed state (managed objects) | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
|  | 				idLookup.Remove(SDL.SDL_GetWindowID(Handle)); | ||||||
| 				SDL.SDL_DestroyWindow(Handle); | 				SDL.SDL_DestroyWindow(Handle); | ||||||
| 
 | 
 | ||||||
| 				IsDisposed = true; | 				IsDisposed = true; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue