diff --git a/filament/src/Scene.cpp b/filament/src/Scene.cpp index e17400af84..d5cca3c3c2 100644 --- a/filament/src/Scene.cpp +++ b/filament/src/Scene.cpp @@ -203,7 +203,7 @@ void FScene::updateUBOs(utils::Range visibleRenderables, backend::Hand const size_t size = visibleRenderables.size() * sizeof(PerRenderableUib); // allocate space into the command stream directly - void* const buffer = driver.allocate(size); + void* const buffer = driver.allocatePod(visibleRenderables.size()); bool hasContactShadows = false; auto& sceneData = mRenderableData; diff --git a/filament/src/SkinningBuffer.cpp b/filament/src/SkinningBuffer.cpp index 58e757f2c0..5dc879ac5a 100644 --- a/filament/src/SkinningBuffer.cpp +++ b/filament/src/SkinningBuffer.cpp @@ -78,10 +78,10 @@ FSkinningBuffer::FSkinningBuffer(FEngine& engine, const Builder& builder) if (builder->mInitialize) { // initialize the bones to identity (before rounding up) - size_t size = mBoneCount * sizeof(PerRenderableUibBone); - auto* out = (PerRenderableUibBone*)driver.allocate(size); + auto* out = driver.allocatePod(mBoneCount); std::uninitialized_fill_n(out, mBoneCount, PerRenderableUibBone{}); - driver.updateBufferObject(mHandle, { out, size }, 0); + driver.updateBufferObject(mHandle, { + out, mBoneCount * sizeof(PerRenderableUibBone) }, 0); } } @@ -119,15 +119,15 @@ static uint32_t packHalf2x16(half2 v) noexcept { void FSkinningBuffer::setBones(FEngine& engine, Handle handle, RenderableManager::Bone const* transforms, size_t boneCount, size_t offset) noexcept { auto& driverApi = engine.getDriverApi(); - size_t size = boneCount * sizeof(PerRenderableUibBone); - PerRenderableUibBone* UTILS_RESTRICT out = (PerRenderableUibBone*)driverApi.allocate(size); + PerRenderableUibBone* UTILS_RESTRICT out = driverApi.allocatePod(boneCount); for (size_t i = 0, c = boneCount; i < c; ++i) { // the transform is stored in row-major, last row is not stored. mat4f transform(transforms[i].unitQuaternion); transform[3] = float4{ transforms[i].translation, 1.0f }; out[i] = makeBone(transform); } - driverApi.updateBufferObject(handle, { out, size }, + driverApi.updateBufferObject(handle, { + out, boneCount * sizeof(PerRenderableUibBone) }, offset * sizeof(PerRenderableUibBone)); } @@ -155,13 +155,13 @@ PerRenderableUibBone FSkinningBuffer::makeBone(mat4f transform) noexcept { void FSkinningBuffer::setBones(FEngine& engine, Handle handle, mat4f const* transforms, size_t boneCount, size_t offset) noexcept { auto& driverApi = engine.getDriverApi(); - size_t size = boneCount * sizeof(PerRenderableUibBone); - PerRenderableUibBone* UTILS_RESTRICT out = (PerRenderableUibBone*)driverApi.allocate(size); + PerRenderableUibBone* UTILS_RESTRICT out = driverApi.allocatePod(boneCount); for (size_t i = 0, c = boneCount; i < c; ++i) { // the transform is stored in row-major, last row is not stored. out[i] = makeBone(transforms[i]); } - driverApi.updateBufferObject(handle, { out, size }, + driverApi.updateBufferObject(handle, { + out, boneCount * sizeof(PerRenderableUibBone) }, offset * sizeof(PerRenderableUibBone)); } diff --git a/filament/src/components/RenderableManager.cpp b/filament/src/components/RenderableManager.cpp index ddd17662a5..7208771bb6 100644 --- a/filament/src/components/RenderableManager.cpp +++ b/filament/src/components/RenderableManager.cpp @@ -364,10 +364,10 @@ void FRenderableManager::create( builder->mUserBoneMatrices, count, 0); } else { // initialize the bones to identity - size_t size = count * sizeof(PerRenderableUibBone); - auto* out = (PerRenderableUibBone*)driver.allocate(size); + auto* out = driver.allocatePod(count); std::uninitialized_fill_n(out, count, PerRenderableUibBone{}); - driver.updateBufferObject(bones.handle, { out, size }, 0); + driver.updateBufferObject(bones.handle, { + out, count * sizeof(PerRenderableUibBone) }, 0); } } }