From db44c3e37a69f41de6454a5926ba401c392c9de8 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Thu, 21 Jan 2021 17:27:25 -0800 Subject: [PATCH] change refs + a SetData convenience method --- lib/RefreshCS | 2 +- src/Graphics/CommandBuffer.cs | 40 ++++++++++---------- src/Graphics/GraphicsDevice.cs | 2 +- src/Graphics/RefreshStructs.cs | 27 +++++++++++++ src/Graphics/Resources/Buffer.cs | 17 +++++++++ src/Graphics/Resources/ColorTarget.cs | 3 +- src/Graphics/Resources/ComputePipeline.cs | 2 +- src/Graphics/Resources/Framebuffer.cs | 2 +- src/Graphics/Resources/GraphicsPipeline.cs | 8 ++-- src/Graphics/Resources/RenderPass.cs | 4 +- src/Graphics/Resources/Sampler.cs | 4 +- src/Graphics/Resources/ShaderModule.cs | 2 +- src/Graphics/Resources/Texture.cs | 8 ++-- src/Graphics/State/DepthStencilState.cs | 10 ++--- src/Graphics/State/RasterizerState.cs | 44 ++++++++++++++++++++-- 15 files changed, 124 insertions(+), 51 deletions(-) diff --git a/lib/RefreshCS b/lib/RefreshCS index ba183e8..718aaad 160000 --- a/lib/RefreshCS +++ b/lib/RefreshCS @@ -1 +1 @@ -Subproject commit ba183e8c0f9d21e4397d76941078b4969d4f6686 +Subproject commit 718aaad80ebf075192e05bf7af97241d7cf7e726 diff --git a/src/Graphics/CommandBuffer.cs b/src/Graphics/CommandBuffer.cs index 103f5f6..097f09d 100644 --- a/src/Graphics/CommandBuffer.cs +++ b/src/Graphics/CommandBuffer.cs @@ -19,8 +19,8 @@ namespace MoonWorks.Graphics public unsafe void BeginRenderPass( RenderPass renderPass, Framebuffer framebuffer, - ref Rect renderArea, - ref DepthStencilValue depthStencilClearValue, + in Rect renderArea, + in DepthStencilValue depthStencilClearValue, params Color[] clearColors ) { var refreshRenderArea = renderArea.ToRefresh(); @@ -33,10 +33,10 @@ namespace MoonWorks.Graphics Handle, renderPass.Handle, framebuffer.Handle, - ref refreshRenderArea, + refreshRenderArea, (IntPtr) clearColorPtr, (uint)clearColors.Length, - ref refreshDepthStencilClearValue + refreshDepthStencilClearValue ); } } @@ -44,7 +44,7 @@ namespace MoonWorks.Graphics public unsafe void BeginRenderPass( RenderPass renderPass, Framebuffer framebuffer, - ref Rect renderArea, + in Rect renderArea, params Color[] clearColors ) { var refreshRenderArea = renderArea.ToRefresh(); @@ -56,7 +56,7 @@ namespace MoonWorks.Graphics Handle, renderPass.Handle, framebuffer.Handle, - ref refreshRenderArea, + refreshRenderArea, (IntPtr) clearColorPtr, (uint) clearColors.Length, IntPtr.Zero @@ -246,18 +246,18 @@ namespace MoonWorks.Graphics } public void Clear( - ref Refresh.Rect clearRect, + in Refresh.Rect clearRect, Refresh.ClearOptionsFlags clearOptions, - ref Refresh.Color[] colors, + in Refresh.Color[] colors, float depth, int stencil ) { Refresh.Refresh_Clear( Device.Handle, Handle, - ref clearRect, + in clearRect, clearOptions, - ref colors, + in colors, (uint) colors.Length, depth, stencil @@ -351,8 +351,8 @@ namespace MoonWorks.Graphics Refresh.Refresh_QueuePresent( Device.Handle, Handle, - ref refreshTextureSlice, - ref refreshRect, + refreshTextureSlice, + refreshRect, (Refresh.Filter)filter ); } @@ -368,8 +368,8 @@ namespace MoonWorks.Graphics Refresh.Refresh_QueuePresent( Device.Handle, Handle, - ref refreshTextureSlice, - ref refreshRect, + refreshTextureSlice, + refreshRect, (Refresh.Filter) filter ); } @@ -378,12 +378,10 @@ namespace MoonWorks.Graphics in TextureSlice textureSlice, Filter filter ) { - var refreshTextureSlice = textureSlice.ToRefreshTextureSlice(); - Refresh.Refresh_QueuePresent( Device.Handle, Handle, - ref refreshTextureSlice, + textureSlice.ToRefreshTextureSlice(), IntPtr.Zero, (Refresh.Filter) filter ); @@ -411,7 +409,7 @@ namespace MoonWorks.Graphics Refresh.Refresh_QueuePresent( Device.Handle, Handle, - ref refreshTextureSlice, + refreshTextureSlice, IntPtr.Zero, (Refresh.Filter) filter ); @@ -428,8 +426,8 @@ namespace MoonWorks.Graphics Refresh.Refresh_CopyTextureToTexture( Device.Handle, Handle, - ref sourceRefreshTextureSlice, - ref destRefreshTextureSlice, + sourceRefreshTextureSlice, + destRefreshTextureSlice, (Refresh.Filter) filter ); } @@ -443,7 +441,7 @@ namespace MoonWorks.Graphics Refresh.Refresh_CopyTextureToBuffer( Device.Handle, Handle, - ref refreshTextureSlice, + refreshTextureSlice, buffer.Handle ); } diff --git a/src/Graphics/GraphicsDevice.cs b/src/Graphics/GraphicsDevice.cs index fb39253..9ba133f 100644 --- a/src/Graphics/GraphicsDevice.cs +++ b/src/Graphics/GraphicsDevice.cs @@ -25,7 +25,7 @@ namespace MoonWorks.Graphics }; Handle = Refresh.Refresh_CreateDevice( - ref presentationParameters, + presentationParameters, Conversions.BoolToByte(debugMode) ); diff --git a/src/Graphics/RefreshStructs.cs b/src/Graphics/RefreshStructs.cs index 85390c7..a42feb2 100644 --- a/src/Graphics/RefreshStructs.cs +++ b/src/Graphics/RefreshStructs.cs @@ -99,4 +99,31 @@ namespace MoonWorks.Graphics public LoadOp stencilLoadOp; public StoreOp stencilStoreOp; } + + [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; + + // FIXME: can we do an explicit cast here? + public Refresh.StencilOpState ToRefresh() + { + return new Refresh.StencilOpState + { + failOp = (Refresh.StencilOp)failOp, + passOp = (Refresh.StencilOp)passOp, + depthFailOp = (Refresh.StencilOp)depthFailOp, + compareOp = (Refresh.CompareOp)compareOp, + compareMask = compareMask, + writeMask = writeMask, + reference = reference + }; + } + } } diff --git a/src/Graphics/Resources/Buffer.cs b/src/Graphics/Resources/Buffer.cs index 0ab08de..318d000 100644 --- a/src/Graphics/Resources/Buffer.cs +++ b/src/Graphics/Resources/Buffer.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; using RefreshCS; namespace MoonWorks.Graphics @@ -38,6 +39,22 @@ namespace MoonWorks.Graphics } } + public unsafe void SetData( + T[] data + ) where T : unmanaged + { + fixed (T* ptr = &data[0]) + { + Refresh.Refresh_SetBufferData( + Device.Handle, + Handle, + 0, + (IntPtr)ptr, + (uint) (data.Length * Marshal.SizeOf()) + ); + } + } + public unsafe void SetData( uint offsetInBytes, T* data, diff --git a/src/Graphics/Resources/ColorTarget.cs b/src/Graphics/Resources/ColorTarget.cs index eb66c68..d25401a 100644 --- a/src/Graphics/Resources/ColorTarget.cs +++ b/src/Graphics/Resources/ColorTarget.cs @@ -40,11 +40,10 @@ namespace MoonWorks.Graphics public ColorTarget(GraphicsDevice device, SampleCount sampleCount, ref TextureSlice textureSlice) : base(device) { - var refreshTextureSlice = textureSlice.ToRefreshTextureSlice(); Handle = Refresh.Refresh_CreateColorTarget( device.Handle, (Refresh.SampleCount) sampleCount, - ref refreshTextureSlice + textureSlice.ToRefreshTextureSlice() ); TextureSlice = textureSlice; } diff --git a/src/Graphics/Resources/ComputePipeline.cs b/src/Graphics/Resources/ComputePipeline.cs index 9554e9f..75be750 100644 --- a/src/Graphics/Resources/ComputePipeline.cs +++ b/src/Graphics/Resources/ComputePipeline.cs @@ -32,7 +32,7 @@ namespace MoonWorks.Graphics Handle = Refresh.Refresh_CreateComputePipeline( device.Handle, - ref computePipelineCreateInfo + computePipelineCreateInfo ); } } diff --git a/src/Graphics/Resources/Framebuffer.cs b/src/Graphics/Resources/Framebuffer.cs index 3f6f8ad..71f09fd 100644 --- a/src/Graphics/Resources/Framebuffer.cs +++ b/src/Graphics/Resources/Framebuffer.cs @@ -44,7 +44,7 @@ namespace MoonWorks.Graphics renderPass = renderPass.Handle }; - Handle = Refresh.Refresh_CreateFramebuffer(device.Handle, ref framebufferCreateInfo); + Handle = Refresh.Refresh_CreateFramebuffer(device.Handle, framebufferCreateInfo); } } } diff --git a/src/Graphics/Resources/GraphicsPipeline.cs b/src/Graphics/Resources/GraphicsPipeline.cs index 087c726..bdc4071 100644 --- a/src/Graphics/Resources/GraphicsPipeline.cs +++ b/src/Graphics/Resources/GraphicsPipeline.cs @@ -46,12 +46,12 @@ namespace MoonWorks.Graphics graphicsPipelineCreateInfo.colorBlendState.blendConstants[2] = colorBlendState.BlendConstants.B; graphicsPipelineCreateInfo.colorBlendState.blendConstants[3] = colorBlendState.BlendConstants.A; - graphicsPipelineCreateInfo.depthStencilState.backStencilState = depthStencilState.BackStencilState; - graphicsPipelineCreateInfo.depthStencilState.compareOp = depthStencilState.CompareOp; + graphicsPipelineCreateInfo.depthStencilState.backStencilState = depthStencilState.BackStencilState.ToRefresh(); + graphicsPipelineCreateInfo.depthStencilState.compareOp = (Refresh.CompareOp) depthStencilState.CompareOp; graphicsPipelineCreateInfo.depthStencilState.depthBoundsTestEnable = Conversions.BoolToByte(depthStencilState.DepthBoundsTestEnable); graphicsPipelineCreateInfo.depthStencilState.depthTestEnable = Conversions.BoolToByte(depthStencilState.DepthTestEnable); graphicsPipelineCreateInfo.depthStencilState.depthWriteEnable = Conversions.BoolToByte(depthStencilState.DepthWriteEnable); - graphicsPipelineCreateInfo.depthStencilState.frontStencilState = depthStencilState.FrontStencilState; + graphicsPipelineCreateInfo.depthStencilState.frontStencilState = depthStencilState.FrontStencilState.ToRefresh(); graphicsPipelineCreateInfo.depthStencilState.maxDepthBounds = depthStencilState.MaxDepthBounds; graphicsPipelineCreateInfo.depthStencilState.minDepthBounds = depthStencilState.MinDepthBounds; graphicsPipelineCreateInfo.depthStencilState.stencilTestEnable = Conversions.BoolToByte(depthStencilState.StencilTestEnable); @@ -93,7 +93,7 @@ namespace MoonWorks.Graphics graphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType; graphicsPipelineCreateInfo.renderPass = renderPass.Handle; - Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, ref graphicsPipelineCreateInfo); + Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, graphicsPipelineCreateInfo); vertexAttributesHandle.Free(); vertexBindingsHandle.Free(); diff --git a/src/Graphics/Resources/RenderPass.cs b/src/Graphics/Resources/RenderPass.cs index 512a117..415f26d 100644 --- a/src/Graphics/Resources/RenderPass.cs +++ b/src/Graphics/Resources/RenderPass.cs @@ -19,7 +19,7 @@ namespace MoonWorks.Graphics renderPassCreateInfo.colorTargetDescriptions = (IntPtr) ptr; renderPassCreateInfo.depthStencilTargetDescription = IntPtr.Zero; - Handle = Refresh.Refresh_CreateRenderPass(device.Handle, ref renderPassCreateInfo); + Handle = Refresh.Refresh_CreateRenderPass(device.Handle, renderPassCreateInfo); } } @@ -38,7 +38,7 @@ namespace MoonWorks.Graphics renderPassCreateInfo.colorTargetDescriptions = (IntPtr)colorPtr; renderPassCreateInfo.depthStencilTargetDescription = (IntPtr) depthStencilPtr; - Handle = Refresh.Refresh_CreateRenderPass(device.Handle, ref renderPassCreateInfo); + Handle = Refresh.Refresh_CreateRenderPass(device.Handle, renderPassCreateInfo); } } } diff --git a/src/Graphics/Resources/Sampler.cs b/src/Graphics/Resources/Sampler.cs index 84277c4..ca60b8d 100644 --- a/src/Graphics/Resources/Sampler.cs +++ b/src/Graphics/Resources/Sampler.cs @@ -12,11 +12,9 @@ namespace MoonWorks.Graphics ref SamplerState samplerState ) : base(device) { - var refreshSamplerStateCreateInfo = samplerState.ToRefreshSamplerStateCreateInfo(); - Handle = Refresh.Refresh_CreateSampler( device.Handle, - ref refreshSamplerStateCreateInfo + samplerState.ToRefreshSamplerStateCreateInfo() ); } } diff --git a/src/Graphics/Resources/ShaderModule.cs b/src/Graphics/Resources/ShaderModule.cs index 308c51e..65824c3 100644 --- a/src/Graphics/Resources/ShaderModule.cs +++ b/src/Graphics/Resources/ShaderModule.cs @@ -16,7 +16,7 @@ namespace MoonWorks.Graphics shaderModuleCreateInfo.codeSize = (UIntPtr) fileInfo.Length; shaderModuleCreateInfo.byteCode = (IntPtr) ptr; - Handle = Refresh.Refresh_CreateShaderModule(device.Handle, ref shaderModuleCreateInfo); + Handle = Refresh.Refresh_CreateShaderModule(device.Handle, shaderModuleCreateInfo); } } } diff --git a/src/Graphics/Resources/Texture.cs b/src/Graphics/Resources/Texture.cs index 616eb62..8df8139 100644 --- a/src/Graphics/Resources/Texture.cs +++ b/src/Graphics/Resources/Texture.cs @@ -124,11 +124,9 @@ namespace MoonWorks.Graphics public Texture(GraphicsDevice device, ref TextureCreateInfo textureCreateInfo) : base(device) { - var refreshTextureCreateInfo = textureCreateInfo.ToRefreshTextureCreateInfo(); - Handle = Refresh.Refresh_CreateTexture( device.Handle, - ref refreshTextureCreateInfo + textureCreateInfo.ToRefreshTextureCreateInfo() ); Format = textureCreateInfo.Format; @@ -150,7 +148,7 @@ namespace MoonWorks.Graphics Refresh.Refresh_SetTextureData( Device.Handle, - ref textureSlice, + textureSlice, data, dataLengthInBytes ); @@ -162,7 +160,7 @@ namespace MoonWorks.Graphics Refresh.Refresh_SetTextureData( Device.Handle, - ref refreshTextureSlice, + refreshTextureSlice, data, dataLengthInBytes ); diff --git a/src/Graphics/State/DepthStencilState.cs b/src/Graphics/State/DepthStencilState.cs index a1e2790..61d45b1 100644 --- a/src/Graphics/State/DepthStencilState.cs +++ b/src/Graphics/State/DepthStencilState.cs @@ -5,9 +5,9 @@ namespace MoonWorks.Graphics public struct DepthStencilState { public bool DepthTestEnable; - public Refresh.StencilOpState BackStencilState; - public Refresh.StencilOpState FrontStencilState; - public Refresh.CompareOp CompareOp; + public StencilOpState BackStencilState; + public StencilOpState FrontStencilState; + public CompareOp CompareOp; public bool DepthBoundsTestEnable; public bool DepthWriteEnable; public float MinDepthBounds; @@ -20,7 +20,7 @@ namespace MoonWorks.Graphics DepthWriteEnable = true, DepthBoundsTestEnable = false, StencilTestEnable = false, - CompareOp = Refresh.CompareOp.LessOrEqual + CompareOp = CompareOp.LessOrEqual }; public static readonly DepthStencilState DepthRead = new DepthStencilState @@ -29,7 +29,7 @@ namespace MoonWorks.Graphics DepthWriteEnable = false, DepthBoundsTestEnable = false, StencilTestEnable = false, - CompareOp = Refresh.CompareOp.LessOrEqual + CompareOp = CompareOp.LessOrEqual }; public static readonly DepthStencilState Disable = new DepthStencilState diff --git a/src/Graphics/State/RasterizerState.cs b/src/Graphics/State/RasterizerState.cs index ca78d36..b9216f3 100644 --- a/src/Graphics/State/RasterizerState.cs +++ b/src/Graphics/State/RasterizerState.cs @@ -14,7 +14,7 @@ namespace MoonWorks.Graphics public Refresh.FrontFace FrontFace; public float LineWidth; - public static readonly RasterizerState CullClockwise = new RasterizerState + public static readonly RasterizerState CW_CullFront = new RasterizerState { CullMode = Refresh.CullMode.Front, FrontFace = Refresh.FrontFace.Clockwise, @@ -23,7 +23,7 @@ namespace MoonWorks.Graphics LineWidth = 1f }; - public static readonly RasterizerState CullCounterClockwise = new RasterizerState + public static readonly RasterizerState CW_CullBack = new RasterizerState { CullMode = Refresh.CullMode.Back, FrontFace = Refresh.FrontFace.Clockwise, @@ -32,7 +32,7 @@ namespace MoonWorks.Graphics LineWidth = 1f }; - public static readonly RasterizerState CullNone = new RasterizerState + public static readonly RasterizerState CW_CullNone = new RasterizerState { CullMode = Refresh.CullMode.None, FrontFace = Refresh.FrontFace.Clockwise, @@ -41,7 +41,7 @@ namespace MoonWorks.Graphics LineWidth = 1f }; - public static readonly RasterizerState Wireframe = new RasterizerState + public static readonly RasterizerState CW_Wireframe = new RasterizerState { CullMode = Refresh.CullMode.None, FrontFace = Refresh.FrontFace.Clockwise, @@ -49,5 +49,41 @@ namespace MoonWorks.Graphics DepthBiasEnable = false, LineWidth = 1f }; + + public static readonly RasterizerState CCW_CullFront = new RasterizerState + { + CullMode = Refresh.CullMode.Front, + FrontFace = Refresh.FrontFace.CounterClockwise, + FillMode = Refresh.FillMode.Fill, + DepthBiasEnable = false, + LineWidth = 1f + }; + + public static readonly RasterizerState CCW_CullBack = new RasterizerState + { + CullMode = Refresh.CullMode.Back, + FrontFace = Refresh.FrontFace.CounterClockwise, + FillMode = Refresh.FillMode.Fill, + DepthBiasEnable = false, + LineWidth = 1f + }; + + public static readonly RasterizerState CCW_CullNone = new RasterizerState + { + CullMode = Refresh.CullMode.None, + FrontFace = Refresh.FrontFace.CounterClockwise, + FillMode = Refresh.FillMode.Fill, + DepthBiasEnable = false, + LineWidth = 1f + }; + + public static readonly RasterizerState CCW_Wireframe = new RasterizerState + { + CullMode = Refresh.CullMode.None, + FrontFace = Refresh.FrontFace.CounterClockwise, + FillMode = Refresh.FillMode.Fill, + DepthBiasEnable = false, + LineWidth = 1f + }; } }