| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- using System;
- using System.Runtime.InteropServices;
- namespace Ryujinx.Graphics.Vulkan
- {
- class FormatConverter
- {
- public static void ConvertD24S8ToD32FS8(Span<byte> output, ReadOnlySpan<byte> input)
- {
- const float UnormToFloat = 1f / 0xffffff;
- Span<uint> outputUint = MemoryMarshal.Cast<byte, uint>(output);
- ReadOnlySpan<uint> inputUint = MemoryMarshal.Cast<byte, uint>(input);
- int i = 0;
- for (; i < inputUint.Length; i++)
- {
- uint depthStencil = inputUint[i];
- uint depth = depthStencil >> 8;
- uint stencil = depthStencil & 0xff;
- int j = i * 2;
- outputUint[j] = (uint)BitConverter.SingleToInt32Bits(depth * UnormToFloat);
- outputUint[j + 1] = stencil;
- }
- }
- public static void ConvertD32FS8ToD24S8(Span<byte> output, ReadOnlySpan<byte> input)
- {
- Span<uint> outputUint = MemoryMarshal.Cast<byte, uint>(output);
- ReadOnlySpan<uint> inputUint = MemoryMarshal.Cast<byte, uint>(input);
- int i = 0;
- for (; i < inputUint.Length; i += 2)
- {
- float depth = BitConverter.Int32BitsToSingle((int)inputUint[i]);
- uint stencil = inputUint[i + 1];
- uint depthStencil = (Math.Clamp((uint)(depth * 0xffffff), 0, 0xffffff) << 8) | (stencil & 0xff);
- int j = i >> 1;
- outputUint[j] = depthStencil;
- }
- }
- }
- }
|