/// <summary> /// Synchronize part of the storage texture, represented by a given range of handles. /// Only handles marked by the _loadNeeded array will be synchronized. /// </summary> /// <param name="baseHandle">The base index of the range of handles</param> /// <param name="regionCount">The number of handles to synchronize</param> private void SynchronizePartial(int baseHandle, int regionCount) { for (int i = 0; i < regionCount; i++) { if (_loadNeeded[baseHandle + i]) { var info = GetHandleInformation(baseHandle + i); int offsetIndex = info.Index; // Only one of these will be greater than 1, as partial sync is only called when there are sub-image views. for (int layer = 0; layer < info.Layers; layer++) { for (int level = 0; level < info.Levels; level++) { int offset = _allOffsets[offsetIndex]; int endOffset = (offsetIndex + 1 == _allOffsets.Length) ? (int)Storage.Size : _allOffsets[offsetIndex + 1]; int size = endOffset - offset; ReadOnlySpan <byte> data = _physicalMemory.GetSpan(Storage.Range.GetSlice((ulong)offset, (ulong)size)); data = Storage.ConvertToHostCompatibleFormat(data, info.BaseLevel, true); Storage.SetData(data, info.BaseLayer, info.BaseLevel); offsetIndex++; } } } } }