forked from Shell4026/ShellEngine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVulkanUniformBuffer.cpp
More file actions
100 lines (88 loc) · 3.18 KB
/
Copy pathVulkanUniformBuffer.cpp
File metadata and controls
100 lines (88 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "PCH.h"
#include "VulkanUniformBuffer.h"
#include "VulkanDescriptorPool.h"
#include "VulkanRenderer.h"
#include "VulkanShader.h"
#include "VulkanBuffer.h"
#include "VulkanTextureBuffer.h"
#include "Core/Logger.h"
#include <algorithm>
namespace sh::render::vk
{
VulkanUniformBuffer::VulkanUniformBuffer() :
renderer(nullptr),
descSet(nullptr)
{
}
VulkanUniformBuffer::VulkanUniformBuffer(VulkanUniformBuffer&& other) noexcept :
renderer(other.renderer),
descSet(other.descSet)
{
other.renderer = nullptr;
other.descSet = nullptr;
}
VulkanUniformBuffer::~VulkanUniformBuffer()
{
Clean();
}
void VulkanUniformBuffer::Create(const Renderer& renderer, const Shader& shader, uint32_t type)
{
Clean();
auto& vkRenderer = static_cast<const VulkanRenderer&>(renderer);
this->renderer = &vkRenderer;
auto& vkShader = static_cast<const VulkanShader&>(shader);
descSet = vkRenderer.GetDescriptorPool().AllocateDescriptorSet(vkShader.GetDescriptorSetLayout(type), 1);
}
void VulkanUniformBuffer::Clean()
{
if (descSet && renderer)
{
renderer->GetDescriptorPool().FreeDescriptorSet(descSet);
}
}
void VulkanUniformBuffer::Update(uint32_t binding, const IBuffer& buffer)
{
if (renderer == nullptr || descSet == nullptr)
return;
auto& vkBuffer = static_cast<const VulkanBuffer&>(buffer);
VkDescriptorBufferInfo bufferInfo{};
bufferInfo.buffer = vkBuffer.GetBuffer();
bufferInfo.offset = 0;
bufferInfo.range = vkBuffer.GetSize();
VkWriteDescriptorSet descriptorWrite{};
descriptorWrite.sType = VkStructureType::VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descriptorWrite.dstSet = descSet;
descriptorWrite.dstBinding = binding;
descriptorWrite.dstArrayElement = 0;
descriptorWrite.descriptorType = VkDescriptorType::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
descriptorWrite.descriptorCount = 1;
descriptorWrite.pBufferInfo = &bufferInfo;
descriptorWrite.pImageInfo = nullptr;
descriptorWrite.pTexelBufferView = nullptr;
vkUpdateDescriptorSets(renderer->GetDevice(), 1, &descriptorWrite, 0, nullptr);
}
void VulkanUniformBuffer::Update(uint32_t binding, const Texture& texture)
{
if (renderer == nullptr || descSet == nullptr)
return;
VkDescriptorImageInfo imgInfo{};
imgInfo.imageLayout = VkImageLayout::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imgInfo.imageView = static_cast<VulkanTextureBuffer*>(texture.GetBuffer())->GetImageBuffer()->GetImageView();
imgInfo.sampler = static_cast<VulkanTextureBuffer*>(texture.GetBuffer())->GetImageBuffer()->GetSampler();
VkWriteDescriptorSet descriptorWrite{};
descriptorWrite.sType = VkStructureType::VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descriptorWrite.dstSet = descSet;
descriptorWrite.dstBinding = binding;
descriptorWrite.dstArrayElement = 0;
descriptorWrite.descriptorType = VkDescriptorType::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
descriptorWrite.descriptorCount = 1;
descriptorWrite.pBufferInfo = nullptr;
descriptorWrite.pImageInfo = &imgInfo;
descriptorWrite.pTexelBufferView = nullptr;
vkUpdateDescriptorSets(renderer->GetDevice(), 1, &descriptorWrite, 0, nullptr);
}
auto VulkanUniformBuffer::GetVkDescriptorSet() const -> VkDescriptorSet
{
return descSet;
}
}//namespace