7#include "gfx_pipeline_vulkan.hpp"
8#include "gfx_device_vulkan_impl.hpp"
9#include "gfx_surface_vulkan.hpp"
10#include "../telemetry/telemetry.hpp"
11#include "../macros.hpp"
15namespace hi {
inline namespace v1 {
17[[nodiscard]]
inline gfx_device *gfx_pipeline::device() const noexcept
19 hi_axiom_not_null(surface);
20 return surface->device();
23inline void gfx_pipeline::draw_in_command_buffer(vk::CommandBuffer commandBuffer,
draw_context const& context)
25 commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, intrinsic);
28 if (descriptorSetVersion < getDescriptorSetVersion()) {
29 descriptorSetVersion = getDescriptorSetVersion();
31 hi_axiom_not_null(device());
32 device()->updateDescriptorSets(createWriteDescriptorSet(), {});
35 commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, {descriptorSet}, {});
39inline void gfx_pipeline::build_descriptor_sets()
41 hilet descriptorSetLayoutBindings = createDescriptorSetLayoutBindings();
43 if (ssize(descriptorSetLayoutBindings) == 0) {
45 descriptorSet =
nullptr;
49 hilet descriptorSetLayoutCreateInfo = vk::DescriptorSetLayoutCreateInfo{
50 vk::DescriptorSetLayoutCreateFlags(),
52 descriptorSetLayoutBindings.data()};
54 hi_axiom_not_null(device());
55 descriptorSetLayout = device()->createDescriptorSetLayout(descriptorSetLayoutCreateInfo);
57 hilet descriptorPoolSizes =
58 transform<std::vector<vk::DescriptorPoolSize>>(descriptorSetLayoutBindings, [](
auto x) -> vk::DescriptorPoolSize {
62 descriptorPool = device()->createDescriptorPool(
63 {vk::DescriptorPoolCreateFlags(),
66 descriptorPoolSizes.data()});
68 hilet descriptorSetLayouts = std::array{descriptorSetLayout};
70 hilet descriptorSets = device()->allocateDescriptorSets(
73 descriptorSet = descriptorSets.at(0);
74 descriptorSetVersion = 0;
77inline void gfx_pipeline::teardown_descriptor_sets()
83 hi_axiom_not_null(device());
84 device()->destroy(descriptorPool);
85 device()->destroy(descriptorSetLayout);
86 descriptorSet =
nullptr;
89inline vk::PipelineDepthStencilStateCreateInfo gfx_pipeline::getPipelineDepthStencilStateCreateInfo()
const
93 vk::PipelineDepthStencilStateCreateFlags(),
96 vk::CompareOp::eGreaterOrEqual,
100 vk::StencilOpState(),
108inline std::vector<vk::PipelineColorBlendAttachmentState> gfx_pipeline::getPipelineColorBlendAttachmentStates()
const
112 vk::BlendFactor::eOne,
113 vk::BlendFactor::eOneMinusSrcAlpha,
115 vk::BlendFactor::eOne,
116 vk::BlendFactor::eOneMinusSrcAlpha,
118 vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB |
119 vk::ColorComponentFlagBits::eA}};
122inline void gfx_pipeline::build_pipeline(vk::RenderPass renderPass, uint32_t renderSubpass, vk::Extent2D _extent)
124 hi_log_info(
"buildPipeline previous size ({}, {})", extent.width, extent.height);
127 const auto pushConstantRanges = createPushConstantRanges();
128 const auto vertexInputBindingDescription = createVertexInputBindingDescription();
129 const auto vertexInputAttributeDescriptions = createVertexInputAttributeDescriptions();
130 const auto shaderStages = createShaderStages();
132 std::vector<vk::DescriptorSetLayout> descriptorSetLayouts;
134 descriptorSetLayouts.
push_back(descriptorSetLayout);
137 hi_axiom_not_null(device());
138 pipelineLayout = device()->createPipelineLayout(
139 {vk::PipelineLayoutCreateFlags(),
141 descriptorSetLayouts.
data(),
143 pushConstantRanges.data()});
145 const vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = {
146 vk::PipelineVertexInputStateCreateFlags(),
148 &vertexInputBindingDescription,
150 vertexInputAttributeDescriptions.data()};
152 const vk::PipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo = {
153 vk::PipelineInputAssemblyStateCreateFlags(), vk::PrimitiveTopology::eTriangleList, VK_FALSE};
155 const std::array<vk::Viewport, 1> viewports = {vk::Viewport{
164 hilet scissor = vk::Rect2D{vk::Offset2D{0, 0}, extent};
166 hilet scissors = std::array{scissor};
168 const vk::PipelineViewportStateCreateInfo pipelineViewportStateCreateInfo = {
169 vk::PipelineViewportStateCreateFlags(),
175 const vk::PipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo = {
176 vk::PipelineRasterizationStateCreateFlags(),
179 vk::PolygonMode::eFill,
180 vk::CullModeFlagBits::eBack,
181 vk::FrontFace::eCounterClockwise,
189 const vk::PipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo = {
190 vk::PipelineMultisampleStateCreateFlags(),
191 vk::SampleCountFlagBits::e1,
199 hilet pipelineDepthStencilStateCreateInfo = getPipelineDepthStencilStateCreateInfo();
203 hilet pipelineColorBlendAttachmentStates = getPipelineColorBlendAttachmentStates();
205 const vk::PipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo = {
206 vk::PipelineColorBlendStateCreateFlags(),
210 pipelineColorBlendAttachmentStates.data()};
212 hilet dynamicStates = std::array{vk::DynamicState::eScissor};
214 hilet pipelineDynamicStateInfo = vk::PipelineDynamicStateCreateInfo{
215 vk::PipelineDynamicStateCreateFlags(),
narrow_cast<uint32_t>(dynamicStates.size()), dynamicStates.data()};
217 const vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo = {
218 vk::PipelineCreateFlags(),
221 &pipelineVertexInputStateCreateInfo,
222 &pipelineInputAssemblyStateCreateInfo,
224 &pipelineViewportStateCreateInfo,
225 &pipelineRasterizationStateCreateInfo,
226 &pipelineMultisampleStateCreateInfo,
227 &pipelineDepthStencilStateCreateInfo,
228 &pipelineColorBlendStateCreateInfo,
229 &pipelineDynamicStateInfo,
237 hi_axiom_not_null(device());
238 intrinsic = device()->createGraphicsPipeline(vk::PipelineCache(), graphicsPipelineCreateInfo);
239 hi_log_info(
"/buildPipeline new size ({}, {})", extent.width, extent.height);
242inline void gfx_pipeline::teardown_pipeline()
244 hi_axiom_not_null(device());
245 device()->destroy(intrinsic);
246 device()->destroy(pipelineLayout);
249inline void gfx_pipeline::build_for_new_device()
251 build_vertex_buffers();
254inline void gfx_pipeline::teardown_for_device_lost()
256 teardown_vertex_buffers();
259inline void gfx_pipeline::build_for_new_swapchain(vk::RenderPass renderPass, uint32_t renderSubpass, vk::Extent2D _extent)
263 build_descriptor_sets();
264 build_pipeline(renderPass, renderSubpass, _extent);
267inline void gfx_pipeline::teardown_for_swapchain_lost()
270 teardown_descriptor_sets();
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
The HikoGUI API version 1.
Definition lookahead_iterator.hpp:6
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
Draw context for drawing using the HikoGUI shaders.
Definition draw_context.hpp:208