/* RefreshCS - C# bindings for the Refresh graphics Library * * Copyright (c) 2020 Evan Hemsley * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from * the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software in a * product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source distribution. * * Evan "cosmonaut" Hemsley * */ using System; using System.Runtime.InteropServices; namespace RefreshCS { public static class Refresh { private const string nativeLibName = "Refresh"; /* Version */ public const uint REFRESH_MAJOR_VERSION = 1; public const uint REFRESH_MINOR_VERSION = 13; public const uint REFRESH_PATCH_VERSION = 0; public const uint REFRESH_COMPILED_VERSION = ( (REFRESH_MAJOR_VERSION * 100 * 100) + (REFRESH_MINOR_VERSION * 100) + (REFRESH_PATCH_VERSION) ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern uint Refresh_LinkedVersion(); /* Enums */ public enum PresentMode { Immediate, Mailbox, FIFO, FIFORelaxed } public enum PrimitiveType { PointList, LineList, LineStrip, TriangleList, TriangleStrip } public enum LoadOp { Load, Clear, DontCare } public enum StoreOp { Store, DontCare } public enum IndexElementSize { Sixteen, ThirtyTwo } public enum TextureFormat { R8G8B8A8, B8G8R8A8, R5G6B5, A1R5G5B5, B4G4R4A4, A2R10G10B10, R16G16, R16G16B16A16, R8, BC1, BC2, BC3, BC7, R8G8_SNORM, R8G8B8A8_SNORM, R16_SFLOAT, R16G16_SFLOAT, R16G16B16A16_SFLOAT, R32_SFLOAT, R32G32_SFLOAT, R32G32B32A32_SFLOAT, R8_UINT, R8G8_UINT, R8G8B8A8_UINT, R16_UINT, R16G16_UINT, R16G16B16A16_UINT, D16, D32, D16S8, D32S8 } [Flags] public enum TextureUsageFlags : uint { Sampler = 1, ColorTarget = 2, DepthStencilTarget = 4, Compute = 8 } public enum SampleCount { One, Two, Four, Eight } public enum CubeMapFace : uint { PositiveX, NegativeX, PositiveY, NegativeY, PositiveZ, NegativeZ } [Flags] public enum BufferUsageFlags : uint { Vertex = 1, Index = 2, Compute = 4, Indirect = 8 } public enum VertexElementFormat { UInt, Float, Vector2, Vector3, Vector4, Color, Byte4, Short2, Short4, NormalizedShort2, NormalizedShort4, HalfVector2, HalfVector4 } public enum VertexInputRate { Vertex, Instance } public enum FillMode { Fill, Line } public enum CullMode { None, Front, Back } public enum FrontFace { CounterClockwise, Clockwise } public enum CompareOp { Never, Less, Equal, LessOrEqual, Greater, NotEqual, GreaterOrEqual, Always } public enum StencilOp { Keep, Zero, Replace, IncrementAndClamp, DecrementAndClamp, Invert, IncrementAndWrap, DecrementAndWrap } public enum BlendOp { Add, Subtract, ReverseSubtract, Min, Max } public enum BlendFactor { Zero, One, SourceColor, OneMinusSourceColor, DestinationColor, OneMinusDestinationColor, SourceAlpha, OneMinusSourceAlpha, DestinationAlpha, OneMinusDestinationAlpha, ConstantColor, OneMinusConstantColor, SourceAlphaSaturate } [Flags] public enum ColorComponentFlags : uint { R = 1, G = 2, B = 4, A = 8, RG = R | G, RB = R | B, RA = R | A, GB = G | B, GA = G | A, BA = B | A, RGB = R | G | B, RGA = R | G | A, GBA = G | B | A, RGBA = R | G | B | A } public enum ShaderStageType { Vertex, Fragment } public enum Filter { Nearest, Linear } public enum SamplerMipmapMode { Nearest, Linear } public enum SamplerAddressMode { Repeat, MirroredRepeat, ClampToEdge, ClampToBorder } public enum BorderColor { FloatTransparentBlack, IntTransparentBlack, FloatOpaqueBlack, IntOpaqueBlack, FloatOpaqueWhite, IntOpaqueWhite } public enum Backend { DontCare, Vulkan, PS5, Invalid } /* Native Structures */ [StructLayout(LayoutKind.Sequential)] public struct DepthStencilValue { public float depth; public uint stencil; } [StructLayout(LayoutKind.Sequential)] public struct Rect { public int x; public int y; public int w; public int h; } [StructLayout(LayoutKind.Sequential)] public struct Vec4 { public float x; public float y; public float z; public float w; } [StructLayout(LayoutKind.Sequential)] public struct Viewport { public float x; public float y; public float w; public float h; public float minDepth; public float maxDepth; } [StructLayout(LayoutKind.Sequential)] public struct TextureSlice { public IntPtr texture; public Rect rectangle; public uint depth; public uint layer; public uint level; } [StructLayout(LayoutKind.Sequential)] public struct IndirectDrawCommand { public uint vertexCount; public uint instanceCount; public uint firstVertex; public uint firstInstance; } [StructLayout(LayoutKind.Sequential)] public struct SamplerStateCreateInfo { public Filter minFilter; public Filter magFilter; public SamplerMipmapMode mipmapMode; public SamplerAddressMode addressModeU; public SamplerAddressMode addressModeV; public SamplerAddressMode addressModeW; public float mipLodBias; public byte anisotropyEnable; public float maxAnisotropy; public byte compareEnable; public CompareOp compareOp; public float minLod; public float maxLod; public BorderColor borderColor; } [StructLayout(LayoutKind.Sequential)] public struct VertexBinding { public uint binding; public uint stride; public VertexInputRate inputRate; } [StructLayout(LayoutKind.Sequential)] public struct VertexAttribute { public uint location; public uint binding; public VertexElementFormat format; public uint offset; } [StructLayout(LayoutKind.Sequential)] public struct VertexInputState { public IntPtr vertexBindings; public uint vertexBindingCount; public IntPtr vertexAttributes; public uint vertexAttributeCount; } [StructLayout(LayoutKind.Sequential)] public struct StencilOpState { public StencilOp failOp; public StencilOp passOp; public StencilOp depthFailOp; public CompareOp compareOp; public uint compareMask; public uint writeMask; public uint reference; } [StructLayout(LayoutKind.Sequential)] public struct ColorAttachmentBlendState { public byte blendEnable; public BlendFactor sourceColorBlendFactor; public BlendFactor destinationColorBlendFactor; public BlendOp colorBlendOp; public BlendFactor sourceAlphaBlendFactor; public BlendFactor destinationAlphaBlendFactor; public BlendOp alphaBlendOp; public ColorComponentFlags colorWriteMask; } [StructLayout(LayoutKind.Sequential)] public struct ShaderModuleCreateInfo { public UIntPtr codeSize; /* size_t */ public IntPtr byteCode; } [StructLayout(LayoutKind.Sequential)] public struct TextureCreateInfo { public uint width; public uint height; public uint depth; public byte isCube; public uint levelCount; public SampleCount sampleCount; public TextureFormat format; public TextureUsageFlags usageFlags; /* Refresh_TextureUsageFlags */ } [StructLayout(LayoutKind.Sequential)] public struct GraphicsShaderInfo { public IntPtr shaderModule; [MarshalAs(UnmanagedType.LPStr)] public string entryPointName; public ulong uniformBufferSize; public uint samplerBindingCount; } [StructLayout(LayoutKind.Sequential)] public struct ComputeShaderInfo { public IntPtr shaderModule; [MarshalAs(UnmanagedType.LPStr)] public string entryPointName; public ulong uniformBufferSize; public uint bufferBindingCount; public uint imageBindingCount; } [StructLayout(LayoutKind.Sequential)] public struct RasterizerState { public FillMode fillMode; public CullMode cullMode; public FrontFace frontFace; public byte depthBiasEnable; public float depthBiasConstantFactor; public float depthBiasClamp; public float depthBiasSlopeFactor; } [StructLayout(LayoutKind.Sequential)] public struct MultisampleState { public SampleCount multisampleCount; public uint sampleMask; } [StructLayout(LayoutKind.Sequential)] public struct DepthStencilState { public byte depthTestEnable; public byte depthWriteEnable; public CompareOp compareOp; public byte depthBoundsTestEnable; public byte stencilTestEnable; public StencilOpState frontStencilState; public StencilOpState backStencilState; public float minDepthBounds; public float maxDepthBounds; } [StructLayout(LayoutKind.Sequential)] public struct ColorAttachmentDescription { public TextureFormat format; public ColorAttachmentBlendState blendState; } [StructLayout(LayoutKind.Sequential)] public struct GraphicsPipelineAttachmentInfo { public IntPtr colorAttachmentDescriptions; /* Max size 4 */ public uint colorAttachmentCount; public byte hasDepthStencilAttachment; public TextureFormat depthStencilFormat; } [StructLayout(LayoutKind.Sequential)] public unsafe struct GraphicsPipelineCreateInfo { public GraphicsShaderInfo vertexShaderInfo; public GraphicsShaderInfo fragmentShaderInfo; public VertexInputState vertexInputState; public PrimitiveType primitiveType; public RasterizerState rasterizerState; public MultisampleState multisampleState; public DepthStencilState depthStencilState; public GraphicsPipelineAttachmentInfo attachmentInfo; public fixed float blendConstants[4]; } public struct ColorAttachmentInfo { public IntPtr texture; public uint depth; public uint layer; public uint level; public Vec4 clearColor; public LoadOp loadOp; public StoreOp storeOp; } public struct DepthStencilAttachmentInfo { public IntPtr texture; public uint depth; public uint layer; public uint level; public DepthStencilValue depthStencilClearValue; public LoadOp loadOp; public StoreOp storeOp; public LoadOp stencilLoadOp; public StoreOp stencilStoreOp; } /* Logging */ [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void Refresh_LogFunc(IntPtr msg); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_HookLogFunctions( Refresh_LogFunc info, Refresh_LogFunc warn, Refresh_LogFunc error ); /* Init/Quit */ [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern Backend Refresh_SelectBackend( Backend preferredBackend, out uint flags ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_CreateDevice( byte debugMode ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_DestroyDevice(IntPtr device); /* Drawing */ [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_DrawInstancedPrimitives( IntPtr device, IntPtr commandBuffer, uint baseVertex, uint startIndex, uint primitiveCount, uint instanceCount, uint vertexParamOffset, uint fragmentParamOffset ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_DrawIndexedPrimitives( IntPtr device, IntPtr commandBuffer, uint baseVertex, uint startIndex, uint primitiveCount, uint vertexParamOffset, uint fragmentParamOffset ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_DrawPrimitives( IntPtr device, IntPtr commandBuffer, uint vertexStart, uint primitiveCount, uint vertexParamOffset, uint fragmentParamOffset ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_DrawPrimitivesIndirect( IntPtr device, IntPtr commandBuffer, IntPtr buffer, uint offsetInBytes, uint drawCount, uint stride, uint vertexParamOffset, uint fragmentParamOffset ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_DispatchCompute( IntPtr device, IntPtr commandBuffer, uint groupCountX, uint groupCountY, uint groupCountZ, uint computeParamOffset ); /* Creates */ [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_CreateComputePipeline( IntPtr device, in ComputeShaderInfo computeShaderInfo ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_CreateGraphicsPipeline( IntPtr device, in GraphicsPipelineCreateInfo graphicsPipelineCreateInfo ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_CreateSampler( IntPtr device, in SamplerStateCreateInfo samplerStateCreateInfo ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_CreateShaderModule( IntPtr device, in ShaderModuleCreateInfo shaderModuleCreateInfo ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_CreateTexture( IntPtr device, in TextureCreateInfo textureCreateInfo ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_CreateBuffer( IntPtr device, BufferUsageFlags usageFlags, uint sizeInBytes ); /* Setters */ [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_SetTextureData( IntPtr device, IntPtr commandBuffer, in TextureSlice textureSlice, IntPtr data, uint dataLengthInBytes ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_SetTextureDataYUV( IntPtr device, IntPtr commandBuffer, IntPtr y, IntPtr u, IntPtr v, uint yWidth, uint yHeight, uint uvWidth, uint uvHeight, IntPtr yDataPtr, IntPtr uDataPtr, IntPtr vDataPtr, uint yDataLength, uint uvDataLength, uint yStride, uint uvStride ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_CopyTextureToTexture( IntPtr device, IntPtr commandBuffer, in TextureSlice sourceTextureSlice, in TextureSlice destinationTextureSlice, Filter filter ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_CopyTextureToBuffer( IntPtr device, IntPtr commandBuffer, in TextureSlice textureSlice, IntPtr buffer ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_GetBufferData( IntPtr device, IntPtr buffer, IntPtr data, uint dataLengthInBytes ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_SetBufferData( IntPtr device, IntPtr commandBuffer, IntPtr buffer, uint offsetInBytes, IntPtr data, uint dataLengthInBytes ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern uint Refresh_PushVertexShaderUniforms( IntPtr device, IntPtr commandBuffer, IntPtr data, uint dataLengthInBytes ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern uint Refresh_PushFragmentShaderUniforms( IntPtr device, IntPtr commandBuffer, IntPtr data, uint dataLengthInBytes ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern uint Refresh_PushComputeShaderUniforms( IntPtr device, IntPtr commandBuffer, IntPtr data, uint dataLengthInBytes ); /* Disposal */ [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_QueueDestroyTexture( IntPtr device, IntPtr texture ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_QueueDestroySampler( IntPtr device, IntPtr sampler ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_QueueDestroyBuffer( IntPtr device, IntPtr buffer ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_QueueDestroyShaderModule( IntPtr device, IntPtr shaderModule ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_QueueDestroyComputePipeline( IntPtr device, IntPtr computePipeline ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_QueueDestroyGraphicsPipeline( IntPtr device, IntPtr graphicsPipeline ); /* Graphics State */ [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BeginRenderPass( IntPtr device, IntPtr commandBuffer, IntPtr colorAttachmentInfos, uint colorAttachmentCount, IntPtr depthStencilAttachmentInfo /* can be NULL */ ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static unsafe extern void Refresh_BeginRenderPass( IntPtr device, IntPtr commandBuffer, ColorAttachmentInfo* colorAttachmentInfos, uint colorAttachmentCount, DepthStencilAttachmentInfo* depthStencilAttachmentInfo /* can be NULL */ ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_EndRenderPass( IntPtr device, IntPtr commandBuffer ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindGraphicsPipeline( IntPtr device, IntPtr commandBuffer, IntPtr graphicsPipeline ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_SetViewport( IntPtr device, IntPtr commandBuffer, in Viewport viewport ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_SetScissor( IntPtr device, IntPtr commandBuffer, in Rect scissor ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindVertexBuffers( IntPtr device, IntPtr commandBuffer, uint firstBinding, uint bindingCount, IntPtr pBuffers, IntPtr pOffsets ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindIndexBuffer( IntPtr device, IntPtr commandBuffer, IntPtr buffer, uint offset, IndexElementSize indexElementSize ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindVertexSamplers( IntPtr device, IntPtr commandBuffer, IntPtr pTextures, IntPtr pSamplers ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindFragmentSamplers( IntPtr device, IntPtr commandBuffer, IntPtr pTextures, IntPtr pSamplers ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindComputePipeline( IntPtr device, IntPtr commandBuffer, IntPtr computePipeline ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindComputeBuffers( IntPtr device, IntPtr commandBuffer, IntPtr pBuffers ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_BindComputeTextures( IntPtr device, IntPtr commandBuffer, IntPtr pTextures ); /* Submission/Presentation */ [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern byte Refresh_ClaimWindow( IntPtr device, IntPtr windowHandle, PresentMode presentMode ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_UnclaimWindow( IntPtr device, IntPtr windowHandle ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_SetSwapchainPresentMode( IntPtr device, IntPtr windowHandle, PresentMode presentMode ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern TextureFormat Refresh_GetSwapchainFormat( IntPtr device, IntPtr windowHandle ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_AcquireCommandBuffer( IntPtr device ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_AcquireSwapchainTexture( IntPtr device, IntPtr commandBuffer, IntPtr windowHandle, out uint width, out uint height ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_Submit( IntPtr device, uint commandBufferCount, IntPtr pCommandBuffers ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_Wait( IntPtr device ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_Image_Load( IntPtr bufferPtr, int bufferLength, out int w, out int h, out int len ); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void Refresh_Image_Free(IntPtr mem); [DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Refresh_Image_SavePNG( [MarshalAs(UnmanagedType.LPStr)] string filename, IntPtr data, int w, int h ); } }