aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderProgram.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Shader/CachedShaderProgram.cs')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Shader/CachedShaderProgram.cs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderProgram.cs b/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderProgram.cs
new file mode 100644
index 00000000..ff9c39a1
--- /dev/null
+++ b/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderProgram.cs
@@ -0,0 +1,56 @@
+using Ryujinx.Graphics.GAL;
+using System;
+
+namespace Ryujinx.Graphics.Gpu.Shader
+{
+ /// <summary>
+ /// Represents a program composed of one or more shader stages (for graphics shaders),
+ /// or a single shader (for compute shaders).
+ /// </summary>
+ class CachedShaderProgram : IDisposable
+ {
+ /// <summary>
+ /// Host shader program object.
+ /// </summary>
+ public IProgram HostProgram { get; }
+
+ /// <summary>
+ /// GPU state used to create this version of the shader.
+ /// </summary>
+ public ShaderSpecializationState SpecializationState { get; }
+
+ /// <summary>
+ /// Compiled shader for each shader stage.
+ /// </summary>
+ public CachedShaderStage[] Shaders { get; }
+
+ /// <summary>
+ /// Cached shader bindings, ready for placing into the bindings manager.
+ /// </summary>
+ public CachedShaderBindings Bindings { get; }
+
+ /// <summary>
+ /// Creates a new instance of the shader bundle.
+ /// </summary>
+ /// <param name="hostProgram">Host program with all the shader stages</param>
+ /// <param name="specializationState">GPU state used to create this version of the shader</param>
+ /// <param name="shaders">Shaders</param>
+ public CachedShaderProgram(IProgram hostProgram, ShaderSpecializationState specializationState, params CachedShaderStage[] shaders)
+ {
+ HostProgram = hostProgram;
+ SpecializationState = specializationState;
+ Shaders = shaders;
+
+ SpecializationState.Prepare(shaders);
+ Bindings = new CachedShaderBindings(shaders.Length == 1, shaders);
+ }
+
+ /// <summary>
+ /// Dispose of the host shader resources.
+ /// </summary>
+ public void Dispose()
+ {
+ HostProgram.Dispose();
+ }
+ }
+}