aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Graphics.Gpu/Image/SamplerPool.cs9
-rw-r--r--Ryujinx.Graphics.Gpu/Image/TexturePool.cs13
-rw-r--r--Ryujinx.Graphics.Gpu/Memory/BufferManager.cs17
-rw-r--r--Ryujinx.Graphics.Gpu/State/GpuState.cs45
4 files changed, 65 insertions, 19 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/SamplerPool.cs b/Ryujinx.Graphics.Gpu/Image/SamplerPool.cs
index 970a0983..55555109 100644
--- a/Ryujinx.Graphics.Gpu/Image/SamplerPool.cs
+++ b/Ryujinx.Graphics.Gpu/Image/SamplerPool.cs
@@ -5,6 +5,8 @@ namespace Ryujinx.Graphics.Gpu.Image
{
class SamplerPool : Pool<Sampler>
{
+ private int _sequenceNumber;
+
public SamplerPool(GpuContext context, ulong address, int maximumId) : base(context, address, maximumId) { }
public override Sampler Get(int id)
@@ -14,7 +16,12 @@ namespace Ryujinx.Graphics.Gpu.Image
return null;
}
- SynchronizeMemory();
+ if (_sequenceNumber != Context.SequenceNumber)
+ {
+ _sequenceNumber = Context.SequenceNumber;
+
+ SynchronizeMemory();
+ }
Sampler sampler = Items[id];
diff --git a/Ryujinx.Graphics.Gpu/Image/TexturePool.cs b/Ryujinx.Graphics.Gpu/Image/TexturePool.cs
index 8512e370..6014f07c 100644
--- a/Ryujinx.Graphics.Gpu/Image/TexturePool.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TexturePool.cs
@@ -11,11 +11,7 @@ namespace Ryujinx.Graphics.Gpu.Image
{
public LinkedListNode<TexturePool> CacheNode { get; set; }
- private struct TextureContainer
- {
- public Texture Texture0 { get; set; }
- public Texture Texture1 { get; set; }
- }
+ private int _sequenceNumber;
public TexturePool(
GpuContext context,
@@ -29,7 +25,12 @@ namespace Ryujinx.Graphics.Gpu.Image
return null;
}
- SynchronizeMemory();
+ if (_sequenceNumber != Context.SequenceNumber)
+ {
+ _sequenceNumber = Context.SequenceNumber;
+
+ SynchronizeMemory();
+ }
Texture texture = Items[id];
diff --git a/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs b/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs
index 78b7bc98..30bd1302 100644
--- a/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs
+++ b/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs
@@ -3,7 +3,6 @@ using Ryujinx.Graphics.GAL.InputAssembler;
using Ryujinx.Graphics.Gpu.State;
using Ryujinx.Graphics.Shader;
using System;
-using System.Runtime.InteropServices;
namespace Ryujinx.Graphics.Gpu.Memory
{
@@ -48,6 +47,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
private bool _indexBufferDirty;
private bool _vertexBuffersDirty;
+ private uint _vertexBuffersEnableMask;
private bool _rebind;
@@ -93,6 +93,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
_vertexBuffers[index].Divisor = divisor;
_vertexBuffersDirty = true;
+
+ if (address != 0)
+ {
+ _vertexBuffersEnableMask |= 1u << index;
+ }
+ else
+ {
+ _vertexBuffersEnableMask &= ~(1u << index);
+ }
}
public void SetComputeStorageBuffer(int index, ulong gpuVa, ulong size)
@@ -322,13 +331,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
SynchronizeBufferRange(_indexBuffer.Address, _indexBuffer.Size);
}
+ uint vbEnableMask = _vertexBuffersEnableMask;
+
if (_vertexBuffersDirty || _rebind)
{
_vertexBuffersDirty = false;
VertexBufferDescriptor[] vertexBuffers = new VertexBufferDescriptor[Constants.TotalVertexBuffers];
- for (int index = 0; index < Constants.TotalVertexBuffers; index++)
+ for (int index = 0; (vbEnableMask >> index) != 0; index++)
{
VertexBuffer vb = _vertexBuffers[index];
@@ -346,7 +357,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
}
else
{
- for (int index = 0; index < Constants.TotalVertexBuffers; index++)
+ for (int index = 0; (vbEnableMask >> index) != 0; index++)
{
VertexBuffer vb = _vertexBuffers[index];
diff --git a/Ryujinx.Graphics.Gpu/State/GpuState.cs b/Ryujinx.Graphics.Gpu/State/GpuState.cs
index ecbaa004..bf7734dd 100644
--- a/Ryujinx.Graphics.Gpu/State/GpuState.cs
+++ b/Ryujinx.Graphics.Gpu/State/GpuState.cs
@@ -114,23 +114,50 @@ namespace Ryujinx.Graphics.Gpu.State
_registers[(int)offset].Callback = callback;
}
- public bool QueryModified(params MethodOffset[] offsets)
+ public bool QueryModified(MethodOffset offset)
{
- bool modified = false;
+ bool modified = _registers[(int)offset].Modified;
- for (int index = 0; index < offsets.Length; index++)
- {
- modified |= QueryModified(offsets[index]);
- }
+ _registers[(int)offset].Modified = false;
return modified;
}
- public bool QueryModified(MethodOffset offset)
+ public bool QueryModified(MethodOffset m1, MethodOffset m2)
{
- bool modified = _registers[(int)offset].Modified;
+ bool modified = _registers[(int)m1].Modified ||
+ _registers[(int)m2].Modified;
- _registers[(int)offset].Modified = false;
+ _registers[(int)m1].Modified = false;
+ _registers[(int)m2].Modified = false;
+
+ return modified;
+ }
+
+ public bool QueryModified(MethodOffset m1, MethodOffset m2, MethodOffset m3)
+ {
+ bool modified = _registers[(int)m1].Modified ||
+ _registers[(int)m2].Modified ||
+ _registers[(int)m3].Modified;
+
+ _registers[(int)m1].Modified = false;
+ _registers[(int)m2].Modified = false;
+ _registers[(int)m3].Modified = false;
+
+ return modified;
+ }
+
+ public bool QueryModified(MethodOffset m1, MethodOffset m2, MethodOffset m3, MethodOffset m4)
+ {
+ bool modified = _registers[(int)m1].Modified ||
+ _registers[(int)m2].Modified ||
+ _registers[(int)m3].Modified ||
+ _registers[(int)m4].Modified;
+
+ _registers[(int)m1].Modified = false;
+ _registers[(int)m2].Modified = false;
+ _registers[(int)m3].Modified = false;
+ _registers[(int)m4].Modified = false;
return modified;
}