Ryujinx/Ryujinx.Graphics.GAL
riperiperi bf77d1cab9
GPU: Pass SpanOrArray for Texture SetData to avoid copy (#3745)
* GPU: Pass SpanOrArray for Texture SetData to avoid copy

Texture data is often converted before upload, meaning that an array was allocated to perform the conversion into. However, the backend SetData methods were being passed a Span of that data, and the Multithreaded layer does `ToArray()` on it so that it can be stored for later! This method can't extract the original array, so it creates a copy.

This PR changes the type passed for textures to a new ref struct called SpanOrArray, which is backed by either a ReadOnlySpan or an array. The benefit here is that we can have a ToArray method that doesn't copy if it is originally backed by an array.

This will also avoid a copy when running the ASTC decoder.

On NieR this was taking 38% of texture upload time, which it does a _lot_ of when you move between areas, so there should be a 1.6x performance boost when strictly uploading textures. No doubt this will also improve texture streaming performance in UE4 games, and maybe a small reduction with video playback.

From the numbers, it's probably possible to improve the upload rate by a further 1.6x by performing layout conversion on GPU. I'm not sure if we could improve it further than that - multithreading conversion on CPU would probably result in memory bottleneck.

This doesn't extend to buffers, since we don't convert their data on the GPU emulator side.

* Remove implicit cast to array.
2022-10-08 12:04:47 -03:00
..
Multithreading GPU: Pass SpanOrArray for Texture SetData to avoid copy (#3745) 2022-10-08 12:04:47 -03:00
AddressMode.cs Some code cleanup 2020-01-09 02:13:00 +01:00
BlendDescriptor.cs Implement Constant Color blends (#1119) 2020-04-25 23:00:43 +10:00
BlendFactor.cs Some code cleanup 2020-01-09 02:13:00 +01:00
BlendOp.cs Fix incorrect GPU GL blend func values (#1612) 2020-10-13 14:45:41 +11:00
BufferHandle.cs Spanify Graphics Abstraction Layer (#1226) 2020-05-23 11:46:09 +02:00
BufferRange.cs Fix transform feedback errors caused by host pause/resume and multiple uses (#1634) 2020-10-25 17:23:42 -03:00
Capabilities.cs Do not output ViewportIndex on SPIR-V if GPU does not support it (#3644) 2022-09-10 13:20:23 +00:00
ColorF.cs Implement Constant Color blends (#1119) 2020-04-25 23:00:43 +10:00
CompareMode.cs Some code cleanup 2020-01-09 02:13:00 +01:00
CompareOp.cs Initial support for the guest OpenGL driver (NVIDIA and Nouveau) 2020-01-09 02:13:00 +01:00
CounterType.cs
DepthMode.cs Support depth clip mode and disable shader fast math optimization on NVIDIA as a workaround for compiler bugs (?) 2020-01-09 02:13:00 +01:00
DepthStencilMode.cs Some code cleanup 2020-01-09 02:13:00 +01:00
DepthTestDescriptor.cs Some code cleanup 2020-01-09 02:13:00 +01:00
DeviceInfo.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
Extents2D.cs Allow copy destination to have a different scale from source (#1711) 2020-11-20 17:14:45 -03:00
Extents2DF.cs Implement DrawTexture functionality (#2747) 2021-11-10 15:37:49 -03:00
Face.cs
Format.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
FrontFace.cs
HardwareInfo.cs Removed unused usings. (#3593) 2022-08-18 18:04:54 +02:00
ICounterEvent.cs Add a Multithreading layer for the GAL, multi-thread shader compilation at runtime (#2501) 2021-08-27 00:31:29 +02:00
ImageCrop.cs Force crop when presentation cached texture size mismatches (#2957) 2021-12-31 12:00:42 -03:00
IndexType.cs
IPipeline.cs Implement HLE macros for render target clears (#3528) 2022-08-04 21:30:08 +00:00
IProgram.cs Implement parallel host shader cache compilation. 2021-04-18 17:33:58 +01:00
IRenderer.cs Removed unused usings. (#3593) 2022-08-18 18:04:54 +02:00
ISampler.cs
ITexture.cs GPU: Pass SpanOrArray for Texture SetData to avoid copy (#3745) 2022-10-08 12:04:47 -03:00
IWindow.cs Avalonia - Use embedded window for avalonia (#3674) 2022-09-19 15:05:26 -03:00
LogicalOp.cs Implement Logical Operation registers and functionality (#1380) 2020-07-10 14:23:15 -03:00
MagFilter.cs Some code cleanup 2020-01-09 02:13:00 +01:00
MinFilter.cs Some code cleanup 2020-01-09 02:13:00 +01:00
MultisampleDescriptor.cs Add support for alpha to coverage dithering (#3069) 2022-07-05 19:58:36 -03:00
Origin.cs Fix wrong face culling once and for all (#1277) 2020-05-28 09:03:07 +10:00
PolygonMode.cs Initial tessellation shader support (#2534) 2021-10-18 18:38:04 -03:00
PolygonModeMask.cs
PrimitiveTopology.cs
ProgramLinkStatus.cs Implement parallel host shader cache compilation. 2021-04-18 17:33:58 +01:00
ProgramPipelineState.cs Rename ToSpan to AsSpan (#3556) 2022-08-11 18:07:37 -03:00
Rectangle.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
Ryujinx.Graphics.GAL.csproj infra: Migrate to .NET 6 (#2829) 2021-11-28 21:24:17 +01:00
SamplerCreateInfo.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
ScreenCaptureImageInfo.cs Add Screenshot Feature (#2354) 2021-06-28 22:09:43 +02:00
ShaderBindings.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
ShaderInfo.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
ShaderSource.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
StencilOp.cs Add alternative "GL" enum values for StencilOp (#3321) 2022-05-05 21:16:58 +02:00
StencilTestDescriptor.cs Some code cleanup 2020-01-09 02:13:00 +01:00
SupportBufferUpdater.cs Rename ToSpan to AsSpan (#3556) 2022-08-11 18:07:37 -03:00
SwizzleComponent.cs Some code cleanup 2020-01-09 02:13:00 +01:00
Target.cs Copy dependency for multisample and non-multisample textures (#3382) 2022-06-05 14:06:47 -03:00
TextureCreateInfo.cs Clamp number of mipmap levels to avoid API errors due to invalid textures (#2808) 2021-11-03 20:58:24 -03:00
TextureReleaseCallback.cs
VertexAttribDescriptor.cs Avoid some redundant GL calls (#1958) 2021-01-27 08:44:07 +11:00
VertexBufferDescriptor.cs Some code cleanup 2020-01-09 02:13:00 +01:00
Viewport.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
ViewportSwizzle.cs Fix wrong face culling once and for all (#1277) 2020-05-28 09:03:07 +10:00