SpiecsEngine
 
Loading...
Searching...
No Matches

◆ BeginFrame()

void Spices::VulkanRenderBackend::BeginFrame ( FrameInfo & frameInfo)

Start record a new frame with vulkan render backend.

Parameters
[in]frameInfoFrameInfo.

Wait for last frame done.

Reset Fences.

Prepare Writing another SwapchainImage.

Confine whether swapchain need recreated.

Instance a VkCommandBufferBeginInfo.

Start recording a Graphic CommandBuffer.

Start recording a Graphic CommandBuffer.

Checkpoint of start primary commandBuffers.

Wait for last frame done.

Reset Fences.

Prepare Writing another SwapchainImage.

Confine whether swapchain need recreated.

Instance a VkCommandBufferBeginInfo.

Start recording a Graphic CommandBuffer.

Start recording a Graphic CommandBuffer.

Checkpoint of start primary commandBuffers.

Definition at line 211 of file VulkanRenderBackend.cpp.

212 {
214
215 VkFence fence[2] = { m_VulkanState.m_ComputeFence[frameInfo.m_FrameIndex], m_VulkanState.m_GraphicFence[frameInfo.m_FrameIndex] };
216
217 {
218 SPICES_PROFILE_ZONEN("BeginFrame::WaitForFences");
219
223 VK_CHECK(vkWaitForFences(m_VulkanState.m_Device, 2, fence, VK_TRUE, UINT64_MAX))
224 }
225
226 {
227 SPICES_PROFILE_ZONEN("BeginFrame::ResetFences");
228
232 VK_CHECK(vkResetFences(m_VulkanState.m_Device, 2, fence))
233 }
234
238 const VkResult result = vkAcquireNextImageKHR(
241 UINT64_MAX ,
242 m_VulkanState.m_GraphicImageSemaphore[frameInfo.m_FrameIndex] , // Signal Semaphore.
243 VK_NULL_HANDLE ,
244 &frameInfo.m_ImageIndex
245 );
246
250 if (result == VK_ERROR_OUT_OF_DATE_KHR)
251 {
253 }
254 else if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)
255 {
256 SPICES_CORE_ERROR("Failed to acquire swap chain image!")
257 }
258
259 {
260 SPICES_PROFILE_ZONEN("StartFrame::Suspend Delay ThreadPool");
261
262 ThreadModel::Get()->GetGameThreadPool()->Suspend();
263 }
264
265 {
266 SPICES_PROFILE_ZONEN("StartFrame::Free Parallel CommandBuffer");
267
268 ThreadModel::Get()->GetRHIThreadPool()->FreeParallelCommandBuffers(frameInfo.m_FrameIndex);
269 }
270
271 {
272 SPICES_PROFILE_ZONEN("StartFrame::NsightPerfFrameStart0");
273
274 NSIGHTPERF_GPUPROFILERREPORT_BEGINFRAME(m_VulkanState.m_GraphicQueue, m_VulkanState.m_GraphicQueueFamily)
275 NSIGHTPERF_GPUPROFILERCONTINUOUS_BEGINFRAME(m_VulkanState)
276 }
277
278 {
279 SPICES_PROFILE_ZONEN("BeginFrame::BeginCommandBuffer");
280
284 VkCommandBufferBeginInfo beginInfo{};
285 beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
286 beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
287 beginInfo.pInheritanceInfo = nullptr;
288
292 VK_CHECK(vkBeginCommandBuffer(m_VulkanState.m_ComputeCommandBuffer[frameInfo.m_FrameIndex], &beginInfo))
293
294
297 beginInfo.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
298 VK_CHECK(vkBeginCommandBuffer(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], &beginInfo))
299
300
303 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "BeginPrimaryComputeCommandBuffer")
304 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "BeginPrimaryGraphicCommandBuffer")
305 }
306
307 {
308 SPICES_PROFILE_ZONEN("StartFrame::NsightPerfFrameStart1");
309
310 NSIGHTPERF_GPUPROFILERONESHOT_BEGINFRAME(m_VulkanState, m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex])
311 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], "Frame", 0, frameInfo.m_FrameIndex)
312 }
313 }
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
Definition VulkanUtils.h:68
static std::shared_ptr< ThreadModel > Get()
Get ThreadModel single instance.
void RecreateSwapChain()
Called OnSlateResize.
static VulkanState m_VulkanState
The VulkanState in use.
VkSwapchainKHR m_SwapChain
std::array< VkFence, MaxFrameInFlight > m_ComputeFence
std::array< VkCommandBuffer, MaxFrameInFlight > m_GraphicCommandBuffer
VulkanFunctions m_VkFunc
Definition VulkanUtils.h:98
uint32_t m_GraphicQueueFamily
std::array< VkSemaphore, MaxFrameInFlight > m_GraphicImageSemaphore
std::array< VkCommandBuffer, MaxFrameInFlight > m_ComputeCommandBuffer
std::array< VkFence, MaxFrameInFlight > m_GraphicFence

References Spices::FrameInfo::m_FrameIndex, Spices::VulkanState::m_GraphicQueueFamily, m_VulkanState, and RecreateSwapChain().