mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-08 04:08:32 +09:00
BindProgramUniformBuffers rebuilt a fresh descriptor set and called vkUpdateDescriptorSets on every draw, even when consecutive draws bound the exact same textures/samplers/buffers (common in MC: many draws share a program + atlas). Now, after resolving the bindings (still needed for the UBO dynamic offset), compute a cheap word-wise signature of the resolved descriptor content + layout; when it matches the previous draw, reuse that descriptor set and skip AcquireDescriptorSet + vkUpdateDescriptorSets - only the bind-time dynamic offsets differ. Correct by construction: bindings are re-resolved every draw so the signature always reflects current state and reuse only happens on an exact match; the reused set is never re-acquired within a frame (the acquire cursor only advances); the descriptor set layout is in the signature so reuse never crosses programs; the cache resets each frame in BeginFrame when the frame's sets are recycled; sampler overrides (blits) bypass and invalidate it. The signature hashes 64-bit words (the Vk*Info payloads are 8-byte-multiple sized and value-initialized) so its own per-draw cost stays small. Device-verified on Adreno 830 (MC 26.3-snapshot3, optimized -O2 Magma): rendering correct, no validation errors. Render-thread wall-clock profile: BindProgramUniformBuffers 22.85% -> 19.82% (vkUpdateDescriptorSets ~5% dropped below noise; word-wise signature adds ~0.6% self), SetupDraw 62% -> 60%.