diff --git a/src/Graphics/CommandBuffer.cs b/src/Graphics/CommandBuffer.cs
index a0746d3..45a602e 100644
--- a/src/Graphics/CommandBuffer.cs
+++ b/src/Graphics/CommandBuffer.cs
@@ -16,6 +16,7 @@ namespace MoonWorks.Graphics
GraphicsPipeline currentGraphicsPipeline;
ComputePipeline currentComputePipeline;
bool renderPassActive;
+ SampleCount currentSampleCount;
// called from RefreshDevice
internal CommandBuffer(GraphicsDevice device, IntPtr handle)
@@ -25,6 +26,7 @@ namespace MoonWorks.Graphics
currentGraphicsPipeline = null;
currentComputePipeline = null;
renderPassActive = false;
+ currentSampleCount = SampleCount.One;
}
// FIXME: we can probably use the NativeMemory functions to not have to generate arrays here
@@ -55,7 +57,6 @@ namespace MoonWorks.Graphics
Refresh.Refresh_BeginRenderPass(
Device.Handle,
Handle,
- IntPtr.Zero,
(IntPtr) pColorAttachmentInfos,
(uint) colorAttachmentInfos.Length,
IntPtr.Zero
@@ -78,7 +79,7 @@ namespace MoonWorks.Graphics
)
{
#if DEBUG
- AssertValidDepthAttachments(depthStencilAttachmentInfo);
+ AssertValidDepthAttachment(depthStencilAttachmentInfo);
AssertValidColorAttachments(colorAttachmentInfos, false);
#endif
@@ -96,88 +97,6 @@ namespace MoonWorks.Graphics
Refresh.Refresh_BeginRenderPass(
Device.Handle,
Handle,
- IntPtr.Zero,
- pColorAttachmentInfos,
- (uint) colorAttachmentInfos.Length,
- &refreshDepthStencilAttachmentInfo
- );
- }
-
- renderPassActive = true;
- }
-
- ///
- /// 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
- AssertValidColorAttachments(colorAttachmentInfos, true);
-#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
- );
- }
-
- renderPassActive = true;
- }
-
- ///
- /// 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
- AssertValidDepthAttachments(depthStencilAttachmentInfo);
- AssertValidColorAttachments(colorAttachmentInfos, false);
-#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
@@ -312,6 +231,15 @@ namespace MoonWorks.Graphics
GraphicsPipeline graphicsPipeline
)
{
+#if DEBUG
+ AssertRenderPassActive();
+
+ if (graphicsPipeline.SampleCount != currentSampleCount)
+ {
+ throw new System.ArgumentException("The sample count of the bound GraphicsPipeline must match the sample count of the current render pass!");
+ }
+#endif
+
Refresh.Refresh_BindGraphicsPipeline(
Device.Handle,
Handle,
@@ -1073,6 +1001,8 @@ namespace MoonWorks.Graphics
throw new System.ArgumentException("Render pass must contain at least one attachment!");
}
+ currentSampleCount = (colorAttachmentInfos.Length > 0) ? colorAttachmentInfos[0].SampleCount : SampleCount.One;
+
if (colorAttachmentInfos.Length > 4)
{
throw new System.ArgumentException("Render pass cannot have more than 4 color attachments!");
@@ -1090,10 +1020,15 @@ namespace MoonWorks.Graphics
{
throw new System.ArgumentException("Render pass color attachment UsageFlags must include TextureUsageFlags.ColorTarget!");
}
+
+ if (colorAttachmentInfos[i].SampleCount != currentSampleCount)
+ {
+ throw new System.ArgumentException("All color attachments in a render pass must have the same SampleCount!");
+ }
}
}
- private void AssertValidDepthAttachments(DepthStencilAttachmentInfo depthStencilAttachmentInfo)
+ private void AssertValidDepthAttachment(DepthStencilAttachmentInfo depthStencilAttachmentInfo)
{
if (depthStencilAttachmentInfo.Texture == null ||
depthStencilAttachmentInfo.Texture.Handle == IntPtr.Zero)
diff --git a/src/Graphics/RefreshEnums.cs b/src/Graphics/RefreshEnums.cs
index 1c859c4..7f178ae 100644
--- a/src/Graphics/RefreshEnums.cs
+++ b/src/Graphics/RefreshEnums.cs
@@ -110,10 +110,7 @@ namespace MoonWorks.Graphics
One,
Two,
Four,
- Eight,
- Sixteen,
- ThirtyTwo,
- SixtyFour
+ Eight
}
public enum CubeMapFace : uint
diff --git a/src/Graphics/RefreshStructs.cs b/src/Graphics/RefreshStructs.cs
index d2ccd9a..ad9e530 100644
--- a/src/Graphics/RefreshStructs.cs
+++ b/src/Graphics/RefreshStructs.cs
@@ -209,25 +209,35 @@ namespace MoonWorks.Graphics
public LoadOp LoadOp;
public StoreOp StoreOp;
- public ColorAttachmentInfo(Texture texture, Color clearColor, StoreOp storeOp = StoreOp.Store)
+ public ColorAttachmentInfo(
+ Texture texture,
+ Color clearColor,
+ SampleCount sampleCount = SampleCount.One,
+ StoreOp storeOp = StoreOp.Store
+ )
{
Texture = texture;
Depth = 0;
Layer = 0;
Level = 0;
- SampleCount = SampleCount.One;
+ SampleCount = sampleCount;
ClearColor = clearColor;
LoadOp = LoadOp.Clear;
StoreOp = storeOp;
}
- public ColorAttachmentInfo(Texture texture, LoadOp loadOp = LoadOp.DontCare, StoreOp storeOp = StoreOp.Store)
+ public ColorAttachmentInfo(
+ Texture texture,
+ LoadOp loadOp = LoadOp.DontCare,
+ SampleCount sampleCount = SampleCount.One,
+ StoreOp storeOp = StoreOp.Store
+ )
{
Texture = texture;
Depth = 0;
Layer = 0;
Level = 0;
- SampleCount = SampleCount.One;
+ SampleCount = sampleCount;
ClearColor = Color.White;
LoadOp = loadOp;
StoreOp = storeOp;
@@ -344,16 +354,13 @@ namespace MoonWorks.Graphics
public struct ColorAttachmentDescription
{
public TextureFormat Format;
- public SampleCount SampleCount;
public ColorAttachmentBlendState BlendState;
public ColorAttachmentDescription(
TextureFormat format,
- ColorAttachmentBlendState blendState,
- SampleCount sampleCount = SampleCount.One
+ ColorAttachmentBlendState blendState
) {
Format = format;
- SampleCount = sampleCount;
BlendState = blendState;
}
}
diff --git a/src/Graphics/Resources/GraphicsPipeline.cs b/src/Graphics/Resources/GraphicsPipeline.cs
index 11026eb..ccf88cd 100644
--- a/src/Graphics/Resources/GraphicsPipeline.cs
+++ b/src/Graphics/Resources/GraphicsPipeline.cs
@@ -14,6 +14,7 @@ namespace MoonWorks.Graphics
public GraphicsShaderInfo VertexShaderInfo { get; }
public GraphicsShaderInfo FragmentShaderInfo { get; }
+ internal SampleCount SampleCount { get; }
public unsafe GraphicsPipeline(
GraphicsDevice device,
@@ -46,7 +47,6 @@ namespace MoonWorks.Graphics
for (var i = 0; i < attachmentInfo.ColorAttachmentDescriptions.Length; i += 1)
{
colorAttachmentDescriptions[i].format = (Refresh.TextureFormat) attachmentInfo.ColorAttachmentDescriptions[i].Format;
- colorAttachmentDescriptions[i].sampleCount = (Refresh.SampleCount) attachmentInfo.ColorAttachmentDescriptions[i].SampleCount;
colorAttachmentDescriptions[i].blendState = attachmentInfo.ColorAttachmentDescriptions[i].BlendState.ToRefresh();
}
@@ -112,6 +112,7 @@ namespace MoonWorks.Graphics
VertexShaderInfo = vertexShaderInfo;
FragmentShaderInfo = fragmentShaderInfo;
+ SampleCount = multisampleState.MultisampleCount;
}
}
}
diff --git a/src/Graphics/Resources/Texture.cs b/src/Graphics/Resources/Texture.cs
index a049786..124eaef 100644
--- a/src/Graphics/Resources/Texture.cs
+++ b/src/Graphics/Resources/Texture.cs
@@ -15,7 +15,6 @@ namespace MoonWorks.Graphics
public TextureFormat Format { get; }
public bool IsCube { get; }
public uint LevelCount { get; }
- public SampleCount SampleCount { get; }
public TextureUsageFlags UsageFlags { get; }
protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyTexture;
@@ -46,7 +45,6 @@ namespace MoonWorks.Graphics
textureCreateInfo.Format = TextureFormat.R8G8B8A8;
textureCreateInfo.IsCube = false;
textureCreateInfo.LevelCount = 1;
- textureCreateInfo.SampleCount = SampleCount.One;
textureCreateInfo.UsageFlags = TextureUsageFlags.Sampler;
var texture = new Texture(device, textureCreateInfo);
@@ -83,12 +81,12 @@ namespace MoonWorks.Graphics
if (isCube)
{
- texture = CreateTextureCube(graphicsDevice, (uint) width, format, TextureUsageFlags.Sampler, SampleCount.One, (uint) levels);
+ texture = CreateTextureCube(graphicsDevice, (uint) width, format, TextureUsageFlags.Sampler, (uint) levels);
faces = 6;
}
else
{
- texture = CreateTexture2D(graphicsDevice, (uint) width, (uint) height, format, TextureUsageFlags.Sampler, SampleCount.One, (uint) levels);
+ texture = CreateTexture2D(graphicsDevice, (uint) width, (uint) height, format, TextureUsageFlags.Sampler, (uint) levels);
faces = 1;
}
@@ -124,7 +122,6 @@ namespace MoonWorks.Graphics
/// The height of the texture.
/// The format of the texture.
/// Specifies how the texture will be used.
- /// Specifies the multisample count.
/// Specifies the number of mip levels.
public static Texture CreateTexture2D(
GraphicsDevice device,
@@ -132,7 +129,6 @@ namespace MoonWorks.Graphics
uint height,
TextureFormat format,
TextureUsageFlags usageFlags,
- SampleCount sampleCount = SampleCount.One,
uint levelCount = 1
)
{
@@ -142,7 +138,6 @@ namespace MoonWorks.Graphics
Height = height,
Depth = 1,
IsCube = false,
- SampleCount = sampleCount,
LevelCount = levelCount,
Format = format,
UsageFlags = usageFlags
@@ -160,7 +155,6 @@ namespace MoonWorks.Graphics
/// The depth of the texture.
/// The format of the texture.
/// Specifies how the texture will be used.
- /// Specifies the multisample count.
/// Specifies the number of mip levels.
public static Texture CreateTexture3D(
GraphicsDevice device,
@@ -169,7 +163,6 @@ namespace MoonWorks.Graphics
uint depth,
TextureFormat format,
TextureUsageFlags usageFlags,
- SampleCount sampleCount = SampleCount.One,
uint levelCount = 1
)
{
@@ -179,7 +172,6 @@ namespace MoonWorks.Graphics
Height = height,
Depth = depth,
IsCube = false,
- SampleCount = sampleCount,
LevelCount = levelCount,
Format = format,
UsageFlags = usageFlags
@@ -195,14 +187,12 @@ namespace MoonWorks.Graphics
/// The length of one side of the cube.
/// The format of the texture.
/// Specifies how the texture will be used.
- /// Specifies the multisample count.
/// Specifies the number of mip levels.
public static Texture CreateTextureCube(
GraphicsDevice device,
uint size,
TextureFormat format,
TextureUsageFlags usageFlags,
- SampleCount sampleCount = SampleCount.One,
uint levelCount = 1
)
{
@@ -212,7 +202,6 @@ namespace MoonWorks.Graphics
Height = size,
Depth = 1,
IsCube = true,
- SampleCount = sampleCount,
LevelCount = levelCount,
Format = format,
UsageFlags = usageFlags
@@ -241,7 +230,6 @@ namespace MoonWorks.Graphics
Height = textureCreateInfo.Height;
Depth = textureCreateInfo.Depth;
IsCube = textureCreateInfo.IsCube;
- SampleCount = textureCreateInfo.SampleCount;
LevelCount = textureCreateInfo.LevelCount;
UsageFlags = textureCreateInfo.UsageFlags;
}
@@ -265,7 +253,6 @@ namespace MoonWorks.Graphics
Height = height;
Depth = 1;
IsCube = false;
- SampleCount = SampleCount.One;
LevelCount = 1;
UsageFlags = TextureUsageFlags.ColorTarget;
}
diff --git a/src/Graphics/State/MultisampleState.cs b/src/Graphics/State/MultisampleState.cs
index 4b6806f..acbcec0 100644
--- a/src/Graphics/State/MultisampleState.cs
+++ b/src/Graphics/State/MultisampleState.cs
@@ -13,5 +13,13 @@
MultisampleCount = SampleCount.One,
SampleMask = uint.MaxValue
};
+
+ public MultisampleState(
+ SampleCount sampleCount,
+ uint sampleMask = uint.MaxValue
+ ) {
+ MultisampleCount = sampleCount;
+ SampleMask = sampleMask;
+ }
}
}
diff --git a/src/Graphics/State/TextureCreateInfo.cs b/src/Graphics/State/TextureCreateInfo.cs
index f7044bf..c4f7225 100644
--- a/src/Graphics/State/TextureCreateInfo.cs
+++ b/src/Graphics/State/TextureCreateInfo.cs
@@ -8,7 +8,6 @@ namespace MoonWorks.Graphics
public uint Height;
public uint Depth;
public bool IsCube;
- public SampleCount SampleCount;
public uint LevelCount;
public TextureFormat Format;
public TextureUsageFlags UsageFlags;
@@ -21,7 +20,6 @@ namespace MoonWorks.Graphics
height = Height,
depth = Depth,
isCube = Conversions.BoolToByte(IsCube),
- sampleCount = (Refresh.SampleCount) SampleCount,
levelCount = LevelCount,
format = (Refresh.TextureFormat) Format,
usageFlags = (Refresh.TextureUsageFlags) UsageFlags