render pass streamline
							parent
							
								
									8a3d93d2dc
								
							
						
					
					
						commit
						48c31b4908
					
				|  | @ -1 +1 @@ | ||||||
| Subproject commit 1e8abe379a0ccc891ce0f4d90793feac59d30948 | Subproject commit cb949b8205eb2454dd0c9f4c84d41c6647802408 | ||||||
|  | @ -27,98 +27,137 @@ namespace MoonWorks.Graphics | ||||||
| 		/// All render state, resource binding, and draw commands must be made within a render pass. | 		/// All render state, resource binding, and draw commands must be made within a render pass. | ||||||
| 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. | 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		/// <param name="renderPass">The render pass object to begin.</param> | 		/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param> | ||||||
| 		/// <param name="framebuffer">The framebuffer used by the render pass.</param> |  | ||||||
| 		public unsafe void BeginRenderPass( | 		public unsafe void BeginRenderPass( | ||||||
| 			RenderPass renderPass, | 			params ColorAttachmentInfo[] colorAttachmentInfos | ||||||
| 			Framebuffer framebuffer |  | ||||||
| 		) | 		) | ||||||
| 		{ | 		{ | ||||||
| 			var renderArea = new Rect | #if DEBUG | ||||||
|  | 			if (colorAttachmentInfos.Length == 0) | ||||||
| 			{ | 			{ | ||||||
| 				X = 0, | 				Logger.LogError("Render pass must contain at least one attachment!"); | ||||||
| 				Y = 0, | 				return; | ||||||
| 				W = (int) framebuffer.Width, | 			} | ||||||
| 				H = (int) framebuffer.Height |  | ||||||
| 			}; |  | ||||||
| 
 | 
 | ||||||
|  | 			if (colorAttachmentInfos.Length > 4) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogError("Render pass cannot have more than 4 color attachments!"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 			var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; | ||||||
|  | 
 | ||||||
|  | 			for (var i = 0; i < colorAttachmentInfos.Length; i += 1) | ||||||
|  | 			{ | ||||||
|  | 				refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | ||||||
|  | 			{ | ||||||
| 				Refresh.Refresh_BeginRenderPass( | 				Refresh.Refresh_BeginRenderPass( | ||||||
| 					Device.Handle, | 					Device.Handle, | ||||||
| 					Handle, | 					Handle, | ||||||
| 				renderPass.Handle, | 					colorAttachmentInfos[0].renderTarget.TextureSlice.Rectangle.ToRefresh(), | ||||||
| 				framebuffer.Handle, | 					(IntPtr) pColorAttachmentInfos, | ||||||
| 				renderArea.ToRefresh(), | 					(uint) colorAttachmentInfos.Length, | ||||||
| 				IntPtr.Zero, |  | ||||||
| 				0, |  | ||||||
| 					IntPtr.Zero | 					IntPtr.Zero | ||||||
| 				); | 				); | ||||||
| 			} | 			} | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
| 		/// Begins a render pass. | 		/// Begins a render pass. | ||||||
| 		/// All render state, resource binding, and draw commands must be made within a render pass. | 		/// All render state, resource binding, and draw commands must be made within a render pass. | ||||||
| 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. | 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		/// <param name="renderPass">The render pass object to begin.</param> | 		/// <param name="depthStencilAttachmentInfo">The depth stencil attachment to use in the render pass.</param> | ||||||
| 		/// <param name="framebuffer">The framebuffer used by the render pass.</param> | 		/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param> | ||||||
| 		/// <param name="renderArea">The screen area of the render pass.</param> |  | ||||||
| 		public unsafe void BeginRenderPass( | 		public unsafe void BeginRenderPass( | ||||||
| 			RenderPass renderPass, | 			DepthStencilAttachmentInfo depthStencilAttachmentInfo, | ||||||
| 			Framebuffer framebuffer, | 			params ColorAttachmentInfo[] colorAttachmentInfos | ||||||
| 			in Rect renderArea |  | ||||||
| 		) | 		) | ||||||
| 		{ | 		{ | ||||||
|  | #if DEBUG | ||||||
|  | 			if (colorAttachmentInfos.Length == 0) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogError("Render pass must contain at least one attachment!"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (colorAttachmentInfos.Length > 4) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogError("Render pass cannot have more than 4 color attachments!"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 			var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; | ||||||
|  | 
 | ||||||
|  | 			for (var i = 0; i < colorAttachmentInfos.Length; i += 1) | ||||||
|  | 			{ | ||||||
|  | 				refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh(); | ||||||
|  | 
 | ||||||
|  | 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | ||||||
|  | 			{ | ||||||
|  | 				Refresh.Refresh_BeginRenderPass( | ||||||
|  | 					Device.Handle, | ||||||
|  | 					Handle, | ||||||
|  | 					colorAttachmentInfos[0].renderTarget.TextureSlice.Rectangle.ToRefresh(), | ||||||
|  | 					pColorAttachmentInfos, | ||||||
|  | 					(uint) colorAttachmentInfos.Length, | ||||||
|  | 					&refreshDepthStencilAttachmentInfo | ||||||
|  | 				); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/// <summary> | ||||||
|  | 		/// Begins a render pass. | ||||||
|  | 		/// All render state, resource binding, and draw commands must be made within a render pass. | ||||||
|  | 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. | ||||||
|  | 		/// </summary> | ||||||
|  | 		/// <param name="renderArea">The rectangle that should be drawn to on the attachments.</param> | ||||||
|  | 		/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param> | ||||||
|  | 		public unsafe void BeginRenderPass( | ||||||
|  | 			in Rect renderArea, | ||||||
|  | 			params ColorAttachmentInfo[] colorAttachmentInfos | ||||||
|  | 		) | ||||||
|  | 		{ | ||||||
|  | #if DEBUG | ||||||
|  | 			if (colorAttachmentInfos.Length == 0) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogError("Render pass must contain at least one attachment!"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (colorAttachmentInfos.Length > 4) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogError("Render pass cannot have more than 4 color attachments!"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 			var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; | ||||||
|  | 
 | ||||||
|  | 			for (var i = 0; i < colorAttachmentInfos.Length; i += 1) | ||||||
|  | 			{ | ||||||
|  | 				refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | ||||||
|  | 			{ | ||||||
| 				Refresh.Refresh_BeginRenderPass( | 				Refresh.Refresh_BeginRenderPass( | ||||||
| 					Device.Handle, | 					Device.Handle, | ||||||
| 					Handle, | 					Handle, | ||||||
| 				renderPass.Handle, |  | ||||||
| 				framebuffer.Handle, |  | ||||||
| 					renderArea.ToRefresh(), | 					renderArea.ToRefresh(), | ||||||
| 				IntPtr.Zero, | 					(IntPtr) pColorAttachmentInfos, | ||||||
| 				0, | 					(uint) colorAttachmentInfos.Length, | ||||||
| 					IntPtr.Zero | 					IntPtr.Zero | ||||||
| 				); | 				); | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Begins a render pass. |  | ||||||
| 		/// All render state, resource binding, and draw commands must be made within a render pass. |  | ||||||
| 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="renderPass">The render pass object to begin.</param> |  | ||||||
| 		/// <param name="framebuffer">The framebuffer used by the render pass.</param> |  | ||||||
| 		/// <param name="renderArea">The screen area of the render pass.</param> |  | ||||||
| 		/// <param name="clearColors">Color clear values for each render target in the framebuffer.</param> |  | ||||||
| 		public unsafe void BeginRenderPass( |  | ||||||
| 			RenderPass renderPass, |  | ||||||
| 			Framebuffer framebuffer, |  | ||||||
| 			in Rect renderArea, |  | ||||||
| 			params Vector4[] clearColors |  | ||||||
| 		) |  | ||||||
| 		{ |  | ||||||
| 			Refresh.Vec4* colors = stackalloc Refresh.Vec4[clearColors.Length]; |  | ||||||
| 
 |  | ||||||
| 			for (var i = 0; i < clearColors.Length; i++) |  | ||||||
| 			{ |  | ||||||
| 				colors[i] = new Refresh.Vec4 |  | ||||||
| 				{ |  | ||||||
| 					x = clearColors[i].X, |  | ||||||
| 					y = clearColors[i].Y, |  | ||||||
| 					z = clearColors[i].Z, |  | ||||||
| 					w = clearColors[i].W |  | ||||||
| 				}; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			Refresh.Refresh_BeginRenderPass( |  | ||||||
| 				Device.Handle, |  | ||||||
| 				Handle, |  | ||||||
| 				renderPass.Handle, |  | ||||||
| 				framebuffer.Handle, |  | ||||||
| 				renderArea.ToRefresh(), |  | ||||||
| 				(IntPtr) colors, |  | ||||||
| 				(uint) clearColors.Length, |  | ||||||
| 				IntPtr.Zero |  | ||||||
| 			); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
|  | @ -126,70 +165,49 @@ namespace MoonWorks.Graphics | ||||||
| 		/// All render state, resource binding, and draw commands must be made within a render pass. | 		/// All render state, resource binding, and draw commands must be made within a render pass. | ||||||
| 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. | 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		/// <param name="renderPass">The render pass object to begin.</param> | 		/// <param name="renderArea">The rectangle that should be drawn to on the attachments.</param> | ||||||
| 		/// <param name="framebuffer">The framebuffer used by the render pass.</param> | 		/// <param name="depthStencilAttachmentInfo">The depth stencil attachment to use in the render pass.</param> | ||||||
| 		/// <param name="renderArea">The screen area of the render pass.</param> | 		/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param> | ||||||
| 		/// <param name="depthStencilClearValue">Clear values for the depth/stencil buffer. This is ignored if the render pass does not clear.</param> |  | ||||||
| 		public unsafe void BeginRenderPass( | 		public unsafe void BeginRenderPass( | ||||||
| 			RenderPass renderPass, |  | ||||||
| 			Framebuffer framebuffer, |  | ||||||
| 			in Rect renderArea, | 			in Rect renderArea, | ||||||
| 			in DepthStencilValue depthStencilClearValue | 			DepthStencilAttachmentInfo depthStencilAttachmentInfo, | ||||||
|  | 			params ColorAttachmentInfo[] colorAttachmentInfos | ||||||
| 		) | 		) | ||||||
| 		{ | 		{ | ||||||
|  | #if DEBUG | ||||||
|  | 			if (colorAttachmentInfos.Length == 0) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogError("Render pass must contain at least one attachment!"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (colorAttachmentInfos.Length > 4) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogError("Render pass cannot have more than 4 color attachments!"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 			var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; | ||||||
|  | 
 | ||||||
|  | 			for (var i = 0; i < colorAttachmentInfos.Length; i += 1) | ||||||
|  | 			{ | ||||||
|  | 				refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh(); | ||||||
|  | 
 | ||||||
|  | 			fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) | ||||||
|  | 			{ | ||||||
| 				Refresh.Refresh_BeginRenderPass( | 				Refresh.Refresh_BeginRenderPass( | ||||||
| 					Device.Handle, | 					Device.Handle, | ||||||
| 					Handle, | 					Handle, | ||||||
| 				renderPass.Handle, |  | ||||||
| 				framebuffer.Handle, |  | ||||||
| 					renderArea.ToRefresh(), | 					renderArea.ToRefresh(), | ||||||
| 				IntPtr.Zero, | 					pColorAttachmentInfos, | ||||||
| 				0, | 					(uint) colorAttachmentInfos.Length, | ||||||
| 				depthStencilClearValue.ToRefresh() | 					&refreshDepthStencilAttachmentInfo | ||||||
| 				); | 				); | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Begins a render pass. |  | ||||||
| 		/// All render state, resource binding, and draw commands must be made within a render pass. |  | ||||||
| 		/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="renderPass">The render pass object to begin.</param> |  | ||||||
| 		/// <param name="framebuffer">The framebuffer used by the render pass.</param> |  | ||||||
| 		/// <param name="renderArea">The screen area of the render pass.</param> |  | ||||||
| 		/// <param name="depthStencilClearValue">Clear values for the depth/stencil buffer. This is ignored if the render pass does not clear.</param> |  | ||||||
| 		/// <param name="clearColors">Color clear values for each render target in the framebuffer.</param> |  | ||||||
| 		public unsafe void BeginRenderPass( |  | ||||||
| 			RenderPass renderPass, |  | ||||||
| 			Framebuffer framebuffer, |  | ||||||
| 			in Rect renderArea, |  | ||||||
| 			in DepthStencilValue depthStencilClearValue, |  | ||||||
| 			params Vector4[] clearColors |  | ||||||
| 		) |  | ||||||
| 		{ |  | ||||||
| 			Refresh.Vec4* colors = stackalloc Refresh.Vec4[clearColors.Length]; |  | ||||||
| 
 |  | ||||||
| 			for (var i = 0; i < clearColors.Length; i++) |  | ||||||
| 			{ |  | ||||||
| 				colors[i] = new Refresh.Vec4 |  | ||||||
| 				{ |  | ||||||
| 					x = clearColors[i].X, |  | ||||||
| 					y = clearColors[i].Y, |  | ||||||
| 					z = clearColors[i].Z, |  | ||||||
| 					w = clearColors[i].W |  | ||||||
| 				}; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			Refresh.Refresh_BeginRenderPass( |  | ||||||
| 				Device.Handle, |  | ||||||
| 				Handle, |  | ||||||
| 				renderPass.Handle, |  | ||||||
| 				framebuffer.Handle, |  | ||||||
| 				renderArea.ToRefresh(), |  | ||||||
| 				(IntPtr) colors, |  | ||||||
| 				(uint) clearColors.Length, |  | ||||||
| 				depthStencilClearValue.ToRefresh() |  | ||||||
| 			); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
|  |  | ||||||
|  | @ -72,25 +72,6 @@ namespace MoonWorks.Graphics | ||||||
| 		public uint Offset; | 		public uint Offset; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	[StructLayout(LayoutKind.Sequential)] |  | ||||||
| 	public struct ColorTargetDescription |  | ||||||
| 	{ |  | ||||||
| 		public TextureFormat Format; |  | ||||||
| 		public SampleCount MultisampleCount; |  | ||||||
| 		public LoadOp LoadOp; |  | ||||||
| 		public StoreOp StoreOp; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	[StructLayout(LayoutKind.Sequential)] |  | ||||||
| 	public struct DepthStencilTargetDescription |  | ||||||
| 	{ |  | ||||||
| 		public TextureFormat Format; |  | ||||||
| 		public LoadOp LoadOp; |  | ||||||
| 		public StoreOp StoreOp; |  | ||||||
| 		public LoadOp StencilLoadOp; |  | ||||||
| 		public StoreOp StencilStoreOp; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	[StructLayout(LayoutKind.Sequential)] | 	[StructLayout(LayoutKind.Sequential)] | ||||||
| 	public struct StencilOpState | 	public struct StencilOpState | ||||||
| 	{ | 	{ | ||||||
|  | @ -117,4 +98,61 @@ namespace MoonWorks.Graphics | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	[StructLayout(LayoutKind.Sequential)] | ||||||
|  | 	public struct ColorAttachmentInfo | ||||||
|  | 	{ | ||||||
|  | 		public RenderTarget renderTarget; | ||||||
|  | 		public Color clearColor; | ||||||
|  | 		public LoadOp loadOp; | ||||||
|  | 		public StoreOp storeOp; | ||||||
|  | 
 | ||||||
|  | 		public Refresh.ColorAttachmentInfo ToRefresh() | ||||||
|  | 		{ | ||||||
|  | 			return new Refresh.ColorAttachmentInfo | ||||||
|  | 			{ | ||||||
|  | 				renderTarget = renderTarget.Handle, | ||||||
|  | 				clearColor = new Refresh.Vec4 | ||||||
|  | 				{ | ||||||
|  | 					x = clearColor.R, | ||||||
|  | 					y = clearColor.G, | ||||||
|  | 					z = clearColor.B, | ||||||
|  | 					w = clearColor.A | ||||||
|  | 				}, | ||||||
|  | 				loadOp = (Refresh.LoadOp) loadOp, | ||||||
|  | 				storeOp = (Refresh.StoreOp) storeOp | ||||||
|  | 			}; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	[StructLayout(LayoutKind.Sequential)] | ||||||
|  | 	public struct DepthStencilAttachmentInfo | ||||||
|  | 	{ | ||||||
|  | 		public RenderTarget depthStencilTarget; | ||||||
|  | 		public DepthStencilValue depthStencilValue; | ||||||
|  | 		public LoadOp loadOp; | ||||||
|  | 		public StoreOp storeOp; | ||||||
|  | 		public LoadOp stencilLoadOp; | ||||||
|  | 		public StoreOp stencilStoreOp; | ||||||
|  | 
 | ||||||
|  | 		public Refresh.DepthStencilAttachmentInfo ToRefresh() | ||||||
|  | 		{ | ||||||
|  | 			return new Refresh.DepthStencilAttachmentInfo | ||||||
|  | 			{ | ||||||
|  | 				depthStencilTarget = depthStencilTarget.Handle, | ||||||
|  | 				depthStencilValue = depthStencilValue.ToRefresh(), | ||||||
|  | 				loadOp = (Refresh.LoadOp) loadOp, | ||||||
|  | 				storeOp = (Refresh.StoreOp) storeOp, | ||||||
|  | 				stencilLoadOp = (Refresh.LoadOp) stencilLoadOp, | ||||||
|  | 				stencilStoreOp = (Refresh.StoreOp) stencilStoreOp | ||||||
|  | 			}; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	[StructLayout(LayoutKind.Sequential)] | ||||||
|  | 	public struct ColorAttachmentDescription | ||||||
|  | 	{ | ||||||
|  | 		public TextureFormat format; | ||||||
|  | 		public SampleCount sampleCount; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,86 +0,0 @@ | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using RefreshCS; |  | ||||||
| 
 |  | ||||||
| namespace MoonWorks.Graphics |  | ||||||
| { |  | ||||||
| 	/// <summary> |  | ||||||
| 	/// A framebuffer is a collection of render targets that is rendered to during a render pass. |  | ||||||
| 	/// </summary> |  | ||||||
| 	public class Framebuffer : GraphicsResource |  | ||||||
| 	{ |  | ||||||
| 		protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyFramebuffer; |  | ||||||
| 
 |  | ||||||
| 		public RenderTarget DepthStencilTarget { get; } |  | ||||||
| 
 |  | ||||||
| 		private RenderTarget[] colorTargets { get; } |  | ||||||
| 		public IEnumerable<RenderTarget> ColorTargets => colorTargets; |  | ||||||
| 
 |  | ||||||
| 		public RenderPass RenderPass { get; } |  | ||||||
| 		public uint Width { get; } |  | ||||||
| 		public uint Height { get; } |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Creates a framebuffer. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="device">An initialized GraphicsDevice.</param> |  | ||||||
| 		/// <param name="width">The width of the framebuffer.</param> |  | ||||||
| 		/// <param name="height">The height of the framebuffer.</param> |  | ||||||
| 		/// <param name="renderPass">The reference render pass for the framebuffer.</param> |  | ||||||
| 		/// <param name="depthStencilTarget">The depth stencil target. Can be null.</param> |  | ||||||
| 		/// <param name="colorTargets">Anywhere from 0-4 color targets can be provided.</param> |  | ||||||
| 		public unsafe Framebuffer( |  | ||||||
| 			GraphicsDevice device, |  | ||||||
| 			uint width, |  | ||||||
| 			uint height, |  | ||||||
| 			RenderPass renderPass, |  | ||||||
| 			RenderTarget depthStencilTarget, |  | ||||||
| 			params RenderTarget[] colorTargets |  | ||||||
| 		) : base(device) |  | ||||||
| 		{ |  | ||||||
| 			IntPtr[] colorTargetHandles = new IntPtr[colorTargets.Length]; |  | ||||||
| 			for (var i = 0; i < colorTargets.Length; i += 1) |  | ||||||
| 			{ |  | ||||||
| 				colorTargetHandles[i] = colorTargets[i].Handle; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			IntPtr depthStencilTargetHandle; |  | ||||||
| 			if (depthStencilTarget == null) |  | ||||||
| 			{ |  | ||||||
| 				depthStencilTargetHandle = IntPtr.Zero; |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				depthStencilTargetHandle = depthStencilTarget.Handle; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			fixed (IntPtr* colorTargetHandlesPtr = colorTargetHandles) |  | ||||||
| 			{ |  | ||||||
| 				Refresh.FramebufferCreateInfo framebufferCreateInfo = new Refresh.FramebufferCreateInfo |  | ||||||
| 				{ |  | ||||||
| 					width = width, |  | ||||||
| 					height = height, |  | ||||||
| 					colorTargetCount = (uint) colorTargets.Length, |  | ||||||
| 					pColorTargets = (IntPtr) colorTargetHandlesPtr, |  | ||||||
| 					depthStencilTarget = depthStencilTargetHandle, |  | ||||||
| 					renderPass = renderPass.Handle |  | ||||||
| 				}; |  | ||||||
| 
 |  | ||||||
| 				Handle = Refresh.Refresh_CreateFramebuffer(device.Handle, framebufferCreateInfo); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			DepthStencilTarget = depthStencilTarget; |  | ||||||
| 
 |  | ||||||
| 			this.colorTargets = new RenderTarget[colorTargets.Length]; |  | ||||||
| 			for (var i = 0; i < colorTargets.Length; i++) |  | ||||||
| 			{ |  | ||||||
| 				this.colorTargets[i] = colorTargets[i]; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			RenderPass = renderPass; |  | ||||||
| 
 |  | ||||||
| 			Width = width; |  | ||||||
| 			Height = height; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -14,7 +14,6 @@ namespace MoonWorks.Graphics | ||||||
| 
 | 
 | ||||||
| 		public ShaderStageState VertexShaderState { get; } | 		public ShaderStageState VertexShaderState { get; } | ||||||
| 		public ShaderStageState FragmentShaderState { get; } | 		public ShaderStageState FragmentShaderState { get; } | ||||||
| 		public RenderPass RenderPass { get; } |  | ||||||
| 
 | 
 | ||||||
| 		public unsafe GraphicsPipeline( | 		public unsafe GraphicsPipeline( | ||||||
| 			GraphicsDevice device, | 			GraphicsDevice device, | ||||||
|  | @ -31,7 +30,7 @@ namespace MoonWorks.Graphics | ||||||
| 			PrimitiveType primitiveType = graphicsPipelineCreateInfo.PrimitiveType; | 			PrimitiveType primitiveType = graphicsPipelineCreateInfo.PrimitiveType; | ||||||
| 			VertexInputState vertexInputState = graphicsPipelineCreateInfo.VertexInputState; | 			VertexInputState vertexInputState = graphicsPipelineCreateInfo.VertexInputState; | ||||||
| 			ViewportState viewportState = graphicsPipelineCreateInfo.ViewportState; | 			ViewportState viewportState = graphicsPipelineCreateInfo.ViewportState; | ||||||
| 			RenderPass renderPass = graphicsPipelineCreateInfo.RenderPass; | 			GraphicsPipelineAttachmentInfo attachmentInfo = graphicsPipelineCreateInfo.AttachmentInfo; | ||||||
| 
 | 
 | ||||||
| 			var vertexAttributesHandle = GCHandle.Alloc( | 			var vertexAttributesHandle = GCHandle.Alloc( | ||||||
| 				vertexInputState.VertexAttributes, | 				vertexInputState.VertexAttributes, | ||||||
|  | @ -49,6 +48,10 @@ namespace MoonWorks.Graphics | ||||||
| 				viewportState.Scissors, | 				viewportState.Scissors, | ||||||
| 				GCHandleType.Pinned | 				GCHandleType.Pinned | ||||||
| 			); | 			); | ||||||
|  | 			var colorAttachmentDescriptionsHandle = GCHandle.Alloc( | ||||||
|  | 				attachmentInfo.colorAttachmentDescriptions, | ||||||
|  | 				GCHandleType.Pinned | ||||||
|  | 			); | ||||||
| 
 | 
 | ||||||
| 			var colorTargetBlendStates = stackalloc Refresh.ColorTargetBlendState[ | 			var colorTargetBlendStates = stackalloc Refresh.ColorTargetBlendState[ | ||||||
| 				colorBlendState.ColorTargetBlendStates.Length | 				colorBlendState.ColorTargetBlendStates.Length | ||||||
|  | @ -115,7 +118,11 @@ namespace MoonWorks.Graphics | ||||||
| 			refreshGraphicsPipelineCreateInfo.viewportState.scissorCount = (uint) viewportState.Scissors.Length; | 			refreshGraphicsPipelineCreateInfo.viewportState.scissorCount = (uint) viewportState.Scissors.Length; | ||||||
| 
 | 
 | ||||||
| 			refreshGraphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType; | 			refreshGraphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType; | ||||||
| 			refreshGraphicsPipelineCreateInfo.renderPass = renderPass.Handle; | 
 | ||||||
|  | 			refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentCount = attachmentInfo.colorAttachmentCount; | ||||||
|  | 			refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentDescriptions = colorAttachmentDescriptionsHandle.AddrOfPinnedObject(); | ||||||
|  | 			refreshGraphicsPipelineCreateInfo.attachmentInfo.depthStencilFormat = (Refresh.TextureFormat) attachmentInfo.depthStencilFormat; | ||||||
|  | 			refreshGraphicsPipelineCreateInfo.attachmentInfo.hasDepthStencilAttachment = Conversions.BoolToByte(attachmentInfo.hasDepthStencilAttachment); | ||||||
| 
 | 
 | ||||||
| 			Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, refreshGraphicsPipelineCreateInfo); | 			Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, refreshGraphicsPipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|  | @ -123,10 +130,10 @@ namespace MoonWorks.Graphics | ||||||
| 			vertexBindingsHandle.Free(); | 			vertexBindingsHandle.Free(); | ||||||
| 			viewportHandle.Free(); | 			viewportHandle.Free(); | ||||||
| 			scissorHandle.Free(); | 			scissorHandle.Free(); | ||||||
|  | 			colorAttachmentDescriptionsHandle.Free(); | ||||||
| 
 | 
 | ||||||
| 			VertexShaderState = vertexShaderState; | 			VertexShaderState = vertexShaderState; | ||||||
| 			FragmentShaderState = fragmentShaderState; | 			FragmentShaderState = fragmentShaderState; | ||||||
| 			RenderPass = renderPass; |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,59 +0,0 @@ | ||||||
| using System; |  | ||||||
| using RefreshCS; |  | ||||||
| 
 |  | ||||||
| namespace MoonWorks.Graphics |  | ||||||
| { |  | ||||||
| 	/// <summary> |  | ||||||
| 	/// A render pass describes the kind of render targets that will be used in rendering. |  | ||||||
| 	/// </summary> |  | ||||||
| 	public class RenderPass : GraphicsResource |  | ||||||
| 	{ |  | ||||||
| 		protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderPass; |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Creates a render pass using color target descriptions. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="device">An initialized GraphicsDevice.</param> |  | ||||||
| 		/// <param name="colorTargetDescriptions">Up to 4 color target descriptions may be provided.</param> |  | ||||||
| 		public unsafe RenderPass( |  | ||||||
| 			GraphicsDevice device, |  | ||||||
| 			params ColorTargetDescription[] colorTargetDescriptions |  | ||||||
| 		) : base(device) |  | ||||||
| 		{ |  | ||||||
| 			fixed (ColorTargetDescription* ptr = colorTargetDescriptions) |  | ||||||
| 			{ |  | ||||||
| 				Refresh.RenderPassCreateInfo renderPassCreateInfo; |  | ||||||
| 				renderPassCreateInfo.colorTargetCount = (uint) colorTargetDescriptions.Length; |  | ||||||
| 				renderPassCreateInfo.colorTargetDescriptions = (IntPtr) ptr; |  | ||||||
| 				renderPassCreateInfo.depthStencilTargetDescription = IntPtr.Zero; |  | ||||||
| 
 |  | ||||||
| 				Handle = Refresh.Refresh_CreateRenderPass(device.Handle, renderPassCreateInfo); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		/// <summary> |  | ||||||
| 		/// Creates a render pass using a depth/stencil target description and optional color target descriptions. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// <param name="device">An initialized GraphicsDevice.</param> |  | ||||||
| 		/// <param name="depthStencilTargetDescription">A depth/stencil target description.</param> |  | ||||||
| 		/// <param name="colorTargetDescriptions">Up to 4 color target descriptions may be provided.</param> |  | ||||||
| 		public unsafe RenderPass( |  | ||||||
| 			GraphicsDevice device, |  | ||||||
| 			in DepthStencilTargetDescription depthStencilTargetDescription, |  | ||||||
| 			params ColorTargetDescription[] colorTargetDescriptions |  | ||||||
| 		) : base(device) |  | ||||||
| 		{ |  | ||||||
| 
 |  | ||||||
| 			fixed (DepthStencilTargetDescription* depthStencilPtr = &depthStencilTargetDescription) |  | ||||||
| 			fixed (ColorTargetDescription* colorPtr = colorTargetDescriptions) |  | ||||||
| 			{ |  | ||||||
| 				Refresh.RenderPassCreateInfo renderPassCreateInfo; |  | ||||||
| 				renderPassCreateInfo.colorTargetCount = (uint) colorTargetDescriptions.Length; |  | ||||||
| 				renderPassCreateInfo.colorTargetDescriptions = (IntPtr) colorPtr; |  | ||||||
| 				renderPassCreateInfo.depthStencilTargetDescription = (IntPtr) depthStencilPtr; |  | ||||||
| 
 |  | ||||||
| 				Handle = Refresh.Refresh_CreateRenderPass(device.Handle, renderPassCreateInfo); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -11,6 +11,9 @@ namespace MoonWorks.Graphics | ||||||
| 		public TextureSlice TextureSlice { get; } | 		public TextureSlice TextureSlice { get; } | ||||||
| 		public TextureFormat Format => TextureSlice.Texture.Format; | 		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; | 		protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget; | ||||||
| 
 | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | namespace MoonWorks.Graphics | ||||||
|  | { | ||||||
|  | 	/// <summary> | ||||||
|  | 	/// Describes the kind of attachments that will be used with this pipeline. | ||||||
|  | 	/// </summary> | ||||||
|  | 	public struct GraphicsPipelineAttachmentInfo | ||||||
|  | 	{ | ||||||
|  | 		public ColorAttachmentDescription[] colorAttachmentDescriptions; | ||||||
|  | 		public uint colorAttachmentCount; | ||||||
|  | 		public bool hasDepthStencilAttachment; | ||||||
|  | 		public TextureFormat depthStencilFormat; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -12,6 +12,6 @@ | ||||||
| 		public PrimitiveType PrimitiveType; | 		public PrimitiveType PrimitiveType; | ||||||
| 		public VertexInputState VertexInputState; | 		public VertexInputState VertexInputState; | ||||||
| 		public ViewportState ViewportState; | 		public ViewportState ViewportState; | ||||||
| 		public RenderPass RenderPass; | 		public GraphicsPipelineAttachmentInfo AttachmentInfo; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ | ||||||
| 
 | 
 | ||||||
| 		public static bool ByteToBool(byte b) | 		public static bool ByteToBool(byte b) | ||||||
| 		{ | 		{ | ||||||
| 			return b == 0 ? false : true; | 			return b != 0; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue