diff options
author | riperiperi <rhy3756547@hotmail.com> | 2022-12-04 17:41:17 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-04 18:41:17 +0100 |
commit | 9ac66336a216644a1b671e7949702d2e749838d2 (patch) | |
tree | 549cb9cfd9f8f88f45a1064bafa57800eb241728 /Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs | |
parent | 4965681e069eeedc5272030b131c2a45e6131e61 (diff) |
GPU: Use lazy checks for specialization state (#4004)1.1.419
* GPU: Use lazy checks for specialization state
This PR adds a new class, the SpecializationStateUpdater, that allows elements of specialization state to be updated individually, and signal the state is checked when it changes between draws, instead of building and checking it on every draw. This also avoids building spec state when
Most state updates have been moved behind the shader state update, so that their specialization state updates make it in before shaders are fetched.
Downside: Fields in GpuChannelGraphicsState are no longer readonly. To counteract copies that might be caused this I pass it as `ref` when possible, though maybe `in` would be better? Not really sure about the quirks of `in` and the difference probably won't show on a benchmark.
The result is around 2 extra FPS on SMO in the usual spot. Not much right now, but it will remove costs when we're doing more expensive specialization checks, such as fragment output type specialization for macos. It may also help more on other games with more draws.
* Address Feedback
* Oops
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs b/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs index 511f4c23..e5e48626 100644 --- a/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs +++ b/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs @@ -15,62 +15,62 @@ namespace Ryujinx.Graphics.Gpu.Shader /// <summary> /// Early Z force enable. /// </summary> - public readonly bool EarlyZForce; + public bool EarlyZForce; /// <summary> /// Primitive topology of current draw. /// </summary> - public readonly PrimitiveTopology Topology; + public PrimitiveTopology Topology; /// <summary> /// Tessellation mode. /// </summary> - public readonly TessMode TessellationMode; + public TessMode TessellationMode; /// <summary> /// Indicates whether alpha-to-coverage is enabled. /// </summary> - public readonly bool AlphaToCoverageEnable; + public bool AlphaToCoverageEnable; /// <summary> /// Indicates whether alpha-to-coverage dithering is enabled. /// </summary> - public readonly bool AlphaToCoverageDitherEnable; + public bool AlphaToCoverageDitherEnable; /// <summary> /// Indicates whether the viewport transform is disabled. /// </summary> - public readonly bool ViewportTransformDisable; + public bool ViewportTransformDisable; /// <summary> /// Depth mode zero to one or minus one to one. /// </summary> - public readonly bool DepthMode; + public bool DepthMode; /// <summary> /// Indicates if the point size is set on the shader or is fixed. /// </summary> - public readonly bool ProgramPointSizeEnable; + public bool ProgramPointSizeEnable; /// <summary> /// Point size used if <see cref="ProgramPointSizeEnable" /> is false. /// </summary> - public readonly float PointSize; + public float PointSize; /// <summary> /// Indicates whether alpha test is enabled. /// </summary> - public readonly bool AlphaTestEnable; + public bool AlphaTestEnable; /// <summary> /// When alpha test is enabled, indicates the comparison that decides if the fragment should be discarded. /// </summary> - public readonly CompareOp AlphaTestCompare; + public CompareOp AlphaTestCompare; /// <summary> /// When alpha test is enabled, indicates the value to compare with the fragment output alpha. /// </summary> - public readonly float AlphaTestReference; + public float AlphaTestReference; /// <summary> /// Type of the vertex attributes consumed by the shader. @@ -80,12 +80,12 @@ namespace Ryujinx.Graphics.Gpu.Shader /// <summary> /// Indicates that the draw is writing the base vertex, base instance and draw index to Constant Buffer 0. /// </summary> - public readonly bool HasConstantBufferDrawParameters; + public bool HasConstantBufferDrawParameters; /// <summary> /// Indicates that any storage buffer use is unaligned. /// </summary> - public readonly bool HasUnalignedStorageBuffer; + public bool HasUnalignedStorageBuffer; /// <summary> /// Creates a new GPU graphics state. |