5wgpu::Buffer Graphics::uploadSkinPalette(Mesh*
mesh) {
6 const bool skinned =
mesh &&
mesh->hasGpuSkinning() &&
mesh->getSkinPaletteCount() > 0;
7 const uint64_t
bytes = skinned ?
mesh->skinPalette().size() *
sizeof(float) : sizeof(glm::mat4);
9 if (device.GetLimits(&
limits) != wgpu::Status::Success ||
bytes >
limits.maxStorageBufferBindingSize)
10 throw Exception(
"Skin palette exceeds device maxStorageBufferBindingSize");
11 auto& arena = currentUboArena();
12 const size_t slot = arena.paletteIndex++;
13 if (arena.palettes.size() <= slot) arena.palettes.resize(slot + 1);
14 auto&
buffer = arena.palettes[slot];
16 wgpu::BufferDescriptor
desc{};
18 desc.usage = wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopyDst;
21 const glm::mat4 identity(1.f);
22 queue.WriteBuffer(
buffer, 0, skinned ?
mesh->skinPalette().data() : &identity[0][0],
bytes);
std::unique_ptr< gpgpu::GpuBuffer > buffer
const AssetImportLimits & limits