diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/ShaderDumper.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/ShaderDumper.cs | 62 |
1 files changed, 22 insertions, 40 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/ShaderDumper.cs b/Ryujinx.Graphics.Gpu/Engine/ShaderDumper.cs index fdcf0612..b2eb0f33 100644 --- a/Ryujinx.Graphics.Gpu/Engine/ShaderDumper.cs +++ b/Ryujinx.Graphics.Gpu/Engine/ShaderDumper.cs @@ -1,11 +1,11 @@ +using Ryujinx.Graphics.Shader.Translation; +using System; using System.IO; namespace Ryujinx.Graphics.Gpu.Engine { class ShaderDumper { - private const int ShaderHeaderSize = 0x50; - private GpuContext _context; private string _runtimeDir; @@ -21,67 +21,49 @@ namespace Ryujinx.Graphics.Gpu.Engine _dumpIndex = 1; } - public void Dump(ulong gpuVa, bool compute) + public void Dump(Span<byte> code, bool compute, out string fullPath, out string codePath) { _dumpPath = GraphicsConfig.ShadersDumpPath; if (string.IsNullOrWhiteSpace(_dumpPath)) { + fullPath = null; + codePath = null; + return; } string fileName = "Shader" + _dumpIndex.ToString("d4") + ".bin"; - string fullPath = Path.Combine(FullDir(), fileName); - string codePath = Path.Combine(CodeDir(), fileName); + fullPath = Path.Combine(FullDir(), fileName); + codePath = Path.Combine(CodeDir(), fileName); _dumpIndex++; - ulong headerSize = compute ? 0UL : ShaderHeaderSize; + code = Translator.ExtractCode(code, compute, out int headerSize); - using (FileStream fullFile = File.Create(fullPath)) - using (FileStream codeFile = File.Create(codePath)) + using (MemoryStream stream = new MemoryStream(code.ToArray())) { - BinaryWriter fullWriter = new BinaryWriter(fullFile); - BinaryWriter codeWriter = new BinaryWriter(codeFile); + BinaryReader codeReader = new BinaryReader(stream); - for (ulong i = 0; i < headerSize; i += 4) + using (FileStream fullFile = File.Create(fullPath)) + using (FileStream codeFile = File.Create(codePath)) { - fullWriter.Write(_context.MemoryAccessor.ReadInt32(gpuVa + i)); - } + BinaryWriter fullWriter = new BinaryWriter(fullFile); + BinaryWriter codeWriter = new BinaryWriter(codeFile); - ulong offset = 0; + fullWriter.Write(codeReader.ReadBytes(headerSize)); - ulong instruction = 0; + byte[] temp = codeReader.ReadBytes(code.Length - headerSize); - // Dump until a NOP instruction is found. - while ((instruction >> 48 & 0xfff8) != 0x50b0) - { - uint word0 = (uint)_context.MemoryAccessor.ReadInt32(gpuVa + headerSize + offset + 0); - uint word1 = (uint)_context.MemoryAccessor.ReadInt32(gpuVa + headerSize + offset + 4); - - instruction = word0 | (ulong)word1 << 32; + fullWriter.Write(temp); + codeWriter.Write(temp); - // Zero instructions (other kind of NOP) stop immediately, - // this is to avoid two rows of zeroes. - if (instruction == 0) + // Align to meet nvdisasm requirements. + while (codeFile.Length % 0x20 != 0) { - break; + codeWriter.Write(0); } - - fullWriter.Write(instruction); - codeWriter.Write(instruction); - - offset += 8; - } - - // Align to meet nvdisasm requirements. - while (offset % 0x20 != 0) - { - fullWriter.Write(0); - codeWriter.Write(0); - - offset += 4; } } } |