wren
Vulkan-based game engine
Loading...
Searching...
No Matches
reflect.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <boost/describe.hpp>
5#include <cstdint>
6#include <map>
7#include <ranges>
8#include <span>
9#include <spirv/unified1/spirv.hpp>
10#include <string>
11#include <vector>
12
14
15namespace r = std::ranges;
16namespace rv = std::views;
17
18namespace spv {
19BOOST_DESCRIBE_ENUM(StorageClass, StorageClassAtomicCounter)
20BOOST_DESCRIBE_ENUM(Op, OpCapability, OpDecorate, OpEntryPoint, OpName,
21 OpTypeInt, OpTypeFloat, OpTypeVector, OpTypePointer,
22 OpVariable)
23} // namespace spv
24
25namespace wren::reflect {
26
27struct EntryPoint {
28 std::string name;
29 spv::ExecutionModel execution_model;
30 uint32_t entry_point;
31
32 std::vector<uint32_t> forward_references;
33};
34
35struct Variable {
36 std::string name;
37 spv::StorageClass storage_class;
38 uint32_t location;
39 uint32_t width = UINT32_MAX;
40 uint32_t format = UINT32_MAX; // TODO(tyler) This needs updating for textures
41
42 auto operator==(const Variable&) const -> bool = default;
43 auto operator!=(const Variable&) const -> bool = default;
44};
46 (name, storage_class, location, width, format))
47
48BOOST_DEFINE_ENUM_CLASS(TypeType, Float, Vector);
49
50struct SimpleType {
51 uint32_t width;
52};
53
54struct Vector {
56 uint32_t count;
57};
58
59struct Annotation {
60 spv::Decoration decoration = spv::Decoration::DecorationMax;
61 std::optional<uint32_t> location;
62 std::optional<uint32_t> binding;
63 std::optional<uint32_t> descriptor_set;
64};
65
66struct Binding {
67 uint32_t binding;
69 uint32_t count;
70 auto operator==(const Binding&) const -> bool = default;
71};
72
73BOOST_DESCRIBE_STRUCT(Binding, (), (binding, descriptor_type, count));
74
76 std::vector<Binding> bindings;
77 auto operator==(const DescriptorSet&) const -> bool = default;
78};
80
81class Reflect {
82 public:
83 Reflect() = default;
84 Reflect(const std::span<const std::byte>& spirv);
85
86 [[nodiscard]] auto magic_number() const { return magic_number_; }
87
88 [[nodiscard]] auto entry_points() const { return entry_points_; }
89
90 [[nodiscard]] auto input_variables() const -> std::vector<Variable> {
91 return variables_ | rv::filter([](const auto& id_v) {
92 const auto& [_, v] = id_v;
93 return v.storage_class == spv::StorageClass::StorageClassInput;
94 }) |
95 rv::transform([](const auto& id_v) { return id_v.second; }) |
96 r::to<std::vector>();
97 }
98
100 spv::ExecutionModel entry_point_type) const -> std::vector<Variable> {
101 const auto& entry_point =
102 r::find_if(entry_points_, [&](const EntryPoint& e) {
103 return e.execution_model == entry_point_type;
104 });
105
106 return variables_ | rv::filter([entry_point](const auto& id_v) {
107 const auto& [id, v] = id_v;
108 return r::contains(entry_point->forward_references, id) &&
109 v.storage_class == spv::StorageClass::StorageClassInput;
110 }) |
111 rv::transform([](const auto& id_v) { return id_v.second; }) |
112 r::to<std::vector>();
113 }
114
115 [[nodiscard]] auto descriptor_sets() const -> std::vector<DescriptorSet> {
116 return descriptor_sets_ |
117 rv::transform([](const auto& ds) { return ds.second; }) |
118 r::to<std::vector>();
119 }
120
121 private:
122 void resolve();
123 auto parse_op_code(utils::BinaryReader& reader, uint32_t wordcount,
124 const spv::Op& opcode) -> uint32_t;
125
126 uint32_t magic_number_{};
127 uint32_t version_{};
128 uint32_t generator_{};
129 uint32_t bound_{};
130
131 std::vector<EntryPoint> entry_points_;
132 std::map<uint32_t, Variable> variables_;
133 std::map<uint32_t, DescriptorSet> descriptor_sets_;
134
135 std::map<uint32_t, std::vector<Annotation>> annotations_;
136 std::map<uint32_t, SimpleType> types_;
137
138 std::map<uint32_t, std::string> names_;
139};
140
141} // namespace wren::reflect
void resolve()
Definition reflect.cpp:44
auto input_variables_for_entry_point(spv::ExecutionModel entry_point_type) const -> std::vector< Variable >
Definition reflect.hpp:99
std::map< uint32_t, DescriptorSet > descriptor_sets_
Definition reflect.hpp:133
auto entry_points() const
Definition reflect.hpp:88
auto parse_op_code(utils::BinaryReader &reader, uint32_t wordcount, const spv::Op &opcode) -> uint32_t
Definition reflect.cpp:73
std::map< uint32_t, Variable > variables_
Definition reflect.hpp:132
auto input_variables() const -> std::vector< Variable >
Definition reflect.hpp:90
std::map< uint32_t, std::string > names_
Definition reflect.hpp:138
auto descriptor_sets() const -> std::vector< DescriptorSet >
Definition reflect.hpp:115
uint32_t magic_number_
Definition reflect.hpp:126
auto magic_number() const
Definition reflect.hpp:86
uint32_t version_
Definition reflect.hpp:127
uint32_t generator_
Definition reflect.hpp:128
std::vector< EntryPoint > entry_points_
Definition reflect.hpp:131
std::map< uint32_t, std::vector< Annotation > > annotations_
Definition reflect.hpp:135
std::map< uint32_t, SimpleType > types_
Definition reflect.hpp:136
uint32_t bound_
Definition reflect.hpp:129
Definition binary_reader.hpp:7
Definition reflect.hpp:18
Definition reflect.hpp:25
BOOST_DESCRIBE_STRUCT(Variable,(),(name, storage_class, location, width, format)) BOOST_DEFINE_ENUM_CLASS(TypeType
Float
Definition reflect.hpp:48
Definition reflect.hpp:59
std::optional< uint32_t > binding
Definition reflect.hpp:62
spv::Decoration decoration
Definition reflect.hpp:60
std::optional< uint32_t > descriptor_set
Definition reflect.hpp:63
std::optional< uint32_t > location
Definition reflect.hpp:61
Definition reflect.hpp:66
uint32_t count
Definition reflect.hpp:69
auto operator==(const Binding &) const -> bool=default
uint32_t binding
Definition reflect.hpp:67
uint32_t descriptor_type
Definition reflect.hpp:68
Definition reflect.hpp:75
std::vector< Binding > bindings
Definition reflect.hpp:76
auto operator==(const DescriptorSet &) const -> bool=default
Definition reflect.hpp:27
std::vector< uint32_t > forward_references
Definition reflect.hpp:32
std::string name
Definition reflect.hpp:28
spv::ExecutionModel execution_model
Definition reflect.hpp:29
uint32_t entry_point
Definition reflect.hpp:30
Definition reflect.hpp:50
uint32_t width
Definition reflect.hpp:51
Definition reflect.hpp:35
auto operator==(const Variable &) const -> bool=default
uint32_t format
Definition reflect.hpp:40
std::string name
Definition reflect.hpp:36
spv::StorageClass storage_class
Definition reflect.hpp:37
uint32_t width
Definition reflect.hpp:39
auto operator!=(const Variable &) const -> bool=default
uint32_t location
Definition reflect.hpp:38
Definition reflect.hpp:54
uint32_t count
Definition reflect.hpp:56
SimpleType type
Definition reflect.hpp:55