Debug Groups
This commit is contained in:
parent
fc581cf707
commit
c7c80dc2fb
2 changed files with 102 additions and 7 deletions
|
@ -258,18 +258,24 @@ namespace Ryujinx.Graphics.Metal
|
||||||
_pipeline.SwapState(null);
|
_pipeline.SwapState(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (src.Info.Target.IsMultisample())
|
|
||||||
|
var debugGroupName = "Blit Color ";
|
||||||
|
|
||||||
|
if (src.Info.Target.IsMultisample())
|
||||||
{
|
{
|
||||||
if (dst.Info.Format.IsSint())
|
if (dst.Info.Format.IsSint())
|
||||||
{
|
{
|
||||||
|
debugGroupName += "MS Int";
|
||||||
_pipeline.SetProgram(_programColorBlitMsI);
|
_pipeline.SetProgram(_programColorBlitMsI);
|
||||||
}
|
}
|
||||||
else if (dst.Info.Format.IsUint())
|
else if (dst.Info.Format.IsUint())
|
||||||
{
|
{
|
||||||
|
debugGroupName += "MS UInt";
|
||||||
_pipeline.SetProgram(_programColorBlitMsU);
|
_pipeline.SetProgram(_programColorBlitMsU);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
debugGroupName += "MS Float";
|
||||||
_pipeline.SetProgram(_programColorBlitMsF);
|
_pipeline.SetProgram(_programColorBlitMsF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -277,14 +283,17 @@ namespace Ryujinx.Graphics.Metal
|
||||||
{
|
{
|
||||||
if (dst.Info.Format.IsSint())
|
if (dst.Info.Format.IsSint())
|
||||||
{
|
{
|
||||||
|
debugGroupName += "Int";
|
||||||
_pipeline.SetProgram(_programColorBlitI);
|
_pipeline.SetProgram(_programColorBlitI);
|
||||||
}
|
}
|
||||||
else if (dst.Info.Format.IsUint())
|
else if (dst.Info.Format.IsUint())
|
||||||
{
|
{
|
||||||
|
debugGroupName += "UInt";
|
||||||
_pipeline.SetProgram(_programColorBlitU);
|
_pipeline.SetProgram(_programColorBlitU);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
debugGroupName += "Float";
|
||||||
_pipeline.SetProgram(_programColorBlitF);
|
_pipeline.SetProgram(_programColorBlitF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -303,7 +312,7 @@ namespace Ryujinx.Graphics.Metal
|
||||||
|
|
||||||
_pipeline.SetViewports(viewports);
|
_pipeline.SetViewports(viewports);
|
||||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||||
_pipeline.Draw(4, 1, 0, 0);
|
_pipeline.Draw(4, 1, 0, 0, debugGroupName);
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
if (clear)
|
if (clear)
|
||||||
|
@ -441,18 +450,22 @@ namespace Ryujinx.Graphics.Metal
|
||||||
|
|
||||||
private void BlitDepthStencilDraw(Texture src, bool isDepth)
|
private void BlitDepthStencilDraw(Texture src, bool isDepth)
|
||||||
{
|
{
|
||||||
|
string debugGroupName;
|
||||||
|
|
||||||
if (isDepth)
|
if (isDepth)
|
||||||
{
|
{
|
||||||
|
debugGroupName = "Depth Blit";
|
||||||
_pipeline.SetProgram(src.Info.Target.IsMultisample() ? _programDepthBlitMs : _programDepthBlit);
|
_pipeline.SetProgram(src.Info.Target.IsMultisample() ? _programDepthBlitMs : _programDepthBlit);
|
||||||
_pipeline.SetDepthTest(new DepthTestDescriptor(true, true, CompareOp.Always));
|
_pipeline.SetDepthTest(new DepthTestDescriptor(true, true, CompareOp.Always));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
debugGroupName = "Stencil Blit";
|
||||||
_pipeline.SetProgram(src.Info.Target.IsMultisample() ? _programStencilBlitMs : _programStencilBlit);
|
_pipeline.SetProgram(src.Info.Target.IsMultisample() ? _programStencilBlitMs : _programStencilBlit);
|
||||||
_pipeline.SetStencilTest(CreateStencilTestDescriptor(true));
|
_pipeline.SetStencilTest(CreateStencilTestDescriptor(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
_pipeline.Draw(4, 1, 0, 0);
|
_pipeline.Draw(4, 1, 0, 0, debugGroupName);
|
||||||
|
|
||||||
if (isDepth)
|
if (isDepth)
|
||||||
{
|
{
|
||||||
|
@ -522,7 +535,7 @@ namespace Ryujinx.Graphics.Metal
|
||||||
_pipeline.SetProgram(_programColorBlitF);
|
_pipeline.SetProgram(_programColorBlitF);
|
||||||
_pipeline.SetViewports(viewports);
|
_pipeline.SetViewports(viewports);
|
||||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||||
_pipeline.Draw(4, 1, 0, 0);
|
_pipeline.Draw(4, 1, 0, 0, "Draw Texture");
|
||||||
|
|
||||||
_renderer.BufferManager.Delete(bufferHandle);
|
_renderer.BufferManager.Delete(bufferHandle);
|
||||||
|
|
||||||
|
@ -572,7 +585,7 @@ namespace Ryujinx.Graphics.Metal
|
||||||
_pipeline.SetStorageBuffers(1, sbRanges);
|
_pipeline.SetStorageBuffers(1, sbRanges);
|
||||||
|
|
||||||
_pipeline.SetProgram(_programStrideChange);
|
_pipeline.SetProgram(_programStrideChange);
|
||||||
_pipeline.DispatchCompute(1 + elems / ConvertElementsPerWorkgroup, 1, 1);
|
_pipeline.DispatchCompute(1 + elems / ConvertElementsPerWorkgroup, 1, 1, "Change Stride");
|
||||||
|
|
||||||
// Restore previous state
|
// Restore previous state
|
||||||
_pipeline.SwapState(null);
|
_pipeline.SwapState(null);
|
||||||
|
@ -618,16 +631,21 @@ namespace Ryujinx.Graphics.Metal
|
||||||
Span<uint> componentMasks = stackalloc uint[index + 1];
|
Span<uint> componentMasks = stackalloc uint[index + 1];
|
||||||
componentMasks[index] = componentMask;
|
componentMasks[index] = componentMask;
|
||||||
|
|
||||||
|
var debugGroupName = "Clear Color ";
|
||||||
|
|
||||||
if (format.IsSint())
|
if (format.IsSint())
|
||||||
{
|
{
|
||||||
|
debugGroupName += "Int";
|
||||||
_pipeline.SetProgram(_programsColorClearI[index]);
|
_pipeline.SetProgram(_programsColorClearI[index]);
|
||||||
}
|
}
|
||||||
else if (format.IsUint())
|
else if (format.IsUint())
|
||||||
{
|
{
|
||||||
|
debugGroupName += "UInt";
|
||||||
_pipeline.SetProgram(_programsColorClearU[index]);
|
_pipeline.SetProgram(_programsColorClearU[index]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
debugGroupName += "Float";
|
||||||
_pipeline.SetProgram(_programsColorClearF[index]);
|
_pipeline.SetProgram(_programsColorClearF[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -637,7 +655,7 @@ namespace Ryujinx.Graphics.Metal
|
||||||
_pipeline.SetRenderTargetColorMasks(componentMasks);
|
_pipeline.SetRenderTargetColorMasks(componentMasks);
|
||||||
_pipeline.SetViewports(viewports);
|
_pipeline.SetViewports(viewports);
|
||||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||||
_pipeline.Draw(4, 1, 0, 0);
|
_pipeline.Draw(4, 1, 0, 0, debugGroupName);
|
||||||
|
|
||||||
// Restore previous state
|
// Restore previous state
|
||||||
_pipeline.SwapState(null, clearFlags, false);
|
_pipeline.SwapState(null, clearFlags, false);
|
||||||
|
@ -686,7 +704,7 @@ namespace Ryujinx.Graphics.Metal
|
||||||
_pipeline.SetViewports(viewports);
|
_pipeline.SetViewports(viewports);
|
||||||
_pipeline.SetDepthTest(new DepthTestDescriptor(true, depthMask, CompareOp.Always));
|
_pipeline.SetDepthTest(new DepthTestDescriptor(true, depthMask, CompareOp.Always));
|
||||||
_pipeline.SetStencilTest(CreateStencilTestDescriptor(stencilMask != 0, stencilValue, 0xFF, stencilMask));
|
_pipeline.SetStencilTest(CreateStencilTestDescriptor(stencilMask != 0, stencilValue, 0xFF, stencilMask));
|
||||||
_pipeline.Draw(4, 1, 0, 0);
|
_pipeline.Draw(4, 1, 0, 0, "Clear Depth Stencil");
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
_pipeline.SetDepthTest(new DepthTestDescriptor(false, false, CompareOp.Always));
|
_pipeline.SetDepthTest(new DepthTestDescriptor(false, false, CompareOp.Always));
|
||||||
|
|
|
@ -319,18 +319,85 @@ namespace Ryujinx.Graphics.Metal
|
||||||
BufferHolder.Copy(Cbs, srcBuffer, dstBuffer, srcOffset, dstOffset, size);
|
BufferHolder.Copy(Cbs, srcBuffer, dstBuffer, srcOffset, dstOffset, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void PushDebugGroup(string name)
|
||||||
|
{
|
||||||
|
var encoder = Encoders.CurrentEncoder;
|
||||||
|
var debugGroupName = StringHelper.NSString(name);
|
||||||
|
|
||||||
|
if (encoder == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Encoders.CurrentEncoderType)
|
||||||
|
{
|
||||||
|
case EncoderType.Render:
|
||||||
|
encoder.Value.PushDebugGroup(debugGroupName);
|
||||||
|
break;
|
||||||
|
case EncoderType.Blit:
|
||||||
|
encoder.Value.PushDebugGroup(debugGroupName);
|
||||||
|
break;
|
||||||
|
case EncoderType.Compute:
|
||||||
|
encoder.Value.PushDebugGroup(debugGroupName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PopDebugGroup()
|
||||||
|
{
|
||||||
|
var encoder = Encoders.CurrentEncoder;
|
||||||
|
|
||||||
|
if (encoder == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Encoders.CurrentEncoderType)
|
||||||
|
{
|
||||||
|
case EncoderType.Render:
|
||||||
|
encoder.Value.PopDebugGroup();
|
||||||
|
break;
|
||||||
|
case EncoderType.Blit:
|
||||||
|
encoder.Value.PopDebugGroup();
|
||||||
|
break;
|
||||||
|
case EncoderType.Compute:
|
||||||
|
encoder.Value.PopDebugGroup();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void DispatchCompute(int groupsX, int groupsY, int groupsZ)
|
public void DispatchCompute(int groupsX, int groupsY, int groupsZ)
|
||||||
|
{
|
||||||
|
DispatchCompute(groupsX, groupsY, groupsZ, String.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DispatchCompute(int groupsX, int groupsY, int groupsZ, string debugGroupName)
|
||||||
{
|
{
|
||||||
var computeCommandEncoder = GetOrCreateComputeEncoder(true);
|
var computeCommandEncoder = GetOrCreateComputeEncoder(true);
|
||||||
|
|
||||||
ComputeSize localSize = _encoderStateManager.ComputeLocalSize;
|
ComputeSize localSize = _encoderStateManager.ComputeLocalSize;
|
||||||
|
|
||||||
|
if (debugGroupName != String.Empty)
|
||||||
|
{
|
||||||
|
PushDebugGroup(debugGroupName);
|
||||||
|
}
|
||||||
|
|
||||||
computeCommandEncoder.DispatchThreadgroups(
|
computeCommandEncoder.DispatchThreadgroups(
|
||||||
new MTLSize { width = (ulong)groupsX, height = (ulong)groupsY, depth = (ulong)groupsZ },
|
new MTLSize { width = (ulong)groupsX, height = (ulong)groupsY, depth = (ulong)groupsZ },
|
||||||
new MTLSize { width = (ulong)localSize.X, height = (ulong)localSize.Y, depth = (ulong)localSize.Z });
|
new MTLSize { width = (ulong)localSize.X, height = (ulong)localSize.Y, depth = (ulong)localSize.Z });
|
||||||
|
|
||||||
|
if (debugGroupName != String.Empty)
|
||||||
|
{
|
||||||
|
PopDebugGroup();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Draw(int vertexCount, int instanceCount, int firstVertex, int firstInstance)
|
public void Draw(int vertexCount, int instanceCount, int firstVertex, int firstInstance)
|
||||||
|
{
|
||||||
|
Draw(vertexCount, instanceCount, firstVertex, firstInstance, String.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw(int vertexCount, int instanceCount, int firstVertex, int firstInstance, string debugGroupName)
|
||||||
{
|
{
|
||||||
if (vertexCount == 0)
|
if (vertexCount == 0)
|
||||||
{
|
{
|
||||||
|
@ -360,12 +427,22 @@ namespace Ryujinx.Graphics.Metal
|
||||||
var primitiveType = TopologyRemap(_encoderStateManager.Topology).Convert();
|
var primitiveType = TopologyRemap(_encoderStateManager.Topology).Convert();
|
||||||
var renderCommandEncoder = GetOrCreateRenderEncoder(true);
|
var renderCommandEncoder = GetOrCreateRenderEncoder(true);
|
||||||
|
|
||||||
|
if (debugGroupName != String.Empty)
|
||||||
|
{
|
||||||
|
PushDebugGroup(debugGroupName);
|
||||||
|
}
|
||||||
|
|
||||||
renderCommandEncoder.DrawPrimitives(
|
renderCommandEncoder.DrawPrimitives(
|
||||||
primitiveType,
|
primitiveType,
|
||||||
(ulong)firstVertex,
|
(ulong)firstVertex,
|
||||||
(ulong)vertexCount,
|
(ulong)vertexCount,
|
||||||
(ulong)instanceCount,
|
(ulong)instanceCount,
|
||||||
(ulong)firstInstance);
|
(ulong)firstInstance);
|
||||||
|
|
||||||
|
if (debugGroupName != String.Empty)
|
||||||
|
{
|
||||||
|
PopDebugGroup();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue