* The entry point is remapped several times:
- ELF header declares it at RVA 0x1234
- [new in this change] The section containing that says it's at addresses
0x1200 - 0x1500, but on disk it's actually at file offset 0x1100 meaning our
entry point is actually 0x100 earlier, at 0x1134
- The ASLR maps the executable section at *file offset* 0x1100 to 0xDEADBEEF00
Importantly when file offset != base RVA, this needs to be taken into
account.
- Finally the entry point is at 0x34 offset into the section because it's
mmapped, so the entry point is 0xDEADBEEF34.
* The timestamp base is queryable from the capture file and settable too, and
conversions preserve un-rebased timestamps. Only rebasing when loading a
capture for replay.
* Non-integer DPI handling is fundamentally a broken concept, because UIs are
essentially pixel art with some vector drawing. Rounding down half fractions
seems to be a better tradeoff than rounding up or trying to render them as-is.
* We need to count the fake indirect subcommand *before* checking if we're in
range, otherwise replaying up to but not including the draw will miscount and
replay the draw itself.
* When we're capturing programs with high-frequency enough API calls, the
overhead of the math & extra function calls over Timing::GetTick() is
measurable. Removing it and serialising pure tick based durations/timestamps
and then converting on replay gives us identical results and saves time while
background capturing.
* It's possible that a frame capture could copy from a query and then reset it,
without then recording something valid into the query. Then the next replay
the copy would be unavailable and if WAIT_BIT is set that would lead to a
device lost.
* We already fill out queries with dummy valid data on create time, so now we
record any queries that are reset and re-fill them with valid data again.