Make sure to object are aligned properly when allocated in the renderstream

fix #4991
This commit is contained in:
Mathias Agopian
2022-01-07 10:49:12 -08:00
committed by Mathias Agopian
parent 9a8159ab04
commit 74ea3d50c2
3 changed files with 13 additions and 13 deletions
+1 -1
View File
@@ -203,7 +203,7 @@ void FScene::updateUBOs(utils::Range<uint32_t> 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<PerRenderableUib>(visibleRenderables.size());
bool hasContactShadows = false;
auto& sceneData = mRenderableData;
+9 -9
View File
@@ -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<PerRenderableUibBone>(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<backend::HwBufferObject> 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<PerRenderableUibBone>(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<backend::HwBufferObject> 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<PerRenderableUibBone>(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));
}
@@ -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<PerRenderableUibBone>(count);
std::uninitialized_fill_n(out, count, PerRenderableUibBone{});
driver.updateBufferObject(bones.handle, { out, size }, 0);
driver.updateBufferObject(bones.handle, {
out, count * sizeof(PerRenderableUibBone) }, 0);
}
}
}