aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-08-29 21:10:34 -0300
committerGitHub <noreply@github.com>2023-08-29 21:10:34 -0300
commitf09bba82b9366e5912b639a610ae89cbb1cf352c (patch)
tree4811ffa52206eed7cf8aa200c64deb7410e5c56b /src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
parent93d78f9ac4a37a50f0cc2e57addd330d072af742 (diff)
Geometry shader emulation for macOS (#5551)1.1.1002
* 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
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs46
1 files changed, 42 insertions, 4 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
index d07d8dce..9c487c46 100644
--- a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
+++ b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
@@ -48,12 +48,22 @@ namespace Ryujinx.Graphics.Shader.Translation
public int LocalMemoryId { get; private set; }
public int SharedMemoryId { get; private set; }
+ public int LocalVertexDataMemoryId { get; private set; }
+ public int LocalTopologyRemapMemoryId { get; private set; }
+ public int LocalVertexIndexVertexRateMemoryId { get; private set; }
+ public int LocalVertexIndexInstanceRateMemoryId { get; private set; }
+ public int LocalGeometryOutputVertexCountMemoryId { get; private set; }
+ public int LocalGeometryOutputIndexCountMemoryId { get; private set; }
+
public ShaderProperties Properties { get; }
- public ResourceManager(ShaderStage stage, IGpuAccessor gpuAccessor)
+ public ResourceReservations Reservations { get; }
+
+ public ResourceManager(ShaderStage stage, IGpuAccessor gpuAccessor, ResourceReservations reservations = null)
{
_gpuAccessor = gpuAccessor;
Properties = new();
+ Reservations = reservations;
_stage = stage;
_stagePrefix = GetShaderStagePrefix(stage);
@@ -114,6 +124,29 @@ namespace Ryujinx.Graphics.Shader.Translation
}
}
+ public void SetVertexAsComputeLocalMemories(ShaderStage stage, InputTopology inputTopology)
+ {
+ LocalVertexDataMemoryId = AddMemoryDefinition("local_vertex_data", AggregateType.Array | AggregateType.FP32, Reservations.OutputSizePerInvocation);
+
+ if (stage == ShaderStage.Vertex)
+ {
+ LocalVertexIndexVertexRateMemoryId = AddMemoryDefinition("local_vertex_index_vr", AggregateType.U32);
+ LocalVertexIndexInstanceRateMemoryId = AddMemoryDefinition("local_vertex_index_ir", AggregateType.U32);
+ }
+ else if (stage == ShaderStage.Geometry)
+ {
+ LocalTopologyRemapMemoryId = AddMemoryDefinition("local_topology_remap", AggregateType.Array | AggregateType.U32, inputTopology.ToInputVertices());
+
+ LocalGeometryOutputVertexCountMemoryId = AddMemoryDefinition("local_geometry_output_vertex", AggregateType.U32);
+ LocalGeometryOutputIndexCountMemoryId = AddMemoryDefinition("local_geometry_output_index", AggregateType.U32);
+ }
+ }
+
+ private int AddMemoryDefinition(string name, AggregateType type, int arrayLength = 1)
+ {
+ return Properties.AddLocalMemory(new MemoryDefinition(name, type, arrayLength));
+ }
+
public int GetConstantBufferBinding(int slot)
{
int binding = _cbSlotToBindingMap[slot];
@@ -465,17 +498,22 @@ namespace Ryujinx.Graphics.Shader.Translation
return descriptors;
}
- public (int, int) GetCbufSlotAndHandleForTexture(int binding)
+ public bool TryGetCbufSlotAndHandleForTexture(int binding, out int cbufSlot, out int handle)
{
foreach ((TextureInfo info, TextureMeta meta) in _usedTextures)
{
if (meta.Binding == binding)
{
- return (info.CbufSlot, info.Handle);
+ cbufSlot = info.CbufSlot;
+ handle = info.Handle;
+
+ return true;
}
}
- throw new ArgumentException($"Binding {binding} is invalid.");
+ cbufSlot = 0;
+ handle = 0;
+ return false;
}
private static int FindDescriptorIndex(TextureDescriptor[] array, int binding)