forked from Mirror/Ryujinx
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>
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
SynchronizeMemory();
|
if (_sequenceNumber != Context.SequenceNumber)
|
||||||
|
{
|
||||||
|
_sequenceNumber = Context.SequenceNumber;
|
||||||
|
|
||||||
|
SynchronizeMemory();
|
||||||
|
}
|
||||||
|
|
||||||
Sampler sampler = Items[id];
|
Sampler sampler = Items[id];
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
SynchronizeMemory();
|
if (_sequenceNumber != Context.SequenceNumber)
|
||||||
|
{
|
||||||
|
_sequenceNumber = Context.SequenceNumber;
|
||||||
|
|
||||||
|
SynchronizeMemory();
|
||||||
|
}
|
||||||
|
|
||||||
Texture texture = Items[id];
|
Texture texture = Items[id];
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in a new issue