Compare commits
	
		
			2 Commits 
		
	
	
		
			2bd6531766
			...
			74b6e00bc8
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 74b6e00bc8 | |
|  | a64db5d0e1 | 
|  | @ -2,3 +2,4 @@ bin/ | ||||||
| obj/ | obj/ | ||||||
| .vs/ | .vs/ | ||||||
| *.csproj.user | *.csproj.user | ||||||
|  | Properties/ | ||||||
|  | @ -4,139 +4,139 @@ using MoonWorks.Math.Float; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class BasicComputeGame : Game | 	class BasicComputeGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline drawPipeline; | 		private GraphicsPipeline drawPipeline; | ||||||
|         private Texture texture; | 		private Texture texture; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
| 
 | 
 | ||||||
|         public BasicComputeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public BasicComputeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Create the compute pipeline that writes texture data | 			// Create the compute pipeline that writes texture data | ||||||
|             ShaderModule fillTextureComputeShaderModule = new ShaderModule( | 			ShaderModule fillTextureComputeShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("FillTexture.comp") | 				TestUtils.GetShaderPath("FillTexture.comp") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             ComputePipeline fillTextureComputePipeline = new ComputePipeline( | 			ComputePipeline fillTextureComputePipeline = new ComputePipeline( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 ComputeShaderInfo.Create(fillTextureComputeShaderModule, "main", 0, 1) | 				ComputeShaderInfo.Create(fillTextureComputeShaderModule, "main", 0, 1) | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Create the compute pipeline that calculates squares of numbers | 			// Create the compute pipeline that calculates squares of numbers | ||||||
|             ShaderModule calculateSquaresComputeShaderModule = new ShaderModule( | 			ShaderModule calculateSquaresComputeShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("CalculateSquares.comp") | 				TestUtils.GetShaderPath("CalculateSquares.comp") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             ComputePipeline calculateSquaresComputePipeline = new ComputePipeline( | 			ComputePipeline calculateSquaresComputePipeline = new ComputePipeline( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 ComputeShaderInfo.Create(calculateSquaresComputeShaderModule, "main", 1, 0) | 				ComputeShaderInfo.Create(calculateSquaresComputeShaderModule, "main", 1, 0) | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             ShaderModule vertShaderModule = new ShaderModule( | 			ShaderModule vertShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("TexturedQuad.vert") | 				TestUtils.GetShaderPath("TexturedQuad.vert") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             ShaderModule fragShaderModule = new ShaderModule( | 			ShaderModule fragShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("TexturedQuad.frag") | 				TestUtils.GetShaderPath("TexturedQuad.frag") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             GraphicsPipelineCreateInfo drawPipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo drawPipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
| 				MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             drawPipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			drawPipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             drawPipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			drawPipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
| 
 | 
 | ||||||
|             drawPipeline = new GraphicsPipeline( | 			drawPipeline = new GraphicsPipeline( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 drawPipelineCreateInfo | 				drawPipelineCreateInfo | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Create buffers and textures | 			// Create buffers and textures | ||||||
|             uint[] squares = new uint[64]; | 			uint[] squares = new uint[64]; | ||||||
|             Buffer squaresBuffer = Buffer.Create<uint>( | 			Buffer squaresBuffer = Buffer.Create<uint>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Compute, | 				BufferUsageFlags.Compute, | ||||||
|                 (uint) squares.Length | 				(uint) squares.Length | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>( | 			vertexBuffer = Buffer.Create<PositionTextureVertex>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Vertex, | 				BufferUsageFlags.Vertex, | ||||||
|                 6 | 				6 | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             texture = Texture.CreateTexture2D( | 			texture = Texture.CreateTexture2D( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 MainWindow.Width, | 				MainWindow.Width, | ||||||
|                 MainWindow.Height, | 				MainWindow.Height, | ||||||
|                 TextureFormat.R8G8B8A8, | 				TextureFormat.R8G8B8A8, | ||||||
|                 TextureUsageFlags.Compute | TextureUsageFlags.Sampler | 				TextureUsageFlags.Compute | TextureUsageFlags.Sampler | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             sampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | 			sampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | ||||||
| 
 | 
 | ||||||
|             // Upload GPU resources and dispatch compute work | 			// Upload GPU resources and dispatch compute work | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.SetBufferData(vertexBuffer, new PositionTextureVertex[] | 			cmdbuf.SetBufferData(vertexBuffer, new PositionTextureVertex[] | ||||||
|             { | 			{ | ||||||
|                 new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 				new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                 new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 				new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                 new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 				new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                 new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 				new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                 new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 				new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                 new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 				new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|             }); | 			}); | ||||||
| 
 | 
 | ||||||
|             // This should result in a bright yellow texture! | 			// This should result in a bright yellow texture! | ||||||
|             cmdbuf.BindComputePipeline(fillTextureComputePipeline); | 			cmdbuf.BindComputePipeline(fillTextureComputePipeline); | ||||||
|             cmdbuf.BindComputeTextures(texture); | 			cmdbuf.BindComputeTextures(texture); | ||||||
|             cmdbuf.DispatchCompute(texture.Width / 8, texture.Height / 8, 1, 0); | 			cmdbuf.DispatchCompute(texture.Width / 8, texture.Height / 8, 1, 0); | ||||||
| 
 | 
 | ||||||
|             // This calculates the squares of the first N integers! | 			// This calculates the squares of the first N integers! | ||||||
|             cmdbuf.BindComputePipeline(calculateSquaresComputePipeline); | 			cmdbuf.BindComputePipeline(calculateSquaresComputePipeline); | ||||||
|             cmdbuf.BindComputeBuffers(squaresBuffer); | 			cmdbuf.BindComputeBuffers(squaresBuffer); | ||||||
|             cmdbuf.DispatchCompute((uint) squares.Length / 8, 1, 1, 0); | 			cmdbuf.DispatchCompute((uint) squares.Length / 8, 1, 1, 0); | ||||||
| 
 | 
 | ||||||
|             var fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | 			var fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | ||||||
|             GraphicsDevice.WaitForFences(fence); | 			GraphicsDevice.WaitForFences(fence); | ||||||
| 			GraphicsDevice.ReleaseFence(fence); | 			GraphicsDevice.ReleaseFence(fence); | ||||||
| 
 | 
 | ||||||
|             // Print the squares! | 			// Print the squares! | ||||||
|             squaresBuffer.GetData(squares); | 			squaresBuffer.GetData(squares); | ||||||
|             Logger.LogInfo("Squares of the first " + squares.Length + " integers: " + string.Join(", ", squares)); | 			Logger.LogInfo("Squares of the first " + squares.Length + " integers: " + string.Join(", ", squares)); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(drawPipeline); | 				cmdbuf.BindGraphicsPipeline(drawPipeline); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.DrawPrimitives(0, 2, 0, 0); | 				cmdbuf.DrawPrimitives(0, 2, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             BasicComputeGame game = new BasicComputeGame(); | 			BasicComputeGame game = new BasicComputeGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,107 +4,107 @@ using MoonWorks.Math.Float; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class BasicStencilGame : Game | 	class BasicStencilGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline maskerPipeline; | 		private GraphicsPipeline maskerPipeline; | ||||||
|         private GraphicsPipeline maskeePipeline; | 		private GraphicsPipeline maskeePipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Texture depthStencilTexture; | 		private Texture depthStencilTexture; | ||||||
| 
 | 
 | ||||||
|         public BasicStencilGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public BasicStencilGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionColor.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionColor.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipelines | 			// Create the graphics pipelines | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.AttachmentInfo.HasDepthStencilAttachment = true; | 			pipelineCreateInfo.AttachmentInfo.HasDepthStencilAttachment = true; | ||||||
|             pipelineCreateInfo.AttachmentInfo.DepthStencilFormat = TextureFormat.D16S8; | 			pipelineCreateInfo.AttachmentInfo.DepthStencilFormat = TextureFormat.D16S8; | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(); | ||||||
|             pipelineCreateInfo.DepthStencilState = new DepthStencilState | 			pipelineCreateInfo.DepthStencilState = new DepthStencilState | ||||||
|             { | 			{ | ||||||
|                 StencilTestEnable = true, | 				StencilTestEnable = true, | ||||||
|                 FrontStencilState = new StencilOpState | 				FrontStencilState = new StencilOpState | ||||||
|                 { | 				{ | ||||||
|                     Reference = 1, | 					Reference = 1, | ||||||
|                     WriteMask = 0xFF, | 					WriteMask = 0xFF, | ||||||
|                     CompareOp = CompareOp.Never, | 					CompareOp = CompareOp.Never, | ||||||
|                     FailOp = StencilOp.Replace, | 					FailOp = StencilOp.Replace, | ||||||
|                 } | 				} | ||||||
|             }; | 			}; | ||||||
|             maskerPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			maskerPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             pipelineCreateInfo.DepthStencilState = new DepthStencilState | 			pipelineCreateInfo.DepthStencilState = new DepthStencilState | ||||||
|             { | 			{ | ||||||
|                 StencilTestEnable = true, | 				StencilTestEnable = true, | ||||||
|                 FrontStencilState = new StencilOpState | 				FrontStencilState = new StencilOpState | ||||||
|                 { | 				{ | ||||||
|                     Reference = 0, | 					Reference = 0, | ||||||
|                     CompareMask = 0xFF, | 					CompareMask = 0xFF, | ||||||
|                     WriteMask = 0, | 					WriteMask = 0, | ||||||
|                     CompareOp = CompareOp.Equal, | 					CompareOp = CompareOp.Equal, | ||||||
|                 } | 				} | ||||||
|             }; | 			}; | ||||||
|             maskeePipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			maskeePipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             depthStencilTexture = Texture.CreateTexture2D( | 			depthStencilTexture = Texture.CreateTexture2D( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 MainWindow.Width, | 				MainWindow.Width, | ||||||
|                 MainWindow.Height, | 				MainWindow.Height, | ||||||
|                 TextureFormat.D16S8, | 				TextureFormat.D16S8, | ||||||
|                 TextureUsageFlags.DepthStencilTarget | 				TextureUsageFlags.DepthStencilTarget | ||||||
|             ); | 			); | ||||||
|             vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 6); | 			vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 6); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionColorVertex[] | 				new PositionColorVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionColorVertex(new Vector3(-0.5f, 0.5f, 0), Color.Yellow), | 					new PositionColorVertex(new Vector3(-0.5f, 0.5f, 0), Color.Yellow), | ||||||
|                     new PositionColorVertex(new Vector3(0.5f, 0.5f, 0), Color.Yellow), | 					new PositionColorVertex(new Vector3(0.5f, 0.5f, 0), Color.Yellow), | ||||||
|                     new PositionColorVertex(new Vector3(0, -0.5f, 0), Color.Yellow), | 					new PositionColorVertex(new Vector3(0, -0.5f, 0), Color.Yellow), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, 0), Color.Red), | 					new PositionColorVertex(new Vector3(-1, 1, 0), Color.Red), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, 0), Color.Lime), | 					new PositionColorVertex(new Vector3(1, 1, 0), Color.Lime), | ||||||
|                     new PositionColorVertex(new Vector3(0, -1, 0), Color.Blue), | 					new PositionColorVertex(new Vector3(0, -1, 0), Color.Blue), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass( | 				cmdbuf.BeginRenderPass( | ||||||
|                     new DepthStencilAttachmentInfo(depthStencilTexture, new DepthStencilValue(0, 0), StoreOp.DontCare, StoreOp.DontCare), | 					new DepthStencilAttachmentInfo(depthStencilTexture, new DepthStencilValue(0, 0), StoreOp.DontCare, StoreOp.DontCare), | ||||||
|                     new ColorAttachmentInfo(backbuffer, Color.Black) | 					new ColorAttachmentInfo(backbuffer, Color.Black) | ||||||
|                 ); | 				); | ||||||
|                 cmdbuf.BindGraphicsPipeline(maskerPipeline); | 				cmdbuf.BindGraphicsPipeline(maskerPipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.DrawPrimitives(0, 1, 0, 0); | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|                 cmdbuf.BindGraphicsPipeline(maskeePipeline); | 				cmdbuf.BindGraphicsPipeline(maskeePipeline); | ||||||
|                 cmdbuf.DrawPrimitives(3, 1, 0, 0); | 				cmdbuf.DrawPrimitives(3, 1, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             BasicStencilGame p = new BasicStencilGame(); | 			BasicStencilGame p = new BasicStencilGame(); | ||||||
|             p.Run(); | 			p.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ namespace MoonWorks.Test | ||||||
| 
 | 
 | ||||||
| 		public BasicTriangleGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public BasicTriangleGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
| 		{ | 		{ | ||||||
|             Logger.LogInfo("Press Left to toggle wireframe mode\nPress Down to toggle small viewport\nPress Right to toggle scissor rect"); | 			Logger.LogInfo("Press Left to toggle wireframe mode\nPress Down to toggle small viewport\nPress Right to toggle scissor rect"); | ||||||
| 
 | 
 | ||||||
| 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("RawTriangle.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("RawTriangle.vert")); | ||||||
| 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | ||||||
|  |  | ||||||
|  | @ -5,129 +5,129 @@ using System.IO; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class CompressedTexturesGame : Game | 	class CompressedTexturesGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
|         private Texture[] textures; | 		private Texture[] textures; | ||||||
|         private string[] textureNames = new string[] | 		private string[] textureNames = new string[] | ||||||
|         { | 		{ | ||||||
|             "BC1", | 			"BC1", | ||||||
|             "BC2", | 			"BC2", | ||||||
|             "BC3", | 			"BC3", | ||||||
|             "BC7" | 			"BC7" | ||||||
|         }; | 		}; | ||||||
| 
 | 
 | ||||||
|         private int currentTextureIndex; | 		private int currentTextureIndex; | ||||||
| 
 | 
 | ||||||
|         public CompressedTexturesGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public CompressedTexturesGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             Logger.LogInfo("Press Left and Right to cycle between textures"); | 			Logger.LogInfo("Press Left and Right to cycle between textures"); | ||||||
|             Logger.LogInfo("Setting texture to: " + textureNames[0]); | 			Logger.LogInfo("Setting texture to: " + textureNames[0]); | ||||||
| 
 | 
 | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create sampler | 			// Create sampler | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearWrap); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearWrap); | ||||||
| 
 | 
 | ||||||
|             // Create texture array | 			// Create texture array | ||||||
|             textures = new Texture[textureNames.Length]; | 			textures = new Texture[textureNames.Length]; | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     0, 2, 3, | 					0, 2, 3, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             for (int i = 0; i < textureNames.Length; i += 1) | 			for (int i = 0; i < textureNames.Length; i += 1) | ||||||
|             { | 			{ | ||||||
|                 Logger.LogInfo(textureNames[i]); | 				Logger.LogInfo(textureNames[i]); | ||||||
|                 using (FileStream fs = new FileStream(TestUtils.GetTexturePath(textureNames[i] + ".dds"), FileMode.Open, FileAccess.Read)) | 				using (FileStream fs = new FileStream(TestUtils.GetTexturePath(textureNames[i] + ".dds"), FileMode.Open, FileAccess.Read)) | ||||||
|                     textures[i] = Texture.LoadDDS(GraphicsDevice, cmdbuf, fs); | 					textures[i] = Texture.LoadDDS(GraphicsDevice, cmdbuf, fs); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             int prevSamplerIndex = currentTextureIndex; | 			int prevSamplerIndex = currentTextureIndex; | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | ||||||
|             { | 			{ | ||||||
|                 currentTextureIndex -= 1; | 				currentTextureIndex -= 1; | ||||||
|                 if (currentTextureIndex < 0) | 				if (currentTextureIndex < 0) | ||||||
|                 { | 				{ | ||||||
|                     currentTextureIndex = textureNames.Length - 1; | 					currentTextureIndex = textureNames.Length - 1; | ||||||
|                 } | 				} | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | ||||||
|             { | 			{ | ||||||
|                 currentTextureIndex += 1; | 				currentTextureIndex += 1; | ||||||
|                 if (currentTextureIndex >= textureNames.Length) | 				if (currentTextureIndex >= textureNames.Length) | ||||||
|                 { | 				{ | ||||||
|                     currentTextureIndex = 0; | 					currentTextureIndex = 0; | ||||||
|                 } | 				} | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (prevSamplerIndex != currentTextureIndex) | 			if (prevSamplerIndex != currentTextureIndex) | ||||||
|             { | 			{ | ||||||
|                 Logger.LogInfo("Setting texture to: " + textureNames[currentTextureIndex]); | 				Logger.LogInfo("Setting texture to: " + textureNames[currentTextureIndex]); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(textures[currentTextureIndex], sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(textures[currentTextureIndex], sampler)); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             CompressedTexturesGame game = new CompressedTexturesGame(); | 			CompressedTexturesGame game = new CompressedTexturesGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,126 +4,126 @@ using MoonWorks.Math.Float; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class ComputeUniformsGame : Game | 	class ComputeUniformsGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline drawPipeline; | 		private GraphicsPipeline drawPipeline; | ||||||
|         private Texture texture; | 		private Texture texture; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
| 
 | 
 | ||||||
|         struct GradientTextureComputeUniforms | 		struct GradientTextureComputeUniforms | ||||||
|         { | 		{ | ||||||
|             public uint groupCountX; | 			public uint groupCountX; | ||||||
|             public uint groupCountY; | 			public uint groupCountY; | ||||||
| 
 | 
 | ||||||
|             public GradientTextureComputeUniforms(uint w, uint h) | 			public GradientTextureComputeUniforms(uint w, uint h) | ||||||
|             { | 			{ | ||||||
|                 groupCountX = w; | 				groupCountX = w; | ||||||
|                 groupCountY = h; | 				groupCountY = h; | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public ComputeUniformsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public ComputeUniformsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Create the compute pipeline that writes texture data | 			// Create the compute pipeline that writes texture data | ||||||
|             ShaderModule gradientTextureComputeShaderModule = new ShaderModule( | 			ShaderModule gradientTextureComputeShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("GradientTexture.comp") | 				TestUtils.GetShaderPath("GradientTexture.comp") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             ComputePipeline gradientTextureComputePipeline = new ComputePipeline( | 			ComputePipeline gradientTextureComputePipeline = new ComputePipeline( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 ComputeShaderInfo.Create<GradientTextureComputeUniforms>(gradientTextureComputeShaderModule, "main", 0, 1) | 				ComputeShaderInfo.Create<GradientTextureComputeUniforms>(gradientTextureComputeShaderModule, "main", 0, 1) | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             ShaderModule vertShaderModule = new ShaderModule( | 			ShaderModule vertShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("TexturedQuad.vert") | 				TestUtils.GetShaderPath("TexturedQuad.vert") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             ShaderModule fragShaderModule = new ShaderModule( | 			ShaderModule fragShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("TexturedQuad.frag") | 				TestUtils.GetShaderPath("TexturedQuad.frag") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             GraphicsPipelineCreateInfo drawPipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo drawPipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             drawPipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			drawPipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             drawPipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			drawPipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
| 
 | 
 | ||||||
|             drawPipeline = new GraphicsPipeline( | 			drawPipeline = new GraphicsPipeline( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 drawPipelineCreateInfo | 				drawPipelineCreateInfo | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Create buffers and textures | 			// Create buffers and textures | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>( | 			vertexBuffer = Buffer.Create<PositionTextureVertex>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Vertex, | 				BufferUsageFlags.Vertex, | ||||||
|                 6 | 				6 | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             texture = Texture.CreateTexture2D( | 			texture = Texture.CreateTexture2D( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 MainWindow.Width, | 				MainWindow.Width, | ||||||
|                 MainWindow.Height, | 				MainWindow.Height, | ||||||
|                 TextureFormat.R8G8B8A8, | 				TextureFormat.R8G8B8A8, | ||||||
|                 TextureUsageFlags.Compute | TextureUsageFlags.Sampler | 				TextureUsageFlags.Compute | TextureUsageFlags.Sampler | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             sampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | 			sampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | ||||||
| 
 | 
 | ||||||
|             // Upload GPU resources and dispatch compute work | 			// Upload GPU resources and dispatch compute work | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData(vertexBuffer, new PositionTextureVertex[] | 			cmdbuf.SetBufferData(vertexBuffer, new PositionTextureVertex[] | ||||||
|             { | 			{ | ||||||
|                 new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 				new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                 new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 				new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                 new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 				new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                 new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 				new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                 new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 				new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                 new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 				new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|             }); | 			}); | ||||||
| 
 | 
 | ||||||
|             GradientTextureComputeUniforms gradientUniforms = new GradientTextureComputeUniforms( | 			GradientTextureComputeUniforms gradientUniforms = new GradientTextureComputeUniforms( | ||||||
|                 texture.Width / 8, | 				texture.Width / 8, | ||||||
|                 texture.Height / 8 | 				texture.Height / 8 | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.BindComputePipeline(gradientTextureComputePipeline); | 			cmdbuf.BindComputePipeline(gradientTextureComputePipeline); | ||||||
|             cmdbuf.BindComputeTextures(texture); | 			cmdbuf.BindComputeTextures(texture); | ||||||
|             uint offset = cmdbuf.PushComputeShaderUniforms(gradientUniforms); | 			uint offset = cmdbuf.PushComputeShaderUniforms(gradientUniforms); | ||||||
|             cmdbuf.DispatchCompute(gradientUniforms.groupCountX, gradientUniforms.groupCountY, 1, offset); | 			cmdbuf.DispatchCompute(gradientUniforms.groupCountX, gradientUniforms.groupCountY, 1, offset); | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(drawPipeline); | 				cmdbuf.BindGraphicsPipeline(drawPipeline); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.DrawPrimitives(0, 2, 0, 0); | 				cmdbuf.DrawPrimitives(0, 2, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             ComputeUniformsGame game = new ComputeUniformsGame(); | 			ComputeUniformsGame game = new ComputeUniformsGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,72 +5,72 @@ using MoonWorks.Math.Float; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class CopyTextureGame : Game | 	class CopyTextureGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
|         private Texture originalTexture; | 		private Texture originalTexture; | ||||||
|         private Texture textureCopy; | 		private Texture textureCopy; | ||||||
|         private Texture textureSmallCopy; | 		private Texture textureSmallCopy; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
| 
 | 
 | ||||||
|         public unsafe CopyTextureGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public unsafe CopyTextureGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.AttachmentInfo.ColorAttachmentDescriptions[0].BlendState = ColorAttachmentBlendState.AlphaBlend; | 			pipelineCreateInfo.AttachmentInfo.ColorAttachmentDescriptions[0].BlendState = ColorAttachmentBlendState.AlphaBlend; | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create sampler | 			// Create sampler | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 12); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 12); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 12); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 12); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1f, 0f, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1f, 0f, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3( 0f, 0f, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3( 0f, 0f, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3( 0f, 1f, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3( 0f, 1f, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1f, 1f, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1f, 1f, 0), new Vector2(0, 1)), | ||||||
| 
 | 
 | ||||||
|                     new PositionTextureVertex(new Vector3(0f, 0f, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(0f, 0f, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1f, 0f, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1f, 0f, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1f, 1f, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1f, 1f, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(0f, 1f, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(0f, 1f, 0), new Vector2(0, 1)), | ||||||
| 
 | 
 | ||||||
|                     new PositionTextureVertex(new Vector3(-0.5f, -1f, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-0.5f, -1f, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3( 0.5f, -1f, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3( 0.5f, -1f, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3( 0.5f,  0f, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3( 0.5f,  0f, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-0.5f,  0f, 0), new Vector2(0, 1)) | 					new PositionTextureVertex(new Vector3(-0.5f,  0f, 0), new Vector2(0, 1)) | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     0, 2, 3, | 					0, 2, 3, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Load the texture. Storing the texture bytes so we can compare them. | 			// Load the texture. Storing the texture bytes so we can compare them. | ||||||
| 			var fileStream = new System.IO.FileStream(TestUtils.GetTexturePath("ravioli.png"), System.IO.FileMode.Open, System.IO.FileAccess.Read); | 			var fileStream = new System.IO.FileStream(TestUtils.GetTexturePath("ravioli.png"), System.IO.FileMode.Open, System.IO.FileAccess.Read); | ||||||
| 			var fileLength = fileStream.Length; | 			var fileLength = fileStream.Length; | ||||||
| 			var fileBuffer = NativeMemory.Alloc((nuint) fileLength); | 			var fileBuffer = NativeMemory.Alloc((nuint) fileLength); | ||||||
|  | @ -87,54 +87,54 @@ namespace MoonWorks.Test | ||||||
| 
 | 
 | ||||||
| 			NativeMemory.Free(fileBuffer); | 			NativeMemory.Free(fileBuffer); | ||||||
| 
 | 
 | ||||||
|             TextureCreateInfo textureCreateInfo = new TextureCreateInfo(); | 			TextureCreateInfo textureCreateInfo = new TextureCreateInfo(); | ||||||
|             textureCreateInfo.Width = (uint) width; | 			textureCreateInfo.Width = (uint) width; | ||||||
|             textureCreateInfo.Height = (uint) height; | 			textureCreateInfo.Height = (uint) height; | ||||||
|             textureCreateInfo.Depth = 1; | 			textureCreateInfo.Depth = 1; | ||||||
|             textureCreateInfo.Format = TextureFormat.R8G8B8A8; | 			textureCreateInfo.Format = TextureFormat.R8G8B8A8; | ||||||
|             textureCreateInfo.IsCube = false; | 			textureCreateInfo.IsCube = false; | ||||||
|             textureCreateInfo.LevelCount = 1; | 			textureCreateInfo.LevelCount = 1; | ||||||
|             textureCreateInfo.UsageFlags = TextureUsageFlags.Sampler; | 			textureCreateInfo.UsageFlags = TextureUsageFlags.Sampler; | ||||||
| 
 | 
 | ||||||
|             originalTexture = new Texture(GraphicsDevice, textureCreateInfo); | 			originalTexture = new Texture(GraphicsDevice, textureCreateInfo); | ||||||
|             cmdbuf.SetTextureData(originalTexture, pixels, (uint) byteCount); | 			cmdbuf.SetTextureData(originalTexture, pixels, (uint) byteCount); | ||||||
| 
 | 
 | ||||||
|             // Create a 1:1 copy of the texture | 			// Create a 1:1 copy of the texture | ||||||
|             textureCopy = new Texture(GraphicsDevice, textureCreateInfo); | 			textureCopy = new Texture(GraphicsDevice, textureCreateInfo); | ||||||
|             cmdbuf.CopyTextureToTexture( | 			cmdbuf.CopyTextureToTexture( | ||||||
|                 new TextureSlice(originalTexture), | 				new TextureSlice(originalTexture), | ||||||
|                 new TextureSlice(textureCopy), | 				new TextureSlice(textureCopy), | ||||||
|                 Filter.Linear | 				Filter.Linear | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Create a half-sized copy of this texture | 			// Create a half-sized copy of this texture | ||||||
|             textureCreateInfo.Width /= 2; | 			textureCreateInfo.Width /= 2; | ||||||
|             textureCreateInfo.Height /= 2; | 			textureCreateInfo.Height /= 2; | ||||||
|             textureSmallCopy = new Texture(GraphicsDevice, textureCreateInfo); | 			textureSmallCopy = new Texture(GraphicsDevice, textureCreateInfo); | ||||||
|             cmdbuf.CopyTextureToTexture( | 			cmdbuf.CopyTextureToTexture( | ||||||
|                 new TextureSlice(originalTexture), | 				new TextureSlice(originalTexture), | ||||||
|                 new TextureSlice( | 				new TextureSlice( | ||||||
|                     textureSmallCopy, | 					textureSmallCopy, | ||||||
|                     new Rect( | 					new Rect( | ||||||
|                         (int) textureCreateInfo.Width, | 						(int) textureCreateInfo.Width, | ||||||
|                         (int) textureCreateInfo.Height | 						(int) textureCreateInfo.Height | ||||||
|                     ) | 					) | ||||||
|                 ), | 				), | ||||||
|                 Filter.Linear | 				Filter.Linear | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Copy the texture to a buffer | 			// Copy the texture to a buffer | ||||||
|             Buffer compareBuffer = Buffer.Create<byte>(GraphicsDevice, 0, (uint) byteCount); | 			Buffer compareBuffer = Buffer.Create<byte>(GraphicsDevice, 0, (uint) byteCount); | ||||||
|             cmdbuf.CopyTextureToBuffer(new TextureSlice(originalTexture), compareBuffer); | 			cmdbuf.CopyTextureToBuffer(new TextureSlice(originalTexture), compareBuffer); | ||||||
| 
 | 
 | ||||||
|             var fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | 			var fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | ||||||
|             GraphicsDevice.WaitForFences(fence); | 			GraphicsDevice.WaitForFences(fence); | ||||||
| 			GraphicsDevice.ReleaseFence(fence); | 			GraphicsDevice.ReleaseFence(fence); | ||||||
| 
 | 
 | ||||||
|             // Compare the original bytes to the copied bytes. | 			// Compare the original bytes to the copied bytes. | ||||||
|             var copiedBytes = NativeMemory.Alloc((nuint) byteCount); | 			var copiedBytes = NativeMemory.Alloc((nuint) byteCount); | ||||||
| 			var copiedSpan = new System.Span<byte>(copiedBytes, byteCount); | 			var copiedSpan = new System.Span<byte>(copiedBytes, byteCount); | ||||||
|             compareBuffer.GetData(copiedSpan); | 			compareBuffer.GetData(copiedSpan); | ||||||
| 
 | 
 | ||||||
| 			var originalSpan = new System.Span<byte>((void*) pixels, byteCount); | 			var originalSpan = new System.Span<byte>((void*) pixels, byteCount); | ||||||
| 
 | 
 | ||||||
|  | @ -149,35 +149,35 @@ namespace MoonWorks.Test | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			RefreshCS.Refresh.Refresh_Image_Free(pixels); | 			RefreshCS.Refresh.Refresh_Image_Free(pixels); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(originalTexture, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(originalTexture, sampler)); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(textureCopy, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(textureCopy, sampler)); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(4, 0, 2, 0, 0); | 				cmdbuf.DrawIndexedPrimitives(4, 0, 2, 0, 0); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(textureSmallCopy, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(textureSmallCopy, sampler)); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(8, 0, 2, 0, 0); | 				cmdbuf.DrawIndexedPrimitives(8, 0, 2, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             CopyTextureGame game = new CopyTextureGame(); | 			CopyTextureGame game = new CopyTextureGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										722
									
								
								Cube/CubeGame.cs
								
								
								
								
							
							
						
						
									
										722
									
								
								Cube/CubeGame.cs
								
								
								
								
							|  | @ -6,52 +6,52 @@ using System.Threading.Tasks; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class CubeGame : Game | 	class CubeGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline cubePipeline; | 		private GraphicsPipeline cubePipeline; | ||||||
|         private GraphicsPipeline cubePipelineDepthOnly; | 		private GraphicsPipeline cubePipelineDepthOnly; | ||||||
|         private GraphicsPipeline skyboxPipeline; | 		private GraphicsPipeline skyboxPipeline; | ||||||
|         private GraphicsPipeline skyboxPipelineDepthOnly; | 		private GraphicsPipeline skyboxPipelineDepthOnly; | ||||||
|         private GraphicsPipeline blitPipeline; | 		private GraphicsPipeline blitPipeline; | ||||||
| 
 | 
 | ||||||
|         private Texture depthTexture; | 		private Texture depthTexture; | ||||||
|         private Sampler depthSampler; | 		private Sampler depthSampler; | ||||||
|         private DepthUniforms depthUniforms; | 		private DepthUniforms depthUniforms; | ||||||
| 
 | 
 | ||||||
|         private Buffer cubeVertexBuffer; | 		private Buffer cubeVertexBuffer; | ||||||
|         private Buffer skyboxVertexBuffer; | 		private Buffer skyboxVertexBuffer; | ||||||
|         private Buffer blitVertexBuffer; | 		private Buffer blitVertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
| 
 | 
 | ||||||
|         private Texture skyboxTexture; | 		private Texture skyboxTexture; | ||||||
|         private Sampler skyboxSampler; | 		private Sampler skyboxSampler; | ||||||
| 
 | 
 | ||||||
|         private bool finishedLoading = false; | 		private bool finishedLoading = false; | ||||||
|         private float cubeTimer = 0f; | 		private float cubeTimer = 0f; | ||||||
|         private Quaternion cubeRotation = Quaternion.Identity; | 		private Quaternion cubeRotation = Quaternion.Identity; | ||||||
|         private Quaternion previousCubeRotation = Quaternion.Identity; | 		private Quaternion previousCubeRotation = Quaternion.Identity; | ||||||
|         private bool depthOnlyEnabled = false; | 		private bool depthOnlyEnabled = false; | ||||||
|         private Vector3 camPos = new Vector3(0, 1.5f, 4f); | 		private Vector3 camPos = new Vector3(0, 1.5f, 4f); | ||||||
| 
 | 
 | ||||||
| 		private TaskFactory taskFactory = new TaskFactory(); | 		private TaskFactory taskFactory = new TaskFactory(); | ||||||
| 		private bool takeScreenshot; | 		private bool takeScreenshot; | ||||||
| 
 | 
 | ||||||
|         struct DepthUniforms | 		struct DepthUniforms | ||||||
|         { | 		{ | ||||||
|             public float ZNear; | 			public float ZNear; | ||||||
|             public float ZFar; | 			public float ZFar; | ||||||
| 
 | 
 | ||||||
|             public DepthUniforms(float zNear, float zFar) | 			public DepthUniforms(float zNear, float zFar) | ||||||
|             { | 			{ | ||||||
|                 ZNear = zNear; | 				ZNear = zNear; | ||||||
|                 ZFar = zFar; | 				ZFar = zFar; | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         void LoadCubemap(CommandBuffer cmdbuf, string[] imagePaths) | 		void LoadCubemap(CommandBuffer cmdbuf, string[] imagePaths) | ||||||
|         { | 		{ | ||||||
|             for (uint i = 0; i < imagePaths.Length; i++) | 			for (uint i = 0; i < imagePaths.Length; i++) | ||||||
|             { | 			{ | ||||||
| 				var textureSlice = new TextureSlice( | 				var textureSlice = new TextureSlice( | ||||||
| 					skyboxTexture, | 					skyboxTexture, | ||||||
| 					new Rect(0, 0, (int) skyboxTexture.Width, (int) skyboxTexture.Height), | 					new Rect(0, 0, (int) skyboxTexture.Width, (int) skyboxTexture.Height), | ||||||
|  | @ -61,383 +61,383 @@ namespace MoonWorks.Test | ||||||
| 				); | 				); | ||||||
| 
 | 
 | ||||||
| 				Texture.SetDataFromImageFile(cmdbuf, textureSlice, imagePaths[i]); | 				Texture.SetDataFromImageFile(cmdbuf, textureSlice, imagePaths[i]); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public CubeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public CubeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             ShaderModule cubeVertShaderModule = new ShaderModule( | 			ShaderModule cubeVertShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("PositionColorWithMatrix.vert") | 				TestUtils.GetShaderPath("PositionColorWithMatrix.vert") | ||||||
|             ); | 			); | ||||||
|             ShaderModule cubeFragShaderModule = new ShaderModule( | 			ShaderModule cubeFragShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("SolidColor.frag") | 				TestUtils.GetShaderPath("SolidColor.frag") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             ShaderModule skyboxVertShaderModule = new ShaderModule( | 			ShaderModule skyboxVertShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("Skybox.vert") | 				TestUtils.GetShaderPath("Skybox.vert") | ||||||
|             ); | 			); | ||||||
|             ShaderModule skyboxFragShaderModule = new ShaderModule( | 			ShaderModule skyboxFragShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("Skybox.frag") | 				TestUtils.GetShaderPath("Skybox.frag") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             ShaderModule blitVertShaderModule = new ShaderModule( | 			ShaderModule blitVertShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("TexturedQuad.vert") | 				TestUtils.GetShaderPath("TexturedQuad.vert") | ||||||
|             ); | 			); | ||||||
|             ShaderModule blitFragShaderModule = new ShaderModule( | 			ShaderModule blitFragShaderModule = new ShaderModule( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 TestUtils.GetShaderPath("TexturedDepthQuad.frag") | 				TestUtils.GetShaderPath("TexturedDepthQuad.frag") | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             depthTexture = Texture.CreateTexture2D( | 			depthTexture = Texture.CreateTexture2D( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 MainWindow.Width, | 				MainWindow.Width, | ||||||
|                 MainWindow.Height, | 				MainWindow.Height, | ||||||
|                 TextureFormat.D16, | 				TextureFormat.D16, | ||||||
|                 TextureUsageFlags.DepthStencilTarget | TextureUsageFlags.Sampler | 				TextureUsageFlags.DepthStencilTarget | TextureUsageFlags.Sampler | ||||||
|             ); | 			); | ||||||
|             depthSampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | 			depthSampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | ||||||
|             depthUniforms = new DepthUniforms(0.01f, 100f); | 			depthUniforms = new DepthUniforms(0.01f, 100f); | ||||||
| 
 | 
 | ||||||
|             skyboxTexture = Texture.CreateTextureCube( | 			skyboxTexture = Texture.CreateTextureCube( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 2048, | 				2048, | ||||||
|                 TextureFormat.R8G8B8A8, | 				TextureFormat.R8G8B8A8, | ||||||
|                 TextureUsageFlags.Sampler | 				TextureUsageFlags.Sampler | ||||||
|             ); | 			); | ||||||
|             skyboxSampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | 			skyboxSampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); | ||||||
| 
 | 
 | ||||||
|             cubeVertexBuffer = Buffer.Create<PositionColorVertex>( | 			cubeVertexBuffer = Buffer.Create<PositionColorVertex>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Vertex, | 				BufferUsageFlags.Vertex, | ||||||
|                 24 | 				24 | ||||||
|             ); | 			); | ||||||
|             skyboxVertexBuffer = Buffer.Create<PositionVertex>( | 			skyboxVertexBuffer = Buffer.Create<PositionVertex>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Vertex, | 				BufferUsageFlags.Vertex, | ||||||
|                 24 | 				24 | ||||||
|             ); | 			); | ||||||
|             indexBuffer = Buffer.Create<uint>( | 			indexBuffer = Buffer.Create<uint>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Index, | 				BufferUsageFlags.Index, | ||||||
|                 36 | 				36 | ||||||
|             ); // Using uint here just to test IndexElementSize=32 | 			); // Using uint here just to test IndexElementSize=32 | ||||||
| 
 | 
 | ||||||
|             blitVertexBuffer = Buffer.Create<PositionTextureVertex>( | 			blitVertexBuffer = Buffer.Create<PositionTextureVertex>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Vertex, | 				BufferUsageFlags.Vertex, | ||||||
|                 6 | 				6 | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             Task loadingTask = Task.Run(() => UploadGPUAssets()); | 			Task loadingTask = Task.Run(() => UploadGPUAssets()); | ||||||
| 
 | 
 | ||||||
|             // Create the cube pipelines | 			// Create the cube pipelines | ||||||
| 
 | 
 | ||||||
|             GraphicsPipelineCreateInfo cubePipelineCreateInfo = new GraphicsPipelineCreateInfo | 			GraphicsPipelineCreateInfo cubePipelineCreateInfo = new GraphicsPipelineCreateInfo | ||||||
|             { | 			{ | ||||||
|                 AttachmentInfo = new GraphicsPipelineAttachmentInfo( | 				AttachmentInfo = new GraphicsPipelineAttachmentInfo( | ||||||
|                         TextureFormat.D16, | 						TextureFormat.D16, | ||||||
|                         new ColorAttachmentDescription( | 						new ColorAttachmentDescription( | ||||||
|                             MainWindow.SwapchainFormat, | 							MainWindow.SwapchainFormat, | ||||||
|                             ColorAttachmentBlendState.Opaque | 							ColorAttachmentBlendState.Opaque | ||||||
|                         ) | 						) | ||||||
|                     ), | 					), | ||||||
|                 DepthStencilState = DepthStencilState.DepthReadWrite, | 				DepthStencilState = DepthStencilState.DepthReadWrite, | ||||||
|                 VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(cubeVertShaderModule, "main", 0), | 				VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(cubeVertShaderModule, "main", 0), | ||||||
|                 VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(), | 				VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(), | ||||||
|                 PrimitiveType = PrimitiveType.TriangleList, | 				PrimitiveType = PrimitiveType.TriangleList, | ||||||
|                 FragmentShaderInfo = GraphicsShaderInfo.Create(cubeFragShaderModule, "main", 0), | 				FragmentShaderInfo = GraphicsShaderInfo.Create(cubeFragShaderModule, "main", 0), | ||||||
|                 RasterizerState = RasterizerState.CW_CullBack, | 				RasterizerState = RasterizerState.CW_CullBack, | ||||||
|                 MultisampleState = MultisampleState.None | 				MultisampleState = MultisampleState.None | ||||||
|             }; | 			}; | ||||||
|             cubePipeline = new GraphicsPipeline(GraphicsDevice, cubePipelineCreateInfo); | 			cubePipeline = new GraphicsPipeline(GraphicsDevice, cubePipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             cubePipelineCreateInfo.AttachmentInfo = new GraphicsPipelineAttachmentInfo(TextureFormat.D16); | 			cubePipelineCreateInfo.AttachmentInfo = new GraphicsPipelineAttachmentInfo(TextureFormat.D16); | ||||||
|             cubePipelineDepthOnly = new GraphicsPipeline(GraphicsDevice, cubePipelineCreateInfo); | 			cubePipelineDepthOnly = new GraphicsPipeline(GraphicsDevice, cubePipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create the skybox pipelines | 			// Create the skybox pipelines | ||||||
| 
 | 
 | ||||||
|             GraphicsPipelineCreateInfo skyboxPipelineCreateInfo = new GraphicsPipelineCreateInfo | 			GraphicsPipelineCreateInfo skyboxPipelineCreateInfo = new GraphicsPipelineCreateInfo | ||||||
|             { | 			{ | ||||||
|                 AttachmentInfo = new GraphicsPipelineAttachmentInfo( | 				AttachmentInfo = new GraphicsPipelineAttachmentInfo( | ||||||
|                         TextureFormat.D16, | 						TextureFormat.D16, | ||||||
|                         new ColorAttachmentDescription( | 						new ColorAttachmentDescription( | ||||||
|                             MainWindow.SwapchainFormat, | 							MainWindow.SwapchainFormat, | ||||||
|                             ColorAttachmentBlendState.Opaque | 							ColorAttachmentBlendState.Opaque | ||||||
|                         ) | 						) | ||||||
|                     ), | 					), | ||||||
|                 DepthStencilState = DepthStencilState.DepthReadWrite, | 				DepthStencilState = DepthStencilState.DepthReadWrite, | ||||||
|                 VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(skyboxVertShaderModule, "main", 0), | 				VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(skyboxVertShaderModule, "main", 0), | ||||||
|                 VertexInputState = VertexInputState.CreateSingleBinding<PositionVertex>(), | 				VertexInputState = VertexInputState.CreateSingleBinding<PositionVertex>(), | ||||||
|                 PrimitiveType = PrimitiveType.TriangleList, | 				PrimitiveType = PrimitiveType.TriangleList, | ||||||
|                 FragmentShaderInfo = GraphicsShaderInfo.Create(skyboxFragShaderModule, "main", 1), | 				FragmentShaderInfo = GraphicsShaderInfo.Create(skyboxFragShaderModule, "main", 1), | ||||||
|                 RasterizerState = RasterizerState.CW_CullNone, | 				RasterizerState = RasterizerState.CW_CullNone, | ||||||
|                 MultisampleState = MultisampleState.None, | 				MultisampleState = MultisampleState.None, | ||||||
|             }; | 			}; | ||||||
|             skyboxPipeline = new GraphicsPipeline(GraphicsDevice, skyboxPipelineCreateInfo); | 			skyboxPipeline = new GraphicsPipeline(GraphicsDevice, skyboxPipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             skyboxPipelineCreateInfo.AttachmentInfo = new GraphicsPipelineAttachmentInfo(TextureFormat.D16); | 			skyboxPipelineCreateInfo.AttachmentInfo = new GraphicsPipelineAttachmentInfo(TextureFormat.D16); | ||||||
|             skyboxPipelineDepthOnly = new GraphicsPipeline(GraphicsDevice, skyboxPipelineCreateInfo); | 			skyboxPipelineDepthOnly = new GraphicsPipeline(GraphicsDevice, skyboxPipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create the blit pipeline | 			// Create the blit pipeline | ||||||
| 
 | 
 | ||||||
|             GraphicsPipelineCreateInfo blitPipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo blitPipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
| 				MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 blitVertShaderModule, | 				blitVertShaderModule, | ||||||
|                 blitFragShaderModule | 				blitFragShaderModule | ||||||
|             ); | 			); | ||||||
|             blitPipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			blitPipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             blitPipelineCreateInfo.FragmentShaderInfo = GraphicsShaderInfo.Create<DepthUniforms>(blitFragShaderModule, "main", 1); | 			blitPipelineCreateInfo.FragmentShaderInfo = GraphicsShaderInfo.Create<DepthUniforms>(blitFragShaderModule, "main", 1); | ||||||
| 			blitPipeline = new GraphicsPipeline(GraphicsDevice, blitPipelineCreateInfo); | 			blitPipeline = new GraphicsPipeline(GraphicsDevice, blitPipelineCreateInfo); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         private void UploadGPUAssets() | 		private void UploadGPUAssets() | ||||||
|         { | 		{ | ||||||
|             Logger.LogInfo("Loading..."); | 			Logger.LogInfo("Loading..."); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 cubeVertexBuffer, | 				cubeVertexBuffer, | ||||||
|                 new PositionColorVertex[] | 				new PositionColorVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionColorVertex(new Vector3(-1, -1, -1), new Color(1f, 0f, 0f)), | 					new PositionColorVertex(new Vector3(-1, -1, -1), new Color(1f, 0f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, -1, -1), new Color(1f, 0f, 0f)), | 					new PositionColorVertex(new Vector3(1, -1, -1), new Color(1f, 0f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, -1), new Color(1f, 0f, 0f)), | 					new PositionColorVertex(new Vector3(1, 1, -1), new Color(1f, 0f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, -1), new Color(1f, 0f, 0f)), | 					new PositionColorVertex(new Vector3(-1, 1, -1), new Color(1f, 0f, 0f)), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(-1, -1, 1), new Color(0f, 1f, 0f)), | 					new PositionColorVertex(new Vector3(-1, -1, 1), new Color(0f, 1f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, -1, 1), new Color(0f, 1f, 0f)), | 					new PositionColorVertex(new Vector3(1, -1, 1), new Color(0f, 1f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, 1), new Color(0f, 1f, 0f)), | 					new PositionColorVertex(new Vector3(1, 1, 1), new Color(0f, 1f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, 1), new Color(0f, 1f, 0f)), | 					new PositionColorVertex(new Vector3(-1, 1, 1), new Color(0f, 1f, 0f)), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(-1, -1, -1), new Color(0f, 0f, 1f)), | 					new PositionColorVertex(new Vector3(-1, -1, -1), new Color(0f, 0f, 1f)), | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, -1), new Color(0f, 0f, 1f)), | 					new PositionColorVertex(new Vector3(-1, 1, -1), new Color(0f, 0f, 1f)), | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, 1), new Color(0f, 0f, 1f)), | 					new PositionColorVertex(new Vector3(-1, 1, 1), new Color(0f, 0f, 1f)), | ||||||
|                     new PositionColorVertex(new Vector3(-1, -1, 1), new Color(0f, 0f, 1f)), | 					new PositionColorVertex(new Vector3(-1, -1, 1), new Color(0f, 0f, 1f)), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(1, -1, -1), new Color(1f, 0.5f, 0f)), | 					new PositionColorVertex(new Vector3(1, -1, -1), new Color(1f, 0.5f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, -1), new Color(1f, 0.5f, 0f)), | 					new PositionColorVertex(new Vector3(1, 1, -1), new Color(1f, 0.5f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, 1), new Color(1f, 0.5f, 0f)), | 					new PositionColorVertex(new Vector3(1, 1, 1), new Color(1f, 0.5f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, -1, 1), new Color(1f, 0.5f, 0f)), | 					new PositionColorVertex(new Vector3(1, -1, 1), new Color(1f, 0.5f, 0f)), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(-1, -1, -1), new Color(1f, 0f, 0.5f)), | 					new PositionColorVertex(new Vector3(-1, -1, -1), new Color(1f, 0f, 0.5f)), | ||||||
|                     new PositionColorVertex(new Vector3(-1, -1, 1), new Color(1f, 0f, 0.5f)), | 					new PositionColorVertex(new Vector3(-1, -1, 1), new Color(1f, 0f, 0.5f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, -1, 1), new Color(1f, 0f, 0.5f)), | 					new PositionColorVertex(new Vector3(1, -1, 1), new Color(1f, 0f, 0.5f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, -1, -1), new Color(1f, 0f, 0.5f)), | 					new PositionColorVertex(new Vector3(1, -1, -1), new Color(1f, 0f, 0.5f)), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, -1), new Color(0f, 0.5f, 0f)), | 					new PositionColorVertex(new Vector3(-1, 1, -1), new Color(0f, 0.5f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, 1), new Color(0f, 0.5f, 0f)), | 					new PositionColorVertex(new Vector3(-1, 1, 1), new Color(0f, 0.5f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, 1), new Color(0f, 0.5f, 0f)), | 					new PositionColorVertex(new Vector3(1, 1, 1), new Color(0f, 0.5f, 0f)), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, -1), new Color(0f, 0.5f, 0f)) | 					new PositionColorVertex(new Vector3(1, 1, -1), new Color(0f, 0.5f, 0f)) | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
| 			    skyboxVertexBuffer, | 				skyboxVertexBuffer, | ||||||
| 			    new PositionVertex[] | 				new PositionVertex[] | ||||||
| 			    { | 				{ | ||||||
| 				    new PositionVertex(new Vector3(-10, -10, -10)), | 					new PositionVertex(new Vector3(-10, -10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(10, -10, -10)), | 					new PositionVertex(new Vector3(10, -10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(10, 10, -10)), | 					new PositionVertex(new Vector3(10, 10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(-10, 10, -10)), | 					new PositionVertex(new Vector3(-10, 10, -10)), | ||||||
| 
 | 
 | ||||||
| 				    new PositionVertex(new Vector3(-10, -10, 10)), | 					new PositionVertex(new Vector3(-10, -10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(10, -10, 10)), | 					new PositionVertex(new Vector3(10, -10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(10, 10, 10)), | 					new PositionVertex(new Vector3(10, 10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(-10, 10, 10)), | 					new PositionVertex(new Vector3(-10, 10, 10)), | ||||||
| 
 | 
 | ||||||
| 				    new PositionVertex(new Vector3(-10, -10, -10)), | 					new PositionVertex(new Vector3(-10, -10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(-10, 10, -10)), | 					new PositionVertex(new Vector3(-10, 10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(-10, 10, 10)), | 					new PositionVertex(new Vector3(-10, 10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(-10, -10, 10)), | 					new PositionVertex(new Vector3(-10, -10, 10)), | ||||||
| 
 | 
 | ||||||
| 				    new PositionVertex(new Vector3(10, -10, -10)), | 					new PositionVertex(new Vector3(10, -10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(10, 10, -10)), | 					new PositionVertex(new Vector3(10, 10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(10, 10, 10)), | 					new PositionVertex(new Vector3(10, 10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(10, -10, 10)), | 					new PositionVertex(new Vector3(10, -10, 10)), | ||||||
| 
 | 
 | ||||||
| 				    new PositionVertex(new Vector3(-10, -10, -10)), | 					new PositionVertex(new Vector3(-10, -10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(-10, -10, 10)), | 					new PositionVertex(new Vector3(-10, -10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(10, -10, 10)), | 					new PositionVertex(new Vector3(10, -10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(10, -10, -10)), | 					new PositionVertex(new Vector3(10, -10, -10)), | ||||||
| 
 | 
 | ||||||
| 				    new PositionVertex(new Vector3(-10, 10, -10)), | 					new PositionVertex(new Vector3(-10, 10, -10)), | ||||||
| 				    new PositionVertex(new Vector3(-10, 10, 10)), | 					new PositionVertex(new Vector3(-10, 10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(10, 10, 10)), | 					new PositionVertex(new Vector3(10, 10, 10)), | ||||||
| 				    new PositionVertex(new Vector3(10, 10, -10)) | 					new PositionVertex(new Vector3(10, 10, -10)) | ||||||
| 			    } | 				} | ||||||
| 		    ); | 			); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new uint[] | 				new uint[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2,    0, 2, 3, | 					0, 1, 2,	0, 2, 3, | ||||||
|                     6, 5, 4,    7, 6, 4, | 					6, 5, 4,	7, 6, 4, | ||||||
|                     8, 9, 10,   8, 10, 11, | 					8, 9, 10,   8, 10, 11, | ||||||
|                     14, 13, 12, 15, 14, 12, | 					14, 13, 12, 15, 14, 12, | ||||||
|                     16, 17, 18, 16, 18, 19, | 					16, 17, 18, 16, 18, 19, | ||||||
|                     22, 21, 20, 23, 22, 20 | 					22, 21, 20, 23, 22, 20 | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 blitVertexBuffer, | 				blitVertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             LoadCubemap(cmdbuf, new string[] | 			LoadCubemap(cmdbuf, new string[] | ||||||
| 		    { | 			{ | ||||||
| 			    TestUtils.GetTexturePath("right.png"), | 				TestUtils.GetTexturePath("right.png"), | ||||||
| 			    TestUtils.GetTexturePath("left.png"), | 				TestUtils.GetTexturePath("left.png"), | ||||||
| 			    TestUtils.GetTexturePath("top.png"), | 				TestUtils.GetTexturePath("top.png"), | ||||||
| 			    TestUtils.GetTexturePath("bottom.png"), | 				TestUtils.GetTexturePath("bottom.png"), | ||||||
| 			    TestUtils.GetTexturePath("front.png"), | 				TestUtils.GetTexturePath("front.png"), | ||||||
| 			    TestUtils.GetTexturePath("back.png") | 				TestUtils.GetTexturePath("back.png") | ||||||
| 		    }); | 			}); | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
| 
 | 
 | ||||||
|             finishedLoading = true; | 			finishedLoading = true; | ||||||
|             Logger.LogInfo("Finished loading!"); | 			Logger.LogInfo("Finished loading!"); | ||||||
|             Logger.LogInfo("Press Left to toggle Depth-Only Mode"); | 			Logger.LogInfo("Press Left to toggle Depth-Only Mode"); | ||||||
|             Logger.LogInfo("Press Down to move the camera upwards"); | 			Logger.LogInfo("Press Down to move the camera upwards"); | ||||||
| 			Logger.LogInfo("Press Right to save a screenshot"); | 			Logger.LogInfo("Press Right to save a screenshot"); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             cubeTimer += (float) delta.TotalSeconds; | 			cubeTimer += (float) delta.TotalSeconds; | ||||||
| 
 | 
 | ||||||
|             previousCubeRotation = cubeRotation; | 			previousCubeRotation = cubeRotation; | ||||||
| 
 | 
 | ||||||
|             cubeRotation = Quaternion.CreateFromYawPitchRoll( | 			cubeRotation = Quaternion.CreateFromYawPitchRoll( | ||||||
|                 cubeTimer * 2f, | 				cubeTimer * 2f, | ||||||
|                 0, | 				0, | ||||||
|                 cubeTimer * 2f | 				cubeTimer * 2f | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Bottom)) | 			if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Bottom)) | ||||||
|             { | 			{ | ||||||
|                 camPos.Y = System.MathF.Min(camPos.Y + 0.2f, 15f); | 				camPos.Y = System.MathF.Min(camPos.Y + 0.2f, 15f); | ||||||
|             } | 			} | ||||||
|             else | 			else | ||||||
|             { | 			{ | ||||||
|                 camPos.Y = System.MathF.Max(camPos.Y - 0.4f, 1.5f); | 				camPos.Y = System.MathF.Max(camPos.Y - 0.4f, 1.5f); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | ||||||
|             { | 			{ | ||||||
|                 depthOnlyEnabled = !depthOnlyEnabled; | 				depthOnlyEnabled = !depthOnlyEnabled; | ||||||
|                 Logger.LogInfo("Depth-Only Mode enabled: " + depthOnlyEnabled); | 				Logger.LogInfo("Depth-Only Mode enabled: " + depthOnlyEnabled); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
| 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | ||||||
| 			{ | 			{ | ||||||
| 				takeScreenshot = true; | 				takeScreenshot = true; | ||||||
| 			} | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             Matrix4x4 proj = Matrix4x4.CreatePerspectiveFieldOfView( | 			Matrix4x4 proj = Matrix4x4.CreatePerspectiveFieldOfView( | ||||||
|                 MathHelper.ToRadians(75f), | 				MathHelper.ToRadians(75f), | ||||||
|                 (float) MainWindow.Width / MainWindow.Height, | 				(float) MainWindow.Width / MainWindow.Height, | ||||||
|                 depthUniforms.ZNear, | 				depthUniforms.ZNear, | ||||||
|                 depthUniforms.ZFar | 				depthUniforms.ZFar | ||||||
|             ); | 			); | ||||||
|             Matrix4x4 view = Matrix4x4.CreateLookAt( | 			Matrix4x4 view = Matrix4x4.CreateLookAt( | ||||||
|                 camPos, | 				camPos, | ||||||
|                 Vector3.Zero, | 				Vector3.Zero, | ||||||
|                 Vector3.Up | 				Vector3.Up | ||||||
|             ); | 			); | ||||||
|             TransformVertexUniform skyboxUniforms = new TransformVertexUniform(view * proj); | 			TransformVertexUniform skyboxUniforms = new TransformVertexUniform(view * proj); | ||||||
| 
 | 
 | ||||||
|             Matrix4x4 model = Matrix4x4.CreateFromQuaternion( | 			Matrix4x4 model = Matrix4x4.CreateFromQuaternion( | ||||||
|                 Quaternion.Slerp( | 				Quaternion.Slerp( | ||||||
|                     previousCubeRotation, | 					previousCubeRotation, | ||||||
|                     cubeRotation, | 					cubeRotation, | ||||||
|                     (float) alpha | 					(float) alpha | ||||||
|                 ) | 				) | ||||||
|             ); | 			); | ||||||
|             TransformVertexUniform cubeUniforms = new TransformVertexUniform(model * view * proj); | 			TransformVertexUniform cubeUniforms = new TransformVertexUniform(model * view * proj); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture swapchainTexture = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture swapchainTexture = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (swapchainTexture != null) | 			if (swapchainTexture != null) | ||||||
|             { | 			{ | ||||||
|                 if (!finishedLoading) | 				if (!finishedLoading) | ||||||
|                 { | 				{ | ||||||
|                     float sine = System.MathF.Abs(System.MathF.Sin(cubeTimer)); | 					float sine = System.MathF.Abs(System.MathF.Sin(cubeTimer)); | ||||||
|                     Color clearColor = new Color(sine, sine, sine); | 					Color clearColor = new Color(sine, sine, sine); | ||||||
| 
 | 
 | ||||||
|                     // Just show a clear screen. | 					// Just show a clear screen. | ||||||
|                     cmdbuf.BeginRenderPass(new ColorAttachmentInfo(swapchainTexture, clearColor)); | 					cmdbuf.BeginRenderPass(new ColorAttachmentInfo(swapchainTexture, clearColor)); | ||||||
|                     cmdbuf.EndRenderPass(); | 					cmdbuf.EndRenderPass(); | ||||||
|                 } | 				} | ||||||
|                 else | 				else | ||||||
|                 { | 				{ | ||||||
|                     if (!depthOnlyEnabled) | 					if (!depthOnlyEnabled) | ||||||
|                     { | 					{ | ||||||
|                         cmdbuf.BeginRenderPass( | 						cmdbuf.BeginRenderPass( | ||||||
|                             new DepthStencilAttachmentInfo(depthTexture, new DepthStencilValue(1f, 0)), | 							new DepthStencilAttachmentInfo(depthTexture, new DepthStencilValue(1f, 0)), | ||||||
|                             new ColorAttachmentInfo(swapchainTexture, LoadOp.DontCare) | 							new ColorAttachmentInfo(swapchainTexture, LoadOp.DontCare) | ||||||
|                         ); | 						); | ||||||
|                     } | 					} | ||||||
|                     else | 					else | ||||||
|                     { | 					{ | ||||||
|                         cmdbuf.BeginRenderPass( | 						cmdbuf.BeginRenderPass( | ||||||
|                             new DepthStencilAttachmentInfo(depthTexture, new DepthStencilValue(1f, 0)) | 							new DepthStencilAttachmentInfo(depthTexture, new DepthStencilValue(1f, 0)) | ||||||
|                         ); | 						); | ||||||
|                     } | 					} | ||||||
| 
 | 
 | ||||||
|                     // Draw cube | 					// Draw cube | ||||||
|                     cmdbuf.BindGraphicsPipeline(depthOnlyEnabled ? cubePipelineDepthOnly : cubePipeline); | 					cmdbuf.BindGraphicsPipeline(depthOnlyEnabled ? cubePipelineDepthOnly : cubePipeline); | ||||||
|                     cmdbuf.BindVertexBuffers(cubeVertexBuffer); | 					cmdbuf.BindVertexBuffers(cubeVertexBuffer); | ||||||
|                     cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.ThirtyTwo); | 					cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.ThirtyTwo); | ||||||
|                     uint vertexParamOffset = cmdbuf.PushVertexShaderUniforms(cubeUniforms); | 					uint vertexParamOffset = cmdbuf.PushVertexShaderUniforms(cubeUniforms); | ||||||
|                     cmdbuf.DrawIndexedPrimitives(0, 0, 12, vertexParamOffset, 0); | 					cmdbuf.DrawIndexedPrimitives(0, 0, 12, vertexParamOffset, 0); | ||||||
| 
 | 
 | ||||||
|                     // Draw skybox | 					// Draw skybox | ||||||
|                     cmdbuf.BindGraphicsPipeline(depthOnlyEnabled ? skyboxPipelineDepthOnly : skyboxPipeline); | 					cmdbuf.BindGraphicsPipeline(depthOnlyEnabled ? skyboxPipelineDepthOnly : skyboxPipeline); | ||||||
|                     cmdbuf.BindVertexBuffers(skyboxVertexBuffer); | 					cmdbuf.BindVertexBuffers(skyboxVertexBuffer); | ||||||
|                     cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.ThirtyTwo); | 					cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.ThirtyTwo); | ||||||
|                     cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(skyboxTexture, skyboxSampler)); | 					cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(skyboxTexture, skyboxSampler)); | ||||||
|                     vertexParamOffset = cmdbuf.PushVertexShaderUniforms(skyboxUniforms); | 					vertexParamOffset = cmdbuf.PushVertexShaderUniforms(skyboxUniforms); | ||||||
|                     cmdbuf.DrawIndexedPrimitives(0, 0, 12, vertexParamOffset, 0); | 					cmdbuf.DrawIndexedPrimitives(0, 0, 12, vertexParamOffset, 0); | ||||||
| 
 | 
 | ||||||
|                     cmdbuf.EndRenderPass(); | 					cmdbuf.EndRenderPass(); | ||||||
| 
 | 
 | ||||||
|                     if (depthOnlyEnabled) | 					if (depthOnlyEnabled) | ||||||
|                     { | 					{ | ||||||
|                         // Draw the depth buffer as a grayscale image | 						// Draw the depth buffer as a grayscale image | ||||||
|                         cmdbuf.BeginRenderPass(new ColorAttachmentInfo(swapchainTexture, LoadOp.DontCare)); | 						cmdbuf.BeginRenderPass(new ColorAttachmentInfo(swapchainTexture, LoadOp.DontCare)); | ||||||
| 
 | 
 | ||||||
|                         cmdbuf.BindGraphicsPipeline(blitPipeline); | 						cmdbuf.BindGraphicsPipeline(blitPipeline); | ||||||
|                         cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(depthTexture, depthSampler)); | 						cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(depthTexture, depthSampler)); | ||||||
|                         cmdbuf.BindVertexBuffers(blitVertexBuffer); | 						cmdbuf.BindVertexBuffers(blitVertexBuffer); | ||||||
|                         uint fragParamOffset = cmdbuf.PushFragmentShaderUniforms(depthUniforms); | 						uint fragParamOffset = cmdbuf.PushFragmentShaderUniforms(depthUniforms); | ||||||
|                         cmdbuf.DrawPrimitives(0, 2, vertexParamOffset, fragParamOffset); | 						cmdbuf.DrawPrimitives(0, 2, vertexParamOffset, fragParamOffset); | ||||||
| 
 | 
 | ||||||
|                         cmdbuf.EndRenderPass(); | 						cmdbuf.EndRenderPass(); | ||||||
|                     } | 					} | ||||||
|                 } | 				} | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
| 
 | 
 | ||||||
| 			if (takeScreenshot) | 			if (takeScreenshot) | ||||||
| 			{ | 			{ | ||||||
|  | @ -448,7 +448,7 @@ namespace MoonWorks.Test | ||||||
| 
 | 
 | ||||||
| 				takeScreenshot = false; | 				takeScreenshot = false; | ||||||
| 			} | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
| 		private System.Action<object?> TakeScreenshot = texture => | 		private System.Action<object?> TakeScreenshot = texture => | ||||||
| 		{ | 		{ | ||||||
|  | @ -458,10 +458,10 @@ namespace MoonWorks.Test | ||||||
| 			} | 			} | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             CubeGame game = new CubeGame(); | 			CubeGame game = new CubeGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,77 +5,77 @@ using System.Runtime.InteropServices; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class DrawIndirectGame : Game | 	class DrawIndirectGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline graphicsPipeline; | 		private GraphicsPipeline graphicsPipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer drawBuffer; | 		private Buffer drawBuffer; | ||||||
| 
 | 
 | ||||||
|         public DrawIndirectGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public DrawIndirectGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionColor.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionColor.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(); | ||||||
|             graphicsPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			graphicsPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the vertex buffer | 			// Create and populate the vertex buffer | ||||||
|             vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 6); | 			vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 6); | ||||||
|             drawBuffer = Buffer.Create<IndirectDrawCommand>(GraphicsDevice, BufferUsageFlags.Indirect, 2); | 			drawBuffer = Buffer.Create<IndirectDrawCommand>(GraphicsDevice, BufferUsageFlags.Indirect, 2); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionColorVertex[] | 				new PositionColorVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionColorVertex(new Vector3(-0.5f, -1, 0), Color.Blue), | 					new PositionColorVertex(new Vector3(-0.5f, -1, 0), Color.Blue), | ||||||
|                     new PositionColorVertex(new Vector3(-1f, 1, 0), Color.Green), | 					new PositionColorVertex(new Vector3(-1f, 1, 0), Color.Green), | ||||||
|                     new PositionColorVertex(new Vector3(0f, 1, 0), Color.Red), | 					new PositionColorVertex(new Vector3(0f, 1, 0), Color.Red), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(.5f, -1, 0), Color.Blue), | 					new PositionColorVertex(new Vector3(.5f, -1, 0), Color.Blue), | ||||||
|                     new PositionColorVertex(new Vector3(1f, 1, 0), Color.Green), | 					new PositionColorVertex(new Vector3(1f, 1, 0), Color.Green), | ||||||
|                     new PositionColorVertex(new Vector3(0f, 1, 0), Color.Red), | 					new PositionColorVertex(new Vector3(0f, 1, 0), Color.Red), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 drawBuffer, | 				drawBuffer, | ||||||
|                 new IndirectDrawCommand[] | 				new IndirectDrawCommand[] | ||||||
|                 { | 				{ | ||||||
|                     new IndirectDrawCommand(3, 1, 3, 0), | 					new IndirectDrawCommand(3, 1, 3, 0), | ||||||
|                     new IndirectDrawCommand(3, 1, 0, 0), | 					new IndirectDrawCommand(3, 1, 0, 0), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(graphicsPipeline); | 				cmdbuf.BindGraphicsPipeline(graphicsPipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(new BufferBinding(vertexBuffer, 0)); | 				cmdbuf.BindVertexBuffers(new BufferBinding(vertexBuffer, 0)); | ||||||
|                 cmdbuf.DrawPrimitivesIndirect(drawBuffer, 0, 2, (uint) Marshal.SizeOf<IndirectDrawCommand>(), 0, 0); | 				cmdbuf.DrawPrimitivesIndirect(drawBuffer, 0, 2, (uint) Marshal.SizeOf<IndirectDrawCommand>(), 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             DrawIndirectGame game = new DrawIndirectGame(); | 			DrawIndirectGame game = new DrawIndirectGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,109 +5,109 @@ using System.Runtime.InteropServices; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class GetBufferDataGame : Game | 	class GetBufferDataGame : Game | ||||||
|     { | 	{ | ||||||
|         public GetBufferDataGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public GetBufferDataGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             PositionVertex[] vertices = new PositionVertex[] | 			PositionVertex[] vertices = new PositionVertex[] | ||||||
|             { | 			{ | ||||||
|                 new PositionVertex(new Vector3(0, 0, 0)), | 				new PositionVertex(new Vector3(0, 0, 0)), | ||||||
|                 new PositionVertex(new Vector3(0, 0, 1)), | 				new PositionVertex(new Vector3(0, 0, 1)), | ||||||
|                 new PositionVertex(new Vector3(0, 1, 0)), | 				new PositionVertex(new Vector3(0, 1, 0)), | ||||||
|                 new PositionVertex(new Vector3(0, 1, 1)), | 				new PositionVertex(new Vector3(0, 1, 1)), | ||||||
|                 new PositionVertex(new Vector3(1, 0, 0)), | 				new PositionVertex(new Vector3(1, 0, 0)), | ||||||
|                 new PositionVertex(new Vector3(1, 0, 1)), | 				new PositionVertex(new Vector3(1, 0, 1)), | ||||||
|                 new PositionVertex(new Vector3(1, 1, 0)), | 				new PositionVertex(new Vector3(1, 1, 0)), | ||||||
|                 new PositionVertex(new Vector3(1, 1, 1)), | 				new PositionVertex(new Vector3(1, 1, 1)), | ||||||
|             }; | 			}; | ||||||
| 
 | 
 | ||||||
|             PositionVertex[] otherVerts = new PositionVertex[] | 			PositionVertex[] otherVerts = new PositionVertex[] | ||||||
|             { | 			{ | ||||||
|                 new PositionVertex(new Vector3(1, 2, 3)), | 				new PositionVertex(new Vector3(1, 2, 3)), | ||||||
|                 new PositionVertex(new Vector3(4, 5, 6)), | 				new PositionVertex(new Vector3(4, 5, 6)), | ||||||
|                 new PositionVertex(new Vector3(7, 8, 9)) | 				new PositionVertex(new Vector3(7, 8, 9)) | ||||||
|             }; | 			}; | ||||||
| 
 | 
 | ||||||
|             int vertexSize = Marshal.SizeOf<PositionVertex>(); | 			int vertexSize = Marshal.SizeOf<PositionVertex>(); | ||||||
| 
 | 
 | ||||||
|             Buffer vertexBuffer = Buffer.Create<PositionVertex>( | 			Buffer vertexBuffer = Buffer.Create<PositionVertex>( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 BufferUsageFlags.Vertex, | 				BufferUsageFlags.Vertex, | ||||||
|                 (uint) vertices.Length | 				(uint) vertices.Length | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData(vertexBuffer, vertices); | 			cmdbuf.SetBufferData(vertexBuffer, vertices); | ||||||
|             var fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | 			var fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | ||||||
| 
 | 
 | ||||||
|             // Wait for the vertices to finish uploading... | 			// Wait for the vertices to finish uploading... | ||||||
|             GraphicsDevice.WaitForFences(fence); | 			GraphicsDevice.WaitForFences(fence); | ||||||
| 			GraphicsDevice.ReleaseFence(fence); | 			GraphicsDevice.ReleaseFence(fence); | ||||||
| 
 | 
 | ||||||
|             // Read back and print out the vertex values | 			// Read back and print out the vertex values | ||||||
|             PositionVertex[] readbackVertices = new PositionVertex[vertices.Length]; | 			PositionVertex[] readbackVertices = new PositionVertex[vertices.Length]; | ||||||
|             vertexBuffer.GetData(readbackVertices); | 			vertexBuffer.GetData(readbackVertices); | ||||||
|             for (int i = 0; i < readbackVertices.Length; i += 1) | 			for (int i = 0; i < readbackVertices.Length; i += 1) | ||||||
|             { | 			{ | ||||||
|                 Logger.LogInfo(readbackVertices[i].ToString()); | 				Logger.LogInfo(readbackVertices[i].ToString()); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             // Change the first three vertices | 			// Change the first three vertices | ||||||
|             cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData(vertexBuffer, otherVerts); | 			cmdbuf.SetBufferData(vertexBuffer, otherVerts); | ||||||
|             fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | 			fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | ||||||
|             GraphicsDevice.WaitForFences(fence); | 			GraphicsDevice.WaitForFences(fence); | ||||||
| 			GraphicsDevice.ReleaseFence(fence); | 			GraphicsDevice.ReleaseFence(fence); | ||||||
| 
 | 
 | ||||||
|             // Read the updated buffer | 			// Read the updated buffer | ||||||
|             vertexBuffer.GetData(readbackVertices); | 			vertexBuffer.GetData(readbackVertices); | ||||||
|             Logger.LogInfo("=== Change first three vertices ==="); | 			Logger.LogInfo("=== Change first three vertices ==="); | ||||||
|             for (int i = 0; i < readbackVertices.Length; i += 1) | 			for (int i = 0; i < readbackVertices.Length; i += 1) | ||||||
|             { | 			{ | ||||||
|                 Logger.LogInfo(readbackVertices[i].ToString()); | 				Logger.LogInfo(readbackVertices[i].ToString()); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             // Change the last two vertices | 			// Change the last two vertices | ||||||
|             cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 otherVerts, | 				otherVerts, | ||||||
|                 (uint) (vertexSize * (vertices.Length - 2)), | 				(uint) (vertexSize * (vertices.Length - 2)), | ||||||
|                 1, | 				1, | ||||||
|                 2 | 				2 | ||||||
|             ); | 			); | ||||||
|             fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | 			fence = GraphicsDevice.SubmitAndAcquireFence(cmdbuf); | ||||||
|             GraphicsDevice.WaitForFences(fence); | 			GraphicsDevice.WaitForFences(fence); | ||||||
| 			GraphicsDevice.ReleaseFence(fence); | 			GraphicsDevice.ReleaseFence(fence); | ||||||
| 
 | 
 | ||||||
|             // Read the updated buffer | 			// Read the updated buffer | ||||||
|             vertexBuffer.GetData(readbackVertices); | 			vertexBuffer.GetData(readbackVertices); | ||||||
|             Logger.LogInfo("=== Change last two vertices ==="); | 			Logger.LogInfo("=== Change last two vertices ==="); | ||||||
|             for (int i = 0; i < readbackVertices.Length; i += 1) | 			for (int i = 0; i < readbackVertices.Length; i += 1) | ||||||
|             { | 			{ | ||||||
|                 Logger.LogInfo(readbackVertices[i].ToString()); | 				Logger.LogInfo(readbackVertices[i].ToString()); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? swapchainTexture = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? swapchainTexture = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (swapchainTexture != null) | 			if (swapchainTexture != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(swapchainTexture, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(swapchainTexture, Color.Black)); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             GetBufferDataGame game = new GetBufferDataGame(); | 			GetBufferDataGame game = new GetBufferDataGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,103 +4,103 @@ using MoonWorks.Math.Float; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class InstancingAndOffsetsGame : Game | 	class InstancingAndOffsetsGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
| 
 | 
 | ||||||
|         private bool useVertexOffset; | 		private bool useVertexOffset; | ||||||
|         private bool useIndexOffset; | 		private bool useIndexOffset; | ||||||
| 
 | 
 | ||||||
|         public InstancingAndOffsetsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public InstancingAndOffsetsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             Logger.LogInfo("Press Left to toggle vertex offset\nPress Right to toggle index offset"); | 			Logger.LogInfo("Press Left to toggle vertex offset\nPress Right to toggle index offset"); | ||||||
| 
 | 
 | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionColorInstanced.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionColorInstanced.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionColorVertex>(); | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the vertex and index buffers | 			// Create and populate the vertex and index buffers | ||||||
|             vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 9); | 			vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 9); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionColorVertex[] | 				new PositionColorVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, 0), Color.Red), | 					new PositionColorVertex(new Vector3(-1, 1, 0), Color.Red), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, 0), Color.Lime), | 					new PositionColorVertex(new Vector3(1, 1, 0), Color.Lime), | ||||||
|                     new PositionColorVertex(new Vector3(0, -1, 0), Color.Blue), | 					new PositionColorVertex(new Vector3(0, -1, 0), Color.Blue), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, 0), Color.Orange), | 					new PositionColorVertex(new Vector3(-1, 1, 0), Color.Orange), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, 0), Color.Green), | 					new PositionColorVertex(new Vector3(1, 1, 0), Color.Green), | ||||||
|                     new PositionColorVertex(new Vector3(0, -1, 0), Color.Aqua), | 					new PositionColorVertex(new Vector3(0, -1, 0), Color.Aqua), | ||||||
| 
 | 
 | ||||||
|                     new PositionColorVertex(new Vector3(-1, 1, 0), Color.White), | 					new PositionColorVertex(new Vector3(-1, 1, 0), Color.White), | ||||||
|                     new PositionColorVertex(new Vector3(1, 1, 0), Color.White), | 					new PositionColorVertex(new Vector3(1, 1, 0), Color.White), | ||||||
|                     new PositionColorVertex(new Vector3(0, -1, 0), Color.White), | 					new PositionColorVertex(new Vector3(0, -1, 0), Color.White), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     3, 4, 5, | 					3, 4, 5, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | ||||||
|             { | 			{ | ||||||
|                 useVertexOffset = !useVertexOffset; | 				useVertexOffset = !useVertexOffset; | ||||||
|                 Logger.LogInfo("Using vertex offset: " + useVertexOffset); | 				Logger.LogInfo("Using vertex offset: " + useVertexOffset); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | ||||||
|             { | 			{ | ||||||
|                 useIndexOffset = !useIndexOffset; | 				useIndexOffset = !useIndexOffset; | ||||||
|                 Logger.LogInfo("Using index offset: " + useIndexOffset); | 				Logger.LogInfo("Using index offset: " + useIndexOffset); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             uint vertexOffset = useVertexOffset ? 3u : 0; | 			uint vertexOffset = useVertexOffset ? 3u : 0; | ||||||
|             uint indexOffset = useIndexOffset ? 3u : 0; | 			uint indexOffset = useIndexOffset ? 3u : 0; | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.DrawInstancedPrimitives(vertexOffset, indexOffset, 1, 16, 0, 0); | 				cmdbuf.DrawInstancedPrimitives(vertexOffset, indexOffset, 1, 16, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             InstancingAndOffsetsGame p = new InstancingAndOffsetsGame(); | 			InstancingAndOffsetsGame p = new InstancingAndOffsetsGame(); | ||||||
|             p.Run(); | 			p.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -56,80 +56,80 @@ namespace MoonWorks.Test | ||||||
| 			return SDL2.SDL.SDL_GetBasePath() + "Content/Textures/" + textureName; | 			return SDL2.SDL.SDL_GetBasePath() + "Content/Textures/" + textureName; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|         public static string GetVideoPath(string videoName) | 		public static string GetVideoPath(string videoName) | ||||||
|         { | 		{ | ||||||
|             return SDL2.SDL.SDL_GetBasePath() + "Content/Videos/" + videoName; | 			return SDL2.SDL.SDL_GetBasePath() + "Content/Videos/" + videoName; | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public enum ButtonType | 		public enum ButtonType | ||||||
|         { | 		{ | ||||||
|             Left,	// A/left arrow on keyboard, left face button on gamepad | 			Left,	// A/left arrow on keyboard, left face button on gamepad | ||||||
|             Bottom,	// S/down arrow on keyboard, bottom face button on gamepad | 			Bottom,	// S/down arrow on keyboard, bottom face button on gamepad | ||||||
|             Right	// D/right arrow on keyboard, right face button on gamepad | 			Right	// D/right arrow on keyboard, right face button on gamepad | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static bool CheckButtonPressed(Input.Inputs inputs, ButtonType buttonType) | 		public static bool CheckButtonPressed(Input.Inputs inputs, ButtonType buttonType) | ||||||
|         { | 		{ | ||||||
|             bool pressed = false; | 			bool pressed = false; | ||||||
| 
 | 
 | ||||||
|             if (buttonType == ButtonType.Left) | 			if (buttonType == ButtonType.Left) | ||||||
|             { | 			{ | ||||||
|                 pressed = ( | 				pressed = ( | ||||||
|                     (inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadLeft.IsPressed) || | 					(inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadLeft.IsPressed) || | ||||||
|                     inputs.Keyboard.IsPressed(Input.KeyCode.A) || | 					inputs.Keyboard.IsPressed(Input.KeyCode.A) || | ||||||
|                     inputs.Keyboard.IsPressed(Input.KeyCode.Left) | 					inputs.Keyboard.IsPressed(Input.KeyCode.Left) | ||||||
|                 ); | 				); | ||||||
|             } | 			} | ||||||
|             else if (buttonType == ButtonType.Bottom) | 			else if (buttonType == ButtonType.Bottom) | ||||||
|             { | 			{ | ||||||
|                 pressed = ( | 				pressed = ( | ||||||
|                     (inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadDown.IsPressed) || | 					(inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadDown.IsPressed) || | ||||||
|                     inputs.Keyboard.IsPressed(Input.KeyCode.S) || | 					inputs.Keyboard.IsPressed(Input.KeyCode.S) || | ||||||
|                     inputs.Keyboard.IsPressed(Input.KeyCode.Down) | 					inputs.Keyboard.IsPressed(Input.KeyCode.Down) | ||||||
|                 ); | 				); | ||||||
|             } | 			} | ||||||
|             else if (buttonType == ButtonType.Right) | 			else if (buttonType == ButtonType.Right) | ||||||
|             { | 			{ | ||||||
|                 pressed = ( | 				pressed = ( | ||||||
|                     (inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadRight.IsPressed) || | 					(inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadRight.IsPressed) || | ||||||
|                     inputs.Keyboard.IsPressed(Input.KeyCode.D) || | 					inputs.Keyboard.IsPressed(Input.KeyCode.D) || | ||||||
|                     inputs.Keyboard.IsPressed(Input.KeyCode.Right) | 					inputs.Keyboard.IsPressed(Input.KeyCode.Right) | ||||||
|                 ); | 				); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             return pressed; | 			return pressed; | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static bool CheckButtonDown(Input.Inputs inputs, ButtonType buttonType) | 		public static bool CheckButtonDown(Input.Inputs inputs, ButtonType buttonType) | ||||||
|         { | 		{ | ||||||
|             bool down = false; | 			bool down = false; | ||||||
| 
 | 
 | ||||||
|             if (buttonType == ButtonType.Left) | 			if (buttonType == ButtonType.Left) | ||||||
|             { | 			{ | ||||||
|                 down = ( | 				down = ( | ||||||
|                     (inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadLeft.IsDown) || | 					(inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadLeft.IsDown) || | ||||||
|                     inputs.Keyboard.IsDown(Input.KeyCode.A) || | 					inputs.Keyboard.IsDown(Input.KeyCode.A) || | ||||||
|                     inputs.Keyboard.IsDown(Input.KeyCode.Left) | 					inputs.Keyboard.IsDown(Input.KeyCode.Left) | ||||||
|                 ); | 				); | ||||||
|             } | 			} | ||||||
|             else if (buttonType == ButtonType.Bottom) | 			else if (buttonType == ButtonType.Bottom) | ||||||
|             { | 			{ | ||||||
|                 down = ( | 				down = ( | ||||||
|                     (inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadDown.IsDown) || | 					(inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadDown.IsDown) || | ||||||
|                     inputs.Keyboard.IsDown(Input.KeyCode.S) || | 					inputs.Keyboard.IsDown(Input.KeyCode.S) || | ||||||
|                     inputs.Keyboard.IsDown(Input.KeyCode.Down) | 					inputs.Keyboard.IsDown(Input.KeyCode.Down) | ||||||
|                 ); | 				); | ||||||
|             } | 			} | ||||||
|             else if (buttonType == ButtonType.Right) | 			else if (buttonType == ButtonType.Right) | ||||||
|             { | 			{ | ||||||
|                 down = ( | 				down = ( | ||||||
|                     (inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadRight.IsDown) || | 					(inputs.GamepadExists(0) && inputs.GetGamepad(0).DpadRight.IsDown) || | ||||||
|                     inputs.Keyboard.IsDown(Input.KeyCode.D) || | 					inputs.Keyboard.IsDown(Input.KeyCode.D) || | ||||||
|                     inputs.Keyboard.IsDown(Input.KeyCode.Right) | 					inputs.Keyboard.IsDown(Input.KeyCode.Right) | ||||||
|                 ); | 				); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             return down; | 			return down; | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,13 +2,13 @@ | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     public struct TransformVertexUniform | 	public struct TransformVertexUniform | ||||||
|     { | 	{ | ||||||
|         public Matrix4x4 ViewProjection; | 		public Matrix4x4 ViewProjection; | ||||||
| 
 | 
 | ||||||
|         public TransformVertexUniform(Matrix4x4 viewProjection) | 		public TransformVertexUniform(Matrix4x4 viewProjection) | ||||||
|         { | 		{ | ||||||
|             ViewProjection = viewProjection; | 			ViewProjection = viewProjection; | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -20,12 +20,12 @@ namespace MoonWorks.Test | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		public override string ToString() | 		public override string ToString() | ||||||
|         { | 		{ | ||||||
| 			return Position.ToString(); | 			return Position.ToString(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|     [StructLayout(LayoutKind.Sequential)] | 	[StructLayout(LayoutKind.Sequential)] | ||||||
| 	public struct PositionColorVertex : IVertexType | 	public struct PositionColorVertex : IVertexType | ||||||
| 	{ | 	{ | ||||||
| 		public Vector3 Position; | 		public Vector3 Position; | ||||||
|  | @ -67,9 +67,9 @@ namespace MoonWorks.Test | ||||||
| 			VertexElementFormat.Vector2 | 			VertexElementFormat.Vector2 | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
|         public override string ToString() | 		public override string ToString() | ||||||
|         { | 		{ | ||||||
| 			return Position + " | " + TexCoord; | 			return Position + " | " + TexCoord; | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,130 +5,130 @@ using RefreshCS; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class RenderTexture3DGame : Game | 	class RenderTexture3DGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
|         private Texture rt; | 		private Texture rt; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
| 
 | 
 | ||||||
|         private float t; | 		private float t; | ||||||
|         private Color[] colors = new Color[] | 		private Color[] colors = new Color[] | ||||||
|         { | 		{ | ||||||
|             Color.Red, | 			Color.Red, | ||||||
|             Color.Green, | 			Color.Green, | ||||||
|             Color.Blue, | 			Color.Blue, | ||||||
|         }; | 		}; | ||||||
| 
 | 
 | ||||||
|         struct FragUniform | 		struct FragUniform | ||||||
|         { | 		{ | ||||||
|             public float Depth; | 			public float Depth; | ||||||
| 
 | 
 | ||||||
|             public FragUniform(float depth) | 			public FragUniform(float depth) | ||||||
|             { | 			{ | ||||||
|                 Depth = depth; | 				Depth = depth; | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public RenderTexture3DGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public RenderTexture3DGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad3D.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad3D.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo = GraphicsShaderInfo.Create<FragUniform>(fragShaderModule, "main", 1); | 			pipelineCreateInfo.FragmentShaderInfo = GraphicsShaderInfo.Create<FragUniform>(fragShaderModule, "main", 1); | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create samplers | 			// Create samplers | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearWrap); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearWrap); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
|             rt = Texture.CreateTexture3D( | 			rt = Texture.CreateTexture3D( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 16, | 				16, | ||||||
|                 16, | 				16, | ||||||
|                 (uint) colors.Length, | 				(uint) colors.Length, | ||||||
|                 TextureFormat.R8G8B8A8, | 				TextureFormat.R8G8B8A8, | ||||||
|                 TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler | 				TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     0, 2, 3, | 					0, 2, 3, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Clear each depth slice of the RT to a different color | 			// Clear each depth slice of the RT to a different color | ||||||
|             for (uint i = 0; i < colors.Length; i += 1) | 			for (uint i = 0; i < colors.Length; i += 1) | ||||||
|             { | 			{ | ||||||
|                 ColorAttachmentInfo attachmentInfo = new ColorAttachmentInfo | 				ColorAttachmentInfo attachmentInfo = new ColorAttachmentInfo | ||||||
|                 { | 				{ | ||||||
|                     Texture = rt, | 					Texture = rt, | ||||||
|                     ClearColor = colors[i], | 					ClearColor = colors[i], | ||||||
|                     Depth = i, | 					Depth = i, | ||||||
|                     Layer = 0, | 					Layer = 0, | ||||||
|                     Level = 0, | 					Level = 0, | ||||||
|                     LoadOp = LoadOp.Clear, | 					LoadOp = LoadOp.Clear, | ||||||
|                     StoreOp = StoreOp.Store | 					StoreOp = StoreOp.Store | ||||||
|                 }; | 				}; | ||||||
|                 cmdbuf.BeginRenderPass(attachmentInfo); | 				cmdbuf.BeginRenderPass(attachmentInfo); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             t += 0.01f; | 			t += 0.01f; | ||||||
|             FragUniform fragUniform = new FragUniform(t); | 			FragUniform fragUniform = new FragUniform(t); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(rt, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(rt, sampler)); | ||||||
|                 uint fragParamOffset = cmdbuf.PushFragmentShaderUniforms(fragUniform); | 				uint fragParamOffset = cmdbuf.PushFragmentShaderUniforms(fragUniform); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, fragParamOffset); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, fragParamOffset); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             RenderTexture3DGame game = new RenderTexture3DGame(); | 			RenderTexture3DGame game = new RenderTexture3DGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,171 +6,171 @@ using System.Runtime.InteropServices; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class RenderTextureCubeGame : Game | 	class RenderTextureCubeGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
|         private Texture cubemap; | 		private Texture cubemap; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
| 
 | 
 | ||||||
|         private Vector3 camPos = new Vector3(0, 0, 4f); | 		private Vector3 camPos = new Vector3(0, 0, 4f); | ||||||
| 
 | 
 | ||||||
|         private Color[] colors = new Color[] | 		private Color[] colors = new Color[] | ||||||
|         { | 		{ | ||||||
|             Color.Red, | 			Color.Red, | ||||||
|             Color.Green, | 			Color.Green, | ||||||
|             Color.Blue, | 			Color.Blue, | ||||||
|             Color.Orange, | 			Color.Orange, | ||||||
|             Color.Yellow, | 			Color.Yellow, | ||||||
|             Color.Purple, | 			Color.Purple, | ||||||
|         }; | 		}; | ||||||
| 
 | 
 | ||||||
|         public RenderTextureCubeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public RenderTextureCubeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             Logger.LogInfo("Press Down to view the other side of the cubemap"); | 			Logger.LogInfo("Press Down to view the other side of the cubemap"); | ||||||
| 
 | 
 | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("Skybox.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("Skybox.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("Skybox.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("Skybox.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionVertex>(); | ||||||
|             pipelineCreateInfo.VertexShaderInfo.UniformBufferSize = (uint) Marshal.SizeOf<TransformVertexUniform>(); | 			pipelineCreateInfo.VertexShaderInfo.UniformBufferSize = (uint) Marshal.SizeOf<TransformVertexUniform>(); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create samplers | 			// Create samplers | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 24); | 			vertexBuffer = Buffer.Create<PositionVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 24); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 36); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 36); | ||||||
|             cubemap = Texture.CreateTextureCube( | 			cubemap = Texture.CreateTextureCube( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 16, | 				16, | ||||||
|                 TextureFormat.R8G8B8A8, | 				TextureFormat.R8G8B8A8, | ||||||
|                 TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler | 				TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionVertex[] | 				new PositionVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionVertex(new Vector3(-10, -10, -10)), | 					new PositionVertex(new Vector3(-10, -10, -10)), | ||||||
|                     new PositionVertex(new Vector3(10, -10, -10)), | 					new PositionVertex(new Vector3(10, -10, -10)), | ||||||
|                     new PositionVertex(new Vector3(10, 10, -10)), | 					new PositionVertex(new Vector3(10, 10, -10)), | ||||||
|                     new PositionVertex(new Vector3(-10, 10, -10)), | 					new PositionVertex(new Vector3(-10, 10, -10)), | ||||||
| 
 | 
 | ||||||
|                     new PositionVertex(new Vector3(-10, -10, 10)), | 					new PositionVertex(new Vector3(-10, -10, 10)), | ||||||
|                     new PositionVertex(new Vector3(10, -10, 10)), | 					new PositionVertex(new Vector3(10, -10, 10)), | ||||||
|                     new PositionVertex(new Vector3(10, 10, 10)), | 					new PositionVertex(new Vector3(10, 10, 10)), | ||||||
|                     new PositionVertex(new Vector3(-10, 10, 10)), | 					new PositionVertex(new Vector3(-10, 10, 10)), | ||||||
| 
 | 
 | ||||||
|                     new PositionVertex(new Vector3(-10, -10, -10)), | 					new PositionVertex(new Vector3(-10, -10, -10)), | ||||||
|                     new PositionVertex(new Vector3(-10, 10, -10)), | 					new PositionVertex(new Vector3(-10, 10, -10)), | ||||||
|                     new PositionVertex(new Vector3(-10, 10, 10)), | 					new PositionVertex(new Vector3(-10, 10, 10)), | ||||||
|                     new PositionVertex(new Vector3(-10, -10, 10)), | 					new PositionVertex(new Vector3(-10, -10, 10)), | ||||||
| 
 | 
 | ||||||
|                     new PositionVertex(new Vector3(10, -10, -10)), | 					new PositionVertex(new Vector3(10, -10, -10)), | ||||||
|                     new PositionVertex(new Vector3(10, 10, -10)), | 					new PositionVertex(new Vector3(10, 10, -10)), | ||||||
|                     new PositionVertex(new Vector3(10, 10, 10)), | 					new PositionVertex(new Vector3(10, 10, 10)), | ||||||
|                     new PositionVertex(new Vector3(10, -10, 10)), | 					new PositionVertex(new Vector3(10, -10, 10)), | ||||||
| 
 | 
 | ||||||
|                     new PositionVertex(new Vector3(-10, -10, -10)), | 					new PositionVertex(new Vector3(-10, -10, -10)), | ||||||
|                     new PositionVertex(new Vector3(-10, -10, 10)), | 					new PositionVertex(new Vector3(-10, -10, 10)), | ||||||
|                     new PositionVertex(new Vector3(10, -10, 10)), | 					new PositionVertex(new Vector3(10, -10, 10)), | ||||||
|                     new PositionVertex(new Vector3(10, -10, -10)), | 					new PositionVertex(new Vector3(10, -10, -10)), | ||||||
| 
 | 
 | ||||||
|                     new PositionVertex(new Vector3(-10, 10, -10)), | 					new PositionVertex(new Vector3(-10, 10, -10)), | ||||||
|                     new PositionVertex(new Vector3(-10, 10, 10)), | 					new PositionVertex(new Vector3(-10, 10, 10)), | ||||||
|                     new PositionVertex(new Vector3(10, 10, 10)), | 					new PositionVertex(new Vector3(10, 10, 10)), | ||||||
|                     new PositionVertex(new Vector3(10, 10, -10)) | 					new PositionVertex(new Vector3(10, 10, -10)) | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2,    0, 2, 3, | 					0, 1, 2,	0, 2, 3, | ||||||
|                     6, 5, 4,    7, 6, 4, | 					6, 5, 4,	7, 6, 4, | ||||||
|                     8, 9, 10,   8, 10, 11, | 					8, 9, 10,   8, 10, 11, | ||||||
|                     14, 13, 12, 15, 14, 12, | 					14, 13, 12, 15, 14, 12, | ||||||
|                     16, 17, 18, 16, 18, 19, | 					16, 17, 18, 16, 18, 19, | ||||||
|                     22, 21, 20, 23, 22, 20 | 					22, 21, 20, 23, 22, 20 | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Clear each slice of the cubemap to a different color | 			// Clear each slice of the cubemap to a different color | ||||||
|             for (uint i = 0; i < 6; i += 1) | 			for (uint i = 0; i < 6; i += 1) | ||||||
|             { | 			{ | ||||||
|                 ColorAttachmentInfo attachmentInfo = new ColorAttachmentInfo | 				ColorAttachmentInfo attachmentInfo = new ColorAttachmentInfo | ||||||
|                 { | 				{ | ||||||
|                     Texture = cubemap, | 					Texture = cubemap, | ||||||
|                     ClearColor = colors[i], | 					ClearColor = colors[i], | ||||||
|                     Depth = 0, | 					Depth = 0, | ||||||
|                     Layer = i, | 					Layer = i, | ||||||
|                     Level = 0, | 					Level = 0, | ||||||
|                     LoadOp = LoadOp.Clear, | 					LoadOp = LoadOp.Clear, | ||||||
|                     StoreOp = StoreOp.Store | 					StoreOp = StoreOp.Store | ||||||
|                 }; | 				}; | ||||||
|                 cmdbuf.BeginRenderPass(attachmentInfo); | 				cmdbuf.BeginRenderPass(attachmentInfo); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Bottom)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Bottom)) | ||||||
|             { | 			{ | ||||||
|                 camPos.Z *= -1; | 				camPos.Z *= -1; | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             Matrix4x4 proj = Matrix4x4.CreatePerspectiveFieldOfView( | 			Matrix4x4 proj = Matrix4x4.CreatePerspectiveFieldOfView( | ||||||
|                 MathHelper.ToRadians(75f), | 				MathHelper.ToRadians(75f), | ||||||
|                 (float) MainWindow.Width / MainWindow.Height, | 				(float) MainWindow.Width / MainWindow.Height, | ||||||
|                 0.01f, | 				0.01f, | ||||||
|                 100f | 				100f | ||||||
|             ); | 			); | ||||||
|             Matrix4x4 view = Matrix4x4.CreateLookAt( | 			Matrix4x4 view = Matrix4x4.CreateLookAt( | ||||||
|                 camPos, | 				camPos, | ||||||
|                 Vector3.Zero, | 				Vector3.Zero, | ||||||
|                 Vector3.Up | 				Vector3.Up | ||||||
|             ); | 			); | ||||||
|             TransformVertexUniform vertUniforms = new TransformVertexUniform(view * proj); | 			TransformVertexUniform vertUniforms = new TransformVertexUniform(view * proj); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(cubemap, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(cubemap, sampler)); | ||||||
|                 uint vertexUniformOffset = cmdbuf.PushVertexShaderUniforms(vertUniforms); | 				uint vertexUniformOffset = cmdbuf.PushVertexShaderUniforms(vertUniforms); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 12, vertexUniformOffset, 0); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 12, vertexUniformOffset, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             RenderTextureCubeGame game = new RenderTextureCubeGame(); | 			RenderTextureCubeGame game = new RenderTextureCubeGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,179 +4,179 @@ using MoonWorks.Math.Float; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class RenderTextureMipmapsGame : Game | 	class RenderTextureMipmapsGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
|         private Texture texture; | 		private Texture texture; | ||||||
| 
 | 
 | ||||||
|         private Sampler[] samplers = new Sampler[5]; | 		private Sampler[] samplers = new Sampler[5]; | ||||||
| 
 | 
 | ||||||
|         private float scale = 0.5f; | 		private float scale = 0.5f; | ||||||
|         private int currentSamplerIndex = 0; | 		private int currentSamplerIndex = 0; | ||||||
|         private Color[] colors = new Color[] | 		private Color[] colors = new Color[] | ||||||
|         { | 		{ | ||||||
|             Color.Red, | 			Color.Red, | ||||||
|             Color.Green, | 			Color.Green, | ||||||
|             Color.Blue, | 			Color.Blue, | ||||||
|             Color.Yellow, | 			Color.Yellow, | ||||||
|         }; | 		}; | ||||||
| 
 | 
 | ||||||
|         private string GetSamplerString(int index) | 		private string GetSamplerString(int index) | ||||||
|         { | 		{ | ||||||
|             switch (index) | 			switch (index) | ||||||
|             { | 			{ | ||||||
|                 case 0: | 				case 0: | ||||||
|                     return "PointClamp"; | 					return "PointClamp"; | ||||||
|                 case 1: | 				case 1: | ||||||
|                     return "LinearClamp"; | 					return "LinearClamp"; | ||||||
|                 case 2: | 				case 2: | ||||||
|                     return "PointClamp with Mip LOD Bias = 0.25"; | 					return "PointClamp with Mip LOD Bias = 0.25"; | ||||||
|                 case 3: | 				case 3: | ||||||
|                     return "PointClamp with Min LOD = 1"; | 					return "PointClamp with Min LOD = 1"; | ||||||
|                 case 4: | 				case 4: | ||||||
|                     return "PointClamp with Max LOD = 1"; | 					return "PointClamp with Max LOD = 1"; | ||||||
|                 default: | 				default: | ||||||
|                     throw new System.Exception("Unknown sampler!"); | 					throw new System.Exception("Unknown sampler!"); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public RenderTextureMipmapsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public RenderTextureMipmapsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             Logger.LogInfo("Press Left and Right to shrink/expand the scale of the quad"); | 			Logger.LogInfo("Press Left and Right to shrink/expand the scale of the quad"); | ||||||
|             Logger.LogInfo("Press Down to cycle through sampler states"); | 			Logger.LogInfo("Press Down to cycle through sampler states"); | ||||||
|             Logger.LogInfo(GetSamplerString(currentSamplerIndex)); | 			Logger.LogInfo(GetSamplerString(currentSamplerIndex)); | ||||||
| 
 | 
 | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadWithMatrix.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadWithMatrix.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(vertShaderModule, "main", 0); | 			pipelineCreateInfo.VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(vertShaderModule, "main", 0); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create samplers | 			// Create samplers | ||||||
|             SamplerCreateInfo samplerCreateInfo = SamplerCreateInfo.PointClamp; | 			SamplerCreateInfo samplerCreateInfo = SamplerCreateInfo.PointClamp; | ||||||
|             samplers[0] = new Sampler(GraphicsDevice, samplerCreateInfo); | 			samplers[0] = new Sampler(GraphicsDevice, samplerCreateInfo); | ||||||
| 
 | 
 | ||||||
|             samplerCreateInfo = SamplerCreateInfo.LinearClamp; | 			samplerCreateInfo = SamplerCreateInfo.LinearClamp; | ||||||
|             samplers[1] = new Sampler(GraphicsDevice, samplerCreateInfo); | 			samplers[1] = new Sampler(GraphicsDevice, samplerCreateInfo); | ||||||
| 
 | 
 | ||||||
|             samplerCreateInfo = SamplerCreateInfo.PointClamp; | 			samplerCreateInfo = SamplerCreateInfo.PointClamp; | ||||||
|             samplerCreateInfo.MipLodBias = 0.25f; | 			samplerCreateInfo.MipLodBias = 0.25f; | ||||||
|             samplers[2] = new Sampler(GraphicsDevice, samplerCreateInfo); | 			samplers[2] = new Sampler(GraphicsDevice, samplerCreateInfo); | ||||||
| 
 | 
 | ||||||
|             samplerCreateInfo = SamplerCreateInfo.PointClamp; | 			samplerCreateInfo = SamplerCreateInfo.PointClamp; | ||||||
|             samplerCreateInfo.MinLod = 1; | 			samplerCreateInfo.MinLod = 1; | ||||||
|             samplers[3] = new Sampler(GraphicsDevice, samplerCreateInfo); | 			samplers[3] = new Sampler(GraphicsDevice, samplerCreateInfo); | ||||||
| 
 | 
 | ||||||
|             samplerCreateInfo = SamplerCreateInfo.PointClamp; | 			samplerCreateInfo = SamplerCreateInfo.PointClamp; | ||||||
|             samplerCreateInfo.MaxLod = 1; | 			samplerCreateInfo.MaxLod = 1; | ||||||
|             samplers[4] = new Sampler(GraphicsDevice, samplerCreateInfo); | 			samplers[4] = new Sampler(GraphicsDevice, samplerCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
|             texture = Texture.CreateTexture2D( | 			texture = Texture.CreateTexture2D( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 MainWindow.Width, | 				MainWindow.Width, | ||||||
|                 MainWindow.Height, | 				MainWindow.Height, | ||||||
|                 TextureFormat.R8G8B8A8, | 				TextureFormat.R8G8B8A8, | ||||||
|                 TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler, | 				TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler, | ||||||
|                 4 | 				4 | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     0, 2, 3, | 					0, 2, 3, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Clear each mip level to a different color | 			// Clear each mip level to a different color | ||||||
|             for (uint i = 0; i < texture.LevelCount; i += 1) | 			for (uint i = 0; i < texture.LevelCount; i += 1) | ||||||
|             { | 			{ | ||||||
|                 ColorAttachmentInfo attachmentInfo = new ColorAttachmentInfo | 				ColorAttachmentInfo attachmentInfo = new ColorAttachmentInfo | ||||||
|                 { | 				{ | ||||||
|                     Texture = texture, | 					Texture = texture, | ||||||
|                     ClearColor = colors[i], | 					ClearColor = colors[i], | ||||||
|                     Depth = 0, | 					Depth = 0, | ||||||
|                     Layer = 0, | 					Layer = 0, | ||||||
|                     Level = i, | 					Level = i, | ||||||
|                     LoadOp = LoadOp.Clear, | 					LoadOp = LoadOp.Clear, | ||||||
|                     StoreOp = StoreOp.Store | 					StoreOp = StoreOp.Store | ||||||
|                 }; | 				}; | ||||||
|                 cmdbuf.BeginRenderPass(attachmentInfo); | 				cmdbuf.BeginRenderPass(attachmentInfo); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Left)) | 			if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Left)) | ||||||
|             { | 			{ | ||||||
|                 scale = System.MathF.Max(0.01f, scale - 0.01f); | 				scale = System.MathF.Max(0.01f, scale - 0.01f); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Right)) | 			if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Right)) | ||||||
|             { | 			{ | ||||||
|                 scale = System.MathF.Min(1f, scale + 0.01f); | 				scale = System.MathF.Min(1f, scale + 0.01f); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Bottom)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Bottom)) | ||||||
|             { | 			{ | ||||||
|                 currentSamplerIndex = (currentSamplerIndex + 1) % samplers.Length; | 				currentSamplerIndex = (currentSamplerIndex + 1) % samplers.Length; | ||||||
|                 Logger.LogInfo(GetSamplerString(currentSamplerIndex)); | 				Logger.LogInfo(GetSamplerString(currentSamplerIndex)); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             TransformVertexUniform vertUniforms = new TransformVertexUniform(Matrix4x4.CreateScale(scale, scale, 1)); | 			TransformVertexUniform vertUniforms = new TransformVertexUniform(Matrix4x4.CreateScale(scale, scale, 1)); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, samplers[currentSamplerIndex])); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, samplers[currentSamplerIndex])); | ||||||
|                 uint vertParamOffset = cmdbuf.PushVertexShaderUniforms(vertUniforms); | 				uint vertParamOffset = cmdbuf.PushVertexShaderUniforms(vertUniforms); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 2, vertParamOffset, 0); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, vertParamOffset, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             RenderTextureMipmapsGame game = new RenderTextureMipmapsGame(); | 			RenderTextureMipmapsGame game = new RenderTextureMipmapsGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,143 +5,143 @@ using RefreshCS; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class Texture3DGame : Game | 	class Texture3DGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
|         private Texture texture; | 		private Texture texture; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
| 
 | 
 | ||||||
|         private int currentDepth = 0; | 		private int currentDepth = 0; | ||||||
| 
 | 
 | ||||||
|         struct FragUniform | 		struct FragUniform | ||||||
|         { | 		{ | ||||||
|             public float Depth; | 			public float Depth; | ||||||
| 
 | 
 | ||||||
|             public FragUniform(float depth) | 			public FragUniform(float depth) | ||||||
|             { | 			{ | ||||||
|                 Depth = depth; | 				Depth = depth; | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public Texture3DGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public Texture3DGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             Logger.LogInfo("Press Left and Right to cycle between depth slices"); | 			Logger.LogInfo("Press Left and Right to cycle between depth slices"); | ||||||
| 
 | 
 | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad3D.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad3D.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo = GraphicsShaderInfo.Create<FragUniform>(fragShaderModule, "main", 1); | 			pipelineCreateInfo.FragmentShaderInfo = GraphicsShaderInfo.Create<FragUniform>(fragShaderModule, "main", 1); | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create samplers | 			// Create samplers | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
|             texture = Texture.CreateTexture3D(GraphicsDevice, 16, 16, 7, TextureFormat.R8G8B8A8, TextureUsageFlags.Sampler); | 			texture = Texture.CreateTexture3D(GraphicsDevice, 16, 16, 7, TextureFormat.R8G8B8A8, TextureUsageFlags.Sampler); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     0, 2, 3, | 					0, 2, 3, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Load each depth subimage of the 3D texture | 			// Load each depth subimage of the 3D texture | ||||||
|             for (uint i = 0; i < texture.Depth; i += 1) | 			for (uint i = 0; i < texture.Depth; i += 1) | ||||||
|             { | 			{ | ||||||
|                 TextureSlice slice = new TextureSlice( | 				TextureSlice slice = new TextureSlice( | ||||||
|                     texture, | 					texture, | ||||||
|                     new Rect(0, 0, (int) texture.Width, (int) texture.Height), | 					new Rect(0, 0, (int) texture.Width, (int) texture.Height), | ||||||
|                     i | 					i | ||||||
|                 ); | 				); | ||||||
| 
 | 
 | ||||||
| 				Texture.SetDataFromImageFile( | 				Texture.SetDataFromImageFile( | ||||||
| 					cmdbuf, | 					cmdbuf, | ||||||
| 					slice, | 					slice, | ||||||
| 					TestUtils.GetTexturePath($"tex3d_{i}.png") | 					TestUtils.GetTexturePath($"tex3d_{i}.png") | ||||||
| 				); | 				); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             int prevDepth = currentDepth; | 			int prevDepth = currentDepth; | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | ||||||
|             { | 			{ | ||||||
|                 currentDepth -= 1; | 				currentDepth -= 1; | ||||||
|                 if (currentDepth < 0) | 				if (currentDepth < 0) | ||||||
|                 { | 				{ | ||||||
|                     currentDepth = (int) texture.Depth - 1; | 					currentDepth = (int) texture.Depth - 1; | ||||||
|                 } | 				} | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | ||||||
|             { | 			{ | ||||||
|                 currentDepth += 1; | 				currentDepth += 1; | ||||||
|                 if (currentDepth >= texture.Depth) | 				if (currentDepth >= texture.Depth) | ||||||
|                 { | 				{ | ||||||
|                     currentDepth = 0; | 					currentDepth = 0; | ||||||
|                 } | 				} | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (prevDepth != currentDepth) | 			if (prevDepth != currentDepth) | ||||||
|             { | 			{ | ||||||
|                 Logger.LogInfo("Setting depth to: " + currentDepth); | 				Logger.LogInfo("Setting depth to: " + currentDepth); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             FragUniform fragUniform = new FragUniform((float) currentDepth / texture.Depth); | 			FragUniform fragUniform = new FragUniform((float) currentDepth / texture.Depth); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | ||||||
|                 uint fragParamOffset = cmdbuf.PushFragmentShaderUniforms(fragUniform); | 				uint fragParamOffset = cmdbuf.PushFragmentShaderUniforms(fragUniform); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, fragParamOffset); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, fragParamOffset); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             Texture3DGame game = new Texture3DGame(); | 			Texture3DGame game = new Texture3DGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,124 +5,124 @@ using RefreshCS; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class TextureMipmapsGame : Game | 	class TextureMipmapsGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
|         private Texture texture; | 		private Texture texture; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
| 
 | 
 | ||||||
|         private float scale = 0.5f; | 		private float scale = 0.5f; | ||||||
| 
 | 
 | ||||||
|         public TextureMipmapsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public TextureMipmapsGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             Logger.LogInfo("Press Left and Right to shrink/expand the scale of the quad"); | 			Logger.LogInfo("Press Left and Right to shrink/expand the scale of the quad"); | ||||||
| 
 | 
 | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadWithMatrix.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadWithMatrix.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(vertShaderModule, "main", 0); | 			pipelineCreateInfo.VertexShaderInfo = GraphicsShaderInfo.Create<TransformVertexUniform>(vertShaderModule, "main", 0); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
|             texture = Texture.CreateTexture2D( | 			texture = Texture.CreateTexture2D( | ||||||
|                 GraphicsDevice, | 				GraphicsDevice, | ||||||
|                 256, | 				256, | ||||||
|                 256, | 				256, | ||||||
|                 TextureFormat.R8G8B8A8, | 				TextureFormat.R8G8B8A8, | ||||||
|                 TextureUsageFlags.Sampler, | 				TextureUsageFlags.Sampler, | ||||||
|                 4 | 				4 | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     0, 2, 3, | 					0, 2, 3, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
| 
 | 
 | ||||||
|             // Set the various mip levels | 			// Set the various mip levels | ||||||
|             for (int i = 0; i < texture.LevelCount; i += 1) | 			for (int i = 0; i < texture.LevelCount; i += 1) | ||||||
|             { | 			{ | ||||||
|                 int w = (int) texture.Width >> i; | 				int w = (int) texture.Width >> i; | ||||||
|                 int h = (int) texture.Height >> i; | 				int h = (int) texture.Height >> i; | ||||||
|                 TextureSlice slice = new TextureSlice( | 				TextureSlice slice = new TextureSlice( | ||||||
|                     texture, | 					texture, | ||||||
|                     new Rect(0, 0, w, h), | 					new Rect(0, 0, w, h), | ||||||
|                     0, | 					0, | ||||||
|                     0, | 					0, | ||||||
|                     (uint) i | 					(uint) i | ||||||
|                 ); | 				); | ||||||
| 
 | 
 | ||||||
| 				Texture.SetDataFromImageFile(cmdbuf, slice, TestUtils.GetTexturePath($"mip{i}.png")); | 				Texture.SetDataFromImageFile(cmdbuf, slice, TestUtils.GetTexturePath($"mip{i}.png")); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Left)) | 			if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Left)) | ||||||
|             { | 			{ | ||||||
|                 scale = System.MathF.Max(0.01f, scale - 0.01f); | 				scale = System.MathF.Max(0.01f, scale - 0.01f); | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Right)) | 			if (TestUtils.CheckButtonDown(Inputs, TestUtils.ButtonType.Right)) | ||||||
|             { | 			{ | ||||||
|                 scale = System.MathF.Min(1f, scale + 0.01f); | 				scale = System.MathF.Min(1f, scale + 0.01f); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             TransformVertexUniform vertUniforms = new TransformVertexUniform(Matrix4x4.CreateScale(scale, scale, 1)); | 			TransformVertexUniform vertUniforms = new TransformVertexUniform(Matrix4x4.CreateScale(scale, scale, 1)); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | ||||||
|                 uint vertParamOffset = cmdbuf.PushVertexShaderUniforms(vertUniforms); | 				uint vertParamOffset = cmdbuf.PushVertexShaderUniforms(vertUniforms); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 2, vertParamOffset, 0); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, vertParamOffset, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             TextureMipmapsGame game = new TextureMipmapsGame(); | 			TextureMipmapsGame game = new TextureMipmapsGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,70 +4,70 @@ using MoonWorks.Math.Float; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class VertexSamplerGame : Game | 	class VertexSamplerGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Texture texture; | 		private Texture texture; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
| 
 | 
 | ||||||
|         public VertexSamplerGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public VertexSamplerGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionSampler.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("PositionSampler.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.VertexShaderInfo.SamplerBindingCount = 1; | 			pipelineCreateInfo.VertexShaderInfo.SamplerBindingCount = 1; | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 3); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 3); | ||||||
|             texture = Texture.CreateTexture2D(GraphicsDevice, 3, 1, TextureFormat.R8G8B8A8, TextureUsageFlags.Sampler); | 			texture = Texture.CreateTexture2D(GraphicsDevice, 3, 1, TextureFormat.R8G8B8A8, TextureUsageFlags.Sampler); | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(0.334f, 0)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(0.334f, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(0, -1, 0), new Vector2(0.667f, 0)), | 					new PositionTextureVertex(new Vector3(0, -1, 0), new Vector2(0.667f, 0)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetTextureData(texture, new Color[] { Color.Yellow, Color.Indigo, Color.HotPink }); | 			cmdbuf.SetTextureData(texture, new Color[] { Color.Yellow, Color.Indigo, Color.HotPink }); | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) { } | 		protected override void Update(System.TimeSpan delta) { } | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindVertexSamplers(new TextureSamplerBinding(texture, sampler)); | 				cmdbuf.BindVertexSamplers(new TextureSamplerBinding(texture, sampler)); | ||||||
|                 cmdbuf.DrawPrimitives(0, 1, 0, 0); | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             VertexSamplerGame p = new VertexSamplerGame(); | 			VertexSamplerGame p = new VertexSamplerGame(); | ||||||
|             p.Run(); | 			p.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,96 +4,96 @@ using MoonWorks.Video; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class VideoPlayerGame : Game | 	class VideoPlayerGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
|         private Sampler sampler; | 		private Sampler sampler; | ||||||
|         private Buffer vertexBuffer; | 		private Buffer vertexBuffer; | ||||||
|         private Buffer indexBuffer; | 		private Buffer indexBuffer; | ||||||
| 
 | 
 | ||||||
|         private Video.VideoAV1 video; | 		private Video.VideoAV1 video; | ||||||
|         private VideoPlayer videoPlayer; | 		private VideoPlayer videoPlayer; | ||||||
| 
 | 
 | ||||||
|         public VideoPlayerGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public VideoPlayerGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             // Load the shaders | 			// Load the shaders | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); | ||||||
| 
 | 
 | ||||||
|             // Create the graphics pipeline | 			// Create the graphics pipeline | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | 			pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding<PositionTextureVertex>(); | ||||||
|             pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
| 
 | 
 | ||||||
|             // Create the sampler | 			// Create the sampler | ||||||
|             sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearClamp); | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearClamp); | ||||||
| 
 | 
 | ||||||
|             // Create and populate the GPU resources | 			// Create and populate the GPU resources | ||||||
|             vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|             indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
| 
 | 
 | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 vertexBuffer, | 				vertexBuffer, | ||||||
|                 new PositionTextureVertex[] | 				new PositionTextureVertex[] | ||||||
|                 { | 				{ | ||||||
|                     new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | 					new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | 					new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), | ||||||
|                     new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|                     new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             cmdbuf.SetBufferData( | 			cmdbuf.SetBufferData( | ||||||
|                 indexBuffer, | 				indexBuffer, | ||||||
|                 new ushort[] | 				new ushort[] | ||||||
|                 { | 				{ | ||||||
|                     0, 1, 2, | 					0, 1, 2, | ||||||
|                     0, 2, 3, | 					0, 2, 3, | ||||||
|                 } | 				} | ||||||
|             ); | 			); | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
| 
 | 
 | ||||||
|             // Load the video | 			// Load the video | ||||||
|             video = new VideoAV1(GraphicsDevice, TestUtils.GetVideoPath("hello.obu"), 25); | 			video = new VideoAV1(GraphicsDevice, TestUtils.GetVideoPath("hello.obu"), 25); | ||||||
| 
 | 
 | ||||||
|             // Play the video | 			// Play the video | ||||||
|             videoPlayer = new VideoPlayer(GraphicsDevice); | 			videoPlayer = new VideoPlayer(GraphicsDevice); | ||||||
|             videoPlayer.Load(video); | 			videoPlayer.Load(video); | ||||||
|             videoPlayer.Loop = true; | 			videoPlayer.Loop = true; | ||||||
|             videoPlayer.Play(); | 			videoPlayer.Play(); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             videoPlayer.Render(); | 			videoPlayer.Render(); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.BindVertexBuffers(vertexBuffer); | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|                 cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|                 cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(videoPlayer.RenderTexture, sampler)); | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(videoPlayer.RenderTexture, sampler)); | ||||||
|                 cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             VideoPlayerGame game = new VideoPlayerGame(); | 			VideoPlayerGame game = new VideoPlayerGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3,83 +3,83 @@ using MoonWorks.Graphics; | ||||||
| 
 | 
 | ||||||
| namespace MoonWorks.Test | namespace MoonWorks.Test | ||||||
| { | { | ||||||
|     class WindowResizingGame : Game | 	class WindowResizingGame : Game | ||||||
|     { | 	{ | ||||||
|         private GraphicsPipeline pipeline; | 		private GraphicsPipeline pipeline; | ||||||
| 
 | 
 | ||||||
|         private int currentResolutionIndex; | 		private int currentResolutionIndex; | ||||||
|         private record struct Res(uint Width, uint Height); | 		private record struct Res(uint Width, uint Height); | ||||||
|         private Res[] resolutions = new Res[] | 		private Res[] resolutions = new Res[] | ||||||
|         { | 		{ | ||||||
|             new Res(640, 480), | 			new Res(640, 480), | ||||||
|             new Res(1280, 720), | 			new Res(1280, 720), | ||||||
|             new Res(1024, 1024), | 			new Res(1024, 1024), | ||||||
|             new Res(1600, 900), | 			new Res(1600, 900), | ||||||
|             new Res(1920, 1080), | 			new Res(1920, 1080), | ||||||
|             new Res(3200, 1800), | 			new Res(3200, 1800), | ||||||
|             new Res(3840, 2160), | 			new Res(3840, 2160), | ||||||
|         }; | 		}; | ||||||
| 
 | 
 | ||||||
|         public WindowResizingGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | 		public WindowResizingGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|         { | 		{ | ||||||
|             ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("RawTriangle.vert")); | 			ShaderModule vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("RawTriangle.vert")); | ||||||
|             ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | 			ShaderModule fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); | ||||||
| 
 | 
 | ||||||
|             GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|                 MainWindow.SwapchainFormat, | 				MainWindow.SwapchainFormat, | ||||||
|                 vertShaderModule, | 				vertShaderModule, | ||||||
|                 fragShaderModule | 				fragShaderModule | ||||||
|             ); | 			); | ||||||
|             pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Update(System.TimeSpan delta) | 		protected override void Update(System.TimeSpan delta) | ||||||
|         { | 		{ | ||||||
|             int prevResolutionIndex = currentResolutionIndex; | 			int prevResolutionIndex = currentResolutionIndex; | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) | ||||||
|             { | 			{ | ||||||
|                 currentResolutionIndex -= 1; | 				currentResolutionIndex -= 1; | ||||||
|                 if (currentResolutionIndex < 0) | 				if (currentResolutionIndex < 0) | ||||||
|                 { | 				{ | ||||||
|                     currentResolutionIndex = resolutions.Length - 1; | 					currentResolutionIndex = resolutions.Length - 1; | ||||||
|                 } | 				} | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | 			if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) | ||||||
|             { | 			{ | ||||||
|                 currentResolutionIndex += 1; | 				currentResolutionIndex += 1; | ||||||
|                 if (currentResolutionIndex >= resolutions.Length) | 				if (currentResolutionIndex >= resolutions.Length) | ||||||
|                 { | 				{ | ||||||
|                     currentResolutionIndex = 0; | 					currentResolutionIndex = 0; | ||||||
|                 } | 				} | ||||||
|             } | 			} | ||||||
| 
 | 
 | ||||||
|             if (prevResolutionIndex != currentResolutionIndex) | 			if (prevResolutionIndex != currentResolutionIndex) | ||||||
|             { | 			{ | ||||||
|                 Logger.LogInfo("Setting resolution to: " + resolutions[currentResolutionIndex]); | 				Logger.LogInfo("Setting resolution to: " + resolutions[currentResolutionIndex]); | ||||||
|                 MainWindow.SetWindowSize(resolutions[currentResolutionIndex].Width, resolutions[currentResolutionIndex].Height); | 				MainWindow.SetWindowSize(resolutions[currentResolutionIndex].Width, resolutions[currentResolutionIndex].Height); | ||||||
|             } | 			} | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         protected override void Draw(double alpha) | 		protected override void Draw(double alpha) | ||||||
|         { | 		{ | ||||||
|             CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|             Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|             if (backbuffer != null) | 			if (backbuffer != null) | ||||||
|             { | 			{ | ||||||
|                 cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|                 cmdbuf.BindGraphicsPipeline(pipeline); | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|                 cmdbuf.DrawPrimitives(0, 1, 0, 0); | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|                 cmdbuf.EndRenderPass(); | 				cmdbuf.EndRenderPass(); | ||||||
|             } | 			} | ||||||
|             GraphicsDevice.Submit(cmdbuf); | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|         } | 		} | ||||||
| 
 | 
 | ||||||
|         public static void Main(string[] args) | 		public static void Main(string[] args) | ||||||
|         { | 		{ | ||||||
|             WindowResizingGame game = new WindowResizingGame(); | 			WindowResizingGame game = new WindowResizingGame(); | ||||||
|             game.Run(); | 			game.Run(); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue