This change reduces the amount of data copied into VkDeviceMemory resources in
`Apply_InitialState`; this uses the new (interval-based) reference tracking.
On a large capture from a recent game, this change reduces the amount of copied
data from 2.2GB to 720MB (plus 100MB cleared to 0). This reduces the time spent
in `ApplyInitialContents` from 1800ms to 1500ms.
Ranges of memory are initialized/reset by either clearing to 0, or copying in
the initial state data, according to the `FrameRefType`, as follows:
- Read-only (`eFrameRef_Read`) regions of memory are initialized by copying
once, before the first replay.
- Read-before-write (`eFrameRef_ReadBeforeWrite`) regions of memory are reset by
copying before each replay.
- Write-only (`eFrameRef_PartialWrite` and `eFrameRef_CompleteWrite`) regions of
memory are cleared to 0 before each replay. This is intended to avoid possible
user confusion when inspecting these regions of memory, as they might
otherwise show data written later in the frame.
- Unused (`eFrameRef_None`) regions of memory are cleared to 0 once, before the
first replay.
Attachments might be read and/or written. Pessimistically assume attachments are
read and then overwritten. Further analysis should be able to refine this access
type in some cases.
* This means that allocating >2GB in a bytebuf doesn't crash. There was no good
reason for the int32_t - that dates back to the earliest interop structs
defined for communication with .NET
* We already handle the case where e.g. D3D12_RENDER_TARGET_VIEW_DESC is NULL
and we need to substitute in a typed descriptor for backbuffers. We didn't
handle the case where
Detected two shader compile errors while replaying GLES apps:
1. „#extension directive must occur before any non-preprocessor token” - Fix the order of precisions and extensions in the shader code.
2. „extension 'GL_OES_texture_cube_map_array' is not supported” - Do not add extensions if they are actually not supported. TEXTURE_CUBE_MAP_ARRAY was added to GLES 3.2 so GL_OES_texture_cube_map_array and GL_EXT_texture_cube_map_array are no longer used.
This eliminates a substantial amount duplicate code between `GetByteSize` and
`GetBlockShape`.
Also added explicit tests of `GetPlateByteSize` independent of `GetByteSize`.
* Python throws an error when enums don't have a pre-existing value, which can
happen for GPUCounter due to hardware specific counters. Instead just declare
as int and allow casting back and forth for values that are pre-existing.
* Most of the interfaces are not supported - protected sessions, raytracing,
etc.
* We also split apart the 1/2/3/4 wrapped implementations to avoid uber files.
* GLContextTLSData default constructor should be initialised.
* Add some missing deletes in shader reflection
* Call freeaddrinfo after getaddrinfo
* Don't leak if we're reserving 0 bytes in rdcstr over the top of an already
empty rdcstr
When the interval being updated went all the way to the end of the last
interval (UINT64_MAX), `update` would call `mergeLeft` on the `end()` interval.
This would cause `mergeLeft` to dereference an invalid iterator.
Also added a quick return for updating empty intervals, and unit tests to verify
correct handling of empty intervals, which were run both with and without this
optimization.
Also removed some unnecessary asserts that likely called many times. These
asserts could only fail if there was a bug in the `Intervals<T>` implementation,
which should be caught by the unit tests.
This change tracks the exact memory regions of the buffer accessed in
`vkCmdCopyBufferToImage` and `vkCmdCopyImageToBuffer`. In the case of
`vkCmdCopyImageToBuffer`, using the exact memory regions allows the buffer write
to be treated as a `CompleteWrite` (instead of `PartialWrite`).