diff --git a/guide/translations/ko-KR/src/rendering/dynamic_rendering.md b/guide/translations/ko-KR/src/rendering/dynamic_rendering.md index e7e5be3..8ccc18f 100644 --- a/guide/translations/ko-KR/src/rendering/dynamic_rendering.md +++ b/guide/translations/ko-KR/src/rendering/dynamic_rendering.md @@ -161,7 +161,7 @@ void App::submit_and_present() { wait_semaphore_info.setSemaphore(*render_sync.draw) .setStageMask(vk::PipelineStageFlagBits2::eColorAttachmentOutput); auto signal_semaphore_info = vk::SemaphoreSubmitInfo{}; - signal_semaphore_info.setSemaphore(*render_sync.present) + signal_semaphore_info.setSemaphore(m_swapchain->get_present_semaphore()) .setStageMask(vk::PipelineStageFlagBits2::eColorAttachmentOutput); submit_info.setCommandBufferInfos(command_buffer_info) .setWaitSemaphoreInfos(wait_semaphore_info) @@ -175,8 +175,7 @@ void App::submit_and_present() { // framebuffer size does not match the Swapchain image size, check it // explicitly. auto const fb_size_changed = m_framebuffer_size != m_swapchain->get_size(); - auto const out_of_date = - !m_swapchain->present(m_queue, *render_sync.present); + auto const out_of_date = !m_swapchain->present(m_queue); if (fb_size_changed || out_of_date) { m_swapchain->recreate(m_framebuffer_size); } diff --git a/guide/translations/ko-KR/src/rendering/render_sync.md b/guide/translations/ko-KR/src/rendering/render_sync.md index 46520ef..ff92e9e 100644 --- a/guide/translations/ko-KR/src/rendering/render_sync.md +++ b/guide/translations/ko-KR/src/rendering/render_sync.md @@ -17,8 +17,6 @@ using Buffered = std::array; struct RenderSync { // signaled when Swapchain image has been acquired. vk::UniqueSemaphore draw{}; - // signaled when image is ready to be presented. - vk::UniqueSemaphore present{}; // signaled with present Semaphore, waited on before next render. vk::UniqueFence drawn{}; // used to record rendering commands. @@ -68,7 +66,6 @@ void App::create_render_sync() { std::views::zip(m_render_sync, command_buffers)) { sync.command_buffer = command_buffer; sync.draw = m_device->createSemaphoreUnique({}); - sync.present = m_device->createSemaphoreUnique({}); sync.drawn = m_device->createFenceUnique(fence_create_info_v); } } diff --git a/guide/translations/ko-KR/src/rendering/swapchain_loop.md b/guide/translations/ko-KR/src/rendering/swapchain_loop.md index c506322..3a35fae 100644 --- a/guide/translations/ko-KR/src/rendering/swapchain_loop.md +++ b/guide/translations/ko-KR/src/rendering/swapchain_loop.md @@ -19,7 +19,10 @@ ## 가상 프레임 -프레임마다 사용되는 모든 동적 자원들은 가상 프레임에 포함됩니다. 애플리케이션은 고정된 개수의 가상 프레임을 가지고 있으며, 매 렌더 패스마다 이를 순환하며 사용합니다. 동기화를 위해 각 프레임은 이전 프레임의 렌더링이 끝날 때 까지 대기하게 만드는 [`vk::Fence`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-fences)가 있어야 합니다. 또한 GPU에서의 이미지를 받아오고, 렌더링, 화면에 나타내는 작업을 동기화하기 위한 2개의[`vk::Semaphore`](https://docs.vulkan.org/spec/latest/chapters/synchronization.html#synchronization-semaphores)가 필요합니다(이 작업들은 CPU측에서 대기할 필요는 없습니다). 명령을 기록하기 위해 가상 프레임마다 [`vk::CommandBuffer`](https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html)를 두어 해당 프레임의 (레이아웃 전환을 포함한) 모든 렌더링 명령을 기록할 것입니다. +프레임마다 사용되는 모든 동적 자원들은 가상 프레임에 포함됩니다. 애플리케이션은 고정된 개수의 가상 프레임을 가지고 있으며, 매 렌더 패스마다 이를 순환하며 사용합니다. 동기화를 위해 각 프레임은 이전 프레임의 렌더링이 끝날 때 까지 대기하게 만드는 [`vk::Fence`](https://registry.khronos.org/vulkan/specs/latest/man/html/VkFence.html)가 있어야 합니다. 또한 GPU에서의 이미지를 받아오는 것과 렌더링하는 작업을 동기화하기 위한 [`vk::Semaphore`](https://registry.khronos.org/vulkan/specs/latest/man/html/VkSemaphore.html)가 필요합니다(이 작업들은 코드에서 대기할 필요는 없습니다). 명령을 기록하기 위해 가상 프레임마다 [`vk::CommandBuffer`](https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html)를 두어 해당 프레임의 (레이아웃 전환을 포함한) 모든 렌더링 명령을 기록할 것입니다. + + +화면 표시 작업에도 동기화를 위한 세마포어가 필요하지만, 스왑체인 루프는 각 가상 프레임이 처음 사용될 때 미리 시그널되는 drawn 펜스를 기준으로 대기하기 때문에, 표시용 세마포어는 가상 프레임의 일부가 될 수 없습니다. 아직 시그널되지 않은 표시용 세마포어를 사용하여 이미지를 가져오고 커맨드를 제출하는 것도 가능하지만, 이는 유효하지 않은 동작입니다. 따라서 이러한 세마포어는 스왑체인 이미지(인덱스)와 연결되며, 스왑체인이 재생성될 때 함께 재생성됩니다. ## 이미지 레이아웃 diff --git a/guide/translations/ko-KR/src/rendering/swapchain_update.md b/guide/translations/ko-KR/src/rendering/swapchain_update.md index 8455293..9c6d2ec 100644 --- a/guide/translations/ko-KR/src/rendering/swapchain_update.md +++ b/guide/translations/ko-KR/src/rendering/swapchain_update.md @@ -1,6 +1,42 @@ # 스왑체인 업데이트 -스왑체인에서 이미지를 받아오고 표시하는 작업은 다양한 결과를 반환할 수 있습니다. 우리는 다음과 같은 경우에 한정하여 처리합니다. +세마포어 vector를 추가하고 `recreate()`함수를 통해 이를 할당합니다. + +```cpp +void create_present_semaphores(); + +// ... +// signaled when image is ready to be presented. +std::vector m_present_semaphores{}; + +// ... +auto Swapchain::recreate(glm::ivec2 size) -> bool { + // ... + populate_images(); + create_image_views(); + // recreate present semaphores as the image count might have changed. + create_present_semaphores(); + // ... +} + +void Swapchain::create_present_semaphores() { + m_present_semaphores.clear(); + m_present_semaphores.resize(m_images.size()); + for (auto& semaphore : m_present_semaphores) { + semaphore = m_device.createSemaphoreUnique({}); + } +} +``` + +가져온 이미지에 대응되는 표시용 세마포어를 가져오는 함수를 추가합니다. 이는 렌더링 커맨드 버퍼가 제출될 때 시그널 됩니다. + +```cpp +auto Swapchain::get_present_semaphore() const -> vk::Semaphore { + return *m_present_semaphores.at(m_image_index.value()); +} +``` + +스왑체인에서 이미지를 받아오고 표시하는 작업은 다양한 결과를 반환할 수 있습니다. 우리는 다음과 같은 경우로 한정하여 처리하겠습니다. - `eSuccess` : 문제가 없습니다. - `eSuboptimalKHR` : 역시 문제가 없습니다(에러는 아니며, 데스크탑 환경에서는 드물게 발생합니다).