|
| 1 | +#include <svector.h> |
| 2 | + |
1 | 3 | #include <cage-core/assetsManager.h> |
2 | 4 | #include <cage-core/concurrent.h> |
3 | 5 | #include <cage-core/hashString.h> |
@@ -56,7 +58,7 @@ namespace cage |
56 | 58 |
|
57 | 59 | wgpu::BindGroupLayout createLayout(GraphicsDevice *device, const BindingsCreateConfig &config) |
58 | 60 | { |
59 | | - std::vector<wgpu::BindGroupLayoutEntry> entries; |
| 61 | + ankerl::svector<wgpu::BindGroupLayoutEntry, 10> entries; |
60 | 62 | entries.reserve(config.buffers.size() + config.textures.size() * 2); |
61 | 63 |
|
62 | 64 | for (const auto &b : config.buffers) |
@@ -114,7 +116,7 @@ namespace cage |
114 | 116 |
|
115 | 117 | wgpu::BindGroup createGroup(GraphicsDevice *device, const wgpu::BindGroupLayout &layout, const BindingsCreateConfig &config) |
116 | 118 | { |
117 | | - std::vector<wgpu::BindGroupEntry> entries; |
| 119 | + ankerl::svector<wgpu::BindGroupEntry, 10> entries; |
118 | 120 | entries.reserve(config.buffers.size() + config.textures.size() * 2); |
119 | 121 |
|
120 | 122 | for (const auto &b : config.buffers) |
@@ -164,18 +166,26 @@ namespace cage |
164 | 166 |
|
165 | 167 | struct Key |
166 | 168 | { |
167 | | - std::vector<uint32> keys; |
| 169 | + ankerl::svector<uint32, 5> keys; |
168 | 170 |
|
169 | 171 | std::size_t hash = 0; |
170 | 172 |
|
171 | 173 | Key(const BindingsCreateConfig &config) |
172 | 174 | { |
173 | 175 | keys.reserve(config.buffers.size() + 1 + config.textures.size()); |
174 | 176 | for (const auto &b : config.buffers) |
175 | | - keys.push_back(b.binding + (b.dynamic * (1u << 10)) + (b.buffer->type() << 11)); |
| 177 | + { |
| 178 | + const uint32 dyn = (uint32)b.dynamic << 10; |
| 179 | + const uint32 type = (uint32)b.buffer->type() << 11; |
| 180 | + keys.push_back(b.binding + dyn + type); |
| 181 | + } |
176 | 182 | keys.push_back(75431564); // separator |
177 | 183 | for (const auto &t : config.textures) |
178 | | - keys.push_back(t.binding + ((uint32)t.texture->flags << 10)); |
| 184 | + { |
| 185 | + const uint32 filterable = (uint32)isFormatFilterable(t.texture->nativeTexture().GetFormat()) << 10; |
| 186 | + const uint32 flags = (uint32)t.texture->flags << 11; |
| 187 | + keys.push_back(t.binding + filterable + flags); |
| 188 | + } |
179 | 189 |
|
180 | 190 | auto hashCombine = [&](std::unsigned_integral auto v) { hash ^= std::hash<std::decay_t<decltype(v)>>{}(v) + 0x9e3779b9 + (hash << 6) + (hash >> 2); }; |
181 | 191 | for (uint32 k : keys) |
|
0 commit comments