77
88namespace graphics ::renderer {
99
10- vk::CommandBuffer createCommandBuffer () {
10+ vk::UniqueCommandBuffer createCommandBuffer () {
1111 const auto ai = vk::CommandBufferAllocateInfo ()
1212 .setCommandPool (core::commandPool ())
1313 .setLevel (vk::CommandBufferLevel::ePrimary)
1414 .setCommandBufferCount (1 );
15- return error::at (core::device ().allocateCommandBuffers (ai), 0 , " command buffers allocated" );
15+ auto commandBuffers = core::device ().allocateCommandBuffersUnique (ai);
16+ if (commandBuffers.empty ()) {
17+ throw " failed to allocate a command buffer." ;
18+ }
19+ return std::move (commandBuffers[0 ]);
1620}
1721
18- std::vector<vk::Semaphore > createSemaphores () {
22+ std::vector<vk::UniqueSemaphore > createSemaphores () {
1923 const auto count = window::swapchain ().getImages ().size ();
20- std::vector<vk::Semaphore > semaphores;
24+ std::vector<vk::UniqueSemaphore > semaphores;
2125 semaphores.reserve (count);
2226 for (size_t i = 0 ; i < count; ++i) {
23- semaphores.push_back (core::device ().createSemaphore ({}));
27+ semaphores.push_back (core::device ().createSemaphoreUnique ({}));
2428 }
2529 return semaphores;
2630}
2731
2832Renderer::Renderer ():
2933 _commandBuffer (createCommandBuffer()),
30- _semaphoreForImageEnabled (core::device().createSemaphore ({})),
34+ _semaphoreForImageEnabled (core::device().createSemaphoreUnique ({})),
3135 _semaphoreForRenderFinisheds (createSemaphores()),
32- _frameInFlightFence (core::device().createFence ({vk::FenceCreateFlagBits::eSignaled}))
36+ _frameInFlightFence (core::device().createFenceUnique ({vk::FenceCreateFlagBits::eSignaled}))
3337{}
3438
35- Renderer::~Renderer () {
36- core::device ().destroy (_frameInFlightFence);
37- for (const auto &n: _semaphoreForRenderFinisheds) {
38- core::device ().destroy (n);
39- }
40- core::device ().destroy (_semaphoreForImageEnabled);
41- }
42-
4339void Renderer::begin () {
4440 _context.reset ();
4541
46- const auto index = window::swapchain ().acquireNextImageIndex (_semaphoreForImageEnabled);
42+ const auto index = window::swapchain ().acquireNextImageIndex (_semaphoreForImageEnabled. get () );
4743
48- _commandBuffer. reset ();
44+ _commandBuffer-> reset ();
4945 const auto cbi = vk::CommandBufferBeginInfo ()
5046 .setFlags (vk::CommandBufferUsageFlagBits::eOneTimeSubmit);
51- _commandBuffer. begin (cbi);
47+ _commandBuffer-> begin (cbi);
5248
53- _context.emplace (index, _commandBuffer);
49+ _context.emplace (index, _commandBuffer. get () );
5450}
5551
5652void Renderer::end () {
@@ -59,9 +55,9 @@ void Renderer::end() {
5955 }
6056 // TODO: レンダーパス終了忘れも検知したい。
6157
62- _commandBuffer. end ();
58+ _commandBuffer-> end ();
6359
64- core::device ().resetFences ({_frameInFlightFence});
60+ core::device ().resetFences ({_frameInFlightFence. get () });
6561
6662 const vk::PipelineStageFlags waitStage = vk::PipelineStageFlagBits::eColorAttachmentOutput;
6763 const auto &semaphore = error::at (
@@ -70,16 +66,16 @@ void Renderer::end() {
7066 " semaphores for waiting for rendering finished"
7167 );
7268 const auto si = vk::SubmitInfo ()
73- .setWaitSemaphores ({_semaphoreForImageEnabled})
69+ .setWaitSemaphores ({_semaphoreForImageEnabled. get () })
7470 .setWaitDstStageMask ({waitStage})
75- .setCommandBuffers ({_commandBuffer})
76- .setSignalSemaphores ({semaphore});
77- core::queue ().submit (si, _frameInFlightFence);
71+ .setCommandBuffers ({_commandBuffer. get () })
72+ .setSignalSemaphores ({semaphore. get () });
73+ core::queue ().submit (si, _frameInFlightFence. get () );
7874
79- window::swapchain ().present (semaphore, _context->currentIndex ());
75+ window::swapchain ().present (semaphore. get () , _context->currentIndex ());
8076
8177 // 前のフレームのGPU処理が完全に終了するまで待機
82- if (core::device ().waitForFences ({_frameInFlightFence}, VK_TRUE, UINT64_MAX) != vk::Result::eSuccess) {
78+ if (core::device ().waitForFences ({_frameInFlightFence. get () }, VK_TRUE, UINT64_MAX) != vk::Result::eSuccess) {
8379 throw " failed to wait for rendering comletion." ;
8480 }
8581
@@ -88,18 +84,16 @@ void Renderer::end() {
8884}
8985
9086void Renderer::reset () {
91- _commandBuffer. reset ();
87+ _commandBuffer-> reset ();
9288 _context.reset ();
9389 text::clearLayoutContext ();
9490 for (auto &n: _semaphoreForRenderFinisheds) {
95- core::device ().destroySemaphore (n);
96- n = core::device ().createSemaphore ({});
91+ n = core::device ().createSemaphoreUnique ({});
9792 }
9893}
9994
10095void Renderer::recreateSemaphoreForImageEnabled () {
101- core::device ().destroy (_semaphoreForImageEnabled);
102- _semaphoreForImageEnabled = core::device ().createSemaphore ({});
96+ _semaphoreForImageEnabled = core::device ().createSemaphoreUnique ({});
10397}
10498
10599std::optional<Renderer> g_renderer;
0 commit comments