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.
This commit is contained in:
committed by
Mathias Agopian
parent
271cda88aa
commit
487b10fdda
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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<FMaterial*>(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<backend::Handle<backend::HwProgram>, 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;
|
||||
|
||||
Reference in New Issue
Block a user