Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 13 additions & 20 deletions src/graphics/core/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ std::vector<const char *> getInstanceLayers() {
#endif
}

vk::Instance createInstance() {
vk::UniqueInstance createInstance() {
#ifdef __APPLE__
const auto flags = vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR;
#else
Expand All @@ -39,7 +39,7 @@ vk::Instance createInstance() {
.setPApplicationInfo(&ai)
.setPEnabledExtensionNames(extensions)
.setPEnabledLayerNames(layers);
return vk::createInstance(ci);
return vk::createInstanceUnique(ci);
}

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

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

} // namespace

namespace graphics::core {

struct Core {
const vk::Instance instance;
const vk::UniqueInstance instance;
const vk::PhysicalDevice physicalDevice;
const uint32_t queueFamilyIndex;
const vk::Device device;
const vk::UniqueDevice device;
const vk::Queue queue;
const vk::CommandPool commandPool;
const vk::UniqueCommandPool commandPool;

Core(const Core &) = delete;
Core(const Core &&) = delete;
Expand All @@ -99,23 +99,16 @@ struct Core {

Core():
instance(createInstance()),
physicalDevice(selectPhysicalDevice(instance)),
physicalDevice(selectPhysicalDevice(instance.get())),
queueFamilyIndex(getQueueFamilyIndex(physicalDevice)),
device(createDevice(physicalDevice, queueFamilyIndex)),
queue(device.getQueue(queueFamilyIndex, 0)),
commandPool(device.createCommandPool(
queue(device->getQueue(queueFamilyIndex, 0)),
commandPool(device->createCommandPoolUnique(
vk::CommandPoolCreateInfo()
.setFlags(vk::CommandPoolCreateFlagBits::eResetCommandBuffer)
.setQueueFamilyIndex(queueFamilyIndex)
))
{}

~Core() {
device.waitIdle();
device.destroy(commandPool);
device.destroy();
instance.destroy();
}
};

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

const vk::Instance &instance() {
ensureCoreInitialized();
return g_core->instance;
return g_core->instance.get();
}

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

const vk::Device &device() {
ensureCoreInitialized();
return g_core->device;
return g_core->device.get();
}

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

const vk::CommandPool &commandPool() {
ensureCoreInitialized();
return g_core->commandPool;
return g_core->commandPool.get();
}

} // namespace graphics::core
58 changes: 26 additions & 32 deletions src/graphics/renderer/renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,50 +7,46 @@

namespace graphics::renderer {

vk::CommandBuffer createCommandBuffer() {
vk::UniqueCommandBuffer createCommandBuffer() {
const auto ai = vk::CommandBufferAllocateInfo()
.setCommandPool(core::commandPool())
.setLevel(vk::CommandBufferLevel::ePrimary)
.setCommandBufferCount(1);
return error::at(core::device().allocateCommandBuffers(ai), 0, "command buffers allocated");
auto commandBuffers = core::device().allocateCommandBuffersUnique(ai);
if (commandBuffers.empty()) {
throw "failed to allocate a command buffer.";
}
return std::move(commandBuffers[0]);
}

std::vector<vk::Semaphore> createSemaphores() {
std::vector<vk::UniqueSemaphore> createSemaphores() {
const auto count = window::swapchain().getImages().size();
std::vector<vk::Semaphore> semaphores;
std::vector<vk::UniqueSemaphore> semaphores;
semaphores.reserve(count);
for (size_t i = 0; i < count; ++i) {
semaphores.push_back(core::device().createSemaphore({}));
semaphores.push_back(core::device().createSemaphoreUnique({}));
}
return semaphores;
}

Renderer::Renderer():
_commandBuffer(createCommandBuffer()),
_semaphoreForImageEnabled(core::device().createSemaphore({})),
_semaphoreForImageEnabled(core::device().createSemaphoreUnique({})),
_semaphoreForRenderFinisheds(createSemaphores()),
_frameInFlightFence(core::device().createFence({vk::FenceCreateFlagBits::eSignaled}))
_frameInFlightFence(core::device().createFenceUnique({vk::FenceCreateFlagBits::eSignaled}))
{}

Renderer::~Renderer() {
core::device().destroy(_frameInFlightFence);
for (const auto &n: _semaphoreForRenderFinisheds) {
core::device().destroy(n);
}
core::device().destroy(_semaphoreForImageEnabled);
}

void Renderer::begin() {
_context.reset();

const auto index = window::swapchain().acquireNextImageIndex(_semaphoreForImageEnabled);
const auto index = window::swapchain().acquireNextImageIndex(_semaphoreForImageEnabled.get());

_commandBuffer.reset();
_commandBuffer->reset();
const auto cbi = vk::CommandBufferBeginInfo()
.setFlags(vk::CommandBufferUsageFlagBits::eOneTimeSubmit);
_commandBuffer.begin(cbi);
_commandBuffer->begin(cbi);

_context.emplace(index, _commandBuffer);
_context.emplace(index, _commandBuffer.get());
}

void Renderer::end() {
Expand All @@ -59,9 +55,9 @@ void Renderer::end() {
}
// TODO: レンダーパス終了忘れも検知したい。

_commandBuffer.end();
_commandBuffer->end();

core::device().resetFences({_frameInFlightFence});
core::device().resetFences({_frameInFlightFence.get()});

const vk::PipelineStageFlags waitStage = vk::PipelineStageFlagBits::eColorAttachmentOutput;
const auto &semaphore = error::at(
Expand All @@ -70,16 +66,16 @@ void Renderer::end() {
"semaphores for waiting for rendering finished"
);
const auto si = vk::SubmitInfo()
.setWaitSemaphores({_semaphoreForImageEnabled})
.setWaitSemaphores({_semaphoreForImageEnabled.get()})
.setWaitDstStageMask({waitStage})
.setCommandBuffers({_commandBuffer})
.setSignalSemaphores({semaphore});
core::queue().submit(si, _frameInFlightFence);
.setCommandBuffers({_commandBuffer.get()})
.setSignalSemaphores({semaphore.get()});
core::queue().submit(si, _frameInFlightFence.get());

window::swapchain().present(semaphore, _context->currentIndex());
window::swapchain().present(semaphore.get(), _context->currentIndex());

// 前のフレームのGPU処理が完全に終了するまで待機
if (core::device().waitForFences({_frameInFlightFence}, VK_TRUE, UINT64_MAX) != vk::Result::eSuccess) {
if (core::device().waitForFences({_frameInFlightFence.get()}, VK_TRUE, UINT64_MAX) != vk::Result::eSuccess) {
throw "failed to wait for rendering comletion.";
}

Expand All @@ -88,18 +84,16 @@ void Renderer::end() {
}

void Renderer::reset() {
_commandBuffer.reset();
_commandBuffer->reset();
_context.reset();
text::clearLayoutContext();
for (auto &n: _semaphoreForRenderFinisheds) {
core::device().destroySemaphore(n);
n = core::device().createSemaphore({});
n = core::device().createSemaphoreUnique({});
}
}

void Renderer::recreateSemaphoreForImageEnabled() {
core::device().destroy(_semaphoreForImageEnabled);
_semaphoreForImageEnabled = core::device().createSemaphore({});
_semaphoreForImageEnabled = core::device().createSemaphoreUnique({});
}

std::optional<Renderer> g_renderer;
Expand Down
9 changes: 4 additions & 5 deletions src/graphics/renderer/renderer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,21 @@ class Renderer {
private:
/// 描画処理コマンド用のコマンドバッファ
/// orgeは描画完了まで待機するので1個で十分
const vk::CommandBuffer _commandBuffer;
const vk::UniqueCommandBuffer _commandBuffer;
/// スワップチェインイメージ取得の完了を知るためのセマフォ
/// コマンドバッファ提出を待機させるために使う
vk::Semaphore _semaphoreForImageEnabled;
vk::UniqueSemaphore _semaphoreForImageEnabled;
/// コマンドバッファ実行の完了を知るためのセマフォ
/// プレゼンテーション開始を待機させるために使う
std::vector<vk::Semaphore> _semaphoreForRenderFinisheds;
std::vector<vk::UniqueSemaphore> _semaphoreForRenderFinisheds;
/// フレーム完了を監視するフェンス
/// 次フレーム開始前にGPU処理完了を待機するために使う
const vk::Fence _frameInFlightFence;
const vk::UniqueFence _frameInFlightFence;
/// レンダリング中の必要な情報をまとめたもの
std::optional<RenderContext> _context;

public:
Renderer();
~Renderer();

RenderContext &getContext() {
if (_context) {
Expand Down
9 changes: 6 additions & 3 deletions src/graphics/renderpass/framebuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@

namespace graphics::renderpass {

std::vector<vk::Framebuffer> createFramebuffers(const vk::RenderPass &renderPass, const std::string renderPassId) {
std::vector<vk::UniqueFramebuffer> createFramebuffers(
const vk::RenderPass &renderPass,
const std::string &renderPassId
) {
const auto &swapchain = window::swapchain();

std::vector<vk::Framebuffer> framebuffers;
std::vector<vk::UniqueFramebuffer> framebuffers;
framebuffers.reserve(swapchain.getImages().size());

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

return framebuffers;
Expand Down
5 changes: 4 additions & 1 deletion src/graphics/renderpass/framebuffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

namespace graphics::renderpass {

std::vector<vk::Framebuffer> createFramebuffers(const vk::RenderPass &renderPass, const std::string renderPassId);
std::vector<vk::UniqueFramebuffer> createFramebuffers(
const vk::RenderPass &renderPass,
const std::string &renderPassId
);

} // namespace graphics::renderpass
Loading
Loading