diff --git a/filament/src/Material.cpp b/filament/src/Material.cpp index f07ce243dc..ad93ee2d99 100644 --- a/filament/src/Material.cpp +++ b/filament/src/Material.cpp @@ -302,8 +302,8 @@ Handle FMaterial::getProgramSlow(uint8_t variantKey) const noexcept { Program pb; pb .diagnostics(mName, variantKey) - .withVertexShader(vs) - .withFragmentShader(fs) + .withVertexShader(std::move(vs)) + .withFragmentShader(std::move(fs)) .withSamplerBindings(&mSamplerBindings) .addUniformBlock(BindingPoints::PER_VIEW, &UibGenerator::getPerViewUib()) .addUniformBlock(BindingPoints::LIGHTS, &UibGenerator::getLightsUib()) diff --git a/filament/src/View.cpp b/filament/src/View.cpp index 20b18b17cb..5a43ebd57f 100644 --- a/filament/src/View.cpp +++ b/filament/src/View.cpp @@ -39,6 +39,8 @@ #include #include +#include + using namespace math; using namespace utils; diff --git a/filament/src/driver/Program.cpp b/filament/src/driver/Program.cpp index 15b5c3ade6..d52fc9b81b 100644 --- a/filament/src/driver/Program.cpp +++ b/filament/src/driver/Program.cpp @@ -32,9 +32,14 @@ Program& Program::operator=(const Program& rhs) = default; Program& Program::operator=(Program&& rhs) noexcept = default; Program::~Program() noexcept = default; -Program& Program::diagnostics(utils::CString name, uint8_t variant) { - using std::swap; - swap(mName, name); +Program& Program::diagnostics(utils::CString const& name, uint8_t variant) { + mName = name; + mVariant = variant; + return *this; +} + +Program& Program::diagnostics(utils::CString&& name, uint8_t variant) noexcept { + name.swap(mName); mVariant = variant; return *this; } @@ -44,9 +49,13 @@ Program& Program::withSamplerBindings(const SamplerBindingMap* bindings) { return *this; } -Program& Program::shader(Program::Shader shader, CString source) { - using std::swap; - swap(mShadersSource[size_t(shader)], source); +Program& Program::shader(Program::Shader shader, CString const& source) { + mShadersSource[size_t(shader)] = source; + return *this; +} + +Program& Program::shader(Program::Shader shader, CString&& source) noexcept { + source.swap(mShadersSource[size_t(shader)]); return *this; } diff --git a/filament/src/driver/Program.h b/filament/src/driver/Program.h index 15e344ec26..34abc1bb54 100644 --- a/filament/src/driver/Program.h +++ b/filament/src/driver/Program.h @@ -51,10 +51,12 @@ public: ~Program() noexcept; // sets the material name and variant for diagnostic purposes only - Program& diagnostics(utils::CString name, uint8_t variantKey = 0); + Program& diagnostics(utils::CString const& name, uint8_t variantKey = 0); + Program& diagnostics(utils::CString&& name, uint8_t variantKey = 0) noexcept; // sets one of the program's shader (e.g. vertex, fragment) - Program& shader(Shader shader, utils::CString source); + Program& shader(Shader shader, utils::CString const& source); + Program& shader(Shader shader, utils::CString&& source) noexcept; // sets a uniform interface block for this program Program& addUniformBlock(size_t index, const UniformInterfaceBlock* ib); @@ -63,12 +65,12 @@ public: Program& addSamplerBlock(size_t index, const SamplerInterfaceBlock* ib); template - Program& withVertexShader(T source) { + Program& withVertexShader(T&& source) { return shader(Shader::VERTEX, std::forward(source)); } template - Program& withFragmentShader(T source) { + Program& withFragmentShader(T&& source) { return shader(Shader::FRAGMENT, std::forward(source)); } diff --git a/libs/utils/include/utils/CString.h b/libs/utils/include/utils/CString.h index 2838cf6ae0..a0507546cc 100644 --- a/libs/utils/include/utils/CString.h +++ b/libs/utils/include/utils/CString.h @@ -185,9 +185,7 @@ public: CString& operator=(const CString& rhs); CString& operator=(CString&& rhs) noexcept { - if (this != &rhs) { - this->swap(rhs); - } + this->swap(rhs); return *this; } @@ -260,6 +258,12 @@ public: return begin()[size() - 1]; } + // placement new declared as "throw" to avoid the compiler's null-check + inline void* operator new(size_t size, void* ptr) { + assert(ptr); + return ptr; + } + private: struct Data { size_type length; diff --git a/libs/utils/src/CString.cpp b/libs/utils/src/CString.cpp index 459c2597cf..d39e6e86d1 100644 --- a/libs/utils/src/CString.cpp +++ b/libs/utils/src/CString.cpp @@ -18,6 +18,8 @@ #include +#include + namespace utils { int StaticString::compare(const StaticString& rhs) const noexcept { @@ -36,7 +38,8 @@ CString::CString(const char* cstr, size_type length) { Data* p = (Data*)malloc(sizeof(Data) + length + 1); p->length = length; mCStr = (value_type*)(p + 1); - memcpy(mCStr, cstr, length + 1); + // we don't use memcpy here to avoid a call to libc, the generated code is pretty good. + std::uninitialized_copy_n(cstr, length + 1, mCStr); } }