aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs')
-rw-r--r--Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs59
1 files changed, 59 insertions, 0 deletions
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)