Easier capture stuff
This commit is contained in:
parent
0233a0d35a
commit
fd0eaaafc1
2 changed files with 33 additions and 20 deletions
|
@ -38,20 +38,6 @@ namespace Ryujinx.Graphics.Metal
|
||||||
var layer = _getMetalLayer();
|
var layer = _getMetalLayer();
|
||||||
layer.Device = _device;
|
layer.Device = _device;
|
||||||
|
|
||||||
var captureDescriptor = new MTLCaptureDescriptor
|
|
||||||
{
|
|
||||||
CaptureObject = _queue,
|
|
||||||
Destination = MTLCaptureDestination.GPUTraceDocument,
|
|
||||||
OutputURL = NSURL.FileURLWithPath(StringHelper.NSString("/Users/isaacmarovitz/Desktop/Trace.gputrace"))
|
|
||||||
};
|
|
||||||
var captureError = new NSError(IntPtr.Zero);
|
|
||||||
MTLCaptureManager.SharedCaptureManager().StartCapture(captureDescriptor, ref captureError);
|
|
||||||
if (captureError != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Failed to start capture! {StringHelper.String(captureError.LocalizedDescription)}");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
_window = new Window(this, layer);
|
_window = new Window(this, layer);
|
||||||
_pipeline = new Pipeline(_device, _queue);
|
_pipeline = new Pipeline(_device, _queue);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,10 +13,13 @@ namespace Ryujinx.Graphics.Metal
|
||||||
[SupportedOSPlatform("macos")]
|
[SupportedOSPlatform("macos")]
|
||||||
class Pipeline : IPipeline, IDisposable
|
class Pipeline : IPipeline, IDisposable
|
||||||
{
|
{
|
||||||
private const int MaxFramesPerCapture = 50;
|
// 0 Frames = No capture
|
||||||
|
// Some games like Undertale trigger a stack overflow on capture end
|
||||||
|
private const int MaxFramesPerCapture = 5;
|
||||||
|
private const string CaptureLocation = "/Users/isaacmarovitz/Desktop/Captures/Trace-";
|
||||||
|
|
||||||
private readonly MTLDevice _device;
|
private readonly MTLDevice _device;
|
||||||
private readonly MTLCommandQueue _mtlCommandQueue;
|
private readonly MTLCommandQueue _commandQueue;
|
||||||
private readonly HelperShaders _helperShaders;
|
private readonly HelperShaders _helperShaders;
|
||||||
|
|
||||||
private MTLCommandBuffer _commandBuffer;
|
private MTLCommandBuffer _commandBuffer;
|
||||||
|
@ -29,17 +32,41 @@ namespace Ryujinx.Graphics.Metal
|
||||||
private ulong _indexBufferOffset;
|
private ulong _indexBufferOffset;
|
||||||
private MTLClearColor _clearColor;
|
private MTLClearColor _clearColor;
|
||||||
private int _frameCount;
|
private int _frameCount;
|
||||||
private bool _captureEnded = false;
|
private bool _captureEnded = true;
|
||||||
|
|
||||||
public Pipeline(MTLDevice device, MTLCommandQueue commandQueue)
|
public Pipeline(MTLDevice device, MTLCommandQueue commandQueue)
|
||||||
{
|
{
|
||||||
_device = device;
|
_device = device;
|
||||||
_mtlCommandQueue = commandQueue;
|
_commandQueue = commandQueue;
|
||||||
_helperShaders = new HelperShaders(_device);
|
_helperShaders = new HelperShaders(_device);
|
||||||
|
|
||||||
_renderEncoderState = new RenderEncoderState(_helperShaders.BlitShader, _device);
|
_renderEncoderState = new RenderEncoderState(_helperShaders.BlitShader, _device);
|
||||||
|
|
||||||
_commandBuffer = _mtlCommandQueue.CommandBuffer();
|
_commandBuffer = _commandQueue.CommandBuffer();
|
||||||
|
|
||||||
|
if (MaxFramesPerCapture > 0)
|
||||||
|
{
|
||||||
|
StartCapture();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartCapture()
|
||||||
|
{
|
||||||
|
var captureDescriptor = new MTLCaptureDescriptor
|
||||||
|
{
|
||||||
|
CaptureObject = _commandQueue,
|
||||||
|
Destination = MTLCaptureDestination.GPUTraceDocument,
|
||||||
|
OutputURL = NSURL.FileURLWithPath(StringHelper.NSString(CaptureLocation + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + ".gputrace"))
|
||||||
|
};
|
||||||
|
var captureError = new NSError(IntPtr.Zero);
|
||||||
|
MTLCaptureManager.SharedCaptureManager().StartCapture(captureDescriptor, ref captureError);
|
||||||
|
if (captureError != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Failed to start capture! {StringHelper.String(captureError.LocalizedDescription)}");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_captureEnded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MTLRenderCommandEncoder GetOrCreateRenderEncoder()
|
public MTLRenderCommandEncoder GetOrCreateRenderEncoder()
|
||||||
|
@ -160,7 +187,7 @@ namespace Ryujinx.Graphics.Metal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_commandBuffer = _mtlCommandQueue.CommandBuffer();
|
_commandBuffer = _commandQueue.CommandBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Barrier()
|
public void Barrier()
|
||||||
|
|
Loading…
Reference in a new issue