aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
diff options
context:
space:
mode:
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;