WIP: Add graphics test suite #32
			
				
			
		
		
		
	|  | @ -1,3 +1,4 @@ | ||||||
| bin/ | bin/ | ||||||
| obj/ | obj/ | ||||||
| .vs/ | .vs/ | ||||||
|  | *.csproj.user | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
| 	</PropertyGroup> | 	</PropertyGroup> | ||||||
| 
 | 
 | ||||||
| 	<PropertyGroup> | 	<PropertyGroup> | ||||||
| 		<DefaultItemExcludes>$(DefaultItemExcludes);lib\**\*</DefaultItemExcludes> | 		<DefaultItemExcludes>$(DefaultItemExcludes);lib\**\*;tests\**\*</DefaultItemExcludes> | ||||||
| 	</PropertyGroup> | 	</PropertyGroup> | ||||||
| 
 | 
 | ||||||
| 	<ItemGroup> | 	<ItemGroup> | ||||||
|  |  | ||||||
|  | @ -5,6 +5,26 @@ VisualStudioVersion = 16.0.30717.126 | ||||||
| MinimumVisualStudioVersion = 15.0.26124.0 | MinimumVisualStudioVersion = 15.0.26124.0 | ||||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MoonWorks", "MoonWorks.csproj", "{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MoonWorks", "MoonWorks.csproj", "{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}" | ||||||
| EndProject | EndProject | ||||||
|  | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{734B6C25-40FE-4688-9B3C-7B3D3A343257}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MoonWorks.Test.Common", "tests\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj", "{47BC8A83-B1A5-454C-AED0-461B535D664B}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClearScreen", "tests\ClearScreen\ClearScreen.csproj", "{C37E4CF1-4899-48BC-BF58-2074420077BC}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicTriangle", "tests\BasicTriangle\BasicTriangle.csproj", "{F34E6D95-887D-49C0-AC74-560EBD0D23C5}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TriangleVertexBuffer", "tests\TriangleVertexBuffer\TriangleVertexBuffer.csproj", "{944D4FDC-1635-46B6-84FA-8161F8E43AC4}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TexturedQuad", "tests\TexturedQuad\TexturedQuad.csproj", "{845DA751-5072-43C8-B9E6-4E2A32D99161}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CullFace", "tests\CullFace\CullFace.csproj", "{96986050-5136-4680-B388-EDD1207F9212}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClearScreen_MultiWindow", "tests\ClearScreen_MultiWindow\ClearScreen_MultiWindow.csproj", "{F6283B5C-051B-427C-AE7E-9DB9E0313769}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TexturedAnimatedQuad", "tests\TexturedAnimatedQuad\TexturedAnimatedQuad.csproj", "{F022FB5F-FD61-4956-A7CE-7B428DB80A39}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MSAA", "tests\MSAA\MSAA.csproj", "{D97DED9B-4CC4-45F6-A9A9-E8C589036A85}" | ||||||
|  | EndProject | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
| 		Debug|x64 = Debug|x64 | 		Debug|x64 = Debug|x64 | ||||||
|  | @ -15,10 +35,50 @@ Global | ||||||
| 		{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x64.Build.0 = Debug|x64 | 		{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x64.Build.0 = Debug|x64 | ||||||
| 		{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.ActiveCfg = Release|x64 | 		{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.ActiveCfg = Release|x64 | ||||||
| 		{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.Build.0 = Release|x64 | 		{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.Build.0 = Release|x64 | ||||||
|  | 		{47BC8A83-B1A5-454C-AED0-461B535D664B}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{47BC8A83-B1A5-454C-AED0-461B535D664B}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{47BC8A83-B1A5-454C-AED0-461B535D664B}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{C37E4CF1-4899-48BC-BF58-2074420077BC}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{C37E4CF1-4899-48BC-BF58-2074420077BC}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{C37E4CF1-4899-48BC-BF58-2074420077BC}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{F34E6D95-887D-49C0-AC74-560EBD0D23C5}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{F34E6D95-887D-49C0-AC74-560EBD0D23C5}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{F34E6D95-887D-49C0-AC74-560EBD0D23C5}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{944D4FDC-1635-46B6-84FA-8161F8E43AC4}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{944D4FDC-1635-46B6-84FA-8161F8E43AC4}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{944D4FDC-1635-46B6-84FA-8161F8E43AC4}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{845DA751-5072-43C8-B9E6-4E2A32D99161}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{845DA751-5072-43C8-B9E6-4E2A32D99161}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{845DA751-5072-43C8-B9E6-4E2A32D99161}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{96986050-5136-4680-B388-EDD1207F9212}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{96986050-5136-4680-B388-EDD1207F9212}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{96986050-5136-4680-B388-EDD1207F9212}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{F6283B5C-051B-427C-AE7E-9DB9E0313769}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{F6283B5C-051B-427C-AE7E-9DB9E0313769}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{F6283B5C-051B-427C-AE7E-9DB9E0313769}.Release|x64.ActiveCfg = Release|x64 | ||||||
|  | 		{F022FB5F-FD61-4956-A7CE-7B428DB80A39}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{F022FB5F-FD61-4956-A7CE-7B428DB80A39}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{F022FB5F-FD61-4956-A7CE-7B428DB80A39}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{F022FB5F-FD61-4956-A7CE-7B428DB80A39}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{D97DED9B-4CC4-45F6-A9A9-E8C589036A85}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
|  | 		{D97DED9B-4CC4-45F6-A9A9-E8C589036A85}.Debug|x64.Build.0 = Debug|x64 | ||||||
|  | 		{D97DED9B-4CC4-45F6-A9A9-E8C589036A85}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{D97DED9B-4CC4-45F6-A9A9-E8C589036A85}.Release|x64.Build.0 = Release|Any CPU | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(SolutionProperties) = preSolution | 	GlobalSection(SolutionProperties) = preSolution | ||||||
| 		HideSolutionNode = FALSE | 		HideSolutionNode = FALSE | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
|  | 	GlobalSection(NestedProjects) = preSolution | ||||||
|  | 		{47BC8A83-B1A5-454C-AED0-461B535D664B} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{C37E4CF1-4899-48BC-BF58-2074420077BC} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{F34E6D95-887D-49C0-AC74-560EBD0D23C5} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{944D4FDC-1635-46B6-84FA-8161F8E43AC4} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{845DA751-5072-43C8-B9E6-4E2A32D99161} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{96986050-5136-4680-B388-EDD1207F9212} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{F6283B5C-051B-427C-AE7E-9DB9E0313769} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{F022FB5F-FD61-4956-A7CE-7B428DB80A39} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 		{D97DED9B-4CC4-45F6-A9A9-E8C589036A85} = {734B6C25-40FE-4688-9B3C-7B3D3A343257} | ||||||
|  | 	EndGlobalSection | ||||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||||
| 		SolutionGuid = {C3D68FAA-3165-43C7-95B3-D845F0DAA918} | 		SolutionGuid = {C3D68FAA-3165-43C7-95B3-D845F0DAA918} | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
|  |  | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Content Include="..\MoonWorks.Test.Common\Content\**\*.*"> | ||||||
|  |       <Link>Content\%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  |       <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||||
|  |     </Content> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,85 @@ | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	class BasicTriangleGame : Game | ||||||
|  | 	{ | ||||||
|  | 		private GraphicsPipeline fillPipeline; | ||||||
|  | 		private GraphicsPipeline linePipeline; | ||||||
|  | 		private ShaderModule vertShaderModule; | ||||||
|  | 		private ShaderModule fragShaderModule; | ||||||
|  | 
 | ||||||
|  | 		private Viewport smallViewport = new Viewport(160, 120, 320, 240); | ||||||
|  | 		private Rect scissorRect = new Rect(320, 240, 320, 240); | ||||||
|  | 
 | ||||||
|  | 		private bool useWireframeMode; | ||||||
|  | 		private bool useSmallViewport; | ||||||
|  | 		private bool useScissorRect; | ||||||
|  | 
 | ||||||
|  | 		public BasicTriangleGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|  | 		{ | ||||||
|  | 			Logger.LogInfo("Press A to toggle wireframe mode\nPress S to toggle small viewport\nPress D to toggle scissor rect"); | ||||||
|  | 
 | ||||||
|  | 			vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("RawTriangleVertices.spv")); | ||||||
|  | 			fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.spv")); | ||||||
|  | 
 | ||||||
|  | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo(vertShaderModule, fragShaderModule); | ||||||
|  | 			fillPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo.RasterizerState.FillMode = FillMode.Line; | ||||||
|  | 			linePipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Update(System.TimeSpan delta) | ||||||
|  | 		{ | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.A)) | ||||||
|  | 			{ | ||||||
|  | 				useWireframeMode = !useWireframeMode; | ||||||
|  | 				Logger.LogInfo("Using wireframe mode: " + useWireframeMode); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.S)) | ||||||
|  | 			{ | ||||||
|  | 				useSmallViewport = !useSmallViewport; | ||||||
|  | 				Logger.LogInfo("Using small viewport: " + useSmallViewport); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.D)) | ||||||
|  | 			{ | ||||||
|  | 				useScissorRect = !useScissorRect; | ||||||
|  | 				Logger.LogInfo("Using scissor rect: " + useScissorRect); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(useWireframeMode ? linePipeline : fillPipeline); | ||||||
|  | 
 | ||||||
|  | 				if (useSmallViewport) | ||||||
|  | 				{ | ||||||
|  | 					cmdbuf.SetViewport(smallViewport); | ||||||
|  | 				} | ||||||
|  | 				if (useScissorRect) | ||||||
|  | 				{ | ||||||
|  | 					cmdbuf.SetScissor(scissorRect); | ||||||
|  | 				} | ||||||
|  | 				 | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			BasicTriangleGame game = new BasicTriangleGame(); | ||||||
|  | 			game.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,29 @@ | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	class ClearScreenGame : Game | ||||||
|  | 	{ | ||||||
|  | 		public ClearScreenGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) { } | ||||||
|  | 		protected override void Update(System.TimeSpan delta) { } | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			ClearScreenGame game = new ClearScreenGame(); | ||||||
|  | 			game.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,51 @@ | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	class ClearScreen_MultiWindowGame : Game | ||||||
|  | 	{ | ||||||
|  | 		private Window secondaryWindow; | ||||||
|  | 
 | ||||||
|  | 		public ClearScreen_MultiWindowGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|  | 		{ | ||||||
|  | 			secondaryWindow = new Window( | ||||||
|  | 				new WindowCreateInfo("Secondary Window", 640, 480, ScreenMode.Windowed, PresentMode.FIFO, false, false), | ||||||
|  | 				GraphicsDevice.WindowFlags | ||||||
|  | 			); | ||||||
|  | 			GraphicsDevice.ClaimWindow(secondaryWindow, PresentMode.FIFO); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Update(System.TimeSpan delta) { } | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			CommandBuffer cmdbuf; | ||||||
|  | 			Texture? backbuffer; | ||||||
|  | 
 | ||||||
|  | 			cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.CornflowerBlue)); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 
 | ||||||
|  | 			cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			backbuffer = cmdbuf.AcquireSwapchainTexture(secondaryWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Aquamarine)); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			ClearScreen_MultiWindowGame game = new ClearScreen_MultiWindowGame(); | ||||||
|  | 			game.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Content Include="..\MoonWorks.Test.Common\Content\**\*.*"> | ||||||
|  |       <Link>Content\%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  |       <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||||
|  |     </Content> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,144 @@ | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | using MoonWorks.Math.Float; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	internal class CullFaceGame : Game | ||||||
|  | 	{ | ||||||
|  | 		private GraphicsPipeline CW_CullNonePipeline; | ||||||
|  | 		private GraphicsPipeline CW_CullFrontPipeline; | ||||||
|  | 		private GraphicsPipeline CW_CullBackPipeline; | ||||||
|  | 		private GraphicsPipeline CCW_CullNonePipeline; | ||||||
|  | 		private GraphicsPipeline CCW_CullFrontPipeline; | ||||||
|  | 		private GraphicsPipeline CCW_CullBackPipeline; | ||||||
|  | 		private ShaderModule vertShaderModule; | ||||||
|  | 		private ShaderModule fragShaderModule; | ||||||
|  | 		private Buffer cwVertexBuffer; | ||||||
|  | 		private Buffer ccwVertexBuffer; | ||||||
|  | 
 | ||||||
|  | 		private bool useClockwiseWinding; | ||||||
|  | 
 | ||||||
|  | 		public CullFaceGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|  | 		{ | ||||||
|  | 			Logger.LogInfo("Press A to toggle the winding order of the triangles (default is counter-clockwise)"); | ||||||
|  | 
 | ||||||
|  | 			// Load the shaders | ||||||
|  | 			vertShaderModule = new ShaderModule(GraphicsDevice, "Content/Shaders/Compiled/PositionColorVert.spv"); | ||||||
|  | 			fragShaderModule = new ShaderModule(GraphicsDevice, "Content/Shaders/Compiled/SolidColor.spv"); | ||||||
|  | 
 | ||||||
|  | 			// Create the graphics pipelines | ||||||
|  | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo(vertShaderModule, fragShaderModule); | ||||||
|  | 			pipelineCreateInfo.VertexInputState = new VertexInputState( | ||||||
|  | 				VertexBinding.Create<PositionColorVertex>(), | ||||||
|  | 				VertexAttribute.Create<PositionColorVertex>("Position", 0), | ||||||
|  | 				VertexAttribute.Create<PositionColorVertex>("Color", 1) | ||||||
|  | 			); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo.RasterizerState = RasterizerState.CW_CullNone; | ||||||
|  | 			CW_CullNonePipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo.RasterizerState = RasterizerState.CW_CullFront; | ||||||
|  | 			CW_CullFrontPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo.RasterizerState = RasterizerState.CW_CullBack; | ||||||
|  | 			CW_CullBackPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo.RasterizerState = RasterizerState.CCW_CullNone; | ||||||
|  | 			CCW_CullNonePipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo.RasterizerState = RasterizerState.CCW_CullFront; | ||||||
|  | 			CCW_CullFrontPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo.RasterizerState = RasterizerState.CCW_CullBack; | ||||||
|  | 			CCW_CullBackPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			// Create and populate the vertex buffers | ||||||
|  | 			cwVertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 3); | ||||||
|  | 			ccwVertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 3); | ||||||
|  | 
 | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			cmdbuf.SetBufferData( | ||||||
|  | 				cwVertexBuffer, | ||||||
|  | 				new PositionColorVertex[] | ||||||
|  | 				{ | ||||||
|  | 					new PositionColorVertex(new Vector3(0, -1, 0), Color.Blue), | ||||||
|  | 					new PositionColorVertex(new Vector3(1, 1, 0), Color.Green), | ||||||
|  | 					new PositionColorVertex(new Vector3(-1, 1, 0), Color.Red), | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			cmdbuf.SetBufferData( | ||||||
|  | 				ccwVertexBuffer, | ||||||
|  | 				new PositionColorVertex[] | ||||||
|  | 				{ | ||||||
|  | 					new PositionColorVertex(new Vector3(-1, 1, 0), Color.Red), | ||||||
|  | 					new PositionColorVertex(new Vector3(1, 1, 0), Color.Green), | ||||||
|  | 					new PositionColorVertex(new Vector3(0, -1, 0), Color.Blue), | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 			GraphicsDevice.Wait(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Update(System.TimeSpan delta) | ||||||
|  | 		{ | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.A)) | ||||||
|  | 			{ | ||||||
|  | 				useClockwiseWinding = !useClockwiseWinding; | ||||||
|  | 				Logger.LogInfo("Using clockwise winding: " + useClockwiseWinding); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|  | 
 | ||||||
|  | 				if (useClockwiseWinding) | ||||||
|  | 				{ | ||||||
|  | 					cmdbuf.BindVertexBuffers(cwVertexBuffer); | ||||||
|  | 				} | ||||||
|  | 				else | ||||||
|  | 				{ | ||||||
|  | 					cmdbuf.BindVertexBuffers(ccwVertexBuffer); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.SetViewport(new Viewport(0, 0, 213, 240)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(CW_CullNonePipeline); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.SetViewport(new Viewport(213, 0, 213, 240)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(CW_CullFrontPipeline); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.SetViewport(new Viewport(426, 0, 213, 240)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(CW_CullBackPipeline); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.SetViewport(new Viewport(0, 240, 213, 240)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(CCW_CullNonePipeline); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.SetViewport(new Viewport(213, 240, 213, 240)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(CCW_CullFrontPipeline); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.SetViewport(new Viewport(426, 240, 213, 240)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(CCW_CullBackPipeline); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			CullFaceGame game = new CullFaceGame(); | ||||||
|  | 			game.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Content Include="..\MoonWorks.Test.Common\Content\**\*.*"> | ||||||
|  |       <Link>Content\%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  |       <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||||
|  |     </Content> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,159 @@ | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Math.Float; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	class MSAAGame : Game | ||||||
|  | 	{ | ||||||
|  | 		private GraphicsPipeline[] msaaPipelines = new GraphicsPipeline[4]; | ||||||
|  | 
 | ||||||
|  | 		private ShaderModule triangleVertShaderModule; | ||||||
|  | 		private ShaderModule triangleFragShaderModule; | ||||||
|  | 
 | ||||||
|  | 		private GraphicsPipeline blitPipeline; | ||||||
|  | 		private ShaderModule blitVertShaderModule; | ||||||
|  | 		private ShaderModule blitFragShaderModule; | ||||||
|  | 
 | ||||||
|  | 		private Texture rt; | ||||||
|  | 		private Sampler rtSampler; | ||||||
|  | 		private Buffer quadVertexBuffer; | ||||||
|  | 		private Buffer quadIndexBuffer; | ||||||
|  | 
 | ||||||
|  | 		private SampleCount currentSampleCount = SampleCount.Four; | ||||||
|  | 
 | ||||||
|  | 		public MSAAGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|  | 		{ | ||||||
|  | 			Logger.LogInfo("Press A and D to cycle between sample counts"); | ||||||
|  | 			Logger.LogInfo("Setting sample count to: " + currentSampleCount); | ||||||
|  | 
 | ||||||
|  | 			// Create the MSAA pipelines | ||||||
|  | 			triangleVertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("RawTriangleVertices.spv")); | ||||||
|  | 			triangleFragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.spv")); | ||||||
|  | 
 | ||||||
|  | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|  | 				triangleVertShaderModule, | ||||||
|  | 				triangleFragShaderModule | ||||||
|  | 			); | ||||||
|  | 			for (int i = 0; i < msaaPipelines.Length; i += 1) | ||||||
|  | 			{ | ||||||
|  | 				pipelineCreateInfo.MultisampleState.MultisampleCount = (SampleCount) i; | ||||||
|  | 				msaaPipelines[i] = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// Create the blit pipeline | ||||||
|  | 			blitVertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadVert.spv")); | ||||||
|  | 			blitFragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadFrag.spv")); | ||||||
|  | 
 | ||||||
|  | 			pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( | ||||||
|  | 				blitVertShaderModule, | ||||||
|  | 				blitFragShaderModule | ||||||
|  | 			); | ||||||
|  | 			pipelineCreateInfo.VertexInputState = new VertexInputState( | ||||||
|  | 				VertexBinding.Create<PositionTextureVertex>(), | ||||||
|  | 				VertexAttribute.Create<PositionTextureVertex>("Position", 0), | ||||||
|  | 				VertexAttribute.Create<PositionTextureVertex>("TexCoord", 1) | ||||||
|  | 			); | ||||||
|  | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|  | 			blitPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			// Create the MSAA render texture and sampler | ||||||
|  | 			rt = Texture.CreateTexture2D( | ||||||
|  | 				GraphicsDevice, | ||||||
|  | 				MainWindow.Width, | ||||||
|  | 				MainWindow.Height, | ||||||
|  | 				TextureFormat.R8G8B8A8, | ||||||
|  | 				TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler | ||||||
|  | 			); | ||||||
|  | 			rtSampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
|  | 
 | ||||||
|  | 			// Create and populate the vertex and index buffers | ||||||
|  | 			quadVertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|  | 			quadIndexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
|  | 
 | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			cmdbuf.SetBufferData( | ||||||
|  | 				quadVertexBuffer, | ||||||
|  | 				new PositionTextureVertex[] | ||||||
|  | 				{ | ||||||
|  | 					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, 1)), | ||||||
|  | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			cmdbuf.SetBufferData( | ||||||
|  | 				quadIndexBuffer, | ||||||
|  | 				new ushort[] | ||||||
|  | 				{ | ||||||
|  | 					0, 1, 2, | ||||||
|  | 					0, 2, 3, | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 			GraphicsDevice.Wait(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Update(System.TimeSpan delta) | ||||||
|  | 		{ | ||||||
|  | 			SampleCount prevSampleCount = currentSampleCount; | ||||||
|  | 
 | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.A)) | ||||||
|  | 			{ | ||||||
|  | 				currentSampleCount -= 1; | ||||||
|  | 				if (currentSampleCount < 0) | ||||||
|  | 				{ | ||||||
|  | 					currentSampleCount = SampleCount.Eight; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.D)) | ||||||
|  | 			{ | ||||||
|  | 				currentSampleCount += 1; | ||||||
|  | 				if (currentSampleCount > SampleCount.Eight) | ||||||
|  | 				{ | ||||||
|  | 					currentSampleCount = SampleCount.One; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (prevSampleCount != currentSampleCount) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogInfo("Setting sample count to: " + currentSampleCount); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass( | ||||||
|  | 					new ColorAttachmentInfo( | ||||||
|  | 						rt, | ||||||
|  | 						Color.Black, | ||||||
|  | 						currentSampleCount, | ||||||
|  | 						StoreOp.DontCare | ||||||
|  | 					) | ||||||
|  | 				); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(msaaPipelines[(int) currentSampleCount]); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 
 | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, LoadOp.DontCare)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(blitPipeline); | ||||||
|  | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(rt, rtSampler)); | ||||||
|  | 				cmdbuf.BindVertexBuffers(quadVertexBuffer); | ||||||
|  | 				cmdbuf.BindIndexBuffer(quadIndexBuffer, IndexElementSize.Sixteen); | ||||||
|  | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			MSAAGame game = new MSAAGame(); | ||||||
|  | 			game.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | #version 450 | ||||||
|  | 
 | ||||||
|  | layout (location = 0) in vec3 Position; | ||||||
|  | layout (location = 1) in vec4 Color; | ||||||
|  | 
 | ||||||
|  | layout (location = 0) out vec4 outColor; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	outColor = Color; | ||||||
|  | 	gl_Position = vec4(Position, 1); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,26 @@ | ||||||
|  | #version 450 | ||||||
|  | 
 | ||||||
|  | layout (location = 0) out vec4 outColor; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	vec2 pos; | ||||||
|  | 
 | ||||||
|  | 	if (gl_VertexIndex == 0) | ||||||
|  | 	{ | ||||||
|  | 		pos = vec2(-1, 1); | ||||||
|  | 		outColor = vec4(1, 0, 0, 1); | ||||||
|  | 	} | ||||||
|  | 	else if (gl_VertexIndex == 1) | ||||||
|  | 	{ | ||||||
|  | 		pos = vec2(1, 1); | ||||||
|  | 		outColor = vec4(0, 1, 0, 1); | ||||||
|  | 	} | ||||||
|  | 	else if (gl_VertexIndex == 2) | ||||||
|  | 	{ | ||||||
|  | 		pos = vec2(0, -1); | ||||||
|  | 		outColor = vec4(0, 0, 1, 1); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	gl_Position = vec4(pos, 0, 1); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | #version 450 | ||||||
|  | 
 | ||||||
|  | layout (location = 0) in vec4 Color; | ||||||
|  | 
 | ||||||
|  | layout (location = 0) out vec4 FragColor; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	FragColor = Color; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | #version 450 | ||||||
|  | 
 | ||||||
|  | layout (location = 0) in vec2 TexCoord; | ||||||
|  | 
 | ||||||
|  | layout (location = 0) out vec4 FragColor; | ||||||
|  | 
 | ||||||
|  | layout(binding = 0, set = 1) uniform sampler2D Sampler; | ||||||
|  | 
 | ||||||
|  | layout (binding = 0, set = 3) uniform UniformBlock | ||||||
|  | { | ||||||
|  | 	vec4 MultiplyColor; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	FragColor = MultiplyColor * texture(Sampler, TexCoord); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | #version 450 | ||||||
|  | 
 | ||||||
|  | layout (location = 0) in vec3 Position; | ||||||
|  | layout (location = 1) in vec2 TexCoord; | ||||||
|  | 
 | ||||||
|  | layout (location = 0) out vec2 outTexCoord; | ||||||
|  | 
 | ||||||
|  | layout (binding = 0, set = 2) uniform UniformBlock | ||||||
|  | { | ||||||
|  | 	mat4x4 MatrixTransform; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	outTexCoord = TexCoord; | ||||||
|  | 	gl_Position = MatrixTransform * vec4(Position, 1); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | #version 450 | ||||||
|  | 
 | ||||||
|  | layout (location = 0) in vec2 TexCoord; | ||||||
|  | 
 | ||||||
|  | layout (location = 0) out vec4 FragColor; | ||||||
|  | 
 | ||||||
|  | layout(binding = 0, set = 1) uniform sampler2D Sampler; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	FragColor = texture(Sampler, TexCoord); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | #version 450 | ||||||
|  | 
 | ||||||
|  | layout (location = 0) in vec3 Position; | ||||||
|  | layout (location = 1) in vec2 TexCoord; | ||||||
|  | 
 | ||||||
|  | layout (location = 0) out vec2 outTexCoord; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  | 	outTexCoord = TexCoord; | ||||||
|  | 	gl_Position = vec4(Position, 1); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | Get-ChildItem "Source" | | ||||||
|  | Foreach-Object { | ||||||
|  | 	$filename = $_.Basename | ||||||
|  | 	glslc $_.FullName -o Compiled/$filename.spv | ||||||
|  | } | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 201 B | 
|  | @ -0,0 +1,43 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  | 
 | ||||||
|  | 	<Target Name="Runtime ID"  AfterTargets="Build"> | ||||||
|  |     	<Message Text="Runtime ID: $(RuntimeIdentifier)" Importance="high"/> | ||||||
|  | 	</Target> | ||||||
|  | 
 | ||||||
|  | 	<ItemGroup Condition="$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))"> | ||||||
|  | 		<Content Include="..\..\..\moonlibs\windows\FAudio.dll"> | ||||||
|  | 			<Link>%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  | 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  | 		</Content> | ||||||
|  | 		<Content Include="..\..\..\moonlibs\windows\Refresh.dll"> | ||||||
|  | 			<Link>%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  | 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  | 		</Content> | ||||||
|  | 		<Content Include="..\..\..\moonlibs\windows\SDL2.dll"> | ||||||
|  | 			<Link>%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  | 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  | 		</Content> | ||||||
|  | 	</ItemGroup> | ||||||
|  | 	<ItemGroup Condition="$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))"> | ||||||
|  | 		<Content Include="..\..\..\moonlibs\lib64\libFAudio.*"> | ||||||
|  | 			<Link>%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  | 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  | 		</Content> | ||||||
|  | 		<Content Include="..\..\..\moonlibs\lib64\libRefresh.*"> | ||||||
|  | 			<Link>%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  | 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  | 		</Content> | ||||||
|  | 		<Content Include="..\..\..\moonlibs\lib64\libSDL2-2.0.*"> | ||||||
|  | 			<Link>%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  | 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  | 		</Content> | ||||||
|  | 	</ItemGroup> | ||||||
|  | 	<ItemGroup Condition="$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))"> | ||||||
|  | 		<Content Include="..\..\..\moonlibs\osx\**\*.*" > | ||||||
|  | 			<Link>%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  | 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  | 		</Content> | ||||||
|  | 	</ItemGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>library</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  |   <Import Project=".\CopyMoonlibs.targets" /> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,53 @@ | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	public static class TestUtils | ||||||
|  | 	{ | ||||||
|  | 		public static WindowCreateInfo GetStandardWindowCreateInfo() | ||||||
|  | 		{ | ||||||
|  | 			return new WindowCreateInfo( | ||||||
|  | 				"Main Window", | ||||||
|  | 				640, | ||||||
|  | 				480, | ||||||
|  | 				ScreenMode.Windowed, | ||||||
|  | 				PresentMode.FIFO | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static FrameLimiterSettings GetStandardFrameLimiterSettings() | ||||||
|  | 		{ | ||||||
|  | 			return new FrameLimiterSettings( | ||||||
|  | 				FrameLimiterMode.Capped, | ||||||
|  | 				60 | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static GraphicsPipelineCreateInfo GetStandardGraphicsPipelineCreateInfo( | ||||||
|  | 			ShaderModule vertShaderModule, | ||||||
|  | 			ShaderModule fragShaderModule | ||||||
|  | 		) { | ||||||
|  | 			return new GraphicsPipelineCreateInfo | ||||||
|  | 			{ | ||||||
|  | 				AttachmentInfo = new GraphicsPipelineAttachmentInfo( | ||||||
|  | 					new ColorAttachmentDescription( | ||||||
|  | 						TextureFormat.R8G8B8A8, | ||||||
|  | 						ColorAttachmentBlendState.Opaque | ||||||
|  | 					) | ||||||
|  | 				), | ||||||
|  | 				DepthStencilState = DepthStencilState.Disable, | ||||||
|  | 				MultisampleState = MultisampleState.None, | ||||||
|  | 				PrimitiveType = PrimitiveType.TriangleList, | ||||||
|  | 				RasterizerState = RasterizerState.CW_CullNone, | ||||||
|  | 				VertexInputState = VertexInputState.Empty, | ||||||
|  | 				VertexShaderInfo = GraphicsShaderInfo.Create(vertShaderModule, "main", 0), | ||||||
|  | 				FragmentShaderInfo = GraphicsShaderInfo.Create(fragShaderModule, "main", 0) | ||||||
|  | 			}; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static string GetShaderPath(string shaderName) | ||||||
|  | 		{ | ||||||
|  | 			return SDL2.SDL.SDL_GetBasePath() + "Content/Shaders/Compiled/" + shaderName; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | using System.Runtime.InteropServices; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | using MoonWorks.Math.Float; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	[StructLayout(LayoutKind.Sequential)] | ||||||
|  | 	public struct PositionColorVertex | ||||||
|  | 	{ | ||||||
|  | 		public Vector3 Position; | ||||||
|  | 		public Color Color; | ||||||
|  | 
 | ||||||
|  | 		public PositionColorVertex(Vector3 position, Color color) | ||||||
|  | 		{ | ||||||
|  | 			Position = position; | ||||||
|  | 			Color = color; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	[StructLayout(LayoutKind.Sequential)] | ||||||
|  | 	public struct PositionTextureVertex | ||||||
|  | 	{ | ||||||
|  | 		public Vector3 Position; | ||||||
|  | 		public Vector2 TexCoord; | ||||||
|  | 
 | ||||||
|  | 		public PositionTextureVertex(Vector3 position, Vector2 texCoord) | ||||||
|  | 		{ | ||||||
|  | 			Position = position; | ||||||
|  | 			TexCoord = texCoord; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Content Include="..\MoonWorks.Test.Common\Content\**\*.*"> | ||||||
|  |   	  <Link>Content\%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  |   	  <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||||
|  |     </Content> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,121 @@ | ||||||
|  | using System.Runtime.InteropServices; | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | using MoonWorks.Math.Float; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	class TexturedAnimatedQuadGame : Game | ||||||
|  | 	{ | ||||||
|  | 		private GraphicsPipeline pipeline; | ||||||
|  | 		private ShaderModule vertShaderModule; | ||||||
|  | 		private ShaderModule fragShaderModule; | ||||||
|  | 		private Buffer vertexBuffer; | ||||||
|  | 		private Buffer indexBuffer; | ||||||
|  | 		private Texture texture; | ||||||
|  | 		private Sampler sampler; | ||||||
|  | 
 | ||||||
|  | 		private float t; | ||||||
|  | 
 | ||||||
|  | 		[StructLayout(LayoutKind.Sequential)] | ||||||
|  | 		private struct VertexUniforms | ||||||
|  | 		{ | ||||||
|  | 			public Matrix4x4 TransformMatrix; | ||||||
|  | 
 | ||||||
|  | 			public VertexUniforms(Matrix4x4 transformMatrix) | ||||||
|  | 			{ | ||||||
|  | 				TransformMatrix = transformMatrix; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		[StructLayout(LayoutKind.Sequential)] | ||||||
|  | 		private struct FragmentUniforms | ||||||
|  | 		{ | ||||||
|  | 			public Vector4 MultiplyColor; | ||||||
|  | 
 | ||||||
|  | 			public FragmentUniforms(Vector4 multiplyColor) | ||||||
|  | 			{ | ||||||
|  | 				MultiplyColor = multiplyColor; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public TexturedAnimatedQuadGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|  | 		{ | ||||||
|  | 			// Load the shaders | ||||||
|  | 			vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadAnimatedVert.spv")); | ||||||
|  | 			fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadAnimatedFrag.spv")); | ||||||
|  | 
 | ||||||
|  | 			// Create the graphics pipeline | ||||||
|  | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo(vertShaderModule, fragShaderModule); | ||||||
|  | 			pipelineCreateInfo.VertexInputState = new VertexInputState( | ||||||
|  | 				VertexBinding.Create<PositionTextureVertex>(), | ||||||
|  | 				VertexAttribute.Create<PositionTextureVertex>("Position", 0), | ||||||
|  | 				VertexAttribute.Create<PositionTextureVertex>("TexCoord", 1) | ||||||
|  | 			); | ||||||
|  | 			pipelineCreateInfo.VertexShaderInfo = GraphicsShaderInfo.Create<VertexUniforms>(vertShaderModule, "main", 0); | ||||||
|  | 			pipelineCreateInfo.FragmentShaderInfo = GraphicsShaderInfo.Create<FragmentUniforms>(fragShaderModule, "main", 1); | ||||||
|  | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			// Create and populate the GPU resources | ||||||
|  | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|  | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
|  | 			sampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
|  | 
 | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			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(1, 0)), | ||||||
|  | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), | ||||||
|  | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			cmdbuf.SetBufferData( | ||||||
|  | 				indexBuffer, | ||||||
|  | 				new ushort[] | ||||||
|  | 				{ | ||||||
|  | 					0, 1, 2, | ||||||
|  | 					0, 2, 3, | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			texture = Texture.LoadPNG(GraphicsDevice, cmdbuf, "Content/Textures/ravioli.png"); | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 			GraphicsDevice.Wait(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Update(System.TimeSpan delta) | ||||||
|  | 		{ | ||||||
|  | 			t += (float) delta.TotalSeconds; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			VertexUniforms vertUniforms = new VertexUniforms(Matrix4x4.CreateRotationZ(t)); | ||||||
|  | 			FragmentUniforms fragUniforms = new FragmentUniforms(new Vector4(1f, 0.5f + System.MathF.Sin(t) * 0.5f, 1f, 1f)); | ||||||
|  | 
 | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|  | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|  | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|  | 				cmdbuf.PushVertexShaderUniforms(vertUniforms); | ||||||
|  | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, sampler)); | ||||||
|  | 				cmdbuf.PushFragmentShaderUniforms(fragUniforms); | ||||||
|  | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			TexturedAnimatedQuadGame game = new TexturedAnimatedQuadGame(); | ||||||
|  | 			game.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Content Include="..\MoonWorks.Test.Common\Content\**\*.*"> | ||||||
|  |       <Link>Content\%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  |       <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||||
|  |     </Content> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,134 @@ | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | using MoonWorks.Math.Float; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	class TexturedQuadGame : Game | ||||||
|  | 	{ | ||||||
|  | 		private GraphicsPipeline pipeline; | ||||||
|  | 		private ShaderModule vertShaderModule; | ||||||
|  | 		private ShaderModule fragShaderModule; | ||||||
|  | 		private Buffer vertexBuffer; | ||||||
|  | 		private Buffer indexBuffer; | ||||||
|  | 		private Texture texture; | ||||||
|  | 		private Sampler[] samplers = new Sampler[6]; | ||||||
|  | 		private string[] samplerNames = new string[] | ||||||
|  | 		{ | ||||||
|  | 			"PointClamp", | ||||||
|  | 			"PointWrap", | ||||||
|  | 			"LinearClamp", | ||||||
|  | 			"LinearWrap", | ||||||
|  | 			"AnisotropicClamp", | ||||||
|  | 			"AnisotropicWrap" | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		private int currentSamplerIndex; | ||||||
|  | 
 | ||||||
|  | 		public TexturedQuadGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|  | 		{ | ||||||
|  | 			Logger.LogInfo("Press A and D to cycle between sampler states"); | ||||||
|  | 			Logger.LogInfo("Setting sampler state to: " + samplerNames[0]); | ||||||
|  | 
 | ||||||
|  | 			// Load the shaders | ||||||
|  | 			vertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadVert.spv")); | ||||||
|  | 			fragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuadFrag.spv")); | ||||||
|  | 
 | ||||||
|  | 			// Create the graphics pipeline | ||||||
|  | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo(vertShaderModule, fragShaderModule); | ||||||
|  | 			pipelineCreateInfo.VertexInputState = new VertexInputState( | ||||||
|  | 				VertexBinding.Create<PositionTextureVertex>(), | ||||||
|  | 				VertexAttribute.Create<PositionTextureVertex>("Position", 0), | ||||||
|  | 				VertexAttribute.Create<PositionTextureVertex>("TexCoord", 1) | ||||||
|  | 			); | ||||||
|  | 			pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; | ||||||
|  | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			// Create samplers | ||||||
|  | 			samplers[0] = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); | ||||||
|  | 			samplers[1] = new Sampler(GraphicsDevice, SamplerCreateInfo.PointWrap); | ||||||
|  | 			samplers[2] = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearClamp); | ||||||
|  | 			samplers[3] = new Sampler(GraphicsDevice, SamplerCreateInfo.LinearWrap); | ||||||
|  | 			samplers[4] = new Sampler(GraphicsDevice, SamplerCreateInfo.AnisotropicClamp); | ||||||
|  | 			samplers[5] = new Sampler(GraphicsDevice, SamplerCreateInfo.AnisotropicWrap); | ||||||
|  | 
 | ||||||
|  | 			// Create and populate the GPU resources | ||||||
|  | 			vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 4); | ||||||
|  | 			indexBuffer = Buffer.Create<ushort>(GraphicsDevice, BufferUsageFlags.Index, 6); | ||||||
|  | 
 | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			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(4, 0)), | ||||||
|  | 					new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(4, 4)), | ||||||
|  | 					new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 4)), | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			cmdbuf.SetBufferData( | ||||||
|  | 				indexBuffer, | ||||||
|  | 				new ushort[] | ||||||
|  | 				{ | ||||||
|  | 					0, 1, 2, | ||||||
|  | 					0, 2, 3, | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			texture = Texture.LoadPNG(GraphicsDevice, cmdbuf, "Content/Textures/ravioli.png"); | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 			GraphicsDevice.Wait(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Update(System.TimeSpan delta) | ||||||
|  | 		{ | ||||||
|  | 			int prevSamplerIndex = currentSamplerIndex; | ||||||
|  | 
 | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.A)) | ||||||
|  | 			{ | ||||||
|  | 				currentSamplerIndex -= 1; | ||||||
|  | 				if (currentSamplerIndex < 0) | ||||||
|  | 				{ | ||||||
|  | 					currentSamplerIndex = samplers.Length - 1; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (Inputs.Keyboard.IsPressed(Input.KeyCode.D)) | ||||||
|  | 			{ | ||||||
|  | 				currentSamplerIndex += 1; | ||||||
|  | 				if (currentSamplerIndex >= samplers.Length) | ||||||
|  | 				{ | ||||||
|  | 					currentSamplerIndex = 0; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (prevSamplerIndex != currentSamplerIndex) | ||||||
|  | 			{ | ||||||
|  | 				Logger.LogInfo("Setting sampler state to: " + samplerNames[currentSamplerIndex]); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|  | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|  | 				cmdbuf.BindIndexBuffer(indexBuffer, IndexElementSize.Sixteen); | ||||||
|  | 				cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(texture, samplers[currentSamplerIndex])); | ||||||
|  | 				cmdbuf.DrawIndexedPrimitives(0, 0, 2, 0, 0); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			TexturedQuadGame game = new TexturedQuadGame(); | ||||||
|  | 			game.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\..\MoonWorks.csproj" /> | ||||||
|  |     <ProjectReference Include="..\MoonWorks.Test.Common\MoonWorks.Test.Common.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <Platforms>x64</Platforms> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Content Include="..\MoonWorks.Test.Common\Content\**\*.*"> | ||||||
|  |       <Link>Content\%(RecursiveDir)%(Filename)%(Extension)</Link> | ||||||
|  |       <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||||
|  |     </Content> | ||||||
|  |   </ItemGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
|  | @ -0,0 +1,69 @@ | ||||||
|  | using MoonWorks; | ||||||
|  | using MoonWorks.Graphics; | ||||||
|  | using MoonWorks.Math.Float; | ||||||
|  | 
 | ||||||
|  | namespace MoonWorks.Test | ||||||
|  | { | ||||||
|  | 	class TriangleVertexBufferGame : Game | ||||||
|  | 	{ | ||||||
|  | 		private GraphicsPipeline pipeline; | ||||||
|  | 		private ShaderModule vertShaderModule; | ||||||
|  | 		private ShaderModule fragShaderModule; | ||||||
|  | 		private Buffer vertexBuffer; | ||||||
|  | 
 | ||||||
|  | 		public TriangleVertexBufferGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) | ||||||
|  | 		{ | ||||||
|  | 			// Load the shaders | ||||||
|  | 			vertShaderModule = new ShaderModule(GraphicsDevice, "Content/Shaders/Compiled/PositionColorVert.spv"); | ||||||
|  | 			fragShaderModule = new ShaderModule(GraphicsDevice, "Content/Shaders/Compiled/SolidColor.spv"); | ||||||
|  | 
 | ||||||
|  | 			// Create the graphics pipeline | ||||||
|  | 			GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo(vertShaderModule, fragShaderModule); | ||||||
|  | 			pipelineCreateInfo.VertexInputState = new VertexInputState( | ||||||
|  | 				VertexBinding.Create<PositionColorVertex>(), | ||||||
|  | 				VertexAttribute.Create<PositionColorVertex>("Position", 0), | ||||||
|  | 				VertexAttribute.Create<PositionColorVertex>("Color", 1) | ||||||
|  | 			); | ||||||
|  | 			pipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); | ||||||
|  | 
 | ||||||
|  | 			// Create and populate the vertex buffer | ||||||
|  | 			vertexBuffer = Buffer.Create<PositionColorVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 3); | ||||||
|  | 
 | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			cmdbuf.SetBufferData( | ||||||
|  | 				vertexBuffer, | ||||||
|  | 				new PositionColorVertex[] | ||||||
|  | 				{ | ||||||
|  | 					new PositionColorVertex(new Vector3(-1, 1, 0), Color.Red), | ||||||
|  | 					new PositionColorVertex(new Vector3(1, 1, 0), Color.Lime), | ||||||
|  | 					new PositionColorVertex(new Vector3(0, -1, 0), Color.Blue), | ||||||
|  | 				} | ||||||
|  | 			); | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 			GraphicsDevice.Wait(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		protected override void Update(System.TimeSpan delta) { } | ||||||
|  | 
 | ||||||
|  | 		protected override void Draw(double alpha) | ||||||
|  | 		{ | ||||||
|  | 			CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); | ||||||
|  | 			Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); | ||||||
|  | 			if (backbuffer != null) | ||||||
|  | 			{ | ||||||
|  | 				cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, Color.Black)); | ||||||
|  | 				cmdbuf.BindGraphicsPipeline(pipeline); | ||||||
|  | 				cmdbuf.BindVertexBuffers(vertexBuffer); | ||||||
|  | 				cmdbuf.DrawPrimitives(0, 1, 0, 0); | ||||||
|  | 				cmdbuf.EndRenderPass(); | ||||||
|  | 			} | ||||||
|  | 			GraphicsDevice.Submit(cmdbuf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static void Main(string[] args) | ||||||
|  | 		{ | ||||||
|  | 			TriangleVertexBufferGame p = new TriangleVertexBufferGame(); | ||||||
|  | 			p.Run(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue