# 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)
// the pipeline on a new sampler.
Base* cloneStageTo(Next* next, Stage* cloneToStage) const;
- Base* get() const { return reinterpret_cast<Base*>(&fSpace); }
+ Base* get() const { return reinterpret_cast<Base*>(fSpace); }
Base* operator->() const { return this->get(); }
Base& operator*() const { return *(this->get()); }
private:
std::function<void (Next*, void*)> fStageCloner;
- struct SK_STRUCT_ALIGN(16) Space {
- char space[kSize];
- };
- bool fIsInitialized;
- mutable Space fSpace;
+ alignas(16) mutable char fSpace[kSize];
+ bool fIsInitialized;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
fIsInitialized = true;
}
- Base* get() const { return reinterpret_cast<Base*>(&fSpace); }
+ Base* get() const { return reinterpret_cast<Base*>(fSpace); }
Base* operator->() const { return this->get(); }
Base& operator*() const { return *(this->get()); }
private:
- struct SK_STRUCT_ALIGN(16) Space {
- char space[kSize];
- };
- mutable Space fSpace;
- bool fIsInitialized;
+ alignas(16) mutable char fSpace[kSize];
+ bool fIsInitialized;
};
using MatrixStage = Stage<PointProcessorInterface, 160, PointProcessorInterface>;
using TileStage = Stage<PointProcessorInterface, 160, SampleProcessorInterface>;
using SampleStage = Stage<SampleProcessorInterface, 160, BlendProcessorInterface>;
- using BlenderStage = Stage<BlendProcessorInterface, 40>;
+ using BlenderStage = Stage<BlendProcessorInterface, 48>;
using Accessor = PolyMemory<PixelAccessorInterface, 64>;
private:
// There is space in fStorage.
rec->fStorageSize = storageRequired;
rec->fHeapStorage = nullptr;
- rec->fObj = static_cast<void*>(fStorage.fBytes + fStorageUsed);
+ rec->fObj = static_cast<void*>(fStorage + fStorageUsed);
fStorageUsed += storageRequired;
}
rec->fKillProc = DestroyT<T>;
static_cast<T*>(ptr)->~T();
}
- 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;
+ alignas(16) char fStorage[kTotalBytes];
// Number of bytes used so far.
- size_t fStorageUsed;
- uint32_t fNumObjects;
- Rec fRecs[kMaxObjects];
+ size_t fStorageUsed;
+ uint32_t fNumObjects;
+ Rec fRecs[kMaxObjects];
};
#endif // SkSmallAllocator_DEFINED