diff options
-rw-r--r-- | libs/hwui/LayerBuilder.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/RecordingCanvas.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/Snapshot.h | 4 | ||||
-rw-r--r-- | libs/hwui/utils/LinearAllocator.h | 7 |
4 files changed, 11 insertions, 4 deletions
diff --git a/libs/hwui/LayerBuilder.cpp b/libs/hwui/LayerBuilder.cpp index 1ba3bf26c0d4..c5d7191f1b62 100644 --- a/libs/hwui/LayerBuilder.cpp +++ b/libs/hwui/LayerBuilder.cpp @@ -239,7 +239,7 @@ void LayerBuilder::flushLayerClears(LinearAllocator& allocator) { // put the verts in the frame allocator, since // 1) SimpleRectsOps needs verts, not rects // 2) even if mClearRects stored verts, std::vectors will move their contents - Vertex* const verts = (Vertex*) allocator.alloc<Vertex>(vertCount * sizeof(Vertex)); + Vertex* const verts = (Vertex*) allocator.create_trivial_array<Vertex>(vertCount); Vertex* currentVert = verts; Rect bounds = mClearRects[0]; diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 269e590892d3..5ab229236516 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -290,7 +290,7 @@ void RecordingCanvas::drawRect(float left, float top, float right, float bottom, void RecordingCanvas::drawSimpleRects(const float* rects, int vertexCount, const SkPaint* paint) { if (rects == nullptr) return; - Vertex* rectData = (Vertex*) mDisplayList->allocator.alloc<Vertex>(vertexCount * sizeof(Vertex)); + Vertex* rectData = (Vertex*) mDisplayList->allocator.create_trivial_array<Vertex>(vertexCount); Vertex* vertex = rectData; float left = FLT_MAX; diff --git a/libs/hwui/Snapshot.h b/libs/hwui/Snapshot.h index 0ac2f1411140..b03643f06f1c 100644 --- a/libs/hwui/Snapshot.h +++ b/libs/hwui/Snapshot.h @@ -44,7 +44,7 @@ namespace uirenderer { */ class RoundRectClipState { public: - /** static void* operator new(size_t size); PURPOSELY OMITTED, allocator only **/ + static void* operator new(size_t size) = delete; static void* operator new(size_t size, LinearAllocator& allocator) { return allocator.alloc<RoundRectClipState>(size); } @@ -65,7 +65,7 @@ public: class ProjectionPathMask { public: - /** static void* operator new(size_t size); PURPOSELY OMITTED, allocator only **/ + static void* operator new(size_t size) = delete; static void* operator new(size_t size, LinearAllocator& allocator) { return allocator.alloc<ProjectionPathMask>(size); } diff --git a/libs/hwui/utils/LinearAllocator.h b/libs/hwui/utils/LinearAllocator.h index 0a0e1858cd91..34c8c6beea81 100644 --- a/libs/hwui/utils/LinearAllocator.h +++ b/libs/hwui/utils/LinearAllocator.h @@ -84,6 +84,13 @@ public: return new (allocImpl(sizeof(T))) T(std::forward<Params>(params)...); } + template<class T> + T* create_trivial_array(int count) { + static_assert(std::is_trivially_destructible<T>::value, + "Error, called create_trivial_array on a non-trivial type"); + return reinterpret_cast<T*>(allocImpl(sizeof(T) * count)); + } + /** * Attempt to deallocate the given buffer, with the LinearAllocator attempting to rewind its * state if possible. |