|
|
|
@ -40,15 +40,7 @@ namespace MoonWorks.Graphics
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
#if DEBUG
|
|
|
|
|
if (colorAttachmentInfos.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass must contain at least one attachment!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (colorAttachmentInfos.Length > 4)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass cannot have more than 4 color attachments!");
|
|
|
|
|
}
|
|
|
|
|
AssertValidColorAttachments(colorAttachmentInfos, true);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length];
|
|
|
|
@ -86,10 +78,8 @@ namespace MoonWorks.Graphics
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
#if DEBUG
|
|
|
|
|
if (colorAttachmentInfos.Length > 4)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass cannot have more than 4 color attachments!");
|
|
|
|
|
}
|
|
|
|
|
AssertValidDepthAttachments(depthStencilAttachmentInfo);
|
|
|
|
|
AssertValidColorAttachments(colorAttachmentInfos, false);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length];
|
|
|
|
@ -129,15 +119,7 @@ namespace MoonWorks.Graphics
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
#if DEBUG
|
|
|
|
|
if (colorAttachmentInfos.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass must contain at least one attachment!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (colorAttachmentInfos.Length > 4)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass cannot have more than 4 color attachments!");
|
|
|
|
|
}
|
|
|
|
|
AssertValidColorAttachments(colorAttachmentInfos, true);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length];
|
|
|
|
@ -177,10 +159,8 @@ namespace MoonWorks.Graphics
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
#if DEBUG
|
|
|
|
|
if (colorAttachmentInfos.Length > 4)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass cannot have more than 4 color attachments!");
|
|
|
|
|
}
|
|
|
|
|
AssertValidDepthAttachments(depthStencilAttachmentInfo);
|
|
|
|
|
AssertValidColorAttachments(colorAttachmentInfos, false);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
var refreshColorAttachmentInfos = new Refresh.ColorAttachmentInfo[colorAttachmentInfos.Length];
|
|
|
|
@ -453,11 +433,9 @@ namespace MoonWorks.Graphics
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Binds samplers to be used by the vertex shader.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="textureSamplerBindings">An array of texture-sampler pairs to bind.</param>
|
|
|
|
|
/// <param name="length">The number of texture-sampler pairs from the array to bind.</param>
|
|
|
|
|
/// <param name="textureSamplerBindings">The texture-sampler pairs to bind.</param>
|
|
|
|
|
public unsafe void BindVertexSamplers(
|
|
|
|
|
TextureSamplerBinding[] textureSamplerBindings,
|
|
|
|
|
int length
|
|
|
|
|
params TextureSamplerBinding[] textureSamplerBindings
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
#if DEBUG
|
|
|
|
@ -468,7 +446,7 @@ namespace MoonWorks.Graphics
|
|
|
|
|
throw new System.InvalidOperationException("The vertex shader of the current graphics pipeline does not take any samplers!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (currentGraphicsPipeline.VertexShaderInfo.SamplerBindingCount < length)
|
|
|
|
|
if (currentGraphicsPipeline.VertexShaderInfo.SamplerBindingCount < textureSamplerBindings.Length)
|
|
|
|
|
{
|
|
|
|
|
throw new System.InvalidOperationException("Vertex sampler count exceeds the amount used by the vertex shader!");
|
|
|
|
|
}
|
|
|
|
@ -477,10 +455,15 @@ namespace MoonWorks.Graphics
|
|
|
|
|
var texturePtrs = stackalloc IntPtr[textureSamplerBindings.Length];
|
|
|
|
|
var samplerPtrs = stackalloc IntPtr[textureSamplerBindings.Length];
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < length; i += 1)
|
|
|
|
|
for (var i = 0; i < textureSamplerBindings.Length; i += 1)
|
|
|
|
|
{
|
|
|
|
|
texturePtrs[i] = textureSamplerBindings[i].TextureHandle;
|
|
|
|
|
samplerPtrs[i] = textureSamplerBindings[i].SamplerHandle;
|
|
|
|
|
#if DEBUG
|
|
|
|
|
AssertTextureSamplerBindingNonNull(textureSamplerBindings[i]);
|
|
|
|
|
AssertTextureBindingUsageFlags(textureSamplerBindings[i].Texture);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
texturePtrs[i] = textureSamplerBindings[i].Texture.Handle;
|
|
|
|
|
samplerPtrs[i] = textureSamplerBindings[i].Sampler.Handle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Refresh.Refresh_BindVertexSamplers(
|
|
|
|
@ -491,25 +474,12 @@ namespace MoonWorks.Graphics
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Binds samplers to be used by the vertex shader.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="textureSamplerBindings">The texture-sampler pairs to bind.</param>
|
|
|
|
|
public unsafe void BindVertexSamplers(
|
|
|
|
|
params TextureSamplerBinding[] textureSamplerBindings
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
BindVertexSamplers(textureSamplerBindings, textureSamplerBindings.Length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Binds samplers to be used by the fragment shader.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="textureSamplerBindings">An array of texture-sampler pairs to bind.</param>
|
|
|
|
|
/// <param name="length">The number of texture-sampler pairs from the given array to bind.</param>
|
|
|
|
|
public unsafe void BindFragmentSamplers(
|
|
|
|
|
TextureSamplerBinding[] textureSamplerBindings,
|
|
|
|
|
int length
|
|
|
|
|
params TextureSamplerBinding[] textureSamplerBindings
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
#if DEBUG
|
|
|
|
@ -520,7 +490,7 @@ namespace MoonWorks.Graphics
|
|
|
|
|
throw new System.InvalidOperationException("The fragment shader of the current graphics pipeline does not take any samplers!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (currentGraphicsPipeline.FragmentShaderInfo.SamplerBindingCount < length)
|
|
|
|
|
if (currentGraphicsPipeline.FragmentShaderInfo.SamplerBindingCount < textureSamplerBindings.Length)
|
|
|
|
|
{
|
|
|
|
|
throw new System.InvalidOperationException("Fragment sampler count exceeds the amount used by the fragment shader!");
|
|
|
|
|
}
|
|
|
|
@ -529,21 +499,15 @@ namespace MoonWorks.Graphics
|
|
|
|
|
var texturePtrs = stackalloc IntPtr[textureSamplerBindings.Length];
|
|
|
|
|
var samplerPtrs = stackalloc IntPtr[textureSamplerBindings.Length];
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < length; i += 1)
|
|
|
|
|
for (var i = 0; i < textureSamplerBindings.Length; i += 1)
|
|
|
|
|
{
|
|
|
|
|
#if DEBUG
|
|
|
|
|
if (textureSamplerBindings[i].TextureHandle == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
throw new NullReferenceException("Texture binding must not be null!");
|
|
|
|
|
}
|
|
|
|
|
if (textureSamplerBindings[i].TextureHandle == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
throw new NullReferenceException("Sampler binding must not be null!");
|
|
|
|
|
}
|
|
|
|
|
AssertTextureSamplerBindingNonNull(textureSamplerBindings[i]);
|
|
|
|
|
AssertTextureBindingUsageFlags(textureSamplerBindings[i].Texture);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
texturePtrs[i] = textureSamplerBindings[i].TextureHandle;
|
|
|
|
|
samplerPtrs[i] = textureSamplerBindings[i].SamplerHandle;
|
|
|
|
|
texturePtrs[i] = textureSamplerBindings[i].Texture.Handle;
|
|
|
|
|
samplerPtrs[i] = textureSamplerBindings[i].Sampler.Handle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Refresh.Refresh_BindFragmentSamplers(
|
|
|
|
@ -554,17 +518,6 @@ namespace MoonWorks.Graphics
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Binds samplers to be used by the fragment shader.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="textureSamplerBindings">An array of texture-sampler pairs to bind.</param>
|
|
|
|
|
public unsafe void BindFragmentSamplers(
|
|
|
|
|
params TextureSamplerBinding[] textureSamplerBindings
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
BindFragmentSamplers(textureSamplerBindings, textureSamplerBindings.Length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Pushes vertex shader uniforms to the device.
|
|
|
|
|
/// </summary>
|
|
|
|
@ -581,6 +534,7 @@ namespace MoonWorks.Graphics
|
|
|
|
|
throw new InvalidOperationException("The current vertex shader does not take a uniform buffer!");
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
fixed (T* ptr = &uniforms[0])
|
|
|
|
|
{
|
|
|
|
|
return Refresh.Refresh_PushVertexShaderUniforms(
|
|
|
|
@ -1111,6 +1065,68 @@ namespace MoonWorks.Graphics
|
|
|
|
|
throw new System.InvalidOperationException(message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AssertValidColorAttachments(ColorAttachmentInfo[] colorAttachmentInfos, bool atLeastOneRequired)
|
|
|
|
|
{
|
|
|
|
|
if (atLeastOneRequired && colorAttachmentInfos.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass must contain at least one attachment!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (colorAttachmentInfos.Length > 4)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass cannot have more than 4 color attachments!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < colorAttachmentInfos.Length; i += 1)
|
|
|
|
|
{
|
|
|
|
|
if (colorAttachmentInfos[i].Texture == null ||
|
|
|
|
|
colorAttachmentInfos[i].Texture.Handle == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass color attachment Texture cannot be null!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((colorAttachmentInfos[i].Texture.UsageFlags & TextureUsageFlags.ColorTarget) == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass color attachment UsageFlags must include TextureUsageFlags.ColorTarget!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AssertValidDepthAttachments(DepthStencilAttachmentInfo depthStencilAttachmentInfo)
|
|
|
|
|
{
|
|
|
|
|
if (depthStencilAttachmentInfo.Texture == null ||
|
|
|
|
|
depthStencilAttachmentInfo.Texture.Handle == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass depth stencil attachment Texture cannot be null!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((depthStencilAttachmentInfo.Texture.UsageFlags & TextureUsageFlags.DepthStencilTarget) == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("Render pass depth stencil attachment UsageFlags must include TextureUsageFlags.DepthStencilTarget!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AssertTextureSamplerBindingNonNull(in TextureSamplerBinding binding)
|
|
|
|
|
{
|
|
|
|
|
if (binding.Texture == null || binding.Texture.Handle == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
throw new NullReferenceException("Texture binding must not be null!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (binding.Sampler == null || binding.Sampler.Handle == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
throw new NullReferenceException("Sampler binding must not be null!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AssertTextureBindingUsageFlags(Texture texture)
|
|
|
|
|
{
|
|
|
|
|
if ((texture.UsageFlags & TextureUsageFlags.Sampler) == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new System.ArgumentException("The bound Texture's UsageFlags must include TextureUsageFlags.Sampler!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|