From 487b10fddafedc8e7dec7719305c4fa26d0dc52d Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 31 Mar 2022 16:05:54 -0700 Subject: [PATCH] repair and optimize matdbg we add a checkProgramEdits() method that must be called periodically on all materials. This is currently done at the beginning of a frame. --- filament/src/details/Engine.cpp | 3 +++ filament/src/details/Material.cpp | 11 ++++++----- filament/src/details/Material.h | 18 ++++++++++-------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/filament/src/details/Engine.cpp b/filament/src/details/Engine.cpp index 862e80d4dc..be0bda7d40 100644 --- a/filament/src/details/Engine.cpp +++ b/filament/src/details/Engine.cpp @@ -469,6 +469,9 @@ void FEngine::prepare() { // Commit default material instances. mMaterials.forEach([&driver](FMaterial* material) { +#if FILAMENT_ENABLE_MATDBG + material->checkProgramEdits(); +#endif material->getDefaultInstance()->commit(driver); }); } diff --git a/filament/src/details/Material.cpp b/filament/src/details/Material.cpp index bcb23058a4..08fba950d4 100644 --- a/filament/src/details/Material.cpp +++ b/filament/src/details/Material.cpp @@ -394,8 +394,7 @@ void FMaterial::getSurfaceProgramSlow(Variant variant) const noexcept { createAndCacheProgram(std::move(pb), variant); } -void FMaterial::getPostProcessProgramSlow(Variant variant) - const noexcept { +void FMaterial::getPostProcessProgramSlow(Variant variant) const noexcept { Program pb = getProgramBuilderWithVariants(variant, variant, variant); pb.setUniformBlock(BindingPoints::PER_VIEW, PerViewUib::_name) @@ -526,6 +525,8 @@ void FMaterial::applyPendingEdits() noexcept { * @{ */ +#if FILAMENT_ENABLE_MATDBG + void FMaterial::onEditCallback(void* userdata, const utils::CString& name, const void* packageData, size_t packageSize) { FMaterial* material = upcast((Material*) userdata); @@ -537,14 +538,14 @@ void FMaterial::onEditCallback(void* userdata, const utils::CString& name, const } void FMaterial::onQueryCallback(void* userdata, VariantList* pVariants) { -#if FILAMENT_ENABLE_MATDBG FMaterial* material = upcast((Material*) userdata); *pVariants = material->mActivePrograms; material->mActivePrograms.reset(); -#endif } - /** @}*/ +#endif + +/** @}*/ void FMaterial::destroyPrograms(FEngine& engine) { DriverApi& driverApi = engine.getDriverApi(); diff --git a/filament/src/details/Material.h b/filament/src/details/Material.h index 397a4e64b1..464183dec1 100644 --- a/filament/src/details/Material.h +++ b/filament/src/details/Material.h @@ -93,9 +93,6 @@ public: #if FILAMENT_ENABLE_MATDBG assert_invariant(variant.key < VARIANT_COUNT); mActivePrograms.set(variant.key); - if (UTILS_UNLIKELY(mPendingEdits.load())) { - const_cast(this)->applyPendingEdits(); - } #endif assert_invariant(mCachedPrograms[variant.key]); return mCachedPrograms[variant.key]; @@ -153,6 +150,7 @@ public: void destroyPrograms(FEngine& engine); +#if FILAMENT_ENABLE_MATDBG /** * Callback handlers for the debug server, potentially called from any thread. The userdata * argument has the same value that was passed to DebugServer::addMaterial(), which should @@ -173,7 +171,14 @@ public: */ static void onQueryCallback(void* userdata, VariantList* pActiveVariants); + void checkProgramEdits() noexcept { + if (UTILS_UNLIKELY(mPendingEdits.load())) { + applyPendingEdits(); + } + } + /** @}*/ +#endif private: void prepareProgramSlow(Variant variant) const noexcept; @@ -186,11 +191,6 @@ private: // try to order by frequency of use mutable std::array, VARIANT_COUNT> mCachedPrograms; -#if FILAMENT_ENABLE_MATDBG - // TODO: this should be protected with a mutex - mutable VariantList mActivePrograms; -#endif - backend::RasterState mRasterState; BlendingMode mRenderBlendingMode = BlendingMode::OPAQUE; TransparencyMode mTransparencyMode = TransparencyMode::DEFAULT; @@ -227,6 +227,8 @@ private: #if FILAMENT_ENABLE_MATDBG matdbg::MaterialKey mDebuggerId; + // TODO: this should be protected with a mutex + mutable VariantList mActivePrograms; #endif utils::CString mName;