diff --git a/filament/src/Material.cpp b/filament/src/Material.cpp index 2471e2ab80..107ac4bec4 100644 --- a/filament/src/Material.cpp +++ b/filament/src/Material.cpp @@ -527,16 +527,12 @@ void FMaterial::onEditCallback(void* userdata, const utils::CString& name, const material->mPendingEdits = createParser(engine.getBackend(), packageData, packageSize); } -void FMaterial::onQueryCallback(void* userdata, uint64_t* pVariants) { +void FMaterial::onQueryCallback(void* userdata, VariantList* pVariants) { FMaterial* material = upcast((Material*) userdata); - uint64_t variants = 0; - auto& cachedPrograms = material->mCachedPrograms; - for (size_t i = 0, n = cachedPrograms.size(); i < n; ++i) { - if (cachedPrograms[i]) { - variants |= (1u << i); - } - } - *pVariants = variants; +#if FILAMENT_ENABLE_MATDBG + *pVariants = material->mActivePrograms; + material->mActivePrograms.reset(); +#endif } /** @}*/ diff --git a/filament/src/details/Material.h b/filament/src/details/Material.h index a2dff995e2..b62dd95f06 100644 --- a/filament/src/details/Material.h +++ b/filament/src/details/Material.h @@ -79,6 +79,7 @@ public: backend::Handle getProgram(uint8_t variantKey) const noexcept { #if FILAMENT_ENABLE_MATDBG + mActivePrograms.set(variantKey); if (UTILS_UNLIKELY(mPendingEdits.load())) { const_cast(this)->applyPendingEdits(); } @@ -150,8 +151,16 @@ public: static void onEditCallback(void* userdata, const utils::CString& name, const void* packageData, size_t packageSize); - /** Queries the program cache to check which variants are resident. */ - static void onQueryCallback(void* userdata, uint64_t* pVariants); + using VariantList = utils::bitset; + + /** + * Returns a list of "active" variants. + * + * This works by checking which variants have been accessed since the previous call, then + * clearing out the internal list. Note that the active vs inactive status is merely a visual + * indicator in the matdbg UI, and that it gets updated about every second. + */ + static void onQueryCallback(void* userdata, VariantList* pActiveVariants); /** @}*/ @@ -163,6 +172,10 @@ private: // try to order by frequency of use mutable std::array, VARIANT_COUNT> mCachedPrograms; +#if FILAMENT_ENABLE_MATDBG + mutable VariantList mActivePrograms; +#endif + backend::RasterState mRasterState; BlendingMode mRenderBlendingMode = BlendingMode::OPAQUE; TransparencyMode mTransparencyMode = TransparencyMode::DEFAULT; diff --git a/libs/matdbg/README.md b/libs/matdbg/README.md index bc7d776c2b..8410ea568b 100644 --- a/libs/matdbg/README.md +++ b/libs/matdbg/README.md @@ -12,7 +12,14 @@ ## Setup for Desktop -First set an environment variable as follows. In Windows, use `set` instead of `export`. +When using the easy build script, include the `-d` argument. For example: + + ./build.sh -fd debug gltf_viewer + +The `d` enables a CMake option called FILAMENT_ENABLE_MATDBG and the `f` ensures that CMake gets +re-run so that the option is honored. + +Next, set an environment variable as follows. In Windows, use `set` instead of `export`. export FILAMENT_MATDBG_PORT=8080 @@ -173,6 +180,9 @@ Returns an object that maps from material ids to their active shader variants. E {"b38d4ad0": ["opengl", 5] , "44ae2b62": ["opengl", 1, 4] } ``` +Each numeric element in the list is a variant mask. For example, at the time of this writing, +Filament has 7-bit mask, so each number in the list is between 0 and 127. + --- `/api/shader?matid={id}&type=[glsl|spirv]&[glindex|vkindex|metalindex]={index}` @@ -209,9 +219,8 @@ not including the terminating null. ## Wish List -- Allow SPIR-V edits. -- Allow viewing GLSL transpiled from SPIR-V. - - Also stop piggybacking on `type=glsl` for Metal Shading Language. +- Allow viewing and editing GLSL for Metal and Vulkan (use filamat or spirv-cross for this) +- Stop piggybacking on `type=glsl` for Metal Shading Language. - Expose the entire `engine.debug` struct in the web UI. - When shader errors occur, send them back over the wire to the web client. - Resizing the Chrome window causes layout issues. diff --git a/libs/matdbg/include/matdbg/DebugServer.h b/libs/matdbg/include/matdbg/DebugServer.h index 6055d8a259..5222b511c6 100644 --- a/libs/matdbg/include/matdbg/DebugServer.h +++ b/libs/matdbg/include/matdbg/DebugServer.h @@ -23,6 +23,8 @@ #include +#include "ShaderInfo.h" + class CivetServer; namespace filament { @@ -55,7 +57,7 @@ public: void removeMaterial(MaterialKey key); using EditCallback = void(*)(void* userdata, const utils::CString& name, const void*, size_t); - using QueryCallback = void(*)(void* userdata, uint64_t* variants); + using QueryCallback = void(*)(void* userdata, VariantList* variants); /** * Sets up a callback that allows the Filament engine to listen for shader edits. The callback @@ -78,7 +80,7 @@ private: size_t packageSize; utils::CString name; MaterialKey key; - uint64_t activeVariants; + VariantList activeVariants; }; const MaterialRecord* getRecord(const MaterialKey& key) const; diff --git a/libs/matdbg/include/matdbg/JsonWriter.h b/libs/matdbg/include/matdbg/JsonWriter.h index c085e12cf4..bff0fbea52 100644 --- a/libs/matdbg/include/matdbg/JsonWriter.h +++ b/libs/matdbg/include/matdbg/JsonWriter.h @@ -23,6 +23,8 @@ #include +#include "ShaderInfo.h" + namespace filament { namespace matdbg { @@ -45,7 +47,7 @@ public: // shader index is an active variant. Each bit in the activeVariants bitmask // represents one of the possible variant combinations. bool writeActiveInfo(const filaflat::ChunkContainer& package, backend::Backend backend, - uint64_t activeVariants); + VariantList activeVariants); private: utils::CString mJsonString; diff --git a/libs/matdbg/include/matdbg/ShaderInfo.h b/libs/matdbg/include/matdbg/ShaderInfo.h index 8630f1d1c0..0a6e935282 100644 --- a/libs/matdbg/include/matdbg/ShaderInfo.h +++ b/libs/matdbg/include/matdbg/ShaderInfo.h @@ -22,9 +22,15 @@ #include #include +#include + +#include + namespace filament { namespace matdbg { +using VariantList = utils::bitset; + struct ShaderInfo { backend::ShaderModel shaderModel; uint8_t variant; diff --git a/libs/matdbg/src/DebugServer.cpp b/libs/matdbg/src/DebugServer.cpp index 321c8843f4..2b8bc82c1d 100644 --- a/libs/matdbg/src/DebugServer.cpp +++ b/libs/matdbg/src/DebugServer.cpp @@ -515,7 +515,7 @@ const DebugServer::MaterialRecord* DebugServer::getRecord(const MaterialKey& key void DebugServer::updateActiveVariants() { if (mQueryCallback) { for (auto& pair : mMaterialRecords) { - uint64_t& result = mMaterialRecords[pair.first].activeVariants; + VariantList& result = mMaterialRecords[pair.first].activeVariants; mQueryCallback(pair.second.userdata, &result); } } diff --git a/libs/matdbg/src/JsonWriter.cpp b/libs/matdbg/src/JsonWriter.cpp index 350d40d7e6..10bb08f84f 100644 --- a/libs/matdbg/src/JsonWriter.cpp +++ b/libs/matdbg/src/JsonWriter.cpp @@ -217,7 +217,7 @@ size_t JsonWriter::getJsonSize() const { } bool JsonWriter::writeActiveInfo(const filaflat::ChunkContainer& package, - Backend backend, uint64_t activeVariants) { + Backend backend, VariantList activeVariants) { vector shaders; ostringstream json; json << "[\""; @@ -241,15 +241,9 @@ bool JsonWriter::writeActiveInfo(const filaflat::ChunkContainer& package, return false; } json << "\""; - for (uint8_t variant = 0; variant < VARIANT_COUNT; variant++) { - if (activeVariants & (1 << variant)) { - int shaderIndex = 0; - for (const auto& info : shaders) { - if (info.variant == variant) { - json << ", " << shaderIndex; - } - shaderIndex++; - } + for (size_t variant = 0; variant < activeVariants.size(); variant++) { + if (activeVariants[variant]) { + json << ", " << variant; } } json << "]"; diff --git a/libs/matdbg/web/script.js b/libs/matdbg/web/script.js index fb2beb09d6..a46cca1539 100644 --- a/libs/matdbg/web/script.js +++ b/libs/matdbg/web/script.js @@ -155,8 +155,8 @@ function queryActiveShaders() { const activeBackend = activeMaterials[matid][0]; const activeShaders = activeMaterials[matid].slice(1); for (const shader of material[activeBackend]) { - const index = parseInt(shader.index); - shader.active = activeShaders.indexOf(index) > -1; + const variant = parseInt(shader.variant); + shader.active = activeShaders.indexOf(variant) > -1; } } renderMaterialList();