This commit is contained in:
Isaac Marovitz 2024-05-08 22:54:35 -04:00
parent 0d72c7650a
commit 4301dbaca6
No known key found for this signature in database
GPG key ID: 97250B2B09A132E1
13 changed files with 86 additions and 78 deletions

View file

@ -21,14 +21,14 @@ namespace Ryujinx.Graphics.OpenGL.Image
if (Avx2.IsSupported) if (Avx2.IsSupported)
{ {
var mask = Vector256.Create( var mask = Vector256.Create(
(byte)3, (byte)0, (byte)1, (byte)2, 3, 0, 1, 2,
(byte)7, (byte)4, (byte)5, (byte)6, 7, 4, 5, 6,
(byte)11, (byte)8, (byte)9, (byte)10, 11, 8, 9, 10,
(byte)15, (byte)12, (byte)13, (byte)14, 15, 12, 13, 14,
(byte)19, (byte)16, (byte)17, (byte)18, 19, 16, 17, 18,
(byte)23, (byte)20, (byte)21, (byte)22, 23, 20, 21, 22,
(byte)27, (byte)24, (byte)25, (byte)26, 27, 24, 25, 26,
(byte)31, (byte)28, (byte)29, (byte)30); 31, 28, 29, (byte)30);
int sizeAligned = data.Length & ~31; int sizeAligned = data.Length & ~31;
@ -49,10 +49,10 @@ namespace Ryujinx.Graphics.OpenGL.Image
else if (Ssse3.IsSupported) else if (Ssse3.IsSupported)
{ {
var mask = Vector128.Create( var mask = Vector128.Create(
(byte)3, (byte)0, (byte)1, (byte)2, 3, 0, 1, 2,
(byte)7, (byte)4, (byte)5, (byte)6, 7, 4, 5, 6,
(byte)11, (byte)8, (byte)9, (byte)10, 11, 8, 9, 10,
(byte)15, (byte)12, (byte)13, (byte)14); 15, 12, 13, (byte)14);
int sizeAligned = data.Length & ~15; int sizeAligned = data.Length & ~15;
@ -90,14 +90,14 @@ namespace Ryujinx.Graphics.OpenGL.Image
if (Avx2.IsSupported) if (Avx2.IsSupported)
{ {
var mask = Vector256.Create( var mask = Vector256.Create(
(byte)1, (byte)2, (byte)3, (byte)0, 1, 2, 3, 0,
(byte)5, (byte)6, (byte)7, (byte)4, 5, 6, 7, 4,
(byte)9, (byte)10, (byte)11, (byte)8, 9, 10, 11, 8,
(byte)13, (byte)14, (byte)15, (byte)12, 13, 14, 15, 12,
(byte)17, (byte)18, (byte)19, (byte)16, 17, 18, 19, 16,
(byte)21, (byte)22, (byte)23, (byte)20, 21, 22, 23, 20,
(byte)25, (byte)26, (byte)27, (byte)24, 25, 26, 27, 24,
(byte)29, (byte)30, (byte)31, (byte)28); 29, 30, 31, (byte)28);
int sizeAligned = data.Length & ~31; int sizeAligned = data.Length & ~31;
@ -118,10 +118,10 @@ namespace Ryujinx.Graphics.OpenGL.Image
else if (Ssse3.IsSupported) else if (Ssse3.IsSupported)
{ {
var mask = Vector128.Create( var mask = Vector128.Create(
(byte)1, (byte)2, (byte)3, (byte)0, 1, 2, 3, 0,
(byte)5, (byte)6, (byte)7, (byte)4, 5, 6, 7, 4,
(byte)9, (byte)10, (byte)11, (byte)8, 9, 10, 11, 8,
(byte)13, (byte)14, (byte)15, (byte)12); 13, 14, 15, (byte)12);
int sizeAligned = data.Length & ~15; int sizeAligned = data.Length & ~15;

View file

@ -12,7 +12,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
} }
private readonly TextureRef[] _images; private readonly TextureRef[] _images;
private GL _api; private readonly GL _api;
public ImageArray(GL api, int size) public ImageArray(GL api, int size)
{ {

View file

@ -41,9 +41,9 @@ namespace Ryujinx.Graphics.OpenGL.Image
_api.SamplerParameter(Handle, SamplerParameterF.BorderColor, borderColor); _api.SamplerParameter(Handle, SamplerParameterF.BorderColor, borderColor);
} }
_api.SamplerParameter(Handle, SamplerParameterF.TextureMinLod, info.MinLod); _api.SamplerParameter(Handle, SamplerParameterF.MinLod, info.MinLod);
_api.SamplerParameter(Handle, SamplerParameterF.TextureMaxLod, info.MaxLod); _api.SamplerParameter(Handle, SamplerParameterF.MaxLod, info.MaxLod);
_api.SamplerParameter(Handle, SamplerParameterF.TextureLodBias, info.MipLodBias); _api.SamplerParameter(Handle, SamplerParameterF.LodBias, info.MipLodBias);
_api.SamplerParameter(Handle, SamplerParameterF.MaxAnisotropy, info.MaxAnisotropy); _api.SamplerParameter(Handle, SamplerParameterF.MaxAnisotropy, info.MaxAnisotropy);
} }

View file

@ -12,7 +12,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
} }
private readonly TextureRef[] _textureRefs; private readonly TextureRef[] _textureRefs;
private GL _api; private readonly GL _api;
public TextureArray(GL api, int size) public TextureArray(GL api, int size)
{ {

View file

@ -5,6 +5,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
{ {
class TextureBase class TextureBase
{ {
private readonly protected GL Api;
public uint Handle { get; protected set; } public uint Handle { get; protected set; }
public TextureCreateInfo Info { get; } public TextureCreateInfo Info { get; }
@ -15,14 +16,12 @@ namespace Ryujinx.Graphics.OpenGL.Image
public Target Target => Info.Target; public Target Target => Info.Target;
public Format Format => Info.Format; public Format Format => Info.Format;
private protected GL _api;
public TextureBase(GL api, TextureCreateInfo info) public TextureBase(GL api, TextureCreateInfo info)
{ {
_api = api; Api = api;
Info = info; Info = info;
Handle = _api.GenTexture(); Handle = Api.GenTexture();
} }
public void Bind(uint unit) public void Bind(uint unit)
@ -32,8 +31,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
protected void Bind(TextureTarget target, uint unit) protected void Bind(TextureTarget target, uint unit)
{ {
_api.ActiveTexture((TextureUnit)((uint)TextureUnit.Texture0 + unit)); Api.ActiveTexture((TextureUnit)((uint)TextureUnit.Texture0 + unit));
_api.BindTexture(target, Handle); Api.BindTexture(target, Handle);
} }
public static void ClearBinding(GL api, uint unit) public static void ClearBinding(GL api, uint unit)

View file

@ -41,7 +41,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
public PinnedSpan<byte> GetData() public PinnedSpan<byte> GetData()
{ {
return Buffer.GetData(_api, _renderer, _buffer, _bufferOffset, _bufferSize); return Buffer.GetData(Api, _renderer, _buffer, _bufferOffset, _bufferSize);
} }
public PinnedSpan<byte> GetData(int layer, int level) public PinnedSpan<byte> GetData(int layer, int level)
@ -59,7 +59,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
{ {
var dataSpan = data.Memory.Span; var dataSpan = data.Memory.Span;
Buffer.SetData(_api, _buffer, _bufferOffset, dataSpan[..Math.Min(dataSpan.Length, _bufferSize)]); Buffer.SetData(Api, _buffer, _bufferOffset, dataSpan[..Math.Min(dataSpan.Length, _bufferSize)]);
data.Dispose(); data.Dispose();
} }
@ -97,14 +97,14 @@ namespace Ryujinx.Graphics.OpenGL.Image
SizedInternalFormat format = (SizedInternalFormat)FormatTable.GetFormatInfo(Info.Format).InternalFormat; SizedInternalFormat format = (SizedInternalFormat)FormatTable.GetFormatInfo(Info.Format).InternalFormat;
_api.TexBufferRange(TextureTarget.TextureBuffer, format, _buffer.ToUInt32(), buffer.Offset, (uint)buffer.Size); Api.TexBufferRange(TextureTarget.TextureBuffer, format, _buffer.ToUInt32(), buffer.Offset, (uint)buffer.Size);
} }
public void Dispose() public void Dispose()
{ {
if (Handle != 0) if (Handle != 0)
{ {
_api.DeleteTexture(Handle); Api.DeleteTexture(Handle);
Handle = 0; Handle = 0;
} }

View file

@ -7,7 +7,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
{ {
class TextureCopy : IDisposable class TextureCopy : IDisposable
{ {
private GL _api; private readonly GL _api;
private readonly OpenGLRenderer _renderer; private readonly OpenGLRenderer _renderer;
private uint _srcFramebuffer; private uint _srcFramebuffer;

View file

@ -94,14 +94,14 @@ void main()
}"; }";
private readonly OpenGLRenderer _renderer; private readonly OpenGLRenderer _renderer;
private readonly int[] _msToNonMSProgramHandles; private readonly uint[] _msToNonMSProgramHandles;
private readonly int[] _nonMSToMSProgramHandles; private readonly uint[] _nonMSToMSProgramHandles;
public TextureCopyMS(OpenGLRenderer renderer) public TextureCopyMS(OpenGLRenderer renderer)
{ {
_renderer = renderer; _renderer = renderer;
_msToNonMSProgramHandles = new int[5]; _msToNonMSProgramHandles = new uint[5];
_nonMSToMSProgramHandles = new int[5]; _nonMSToMSProgramHandles = new uint[5];
} }
public void CopyMSToNonMS(ITextureInfo src, ITextureInfo dst, int srcLayer, int dstLayer, int depth) public void CopyMSToNonMS(ITextureInfo src, ITextureInfo dst, int srcLayer, int dstLayer, int depth)
@ -177,7 +177,7 @@ void main()
}; };
} }
private static int CreateViewIfNeeded(ITextureInfo texture) private static uint CreateViewIfNeeded(ITextureInfo texture)
{ {
// Binding sRGB textures as images doesn't work on NVIDIA, // Binding sRGB textures as images doesn't work on NVIDIA,
// we need to create and bind a RGBA view for it to work. // we need to create and bind a RGBA view for it to work.

View file

@ -7,7 +7,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
class TextureStorage : ITextureInfo class TextureStorage : ITextureInfo
{ {
public ITextureInfo Storage => this; public ITextureInfo Storage => this;
public int Handle { get; private set; } public uint Handle { get; private set; }
public TextureCreateInfo Info { get; } public TextureCreateInfo Info { get; }

View file

@ -12,50 +12,56 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private const long DefaultValue = -1; private const long DefaultValue = -1;
private const ulong HighMask = 0xFFFFFFFF00000000; private const ulong HighMask = 0xFFFFFFFF00000000;
public int Query { get; } public uint Query { get; }
private readonly int _buffer; private readonly uint _buffer;
private readonly IntPtr _bufferMap; private readonly IntPtr _bufferMap;
private readonly QueryTarget _type; private readonly QueryTarget _type;
private readonly GL _api;
public BufferedQuery(QueryTarget type) public BufferedQuery(GL api, QueryTarget type)
{ {
_buffer = GL.GenBuffer(); _api = api;
Query = GL.GenQuery(); _buffer = _api.GenBuffer();
Query = _api.GenQuery();
_type = type; _type = type;
GL.BindBuffer(BufferTargetARB.QueryBuffer, _buffer); _api.BindBuffer(BufferTargetARB.QueryBuffer, _buffer);
unsafe unsafe
{ {
long defaultValue = DefaultValue; long defaultValue = DefaultValue;
GL.BufferStorage(BufferTargetARB.QueryBuffer, sizeof(long), (IntPtr)(&defaultValue), BufferStorageMask.MapReadBit | BufferStorageMask.MapWriteBit | BufferStorageMask.MapPersistentBit); _api.BufferStorage(BufferStorageTarget.QueryBuffer, sizeof(long), (IntPtr)(&defaultValue), BufferStorageMask.MapReadBit | BufferStorageMask.MapWriteBit | BufferStorageMask.MapPersistentBit);
}
unsafe
{
_bufferMap = new IntPtr(_api.MapBufferRange(BufferTargetARB.QueryBuffer, IntPtr.Zero, sizeof(long), MapBufferAccessMask.ReadBit | MapBufferAccessMask.WriteBit | MapBufferAccessMask.PersistentBit));
} }
_bufferMap = GL.MapBufferRange(BufferTargetARB.QueryBuffer, IntPtr.Zero, sizeof(long), MapBufferAccessMask.ReadBit | MapBufferAccessMask.WriteBit | MapBufferAccessMask.PersistentBit);
} }
public void Reset() public void Reset()
{ {
GL.EndQuery(_type); _api.EndQuery(_type);
GL.BeginQuery(_type, Query); _api.BeginQuery(_type, Query);
} }
public void Begin() public void Begin()
{ {
GL.BeginQuery(_type, Query); _api.BeginQuery(_type, Query);
} }
public unsafe void End(bool withResult) public unsafe void End(bool withResult)
{ {
GL.EndQuery(_type); _api.EndQuery(_type);
if (withResult) if (withResult)
{ {
GL.BindBuffer(BufferTargetARB.QueryBuffer, _buffer); _api.BindBuffer(BufferTargetARB.QueryBuffer, _buffer);
Marshal.WriteInt64(_bufferMap, -1L); Marshal.WriteInt64(_bufferMap, -1L);
GL.GetQueryObject(Query, GetQueryObjectParam.QueryResult, (long*)0); _api.GetQueryObject(Query,QueryObjectParameterName.Result, (long*)0);
GL.MemoryBarrier(MemoryBarrierMask.QueryBufferBarrierBit | MemoryBarrierMask.ClientMappedBufferBarrierBit); _api.MemoryBarrier(MemoryBarrierMask.QueryBufferBarrierBit | MemoryBarrierMask.ClientMappedBufferBarrierBit);
} }
else else
{ {
@ -111,10 +117,10 @@ namespace Ryujinx.Graphics.OpenGL.Queries
public void Dispose() public void Dispose()
{ {
GL.BindBuffer(BufferTargetARB.QueryBuffer, _buffer); _api.BindBuffer(BufferTargetARB.QueryBuffer, _buffer);
GL.UnmapBuffer(BufferTargetARB.QueryBuffer); _api.UnmapBuffer(BufferTargetARB.QueryBuffer);
GL.DeleteBuffer(_buffer); _api.DeleteBuffer(_buffer);
GL.DeleteQuery(Query); _api.DeleteQuery(Query);
} }
} }
} }

View file

@ -28,7 +28,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private readonly Thread _consumerThread; private readonly Thread _consumerThread;
internal CounterQueue(CounterType type) internal CounterQueue(GL api, CounterType type)
{ {
Type = type; Type = type;
@ -37,10 +37,10 @@ namespace Ryujinx.Graphics.OpenGL.Queries
_queryPool = new Queue<BufferedQuery>(QueryPoolInitialSize); _queryPool = new Queue<BufferedQuery>(QueryPoolInitialSize);
for (int i = 0; i < QueryPoolInitialSize; i++) for (int i = 0; i < QueryPoolInitialSize; i++)
{ {
_queryPool.Enqueue(new BufferedQuery(glType)); _queryPool.Enqueue(new BufferedQuery(api, glType));
} }
_current = new CounterQueueEvent(this, glType, 0); _current = new CounterQueueEvent(api, this, glType, 0);
_consumerThread = new Thread(EventConsumer); _consumerThread = new Thread(EventConsumer);
_consumerThread.Start(); _consumerThread.Start();
@ -76,7 +76,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
} }
} }
internal BufferedQuery GetQueryObject() internal BufferedQuery GetQueryObject(GL api)
{ {
// Creating/disposing query objects on a context we're sharing with will cause issues. // Creating/disposing query objects on a context we're sharing with will cause issues.
// So instead, make a lot of query objects on the main thread and reuse them. // So instead, make a lot of query objects on the main thread and reuse them.
@ -90,7 +90,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
} }
else else
{ {
return new BufferedQuery(GetTarget(Type)); return new BufferedQuery(api, GetTarget(Type));
} }
} }
} }
@ -103,7 +103,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
} }
} }
public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved) public CounterQueueEvent QueueReport(GL api, EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved)
{ {
CounterQueueEvent result; CounterQueueEvent result;
ulong draws = lastDrawIndex - _current.DrawIndex; ulong draws = lastDrawIndex - _current.DrawIndex;
@ -126,7 +126,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
result = _current; result = _current;
_current = new CounterQueueEvent(this, GetTarget(Type), lastDrawIndex); _current = new CounterQueueEvent(api, this, GetTarget(Type), lastDrawIndex);
} }
_queuedEvent.Set(); _queuedEvent.Set();

View file

@ -11,7 +11,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
public QueryTarget Type { get; } public QueryTarget Type { get; }
public bool ClearCounter { get; private set; } public bool ClearCounter { get; private set; }
public int Query => _counter.Query; public uint Query => _counter.Query;
public bool Disposed { get; private set; } public bool Disposed { get; private set; }
public bool Invalid { get; set; } public bool Invalid { get; set; }
@ -28,11 +28,11 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private ulong _result = ulong.MaxValue; private ulong _result = ulong.MaxValue;
private double _divisor = 1f; private double _divisor = 1f;
public CounterQueueEvent(CounterQueue queue, QueryTarget type, ulong drawIndex) public CounterQueueEvent(GL api, CounterQueue queue, QueryTarget type, ulong drawIndex)
{ {
_queue = queue; _queue = queue;
_counter = queue.GetQueryObject(); _counter = queue.GetQueryObject(api);
Type = type; Type = type;
DrawIndex = drawIndex; DrawIndex = drawIndex;

View file

@ -1,4 +1,5 @@
using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL;
using Silk.NET.OpenGL;
using System; using System;
namespace Ryujinx.Graphics.OpenGL.Queries namespace Ryujinx.Graphics.OpenGL.Queries
@ -6,12 +7,14 @@ namespace Ryujinx.Graphics.OpenGL.Queries
class Counters : IDisposable class Counters : IDisposable
{ {
private readonly CounterQueue[] _counterQueues; private readonly CounterQueue[] _counterQueues;
private readonly GL _api;
public Counters() public Counters(GL api)
{ {
int count = Enum.GetNames<CounterType>().Length; int count = Enum.GetNames<CounterType>().Length;
_counterQueues = new CounterQueue[count]; _counterQueues = new CounterQueue[count];
_api = api;
} }
public void Initialize() public void Initialize()
@ -19,13 +22,13 @@ namespace Ryujinx.Graphics.OpenGL.Queries
for (int index = 0; index < _counterQueues.Length; index++) for (int index = 0; index < _counterQueues.Length; index++)
{ {
CounterType type = (CounterType)index; CounterType type = (CounterType)index;
_counterQueues[index] = new CounterQueue(type); _counterQueues[index] = new CounterQueue(_api, type);
} }
} }
public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved) public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved)
{ {
return _counterQueues[(int)type].QueueReport(resultHandler, divisor, lastDrawIndex, hostReserved); return _counterQueues[(int)type].QueueReport(_api, resultHandler, divisor, lastDrawIndex, hostReserved);
} }
public void QueueReset(CounterType type) public void QueueReset(CounterType type)