aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Graphics3d
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/Graphics3d')
-rw-r--r--Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs7
-rw-r--r--Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs59
-rw-r--r--Ryujinx.Graphics/Graphics3d/NvGpuEngineM2mf.cs13
-rw-r--r--Ryujinx.Graphics/Graphics3d/NvGpuEngineP2mf.cs17
4 files changed, 93 insertions, 3 deletions
diff --git a/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs b/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs
index 361b1706..d42dca28 100644
--- a/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs
+++ b/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs
@@ -1,6 +1,7 @@
using Ryujinx.Graphics.Gal;
using Ryujinx.Graphics.Memory;
using Ryujinx.Graphics.Texture;
+using Ryujinx.Profiler;
namespace Ryujinx.Graphics.Graphics3d
{
@@ -40,6 +41,8 @@ namespace Ryujinx.Graphics.Graphics3d
private void TextureCopy(NvGpuVmm vmm)
{
+ Profile.Begin(Profiles.GPU.Engine2d.TextureCopy);
+
CopyOperation operation = (CopyOperation)ReadRegister(NvGpuEngine2dReg.CopyOperation);
int dstFormat = ReadRegister(NvGpuEngine2dReg.DstFormat);
@@ -221,6 +224,8 @@ namespace Ryujinx.Graphics.Graphics3d
dstBlitH);
vmm.IsRegionModified(dstKey, ImageUtils.GetSize(dstTexture), NvGpuBufferType.Texture);
+
+ Profile.End(Profiles.GPU.Engine2d.TextureCopy);
}
private static GalMemoryLayout GetLayout(bool linear)
@@ -255,4 +260,4 @@ namespace Ryujinx.Graphics.Graphics3d
return Registers[(int)reg];
}
}
-} \ No newline at end of file
+}
diff --git a/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs b/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs
index bbed642b..29b6cc5d 100644
--- a/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs
+++ b/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs
@@ -5,6 +5,7 @@ using Ryujinx.Graphics.Shader;
using Ryujinx.Graphics.Texture;
using System;
using System.Collections.Generic;
+using Ryujinx.Profiler;
namespace Ryujinx.Graphics.Graphics3d
{
@@ -89,7 +90,15 @@ namespace Ryujinx.Graphics.Graphics3d
{
if (_methods.TryGetValue(methCall.Method, out NvGpuMethod method))
{
+ ProfileConfig profile = Profiles.GPU.Engine3d.CallMethod;
+
+ profile.SessionItem = method.Method.Name;
+
+ Profile.Begin(profile);
+
method(vmm, methCall);
+
+ Profile.End(profile);
}
else
{
@@ -99,13 +108,19 @@ namespace Ryujinx.Graphics.Graphics3d
private void VertexEndGl(NvGpuVmm vmm, GpuMethodCall methCall)
{
+ Profile.Begin(Profiles.GPU.Engine3d.VertexEnd);
+
LockCaches();
+ Profile.Begin(Profiles.GPU.Engine3d.ConfigureState);
+
GalPipelineState state = new GalPipelineState();
// Framebuffer must be run configured because viewport dimensions may be used in other methods
SetFrameBuffer(state);
+ Profile.End(Profiles.GPU.Engine3d.ConfigureState);
+
for (int fbIndex = 0; fbIndex < 8; fbIndex++)
{
SetFrameBuffer(vmm, fbIndex);
@@ -135,6 +150,8 @@ namespace Ryujinx.Graphics.Graphics3d
DispatchRender(vmm, state);
UnlockCaches();
+
+ Profile.End(Profiles.GPU.Engine3d.VertexEnd);
}
private void LockCaches()
@@ -153,6 +170,8 @@ namespace Ryujinx.Graphics.Graphics3d
private void ClearBuffers(NvGpuVmm vmm, GpuMethodCall methCall)
{
+ Profile.Begin(Profiles.GPU.Engine3d.ClearBuffers);
+
int attachment = (methCall.Argument >> 6) & 0xf;
GalClearBufferFlags flags = (GalClearBufferFlags)(methCall.Argument & 0x3f);
@@ -178,10 +197,18 @@ namespace Ryujinx.Graphics.Graphics3d
_gpu.Renderer.Pipeline.ResetDepthMask();
_gpu.Renderer.Pipeline.ResetColorMask(attachment);
+
+ Profile.End(Profiles.GPU.Engine3d.ClearBuffers);
}
private void SetFrameBuffer(NvGpuVmm vmm, int fbIndex)
{
+ ProfileConfig profile = Profiles.GPU.Engine3d.SetFrameBuffer;
+
+ profile.SessionItem = fbIndex.ToString();
+
+ Profile.Begin(profile);
+
long va = MakeInt64From2xInt32(NvGpuEngine3dReg.FrameBufferNAddress + fbIndex * 0x10);
int surfFormat = ReadRegister(NvGpuEngine3dReg.FrameBufferNFormat + fbIndex * 0x10);
@@ -190,6 +217,8 @@ namespace Ryujinx.Graphics.Graphics3d
{
_gpu.Renderer.RenderTarget.UnbindColor(fbIndex);
+ Profile.End(profile);
+
return;
}
@@ -227,6 +256,8 @@ namespace Ryujinx.Graphics.Graphics3d
_gpu.ResourceManager.SendColorBuffer(vmm, key, fbIndex, image);
_gpu.Renderer.RenderTarget.SetViewport(fbIndex, _viewportX0, _viewportY0, _viewportX1 - _viewportX0, _viewportY1 - _viewportY0);
+
+ Profile.End(profile);
}
private void SetFrameBuffer(GalPipelineState state)
@@ -248,6 +279,8 @@ namespace Ryujinx.Graphics.Graphics3d
private void SetZeta(NvGpuVmm vmm)
{
+ Profile.Begin(Profiles.GPU.Engine3d.SetZeta);
+
long va = MakeInt64From2xInt32(NvGpuEngine3dReg.ZetaAddress);
int zetaFormat = ReadRegister(NvGpuEngine3dReg.ZetaFormat);
@@ -264,6 +297,8 @@ namespace Ryujinx.Graphics.Graphics3d
{
_gpu.Renderer.RenderTarget.UnbindZeta();
+ Profile.End(Profiles.GPU.Engine3d.SetZeta);
+
return;
}
@@ -278,10 +313,14 @@ namespace Ryujinx.Graphics.Graphics3d
GalImage image = new GalImage(width, height, 1, 1, 1, gobBlockHeight, 1, layout, format, GalTextureTarget.TwoD);
_gpu.ResourceManager.SendZetaBuffer(vmm, key, image);
+
+ Profile.End(Profiles.GPU.Engine3d.SetZeta);
}
private long[] UploadShaders(NvGpuVmm vmm)
{
+ Profile.Begin(Profiles.GPU.Engine3d.UploadShaders);
+
long[] keys = new long[5];
long basePosition = MakeInt64From2xInt32(NvGpuEngine3dReg.ShaderAddress);
@@ -339,6 +378,8 @@ namespace Ryujinx.Graphics.Graphics3d
_gpu.Renderer.Shader.Bind(key);
}
+ Profile.End(Profiles.GPU.Engine3d.UploadShaders);
+
return keys;
}
@@ -619,6 +660,8 @@ namespace Ryujinx.Graphics.Graphics3d
private void UploadTextures(NvGpuVmm vmm, GalPipelineState state, long[] keys)
{
+ Profile.Begin(Profiles.GPU.Engine3d.UploadTextures);
+
long baseShPosition = MakeInt64From2xInt32(NvGpuEngine3dReg.ShaderAddress);
int textureCbIndex = ReadRegister(NvGpuEngine3dReg.TextureCbIndex);
@@ -660,6 +703,8 @@ namespace Ryujinx.Graphics.Graphics3d
_gpu.Renderer.Texture.Bind(key, index, image);
_gpu.Renderer.Texture.SetSampler(image, sampler);
}
+
+ Profile.End(Profiles.GPU.Engine3d.UploadTextures);
}
private (long, GalImage, GalTextureSampler) UploadTexture(NvGpuVmm vmm, int textureHandle)
@@ -671,6 +716,8 @@ namespace Ryujinx.Graphics.Graphics3d
return (0, default(GalImage), default(GalTextureSampler));
}
+ Profile.Begin(Profiles.GPU.Engine3d.UploadTexture);
+
bool linkedTsc = ReadRegisterBool(NvGpuEngine3dReg.LinkedTsc);
int ticIndex = (textureHandle >> 0) & 0xfffff;
@@ -702,17 +749,23 @@ namespace Ryujinx.Graphics.Graphics3d
if (key == -1)
{
+ Profile.End(Profiles.GPU.Engine3d.UploadTexture);
+
//FIXME: Shouldn't ignore invalid addresses.
return (0, default(GalImage), default(GalTextureSampler));
}
_gpu.ResourceManager.SendTexture(vmm, key, image);
+ Profile.End(Profiles.GPU.Engine3d.UploadTexture);
+
return (key, image, sampler);
}
private void UploadConstBuffers(NvGpuVmm vmm, GalPipelineState state, long[] keys)
{
+ Profile.Begin(Profiles.GPU.Engine3d.UploadConstBuffers);
+
for (int stage = 0; stage < keys.Length; stage++)
{
foreach (CBufferDescriptor desc in _gpu.Renderer.Shader.GetConstBufferUsage(keys[stage]))
@@ -741,10 +794,14 @@ namespace Ryujinx.Graphics.Graphics3d
state.ConstBufferKeys[stage][desc.Slot] = key;
}
}
+
+ Profile.End(Profiles.GPU.Engine3d.UploadConstBuffers);
}
private void UploadVertexArrays(NvGpuVmm vmm, GalPipelineState state)
{
+ Profile.Begin(Profiles.GPU.Engine3d.UploadVertexArrays);
+
long ibPosition = MakeInt64From2xInt32(NvGpuEngine3dReg.IndexArrayAddress);
long iboKey = vmm.GetPhysicalAddress(ibPosition);
@@ -956,6 +1013,8 @@ namespace Ryujinx.Graphics.Graphics3d
state.VertexBindings[index].Divisor = vertexDivisor;
state.VertexBindings[index].Attribs = attribs[index].ToArray();
}
+
+ Profile.End(Profiles.GPU.Engine3d.UploadVertexArrays);
}
private void DispatchRender(NvGpuVmm vmm, GalPipelineState state)
diff --git a/Ryujinx.Graphics/Graphics3d/NvGpuEngineM2mf.cs b/Ryujinx.Graphics/Graphics3d/NvGpuEngineM2mf.cs
index 45b0bbd7..172c919b 100644
--- a/Ryujinx.Graphics/Graphics3d/NvGpuEngineM2mf.cs
+++ b/Ryujinx.Graphics/Graphics3d/NvGpuEngineM2mf.cs
@@ -1,6 +1,7 @@
using Ryujinx.Graphics.Memory;
using Ryujinx.Graphics.Texture;
using System.Collections.Generic;
+using Ryujinx.Profiler;
namespace Ryujinx.Graphics.Graphics3d
{
@@ -37,7 +38,13 @@ namespace Ryujinx.Graphics.Graphics3d
{
if (_methods.TryGetValue(methCall.Method, out NvGpuMethod method))
{
+ ProfileConfig profile = Profiles.GPU.EngineM2mf.CallMethod;
+
+ profile.SessionItem = method.Method.Name;
+
+ Profile.Begin(profile);
method(vmm, methCall);
+ Profile.End(profile);
}
else
{
@@ -47,6 +54,8 @@ namespace Ryujinx.Graphics.Graphics3d
private void Execute(NvGpuVmm vmm, GpuMethodCall methCall)
{
+ Profile.Begin(Profiles.GPU.EngineM2mf.Execute);
+
//TODO: Some registers and copy modes are still not implemented.
int control = methCall.Argument;
@@ -176,6 +185,8 @@ namespace Ryujinx.Graphics.Graphics3d
{
vmm.Memory.CopyBytes(srcPa, dstPa, xCount);
}
+
+ Profile.End(Profiles.GPU.EngineM2mf.Execute);
}
private long MakeInt64From2xInt32(NvGpuEngineM2mfReg reg)
@@ -200,4 +211,4 @@ namespace Ryujinx.Graphics.Graphics3d
Registers[(int)reg] = value;
}
}
-} \ No newline at end of file
+}
diff --git a/Ryujinx.Graphics/Graphics3d/NvGpuEngineP2mf.cs b/Ryujinx.Graphics/Graphics3d/NvGpuEngineP2mf.cs
index d24f2303..83ad0e70 100644
--- a/Ryujinx.Graphics/Graphics3d/NvGpuEngineP2mf.cs
+++ b/Ryujinx.Graphics/Graphics3d/NvGpuEngineP2mf.cs
@@ -1,6 +1,7 @@
using Ryujinx.Graphics.Memory;
using Ryujinx.Graphics.Texture;
using System.Collections.Generic;
+using Ryujinx.Profiler;
namespace Ryujinx.Graphics.Graphics3d
{
@@ -54,7 +55,13 @@ namespace Ryujinx.Graphics.Graphics3d
{
if (_methods.TryGetValue(methCall.Method, out NvGpuMethod method))
{
+ ProfileConfig profile = Profiles.GPU.EngineP2mf.PushData;
+
+ profile.SessionItem = method.Method.Name;
+
+ Profile.Begin(profile);
method(vmm, methCall);
+ Profile.End(profile);
}
else
{
@@ -64,6 +71,8 @@ namespace Ryujinx.Graphics.Graphics3d
private void Execute(NvGpuVmm vmm, GpuMethodCall methCall)
{
+ Profile.Begin(Profiles.GPU.EngineP2mf.Execute);
+
//TODO: Some registers and copy modes are still not implemented.
int control = methCall.Argument;
@@ -97,6 +106,8 @@ namespace Ryujinx.Graphics.Graphics3d
_copySize = lineLengthIn * lineCount;
_buffer = new byte[_copySize];
+
+ Profile.End(Profiles.GPU.EngineP2mf.Execute);
}
private void PushData(NvGpuVmm vmm, GpuMethodCall methCall)
@@ -106,6 +117,8 @@ namespace Ryujinx.Graphics.Graphics3d
return;
}
+ Profile.Begin(Profiles.GPU.EngineP2mf.PushData);
+
for (int shift = 0; shift < 32 && _copyOffset < _copySize; shift += 8, _copyOffset++)
{
_buffer[_copyOffset] = (byte)(methCall.Argument >> shift);
@@ -137,6 +150,8 @@ namespace Ryujinx.Graphics.Graphics3d
_buffer = null;
}
+
+ Profile.End(Profiles.GPU.EngineP2mf.PushData);
}
private long MakeInt64From2xInt32(NvGpuEngineP2mfReg reg)
@@ -161,4 +176,4 @@ namespace Ryujinx.Graphics.Graphics3d
Registers[(int)reg] = value;
}
}
-} \ No newline at end of file
+}