diff --git a/src/Graphics/Resources/GraphicsPipeline.cs b/src/Graphics/Resources/GraphicsPipeline.cs index 44d867f..d7a2c69 100644 --- a/src/Graphics/Resources/GraphicsPipeline.cs +++ b/src/Graphics/Resources/GraphicsPipeline.cs @@ -14,90 +14,106 @@ namespace MoonWorks.Graphics public unsafe GraphicsPipeline( GraphicsDevice device, - ColorBlendState colorBlendState, - DepthStencilState depthStencilState, - ShaderStageState vertexShaderState, - ShaderStageState fragmentShaderState, - MultisampleState multisampleState, - GraphicsPipelineLayoutCreateInfo pipelineLayoutCreateInfo, - RasterizerState rasterizerState, - PrimitiveType primitiveType, - VertexInputState vertexInputState, - ViewportState viewportState, - RenderPass renderPass + GraphicsPipelineCreateInfo graphicsPipelineCreateInfo ) : base(device) { - var vertexAttributesHandle = GCHandle.Alloc(vertexInputState.VertexAttributes, GCHandleType.Pinned); - var vertexBindingsHandle = GCHandle.Alloc(vertexInputState.VertexBindings, GCHandleType.Pinned); - var viewportHandle = GCHandle.Alloc(viewportState.Viewports, GCHandleType.Pinned); - var scissorHandle = GCHandle.Alloc(viewportState.Scissors, GCHandleType.Pinned); + ColorBlendState colorBlendState = graphicsPipelineCreateInfo.ColorBlendState; + DepthStencilState depthStencilState = graphicsPipelineCreateInfo.DepthStencilState; + ShaderStageState vertexShaderState = graphicsPipelineCreateInfo.VertexShaderState; + ShaderStageState fragmentShaderState = graphicsPipelineCreateInfo.FragmentShaderState; + MultisampleState multisampleState = graphicsPipelineCreateInfo.MultisampleState; + GraphicsPipelineLayoutInfo pipelineLayoutInfo = graphicsPipelineCreateInfo.PipelineLayoutInfo; + RasterizerState rasterizerState = graphicsPipelineCreateInfo.RasterizerState; + PrimitiveType primitiveType = graphicsPipelineCreateInfo.PrimitiveType; + VertexInputState vertexInputState = graphicsPipelineCreateInfo.VertexInputState; + ViewportState viewportState = graphicsPipelineCreateInfo.ViewportState; + RenderPass renderPass = graphicsPipelineCreateInfo.RenderPass; - var colorTargetBlendStates = stackalloc Refresh.ColorTargetBlendState[colorBlendState.ColorTargetBlendStates.Length]; + var vertexAttributesHandle = GCHandle.Alloc( + vertexInputState.VertexAttributes, + GCHandleType.Pinned + ); + var vertexBindingsHandle = GCHandle.Alloc( + vertexInputState.VertexBindings, + GCHandleType.Pinned + ); + var viewportHandle = GCHandle.Alloc( + viewportState.Viewports, + GCHandleType.Pinned + ); + var scissorHandle = GCHandle.Alloc( + viewportState.Scissors, + GCHandleType.Pinned + ); + + var colorTargetBlendStates = stackalloc Refresh.ColorTargetBlendState[ + colorBlendState.ColorTargetBlendStates.Length + ]; for (var i = 0; i < colorBlendState.ColorTargetBlendStates.Length; i += 1) { colorTargetBlendStates[i] = colorBlendState.ColorTargetBlendStates[i].ToRefreshColorTargetBlendState(); } - Refresh.GraphicsPipelineCreateInfo graphicsPipelineCreateInfo; + Refresh.GraphicsPipelineCreateInfo refreshGraphicsPipelineCreateInfo; - graphicsPipelineCreateInfo.colorBlendState.logicOpEnable = Conversions.BoolToByte(colorBlendState.LogicOpEnable); - graphicsPipelineCreateInfo.colorBlendState.logicOp = (Refresh.LogicOp) colorBlendState.LogicOp; - graphicsPipelineCreateInfo.colorBlendState.blendStates = (IntPtr) colorTargetBlendStates; - graphicsPipelineCreateInfo.colorBlendState.blendStateCount = (uint) colorBlendState.ColorTargetBlendStates.Length; - graphicsPipelineCreateInfo.colorBlendState.blendConstants[0] = colorBlendState.BlendConstants.R; - graphicsPipelineCreateInfo.colorBlendState.blendConstants[1] = colorBlendState.BlendConstants.G; - graphicsPipelineCreateInfo.colorBlendState.blendConstants[2] = colorBlendState.BlendConstants.B; - graphicsPipelineCreateInfo.colorBlendState.blendConstants[3] = colorBlendState.BlendConstants.A; + refreshGraphicsPipelineCreateInfo.colorBlendState.logicOpEnable = Conversions.BoolToByte(colorBlendState.LogicOpEnable); + refreshGraphicsPipelineCreateInfo.colorBlendState.logicOp = (Refresh.LogicOp) colorBlendState.LogicOp; + refreshGraphicsPipelineCreateInfo.colorBlendState.blendStates = (IntPtr) colorTargetBlendStates; + refreshGraphicsPipelineCreateInfo.colorBlendState.blendStateCount = (uint) colorBlendState.ColorTargetBlendStates.Length; + refreshGraphicsPipelineCreateInfo.colorBlendState.blendConstants[0] = colorBlendState.BlendConstants.R; + refreshGraphicsPipelineCreateInfo.colorBlendState.blendConstants[1] = colorBlendState.BlendConstants.G; + refreshGraphicsPipelineCreateInfo.colorBlendState.blendConstants[2] = colorBlendState.BlendConstants.B; + refreshGraphicsPipelineCreateInfo.colorBlendState.blendConstants[3] = colorBlendState.BlendConstants.A; - 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.ToRefresh(); - graphicsPipelineCreateInfo.depthStencilState.maxDepthBounds = depthStencilState.MaxDepthBounds; - graphicsPipelineCreateInfo.depthStencilState.minDepthBounds = depthStencilState.MinDepthBounds; - graphicsPipelineCreateInfo.depthStencilState.stencilTestEnable = Conversions.BoolToByte(depthStencilState.StencilTestEnable); + refreshGraphicsPipelineCreateInfo.depthStencilState.backStencilState = depthStencilState.BackStencilState.ToRefresh(); + refreshGraphicsPipelineCreateInfo.depthStencilState.compareOp = (Refresh.CompareOp) depthStencilState.CompareOp; + refreshGraphicsPipelineCreateInfo.depthStencilState.depthBoundsTestEnable = Conversions.BoolToByte(depthStencilState.DepthBoundsTestEnable); + refreshGraphicsPipelineCreateInfo.depthStencilState.depthTestEnable = Conversions.BoolToByte(depthStencilState.DepthTestEnable); + refreshGraphicsPipelineCreateInfo.depthStencilState.depthWriteEnable = Conversions.BoolToByte(depthStencilState.DepthWriteEnable); + refreshGraphicsPipelineCreateInfo.depthStencilState.frontStencilState = depthStencilState.FrontStencilState.ToRefresh(); + refreshGraphicsPipelineCreateInfo.depthStencilState.maxDepthBounds = depthStencilState.MaxDepthBounds; + refreshGraphicsPipelineCreateInfo.depthStencilState.minDepthBounds = depthStencilState.MinDepthBounds; + refreshGraphicsPipelineCreateInfo.depthStencilState.stencilTestEnable = Conversions.BoolToByte(depthStencilState.StencilTestEnable); - graphicsPipelineCreateInfo.vertexShaderState.entryPointName = vertexShaderState.EntryPointName; - graphicsPipelineCreateInfo.vertexShaderState.shaderModule = vertexShaderState.ShaderModule.Handle; - graphicsPipelineCreateInfo.vertexShaderState.uniformBufferSize = vertexShaderState.UniformBufferSize; + refreshGraphicsPipelineCreateInfo.vertexShaderState.entryPointName = vertexShaderState.EntryPointName; + refreshGraphicsPipelineCreateInfo.vertexShaderState.shaderModule = vertexShaderState.ShaderModule.Handle; + refreshGraphicsPipelineCreateInfo.vertexShaderState.uniformBufferSize = vertexShaderState.UniformBufferSize; - graphicsPipelineCreateInfo.fragmentShaderState.entryPointName = fragmentShaderState.EntryPointName; - graphicsPipelineCreateInfo.fragmentShaderState.shaderModule = fragmentShaderState.ShaderModule.Handle; - graphicsPipelineCreateInfo.fragmentShaderState.uniformBufferSize = fragmentShaderState.UniformBufferSize; + refreshGraphicsPipelineCreateInfo.fragmentShaderState.entryPointName = fragmentShaderState.EntryPointName; + refreshGraphicsPipelineCreateInfo.fragmentShaderState.shaderModule = fragmentShaderState.ShaderModule.Handle; + refreshGraphicsPipelineCreateInfo.fragmentShaderState.uniformBufferSize = fragmentShaderState.UniformBufferSize; - graphicsPipelineCreateInfo.multisampleState.multisampleCount = (Refresh.SampleCount)multisampleState.MultisampleCount; - graphicsPipelineCreateInfo.multisampleState.sampleMask = multisampleState.SampleMask; + refreshGraphicsPipelineCreateInfo.multisampleState.multisampleCount = (Refresh.SampleCount)multisampleState.MultisampleCount; + refreshGraphicsPipelineCreateInfo.multisampleState.sampleMask = multisampleState.SampleMask; - graphicsPipelineCreateInfo.pipelineLayoutCreateInfo.vertexSamplerBindingCount = pipelineLayoutCreateInfo.VertexSamplerBindingCount; - graphicsPipelineCreateInfo.pipelineLayoutCreateInfo.fragmentSamplerBindingCount = pipelineLayoutCreateInfo.FragmentSamplerBindingCount; + refreshGraphicsPipelineCreateInfo.pipelineLayoutCreateInfo.vertexSamplerBindingCount = pipelineLayoutInfo.VertexSamplerBindingCount; + refreshGraphicsPipelineCreateInfo.pipelineLayoutCreateInfo.fragmentSamplerBindingCount = pipelineLayoutInfo.FragmentSamplerBindingCount; - graphicsPipelineCreateInfo.rasterizerState.cullMode = (Refresh.CullMode)rasterizerState.CullMode; - graphicsPipelineCreateInfo.rasterizerState.depthBiasClamp = rasterizerState.DepthBiasClamp; - graphicsPipelineCreateInfo.rasterizerState.depthBiasConstantFactor = rasterizerState.DepthBiasConstantFactor; - graphicsPipelineCreateInfo.rasterizerState.depthBiasEnable = Conversions.BoolToByte(rasterizerState.DepthBiasEnable); - graphicsPipelineCreateInfo.rasterizerState.depthBiasSlopeFactor = rasterizerState.DepthBiasSlopeFactor; - graphicsPipelineCreateInfo.rasterizerState.depthClampEnable = Conversions.BoolToByte(rasterizerState.DepthClampEnable); - graphicsPipelineCreateInfo.rasterizerState.fillMode = (Refresh.FillMode)rasterizerState.FillMode; - graphicsPipelineCreateInfo.rasterizerState.frontFace = (Refresh.FrontFace)rasterizerState.FrontFace; - graphicsPipelineCreateInfo.rasterizerState.lineWidth = rasterizerState.LineWidth; + refreshGraphicsPipelineCreateInfo.rasterizerState.cullMode = (Refresh.CullMode)rasterizerState.CullMode; + refreshGraphicsPipelineCreateInfo.rasterizerState.depthBiasClamp = rasterizerState.DepthBiasClamp; + refreshGraphicsPipelineCreateInfo.rasterizerState.depthBiasConstantFactor = rasterizerState.DepthBiasConstantFactor; + refreshGraphicsPipelineCreateInfo.rasterizerState.depthBiasEnable = Conversions.BoolToByte(rasterizerState.DepthBiasEnable); + refreshGraphicsPipelineCreateInfo.rasterizerState.depthBiasSlopeFactor = rasterizerState.DepthBiasSlopeFactor; + refreshGraphicsPipelineCreateInfo.rasterizerState.depthClampEnable = Conversions.BoolToByte(rasterizerState.DepthClampEnable); + refreshGraphicsPipelineCreateInfo.rasterizerState.fillMode = (Refresh.FillMode)rasterizerState.FillMode; + refreshGraphicsPipelineCreateInfo.rasterizerState.frontFace = (Refresh.FrontFace)rasterizerState.FrontFace; + refreshGraphicsPipelineCreateInfo.rasterizerState.lineWidth = rasterizerState.LineWidth; - graphicsPipelineCreateInfo.vertexInputState.vertexAttributes = vertexAttributesHandle.AddrOfPinnedObject(); - graphicsPipelineCreateInfo.vertexInputState.vertexAttributeCount = (uint) vertexInputState.VertexAttributes.Length; - graphicsPipelineCreateInfo.vertexInputState.vertexBindings = vertexBindingsHandle.AddrOfPinnedObject(); - graphicsPipelineCreateInfo.vertexInputState.vertexBindingCount = (uint) vertexInputState.VertexBindings.Length; + refreshGraphicsPipelineCreateInfo.vertexInputState.vertexAttributes = vertexAttributesHandle.AddrOfPinnedObject(); + refreshGraphicsPipelineCreateInfo.vertexInputState.vertexAttributeCount = (uint) vertexInputState.VertexAttributes.Length; + refreshGraphicsPipelineCreateInfo.vertexInputState.vertexBindings = vertexBindingsHandle.AddrOfPinnedObject(); + refreshGraphicsPipelineCreateInfo.vertexInputState.vertexBindingCount = (uint) vertexInputState.VertexBindings.Length; - graphicsPipelineCreateInfo.viewportState.viewports = viewportHandle.AddrOfPinnedObject(); - graphicsPipelineCreateInfo.viewportState.viewportCount = (uint) viewportState.Viewports.Length; - graphicsPipelineCreateInfo.viewportState.scissors = scissorHandle.AddrOfPinnedObject(); - graphicsPipelineCreateInfo.viewportState.scissorCount = (uint) viewportState.Scissors.Length; + refreshGraphicsPipelineCreateInfo.viewportState.viewports = viewportHandle.AddrOfPinnedObject(); + refreshGraphicsPipelineCreateInfo.viewportState.viewportCount = (uint) viewportState.Viewports.Length; + refreshGraphicsPipelineCreateInfo.viewportState.scissors = scissorHandle.AddrOfPinnedObject(); + refreshGraphicsPipelineCreateInfo.viewportState.scissorCount = (uint) viewportState.Scissors.Length; - graphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType; - graphicsPipelineCreateInfo.renderPass = renderPass.Handle; + refreshGraphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType; + refreshGraphicsPipelineCreateInfo.renderPass = renderPass.Handle; - Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, graphicsPipelineCreateInfo); + Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, refreshGraphicsPipelineCreateInfo); vertexAttributesHandle.Free(); vertexBindingsHandle.Free(); diff --git a/src/Graphics/Resources/Sampler.cs b/src/Graphics/Resources/Sampler.cs index ea7fea5..7a99bd3 100644 --- a/src/Graphics/Resources/Sampler.cs +++ b/src/Graphics/Resources/Sampler.cs @@ -9,12 +9,12 @@ namespace MoonWorks.Graphics public Sampler( GraphicsDevice device, - in SamplerState samplerState + in SamplerCreateInfo samplerCreateInfo ) : base(device) { Handle = Refresh.Refresh_CreateSampler( device.Handle, - samplerState.ToRefreshSamplerStateCreateInfo() + samplerCreateInfo.ToRefreshSamplerStateCreateInfo() ); } } diff --git a/src/Graphics/State/GraphicsPipelineCreateInfo.cs b/src/Graphics/State/GraphicsPipelineCreateInfo.cs new file mode 100644 index 0000000..68178b2 --- /dev/null +++ b/src/Graphics/State/GraphicsPipelineCreateInfo.cs @@ -0,0 +1,17 @@ +namespace MoonWorks.Graphics +{ + public struct GraphicsPipelineCreateInfo + { + public ColorBlendState ColorBlendState; + public DepthStencilState DepthStencilState; + public ShaderStageState VertexShaderState; + public ShaderStageState FragmentShaderState; + public MultisampleState MultisampleState; + public GraphicsPipelineLayoutInfo PipelineLayoutInfo; + public RasterizerState RasterizerState; + public PrimitiveType PrimitiveType; + public VertexInputState VertexInputState; + public ViewportState ViewportState; + public RenderPass RenderPass; + } +} diff --git a/src/Graphics/State/GraphicsPipelineLayoutCreateInfo.cs b/src/Graphics/State/GraphicsPipelineLayoutInfo.cs similarity index 73% rename from src/Graphics/State/GraphicsPipelineLayoutCreateInfo.cs rename to src/Graphics/State/GraphicsPipelineLayoutInfo.cs index 4ff9364..405c475 100644 --- a/src/Graphics/State/GraphicsPipelineLayoutCreateInfo.cs +++ b/src/Graphics/State/GraphicsPipelineLayoutInfo.cs @@ -1,6 +1,6 @@ namespace MoonWorks.Graphics { - public struct GraphicsPipelineLayoutCreateInfo + public struct GraphicsPipelineLayoutInfo { public uint VertexSamplerBindingCount; public uint FragmentSamplerBindingCount; diff --git a/src/Graphics/State/SamplerState.cs b/src/Graphics/State/SamplerCreateInfo.cs similarity index 89% rename from src/Graphics/State/SamplerState.cs rename to src/Graphics/State/SamplerCreateInfo.cs index bce25a1..6e5831b 100644 --- a/src/Graphics/State/SamplerState.cs +++ b/src/Graphics/State/SamplerCreateInfo.cs @@ -2,7 +2,7 @@ namespace MoonWorks.Graphics { - public struct SamplerState + public struct SamplerCreateInfo { public Filter MinFilter; public Filter MagFilter; @@ -19,7 +19,7 @@ namespace MoonWorks.Graphics public float MaxLod; public BorderColor BorderColor; - public static readonly SamplerState AnisotropicClamp = new SamplerState + public static readonly SamplerCreateInfo AnisotropicClamp = new SamplerCreateInfo { MinFilter = Filter.Linear, MagFilter = Filter.Linear, @@ -35,7 +35,7 @@ namespace MoonWorks.Graphics MaxLod = 1000 /* VK_LOD_CLAMP_NONE */ }; - public static readonly SamplerState AnisotropicWrap = new SamplerState + public static readonly SamplerCreateInfo AnisotropicWrap = new SamplerCreateInfo { MinFilter = Filter.Linear, MagFilter = Filter.Linear, @@ -51,7 +51,7 @@ namespace MoonWorks.Graphics MaxLod = 1000 /* VK_LOD_CLAMP_NONE */ }; - public static readonly SamplerState LinearClamp = new SamplerState + public static readonly SamplerCreateInfo LinearClamp = new SamplerCreateInfo { MinFilter = Filter.Linear, MagFilter = Filter.Linear, @@ -66,7 +66,7 @@ namespace MoonWorks.Graphics MaxLod = 1000 }; - public static readonly SamplerState LinearWrap = new SamplerState + public static readonly SamplerCreateInfo LinearWrap = new SamplerCreateInfo { MinFilter = Filter.Linear, MagFilter = Filter.Linear, @@ -81,7 +81,7 @@ namespace MoonWorks.Graphics MaxLod = 1000 }; - public static readonly SamplerState PointClamp = new SamplerState + public static readonly SamplerCreateInfo PointClamp = new SamplerCreateInfo { MinFilter = Filter.Nearest, MagFilter = Filter.Nearest, @@ -96,7 +96,7 @@ namespace MoonWorks.Graphics MaxLod = 1000 }; - public static readonly SamplerState PointWrap = new SamplerState + public static readonly SamplerCreateInfo PointWrap = new SamplerCreateInfo { MinFilter = Filter.Nearest, MagFilter = Filter.Nearest, diff --git a/src/Graphics/TextureSlice.cs b/src/Graphics/TextureSlice.cs index b3b2a1b..7263d66 100644 --- a/src/Graphics/TextureSlice.cs +++ b/src/Graphics/TextureSlice.cs @@ -15,10 +15,10 @@ namespace MoonWorks.Graphics Texture = texture; Rectangle = new Rect { - x = 0, - y = 0, - w = (int) texture.Width, - h = (int) texture.Height + X = 0, + Y = 0, + W = (int) texture.Width, + H = (int) texture.Height }; Depth = 0; Layer = 0;