2024-06-05 19:34:24 +00:00
|
|
|
|
using RefreshCS;
|
2024-06-04 19:19:41 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
|
|
namespace MoonWorks.Graphics
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Shader modules expect input in Refresh bytecode format.
|
|
|
|
|
/// </summary>
|
2024-06-05 19:34:24 +00:00
|
|
|
|
public class Shader : RefreshResource
|
2024-06-04 19:19:41 +00:00
|
|
|
|
{
|
2024-06-05 19:34:24 +00:00
|
|
|
|
protected override Action<IntPtr, IntPtr> ReleaseFunction => Refresh.Refresh_ReleaseShader;
|
2024-06-04 19:19:41 +00:00
|
|
|
|
|
|
|
|
|
public unsafe Shader(
|
|
|
|
|
GraphicsDevice device,
|
|
|
|
|
string filePath,
|
|
|
|
|
string entryPointName,
|
|
|
|
|
ShaderStage shaderStage,
|
|
|
|
|
ShaderFormat shaderFormat
|
|
|
|
|
) : base(device)
|
|
|
|
|
{
|
|
|
|
|
using var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
|
|
|
|
|
Handle = CreateFromStream(device, stream, entryPointName, shaderStage, shaderFormat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public unsafe Shader(
|
|
|
|
|
GraphicsDevice device,
|
|
|
|
|
Stream stream,
|
|
|
|
|
string entryPointName,
|
|
|
|
|
ShaderStage shaderStage,
|
|
|
|
|
ShaderFormat shaderFormat
|
|
|
|
|
) : base(device)
|
|
|
|
|
{
|
|
|
|
|
Handle = CreateFromStream(device, stream, entryPointName, shaderStage, shaderFormat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static unsafe IntPtr CreateFromStream(
|
|
|
|
|
GraphicsDevice device,
|
|
|
|
|
Stream stream,
|
|
|
|
|
string entryPointName,
|
|
|
|
|
ShaderStage shaderStage,
|
|
|
|
|
ShaderFormat shaderFormat
|
|
|
|
|
) {
|
|
|
|
|
var bytecodeBuffer = NativeMemory.Alloc((nuint) stream.Length);
|
|
|
|
|
var bytecodeSpan = new Span<byte>(bytecodeBuffer, (int) stream.Length);
|
|
|
|
|
stream.ReadExactly(bytecodeSpan);
|
|
|
|
|
|
2024-06-05 19:34:24 +00:00
|
|
|
|
Refresh.ShaderCreateInfo shaderCreateInfo;
|
2024-06-04 19:19:41 +00:00
|
|
|
|
shaderCreateInfo.CodeSize = (nuint) stream.Length;
|
|
|
|
|
shaderCreateInfo.Code = (byte*) bytecodeBuffer;
|
|
|
|
|
shaderCreateInfo.EntryPointName = entryPointName;
|
2024-06-05 19:34:24 +00:00
|
|
|
|
shaderCreateInfo.Stage = (Refresh.ShaderStage) shaderStage;
|
|
|
|
|
shaderCreateInfo.Format = (Refresh.ShaderFormat) shaderFormat;
|
2024-06-04 19:19:41 +00:00
|
|
|
|
|
2024-06-05 19:34:24 +00:00
|
|
|
|
var shaderModule = Refresh.Refresh_CreateShader(
|
2024-06-04 19:19:41 +00:00
|
|
|
|
device.Handle,
|
|
|
|
|
shaderCreateInfo
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NativeMemory.Free(bytecodeBuffer);
|
|
|
|
|
return shaderModule;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|