Geometry shader emulation for macOS (#5551)

* Implement vertex and geometry shader conversion to compute

* Call InitializeReservedCounts for compute too

* PR feedback

* Set clip distance mask for geometry and tessellation shaders too

* Transform feedback emulation only for vertex
This commit is contained in:
gdkchan 2023-08-29 21:10:34 -03:00 committed by GitHub
parent 93d78f9ac4
commit f09bba82b9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
65 changed files with 3912 additions and 593 deletions

View file

@ -13,7 +13,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
/// <summary>
/// Represents a 3D engine class.
/// </summary>
class ThreedClass : IDeviceState
class ThreedClass : IDeviceState, IDisposable
{
private readonly GpuContext _context;
private readonly GPFifoClass _fifoClass;
@ -178,6 +178,15 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
_stateUpdater.SetDirty(offset);
}
/// <summary>
/// Marks the specified register range for a group index as dirty, forcing the associated state to update on the next draw.
/// </summary>
/// <param name="groupIndex">Index of the group to dirty</param>
public void ForceStateDirtyByIndex(int groupIndex)
{
_stateUpdater.ForceDirty(groupIndex);
}
/// <summary>
/// Forces the shaders to be rebound on the next draw.
/// </summary>
@ -207,7 +216,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
/// </summary>
public void PerformDeferredDraws()
{
_drawManager.PerformDeferredDraws();
_drawManager.PerformDeferredDraws(this);
}
/// <summary>
@ -402,7 +411,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
/// <param name="argument">Method call argument</param>
private void DrawBegin(int argument)
{
_drawManager.DrawBegin(argument);
_drawManager.DrawBegin(this, argument);
}
/// <summary>
@ -617,5 +626,19 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
{
_drawManager.Clear(this, argument, layerCount);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_drawManager.Dispose();
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}