1
1
#include < Tkge/Graphics/Renderer.hpp>
2
+ #include < glm/gtc/matrix_transform.hpp>
3
+ #include < klib/assert.hpp>
4
+ #include < klib/flex_array.hpp>
2
5
#include < kvf/render_device.hpp>
3
6
#include < kvf/util.hpp>
4
7
#include < algorithm>
@@ -9,6 +12,7 @@ namespace Tkge::Graphics
9
12
: _renderPass(renderPass), _resourcePool(resourcePool)
10
13
{
11
14
_renderPass->begin_render (commandBuffer, kvf::util::to_vk_extent (framebufferSize));
15
+ _viewport = _renderPass->to_viewport (kvf::uv_rect_v);
12
16
}
13
17
14
18
void Renderer::EndRender ()
@@ -52,9 +56,50 @@ namespace Tkge::Graphics
52
56
_renderPass->bind_pipeline (_pipeline);
53
57
}
54
58
59
+ if (!WriteSets ()) { return ; }
60
+
61
+ _renderPass->get_command_buffer ().setViewport (0 , _viewport);
62
+
55
63
BindVboAndDraw (primitive);
56
64
}
57
65
66
+ bool Renderer::WriteSets () const
67
+ {
68
+ auto & renderDevice = _renderPass->get_render_device ();
69
+
70
+ const auto setLayouts = _resourcePool->SetLayouts ();
71
+ auto descriptorSets = std::array<vk::DescriptorSet, 1 >{};
72
+ KLIB_ASSERT (setLayouts.size () == descriptorSets.size ()); // expected set count will change until render flow is stable
73
+ if (!renderDevice.allocate_sets (descriptorSets, setLayouts)) { return false ; }
74
+
75
+ auto bufferInfos = klib::FlexArray<vk::DescriptorBufferInfo, 4 >{};
76
+ auto descriptorWrites = klib::FlexArray<vk::WriteDescriptorSet, 8 >{};
77
+ const auto pushBufferWrite = [&](vk::DescriptorSet set, std::uint32_t binding, const Buffer& buffer, const vk::DescriptorType type)
78
+ {
79
+ bufferInfos.push_back ({});
80
+ auto & dbi = bufferInfos.back ();
81
+ dbi.setBuffer (buffer.get_buffer ()).setRange (buffer.get_size ());
82
+ auto wds = vk::WriteDescriptorSet{};
83
+ wds.setBufferInfo (dbi).setDescriptorCount (1 ).setDescriptorType (type).setDstSet (set).setDstBinding (binding);
84
+ descriptorWrites.push_back (wds);
85
+ };
86
+
87
+ auto & ubo00 = _resourcePool->AllocateBuffer (vk::BufferUsageFlagBits::eUniformBuffer, sizeof (glm::mat4));
88
+ const auto halfRenderArea = 0 .5f * glm::vec2{_viewport.width , -_viewport.height };
89
+ const auto matProj = glm::ortho (-halfRenderArea.x , halfRenderArea.x , -halfRenderArea.y , halfRenderArea.y );
90
+ const auto matVP = matProj * view.ToView ();
91
+ kvf::util::overwrite (ubo00, matVP);
92
+ pushBufferWrite (descriptorSets[0 ], 0 , ubo00, vk::DescriptorType::eUniformBuffer);
93
+
94
+ const auto writeSpan = std::span{descriptorWrites.data (), descriptorWrites.size ()};
95
+ renderDevice.get_device ().updateDescriptorSets (writeSpan, {});
96
+
97
+ const auto setSpan = std::span{descriptorSets.data (), descriptorSets.size ()};
98
+ _renderPass->get_command_buffer ().bindDescriptorSets (vk::PipelineBindPoint::eGraphics, _resourcePool->PipelineLayout (), 0 , setSpan, {});
99
+
100
+ return true ;
101
+ }
102
+
58
103
void Renderer::BindVboAndDraw (const Primitive& primitive) const
59
104
{
60
105
const auto vertSize = primitive.vertices .size_bytes ();
0 commit comments