From 923089a29825cad8159a63616d14dcbd7161cb3c Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Thu, 25 Aug 2022 23:16:41 -0300
Subject: Fast path for Inline-to-Memory texture data transfers (#3610)

* Fast path for Inline-to-Memory texture data transfers

* Only do it for block linear textures to be on the safe side
---
 .../Texture/TextureSetDataSliceRegionCommand.cs    | 31 ++++++++++++++++++++++
 1 file changed, 31 insertions(+)
 create mode 100644 Ryujinx.Graphics.GAL/Multithreading/Commands/Texture/TextureSetDataSliceRegionCommand.cs

(limited to 'Ryujinx.Graphics.GAL/Multithreading/Commands/Texture/TextureSetDataSliceRegionCommand.cs')

diff --git a/Ryujinx.Graphics.GAL/Multithreading/Commands/Texture/TextureSetDataSliceRegionCommand.cs b/Ryujinx.Graphics.GAL/Multithreading/Commands/Texture/TextureSetDataSliceRegionCommand.cs
new file mode 100644
index 00000000..b4285592
--- /dev/null
+++ b/Ryujinx.Graphics.GAL/Multithreading/Commands/Texture/TextureSetDataSliceRegionCommand.cs
@@ -0,0 +1,31 @@
+using Ryujinx.Graphics.GAL.Multithreading.Model;
+using Ryujinx.Graphics.GAL.Multithreading.Resources;
+using System;
+
+namespace Ryujinx.Graphics.GAL.Multithreading.Commands.Texture
+{
+    struct TextureSetDataSliceRegionCommand : IGALCommand
+    {
+        public CommandType CommandType => CommandType.TextureSetDataSliceRegion;
+        private TableRef<ThreadedTexture> _texture;
+        private TableRef<byte[]> _data;
+        private int _layer;
+        private int _level;
+        private Rectangle<int> _region;
+
+        public void Set(TableRef<ThreadedTexture> texture, TableRef<byte[]> data, int layer, int level, Rectangle<int> region)
+        {
+            _texture = texture;
+            _data = data;
+            _layer = layer;
+            _level = level;
+            _region = region;
+        }
+
+        public static void Run(ref TextureSetDataSliceRegionCommand command, ThreadedRenderer threaded, IRenderer renderer)
+        {
+            ThreadedTexture texture = command._texture.Get(threaded);
+            texture.Base.SetData(new ReadOnlySpan<byte>(command._data.Get(threaded)), command._layer, command._level, command._region);
+        }
+    }
+}
-- 
cgit v1.2.3-70-g09d2