aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormageven <62494521+mageven@users.noreply.github.com>2022-10-02 14:29:34 +0530
committerGitHub <noreply@github.com>2022-10-02 10:59:34 +0200
commit96bf7f8522e38c36d792a6ac2173497c3674e920 (patch)
treee4e997593fb1d2b490a17bf6c569cf501114e15a
parent33e673ceb84edf31dcb29abdf5df004cfd3beca5 (diff)
Avoid allocating unmanaged string per shader (#3730)1.1.285
* Avoid reallocating same unmanaged string per shader * Address PR feedback * Rename to _disposed
-rw-r--r--Ryujinx.Graphics.Vulkan/Shader.cs14
1 files changed, 7 insertions, 7 deletions
diff --git a/Ryujinx.Graphics.Vulkan/Shader.cs b/Ryujinx.Graphics.Vulkan/Shader.cs
index db13af31..26d0ca40 100644
--- a/Ryujinx.Graphics.Vulkan/Shader.cs
+++ b/Ryujinx.Graphics.Vulkan/Shader.cs
@@ -9,17 +9,19 @@ using System.Threading.Tasks;
namespace Ryujinx.Graphics.Vulkan
{
- class Shader
+ class Shader : IDisposable
{
// The shaderc.net dependency's Options constructor and dispose are not thread safe.
// Take this lock when using them.
private static object _shaderOptionsLock = new object();
+ private static readonly IntPtr _ptrMainEntryPointName = Marshal.StringToHGlobalAnsi("main");
+
private readonly Vk _api;
private readonly Device _device;
private readonly ShaderStageFlags _stage;
- private IntPtr _entryPointName;
+ private bool _disposed;
private ShaderModule _module;
public ShaderStageFlags StageFlags => _stage;
@@ -39,7 +41,6 @@ namespace Ryujinx.Graphics.Vulkan
CompileStatus = ProgramLinkStatus.Incomplete;
_stage = shaderSource.Stage.Convert();
- _entryPointName = Marshal.StringToHGlobalAnsi("main");
CompileTask = Task.Run(() =>
{
@@ -145,7 +146,7 @@ namespace Ryujinx.Graphics.Vulkan
SType = StructureType.PipelineShaderStageCreateInfo,
Stage = _stage,
Module = _module,
- PName = (byte*)_entryPointName
+ PName = (byte*)_ptrMainEntryPointName
};
}
@@ -156,11 +157,10 @@ namespace Ryujinx.Graphics.Vulkan
public unsafe void Dispose()
{
- if (_entryPointName != IntPtr.Zero)
+ if (!_disposed)
{
_api.DestroyShaderModule(_device, _module, null);
- Marshal.FreeHGlobal(_entryPointName);
- _entryPointName = IntPtr.Zero;
+ _disposed = true;
}
}
}