Compare commits
	
		
			No commits in common. "74b6e00bc8664be4165aaafd0cba8ffc3f6b8142" and "2bd653176697a843d5ed2fd7266413a62274d63b" have entirely different histories. 
		
	
	
		
			74b6e00bc8
			...
			2bd6531766
		
	
		|  | @ -2,4 +2,3 @@ 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