render pass pipeline format validation

pull/35/head
cosmonaut 2022-11-17 12:32:48 -08:00
parent 4d7294f8e0
commit e94a678ea9
2 changed files with 118 additions and 2 deletions

View File

@ -12,21 +12,35 @@ namespace MoonWorks.Graphics
public GraphicsDevice Device { get; }
public IntPtr Handle { get; }
// some state for debug validation
#if DEBUG
GraphicsPipeline currentGraphicsPipeline;
ComputePipeline currentComputePipeline;
bool renderPassActive;
SampleCount currentSampleCount;
TextureFormat colorFormatOne;
TextureFormat colorFormatTwo;
TextureFormat colorFormatThree;
TextureFormat colorFormatFour;
TextureFormat depthStencilFormat;
#endif
// called from RefreshDevice
internal CommandBuffer(GraphicsDevice device, IntPtr handle)
{
Device = device;
Handle = handle;
#if DEBUG
currentGraphicsPipeline = null;
currentComputePipeline = null;
renderPassActive = false;
currentSampleCount = SampleCount.One;
colorFormatOne = TextureFormat.R8G8B8A8;
colorFormatTwo = TextureFormat.R8G8B8A8;
colorFormatThree = TextureFormat.R8G8B8A8;
colorFormatFour = TextureFormat.R8G8B8A8;
depthStencilFormat = TextureFormat.D16;
#endif
}
/// <summary>
@ -54,7 +68,11 @@ namespace MoonWorks.Graphics
IntPtr.Zero
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfo.SampleCount;
colorFormatOne = colorAttachmentInfo.Texture.Format;
#endif
}
/// <summary>
@ -90,7 +108,12 @@ namespace MoonWorks.Graphics
IntPtr.Zero
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfoOne.SampleCount;
colorFormatOne = colorAttachmentInfoOne.Texture.Format;
colorFormatTwo = colorAttachmentInfoTwo.Texture.Format;
#endif
}
/// <summary>
@ -133,7 +156,13 @@ namespace MoonWorks.Graphics
IntPtr.Zero
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfoOne.SampleCount;
colorFormatOne = colorAttachmentInfoOne.Texture.Format;
colorFormatTwo = colorAttachmentInfoTwo.Texture.Format;
colorFormatThree = colorAttachmentInfoThree.Texture.Format;
#endif
}
/// <summary>
@ -183,7 +212,14 @@ namespace MoonWorks.Graphics
IntPtr.Zero
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfoOne.SampleCount;
colorFormatOne = colorAttachmentInfoOne.Texture.Format;
colorFormatTwo = colorAttachmentInfoTwo.Texture.Format;
colorFormatThree = colorAttachmentInfoThree.Texture.Format;
colorFormatFour = colorAttachmentInfoFour.Texture.Format;
#endif
}
/// <summary>
@ -209,7 +245,10 @@ namespace MoonWorks.Graphics
&refreshDepthStencilAttachmentInfo
);
#if DEBUG
renderPassActive = true;
depthStencilFormat = depthStencilAttachmentInfo.Texture.Format;
#endif
}
/// <summary>
@ -243,7 +282,12 @@ namespace MoonWorks.Graphics
&refreshDepthStencilAttachmentInfo
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfo.SampleCount;
colorFormatOne = colorAttachmentInfo.Texture.Format;
depthStencilFormat = depthStencilAttachmentInfo.Texture.Format;
#endif
}
/// <summary>
@ -285,7 +329,13 @@ namespace MoonWorks.Graphics
&refreshDepthStencilAttachmentInfo
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfoOne.SampleCount;
colorFormatOne = colorAttachmentInfoOne.Texture.Format;
colorFormatTwo = colorAttachmentInfoTwo.Texture.Format;
depthStencilFormat = depthStencilAttachmentInfo.Texture.Format;
#endif
}
/// <summary>
@ -334,7 +384,14 @@ namespace MoonWorks.Graphics
&refreshDepthStencilAttachmentInfo
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfoOne.SampleCount;
colorFormatOne = colorAttachmentInfoOne.Texture.Format;
colorFormatTwo = colorAttachmentInfoTwo.Texture.Format;
colorFormatThree = colorAttachmentInfoThree.Texture.Format;
depthStencilFormat = depthStencilAttachmentInfo.Texture.Format;
#endif
}
/// <summary>
@ -390,7 +447,15 @@ namespace MoonWorks.Graphics
&refreshDepthStencilAttachmentInfo
);
#if DEBUG
renderPassActive = true;
currentSampleCount = colorAttachmentInfoOne.SampleCount;
colorFormatOne = colorAttachmentInfoOne.Texture.Format;
colorFormatTwo = colorAttachmentInfoTwo.Texture.Format;
colorFormatThree = colorAttachmentInfoThree.Texture.Format;
colorFormatFour = colorAttachmentInfoFour.Texture.Format;
depthStencilFormat = depthStencilAttachmentInfo.Texture.Format;
#endif
}
/// <summary>
@ -406,7 +471,9 @@ namespace MoonWorks.Graphics
computePipeline.Handle
);
#if DEBUG
currentComputePipeline = computePipeline;
#endif
}
/// <summary>
@ -714,6 +781,7 @@ namespace MoonWorks.Graphics
) {
#if DEBUG
AssertRenderPassActive();
AssertRenderPassPipelineFormatMatch(graphicsPipeline);
if (graphicsPipeline.SampleCount != currentSampleCount)
{
@ -727,7 +795,9 @@ namespace MoonWorks.Graphics
graphicsPipeline.Handle
);
#if DEBUG
currentGraphicsPipeline = graphicsPipeline;
#endif
}
/// <summary>
@ -1530,8 +1600,10 @@ namespace MoonWorks.Graphics
Handle
);
#if DEBUG
currentGraphicsPipeline = null;
renderPassActive = false;
#endif
}
/// <summary>
@ -1845,6 +1917,42 @@ namespace MoonWorks.Graphics
}
}
private void AssertRenderPassPipelineFormatMatch(GraphicsPipeline graphicsPipeline)
{
for (var i = 0; i < graphicsPipeline.AttachmentInfo.ColorAttachmentDescriptions.Length; i += 1)
{
TextureFormat format;
if (i == 0)
{
format = colorFormatOne;
}
else if (i == 1)
{
format = colorFormatTwo;
}
else if (i == 2)
{
format = colorFormatThree;
}
else
{
format = colorFormatFour;
}
var pipelineFormat = graphicsPipeline.AttachmentInfo.ColorAttachmentDescriptions[i].Format;
if (pipelineFormat != format)
{
throw new System.InvalidOperationException($"Color texture format mismatch! Pipeline expects {pipelineFormat}, render pass attachment is {format}");
}
}
var pipelineDepthFormat = graphicsPipeline.AttachmentInfo.DepthStencilFormat;
if (pipelineDepthFormat != depthStencilFormat)
{
throw new System.InvalidOperationException($"Depth texture format mismatch! Pipeline expects {pipelineDepthFormat}, render pass attachment is {depthStencilFormat}");
}
}
private void AssertVertexSamplerCount(int count)
{
if (currentGraphicsPipeline.VertexShaderInfo.SamplerBindingCount != count)

View File

@ -14,7 +14,11 @@ namespace MoonWorks.Graphics
public GraphicsShaderInfo VertexShaderInfo { get; }
public GraphicsShaderInfo FragmentShaderInfo { get; }
internal SampleCount SampleCount { get; }
public SampleCount SampleCount { get; }
#if DEBUG
internal GraphicsPipelineAttachmentInfo AttachmentInfo { get; }
#endif
public unsafe GraphicsPipeline(
GraphicsDevice device,
@ -113,6 +117,10 @@ namespace MoonWorks.Graphics
VertexShaderInfo = vertexShaderInfo;
FragmentShaderInfo = fragmentShaderInfo;
SampleCount = multisampleState.MultisampleCount;
#if DEBUG
AttachmentInfo = attachmentInfo;
#endif
}
}
}