Refactor UniformBuffers and DescriptorSets

- Refactor UniformBuffers to keep track of the uniforms it contains
- Refactor DescriptorSets to initialize UniformsBuffers and keep track
  of all its bindings
- DescriptorSets can now be created from the Pipeline
- Add custom DescriptorSets to Renderer
This commit is contained in:
Thraix
2023-03-24 22:27:03 +01:00
parent fbf53234f3
commit 9faec15fd6
22 changed files with 469 additions and 173 deletions
@@ -0,0 +1,108 @@
#include "copium/pipeline/ShaderBinding.h"
#include "copium/util/Common.h"
namespace Copium
{
bool ShaderBinding::operator<(const ShaderBinding& rhs) const
{
if (set != rhs.set)
return set < rhs.set;
return binding < rhs.binding;
}
uint32_t ShaderBinding::GetUniformOffset(const std::string& uniform) const
{
// TODO: Caching?
uint32_t offset = 0;
for (auto& uniformElem : uniforms)
{
if (uniformElem.second == uniform)
return offset;
offset += GetUniformTypeOffset(uniformElem.first);
}
CP_ABORT("GetUniformOffset : Uniform not found=%s", uniform);
}
uint32_t ShaderBinding::GetUniformSize(const std::string& uniform) const
{
for (auto& uniformElem : uniforms)
{
if (uniformElem.second == uniform)
return GetUniformTypeSize(uniformElem.first);
}
CP_ABORT("GetUniformSize : Uniform not found=%s", uniform);
}
UniformType ShaderBinding::GetUniformType(const std::string& uniform) const
{
for (auto& uniformElem : uniforms)
{
if (uniformElem.second == uniform)
return uniformElem.first;
}
CP_ABORT("GetUniformType : Uniform not found=%s", uniform);
}
uint32_t ShaderBinding::GetUniformBufferSize() const
{
CP_ASSERT(bindingType == BindingType::UniformBuffer, "GetUniformBufferSize : BindingType is not UniformBuffer");
uint32_t size = 0;
for (auto& uniform : uniforms)
{
size += GetUniformTypeOffset(uniform.first);
}
// alignas(64)
if (size % 64 != 0)
size += 64 - (size % 64);
return size;
}
uint32_t ShaderBinding::GetUniformTypeSize(UniformType type) const
{
switch (type)
{
case UniformType::Mat3:
return 4 * 9; // glm::mat3
case UniformType::Mat4:
return 4 * 16; // glm::mat4
case UniformType::Vec2:
return 4 * 2; // glm::vec2
case UniformType::Vec3:
return 4 * 3; // glm::vec3
case UniformType::Vec4:
return 4 * 4; // glm::vec4
case UniformType::Int:
return 4; // int
case UniformType::Float:
return 4; // float
default:
CP_ABORT("GetUniformBufferSize : Unhandled switch case");
}
}
uint32_t ShaderBinding::GetUniformTypeOffset(UniformType type) const
{
switch (type)
{
case UniformType::Mat3:
return 64; // alignas(16) glm::mat3
case UniformType::Mat4:
return 64; // alignas(16) glm::mat4
case UniformType::Vec2:
return 16; // alignas(16) glm::vec2
case UniformType::Vec3:
return 16; // alignas(16) glm::vec2
case UniformType::Vec4:
return 16; // alignas(16) glm::vec2
case UniformType::Int:
return 16; // alignas(16) glm::vec2
case UniformType::Float:
return 16; // alignas(16) glm::vec2
default:
CP_ABORT("GetUniformBufferSize : Unhandled switch case");
}
}
}