Skip to content

Commit 58757b2

Browse files
committed
More work
1 parent df699fb commit 58757b2

File tree

6 files changed

+178
-138
lines changed

6 files changed

+178
-138
lines changed

projects/examples/src/UnitScreenBlank.pas

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type TScreenBlank=class(TpvApplicationScreen)
3232
private
3333
fVulkanRenderPass:TpvVulkanRenderPass;
3434
fVulkanCommandPool:TpvVulkanCommandPool;
35-
fVulkanRenderCommandBuffers:array[0..MaxInFlightFrames-1] of TpvVulkanCommandBuffer;
35+
fVulkanRenderCommandBuffers:array[0..MaxInFlightFrames-1,0..MaxSwapChainImages-1] of TpvVulkanCommandBuffer;
3636
fVulkanRenderSemaphores:array[0..MaxInFlightFrames-1] of TpvVulkanSemaphore;
3737
public
3838

@@ -75,15 +75,17 @@ destructor TScreenBlank.Destroy;
7575
end;
7676

7777
procedure TScreenBlank.Show;
78-
var Index:TpvInt32;
78+
var Index,SwapChainImageIndex:TpvInt32;
7979
begin
8080
inherited Show;
8181

8282
fVulkanCommandPool:=TpvVulkanCommandPool.Create(pvApplication.VulkanDevice,
8383
pvApplication.VulkanDevice.GraphicsQueueFamilyIndex,
8484
TVkCommandPoolCreateFlags(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8585
for Index:=0 to MaxInFlightFrames-1 do begin
86-
fVulkanRenderCommandBuffers[Index]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
86+
for SwapChainImageIndex:=0 to MaxSwapChainImages-1 do begin
87+
fVulkanRenderCommandBuffers[Index,SwapChainImageIndex]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
88+
end;
8789
fVulkanRenderSemaphores[Index]:=TpvVulkanSemaphore.Create(pvApplication.VulkanDevice);
8890
end;
8991

@@ -92,11 +94,13 @@ procedure TScreenBlank.Show;
9294
end;
9395

9496
procedure TScreenBlank.Hide;
95-
var Index:TpvInt32;
97+
var Index,SwapChainImageIndex:TpvInt32;
9698
begin
9799
FreeAndNil(fVulkanRenderPass);
98100
for Index:=0 to MaxInFlightFrames-1 do begin
99-
FreeAndNil(fVulkanRenderCommandBuffers[Index]);
101+
for SwapChainImageIndex:=0 to MaxSwapChainImages-1 do begin
102+
FreeAndNil(fVulkanRenderCommandBuffers[Index,SwapChainImageIndex]);
103+
end;
100104
FreeAndNil(fVulkanRenderSemaphores[Index]);
101105
end;
102106
FreeAndNil(fVulkanCommandPool);
@@ -119,7 +123,7 @@ procedure TScreenBlank.Resize(const aWidth,aHeight:TpvInt32);
119123
end;
120124

121125
procedure TScreenBlank.AfterCreateSwapChain;
122-
var Index:TpvInt32;
126+
var Index,SwapChainImageIndex:TpvInt32;
123127
VulkanCommandBuffer:TpvVulkanCommandBuffer;
124128
begin
125129
inherited AfterCreateSwapChain;
@@ -184,23 +188,27 @@ procedure TScreenBlank.AfterCreateSwapChain;
184188

185189
for Index:=0 to pvApplication.CountInFlightFrames-1 do begin
186190

187-
fVulkanRenderCommandBuffers[Index]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
191+
for SwapChainImageIndex:=0 to MaxSwapChainImages-1 do begin
192+
193+
fVulkanRenderCommandBuffers[Index,SwapChainImageIndex]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
194+
195+
VulkanCommandBuffer:=fVulkanRenderCommandBuffers[Index,SwapChainImageIndex];
188196

189-
VulkanCommandBuffer:=fVulkanRenderCommandBuffers[Index];
197+
VulkanCommandBuffer.BeginRecording(TVkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT));
190198

191-
VulkanCommandBuffer.BeginRecording(TVkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT));
199+
fVulkanRenderPass.BeginRenderPass(VulkanCommandBuffer,
200+
pvApplication.VulkanFrameBuffers[SwapChainImageIndex],
201+
VK_SUBPASS_CONTENTS_INLINE,
202+
0,
203+
0,
204+
pvApplication.VulkanSwapChain.Width,
205+
pvApplication.VulkanSwapChain.Height);
192206

193-
fVulkanRenderPass.BeginRenderPass(VulkanCommandBuffer,
194-
pvApplication.VulkanFrameBuffers[Index],
195-
VK_SUBPASS_CONTENTS_INLINE,
196-
0,
197-
0,
198-
pvApplication.VulkanSwapChain.Width,
199-
pvApplication.VulkanSwapChain.Height);
207+
fVulkanRenderPass.EndRenderPass(VulkanCommandBuffer);
200208

201-
fVulkanRenderPass.EndRenderPass(VulkanCommandBuffer);
209+
VulkanCommandBuffer.EndRecording;
202210

203-
VulkanCommandBuffer.EndRecording;
211+
end;
204212

205213
end;
206214

@@ -227,12 +235,12 @@ procedure TScreenBlank.Draw(const aSwapChainImageIndex:TpvInt32;var aWaitSemapho
227235
inherited Draw(aSwapChainImageIndex,aWaitSemaphore,nil);
228236
if assigned(fVulkanRenderPass) then begin
229237

230-
fVulkanRenderCommandBuffers[pvApplication.DrawInFlightFrameIndex].Execute(pvApplication.VulkanDevice.GraphicsQueue,
231-
TVkPipelineStageFlags(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT),
232-
aWaitSemaphore,
233-
fVulkanRenderSemaphores[pvApplication.DrawInFlightFrameIndex],
234-
aWaitFence,
235-
false);
238+
fVulkanRenderCommandBuffers[pvApplication.DrawInFlightFrameIndex,aSwapChainImageIndex].Execute(pvApplication.VulkanDevice.GraphicsQueue,
239+
TVkPipelineStageFlags(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT),
240+
aWaitSemaphore,
241+
fVulkanRenderSemaphores[pvApplication.DrawInFlightFrameIndex],
242+
aWaitFence,
243+
false);
236244

237245
aWaitSemaphore:=fVulkanRenderSemaphores[pvApplication.DrawInFlightFrameIndex];
238246

projects/examples/src/UnitScreenExampleCube.pas

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ TScreenExampleCube=class(TpvApplicationScreen)
6666
fVulkanDescriptorSets:array[0..MaxInFlightFrames-1] of TpvVulkanDescriptorSet;
6767
fVulkanPipelineLayout:TpvVulkanPipelineLayout;
6868
fVulkanCommandPool:TpvVulkanCommandPool;
69-
fVulkanRenderCommandBuffers:array[0..MaxInFlightFrames-1] of TpvVulkanCommandBuffer;
69+
fVulkanRenderCommandBuffers:array[0..MaxInFlightFrames-1,0..MaxSwapChainImages-1] of TpvVulkanCommandBuffer;
7070
fVulkanRenderSemaphores:array[0..MaxInFlightFrames-1] of TpvVulkanSemaphore;
7171
fUniformBuffer:TScreenExampleCubeUniformBuffer;
7272
fBoxAlbedoTexture:TpvVulkanTexture;
@@ -206,7 +206,7 @@ destructor TScreenExampleCube.Destroy;
206206

207207
procedure TScreenExampleCube.Show;
208208
var Stream:TStream;
209-
Index:TpvInt32;
209+
Index,SwapChainImageIndex:TpvInt32;
210210
begin
211211
inherited Show;
212212

@@ -230,7 +230,9 @@ procedure TScreenExampleCube.Show;
230230
pvApplication.VulkanDevice.GraphicsQueueFamilyIndex,
231231
TVkCommandPoolCreateFlags(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
232232
for Index:=0 to MaxInFlightFrames-1 do begin
233-
fVulkanRenderCommandBuffers[Index]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
233+
for SwapChainImageIndex:=0 to MaxSwapChainImages-1 do begin
234+
fVulkanRenderCommandBuffers[Index,SwapChainImageIndex]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
235+
end;
234236
fVulkanRenderSemaphores[Index]:=TpvVulkanSemaphore.Create(pvApplication.VulkanDevice);
235237
end;
236238

@@ -411,7 +413,7 @@ procedure TScreenExampleCube.Show;
411413
end;
412414

413415
procedure TScreenExampleCube.Hide;
414-
var Index:TpvInt32;
416+
var Index,SwapChainImageIndex:TpvInt32;
415417
begin
416418
FreeAndNil(fVulkanPipelineLayout);
417419
for Index:=0 to MaxInFlightFrames-1 do begin
@@ -432,7 +434,9 @@ procedure TScreenExampleCube.Hide;
432434
FreeAndNil(fCubeVertexShaderModule);
433435
FreeAndNil(fBoxAlbedoTexture);
434436
for Index:=0 to MaxInFlightFrames-1 do begin
435-
FreeAndNil(fVulkanRenderCommandBuffers[Index]);
437+
for SwapChainImageIndex:=0 to MaxSwapChainImages-1 do begin
438+
FreeAndNil(fVulkanRenderCommandBuffers[Index,SwapChainImageIndex]);
439+
end;
436440
FreeAndNil(fVulkanRenderSemaphores[Index]);
437441
end;
438442
FreeAndNil(fVulkanCommandPool);
@@ -461,7 +465,7 @@ procedure TScreenExampleCube.Resize(const aWidth,aHeight:TpvInt32);
461465
end;
462466

463467
procedure TScreenExampleCube.AfterCreateSwapChain;
464-
var Index:TpvInt32;
468+
var Index,SwapChainImageIndex:TpvInt32;
465469
VulkanCommandBuffer:TpvVulkanCommandBuffer;
466470
begin
467471
inherited AfterCreateSwapChain;
@@ -599,34 +603,38 @@ procedure TScreenExampleCube.AfterCreateSwapChain;
599603

600604
for Index:=0 to pvApplication.CountInFlightFrames-1 do begin
601605

602-
fVulkanRenderCommandBuffers[Index]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
606+
for SwapChainImageIndex:=0 to MaxSwapChainImages-1 do begin
607+
608+
fVulkanRenderCommandBuffers[Index,SwapChainImageIndex]:=TpvVulkanCommandBuffer.Create(fVulkanCommandPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
603609

604-
VulkanCommandBuffer:=fVulkanRenderCommandBuffers[Index];
610+
VulkanCommandBuffer:=fVulkanRenderCommandBuffers[Index,SwapChainImageIndex];
605611

606-
VulkanCommandBuffer.BeginRecording(TVkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT));
612+
VulkanCommandBuffer.BeginRecording(TVkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT));
607613

608-
{VulkanCommandBuffer.MetaCmdMemoryBarrier(TVkPipelineStageFlags(VK_PIPELINE_STAGE_HOST_BIT),
609-
TVkPipelineStageFlags(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT),
610-
TVkAccessFlags(VK_ACCESS_HOST_WRITE_BIT),
611-
TVkAccessFlags(VK_ACCESS_UNIFORM_READ_BIT));}
614+
{VulkanCommandBuffer.MetaCmdMemoryBarrier(TVkPipelineStageFlags(VK_PIPELINE_STAGE_HOST_BIT),
615+
TVkPipelineStageFlags(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT),
616+
TVkAccessFlags(VK_ACCESS_HOST_WRITE_BIT),
617+
TVkAccessFlags(VK_ACCESS_UNIFORM_READ_BIT));}
612618

613-
fVulkanRenderPass.BeginRenderPass(VulkanCommandBuffer,
614-
pvApplication.VulkanFrameBuffers[Index],
615-
VK_SUBPASS_CONTENTS_INLINE,
616-
0,
617-
0,
618-
pvApplication.VulkanSwapChain.Width,
619-
pvApplication.VulkanSwapChain.Height);
619+
fVulkanRenderPass.BeginRenderPass(VulkanCommandBuffer,
620+
pvApplication.VulkanFrameBuffers[SwapChainImageIndex],
621+
VK_SUBPASS_CONTENTS_INLINE,
622+
0,
623+
0,
624+
pvApplication.VulkanSwapChain.Width,
625+
pvApplication.VulkanSwapChain.Height);
620626

621-
VulkanCommandBuffer.CmdBindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS,fVulkanPipelineLayout.Handle,0,1,@fVulkanDescriptorSets[Index].Handle,0,nil);
622-
VulkanCommandBuffer.CmdBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS,fVulkanGraphicsPipeline.Handle);
623-
VulkanCommandBuffer.CmdBindVertexBuffers(0,1,@fVulkanVertexBuffer.Handle,@Offsets);
624-
VulkanCommandBuffer.CmdBindIndexBuffer(fVulkanIndexBuffer.Handle,0,VK_INDEX_TYPE_UINT32);
625-
VulkanCommandBuffer.CmdDrawIndexed(length(CubeIndices),1,0,0,0);
627+
VulkanCommandBuffer.CmdBindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS,fVulkanPipelineLayout.Handle,0,1,@fVulkanDescriptorSets[Index].Handle,0,nil);
628+
VulkanCommandBuffer.CmdBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS,fVulkanGraphicsPipeline.Handle);
629+
VulkanCommandBuffer.CmdBindVertexBuffers(0,1,@fVulkanVertexBuffer.Handle,@Offsets);
630+
VulkanCommandBuffer.CmdBindIndexBuffer(fVulkanIndexBuffer.Handle,0,VK_INDEX_TYPE_UINT32);
631+
VulkanCommandBuffer.CmdDrawIndexed(length(CubeIndices),1,0,0,0);
626632

627-
fVulkanRenderPass.EndRenderPass(VulkanCommandBuffer);
633+
fVulkanRenderPass.EndRenderPass(VulkanCommandBuffer);
628634

629-
VulkanCommandBuffer.EndRecording;
635+
VulkanCommandBuffer.EndRecording;
636+
637+
end;
630638

631639
end;
632640

@@ -794,12 +802,12 @@ procedure TScreenExampleCube.Draw(const aSwapChainImageIndex:TpvInt32;var aWaitS
794802
end;
795803
end;
796804

797-
fVulkanRenderCommandBuffers[pvApplication.DrawInFlightFrameIndex].Execute(pvApplication.VulkanDevice.GraphicsQueue,
798-
TVkPipelineStageFlags(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT),
799-
aWaitSemaphore,
800-
fVulkanRenderSemaphores[pvApplication.DrawInFlightFrameIndex],
801-
aWaitFence,
802-
false);
805+
fVulkanRenderCommandBuffers[pvApplication.DrawInFlightFrameIndex,aSwapChainImageIndex].Execute(pvApplication.VulkanDevice.GraphicsQueue,
806+
TVkPipelineStageFlags(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT),
807+
aWaitSemaphore,
808+
fVulkanRenderSemaphores[pvApplication.DrawInFlightFrameIndex],
809+
aWaitFence,
810+
false);
803811

804812
aWaitSemaphore:=fVulkanRenderSemaphores[pvApplication.DrawInFlightFrameIndex];
805813

0 commit comments

Comments
 (0)