Set texture/image bindings in place rather than allocating and passing an array (#2647)

* Remove allocations for texture bindings and state

* Rent rather than stackalloc + copy

A bit faster.
This commit is contained in:
riperiperi 2021-09-19 13:03:05 +01:00 committed by GitHub
parent 32c09af71a
commit b0af010247
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 95 additions and 47 deletions

View file

@ -970,14 +970,14 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
if (info == null)
{
_channel.TextureManager.SetGraphicsTextures(stage, Array.Empty<TextureBindingInfo>());
_channel.TextureManager.SetGraphicsImages(stage, Array.Empty<TextureBindingInfo>());
_channel.TextureManager.RentGraphicsTextureBindings(stage, 0);
_channel.TextureManager.RentGraphicsImageBindings(stage, 0);
_channel.BufferManager.SetGraphicsStorageBufferBindings(stage, null);
_channel.BufferManager.SetGraphicsUniformBufferBindings(stage, null);
continue;
}
var textureBindings = new TextureBindingInfo[info.Textures.Count];
Span<TextureBindingInfo> textureBindings = _channel.TextureManager.RentGraphicsTextureBindings(stage, info.Textures.Count);
for (int index = 0; index < info.Textures.Count; index++)
{
@ -993,9 +993,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
descriptor.Flags);
}
_channel.TextureManager.SetGraphicsTextures(stage, textureBindings);
var imageBindings = new TextureBindingInfo[info.Images.Count];
TextureBindingInfo[] imageBindings = _channel.TextureManager.RentGraphicsImageBindings(stage, info.Images.Count);
for (int index = 0; index < info.Images.Count; index++)
{
@ -1013,8 +1011,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
descriptor.Flags);
}
_channel.TextureManager.SetGraphicsImages(stage, imageBindings);
_channel.BufferManager.SetGraphicsStorageBufferBindings(stage, info.SBuffers);
_channel.BufferManager.SetGraphicsUniformBufferBindings(stage, info.CBuffers);
}