-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathUniformStructLayout.cpp
More file actions
50 lines (46 loc) · 1.58 KB
/
Copy pathUniformStructLayout.cpp
File metadata and controls
50 lines (46 loc) · 1.58 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
#include "UniformStructLayout.h"
namespace sh::render
{
static auto DefaultLayoutForKind(UniformStructLayout::Kind kind) -> UniformStructLayout::Layout
{
return (kind == UniformStructLayout::Kind::Storage)
? UniformStructLayout::Layout::STD430
: UniformStructLayout::Layout::STD140;
}
UniformStructLayout::UniformStructLayout(std::string name, uint32_t binding, Usage usage, ShaderStage stage, Kind kind) :
kind(kind), layout(DefaultLayoutForKind(kind)),
usage(usage), stage(stage), binding(binding), name(std::move(name))
{
}
UniformStructLayout::UniformStructLayout(std::string name, uint32_t binding, Usage usage, ShaderStage stage, Kind kind, Layout layout) :
kind(kind), layout(layout),
usage(usage), stage(stage), binding(binding), name(std::move(name))
{
}
SH_RENDER_API auto UniformStructLayout::GetMember(const std::string& name) const -> const UniformMember*
{
for (const UniformMember& member : members)
{
if (member.name == name)
return &member;
}
return nullptr;
}
SH_RENDER_API auto UniformStructLayout::HasMember(const std::string& name) const -> bool
{
return GetMember(name) != nullptr;
}
SH_RENDER_API auto UniformStructLayout::GetSize() const -> std::size_t
{
if (members.empty())
return 0;
const UniformMember& last = members.back();
const uint32_t rawSize = last.offset + last.layoutSize;
uint32_t maxAlignment = 0;
for (const UniformMember& m : members)
maxAlignment = std::max(maxAlignment, m.baseAlignment);
if (maxAlignment == 0)
return rawSize;
return core::Util::AlignTo(rawSize, maxAlignment);
}
}//namespace