@@ -57,7 +57,7 @@ namespace Tkge::Graphics
57
57
}
58
58
59
59
UpdateInstances (instances);
60
- if (!WriteSets ()) { return ; }
60
+ if (!WriteSets (primitive. texture )) { return ; }
61
61
62
62
_renderPass->get_command_buffer ().setViewport (0 , _viewport);
63
63
@@ -74,16 +74,18 @@ namespace Tkge::Graphics
74
74
}
75
75
}
76
76
77
- bool Renderer::WriteSets () const
77
+ bool Renderer::WriteSets (const Texture* texture ) const
78
78
{
79
79
auto & renderDevice = _renderPass->get_render_device ();
80
+ if (texture == nullptr ) { texture = &_resourcePool->GetFallbackTexture (); }
80
81
81
82
const auto setLayouts = _resourcePool->SetLayouts ();
82
83
auto descriptorSets = std::array<vk::DescriptorSet, 1 >{};
83
84
KLIB_ASSERT (setLayouts.size () == descriptorSets.size ()); // expected set count will change until render flow is stable
84
85
if (!renderDevice.allocate_sets (descriptorSets, setLayouts)) { return false ; }
85
86
86
87
auto bufferInfos = klib::FlexArray<vk::DescriptorBufferInfo, 4 >{};
88
+ auto imageInfos = klib::FlexArray<vk::DescriptorImageInfo, 2 >{};
87
89
auto descriptorWrites = klib::FlexArray<vk::WriteDescriptorSet, 8 >{};
88
90
const auto pushBufferWrite = [&](vk::DescriptorSet set, std::uint32_t binding, const Buffer& buffer, const vk::DescriptorType type)
89
91
{
@@ -95,6 +97,18 @@ namespace Tkge::Graphics
95
97
descriptorWrites.push_back (wds);
96
98
};
97
99
100
+ const auto pushImageWrite = [&](vk::DescriptorSet set, std::uint32_t binding, const Texture& texture)
101
+ {
102
+ imageInfos.push_back ({});
103
+ auto & dii = imageInfos.back ();
104
+ dii.setImageView (texture.GetImage ().get_view ())
105
+ .setImageLayout (vk::ImageLayout::eShaderReadOnlyOptimal)
106
+ .setSampler (_resourcePool->GetSampler (texture.sampler ));
107
+ auto wds = vk::WriteDescriptorSet{};
108
+ wds.setImageInfo (dii).setDescriptorCount (1 ).setDescriptorType (vk::DescriptorType::eCombinedImageSampler).setDstSet (set).setDstBinding (binding);
109
+ descriptorWrites.push_back (wds);
110
+ };
111
+
98
112
auto & ubo00 = _resourcePool->AllocateBuffer (vk::BufferUsageFlagBits::eUniformBuffer, sizeof (glm::mat4));
99
113
const auto halfRenderArea = 0 .5f * glm::vec2{_viewport.width , -_viewport.height };
100
114
const auto matProj = glm::ortho (-halfRenderArea.x , halfRenderArea.x , -halfRenderArea.y , halfRenderArea.y );
@@ -107,6 +121,8 @@ namespace Tkge::Graphics
107
121
kvf::util::overwrite (ssbo01, instanceSpan);
108
122
pushBufferWrite (descriptorSets[0 ], 1 , ssbo01, vk::DescriptorType::eStorageBuffer);
109
123
124
+ pushImageWrite (descriptorSets[0 ], 2 , *texture);
125
+
110
126
const auto writeSpan = std::span{descriptorWrites.data (), descriptorWrites.size ()};
111
127
renderDevice.get_device ().updateDescriptorSets (writeSpan, {});
112
128
0 commit comments