diff options
author | benjaminwagner <benjaminwagner@google.com> | 2016-11-03 08:08:23 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-11-03 08:08:23 -0700 |
commit | dc46bf10ae380914a3f81053e5a60e9c28409ec4 (patch) | |
tree | 6deed66102c9d7f41eef9dfeec162edd3c7fd3ea | |
parent | e736e0c2d52a29a3b88a29ab39b3a90a5a2443a0 (diff) |
Revert of Try to use only std::aligned_storage. (patchset #2 id:20001 of https://codereview.chromium.org/2468243002/ )
Reason for revert:
DM failure: https://luci-milo.appspot.com/swarming/task/324387bf30100f10
c:\b\work\skia\src\core\sklinearbitmappipeline.cpp:49: fatal error: "assert(sizeof(Variant) <= sizeof(fSpace))"
Original issue's description:
> Try to use only std::aligned_storage. This does not change the API.
>
> BUG=skia:
> GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2468243002
> TBR=reed@google.com
>
> Committed: https://skia.googlesource.com/skia/+/e736e0c2d52a29a3b88a29ab39b3a90a5a2443a0
TBR=mtklein@chromium.org,bsalomon@google.com,mtklein@google.com,reed@google.com,herb@google.com
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review-Url: https://codereview.chromium.org/2474073002
-rw-r--r-- | include/core/SkPostConfig.h | 9 | ||||
-rw-r--r-- | src/core/SkLinearBitmapPipeline.h | 17 | ||||
-rw-r--r-- | src/core/SkSmallAllocator.h | 12 |
3 files changed, 26 insertions, 12 deletions
diff --git a/include/core/SkPostConfig.h b/include/core/SkPostConfig.h index c34397cde6..1b1cb3e751 100644 --- a/include/core/SkPostConfig.h +++ b/include/core/SkPostConfig.h @@ -77,6 +77,15 @@ # endif #endif +// As usual, there are two ways to increase alignment... the MSVC way and the everyone-else way. +#ifndef SK_STRUCT_ALIGN + #ifdef _MSC_VER + #define SK_STRUCT_ALIGN(N) __declspec(align(N)) + #else + #define SK_STRUCT_ALIGN(N) __attribute__((aligned(N))) + #endif +#endif + #if defined(_MSC_VER) && SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 #define SK_VECTORCALL __vectorcall #elif defined(SK_CPU_ARM32) && defined(SK_ARM_HAS_NEON) diff --git a/src/core/SkLinearBitmapPipeline.h b/src/core/SkLinearBitmapPipeline.h index d9fa97522e..91b573df5d 100644 --- a/src/core/SkLinearBitmapPipeline.h +++ b/src/core/SkLinearBitmapPipeline.h @@ -57,9 +57,6 @@ public: void shadeSpan4f(int x, int y, SkPM4f* dst, int count); void blitSpan(int32_t x, int32_t y, void* dst, int count); - template <size_t N> - using Storage = typename std::aligned_storage<N, 16>::type; - template<typename Base, size_t kSize, typename Next = void> class Stage { public: @@ -87,8 +84,11 @@ public: private: std::function<void (Next*, void*)> fStageCloner; - mutable Storage<kSize> fSpace; - bool fIsInitialized; + struct SK_STRUCT_ALIGN(16) Space { + char space[kSize]; + }; + bool fIsInitialized; + mutable Space fSpace; }; /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -116,8 +116,11 @@ public: Base& operator*() const { return *(this->get()); } private: - mutable Storage<kSize> fSpace; - bool fIsInitialized; + struct SK_STRUCT_ALIGN(16) Space { + char space[kSize]; + }; + mutable Space fSpace; + bool fIsInitialized; }; diff --git a/src/core/SkSmallAllocator.h b/src/core/SkSmallAllocator.h index b39e359d52..9095fa57fc 100644 --- a/src/core/SkSmallAllocator.h +++ b/src/core/SkSmallAllocator.h @@ -93,7 +93,7 @@ public: // There is space in fStorage. rec->fStorageSize = storageRequired; rec->fHeapStorage = nullptr; - rec->fObj = static_cast<void*>(bytes() + fStorageUsed); + rec->fObj = static_cast<void*>(fStorage.fBytes + fStorageUsed); fStorageUsed += storageRequired; } rec->fKillProc = DestroyT<T>; @@ -129,11 +129,13 @@ private: static_cast<T*>(ptr)->~T(); } - char* bytes() { return reinterpret_cast<char*>(&fStorage); } - - using Storage = typename std::aligned_storage<kTotalBytes, 16>::type; + struct SK_STRUCT_ALIGN(16) Storage { + // we add kMaxObjects * 15 to account for the worst-case slop, where each allocation wasted + // 15 bytes (due to forcing each to be 16-byte aligned) + char fBytes[kTotalBytes + kMaxObjects * 15]; + }; - Storage fStorage[kMaxObjects]; + Storage fStorage; // Number of bytes used so far. size_t fStorageUsed; uint32_t fNumObjects; |