diff --git a/GetBufferData/GetBufferData.csproj b/GetBufferData/GetBufferData.csproj new file mode 100644 index 0000000..a8d5981 --- /dev/null +++ b/GetBufferData/GetBufferData.csproj @@ -0,0 +1,15 @@ + + + + + + + + + Exe + net6.0 + enable + x64 + + + diff --git a/GetBufferData/GetBufferDataGame.cs b/GetBufferData/GetBufferDataGame.cs new file mode 100644 index 0000000..298592a --- /dev/null +++ b/GetBufferData/GetBufferDataGame.cs @@ -0,0 +1,109 @@ +using MoonWorks; +using MoonWorks.Graphics; +using MoonWorks.Math.Float; +using System.Runtime.InteropServices; + +namespace MoonWorks.Test +{ + internal class GetBufferDataGame : Game + { + public GetBufferDataGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) + { + PositionColorVertex[] vertices = new PositionColorVertex[] + { + new PositionColorVertex(new Vector3(0, 0, 0), Color.Red), + new PositionColorVertex(new Vector3(0, 0, 1), Color.Green), + new PositionColorVertex(new Vector3(0, 1, 0), Color.Blue), + new PositionColorVertex(new Vector3(0, 1, 1), Color.Yellow), + new PositionColorVertex(new Vector3(1, 0, 0), Color.Orange), + new PositionColorVertex(new Vector3(1, 0, 1), Color.Brown), + new PositionColorVertex(new Vector3(1, 1, 0), Color.Black), + new PositionColorVertex(new Vector3(1, 1, 1), Color.White), + }; + + PositionColorVertex[] otherVerts = new PositionColorVertex[] + { + new PositionColorVertex(new Vector3(0.5f, 0.5f, 0.5f), Color.Fuchsia), + new PositionColorVertex(new Vector3(0.1f, 0.1f, 0.1f), Color.LightCoral), + new PositionColorVertex(new Vector3(0.2f, 0.2f, 0.2f), Color.Lime) + }; + + int vertexSize = Marshal.SizeOf(); + + Buffer vertexBuffer = Buffer.Create( + GraphicsDevice, + BufferUsageFlags.Vertex, + (uint) vertices.Length + ); + + CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); + cmdbuf.SetBufferData(vertexBuffer, vertices); + GraphicsDevice.Submit(cmdbuf); + + // Wait for the vertices to finish uploading... + GraphicsDevice.Wait(); + + // Read back and print out the vertex values + PositionColorVertex[] readbackVertices = new PositionColorVertex[vertices.Length]; + vertexBuffer.GetData( + readbackVertices, + (uint) (readbackVertices.Length * vertexSize) // FIXME: Seems like this should get auto-calculated somehow + ); + for (int i = 0; i < readbackVertices.Length; i += 1) + { + Logger.LogInfo(readbackVertices[i].ToString()); + } + + // Change the first three vertices + cmdbuf = GraphicsDevice.AcquireCommandBuffer(); + cmdbuf.SetBufferData(vertexBuffer, otherVerts); + GraphicsDevice.Submit(cmdbuf); + GraphicsDevice.Wait(); + + // Read the updated buffer + vertexBuffer.GetData( + readbackVertices, + (uint) (vertexSize * readbackVertices.Length) + ); + Logger.LogInfo("==="); + for (int i = 0; i < readbackVertices.Length; i += 1) + { + Logger.LogInfo(readbackVertices[i].ToString()); + } + + // Change the last two vertices + cmdbuf = GraphicsDevice.AcquireCommandBuffer(); + cmdbuf.SetBufferData( + vertexBuffer, + otherVerts, + (uint) (vertexSize * (vertices.Length - 2)), + 1, + 2 + ); + GraphicsDevice.Submit(cmdbuf); + GraphicsDevice.Wait(); + + // Read the updated buffer + vertexBuffer.GetData( + readbackVertices, + (uint) (readbackVertices.Length * vertexSize) + ); + Logger.LogInfo("==="); + for (int i = 0; i < readbackVertices.Length; i += 1) + { + Logger.LogInfo(readbackVertices[i].ToString()); + } + } + + + protected override void Update(System.TimeSpan delta) { } + + protected override void Draw(double alpha) { } + + public static void Main(string[] args) + { + GetBufferDataGame game = new GetBufferDataGame(); + game.Run(); + } + } +} diff --git a/MoonWorks.Test.Common/VertexTypes.cs b/MoonWorks.Test.Common/VertexTypes.cs index fe7c1c9..feebea4 100644 --- a/MoonWorks.Test.Common/VertexTypes.cs +++ b/MoonWorks.Test.Common/VertexTypes.cs @@ -15,6 +15,11 @@ namespace MoonWorks.Test Position = position; Color = color; } + + public override string ToString() + { + return Position + " | " + Color; + } } [StructLayout(LayoutKind.Sequential)] @@ -28,5 +33,10 @@ namespace MoonWorks.Test Position = position; TexCoord = texCoord; } - } + + public override string ToString() + { + return Position + " | " + TexCoord; + } + } } diff --git a/MoonWorksGraphicsTests.sln b/MoonWorksGraphicsTests.sln index a071d70..bc028bf 100644 --- a/MoonWorksGraphicsTests.sln +++ b/MoonWorksGraphicsTests.sln @@ -21,6 +21,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TexturedQuad", "TexturedQua EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TriangleVertexBuffer", "TriangleVertexBuffer\TriangleVertexBuffer.csproj", "{7EC935B1-DCD1-4ADD-96C8-614B4CA76501}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GetBufferData", "GetBufferData\GetBufferData.csproj", "{37BDB4E6-FCDC-4F04-A9E3-C6B9D6C3AB4E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MoonWorks", "..\MoonWorks\MoonWorks.csproj", "{1695B1D8-4935-490C-A5EC-E2F2AA94B150}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -63,6 +67,14 @@ Global {7EC935B1-DCD1-4ADD-96C8-614B4CA76501}.Debug|x64.Build.0 = Debug|x64 {7EC935B1-DCD1-4ADD-96C8-614B4CA76501}.Release|x64.ActiveCfg = Release|x64 {7EC935B1-DCD1-4ADD-96C8-614B4CA76501}.Release|x64.Build.0 = Release|x64 + {37BDB4E6-FCDC-4F04-A9E3-C6B9D6C3AB4E}.Debug|x64.ActiveCfg = Debug|x64 + {37BDB4E6-FCDC-4F04-A9E3-C6B9D6C3AB4E}.Debug|x64.Build.0 = Debug|x64 + {37BDB4E6-FCDC-4F04-A9E3-C6B9D6C3AB4E}.Release|x64.ActiveCfg = Release|x64 + {37BDB4E6-FCDC-4F04-A9E3-C6B9D6C3AB4E}.Release|x64.Build.0 = Release|x64 + {1695B1D8-4935-490C-A5EC-E2F2AA94B150}.Debug|x64.ActiveCfg = Debug|x64 + {1695B1D8-4935-490C-A5EC-E2F2AA94B150}.Debug|x64.Build.0 = Debug|x64 + {1695B1D8-4935-490C-A5EC-E2F2AA94B150}.Release|x64.ActiveCfg = Release|x64 + {1695B1D8-4935-490C-A5EC-E2F2AA94B150}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE