| 
									
										
										
										
											2023-01-03 18:27:48 +00:00
										 |  |  |  | using MoonWorks; | 
					
						
							|  |  |  |  | using MoonWorks.Graphics; | 
					
						
							|  |  |  |  | using MoonWorks.Math.Float; | 
					
						
							|  |  |  |  | using System.Runtime.InteropServices; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace MoonWorks.Test | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     class DrawIndirectGame : Game | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         private GraphicsPipeline graphicsPipeline; | 
					
						
							|  |  |  |  |         private Buffer vertexBuffer; | 
					
						
							|  |  |  |  |         private Buffer drawBuffer; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public DrawIndirectGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             // Load the shaders | 
					
						
							| 
									
										
										
										
											2023-07-01 17:41:42 +00:00
										 |  |  |  |             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionColor.vert")); | 
					
						
							|  |  |  |  |             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | 
					
						
							| 
									
										
										
										
											2023-01-03 18:27:48 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             // Create the graphics pipeline | 
					
						
							|  |  |  |  |             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 
					
						
							|  |  |  |  |                 MainWindow.SwapchainFormat, | 
					
						
							|  |  |  |  |                 vertShaderModule, | 
					
						
							|  |  |  |  |                 fragShaderModule | 
					
						
							|  |  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2023-01-06 20:38:30 +00:00
										 |  |  |  |             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(); | 
					
						
							| 
									
										
										
										
											2023-01-03 18:27:48 +00:00
										 |  |  |  |             graphicsPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             // Create and populate the vertex buffer | 
					
						
							|  |  |  |  |             vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 6); | 
					
						
							| 
									
										
										
										
											2023-01-04 20:45:10 +00:00
										 |  |  |  |             drawBuffer = Buffer.Create<IndirectDrawCommand>(GraphicsDevice, BufferUsageFlags.Indirect, 2); | 
					
						
							| 
									
										
										
										
											2023-01-03 18:27:48 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 
					
						
							|  |  |  |  |             cmdbuf.SetBufferData( | 
					
						
							|  |  |  |  |                 vertexBuffer, | 
					
						
							|  |  |  |  |                 new PositionColorVertex[] | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     new PositionColorVertex(new Vector3(-0.5f, -1, 0), Color.Blue), | 
					
						
							|  |  |  |  |                     new PositionColorVertex(new Vector3(-1f, 1, 0), Color.Green), | 
					
						
							|  |  |  |  |                     new PositionColorVertex(new Vector3(0f, 1, 0), Color.Red), | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                     new PositionColorVertex(new Vector3(.5f, -1, 0), Color.Blue), | 
					
						
							|  |  |  |  |                     new PositionColorVertex(new Vector3(1f, 1, 0), Color.Green), | 
					
						
							|  |  |  |  |                     new PositionColorVertex(new Vector3(0f, 1, 0), Color.Red), | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             ); | 
					
						
							|  |  |  |  |             cmdbuf.SetBufferData( | 
					
						
							|  |  |  |  |                 drawBuffer, | 
					
						
							| 
									
										
										
										
											2023-01-04 20:45:10 +00:00
										 |  |  |  |                 new IndirectDrawCommand[] | 
					
						
							| 
									
										
										
										
											2023-01-03 18:27:48 +00:00
										 |  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2023-01-04 20:45:10 +00:00
										 |  |  |  |                     new IndirectDrawCommand(3, 1, 3, 0), | 
					
						
							|  |  |  |  |                     new IndirectDrawCommand(3, 1, 0, 0), | 
					
						
							| 
									
										
										
										
											2023-01-03 18:27:48 +00:00
										 |  |  |  |                 } | 
					
						
							|  |  |  |  |             ); | 
					
						
							|  |  |  |  |             GraphicsDevice.Submit(cmdbuf); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         protected override void Update(System.TimeSpan delta) { } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         protected override void Draw(double alpha) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 
					
						
							|  |  |  |  |             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 
					
						
							|  |  |  |  |             if (backbuffer != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | 
					
						
							|  |  |  |  |                 cmdbuf.BindGraphicsPipeline(graphicsPipeline); | 
					
						
							|  |  |  |  |                 cmdbuf.BindVertexBuffers(new BufferBinding(vertexBuffer, 0)); | 
					
						
							| 
									
										
										
										
											2023-01-04 20:45:10 +00:00
										 |  |  |  |                 cmdbuf.DrawPrimitivesIndirect(drawBuffer, 0, 2, (uint) Marshal.SizeOf<IndirectDrawCommand>(), 0, 0); | 
					
						
							| 
									
										
										
										
											2023-01-03 18:27:48 +00:00
										 |  |  |  |                 cmdbuf.EndRenderPass(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             GraphicsDevice.Submit(cmdbuf); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void Main(string[] args) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             DrawIndirectGame game = new DrawIndirectGame(); | 
					
						
							|  |  |  |  |             game.Run(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |