aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-06-10 18:31:38 -0300
committerGitHub <noreply@github.com>2023-06-10 18:31:38 -0300
commiteb0bb36bbfc3a4f5f2ac1c8721e192239f899a1d (patch)
treee43650855d28e8d49d7ad2d82466647263c3fe16 /src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
parent0e95a8271ac96b2c54907858140e2511a25a2b10 (diff)
Implement transform feedback emulation for hardware without native support (#5080)
* Implement transform feedback emulation for hardware without native support * Stop doing some useless buffer updates and account for non-zero base instance * Reduce redundant updates even more * Update descriptor init logic to account for ResourceLayout * Fix transform feedback and storage buffers not being updated in some cases * Shader cache version bump * PR feedback * SetInstancedDrawVertexCount must be always called after UpdateState * Minor typo
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
index 57e79ac7..2dd7c631 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
@@ -17,40 +17,56 @@ namespace Ryujinx.Graphics.Gpu.Shader
private readonly ResourceCounts _resourceCounts;
private readonly int _stageIndex;
+ private readonly int _reservedConstantBuffers;
+ private readonly int _reservedStorageBuffers;
+
/// <summary>
/// Creates a new GPU accessor.
/// </summary>
/// <param name="context">GPU context</param>
- public GpuAccessorBase(GpuContext context, ResourceCounts resourceCounts, int stageIndex)
+ /// <param name="resourceCounts">Counter of GPU resources used by the shader</param>
+ /// <param name="stageIndex">Index of the shader stage, 0 for compute</param>
+ /// <param name="tfEnabled">Indicates if the current graphics shader is used with transform feedback enabled</param>
+ public GpuAccessorBase(GpuContext context, ResourceCounts resourceCounts, int stageIndex, bool tfEnabled)
{
_context = context;
_resourceCounts = resourceCounts;
_stageIndex = stageIndex;
+
+ _reservedConstantBuffers = 1; // For the support buffer.
+ _reservedStorageBuffers = !context.Capabilities.SupportsTransformFeedback && tfEnabled ? 5 : 0;
}
public int QueryBindingConstantBuffer(int index)
{
+ int binding;
+
if (_context.Capabilities.Api == TargetApi.Vulkan)
{
- // We need to start counting from 1 since binding 0 is reserved for the support uniform buffer.
- return GetBindingFromIndex(index, _context.Capabilities.MaximumUniformBuffersPerStage, "Uniform buffer") + 1;
+ binding = GetBindingFromIndex(index, _context.Capabilities.MaximumUniformBuffersPerStage, "Uniform buffer");
}
else
{
- return _resourceCounts.UniformBuffersCount++;
+ binding = _resourceCounts.UniformBuffersCount++;
}
+
+ return binding + _reservedConstantBuffers;
}
public int QueryBindingStorageBuffer(int index)
{
+ int binding;
+
if (_context.Capabilities.Api == TargetApi.Vulkan)
{
- return GetBindingFromIndex(index, _context.Capabilities.MaximumStorageBuffersPerStage, "Storage buffer");
+ binding = GetBindingFromIndex(index, _context.Capabilities.MaximumStorageBuffersPerStage, "Storage buffer");
}
else
{
- return _resourceCounts.StorageBuffersCount++;
+ binding = _resourceCounts.StorageBuffersCount++;
}
+
+ return binding + _reservedStorageBuffers;
}
public int QueryBindingTexture(int index, bool isBuffer)
@@ -149,6 +165,8 @@ namespace Ryujinx.Graphics.Gpu.Shader
public bool QueryHostSupportsTextureShadowLod() => _context.Capabilities.SupportsTextureShadowLod;
+ public bool QueryHostSupportsTransformFeedback() => _context.Capabilities.SupportsTransformFeedback;
+
public bool QueryHostSupportsViewportIndexVertexTessellation() => _context.Capabilities.SupportsViewportIndexVertexTessellation;
public bool QueryHostSupportsViewportMask() => _context.Capabilities.SupportsViewportMask;