Small optimizations on texture and sampler pool invalidation

This commit is contained in:
gdk 2019-11-23 02:17:22 -03:00 committed by Thog
parent 3ac023bb60
commit b2b2e04669
4 changed files with 68 additions and 22 deletions

View file

@ -5,6 +5,8 @@ namespace Ryujinx.Graphics.Gpu.Image
{ {
class SamplerPool : Pool<Sampler> class SamplerPool : Pool<Sampler>
{ {
private int _sequenceNumber;
public SamplerPool(GpuContext context, ulong address, int maximumId) : base(context, address, maximumId) { } public SamplerPool(GpuContext context, ulong address, int maximumId) : base(context, address, maximumId) { }
public override Sampler Get(int id) public override Sampler Get(int id)
@ -14,7 +16,12 @@ namespace Ryujinx.Graphics.Gpu.Image
return null; return null;
} }
if (_sequenceNumber != Context.SequenceNumber)
{
_sequenceNumber = Context.SequenceNumber;
SynchronizeMemory(); SynchronizeMemory();
}
Sampler sampler = Items[id]; Sampler sampler = Items[id];

View file

@ -11,11 +11,7 @@ namespace Ryujinx.Graphics.Gpu.Image
{ {
public LinkedListNode<TexturePool> CacheNode { get; set; } public LinkedListNode<TexturePool> CacheNode { get; set; }
private struct TextureContainer private int _sequenceNumber;
{
public Texture Texture0 { get; set; }
public Texture Texture1 { get; set; }
}
public TexturePool( public TexturePool(
GpuContext context, GpuContext context,
@ -29,7 +25,12 @@ namespace Ryujinx.Graphics.Gpu.Image
return null; return null;
} }
if (_sequenceNumber != Context.SequenceNumber)
{
_sequenceNumber = Context.SequenceNumber;
SynchronizeMemory(); SynchronizeMemory();
}
Texture texture = Items[id]; Texture texture = Items[id];

View file

@ -3,7 +3,6 @@ using Ryujinx.Graphics.GAL.InputAssembler;
using Ryujinx.Graphics.Gpu.State; using Ryujinx.Graphics.Gpu.State;
using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader;
using System; using System;
using System.Runtime.InteropServices;
namespace Ryujinx.Graphics.Gpu.Memory namespace Ryujinx.Graphics.Gpu.Memory
{ {
@ -48,6 +47,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
private bool _indexBufferDirty; private bool _indexBufferDirty;
private bool _vertexBuffersDirty; private bool _vertexBuffersDirty;
private uint _vertexBuffersEnableMask;
private bool _rebind; private bool _rebind;
@ -93,6 +93,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
_vertexBuffers[index].Divisor = divisor; _vertexBuffers[index].Divisor = divisor;
_vertexBuffersDirty = true; _vertexBuffersDirty = true;
if (address != 0)
{
_vertexBuffersEnableMask |= 1u << index;
}
else
{
_vertexBuffersEnableMask &= ~(1u << index);
}
} }
public void SetComputeStorageBuffer(int index, ulong gpuVa, ulong size) public void SetComputeStorageBuffer(int index, ulong gpuVa, ulong size)
@ -322,13 +331,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
SynchronizeBufferRange(_indexBuffer.Address, _indexBuffer.Size); SynchronizeBufferRange(_indexBuffer.Address, _indexBuffer.Size);
} }
uint vbEnableMask = _vertexBuffersEnableMask;
if (_vertexBuffersDirty || _rebind) if (_vertexBuffersDirty || _rebind)
{ {
_vertexBuffersDirty = false; _vertexBuffersDirty = false;
VertexBufferDescriptor[] vertexBuffers = new VertexBufferDescriptor[Constants.TotalVertexBuffers]; 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]; VertexBuffer vb = _vertexBuffers[index];
@ -346,7 +357,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
} }
else else
{ {
for (int index = 0; index < Constants.TotalVertexBuffers; index++) for (int index = 0; (vbEnableMask >> index) != 0; index++)
{ {
VertexBuffer vb = _vertexBuffers[index]; VertexBuffer vb = _vertexBuffers[index];

View file

@ -114,18 +114,6 @@ namespace Ryujinx.Graphics.Gpu.State
_registers[(int)offset].Callback = callback; _registers[(int)offset].Callback = callback;
} }
public bool QueryModified(params MethodOffset[] offsets)
{
bool modified = false;
for (int index = 0; index < offsets.Length; index++)
{
modified |= QueryModified(offsets[index]);
}
return modified;
}
public bool QueryModified(MethodOffset offset) public bool QueryModified(MethodOffset offset)
{ {
bool modified = _registers[(int)offset].Modified; bool modified = _registers[(int)offset].Modified;
@ -135,6 +123,45 @@ namespace Ryujinx.Graphics.Gpu.State
return modified; return modified;
} }
public bool QueryModified(MethodOffset m1, MethodOffset m2)
{
bool modified = _registers[(int)m1].Modified ||
_registers[(int)m2].Modified;
_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;
}
public T Get<T>(MethodOffset offset, int index) where T : struct public T Get<T>(MethodOffset offset, int index) where T : struct
{ {
Register register = _registers[(int)offset]; Register register = _registers[(int)offset];