From 48c31b4908b999de95da2e5bb46aa0cf02861616 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Thu, 24 Feb 2022 15:59:47 -0800 Subject: [PATCH 1/2] render pass streamline --- lib/RefreshCS | 2 +- src/Graphics/CommandBuffer.cs | 326 +++++++++--------- src/Graphics/RefreshStructs.cs | 76 +++- src/Graphics/Resources/Framebuffer.cs | 86 ----- src/Graphics/Resources/GraphicsPipeline.cs | 15 +- src/Graphics/Resources/RenderPass.cs | 59 ---- src/Graphics/Resources/RenderTarget.cs | 3 + .../State/GraphicsPipelineAttachmentInfo.cs | 13 + .../State/GraphicsPipelineCreateInfo.cs | 2 +- src/Graphics/Utility/Conversions.cs | 2 +- 10 files changed, 259 insertions(+), 325 deletions(-) delete mode 100644 src/Graphics/Resources/Framebuffer.cs delete mode 100644 src/Graphics/Resources/RenderPass.cs create mode 100644 src/Graphics/State/GraphicsPipelineAttachmentInfo.cs diff --git a/lib/RefreshCS b/lib/RefreshCS index 1e8abe3..cb949b8 160000 --- a/lib/RefreshCS +++ b/lib/RefreshCS @@ -1 +1 @@ -Subproject commit 1e8abe379a0ccc891ce0f4d90793feac59d30948 +Subproject commit cb949b8205eb2454dd0c9f4c84d41c6647802408 diff --git a/src/Graphics/CommandBuffer.cs b/src/Graphics/CommandBuffer.cs index 3d80531..b424c10 100644 --- a/src/Graphics/CommandBuffer.cs +++ b/src/Graphics/CommandBuffer.cs @@ -27,169 +27,187 @@ namespace MoonWorks.Graphics /// All render state, resource binding, and draw commands must be made within a render pass. /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. /// - /// The render pass object to begin. - /// The framebuffer used by the render pass. + /// The color attachments to use in the render pass. public unsafe void BeginRenderPass( - RenderPass renderPass, - Framebuffer framebuffer + params ColorAttachmentInfo[] colorAttachmentInfos ) { - var renderArea = new Rect +#if DEBUG + if (colorAttachmentInfos.Length == 0) { - X = 0, - Y = 0, - W = (int) framebuffer.Width, - H = (int) framebuffer.Height - }; - - Refresh.Refresh_BeginRenderPass( - Device.Handle, - Handle, - renderPass.Handle, - framebuffer.Handle, - renderArea.ToRefresh(), - IntPtr.Zero, - 0, - IntPtr.Zero - ); - } - - /// - /// Begins a render pass. - /// All render state, resource binding, and draw commands must be made within a render pass. - /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. - /// - /// The render pass object to begin. - /// The framebuffer used by the render pass. - /// The screen area of the render pass. - public unsafe void BeginRenderPass( - RenderPass renderPass, - Framebuffer framebuffer, - in Rect renderArea - ) - { - Refresh.Refresh_BeginRenderPass( - Device.Handle, - Handle, - renderPass.Handle, - framebuffer.Handle, - renderArea.ToRefresh(), - IntPtr.Zero, - 0, - IntPtr.Zero - ); - } - - /// - /// Begins a render pass. - /// All render state, resource binding, and draw commands must be made within a render pass. - /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. - /// - /// The render pass object to begin. - /// The framebuffer used by the render pass. - /// The screen area of the render pass. - /// Color clear values for each render target in the framebuffer. - public unsafe void BeginRenderPass( - RenderPass renderPass, - Framebuffer framebuffer, - in Rect renderArea, - params Vector4[] clearColors - ) - { - Refresh.Vec4* colors = stackalloc Refresh.Vec4[clearColors.Length]; - - for (var i = 0; i < clearColors.Length; i++) - { - colors[i] = new Refresh.Vec4 - { - x = clearColors[i].X, - y = clearColors[i].Y, - z = clearColors[i].Z, - w = clearColors[i].W - }; + Logger.LogError("Render pass must contain at least one attachment!"); + return; } - Refresh.Refresh_BeginRenderPass( - Device.Handle, - Handle, - renderPass.Handle, - framebuffer.Handle, - renderArea.ToRefresh(), - (IntPtr) colors, - (uint) clearColors.Length, - IntPtr.Zero - ); - } - - /// - /// Begins a render pass. - /// All render state, resource binding, and draw commands must be made within a render pass. - /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. - /// - /// The render pass object to begin. - /// The framebuffer used by the render pass. - /// The screen area of the render pass. - /// Clear values for the depth/stencil buffer. This is ignored if the render pass does not clear. - public unsafe void BeginRenderPass( - RenderPass renderPass, - Framebuffer framebuffer, - in Rect renderArea, - in DepthStencilValue depthStencilClearValue - ) - { - Refresh.Refresh_BeginRenderPass( - Device.Handle, - Handle, - renderPass.Handle, - framebuffer.Handle, - renderArea.ToRefresh(), - IntPtr.Zero, - 0, - depthStencilClearValue.ToRefresh() - ); - } - - /// - /// Begins a render pass. - /// All render state, resource binding, and draw commands must be made within a render pass. - /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. - /// - /// The render pass object to begin. - /// The framebuffer used by the render pass. - /// The screen area of the render pass. - /// Clear values for the depth/stencil buffer. This is ignored if the render pass does not clear. - /// Color clear values for each render target in the framebuffer. - public unsafe void BeginRenderPass( - RenderPass renderPass, - Framebuffer framebuffer, - in Rect renderArea, - in DepthStencilValue depthStencilClearValue, - params Vector4[] clearColors - ) - { - Refresh.Vec4* colors = stackalloc Refresh.Vec4[clearColors.Length]; - - for (var i = 0; i < clearColors.Length; i++) + if (colorAttachmentInfos.Length > 4) { - colors[i] = new Refresh.Vec4 - { - x = clearColors[i].X, - y = clearColors[i].Y, - z = clearColors[i].Z, - w = clearColors[i].W - }; + Logger.LogError("Render pass cannot have more than 4 color attachments!"); + return; + } +#endif + + var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; + + for (var i = 0; i < colorAttachmentInfos.Length; i += 1) + { + refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); } - Refresh.Refresh_BeginRenderPass( - Device.Handle, - Handle, - renderPass.Handle, - framebuffer.Handle, - renderArea.ToRefresh(), - (IntPtr) colors, - (uint) clearColors.Length, - depthStencilClearValue.ToRefresh() - ); + fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) + { + Refresh.Refresh_BeginRenderPass( + Device.Handle, + Handle, + colorAttachmentInfos[0].renderTarget.TextureSlice.Rectangle.ToRefresh(), + (IntPtr) pColorAttachmentInfos, + (uint) colorAttachmentInfos.Length, + IntPtr.Zero + ); + } + } + + /// + /// Begins a render pass. + /// All render state, resource binding, and draw commands must be made within a render pass. + /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. + /// + /// The depth stencil attachment to use in the render pass. + /// The color attachments to use in the render pass. + public unsafe void BeginRenderPass( + DepthStencilAttachmentInfo depthStencilAttachmentInfo, + params ColorAttachmentInfo[] colorAttachmentInfos + ) + { +#if DEBUG + if (colorAttachmentInfos.Length == 0) + { + Logger.LogError("Render pass must contain at least one attachment!"); + return; + } + + if (colorAttachmentInfos.Length > 4) + { + Logger.LogError("Render pass cannot have more than 4 color attachments!"); + return; + } +#endif + + var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; + + for (var i = 0; i < colorAttachmentInfos.Length; i += 1) + { + refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); + } + + var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh(); + + fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) + { + Refresh.Refresh_BeginRenderPass( + Device.Handle, + Handle, + colorAttachmentInfos[0].renderTarget.TextureSlice.Rectangle.ToRefresh(), + pColorAttachmentInfos, + (uint) colorAttachmentInfos.Length, + &refreshDepthStencilAttachmentInfo + ); + } + } + + /// + /// Begins a render pass. + /// All render state, resource binding, and draw commands must be made within a render pass. + /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. + /// + /// The rectangle that should be drawn to on the attachments. + /// The color attachments to use in the render pass. + public unsafe void BeginRenderPass( + in Rect renderArea, + params ColorAttachmentInfo[] colorAttachmentInfos + ) + { +#if DEBUG + if (colorAttachmentInfos.Length == 0) + { + Logger.LogError("Render pass must contain at least one attachment!"); + return; + } + + if (colorAttachmentInfos.Length > 4) + { + Logger.LogError("Render pass cannot have more than 4 color attachments!"); + return; + } +#endif + + var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; + + for (var i = 0; i < colorAttachmentInfos.Length; i += 1) + { + refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); + } + + fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) + { + Refresh.Refresh_BeginRenderPass( + Device.Handle, + Handle, + renderArea.ToRefresh(), + (IntPtr) pColorAttachmentInfos, + (uint) colorAttachmentInfos.Length, + IntPtr.Zero + ); + } + } + + /// + /// Begins a render pass. + /// All render state, resource binding, and draw commands must be made within a render pass. + /// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass. + /// + /// The rectangle that should be drawn to on the attachments. + /// The depth stencil attachment to use in the render pass. + /// The color attachments to use in the render pass. + public unsafe void BeginRenderPass( + in Rect renderArea, + DepthStencilAttachmentInfo depthStencilAttachmentInfo, + params ColorAttachmentInfo[] colorAttachmentInfos + ) + { +#if DEBUG + if (colorAttachmentInfos.Length == 0) + { + Logger.LogError("Render pass must contain at least one attachment!"); + return; + } + + if (colorAttachmentInfos.Length > 4) + { + Logger.LogError("Render pass cannot have more than 4 color attachments!"); + return; + } +#endif + + var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length]; + + for (var i = 0; i < colorAttachmentInfos.Length; i += 1) + { + refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh(); + } + + var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh(); + + fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos) + { + Refresh.Refresh_BeginRenderPass( + Device.Handle, + Handle, + renderArea.ToRefresh(), + pColorAttachmentInfos, + (uint) colorAttachmentInfos.Length, + &refreshDepthStencilAttachmentInfo + ); + } } /// diff --git a/src/Graphics/RefreshStructs.cs b/src/Graphics/RefreshStructs.cs index 890bff1..e1ab2a9 100644 --- a/src/Graphics/RefreshStructs.cs +++ b/src/Graphics/RefreshStructs.cs @@ -72,25 +72,6 @@ namespace MoonWorks.Graphics public uint Offset; } - [StructLayout(LayoutKind.Sequential)] - public struct ColorTargetDescription - { - public TextureFormat Format; - public SampleCount MultisampleCount; - public LoadOp LoadOp; - public StoreOp StoreOp; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DepthStencilTargetDescription - { - public TextureFormat Format; - public LoadOp LoadOp; - public StoreOp StoreOp; - public LoadOp StencilLoadOp; - public StoreOp StencilStoreOp; - } - [StructLayout(LayoutKind.Sequential)] public struct StencilOpState { @@ -117,4 +98,61 @@ namespace MoonWorks.Graphics }; } } + + [StructLayout(LayoutKind.Sequential)] + public struct ColorAttachmentInfo + { + public RenderTarget renderTarget; + public Color clearColor; + public LoadOp loadOp; + public StoreOp storeOp; + + public Refresh.ColorAttachmentInfo ToRefresh() + { + return new Refresh.ColorAttachmentInfo + { + renderTarget = renderTarget.Handle, + clearColor = new Refresh.Vec4 + { + x = clearColor.R, + y = clearColor.G, + z = clearColor.B, + w = clearColor.A + }, + loadOp = (Refresh.LoadOp) loadOp, + storeOp = (Refresh.StoreOp) storeOp + }; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct DepthStencilAttachmentInfo + { + public RenderTarget depthStencilTarget; + public DepthStencilValue depthStencilValue; + public LoadOp loadOp; + public StoreOp storeOp; + public LoadOp stencilLoadOp; + public StoreOp stencilStoreOp; + + public Refresh.DepthStencilAttachmentInfo ToRefresh() + { + return new Refresh.DepthStencilAttachmentInfo + { + depthStencilTarget = depthStencilTarget.Handle, + depthStencilValue = depthStencilValue.ToRefresh(), + loadOp = (Refresh.LoadOp) loadOp, + storeOp = (Refresh.StoreOp) storeOp, + stencilLoadOp = (Refresh.LoadOp) stencilLoadOp, + stencilStoreOp = (Refresh.StoreOp) stencilStoreOp + }; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct ColorAttachmentDescription + { + public TextureFormat format; + public SampleCount sampleCount; + } } diff --git a/src/Graphics/Resources/Framebuffer.cs b/src/Graphics/Resources/Framebuffer.cs deleted file mode 100644 index 223ee9c..0000000 --- a/src/Graphics/Resources/Framebuffer.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using RefreshCS; - -namespace MoonWorks.Graphics -{ - /// - /// A framebuffer is a collection of render targets that is rendered to during a render pass. - /// - public class Framebuffer : GraphicsResource - { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyFramebuffer; - - public RenderTarget DepthStencilTarget { get; } - - private RenderTarget[] colorTargets { get; } - public IEnumerable ColorTargets => colorTargets; - - public RenderPass RenderPass { get; } - public uint Width { get; } - public uint Height { get; } - - /// - /// Creates a framebuffer. - /// - /// An initialized GraphicsDevice. - /// The width of the framebuffer. - /// The height of the framebuffer. - /// The reference render pass for the framebuffer. - /// The depth stencil target. Can be null. - /// Anywhere from 0-4 color targets can be provided. - public unsafe Framebuffer( - GraphicsDevice device, - uint width, - uint height, - RenderPass renderPass, - RenderTarget depthStencilTarget, - params RenderTarget[] colorTargets - ) : base(device) - { - IntPtr[] colorTargetHandles = new IntPtr[colorTargets.Length]; - for (var i = 0; i < colorTargets.Length; i += 1) - { - colorTargetHandles[i] = colorTargets[i].Handle; - } - - IntPtr depthStencilTargetHandle; - if (depthStencilTarget == null) - { - depthStencilTargetHandle = IntPtr.Zero; - } - else - { - depthStencilTargetHandle = depthStencilTarget.Handle; - } - - fixed (IntPtr* colorTargetHandlesPtr = colorTargetHandles) - { - Refresh.FramebufferCreateInfo framebufferCreateInfo = new Refresh.FramebufferCreateInfo - { - width = width, - height = height, - colorTargetCount = (uint) colorTargets.Length, - pColorTargets = (IntPtr) colorTargetHandlesPtr, - depthStencilTarget = depthStencilTargetHandle, - renderPass = renderPass.Handle - }; - - Handle = Refresh.Refresh_CreateFramebuffer(device.Handle, framebufferCreateInfo); - } - - DepthStencilTarget = depthStencilTarget; - - this.colorTargets = new RenderTarget[colorTargets.Length]; - for (var i = 0; i < colorTargets.Length; i++) - { - this.colorTargets[i] = colorTargets[i]; - } - - RenderPass = renderPass; - - Width = width; - Height = height; - } - } -} diff --git a/src/Graphics/Resources/GraphicsPipeline.cs b/src/Graphics/Resources/GraphicsPipeline.cs index af0d67e..65a3b9a 100644 --- a/src/Graphics/Resources/GraphicsPipeline.cs +++ b/src/Graphics/Resources/GraphicsPipeline.cs @@ -14,7 +14,6 @@ namespace MoonWorks.Graphics public ShaderStageState VertexShaderState { get; } public ShaderStageState FragmentShaderState { get; } - public RenderPass RenderPass { get; } public unsafe GraphicsPipeline( GraphicsDevice device, @@ -31,7 +30,7 @@ namespace MoonWorks.Graphics PrimitiveType primitiveType = graphicsPipelineCreateInfo.PrimitiveType; VertexInputState vertexInputState = graphicsPipelineCreateInfo.VertexInputState; ViewportState viewportState = graphicsPipelineCreateInfo.ViewportState; - RenderPass renderPass = graphicsPipelineCreateInfo.RenderPass; + GraphicsPipelineAttachmentInfo attachmentInfo = graphicsPipelineCreateInfo.AttachmentInfo; var vertexAttributesHandle = GCHandle.Alloc( vertexInputState.VertexAttributes, @@ -49,6 +48,10 @@ namespace MoonWorks.Graphics viewportState.Scissors, GCHandleType.Pinned ); + var colorAttachmentDescriptionsHandle = GCHandle.Alloc( + attachmentInfo.colorAttachmentDescriptions, + GCHandleType.Pinned + ); var colorTargetBlendStates = stackalloc Refresh.ColorTargetBlendState[ colorBlendState.ColorTargetBlendStates.Length @@ -115,7 +118,11 @@ namespace MoonWorks.Graphics refreshGraphicsPipelineCreateInfo.viewportState.scissorCount = (uint) viewportState.Scissors.Length; refreshGraphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType; - refreshGraphicsPipelineCreateInfo.renderPass = renderPass.Handle; + + refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentCount = attachmentInfo.colorAttachmentCount; + refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentDescriptions = colorAttachmentDescriptionsHandle.AddrOfPinnedObject(); + refreshGraphicsPipelineCreateInfo.attachmentInfo.depthStencilFormat = (Refresh.TextureFormat) attachmentInfo.depthStencilFormat; + refreshGraphicsPipelineCreateInfo.attachmentInfo.hasDepthStencilAttachment = Conversions.BoolToByte(attachmentInfo.hasDepthStencilAttachment); Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, refreshGraphicsPipelineCreateInfo); @@ -123,10 +130,10 @@ namespace MoonWorks.Graphics vertexBindingsHandle.Free(); viewportHandle.Free(); scissorHandle.Free(); + colorAttachmentDescriptionsHandle.Free(); VertexShaderState = vertexShaderState; FragmentShaderState = fragmentShaderState; - RenderPass = renderPass; } } } diff --git a/src/Graphics/Resources/RenderPass.cs b/src/Graphics/Resources/RenderPass.cs deleted file mode 100644 index 37cebef..0000000 --- a/src/Graphics/Resources/RenderPass.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using RefreshCS; - -namespace MoonWorks.Graphics -{ - /// - /// A render pass describes the kind of render targets that will be used in rendering. - /// - public class RenderPass : GraphicsResource - { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderPass; - - /// - /// Creates a render pass using color target descriptions. - /// - /// An initialized GraphicsDevice. - /// Up to 4 color target descriptions may be provided. - public unsafe RenderPass( - GraphicsDevice device, - params ColorTargetDescription[] colorTargetDescriptions - ) : base(device) - { - fixed (ColorTargetDescription* ptr = colorTargetDescriptions) - { - Refresh.RenderPassCreateInfo renderPassCreateInfo; - renderPassCreateInfo.colorTargetCount = (uint) colorTargetDescriptions.Length; - renderPassCreateInfo.colorTargetDescriptions = (IntPtr) ptr; - renderPassCreateInfo.depthStencilTargetDescription = IntPtr.Zero; - - Handle = Refresh.Refresh_CreateRenderPass(device.Handle, renderPassCreateInfo); - } - } - - /// - /// Creates a render pass using a depth/stencil target description and optional color target descriptions. - /// - /// An initialized GraphicsDevice. - /// A depth/stencil target description. - /// Up to 4 color target descriptions may be provided. - public unsafe RenderPass( - GraphicsDevice device, - in DepthStencilTargetDescription depthStencilTargetDescription, - params ColorTargetDescription[] colorTargetDescriptions - ) : base(device) - { - - fixed (DepthStencilTargetDescription* depthStencilPtr = &depthStencilTargetDescription) - fixed (ColorTargetDescription* colorPtr = colorTargetDescriptions) - { - Refresh.RenderPassCreateInfo renderPassCreateInfo; - renderPassCreateInfo.colorTargetCount = (uint) colorTargetDescriptions.Length; - renderPassCreateInfo.colorTargetDescriptions = (IntPtr) colorPtr; - renderPassCreateInfo.depthStencilTargetDescription = (IntPtr) depthStencilPtr; - - Handle = Refresh.Refresh_CreateRenderPass(device.Handle, renderPassCreateInfo); - } - } - } -} diff --git a/src/Graphics/Resources/RenderTarget.cs b/src/Graphics/Resources/RenderTarget.cs index ca84c1a..06964c1 100644 --- a/src/Graphics/Resources/RenderTarget.cs +++ b/src/Graphics/Resources/RenderTarget.cs @@ -11,6 +11,9 @@ namespace MoonWorks.Graphics public TextureSlice TextureSlice { get; } public TextureFormat Format => TextureSlice.Texture.Format; + public uint Width => (uint) TextureSlice.Rectangle.W; + public uint Height => (uint) TextureSlice.Rectangle.H; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget; /// diff --git a/src/Graphics/State/GraphicsPipelineAttachmentInfo.cs b/src/Graphics/State/GraphicsPipelineAttachmentInfo.cs new file mode 100644 index 0000000..b45845f --- /dev/null +++ b/src/Graphics/State/GraphicsPipelineAttachmentInfo.cs @@ -0,0 +1,13 @@ +namespace MoonWorks.Graphics +{ + /// + /// Describes the kind of attachments that will be used with this pipeline. + /// + public struct GraphicsPipelineAttachmentInfo + { + public ColorAttachmentDescription[] colorAttachmentDescriptions; + public uint colorAttachmentCount; + public bool hasDepthStencilAttachment; + public TextureFormat depthStencilFormat; + } +} diff --git a/src/Graphics/State/GraphicsPipelineCreateInfo.cs b/src/Graphics/State/GraphicsPipelineCreateInfo.cs index 67c0b7d..f5b6436 100644 --- a/src/Graphics/State/GraphicsPipelineCreateInfo.cs +++ b/src/Graphics/State/GraphicsPipelineCreateInfo.cs @@ -12,6 +12,6 @@ public PrimitiveType PrimitiveType; public VertexInputState VertexInputState; public ViewportState ViewportState; - public RenderPass RenderPass; + public GraphicsPipelineAttachmentInfo AttachmentInfo; } } diff --git a/src/Graphics/Utility/Conversions.cs b/src/Graphics/Utility/Conversions.cs index aaadd6c..5d05be9 100644 --- a/src/Graphics/Utility/Conversions.cs +++ b/src/Graphics/Utility/Conversions.cs @@ -9,7 +9,7 @@ public static bool ByteToBool(byte b) { - return b == 0 ? false : true; + return b != 0; } } } -- 2.25.1 From b8b10140a95457a00d658e84d4b67b926f467b15 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Thu, 24 Feb 2022 21:31:32 -0800 Subject: [PATCH 2/2] fix graphics pipeline creation --- src/Graphics/Resources/GraphicsPipeline.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Graphics/Resources/GraphicsPipeline.cs b/src/Graphics/Resources/GraphicsPipeline.cs index 65a3b9a..e293229 100644 --- a/src/Graphics/Resources/GraphicsPipeline.cs +++ b/src/Graphics/Resources/GraphicsPipeline.cs @@ -48,10 +48,6 @@ namespace MoonWorks.Graphics viewportState.Scissors, GCHandleType.Pinned ); - var colorAttachmentDescriptionsHandle = GCHandle.Alloc( - attachmentInfo.colorAttachmentDescriptions, - GCHandleType.Pinned - ); var colorTargetBlendStates = stackalloc Refresh.ColorTargetBlendState[ colorBlendState.ColorTargetBlendStates.Length @@ -62,6 +58,16 @@ namespace MoonWorks.Graphics colorTargetBlendStates[i] = colorBlendState.ColorTargetBlendStates[i].ToRefreshColorTargetBlendState(); } + var colorAttachmentDescriptions = stackalloc Refresh.ColorAttachmentDescription[ + (int) attachmentInfo.colorAttachmentCount + ]; + + for (var i = 0; i < attachmentInfo.colorAttachmentCount; i += 1) + { + colorAttachmentDescriptions[i].format = (Refresh.TextureFormat) attachmentInfo.colorAttachmentDescriptions[i].format; + colorAttachmentDescriptions[i].sampleCount = (Refresh.SampleCount) attachmentInfo.colorAttachmentDescriptions[i].sampleCount; + } + Refresh.GraphicsPipelineCreateInfo refreshGraphicsPipelineCreateInfo; refreshGraphicsPipelineCreateInfo.colorBlendState.logicOpEnable = Conversions.BoolToByte(colorBlendState.LogicOpEnable); @@ -120,7 +126,7 @@ namespace MoonWorks.Graphics refreshGraphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType; refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentCount = attachmentInfo.colorAttachmentCount; - refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentDescriptions = colorAttachmentDescriptionsHandle.AddrOfPinnedObject(); + refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentDescriptions = (IntPtr) colorAttachmentDescriptions; refreshGraphicsPipelineCreateInfo.attachmentInfo.depthStencilFormat = (Refresh.TextureFormat) attachmentInfo.depthStencilFormat; refreshGraphicsPipelineCreateInfo.attachmentInfo.hasDepthStencilAttachment = Conversions.BoolToByte(attachmentInfo.hasDepthStencilAttachment); @@ -130,7 +136,6 @@ namespace MoonWorks.Graphics vertexBindingsHandle.Free(); viewportHandle.Free(); scissorHandle.Free(); - colorAttachmentDescriptionsHandle.Free(); VertexShaderState = vertexShaderState; FragmentShaderState = fragmentShaderState; -- 2.25.1