We be kinda rendering

This commit is contained in:
2026-01-05 06:20:49 +01:00
parent 1168f9e5d1
commit c83c423b42
48 changed files with 2789 additions and 382 deletions
@@ -0,0 +1,72 @@
#include <cassert>
#include <limits>
#include <destrum/Graphics/ImmediateExecuter.h>
#include <volk.h>
#include <destrum/Graphics/Init.h>
#include <destrum/Graphics/Util.h>
namespace
{
constexpr auto NO_TIMEOUT = std::numeric_limits<std::uint64_t>::max();
}
void VulkanImmediateExecutor::init(
VkDevice device,
std::uint32_t graphicsQueueFamily,
VkQueue graphicsQueue)
{
assert(!initialized);
this->device = device;
this->graphicsQueue = graphicsQueue;
const auto poolCreateInfo = vkinit::
commandPoolCreateInfo(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, graphicsQueueFamily);
VK_CHECK(vkCreateCommandPool(device, &poolCreateInfo, nullptr, &immCommandPool));
const auto cmdAllocInfo = vkinit::commandBufferAllocateInfo(immCommandPool, 1);
VK_CHECK(vkAllocateCommandBuffers(device, &cmdAllocInfo, &immCommandBuffer));
constexpr auto fenceCreateInfo = VkFenceCreateInfo{
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
.flags = VK_FENCE_CREATE_SIGNALED_BIT,
};
VK_CHECK(vkCreateFence(device, &fenceCreateInfo, nullptr, &immFence));
initialized = true;
}
void VulkanImmediateExecutor::cleanup(VkDevice device)
{
assert(initialized);
vkDestroyCommandPool(device, immCommandPool, nullptr);
vkDestroyFence(device, immFence, nullptr);
}
void VulkanImmediateExecutor::immediateSubmit(
std::function<void(VkCommandBuffer cmd)>&& function) const
{
assert(initialized);
VK_CHECK(vkResetFences(device, 1, &immFence));
VK_CHECK(vkResetCommandBuffer(immCommandBuffer, 0));
auto cmd = immCommandBuffer;
const auto cmdBeginInfo = VkCommandBufferBeginInfo{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
};
VK_CHECK(vkBeginCommandBuffer(cmd, &cmdBeginInfo));
function(cmd);
VK_CHECK(vkEndCommandBuffer(cmd));
const auto cmdinfo = vkinit::commandBufferSubmitInfo(cmd);
const auto submit = vkinit::submitInfo(&cmdinfo, nullptr, nullptr);
VK_CHECK(vkQueueSubmit2(graphicsQueue, 1, &submit, immFence));
VK_CHECK(vkWaitForFences(device, 1, &immFence, true, NO_TIMEOUT));
}