Render Pass Streamlining (#14)
Changes as per a531fb8593
Reviewed-on: #14
Co-authored-by: cosmonaut <evan@moonside.games>
Co-committed-by: cosmonaut <evan@moonside.games>
pull/15/head
parent
8a3d93d2dc
commit
1064bae828
|
@ -1 +1 @@
|
||||||
Subproject commit 1e8abe379a0ccc891ce0f4d90793feac59d30948
|
Subproject commit cb949b8205eb2454dd0c9f4c84d41c6647802408
|
|
@ -27,98 +27,137 @@ namespace MoonWorks.Graphics
|
||||||
/// All render state, resource binding, and draw commands must be made within 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.
|
/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="renderPass">The render pass object to begin.</param>
|
/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param>
|
||||||
/// <param name="framebuffer">The framebuffer used by the render pass.</param>
|
|
||||||
public unsafe void BeginRenderPass(
|
public unsafe void BeginRenderPass(
|
||||||
RenderPass renderPass,
|
params ColorAttachmentInfo[] colorAttachmentInfos
|
||||||
Framebuffer framebuffer
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var renderArea = new Rect
|
#if DEBUG
|
||||||
|
if (colorAttachmentInfos.Length == 0)
|
||||||
{
|
{
|
||||||
X = 0,
|
Logger.LogError("Render pass must contain at least one attachment!");
|
||||||
Y = 0,
|
return;
|
||||||
W = (int) framebuffer.Width,
|
}
|
||||||
H = (int) framebuffer.Height
|
|
||||||
};
|
|
||||||
|
|
||||||
|
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(
|
Refresh.Refresh_BeginRenderPass(
|
||||||
Device.Handle,
|
Device.Handle,
|
||||||
Handle,
|
Handle,
|
||||||
renderPass.Handle,
|
colorAttachmentInfos[0].renderTarget.TextureSlice.Rectangle.ToRefresh(),
|
||||||
framebuffer.Handle,
|
(IntPtr) pColorAttachmentInfos,
|
||||||
renderArea.ToRefresh(),
|
(uint) colorAttachmentInfos.Length,
|
||||||
IntPtr.Zero,
|
|
||||||
0,
|
|
||||||
IntPtr.Zero
|
IntPtr.Zero
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Begins a render pass.
|
/// Begins a render pass.
|
||||||
/// All render state, resource binding, and draw commands must be made within 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.
|
/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="renderPass">The render pass object to begin.</param>
|
/// <param name="depthStencilAttachmentInfo">The depth stencil attachment to use in the render pass.</param>
|
||||||
/// <param name="framebuffer">The framebuffer used by the render pass.</param>
|
/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param>
|
||||||
/// <param name="renderArea">The screen area of the render pass.</param>
|
|
||||||
public unsafe void BeginRenderPass(
|
public unsafe void BeginRenderPass(
|
||||||
RenderPass renderPass,
|
DepthStencilAttachmentInfo depthStencilAttachmentInfo,
|
||||||
Framebuffer framebuffer,
|
params ColorAttachmentInfo[] colorAttachmentInfos
|
||||||
in Rect renderArea
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
#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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="renderArea">The rectangle that should be drawn to on the attachments.</param>
|
||||||
|
/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param>
|
||||||
|
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(
|
Refresh.Refresh_BeginRenderPass(
|
||||||
Device.Handle,
|
Device.Handle,
|
||||||
Handle,
|
Handle,
|
||||||
renderPass.Handle,
|
|
||||||
framebuffer.Handle,
|
|
||||||
renderArea.ToRefresh(),
|
renderArea.ToRefresh(),
|
||||||
IntPtr.Zero,
|
(IntPtr) pColorAttachmentInfos,
|
||||||
0,
|
(uint) colorAttachmentInfos.Length,
|
||||||
IntPtr.Zero
|
IntPtr.Zero
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 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.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="renderPass">The render pass object to begin.</param>
|
|
||||||
/// <param name="framebuffer">The framebuffer used by the render pass.</param>
|
|
||||||
/// <param name="renderArea">The screen area of the render pass.</param>
|
|
||||||
/// <param name="clearColors">Color clear values for each render target in the framebuffer.</param>
|
|
||||||
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
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
Refresh.Refresh_BeginRenderPass(
|
|
||||||
Device.Handle,
|
|
||||||
Handle,
|
|
||||||
renderPass.Handle,
|
|
||||||
framebuffer.Handle,
|
|
||||||
renderArea.ToRefresh(),
|
|
||||||
(IntPtr) colors,
|
|
||||||
(uint) clearColors.Length,
|
|
||||||
IntPtr.Zero
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -126,70 +165,49 @@ namespace MoonWorks.Graphics
|
||||||
/// All render state, resource binding, and draw commands must be made within 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.
|
/// It is an error to call this after calling BeginRenderPass but before calling EndRenderPass.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="renderPass">The render pass object to begin.</param>
|
/// <param name="renderArea">The rectangle that should be drawn to on the attachments.</param>
|
||||||
/// <param name="framebuffer">The framebuffer used by the render pass.</param>
|
/// <param name="depthStencilAttachmentInfo">The depth stencil attachment to use in the render pass.</param>
|
||||||
/// <param name="renderArea">The screen area of the render pass.</param>
|
/// <param name="colorAttachmentInfos">The color attachments to use in the render pass.</param>
|
||||||
/// <param name="depthStencilClearValue">Clear values for the depth/stencil buffer. This is ignored if the render pass does not clear.</param>
|
|
||||||
public unsafe void BeginRenderPass(
|
public unsafe void BeginRenderPass(
|
||||||
RenderPass renderPass,
|
|
||||||
Framebuffer framebuffer,
|
|
||||||
in Rect renderArea,
|
in Rect renderArea,
|
||||||
in DepthStencilValue depthStencilClearValue
|
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(
|
Refresh.Refresh_BeginRenderPass(
|
||||||
Device.Handle,
|
Device.Handle,
|
||||||
Handle,
|
Handle,
|
||||||
renderPass.Handle,
|
|
||||||
framebuffer.Handle,
|
|
||||||
renderArea.ToRefresh(),
|
renderArea.ToRefresh(),
|
||||||
IntPtr.Zero,
|
pColorAttachmentInfos,
|
||||||
0,
|
(uint) colorAttachmentInfos.Length,
|
||||||
depthStencilClearValue.ToRefresh()
|
&refreshDepthStencilAttachmentInfo
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 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.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="renderPass">The render pass object to begin.</param>
|
|
||||||
/// <param name="framebuffer">The framebuffer used by the render pass.</param>
|
|
||||||
/// <param name="renderArea">The screen area of the render pass.</param>
|
|
||||||
/// <param name="depthStencilClearValue">Clear values for the depth/stencil buffer. This is ignored if the render pass does not clear.</param>
|
|
||||||
/// <param name="clearColors">Color clear values for each render target in the framebuffer.</param>
|
|
||||||
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++)
|
|
||||||
{
|
|
||||||
colors[i] = new Refresh.Vec4
|
|
||||||
{
|
|
||||||
x = clearColors[i].X,
|
|
||||||
y = clearColors[i].Y,
|
|
||||||
z = clearColors[i].Z,
|
|
||||||
w = clearColors[i].W
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
Refresh.Refresh_BeginRenderPass(
|
|
||||||
Device.Handle,
|
|
||||||
Handle,
|
|
||||||
renderPass.Handle,
|
|
||||||
framebuffer.Handle,
|
|
||||||
renderArea.ToRefresh(),
|
|
||||||
(IntPtr) colors,
|
|
||||||
(uint) clearColors.Length,
|
|
||||||
depthStencilClearValue.ToRefresh()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -72,25 +72,6 @@ namespace MoonWorks.Graphics
|
||||||
public uint Offset;
|
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)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public struct StencilOpState
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using RefreshCS;
|
|
||||||
|
|
||||||
namespace MoonWorks.Graphics
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A framebuffer is a collection of render targets that is rendered to during a render pass.
|
|
||||||
/// </summary>
|
|
||||||
public class Framebuffer : GraphicsResource
|
|
||||||
{
|
|
||||||
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyFramebuffer;
|
|
||||||
|
|
||||||
public RenderTarget DepthStencilTarget { get; }
|
|
||||||
|
|
||||||
private RenderTarget[] colorTargets { get; }
|
|
||||||
public IEnumerable<RenderTarget> ColorTargets => colorTargets;
|
|
||||||
|
|
||||||
public RenderPass RenderPass { get; }
|
|
||||||
public uint Width { get; }
|
|
||||||
public uint Height { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Creates a framebuffer.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="device">An initialized GraphicsDevice.</param>
|
|
||||||
/// <param name="width">The width of the framebuffer.</param>
|
|
||||||
/// <param name="height">The height of the framebuffer.</param>
|
|
||||||
/// <param name="renderPass">The reference render pass for the framebuffer.</param>
|
|
||||||
/// <param name="depthStencilTarget">The depth stencil target. Can be null.</param>
|
|
||||||
/// <param name="colorTargets">Anywhere from 0-4 color targets can be provided.</param>
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -14,7 +14,6 @@ namespace MoonWorks.Graphics
|
||||||
|
|
||||||
public ShaderStageState VertexShaderState { get; }
|
public ShaderStageState VertexShaderState { get; }
|
||||||
public ShaderStageState FragmentShaderState { get; }
|
public ShaderStageState FragmentShaderState { get; }
|
||||||
public RenderPass RenderPass { get; }
|
|
||||||
|
|
||||||
public unsafe GraphicsPipeline(
|
public unsafe GraphicsPipeline(
|
||||||
GraphicsDevice device,
|
GraphicsDevice device,
|
||||||
|
@ -31,7 +30,7 @@ namespace MoonWorks.Graphics
|
||||||
PrimitiveType primitiveType = graphicsPipelineCreateInfo.PrimitiveType;
|
PrimitiveType primitiveType = graphicsPipelineCreateInfo.PrimitiveType;
|
||||||
VertexInputState vertexInputState = graphicsPipelineCreateInfo.VertexInputState;
|
VertexInputState vertexInputState = graphicsPipelineCreateInfo.VertexInputState;
|
||||||
ViewportState viewportState = graphicsPipelineCreateInfo.ViewportState;
|
ViewportState viewportState = graphicsPipelineCreateInfo.ViewportState;
|
||||||
RenderPass renderPass = graphicsPipelineCreateInfo.RenderPass;
|
GraphicsPipelineAttachmentInfo attachmentInfo = graphicsPipelineCreateInfo.AttachmentInfo;
|
||||||
|
|
||||||
var vertexAttributesHandle = GCHandle.Alloc(
|
var vertexAttributesHandle = GCHandle.Alloc(
|
||||||
vertexInputState.VertexAttributes,
|
vertexInputState.VertexAttributes,
|
||||||
|
@ -59,6 +58,16 @@ namespace MoonWorks.Graphics
|
||||||
colorTargetBlendStates[i] = colorBlendState.ColorTargetBlendStates[i].ToRefreshColorTargetBlendState();
|
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;
|
Refresh.GraphicsPipelineCreateInfo refreshGraphicsPipelineCreateInfo;
|
||||||
|
|
||||||
refreshGraphicsPipelineCreateInfo.colorBlendState.logicOpEnable = Conversions.BoolToByte(colorBlendState.LogicOpEnable);
|
refreshGraphicsPipelineCreateInfo.colorBlendState.logicOpEnable = Conversions.BoolToByte(colorBlendState.LogicOpEnable);
|
||||||
|
@ -115,7 +124,11 @@ namespace MoonWorks.Graphics
|
||||||
refreshGraphicsPipelineCreateInfo.viewportState.scissorCount = (uint) viewportState.Scissors.Length;
|
refreshGraphicsPipelineCreateInfo.viewportState.scissorCount = (uint) viewportState.Scissors.Length;
|
||||||
|
|
||||||
refreshGraphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType;
|
refreshGraphicsPipelineCreateInfo.primitiveType = (Refresh.PrimitiveType) primitiveType;
|
||||||
refreshGraphicsPipelineCreateInfo.renderPass = renderPass.Handle;
|
|
||||||
|
refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentCount = attachmentInfo.colorAttachmentCount;
|
||||||
|
refreshGraphicsPipelineCreateInfo.attachmentInfo.colorAttachmentDescriptions = (IntPtr) colorAttachmentDescriptions;
|
||||||
|
refreshGraphicsPipelineCreateInfo.attachmentInfo.depthStencilFormat = (Refresh.TextureFormat) attachmentInfo.depthStencilFormat;
|
||||||
|
refreshGraphicsPipelineCreateInfo.attachmentInfo.hasDepthStencilAttachment = Conversions.BoolToByte(attachmentInfo.hasDepthStencilAttachment);
|
||||||
|
|
||||||
Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, refreshGraphicsPipelineCreateInfo);
|
Handle = Refresh.Refresh_CreateGraphicsPipeline(device.Handle, refreshGraphicsPipelineCreateInfo);
|
||||||
|
|
||||||
|
@ -126,7 +139,6 @@ namespace MoonWorks.Graphics
|
||||||
|
|
||||||
VertexShaderState = vertexShaderState;
|
VertexShaderState = vertexShaderState;
|
||||||
FragmentShaderState = fragmentShaderState;
|
FragmentShaderState = fragmentShaderState;
|
||||||
RenderPass = renderPass;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
using System;
|
|
||||||
using RefreshCS;
|
|
||||||
|
|
||||||
namespace MoonWorks.Graphics
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A render pass describes the kind of render targets that will be used in rendering.
|
|
||||||
/// </summary>
|
|
||||||
public class RenderPass : GraphicsResource
|
|
||||||
{
|
|
||||||
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderPass;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Creates a render pass using color target descriptions.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="device">An initialized GraphicsDevice.</param>
|
|
||||||
/// <param name="colorTargetDescriptions">Up to 4 color target descriptions may be provided.</param>
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Creates a render pass using a depth/stencil target description and optional color target descriptions.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="device">An initialized GraphicsDevice.</param>
|
|
||||||
/// <param name="depthStencilTargetDescription">A depth/stencil target description.</param>
|
|
||||||
/// <param name="colorTargetDescriptions">Up to 4 color target descriptions may be provided.</param>
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -11,6 +11,9 @@ namespace MoonWorks.Graphics
|
||||||
public TextureSlice TextureSlice { get; }
|
public TextureSlice TextureSlice { get; }
|
||||||
public TextureFormat Format => TextureSlice.Texture.Format;
|
public TextureFormat Format => TextureSlice.Texture.Format;
|
||||||
|
|
||||||
|
public uint Width => (uint) TextureSlice.Rectangle.W;
|
||||||
|
public uint Height => (uint) TextureSlice.Rectangle.H;
|
||||||
|
|
||||||
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
namespace MoonWorks.Graphics
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Describes the kind of attachments that will be used with this pipeline.
|
||||||
|
/// </summary>
|
||||||
|
public struct GraphicsPipelineAttachmentInfo
|
||||||
|
{
|
||||||
|
public ColorAttachmentDescription[] colorAttachmentDescriptions;
|
||||||
|
public uint colorAttachmentCount;
|
||||||
|
public bool hasDepthStencilAttachment;
|
||||||
|
public TextureFormat depthStencilFormat;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,6 @@
|
||||||
public PrimitiveType PrimitiveType;
|
public PrimitiveType PrimitiveType;
|
||||||
public VertexInputState VertexInputState;
|
public VertexInputState VertexInputState;
|
||||||
public ViewportState ViewportState;
|
public ViewportState ViewportState;
|
||||||
public RenderPass RenderPass;
|
public GraphicsPipelineAttachmentInfo AttachmentInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
public static bool ByteToBool(byte b)
|
public static bool ByteToBool(byte b)
|
||||||
{
|
{
|
||||||
return b == 0 ? false : true;
|
return b != 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue