@@ -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
207207procedure TScreenExampleCube.Show ;
208208var Stream:TStream;
209- Index:TpvInt32;
209+ Index,SwapChainImageIndex :TpvInt32;
210210begin
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;
411413end ;
412414
413415procedure TScreenExampleCube.Hide ;
414- var Index:TpvInt32;
416+ var Index,SwapChainImageIndex :TpvInt32;
415417begin
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);
461465end ;
462466
463467procedure TScreenExampleCube.AfterCreateSwapChain ;
464- var Index:TpvInt32;
468+ var Index,SwapChainImageIndex :TpvInt32;
465469 VulkanCommandBuffer:TpvVulkanCommandBuffer;
466470begin
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