presentation ABI break
							parent
							
								
									7328cbc13d
								
							
						
					
					
						commit
						81c882bd48
					
				|  | @ -1 +1 @@ | ||||||
| Subproject commit 61ec63b71f9fc3163ef5a8d985fbb53e3f02dbf9 | Subproject commit d844fe56ee16e7e0e0ae4f4ff1814292e499dff7 | ||||||
|  | @ -52,12 +52,14 @@ namespace MoonWorks.Graphics | ||||||
| 				refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); | 				refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			Rect renderArea = new Rect((int) colorAttachmentInfos[0].Texture.Width, (int) colorAttachmentInfos[0].Texture.Height); | ||||||
|  | 
 | ||||||
| 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | ||||||
| 			{ | 			{ | ||||||
| 				Refresh.Refresh_BeginRenderPass( | 				Refresh.Refresh_BeginRenderPass( | ||||||
| 					Device.Handle, | 					Device.Handle, | ||||||
| 					Handle, | 					Handle, | ||||||
| 					colorAttachmentInfos[0].RenderTarget.TextureSlice.Rectangle.ToRefresh(), | 					renderArea.ToRefresh(), | ||||||
| 					(IntPtr) pColorAttachmentInfos, | 					(IntPtr) pColorAttachmentInfos, | ||||||
| 					(uint) colorAttachmentInfos.Length, | 					(uint) colorAttachmentInfos.Length, | ||||||
| 					IntPtr.Zero | 					IntPtr.Zero | ||||||
|  | @ -100,12 +102,14 @@ namespace MoonWorks.Graphics | ||||||
| 
 | 
 | ||||||
| 			var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh(); | 			var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh(); | ||||||
| 
 | 
 | ||||||
|  | 			Rect renderArea = new Rect((int) colorAttachmentInfos[0].Texture.Width, (int) colorAttachmentInfos[0].Texture.Height); | ||||||
|  | 
 | ||||||
| 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | ||||||
| 			{ | 			{ | ||||||
| 				Refresh.Refresh_BeginRenderPass( | 				Refresh.Refresh_BeginRenderPass( | ||||||
| 					Device.Handle, | 					Device.Handle, | ||||||
| 					Handle, | 					Handle, | ||||||
| 					colorAttachmentInfos[0].RenderTarget.TextureSlice.Rectangle.ToRefresh(), | 					renderArea.ToRefresh(), | ||||||
| 					pColorAttachmentInfos, | 					pColorAttachmentInfos, | ||||||
| 					(uint) colorAttachmentInfos.Length, | 					(uint) colorAttachmentInfos.Length, | ||||||
| 					&refreshDepthStencilAttachmentInfo | 					&refreshDepthStencilAttachmentInfo | ||||||
|  | @ -650,126 +654,19 @@ namespace MoonWorks.Graphics | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
| 		/// Prepares a texture to be presented to a window. | 		/// Acquires a swapchain texture. | ||||||
| 		/// This particular variant of this method will present to the entire window area. | 		/// This texture will be presented to the given window when the command buffer is submitted. | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		/// <param name="texture">The texture to present.</param> | 		public Texture AcquireSwapchainTexture( | ||||||
| 		/// <param name="filter">The filter to use when the texture size differs from the window size.</param> |  | ||||||
| 		public void QueuePresent( |  | ||||||
| 			Texture texture, |  | ||||||
| 			Filter filter, |  | ||||||
| 			Window window | 			Window window | ||||||
| 		) | 		) | ||||||
| 		{ | 		{ | ||||||
| 			var refreshTextureSlice = new Refresh.TextureSlice | 			return new Texture( | ||||||
| 			{ | 				Device, | ||||||
| 				texture = texture.Handle, | 				Refresh.Refresh_AcquireSwapchainTexture(Device.Handle, Handle, window.Handle), | ||||||
| 				rectangle = new Refresh.Rect | 				(TextureFormat) Refresh.Refresh_GetSwapchainFormat(Device.Handle, window.Handle), | ||||||
| 				{ | 				window.Width, | ||||||
| 					x = 0, | 				window.Height | ||||||
| 					y = 0, |  | ||||||
| 					w = (int) texture.Width, |  | ||||||
| 					h = (int) texture.Height |  | ||||||
| 				}, |  | ||||||
| 				layer = 0, |  | ||||||
| 				level = 0, |  | ||||||
| 				depth = 0 |  | ||||||
| 			}; |  | ||||||
| 
 |  | ||||||
| 			Refresh.Refresh_QueuePresent( |  | ||||||
| 				Device.Handle, |  | ||||||
| 				Handle, |  | ||||||
| 				refreshTextureSlice, |  | ||||||
| 				IntPtr.Zero, |  | ||||||
| 				(Refresh.Filter) filter, |  | ||||||
| 				window.Handle |  | ||||||
| 			); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Prepares a texture slice to be presented to a window. |  | ||||||
| 		/// This particular variant of this method will present to the entire window area. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="textureSlice">The texture slice to present.</param> |  | ||||||
| 		/// <param name="filter">The filter to use when the texture size differs from the window size.</param> |  | ||||||
| 		public void QueuePresent( |  | ||||||
| 			in TextureSlice textureSlice, |  | ||||||
| 			Filter filter, |  | ||||||
| 			Window window |  | ||||||
| 		) |  | ||||||
| 		{ |  | ||||||
| 			Refresh.Refresh_QueuePresent( |  | ||||||
| 				Device.Handle, |  | ||||||
| 				Handle, |  | ||||||
| 				textureSlice.ToRefreshTextureSlice(), |  | ||||||
| 				IntPtr.Zero, |  | ||||||
| 				(Refresh.Filter) filter, |  | ||||||
| 				window.Handle |  | ||||||
| 			); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Prepares a texture to be presented to a window. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="texture">The texture to present.</param> |  | ||||||
| 		/// <param name="destinationRectangle">The area of the window to present to.</param> |  | ||||||
| 		/// <param name="filter">The filter to use when the texture size differs from the destination rectangle.</param> |  | ||||||
| 		public void QueuePresent( |  | ||||||
| 			in Texture texture, |  | ||||||
| 			in Rect destinationRectangle, |  | ||||||
| 			Filter filter, |  | ||||||
| 			Window window |  | ||||||
| 		) |  | ||||||
| 		{ |  | ||||||
| 			var refreshRect = destinationRectangle.ToRefresh(); |  | ||||||
| 			var refreshTextureSlice = new Refresh.TextureSlice |  | ||||||
| 			{ |  | ||||||
| 				texture = texture.Handle, |  | ||||||
| 				rectangle = new Refresh.Rect |  | ||||||
| 				{ |  | ||||||
| 					x = 0, |  | ||||||
| 					y = 0, |  | ||||||
| 					w = (int) texture.Width, |  | ||||||
| 					h = (int) texture.Height |  | ||||||
| 				}, |  | ||||||
| 				layer = 0, |  | ||||||
| 				level = 0, |  | ||||||
| 				depth = 0 |  | ||||||
| 			}; |  | ||||||
| 
 |  | ||||||
| 			Refresh.Refresh_QueuePresent( |  | ||||||
| 				Device.Handle, |  | ||||||
| 				Handle, |  | ||||||
| 				refreshTextureSlice, |  | ||||||
| 				refreshRect, |  | ||||||
| 				(Refresh.Filter) filter, |  | ||||||
| 				window.Handle |  | ||||||
| 			); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Prepares a texture slice to be presented to a window. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="textureSlice">The texture slice to present.</param> |  | ||||||
| 		/// <param name="destinationRectangle">The area of the window to present to.</param> |  | ||||||
| 		/// <param name="filter">The filter to use when the texture size differs from the destination rectangle.</param> |  | ||||||
| 		public void QueuePresent( |  | ||||||
| 			in TextureSlice textureSlice, |  | ||||||
| 			in Rect destinationRectangle, |  | ||||||
| 			Filter filter, |  | ||||||
| 			Window window |  | ||||||
| 		) |  | ||||||
| 		{ |  | ||||||
| 			var refreshTextureSlice = textureSlice.ToRefreshTextureSlice(); |  | ||||||
| 			var refreshRect = destinationRectangle.ToRefresh(); |  | ||||||
| 
 |  | ||||||
| 			Refresh.Refresh_QueuePresent( |  | ||||||
| 				Device.Handle, |  | ||||||
| 				Handle, |  | ||||||
| 				refreshTextureSlice, |  | ||||||
| 				refreshRect, |  | ||||||
| 				(Refresh.Filter) filter, |  | ||||||
| 				window.Handle |  | ||||||
| 			); | 			); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -60,6 +60,7 @@ namespace MoonWorks.Graphics | ||||||
| 	public enum TextureFormat | 	public enum TextureFormat | ||||||
| 	{ | 	{ | ||||||
| 		R8G8B8A8, | 		R8G8B8A8, | ||||||
|  | 		B8G8R8A8, | ||||||
| 		R5G6B5, | 		R5G6B5, | ||||||
| 		A1R5G5B5, | 		A1R5G5B5, | ||||||
| 		B4G4R4A4, | 		B4G4R4A4, | ||||||
|  |  | ||||||
|  | @ -148,7 +148,11 @@ namespace MoonWorks.Graphics | ||||||
| 	[StructLayout(LayoutKind.Sequential)] | 	[StructLayout(LayoutKind.Sequential)] | ||||||
| 	public struct ColorAttachmentInfo | 	public struct ColorAttachmentInfo | ||||||
| 	{ | 	{ | ||||||
| 		public RenderTarget RenderTarget; | 		public Texture Texture; | ||||||
|  | 		public uint Depth; | ||||||
|  | 		public uint Layer; | ||||||
|  | 		public uint Level; | ||||||
|  | 		public SampleCount SampleCount; | ||||||
| 		public Color ClearColor; | 		public Color ClearColor; | ||||||
| 		public LoadOp LoadOp; | 		public LoadOp LoadOp; | ||||||
| 		public StoreOp StoreOp; | 		public StoreOp StoreOp; | ||||||
|  | @ -157,7 +161,11 @@ namespace MoonWorks.Graphics | ||||||
| 		{ | 		{ | ||||||
| 			return new Refresh.ColorAttachmentInfo | 			return new Refresh.ColorAttachmentInfo | ||||||
| 			{ | 			{ | ||||||
| 				renderTarget = RenderTarget.Handle, | 				texture = Texture.Handle, | ||||||
|  | 				depth = Depth, | ||||||
|  | 				layer = Layer, | ||||||
|  | 				level = Level, | ||||||
|  | 				sampleCount = (Refresh.SampleCount) SampleCount, | ||||||
| 				clearColor = new Refresh.Vec4 | 				clearColor = new Refresh.Vec4 | ||||||
| 				{ | 				{ | ||||||
| 					x = ClearColor.R / 255f, | 					x = ClearColor.R / 255f, | ||||||
|  | @ -174,8 +182,11 @@ namespace MoonWorks.Graphics | ||||||
| 	[StructLayout(LayoutKind.Sequential)] | 	[StructLayout(LayoutKind.Sequential)] | ||||||
| 	public struct DepthStencilAttachmentInfo | 	public struct DepthStencilAttachmentInfo | ||||||
| 	{ | 	{ | ||||||
| 		public RenderTarget DepthStencilTarget; | 		public Texture Texture; | ||||||
| 		public DepthStencilValue DepthStencilValue; | 		public uint Depth; | ||||||
|  | 		public uint Layer; | ||||||
|  | 		public uint Level; | ||||||
|  | 		public DepthStencilValue DepthStencilClearValue; | ||||||
| 		public LoadOp LoadOp; | 		public LoadOp LoadOp; | ||||||
| 		public StoreOp StoreOp; | 		public StoreOp StoreOp; | ||||||
| 		public LoadOp StencilLoadOp; | 		public LoadOp StencilLoadOp; | ||||||
|  | @ -185,8 +196,11 @@ namespace MoonWorks.Graphics | ||||||
| 		{ | 		{ | ||||||
| 			return new Refresh.DepthStencilAttachmentInfo | 			return new Refresh.DepthStencilAttachmentInfo | ||||||
| 			{ | 			{ | ||||||
| 				depthStencilTarget = DepthStencilTarget.Handle, | 				texture = Texture.Handle, | ||||||
| 				depthStencilValue = DepthStencilValue.ToRefresh(), | 				depth = Depth, | ||||||
|  | 				layer = Layer, | ||||||
|  | 				level = Level, | ||||||
|  | 				depthStencilClearValue = DepthStencilClearValue.ToRefresh(), | ||||||
| 				loadOp = (Refresh.LoadOp) LoadOp, | 				loadOp = (Refresh.LoadOp) LoadOp, | ||||||
| 				storeOp = (Refresh.StoreOp) StoreOp, | 				storeOp = (Refresh.StoreOp) StoreOp, | ||||||
| 				stencilLoadOp = (Refresh.LoadOp) StencilLoadOp, | 				stencilLoadOp = (Refresh.LoadOp) StencilLoadOp, | ||||||
|  |  | ||||||
|  | @ -1,94 +0,0 @@ | ||||||
| using System; |  | ||||||
| using RefreshCS; |  | ||||||
| 
 |  | ||||||
| namespace MoonWorks.Graphics |  | ||||||
| { |  | ||||||
| 	/// <summary> |  | ||||||
| 	/// A render target is a structure that wraps a texture so that it can be rendered to. |  | ||||||
| 	/// </summary> |  | ||||||
| 	public class RenderTarget : GraphicsResource |  | ||||||
| 	{ |  | ||||||
| 		public TextureSlice TextureSlice { get; } |  | ||||||
| 		public TextureFormat Format => TextureSlice.Texture.Format; |  | ||||||
| 
 |  | ||||||
| 		public uint Width => (uint) TextureSlice.Rectangle.W; |  | ||||||
| 		public uint Height => (uint) TextureSlice.Rectangle.H; |  | ||||||
| 
 |  | ||||||
| 		protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget; |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Creates a render target backed by a texture. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="device">An initialized GraphicsDevice.</param> |  | ||||||
| 		/// <param name="width">The width of the render target.</param> |  | ||||||
| 		/// <param name="height">The height of the render target.</param> |  | ||||||
| 		/// <param name="format">The format of the render target.</param> |  | ||||||
| 		/// <param name="canBeSampled">Whether the render target can be used by a sampler.</param> |  | ||||||
| 		/// <param name="sampleCount">The multisample count of the render target.</param> |  | ||||||
| 		/// <param name="levelCount">The mip level of the render target.</param> |  | ||||||
| 		/// <returns></returns> |  | ||||||
| 		public static RenderTarget CreateBackedRenderTarget( |  | ||||||
| 			GraphicsDevice device, |  | ||||||
| 			uint width, |  | ||||||
| 			uint height, |  | ||||||
| 			TextureFormat format, |  | ||||||
| 			bool canBeSampled, |  | ||||||
| 			SampleCount sampleCount = SampleCount.One, |  | ||||||
| 			uint levelCount = 1 |  | ||||||
| 		) |  | ||||||
| 		{ |  | ||||||
| 			TextureUsageFlags flags = 0; |  | ||||||
| 
 |  | ||||||
| 			if ( |  | ||||||
| 				format == TextureFormat.D16 || |  | ||||||
| 				format == TextureFormat.D32 || |  | ||||||
| 				format == TextureFormat.D16S8 || |  | ||||||
| 				format == TextureFormat.D32S8 |  | ||||||
| 			) |  | ||||||
| 			{ |  | ||||||
| 				flags |= TextureUsageFlags.DepthStencilTarget; |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				flags |= TextureUsageFlags.ColorTarget; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			if (canBeSampled) |  | ||||||
| 			{ |  | ||||||
| 				flags |= TextureUsageFlags.Sampler; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			var texture = Texture.CreateTexture2D( |  | ||||||
| 				device, |  | ||||||
| 				width, |  | ||||||
| 				height, |  | ||||||
| 				format, |  | ||||||
| 				flags, |  | ||||||
| 				sampleCount, |  | ||||||
| 				levelCount |  | ||||||
| 			); |  | ||||||
| 
 |  | ||||||
| 			return new RenderTarget(device, new TextureSlice(texture), sampleCount); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Creates a render target using a texture slice and an optional sample count. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="device">An initialized GraphicsDevice.</param> |  | ||||||
| 		/// <param name="textureSlice">The texture slice that will be rendered to.</param> |  | ||||||
| 		/// <param name="sampleCount">The desired multisample count of the render target.</param> |  | ||||||
| 		public RenderTarget( |  | ||||||
| 			GraphicsDevice device, |  | ||||||
| 			in TextureSlice textureSlice, |  | ||||||
| 			SampleCount sampleCount = SampleCount.One |  | ||||||
| 		) : base(device) |  | ||||||
| 		{ |  | ||||||
| 			Handle = Refresh.Refresh_CreateRenderTarget( |  | ||||||
| 				device.Handle, |  | ||||||
| 				textureSlice.ToRefreshTextureSlice(), |  | ||||||
| 				(Refresh.SampleCount) sampleCount |  | ||||||
| 			); |  | ||||||
| 			TextureSlice = textureSlice; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -56,11 +56,16 @@ namespace MoonWorks.Graphics | ||||||
| 			return texture; | 			return texture; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public unsafe static void SavePNG(string path, int width, int height, byte[] pixels) | 		public unsafe static void SavePNG(string path, int width, int height, TextureFormat format, byte[] pixels) | ||||||
| 		{ | 		{ | ||||||
|  | 			if (format != TextureFormat.R8G8B8A8 && format != TextureFormat.B8G8R8A8) | ||||||
|  | 			{ | ||||||
|  | 				throw new ArgumentException("Texture format must be RGBA8 or BGRA8!", "format"); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			fixed (byte* ptr = &pixels[0]) | 			fixed (byte* ptr = &pixels[0]) | ||||||
| 			{ | 			{ | ||||||
| 				Refresh.Refresh_Image_SavePNG(path, width, height, (IntPtr) ptr); | 				Refresh.Refresh_Image_SavePNG(path, width, height, Conversions.BoolToByte(format == TextureFormat.B8G8R8A8), (IntPtr) ptr); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -191,8 +196,28 @@ namespace MoonWorks.Graphics | ||||||
| 			IsCube = textureCreateInfo.IsCube; | 			IsCube = textureCreateInfo.IsCube; | ||||||
| 			SampleCount = textureCreateInfo.SampleCount; | 			SampleCount = textureCreateInfo.SampleCount; | ||||||
| 			LevelCount = textureCreateInfo.LevelCount; | 			LevelCount = textureCreateInfo.LevelCount; | ||||||
| 			SampleCount = textureCreateInfo.SampleCount; |  | ||||||
| 			UsageFlags = textureCreateInfo.UsageFlags; | 			UsageFlags = textureCreateInfo.UsageFlags; | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		// Used by AcquireSwapchainTexture. | ||||||
|  | 		internal Texture( | ||||||
|  | 			GraphicsDevice device, | ||||||
|  | 			IntPtr handle, | ||||||
|  | 			TextureFormat format, | ||||||
|  | 			uint width, | ||||||
|  | 			uint height | ||||||
|  | 		) : base(device) | ||||||
|  | 		{ | ||||||
|  | 			Handle = handle; | ||||||
|  | 
 | ||||||
|  | 			Format = format; | ||||||
|  | 			Width = width; | ||||||
|  | 			Height = height; | ||||||
|  | 			Depth = 1; | ||||||
|  | 			IsCube = false; | ||||||
|  | 			SampleCount = SampleCount.One; | ||||||
|  | 			LevelCount = 1; | ||||||
|  | 			UsageFlags = TextureUsageFlags.ColorTarget; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue