aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Engine/Methods.cs
diff options
context:
space:
mode:
authorgdk <gab.dark.100@gmail.com>2019-10-26 14:50:52 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit8cba252b238ee6cf6599ad2fc57793e6f76c5e2e (patch)
tree5ee98eb374a46e210d4a960f5e1d58b42b3f27eb /Ryujinx.Graphics.Gpu/Engine/Methods.cs
parent1b7d95519569639135a68e7ebda5148f3263217c (diff)
Add per-source type memory change tracking, simplified state change tracking, other fixes
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/Methods.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/Methods.cs343
1 files changed, 159 insertions, 184 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
index c35d6634..5d90573c 100644
--- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
@@ -18,6 +18,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
private ShaderCache _shaderCache;
+ private ShaderProgramInfo[] _currentProgramInfo;
+
private BufferManager _bufferManager;
private TextureManager _textureManager;
@@ -33,6 +35,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
_shaderCache = new ShaderCache(_context);
+ _currentProgramInfo = new ShaderProgramInfo[Constants.TotalShaderStages];
+
_bufferManager = new BufferManager(context);
_textureManager = new TextureManager(context);
@@ -41,128 +45,184 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void RegisterCallbacks()
{
- _context.State.RegisterCopyBufferCallback(CopyBuffer);
- _context.State.RegisterCopyTextureCallback(CopyTexture);
-
- _context.State.RegisterDrawEndCallback(DrawEnd);
-
- _context.State.RegisterDrawBeginCallback(DrawBegin);
-
- _context.State.RegisterSetIndexCountCallback(SetIndexCount);
+ _context.State.RegisterCallback(MethodOffset.LaunchDma, LaunchDma);
+ _context.State.RegisterCallback(MethodOffset.LoadInlineData, LoadInlineData);
- _context.State.RegisterClearCallback(Clear);
-
- _context.State.RegisterReportCallback(Report);
-
- _context.State.RegisterUniformBufferUpdateCallback(UniformBufferUpdate);
+ _context.State.RegisterCallback(MethodOffset.Dispatch, Dispatch);
- _context.State.RegisterUniformBufferBind0Callback(UniformBufferBind0);
- _context.State.RegisterUniformBufferBind1Callback(UniformBufferBind1);
- _context.State.RegisterUniformBufferBind2Callback(UniformBufferBind2);
- _context.State.RegisterUniformBufferBind3Callback(UniformBufferBind3);
- _context.State.RegisterUniformBufferBind4Callback(UniformBufferBind4);
+ _context.State.RegisterCallback(MethodOffset.CopyBuffer, CopyBuffer);
+ _context.State.RegisterCallback(MethodOffset.CopyTexture, CopyTexture);
_context.State.RegisterCallback(MethodOffset.TextureBarrier, TextureBarrier);
_context.State.RegisterCallback(MethodOffset.InvalidateTextures, InvalidateTextures);
_context.State.RegisterCallback(MethodOffset.TextureBarrierTiled, TextureBarrierTiled);
-
_context.State.RegisterCallback(MethodOffset.ResetCounter, ResetCounter);
- _context.State.RegisterCallback(MethodOffset.Inline2MemoryExecute, Execute);
- _context.State.RegisterCallback(MethodOffset.Inline2MemoryPushData, PushData);
+ _context.State.RegisterCallback(MethodOffset.DrawEnd, DrawEnd);
+ _context.State.RegisterCallback(MethodOffset.DrawBegin, DrawBegin);
- _context.State.RegisterCallback(MethodOffset.Dispatch, Dispatch);
+ _context.State.RegisterCallback(MethodOffset.IndexBufferCount, SetIndexBufferCount);
+
+ _context.State.RegisterCallback(MethodOffset.Clear, Clear);
+
+ _context.State.RegisterCallback(MethodOffset.Report, Report);
+
+ _context.State.RegisterCallback(MethodOffset.UniformBufferUpdateData, 16, UniformBufferUpdate);
+
+ _context.State.RegisterCallback(MethodOffset.UniformBufferBindVertex, UniformBufferBindVertex);
+ _context.State.RegisterCallback(MethodOffset.UniformBufferBindTessControl, UniformBufferBindTessControl);
+ _context.State.RegisterCallback(MethodOffset.UniformBufferBindTessEvaluation, UniformBufferBindTessEvaluation);
+ _context.State.RegisterCallback(MethodOffset.UniformBufferBindGeometry, UniformBufferBindGeometry);
+ _context.State.RegisterCallback(MethodOffset.UniformBufferBindFragment, UniformBufferBindFragment);
}
public Image.Texture GetTexture(ulong address) => _textureManager.Find2(address);
private void UpdateState()
{
- if ((_context.State.StateWriteFlags & StateWriteFlags.Any) == 0)
- {
- CommitBindings();
-
- return;
- }
-
// Shaders must be the first one to be updated if modified, because
// some of the other state depends on information from the currently
// bound shaders.
- if ((_context.State.StateWriteFlags & StateWriteFlags.ShaderState) != 0)
+ if (_context.State.QueryModified(MethodOffset.ShaderBaseAddress, MethodOffset.ShaderState))
{
UpdateShaderState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.RenderTargetGroup) != 0)
- {
- UpdateRenderTargetGroupState();
- }
+ UpdateRenderTargetStateIfNeeded();
- if ((_context.State.StateWriteFlags & StateWriteFlags.DepthTestState) != 0)
+ if (_context.State.QueryModified(MethodOffset.DepthTestEnable,
+ MethodOffset.DepthWriteEnable,
+ MethodOffset.DepthTestFunc))
{
UpdateDepthTestState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.ViewportTransform) != 0)
+ if (_context.State.QueryModified(MethodOffset.ViewportTransform, MethodOffset.ViewportExtents))
{
UpdateViewportTransform();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.DepthBiasState) != 0)
+ if (_context.State.QueryModified(MethodOffset.DepthBiasState,
+ MethodOffset.DepthBiasFactor,
+ MethodOffset.DepthBiasUnits,
+ MethodOffset.DepthBiasClamp))
{
UpdateDepthBiasState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.StencilTestState) != 0)
+ if (_context.State.QueryModified(MethodOffset.StencilBackMasks,
+ MethodOffset.StencilTestState,
+ MethodOffset.StencilBackTestState))
{
UpdateStencilTestState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.SamplerPoolState) != 0)
+ // Pools.
+ if (_context.State.QueryModified(MethodOffset.SamplerPoolState))
{
UpdateSamplerPoolState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.TexturePoolState) != 0)
+ if (_context.State.QueryModified(MethodOffset.TexturePoolState))
{
UpdateTexturePoolState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.InputAssemblerGroup) != 0)
+ // Input assembler state.
+ if (_context.State.QueryModified(MethodOffset.VertexAttribState))
{
- UpdateInputAssemblerGroupState();
+ UpdateVertexAttribState();
+ }
+
+ if (_context.State.QueryModified(MethodOffset.PrimitiveRestartState))
+ {
+ UpdatePrimitiveRestartState();
+ }
+
+ if (_context.State.QueryModified(MethodOffset.IndexBufferState))
+ {
+ UpdateIndexBufferState();
+ }
+
+ if (_context.State.QueryModified(MethodOffset.VertexBufferDrawState,
+ MethodOffset.VertexBufferInstanced,
+ MethodOffset.VertexBufferState,
+ MethodOffset.VertexBufferEndAddress))
+ {
+ UpdateVertexBufferState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.FaceState) != 0)
+ if (_context.State.QueryModified(MethodOffset.FaceState))
{
UpdateFaceState();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.RtColorMask) != 0)
+ if (_context.State.QueryModified(MethodOffset.RtColorMask))
{
UpdateRtColorMask();
}
- if ((_context.State.StateWriteFlags & StateWriteFlags.BlendState) != 0)
+ if (_context.State.QueryModified(MethodOffset.BlendEnable, MethodOffset.BlendState))
{
UpdateBlendState();
}
- _context.State.StateWriteFlags &= ~StateWriteFlags.Any;
-
CommitBindings();
}
private void CommitBindings()
{
+ UpdateStorageBuffers();
+
_bufferManager.CommitBindings();
_textureManager.CommitGraphicsBindings();
}
- private void UpdateRenderTargetGroupState()
+ private void UpdateStorageBuffers()
+ {
+ for (int stage = 0; stage < _currentProgramInfo.Length; stage++)
+ {
+ ShaderProgramInfo info = _currentProgramInfo[stage];
+
+ if (info == null)
+ {
+ continue;
+ }
+
+ for (int index = 0; index < info.SBuffers.Count; index++)
+ {
+ BufferDescriptor sb = info.SBuffers[index];
+
+ ulong sbDescAddress = _bufferManager.GetGraphicsUniformBufferAddress(stage, 0);
+
+ int sbDescOffset = 0x110 + stage * 0x100 + sb.Slot * 0x10;
+
+ sbDescAddress += (ulong)sbDescOffset;
+
+ Span<byte> sbDescriptorData = _context.PhysicalMemory.Read(sbDescAddress, 0x10);
+
+ SbDescriptor sbDescriptor = MemoryMarshal.Cast<byte, SbDescriptor>(sbDescriptorData)[0];
+
+ _bufferManager.SetGraphicsStorageBuffer(stage, sb.Slot, sbDescriptor.PackAddress(), (uint)sbDescriptor.Size);
+ }
+ }
+ }
+
+ private void UpdateRenderTargetStateIfNeeded()
+ {
+ if (_context.State.QueryModified(MethodOffset.RtColorState,
+ MethodOffset.RtDepthStencilState,
+ MethodOffset.RtDepthStencilSize,
+ MethodOffset.RtDepthStencilEnable))
+ {
+ UpdateRenderTargetState();
+ }
+ }
+
+ private void UpdateRenderTargetState()
{
- TextureMsaaMode msaaMode = _context.State.GetRtMsaaMode();
+ var msaaMode = _context.State.Get<TextureMsaaMode>(MethodOffset.RtMsaaMode);
int samplesInX = msaaMode.SamplesInX();
int samplesInY = msaaMode.SamplesInY();
@@ -173,7 +233,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
{
for (int index = 0; index < Constants.TotalRenderTargets; index++)
{
- RtColorState colorState = _context.State.GetRtColorState(index);
+ var colorState = _context.State.Get<RtColorState>(MethodOffset.RtColorState, index);
if (!IsRtEnabled(colorState))
{
@@ -189,7 +249,10 @@ namespace Ryujinx.Graphics.Gpu.Engine
_textureManager.SetRenderTargetColor(index, color);
- color.Modified = true;
+ if (color != null)
+ {
+ color.Modified = true;
+ }
}
}
else
@@ -199,14 +262,14 @@ namespace Ryujinx.Graphics.Gpu.Engine
color3D.Modified = true;
}
- bool dsEnable = _context.State.Get<bool>(MethodOffset.RtDepthStencilEnable);
+ bool dsEnable = _context.State.Get<Boolean32>(MethodOffset.RtDepthStencilEnable);
Image.Texture depthStencil = null;
if (dsEnable)
{
- var dsState = _context.State.GetRtDepthStencilState();
- var dsSize = _context.State.GetRtDepthStencilSize();
+ var dsState = _context.State.Get<RtDepthStencilState>(MethodOffset.RtDepthStencilState);
+ var dsSize = _context.State.Get<Size3D> (MethodOffset.RtDepthStencilSize);
depthStencil = _textureManager.FindOrCreateTexture(
dsState,
@@ -216,11 +279,16 @@ namespace Ryujinx.Graphics.Gpu.Engine
}
_textureManager.SetRenderTargetDepthStencil(depthStencil);
+
+ if (depthStencil != null)
+ {
+ depthStencil.Modified = true;
+ }
}
private Image.Texture Get3DRenderTarget(int samplesInX, int samplesInY)
{
- RtColorState colorState0 = _context.State.GetRtColorState(0);
+ var colorState0 = _context.State.Get<RtColorState>(MethodOffset.RtColorState, 0);
if (!IsRtEnabled(colorState0) || !colorState0.MemoryLayout.UnpackIsTarget3D() || colorState0.Depth != 1)
{
@@ -232,7 +300,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
for (int index = 1; index < Constants.TotalRenderTargets; index++)
{
- RtColorState colorState = _context.State.GetRtColorState(index);
+ var colorState = _context.State.Get<RtColorState>(MethodOffset.RtColorState, index);
if (!IsRtEnabled(colorState))
{
@@ -266,9 +334,9 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void UpdateDepthTestState()
{
_context.Renderer.Pipeline.SetDepthTest(new DepthTestDescriptor(
- _context.State.GetDepthTestEnable().IsTrue(),
- _context.State.GetDepthWriteEnable().IsTrue(),
- _context.State.GetDepthTestFunc()));
+ _context.State.Get<Boolean32>(MethodOffset.DepthTestEnable),
+ _context.State.Get<Boolean32>(MethodOffset.DepthWriteEnable),
+ _context.State.Get<CompareOp>(MethodOffset.DepthTestFunc)));
}
private void UpdateViewportTransform()
@@ -277,8 +345,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
for (int index = 0; index < Constants.TotalViewports; index++)
{
- var transform = _context.State.Get<ViewportTransform>(MethodOffset.ViewportTransform + index * 8);
- var extents = _context.State.Get<ViewportExtents> (MethodOffset.ViewportExtents + index * 4);
+ var transform = _context.State.Get<ViewportTransform>(MethodOffset.ViewportTransform, index);
+ var extents = _context.State.Get<ViewportExtents> (MethodOffset.ViewportExtents, index);
float x = transform.TranslateX - MathF.Abs(transform.ScaleX);
float y = transform.TranslateY - MathF.Abs(transform.ScaleY);
@@ -303,7 +371,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void UpdateDepthBiasState()
{
- var polygonOffset = _context.State.Get<DepthBiasState>(MethodOffset.DepthBiasState);
+ var depthBias = _context.State.Get<DepthBiasState>(MethodOffset.DepthBiasState);
float factor = _context.State.Get<float>(MethodOffset.DepthBiasFactor);
float units = _context.State.Get<float>(MethodOffset.DepthBiasUnits);
@@ -311,18 +379,18 @@ namespace Ryujinx.Graphics.Gpu.Engine
PolygonModeMask enables = 0;
- enables = (polygonOffset.PointEnable.IsTrue() ? PolygonModeMask.Point : 0);
- enables |= (polygonOffset.LineEnable.IsTrue() ? PolygonModeMask.Line : 0);
- enables |= (polygonOffset.FillEnable.IsTrue() ? PolygonModeMask.Fill : 0);
+ enables = (depthBias.PointEnable ? PolygonModeMask.Point : 0);
+ enables |= (depthBias.LineEnable ? PolygonModeMask.Line : 0);
+ enables |= (depthBias.FillEnable ? PolygonModeMask.Fill : 0);
_context.Renderer.Pipeline.SetDepthBias(enables, factor, units, clamp);
}
private void UpdateStencilTestState()
{
- StencilBackMasks backMasks = _context.State.GetStencilBackMasks();
- StencilTestState test = _context.State.GetStencilTestState();
- StencilBackTestState backTest = _context.State.GetStencilBackTestState();
+ var backMasks = _context.State.Get<StencilBackMasks> (MethodOffset.StencilBackMasks);
+ var test = _context.State.Get<StencilTestState> (MethodOffset.StencilTestState);
+ var backTest = _context.State.Get<StencilBackTestState>(MethodOffset.StencilBackTestState);
CompareOp backFunc;
StencilOp backSFail;
@@ -332,7 +400,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
int backFuncMask;
int backMask;
- if (backTest.TwoSided.IsTrue())
+ if (backTest.TwoSided)
{
backFunc = backTest.BackFunc;
backSFail = backTest.BackSFail;
@@ -354,7 +422,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
}
_context.Renderer.Pipeline.SetStencilTest(new StencilTestDescriptor(
- test.Enable.IsTrue(),
+ test.Enable,
test.FrontFunc,
test.FrontSFail,
test.FrontDpPass,
@@ -373,42 +441,18 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void UpdateSamplerPoolState()
{
- PoolState samplerPool = _context.State.GetSamplerPoolState();
+ var samplerPool = _context.State.Get<PoolState>(MethodOffset.SamplerPoolState);
_textureManager.SetGraphicsSamplerPool(samplerPool.Address.Pack(), samplerPool.MaximumId);
}
private void UpdateTexturePoolState()
{
- PoolState texturePool = _context.State.GetTexturePoolState();
+ var texturePool = _context.State.Get<PoolState>(MethodOffset.TexturePoolState);
_textureManager.SetGraphicsTexturePool(texturePool.Address.Pack(), texturePool.MaximumId);
- _textureManager.SetGraphicsTextureBufferIndex(_context.State.GetTextureBufferIndex());
- }
-
- private void UpdateInputAssemblerGroupState()
- {
- // Must be updated before the vertex buffer.
- if ((_context.State.StateWriteFlags & StateWriteFlags.VertexAttribState) != 0)
- {
- UpdateVertexAttribState();
- }
-
- if ((_context.State.StateWriteFlags & StateWriteFlags.PrimitiveRestartState) != 0)
- {
- UpdatePrimitiveRestartState();
- }
-
- if ((_context.State.StateWriteFlags & StateWriteFlags.IndexBufferState) != 0)
- {
- UpdateIndexBufferState();
- }
-
- if ((_context.State.StateWriteFlags & StateWriteFlags.VertexBufferState) != 0)
- {
- UpdateVertexBufferState();
- }
+ _textureManager.SetGraphicsTextureBufferIndex(_context.State.Get<int>(MethodOffset.TextureBufferIndex));
}
private void UpdateVertexAttribState()
@@ -417,7 +461,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
for (int index = 0; index < 16; index++)
{
- VertexAttribState vertexAttrib = _context.State.GetVertexAttribState(index);
+ var vertexAttrib = _context.State.Get<VertexAttribState>(MethodOffset.VertexAttribState, index);
if (!FormatTable.TryGetAttribFormat(vertexAttrib.UnpackFormat(), out Format format))
{
@@ -446,7 +490,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void UpdateIndexBufferState()
{
- IndexBufferState indexBuffer = _context.State.GetIndexBufferState();
+ var indexBuffer = _context.State.Get<IndexBufferState>(MethodOffset.IndexBufferState);
_firstIndex = indexBuffer.First;
_indexCount = indexBuffer.Count;
@@ -475,70 +519,13 @@ namespace Ryujinx.Graphics.Gpu.Engine
UpdateVertexBufferState();
}
- private uint GetIndexBufferMaxIndex(ulong gpuVa, ulong size, IndexType type)
- {
- ulong address = _context.MemoryManager.Translate(gpuVa);
-
- Span<byte> data = _context.PhysicalMemory.Read(address, size);
-
- uint maxIndex = 0;
-
- switch (type)
- {
- case IndexType.UByte:
- {
- for (int index = 0; index < data.Length; index++)
- {
- if (maxIndex < data[index])
- {
- maxIndex = data[index];
- }
- }
-
- break;
- }
-
- case IndexType.UShort:
- {
- Span<ushort> indices = MemoryMarshal.Cast<byte, ushort>(data);
-
- for (int index = 0; index < indices.Length; index++)
- {
- if (maxIndex < indices[index])
- {
- maxIndex = indices[index];
- }
- }
-
- break;
- }
-
- case IndexType.UInt:
- {
- Span<uint> indices = MemoryMarshal.Cast<byte, uint>(data);
-
- for (int index = 0; index < indices.Length; index++)
- {
- if (maxIndex < indices[index])
- {
- maxIndex = indices[index];
- }
- }
-
- break;
- }
- }
-
- return maxIndex;
- }
-
private void UpdateVertexBufferState()
{
_isAnyVbInstanced = false;
for (int index = 0; index < 16; index++)
{
- VertexBufferState vertexBuffer = _context.State.GetVertexBufferState(index);
+ var vertexBuffer = _context.State.Get<VertexBufferState>(MethodOffset.VertexBufferState, index);
if (!vertexBuffer.UnpackEnable())
{
@@ -547,13 +534,13 @@ namespace Ryujinx.Graphics.Gpu.Engine
continue;
}
- GpuVa endAddress = _context.State.GetVertexBufferEndAddress(index);
+ GpuVa endAddress = _context.State.Get<GpuVa>(MethodOffset.VertexBufferEndAddress, index);
ulong address = vertexBuffer.Address.Pack();
int stride = vertexBuffer.UnpackStride();
- bool instanced = _context.State.Get<bool>(MethodOffset.VertexBufferInstanced + index);
+ bool instanced = _context.State.Get<Boolean32>(MethodOffset.VertexBufferInstanced + index);
int divisor = instanced ? vertexBuffer.Divisor : 0;
@@ -571,9 +558,9 @@ namespace Ryujinx.Graphics.Gpu.Engine
{
// For non-indexed draws, we can guess the size from the vertex count
// and stride.
- int firstInstance = _context.State.GetBaseInstance();
+ int firstInstance = _context.State.Get<int>(MethodOffset.FirstInstance);
- VertexBufferDrawState drawState = _context.State.GetVertexBufferDrawState();
+ var drawState = _context.State.Get<VertexBufferDrawState>(MethodOffset.VertexBufferDrawState);
size = (ulong)((firstInstance + drawState.First + drawState.Count) * stride);
}
@@ -584,9 +571,9 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void UpdateFaceState()
{
- FaceState face = _context.State.GetFaceState();
+ var face = _context.State.Get<FaceState>(MethodOffset.FaceState);
- _context.Renderer.Pipeline.SetFaceCulling(face.CullEnable.IsTrue(), face.CullFace);
+ _context.Renderer.Pipeline.SetFaceCulling(face.CullEnable, face.CullFace);
_context.Renderer.Pipeline.SetFrontFace(face.FrontFace);
}
@@ -597,7 +584,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
for (int index = 0; index < Constants.TotalRenderTargets; index++)
{
- RtColorMask colorMask = _context.State.Get<RtColorMask>(MethodOffset.RtColorMask + index);
+ var colorMask = _context.State.Get<RtColorMask>(MethodOffset.RtColorMask, index);
uint componentMask = 0;
@@ -618,12 +605,12 @@ namespace Ryujinx.Graphics.Gpu.Engine
for (int index = 0; index < 8; index++)
{
- bool blendEnable = _context.State.GetBlendEnable(index).IsTrue();
+ bool enable = _context.State.Get<Boolean32>(MethodOffset.BlendEnable, index);
- BlendState blend = _context.State.GetBlendState(index);
+ var blend = _context.State.Get<BlendState>(MethodOffset.BlendState, index);
BlendDescriptor descriptor = new BlendDescriptor(
- blendEnable,
+ enable,
blend.ColorOp,
blend.ColorSrcFactor,
blend.ColorDstFactor,
@@ -656,11 +643,11 @@ namespace Ryujinx.Graphics.Gpu.Engine
Span<ulong> addressesArray = MemoryMarshal.Cast<ShaderAddresses, ulong>(addressesSpan);
- ulong baseAddress = _context.State.GetShaderBaseAddress().Pack();
+ ulong baseAddress = _context.State.Get<GpuVa>(MethodOffset.ShaderBaseAddress).Pack();
for (int index = 0; index < 6; index++)
{
- ShaderState shader = _context.State.GetShaderState(index);
+ var shader = _context.State.Get<ShaderState>(MethodOffset.ShaderState, index);
if (!shader.UnpackEnable() && index != 1)
{
@@ -678,6 +665,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
{
ShaderProgramInfo info = gs.Shader[stage]?.Info;
+ _currentProgramInfo[stage] = info;
+
if (info == null)
{
continue;
@@ -714,21 +703,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
for (int index = 0; index < info.SBuffers.Count; index++)
{
- BufferDescriptor sb = info.SBuffers[index];
-
- sbEnableMask |= 1u << sb.Slot;
-
- ulong sbDescAddress = _bufferManager.GetGraphicsUniformBufferAddress(stage, 0);
-
- int sbDescOffset = 0x110 + stage * 0x100 + sb.Slot * 0x10;
-
- sbDescAddress += (ulong)sbDescOffset;
-
- Span<byte> sbDescriptorData = _context.PhysicalMemory.Read(sbDescAddress, 0x10);
-
- SbDescriptor sbDescriptor = MemoryMarshal.Cast<byte, SbDescriptor>(sbDescriptorData)[0];
-
- _bufferManager.SetGraphicsStorageBuffer(stage, sb.Slot, sbDescriptor.PackAddress(), (uint)sbDescriptor.Size);
+ sbEnableMask |= 1u << info.SBuffers[index].Slot;
}
for (int index = 0; index < info.CBuffers.Count; index++)