From 4fe1ecd4478bd5223bd218bbbff5fd874926ec97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 6 Mar 2014 13:11:05 +0100 Subject: [PATCH] MeshTools: use zero-initialized array in interleave(). Surely is faster than calling std::memset for every zero byte. --- src/Magnum/MeshTools/Interleave.h | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/Magnum/MeshTools/Interleave.h b/src/Magnum/MeshTools/Interleave.h index 43fccbb4b..0c7412dd1 100644 --- a/src/Magnum/MeshTools/Interleave.h +++ b/src/Magnum/MeshTools/Interleave.h @@ -71,26 +71,21 @@ struct Stride { }; /* Copy data to the buffer */ -template typename std::enable_if::value, std::size_t>::type writeOneInterleaved(std::size_t attributeCount, std::size_t stride, char* startingOffset, const T& attributeList) { +template typename std::enable_if::value, std::size_t>::type writeOneInterleaved(std::size_t stride, char* startingOffset, const T& attributeList) { auto it = attributeList.begin(); - for(std::size_t i = 0; i != attributeCount; ++i, ++it) + for(std::size_t i = 0; i != attributeList.size(); ++i, ++it) std::memcpy(startingOffset + i*stride, reinterpret_cast(&*it), sizeof(typename T::value_type)); return sizeof(typename T::value_type); } -/* Fill gap with zeros */ -inline std::size_t writeOneInterleaved(std::size_t attributeCount, std::size_t stride, char* startingOffset, std::size_t gap) { - for(std::size_t i = 0; i != attributeCount; ++i) - std::memset(startingOffset + i*stride, 0, gap); - - return gap; -} +/* Skip gap */ +inline constexpr std::size_t writeOneInterleaved(std::size_t, char*, std::size_t gap) { return gap; } /* Write interleaved data */ -inline void writeInterleaved(std::size_t, std::size_t, char*) {} -template void writeInterleaved(std::size_t attributeCount, std::size_t stride, char* startingOffset, const T& first, const U&... next) { - writeInterleaved(attributeCount, stride, startingOffset + writeOneInterleaved(attributeCount, stride, startingOffset, first), next...); +inline void writeInterleaved(std::size_t, char*) {} +template void writeInterleaved(std::size_t stride, char* startingOffset, const T& first, const U&... next) { + writeInterleaved(stride, startingOffset + writeOneInterleaved(stride, startingOffset, first), next...); } } @@ -144,15 +139,15 @@ template typename std::enable_if::va /* Compute buffer size and stride */ const std::size_t attributeCount = Implementation::AttributeCount{}(first, next...); const std::size_t stride = Implementation::Stride{}(first, next...); - if(attributeCount && attributeCount != ~std::size_t(0)) { - /* Create output buffer */ - Containers::Array data = Containers::Array(attributeCount*stride); + /* Create output buffer only if we have some attributes */ + if(attributeCount && attributeCount != ~std::size_t(0)) { + Containers::Array data = Containers::Array::zeroInitialized(attributeCount*stride); + Implementation::writeInterleaved(stride, data.begin(), first, next...); - /* Save the data */ - Implementation::writeInterleaved(attributeCount, stride, data.begin(), first, next...); return std::make_tuple(attributeCount, stride, std::move(data)); + /* Otherwise return nullptr */ } else return std::make_tuple(0, stride, nullptr); }