unsafe void CalculateMipInfosNoncompressed(int mipCount, int pitch, out int chainSize) { if (mipCount == -1) mipCount = 1; int bytesPerPixel = Helper.FormatBits(DxgiFormat, D3DFormat) / 8; if (pitch == -1) { pitch = Width * bytesPerPixel; if ((pitch & 0x3) != 0) pitch += 4 - (pitch & 0x3); } MipInfos = new MipInfo[mipCount]; fixed (MipInfo* infos = MipInfos) { infos[0] = new MipInfo { Width = Width, Height = Height, Depth = Depth, OffsetInBytes = 0, SizeInBytes = Height * pitch }; for (int i = 1; i < mipCount; i++) { infos[i] = new MipInfo { Width = Math.Max(1, infos[i - 1].Width / 2), Height = Math.Max(1, infos[i - 1].Height / 2), Depth = Math.Max(1, infos[i - 1].Depth / 2), OffsetInBytes = infos[i - 1].OffsetInBytes + infos[i - 1].SizeInBytes, }; int mipPitch = infos[i].Width * bytesPerPixel; if ((mipPitch & 0x3) != 0) mipPitch += 4 - (mipPitch & 0x3); infos[i].SizeInBytes = mipPitch * infos[i].Height * infos[i].Depth; } chainSize = infos[mipCount - 1].OffsetInBytes + infos[mipCount - 1].SizeInBytes; } }
unsafe void CalculateMipInfosCompressed(int mipCount, int linearSize, out int chainSize) { if (mipCount == -1) mipCount = 1; int multiplyer = DxgiFormat == DxgiFormat.BC1_TYPELESS || DxgiFormat == DxgiFormat.BC1_UNORM || DxgiFormat == DxgiFormat.BC1_UNORM_SRGB || D3DFormat == D3DFormat.Dxt1 ? 8 : 16; if (linearSize == -1) linearSize = Math.Max(1, Width / 4) * Math.Max(1, Height / 4) * multiplyer; MipInfos = new MipInfo[mipCount]; fixed (MipInfo* infos = MipInfos) { infos[0] = new MipInfo { Width = Width, Height = Height, Depth = Depth, OffsetInBytes = 0, SizeInBytes = linearSize }; for (int i = 1; i < mipCount; i++) { infos[i] = new MipInfo { Width = Math.Max(1, infos[i - 1].Width / 2), Height = Math.Max(1, infos[i - 1].Height / 2), Depth = Math.Max(1, infos[i - 1].Depth / 2), OffsetInBytes = infos[i - 1].OffsetInBytes + infos[i - 1].SizeInBytes, }; infos[i].SizeInBytes = Math.Max(1, infos[i].Width / 4) * Math.Max(1, infos[i].Height / 4) * infos[i].Depth * multiplyer; } chainSize = infos[mipCount - 1].OffsetInBytes + infos[mipCount - 1].SizeInBytes; } }