Просмотр исходного кода

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.
ReinUsesLisp 5 лет назад
Родитель
Сommit
9e88ad8da9
1 измененных файлов с 6 добавлено и 6 удалено
  1. 6 6
      src/video_core/renderer_vulkan/vk_scheduler.h

+ 6 - 6
src/video_core/renderer_vulkan/vk_scheduler.h

@@ -6,10 +6,12 @@
 
 #include <atomic>
 #include <condition_variable>
+#include <cstddef>
 #include <memory>
 #include <stack>
 #include <thread>
 #include <utility>
+#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<T>;
             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<u8, 0x8000> data{};
+        size_t command_offset = 0;
+        alignas(std::max_align_t) std::array<u8, 0x8000> data{};
     };
 
     struct State {