added compute buffer functionality (calculation of squares) to BasicCompute

pull/1/head
Caleb Cornett 2022-11-12 19:27:10 -05:00
parent 4f0a053e00
commit 030e86124a
4 changed files with 54 additions and 9 deletions

View File

@ -13,16 +13,29 @@ namespace MoonWorks.Test
public BasicComputeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true) public BasicComputeGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), 60, true)
{ {
ShaderModule computeShaderModule = new ShaderModule( // Create the compute pipeline that writes texture data
ShaderModule fillTextureComputeShaderModule = new ShaderModule(
GraphicsDevice, GraphicsDevice,
TestUtils.GetShaderPath("FillTextureCompute.spv") TestUtils.GetShaderPath("FillTextureCompute.spv")
); );
ComputePipeline computePipeline = new ComputePipeline( ComputePipeline fillTextureComputePipeline = new ComputePipeline(
GraphicsDevice, GraphicsDevice,
ComputeShaderInfo.Create(computeShaderModule, "main", 0, 1) ComputeShaderInfo.Create(fillTextureComputeShaderModule, "main", 0, 1)
); );
// Create the compute pipeline that calculates squares of numbers
ShaderModule calculateSquaresComputeShaderModule = new ShaderModule(
GraphicsDevice,
TestUtils.GetShaderPath("CalculateSquaresCompute.spv")
);
ComputePipeline calculateSquaresComputePipeline = new ComputePipeline(
GraphicsDevice,
ComputeShaderInfo.Create(calculateSquaresComputeShaderModule, "main", 1, 0)
);
// Create the graphics pipeline
ShaderModule vertShaderModule = new ShaderModule( ShaderModule vertShaderModule = new ShaderModule(
GraphicsDevice, GraphicsDevice,
TestUtils.GetShaderPath("TexturedQuadVert.spv") TestUtils.GetShaderPath("TexturedQuadVert.spv")
@ -49,9 +62,20 @@ namespace MoonWorks.Test
drawPipelineCreateInfo drawPipelineCreateInfo
); );
vertexBuffer = Buffer.Create<PositionTextureVertex>(GraphicsDevice, BufferUsageFlags.Vertex, 6); // Create buffers and textures
float[] squares = new float[64];
Buffer squaresBuffer = Buffer.Create<float>(
GraphicsDevice,
BufferUsageFlags.Compute,
(uint) squares.Length
);
vertexBuffer = Buffer.Create<PositionTextureVertex>(
GraphicsDevice,
BufferUsageFlags.Vertex,
6
);
// Create the texture that will be filled in by the compute pipeline
texture = Texture.CreateTexture2D( texture = Texture.CreateTexture2D(
GraphicsDevice, GraphicsDevice,
MainWindow.Width, MainWindow.Width,
@ -59,11 +83,11 @@ namespace MoonWorks.Test
TextureFormat.R8G8B8A8, TextureFormat.R8G8B8A8,
TextureUsageFlags.Compute | TextureUsageFlags.Sampler TextureUsageFlags.Compute | TextureUsageFlags.Sampler
); );
sampler = new Sampler(GraphicsDevice, new SamplerCreateInfo()); sampler = new Sampler(GraphicsDevice, new SamplerCreateInfo());
// Populate the vertex buffer and run the compute shader to generate the texture data // 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)),
@ -74,11 +98,19 @@ namespace MoonWorks.Test
new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)), new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)),
}); });
cmdbuf.BindComputePipeline(computePipeline); cmdbuf.BindComputePipeline(fillTextureComputePipeline);
cmdbuf.BindComputeTextures(texture); cmdbuf.BindComputeTextures(texture);
cmdbuf.DispatchCompute(MainWindow.Width / 8, MainWindow.Height / 8, 1, 0); cmdbuf.DispatchCompute(MainWindow.Width / 8, MainWindow.Height / 8, 1, 0);
cmdbuf.BindComputePipeline(calculateSquaresComputePipeline);
cmdbuf.BindComputeBuffers(squaresBuffer);
cmdbuf.DispatchCompute(64, 1, 1, 0);
GraphicsDevice.Submit(cmdbuf); GraphicsDevice.Submit(cmdbuf);
GraphicsDevice.Wait();
squaresBuffer.GetData(squares, (uint) (sizeof(float) * squares.Length));
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) { }

View File

@ -0,0 +1,13 @@
#version 450
layout (local_size_x = 8) in;
layout (set = 0, binding = 0) buffer outBuffer
{
float squares[];
};
void main()
{
uint n = gl_GlobalInvocationID.x;
squares[n] = n * n;
}

View File

@ -42,4 +42,4 @@ Renders a cubemap skybox and a spinning cube. Tests depth textures, sampling fro
**BasicCompute** **BasicCompute**
Uses a compute pipeline to fill a texture with data, then displays it to the screen. Tests compute pipeline creation and compute dispatching. Uses compute pipelines to (1) fill a texture with data then display it to the screen and (2) calculate the squares of the first 64 integers. Tests compute pipeline creation, compute dispatching, compute textures, and compute buffers.