From 3214a4cf8e3ded72d5c6eeae138e699a259f8bf2 Mon Sep 17 00:00:00 2001 From: Isaac Marovitz Date: Sat, 27 Jul 2024 11:32:45 +0100 Subject: [PATCH] Bind TextureBuffers --- src/Ryujinx.Graphics.Metal/EncoderState.cs | 4 +- .../EncoderStateManager.cs | 144 ++++++++---------- 2 files changed, 65 insertions(+), 83 deletions(-) diff --git a/src/Ryujinx.Graphics.Metal/EncoderState.cs b/src/Ryujinx.Graphics.Metal/EncoderState.cs index 5ee8bd3d8..77e711fbb 100644 --- a/src/Ryujinx.Graphics.Metal/EncoderState.cs +++ b/src/Ryujinx.Graphics.Metal/EncoderState.cs @@ -54,10 +54,10 @@ namespace Ryujinx.Graphics.Metal record struct TextureRef { public ShaderStage Stage; - public Texture Storage; + public TextureBase Storage; public Sampler Sampler; - public TextureRef(ShaderStage stage, Texture storage, Sampler sampler) + public TextureRef(ShaderStage stage, TextureBase storage, Sampler sampler) { Stage = stage; Storage = storage; diff --git a/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs b/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs index db7b81dce..4a7c8a00d 100644 --- a/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs +++ b/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs @@ -805,13 +805,9 @@ namespace Ryujinx.Graphics.Metal public readonly void UpdateTextureAndSampler(ShaderStage stage, ulong binding, TextureBase texture, Sampler sampler) { - if (texture is TextureBuffer) + if (texture != null) { - // TODO: Texture buffers - } - else if (texture is Texture view) - { - _currentState.TextureRefs[binding] = new(stage, view, sampler); + _currentState.TextureRefs[binding] = new(stage, texture, sampler); } else { @@ -1124,59 +1120,52 @@ namespace Ryujinx.Graphics.Metal case MetalRenderer.TextureSetIndex: if (!segment.IsArray) { - if (segment.Type != ResourceType.BufferTexture) + for (int i = 0; i < count; i++) { - for (int i = 0; i < count; i++) + int index = binding + i; + + ref var texture = ref _currentState.TextureRefs[index]; + + var storage = texture.Storage; + + if (storage == null) { - int index = binding + i; - - ref var texture = ref _currentState.TextureRefs[index]; - - var storage = texture.Storage; - - if (storage == null) - { - continue; - } - - var mtlTexture = storage.GetHandle(); - - MTLRenderStages renderStages = 0; - - if ((segment.Stages & ResourceStages.Vertex) != 0) - { - vertResourceIds[vertResourceIdIndex] = mtlTexture.GpuResourceID._impl; - vertResourceIdIndex++; - - if (texture.Sampler != null) - { - vertResourceIds[vertResourceIdIndex] = texture.Sampler.GetSampler().GpuResourceID._impl; - vertResourceIdIndex++; - } - - renderStages |= MTLRenderStages.RenderStageVertex; - } - - if ((segment.Stages & ResourceStages.Fragment) != 0) - { - fragResourceIds[fragResourceIdIndex] = mtlTexture.GpuResourceID._impl; - fragResourceIdIndex++; - - if (texture.Sampler != null) - { - fragResourceIds[fragResourceIdIndex] = texture.Sampler.GetSampler().GpuResourceID._impl; - fragResourceIdIndex++; - } - - renderStages |= MTLRenderStages.RenderStageFragment; - } - - renderCommandEncoder.UseResource(new MTLResource(mtlTexture.NativePtr), MTLResourceUsage.Read, renderStages); + continue; } - } - else - { - // TODO: Buffer textures + + var mtlTexture = storage.GetHandle(); + + MTLRenderStages renderStages = 0; + + if ((segment.Stages & ResourceStages.Vertex) != 0) + { + vertResourceIds[vertResourceIdIndex] = mtlTexture.GpuResourceID._impl; + vertResourceIdIndex++; + + if (texture.Sampler != null) + { + vertResourceIds[vertResourceIdIndex] = texture.Sampler.GetSampler().GpuResourceID._impl; + vertResourceIdIndex++; + } + + renderStages |= MTLRenderStages.RenderStageVertex; + } + + if ((segment.Stages & ResourceStages.Fragment) != 0) + { + fragResourceIds[fragResourceIdIndex] = mtlTexture.GpuResourceID._impl; + fragResourceIdIndex++; + + if (texture.Sampler != null) + { + fragResourceIds[fragResourceIdIndex] = texture.Sampler.GetSampler().GpuResourceID._impl; + fragResourceIdIndex++; + } + + renderStages |= MTLRenderStages.RenderStageFragment; + } + + renderCommandEncoder.UseResource(new MTLResource(mtlTexture.NativePtr), MTLResourceUsage.Read, renderStages); } } else @@ -1343,41 +1332,34 @@ namespace Ryujinx.Graphics.Metal case MetalRenderer.TextureSetIndex: if (!segment.IsArray) { - if (segment.Type != ResourceType.BufferTexture) + for (int i = 0; i < count; i++) { - for (int i = 0; i < count; i++) + int index = binding + i; + + ref var texture = ref _currentState.TextureRefs[index]; + + var storage = texture.Storage; + + if (storage == null) { - int index = binding + i; + continue; + } - ref var texture = ref _currentState.TextureRefs[index]; + var mtlTexture = storage.GetHandle(); - var storage = texture.Storage; + if (segment.Stages.HasFlag(ResourceStages.Compute)) + { + computeCommandEncoder.UseResource(new MTLResource(mtlTexture.NativePtr), MTLResourceUsage.Read); + resourceIds[resourceIdIndex] = mtlTexture.GpuResourceID._impl; + resourceIdIndex++; - if (storage == null) + if (texture.Sampler != null) { - continue; - } - - var mtlTexture = storage.GetHandle(); - - if (segment.Stages.HasFlag(ResourceStages.Compute)) - { - computeCommandEncoder.UseResource(new MTLResource(mtlTexture.NativePtr), MTLResourceUsage.Read); - resourceIds[resourceIdIndex] = mtlTexture.GpuResourceID._impl; + resourceIds[resourceIdIndex] = texture.Sampler.GetSampler().GpuResourceID._impl; resourceIdIndex++; - - if (texture.Sampler != null) - { - resourceIds[resourceIdIndex] = texture.Sampler.GetSampler().GpuResourceID._impl; - resourceIdIndex++; - } } } } - else - { - // TODO: Buffer textures - } } else {