Toast Engine
Loading...
Searching...
No Matches
vulkan_common.hpp
1#pragma once
2
3#include "gpu_sync.hpp"
4
5#include <glm/glm.hpp>
6#include <mutex>
7#include <optional>
8#include <vector>
9#include <vulkan-memory-allocator-hpp/vk_mem_alloc_raii.hpp>
10#include <vulkan/vulkan.h>
11#include <vulkan/vulkan_raii.hpp>
12
14 std::optional<vma::raii::Buffer> staging_buffer;
15 std::optional<vma::raii::Buffer> gpu_buffer;
16 vk::raii::DescriptorSet descriptor_set = nullptr;
17};
18
19namespace renderer {
20
21struct ShGridKey {
22 glm::vec3 min_corner {0.0f};
23 glm::vec3 extents {0.0f};
24 glm::uvec3 counts {0};
25};
26
28inline constexpr vk::Format k_scene_normal_format = vk::Format::eR16G16B16A16Sfloat;
29
30inline constexpr vk::Format k_scene_indirect_format = vk::Format::eB10G11R11UfloatPack32;
31
33inline constexpr vk::Format k_scene_motion_format = vk::Format::eR16G16B16A16Sfloat;
34
36inline constexpr vk::Format k_voxel_albedo_format = vk::Format::eR8G8B8A8Srgb;
37
39inline constexpr vk::Format k_voxel_material_format = vk::Format::eR8G8B8A8Unorm;
40
42inline constexpr vk::Format k_voxel_face_normal_format = vk::Format::eA2B10G10R10UnormPack32;
43
45[[nodiscard]]
46inline auto worldStageExtraColorFormats() -> std::vector<vk::Format> {
47 return {k_scene_normal_format, k_scene_indirect_format, k_scene_motion_format};
48}
49
51[[nodiscard]]
52inline auto voxelGbufferExtraColorFormats() -> std::vector<vk::Format> {
53 return {k_voxel_face_normal_format, k_voxel_material_format, k_scene_motion_format};
54}
55
56[[nodiscard]]
57inline auto colorSubresourceRange() -> vk::ImageSubresourceRange {
58 return {vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1};
59}
60
62inline void submitAndWait(const vk::raii::Device& device, vk::Queue queue, std::mutex& queue_mutex, vk::CommandBuffer cmd) {
63 const vk::raii::Fence fence(device, vk::FenceCreateInfo {});
64
65 {
66 std::scoped_lock queue_lock(queue_mutex);
68 queue,
69 {
70 .commands = {&cmd, 1},
71 .fence = *fence
72 }
73 );
74 }
75
76 std::ignore = device.waitForFences(*fence, VK_TRUE, std::numeric_limits<uint64_t>::max());
77}
78
79inline void recordUndefinedToTransferDst(vk::CommandBuffer cmd, vk::Image image, const vk::ImageSubresourceRange& range) {
80 sync::transition(cmd, image, range, sync::Usage::none, sync::Usage::transfer_dst);
81}
82
83inline void recordTransferDstToShaderRead(vk::CommandBuffer cmd, vk::Image image, const vk::ImageSubresourceRange& range) {
84 sync::transition(cmd, image, range, sync::Usage::transfer_dst, sync::Usage::shader_sampled);
85}
86
87[[nodiscard]]
88inline auto linearClampSamplerInfo() -> vk::SamplerCreateInfo {
89 vk::SamplerCreateInfo sampler_ci {};
90 sampler_ci.magFilter = vk::Filter::eLinear;
91 sampler_ci.minFilter = vk::Filter::eLinear;
92 sampler_ci.addressModeU = vk::SamplerAddressMode::eClampToEdge;
93 sampler_ci.addressModeV = vk::SamplerAddressMode::eClampToEdge;
94 sampler_ci.addressModeW = vk::SamplerAddressMode::eClampToEdge;
95 sampler_ci.mipmapMode = vk::SamplerMipmapMode::eNearest;
96 return sampler_ci;
97}
98
99[[nodiscard]]
100inline auto nearestClampSamplerInfo() -> vk::SamplerCreateInfo {
101 auto sampler_ci = linearClampSamplerInfo();
102 sampler_ci.magFilter = vk::Filter::eNearest;
103 sampler_ci.minFilter = vk::Filter::eNearest;
104 return sampler_ci;
105}
106
107[[nodiscard]]
108inline auto linearClampMippedSamplerInfo(float max_lod) -> vk::SamplerCreateInfo {
109 auto sampler_ci = linearClampSamplerInfo();
110 sampler_ci.mipmapMode = vk::SamplerMipmapMode::eLinear;
111 sampler_ci.maxLod = max_lod;
112 return sampler_ci;
113}
114
115[[nodiscard]]
116inline auto colorTargetImageInfo(vk::Extent2D extent, vk::Format format, vk::ImageUsageFlags usage = {}) -> vk::ImageCreateInfo {
117 vk::ImageCreateInfo image_ci {};
118 image_ci.imageType = vk::ImageType::e2D;
119 image_ci.format = format;
120 image_ci.extent = vk::Extent3D {extent.width, extent.height, 1};
121 image_ci.mipLevels = 1;
122 image_ci.arrayLayers = 1;
123 image_ci.samples = vk::SampleCountFlagBits::e1;
124 image_ci.tiling = vk::ImageTiling::eOptimal;
125 image_ci.usage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled | usage;
126 image_ci.sharingMode = vk::SharingMode::eExclusive;
127 image_ci.initialLayout = vk::ImageLayout::eUndefined;
128 return image_ci;
129}
130
131}
void submit(vk::Queue queue, const SubmitDesc &desc)
The caller holds any lock the queue needs.
Definition gpu_sync.cpp:307
@ shader_sampled
Vertex fragment and compute.
Definition gpu_sync.hpp:29
@ none
Contents discarded and the layout undefined.
Definition gpu_sync.hpp:17
Definition vulkan_common.hpp:13
Definition vulkan_common.hpp:21