From 9e88ad8da9c698f38e25e3d9b23feb19b30f68bd Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Wed, 27 Jan 2021 22:19:59 -0300 Subject: [PATCH] vk_scheduler: Fix unaligned placement new expressions We were accidentaly creating an object in an unaligned memory address. Fix this by manually aligning the offset. --- src/video_core/renderer_vulkan/vk_scheduler.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 4cd43e425..15f2987eb 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -6,10 +6,12 @@ #include #include +#include #include #include #include #include +#include "common/alignment.h" #include "common/common_types.h" #include "common/threadsafe_queue.h" #include "video_core/vulkan_common/vulkan_wrapper.h" @@ -130,12 +132,11 @@ private: using FuncType = TypedCommand; static_assert(sizeof(FuncType) < sizeof(data), "Lambda is too large"); + command_offset = Common::AlignUp(command_offset, alignof(FuncType)); if (command_offset > sizeof(data) - sizeof(FuncType)) { return false; } - - Command* current_last = last; - + Command* const current_last = last; last = new (data.data() + command_offset) FuncType(std::move(command)); if (current_last) { @@ -143,7 +144,6 @@ private: } else { first = last; } - command_offset += sizeof(FuncType); return true; } @@ -156,8 +156,8 @@ private: Command* first = nullptr; Command* last = nullptr; - std::size_t command_offset = 0; - std::array data{}; + size_t command_offset = 0; + alignas(std::max_align_t) std::array data{}; }; struct State {