2021-01-20 03:33:27 +00:00
|
|
|
|
using RefreshCS;
|
|
|
|
|
using System;
|
2022-06-06 17:42:05 +00:00
|
|
|
|
using System.IO;
|
2023-04-05 07:47:02 +00:00
|
|
|
|
using System.Runtime.InteropServices;
|
2021-01-20 03:33:27 +00:00
|
|
|
|
|
|
|
|
|
namespace MoonWorks.Graphics
|
|
|
|
|
{
|
2022-02-23 05:14:32 +00:00
|
|
|
|
/// <summary>
|
2023-01-21 23:37:01 +00:00
|
|
|
|
/// Shader modules expect input in Refresh bytecode format.
|
2022-02-23 05:14:32 +00:00
|
|
|
|
/// </summary>
|
2023-12-15 18:46:43 +00:00
|
|
|
|
public class ShaderModule : RefreshResource
|
2022-02-23 05:14:32 +00:00
|
|
|
|
{
|
2022-03-04 01:16:39 +00:00
|
|
|
|
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyShaderModule;
|
2021-01-20 03:33:27 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
public unsafe ShaderModule(GraphicsDevice device, string filePath) : base(device)
|
|
|
|
|
{
|
2023-04-05 07:47:02 +00:00
|
|
|
|
using var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
|
|
|
|
|
Handle = CreateFromStream(device, stream);
|
2022-06-06 17:42:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public unsafe ShaderModule(GraphicsDevice device, Stream stream) : base(device)
|
|
|
|
|
{
|
|
|
|
|
Handle = CreateFromStream(device, stream);
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-05 07:47:02 +00:00
|
|
|
|
private static unsafe IntPtr CreateFromStream(GraphicsDevice device, Stream stream)
|
2022-06-06 17:42:05 +00:00
|
|
|
|
{
|
2023-04-05 07:47:02 +00:00
|
|
|
|
var bytecodeBuffer = NativeMemory.Alloc((nuint) stream.Length);
|
|
|
|
|
var bytecodeSpan = new Span<byte>(bytecodeBuffer, (int) stream.Length);
|
|
|
|
|
stream.ReadExactly(bytecodeSpan);
|
|
|
|
|
|
|
|
|
|
Refresh.ShaderModuleCreateInfo shaderModuleCreateInfo;
|
|
|
|
|
shaderModuleCreateInfo.codeSize = (nuint) stream.Length;
|
|
|
|
|
shaderModuleCreateInfo.byteCode = (nint) bytecodeBuffer;
|
2021-01-29 02:07:48 +00:00
|
|
|
|
|
2023-04-05 07:47:02 +00:00
|
|
|
|
var shaderModule = Refresh.Refresh_CreateShaderModule(device.Handle, shaderModuleCreateInfo);
|
2021-01-20 03:33:27 +00:00
|
|
|
|
|
2023-04-05 07:47:02 +00:00
|
|
|
|
NativeMemory.Free(bytecodeBuffer);
|
|
|
|
|
return shaderModule;
|
2022-02-23 05:14:32 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-01-20 03:33:27 +00:00
|
|
|
|
}
|