Skip to content

Commit 14ab1b7

Browse files
authored
refactor: vk::Unique系にリファクタリング
1 parent 3e32512 commit 14ab1b7

24 files changed

+221
-282
lines changed

src/graphics/core/core.cpp

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ std::vector<const char *> getInstanceLayers() {
2323
#endif
2424
}
2525

26-
vk::Instance createInstance() {
26+
vk::UniqueInstance createInstance() {
2727
#ifdef __APPLE__
2828
const auto flags = vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR;
2929
#else
@@ -39,7 +39,7 @@ vk::Instance createInstance() {
3939
.setPApplicationInfo(&ai)
4040
.setPEnabledExtensionNames(extensions)
4141
.setPEnabledLayerNames(layers);
42-
return vk::createInstance(ci);
42+
return vk::createInstanceUnique(ci);
4343
}
4444

4545
vk::PhysicalDevice selectPhysicalDevice(const vk::Instance &instance) {
@@ -64,7 +64,7 @@ uint32_t getQueueFamilyIndex(const vk::PhysicalDevice &physicalDevice) {
6464
return static_cast<uint32_t>(std::distance(props.cbegin(), iter));
6565
}
6666

67-
vk::Device createDevice(const vk::PhysicalDevice &physicalDevice, uint32_t queueFamilyIndex) {
67+
vk::UniqueDevice createDevice(const vk::PhysicalDevice &physicalDevice, uint32_t queueFamilyIndex) {
6868
#ifdef __APPLE__
6969
const std::array<const char *, 2> extensions{"VK_KHR_swapchain", "VK_KHR_portability_subset"};
7070
#else
@@ -77,20 +77,20 @@ vk::Device createDevice(const vk::PhysicalDevice &physicalDevice, uint32_t queue
7777
const auto ci = vk::DeviceCreateInfo()
7878
.setQueueCreateInfos(qci)
7979
.setPEnabledExtensionNames(extensions);
80-
return physicalDevice.createDevice(ci);
80+
return physicalDevice.createDeviceUnique(ci);
8181
}
8282

8383
} // namespace
8484

8585
namespace graphics::core {
8686

8787
struct Core {
88-
const vk::Instance instance;
88+
const vk::UniqueInstance instance;
8989
const vk::PhysicalDevice physicalDevice;
9090
const uint32_t queueFamilyIndex;
91-
const vk::Device device;
91+
const vk::UniqueDevice device;
9292
const vk::Queue queue;
93-
const vk::CommandPool commandPool;
93+
const vk::UniqueCommandPool commandPool;
9494

9595
Core(const Core &) = delete;
9696
Core(const Core &&) = delete;
@@ -99,23 +99,16 @@ struct Core {
9999

100100
Core():
101101
instance(createInstance()),
102-
physicalDevice(selectPhysicalDevice(instance)),
102+
physicalDevice(selectPhysicalDevice(instance.get())),
103103
queueFamilyIndex(getQueueFamilyIndex(physicalDevice)),
104104
device(createDevice(physicalDevice, queueFamilyIndex)),
105-
queue(device.getQueue(queueFamilyIndex, 0)),
106-
commandPool(device.createCommandPool(
105+
queue(device->getQueue(queueFamilyIndex, 0)),
106+
commandPool(device->createCommandPoolUnique(
107107
vk::CommandPoolCreateInfo()
108108
.setFlags(vk::CommandPoolCreateFlagBits::eResetCommandBuffer)
109109
.setQueueFamilyIndex(queueFamilyIndex)
110110
))
111111
{}
112-
113-
~Core() {
114-
device.waitIdle();
115-
device.destroy(commandPool);
116-
device.destroy();
117-
instance.destroy();
118-
}
119112
};
120113

121114
std::optional<Core> g_core;
@@ -139,7 +132,7 @@ void destroyCore() noexcept {
139132

140133
const vk::Instance &instance() {
141134
ensureCoreInitialized();
142-
return g_core->instance;
135+
return g_core->instance.get();
143136
}
144137

145138
const vk::PhysicalDevice &physicalDevice() {
@@ -149,7 +142,7 @@ const vk::PhysicalDevice &physicalDevice() {
149142

150143
const vk::Device &device() {
151144
ensureCoreInitialized();
152-
return g_core->device;
145+
return g_core->device.get();
153146
}
154147

155148
const vk::Queue &queue() {
@@ -159,7 +152,7 @@ const vk::Queue &queue() {
159152

160153
const vk::CommandPool &commandPool() {
161154
ensureCoreInitialized();
162-
return g_core->commandPool;
155+
return g_core->commandPool.get();
163156
}
164157

165158
} // namespace graphics::core

src/graphics/renderer/renderer.cpp

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,46 @@
77

88
namespace 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

2832
Renderer::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-
4339
void 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

5652
void 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

9086
void 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

10095
void Renderer::recreateSemaphoreForImageEnabled() {
101-
core::device().destroy(_semaphoreForImageEnabled);
102-
_semaphoreForImageEnabled = core::device().createSemaphore({});
96+
_semaphoreForImageEnabled = core::device().createSemaphoreUnique({});
10397
}
10498

10599
std::optional<Renderer> g_renderer;

src/graphics/renderer/renderer.hpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,21 @@ class Renderer {
1010
private:
1111
/// 描画処理コマンド用のコマンドバッファ
1212
/// orgeは描画完了まで待機するので1個で十分
13-
const vk::CommandBuffer _commandBuffer;
13+
const vk::UniqueCommandBuffer _commandBuffer;
1414
/// スワップチェインイメージ取得の完了を知るためのセマフォ
1515
/// コマンドバッファ提出を待機させるために使う
16-
vk::Semaphore _semaphoreForImageEnabled;
16+
vk::UniqueSemaphore _semaphoreForImageEnabled;
1717
/// コマンドバッファ実行の完了を知るためのセマフォ
1818
/// プレゼンテーション開始を待機させるために使う
19-
std::vector<vk::Semaphore> _semaphoreForRenderFinisheds;
19+
std::vector<vk::UniqueSemaphore> _semaphoreForRenderFinisheds;
2020
/// フレーム完了を監視するフェンス
2121
/// 次フレーム開始前にGPU処理完了を待機するために使う
22-
const vk::Fence _frameInFlightFence;
22+
const vk::UniqueFence _frameInFlightFence;
2323
/// レンダリング中の必要な情報をまとめたもの
2424
std::optional<RenderContext> _context;
2525

2626
public:
2727
Renderer();
28-
~Renderer();
2928

3029
RenderContext &getContext() {
3130
if (_context) {

src/graphics/renderpass/framebuffer.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77

88
namespace graphics::renderpass {
99

10-
std::vector<vk::Framebuffer> createFramebuffers(const vk::RenderPass &renderPass, const std::string renderPassId) {
10+
std::vector<vk::UniqueFramebuffer> createFramebuffers(
11+
const vk::RenderPass &renderPass,
12+
const std::string &renderPassId
13+
) {
1114
const auto &swapchain = window::swapchain();
1215

13-
std::vector<vk::Framebuffer> framebuffers;
16+
std::vector<vk::UniqueFramebuffer> framebuffers;
1417
framebuffers.reserve(swapchain.getImages().size());
1518

1619
for (size_t i = 0; i < swapchain.getImages().size(); ++i) {
@@ -29,7 +32,7 @@ std::vector<vk::Framebuffer> createFramebuffers(const vk::RenderPass &renderPass
2932
.setWidth(extent.width)
3033
.setHeight(extent.height)
3134
.setLayers(1);
32-
framebuffers.push_back(core::device().createFramebuffer(ci));
35+
framebuffers.push_back(core::device().createFramebufferUnique(ci));
3336
}
3437

3538
return framebuffers;

src/graphics/renderpass/framebuffer.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace graphics::renderpass {
66

7-
std::vector<vk::Framebuffer> createFramebuffers(const vk::RenderPass &renderPass, const std::string renderPassId);
7+
std::vector<vk::UniqueFramebuffer> createFramebuffers(
8+
const vk::RenderPass &renderPass,
9+
const std::string &renderPassId
10+
);
811

912
} // namespace graphics::renderpass

0 commit comments

Comments
 (0)