Small optimizations on texture and sampler pool invalidation
This commit is contained in:
parent
3ac023bb60
commit
b2b2e04669
4 changed files with 68 additions and 22 deletions
|
@ -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];
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -114,18 +114,6 @@ namespace Ryujinx.Graphics.Gpu.State
|
|||
_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)
|
||||
{
|
||||
bool modified = _registers[(int)offset].Modified;
|
||||
|
@ -135,6 +123,45 @@ namespace Ryujinx.Graphics.Gpu.State
|
|||
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
|
||||
{
|
||||
Register register = _registers[(int)offset];
|
||||
|
|
Reference in a new issue