This commit fixes three issues that caused the Vulkan disk shader cache to silently fail to persist or load pipelines:
1. EDS Feature Mismatch Regression (Fixes macOS compatibility side-effect)
Commit e030d096f introduced an XFB check to the EDS feature gate to prevent MoltenVK crashes on macOS. This inadvertently rejected *all* non-XFB pipelines on Windows/Linux (where `has_transform_feedback` is true). The check is now unidirectional: pipelines are only rejected if they actively require XFB but the host device doesn't support it.
2. Serialization Thread Draining
The `PipelineCache` destructor was failing to drain the `serialization_thread` worker queue before the thread joined. On shutdown, this caused the worker to silently exit its loop and drop all pending cache disk writes. Added `serialization_thread.WaitForRequests()` to the destructor to ensure persistence.
3. Premature Cache Eviction
Pipelines loaded from disk had no initial `last_use` timestamps. During memory pressure events, the `EvictOldPipelines` logic would instantly purge these newly loaded pipelines before the game had a chance to use them. Disk-loaded pipelines now initialize their last-use frame correctly.
When FindBindlessEntry already returns a valid entry matching (addr,
count, image_table_generation), the TIC descriptor table has not been
invalidated since the last population. In that case we can skip the
ReadBlockUnsafe + memcmp entirely and replay the cached views/samplers
directly.
WARNING: This assumes that games do not write new texture handles to the
cbuf without also triggering a TIC table invalidation (generation bump).
If that assumption is wrong for a specific game, stale textures may
appear. Revert this commit independently to isolate any regressions.
Applies to both graphics and compute pipelines.