presentation ABI break
parent
7328cbc13d
commit
81c882bd48
|
@ -1 +1 @@
|
||||||
Subproject commit 61ec63b71f9fc3163ef5a8d985fbb53e3f02dbf9
|
Subproject commit d844fe56ee16e7e0e0ae4f4ff1814292e499dff7
|
|
@ -52,12 +52,14 @@ namespace MoonWorks.Graphics
|
||||||
refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh();
|
refreshColorAttachmentInfos[i] = colorAttachmentInfos[i].ToRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rect renderArea = new Rect((int) colorAttachmentInfos[0].Texture.Width, (int) colorAttachmentInfos[0].Texture.Height);
|
||||||
|
|
||||||
fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos)
|
fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos)
|
||||||
{
|
{
|
||||||
Refresh.Refresh_BeginRenderPass(
|
Refresh.Refresh_BeginRenderPass(
|
||||||
Device.Handle,
|
Device.Handle,
|
||||||
Handle,
|
Handle,
|
||||||
colorAttachmentInfos[0].RenderTarget.TextureSlice.Rectangle.ToRefresh(),
|
renderArea.ToRefresh(),
|
||||||
(IntPtr) pColorAttachmentInfos,
|
(IntPtr) pColorAttachmentInfos,
|
||||||
(uint) colorAttachmentInfos.Length,
|
(uint) colorAttachmentInfos.Length,
|
||||||
IntPtr.Zero
|
IntPtr.Zero
|
||||||
|
@ -100,12 +102,14 @@ namespace MoonWorks.Graphics
|
||||||
|
|
||||||
var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh();
|
var refreshDepthStencilAttachmentInfo = depthStencilAttachmentInfo.ToRefresh();
|
||||||
|
|
||||||
|
Rect renderArea = new Rect((int) colorAttachmentInfos[0].Texture.Width, (int) colorAttachmentInfos[0].Texture.Height);
|
||||||
|
|
||||||
fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos)
|
fixed (Refresh.ColorAttachmentInfo* pColorAttachmentInfos = refreshColorAttachmentInfos)
|
||||||
{
|
{
|
||||||
Refresh.Refresh_BeginRenderPass(
|
Refresh.Refresh_BeginRenderPass(
|
||||||
Device.Handle,
|
Device.Handle,
|
||||||
Handle,
|
Handle,
|
||||||
colorAttachmentInfos[0].RenderTarget.TextureSlice.Rectangle.ToRefresh(),
|
renderArea.ToRefresh(),
|
||||||
pColorAttachmentInfos,
|
pColorAttachmentInfos,
|
||||||
(uint) colorAttachmentInfos.Length,
|
(uint) colorAttachmentInfos.Length,
|
||||||
&refreshDepthStencilAttachmentInfo
|
&refreshDepthStencilAttachmentInfo
|
||||||
|
@ -650,126 +654,19 @@ namespace MoonWorks.Graphics
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prepares a texture to be presented to a window.
|
/// Acquires a swapchain texture.
|
||||||
/// This particular variant of this method will present to the entire window area.
|
/// This texture will be presented to the given window when the command buffer is submitted.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="texture">The texture to present.</param>
|
public Texture AcquireSwapchainTexture(
|
||||||
/// <param name="filter">The filter to use when the texture size differs from the window size.</param>
|
|
||||||
public void QueuePresent(
|
|
||||||
Texture texture,
|
|
||||||
Filter filter,
|
|
||||||
Window window
|
Window window
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var refreshTextureSlice = new Refresh.TextureSlice
|
return new Texture(
|
||||||
{
|
Device,
|
||||||
texture = texture.Handle,
|
Refresh.Refresh_AcquireSwapchainTexture(Device.Handle, Handle, window.Handle),
|
||||||
rectangle = new Refresh.Rect
|
(TextureFormat) Refresh.Refresh_GetSwapchainFormat(Device.Handle, window.Handle),
|
||||||
{
|
window.Width,
|
||||||
x = 0,
|
window.Height
|
||||||
y = 0,
|
|
||||||
w = (int) texture.Width,
|
|
||||||
h = (int) texture.Height
|
|
||||||
},
|
|
||||||
layer = 0,
|
|
||||||
level = 0,
|
|
||||||
depth = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
Refresh.Refresh_QueuePresent(
|
|
||||||
Device.Handle,
|
|
||||||
Handle,
|
|
||||||
refreshTextureSlice,
|
|
||||||
IntPtr.Zero,
|
|
||||||
(Refresh.Filter) filter,
|
|
||||||
window.Handle
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prepares a texture slice to be presented to a window.
|
|
||||||
/// This particular variant of this method will present to the entire window area.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="textureSlice">The texture slice to present.</param>
|
|
||||||
/// <param name="filter">The filter to use when the texture size differs from the window size.</param>
|
|
||||||
public void QueuePresent(
|
|
||||||
in TextureSlice textureSlice,
|
|
||||||
Filter filter,
|
|
||||||
Window window
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Refresh.Refresh_QueuePresent(
|
|
||||||
Device.Handle,
|
|
||||||
Handle,
|
|
||||||
textureSlice.ToRefreshTextureSlice(),
|
|
||||||
IntPtr.Zero,
|
|
||||||
(Refresh.Filter) filter,
|
|
||||||
window.Handle
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prepares a texture to be presented to a window.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="texture">The texture to present.</param>
|
|
||||||
/// <param name="destinationRectangle">The area of the window to present to.</param>
|
|
||||||
/// <param name="filter">The filter to use when the texture size differs from the destination rectangle.</param>
|
|
||||||
public void QueuePresent(
|
|
||||||
in Texture texture,
|
|
||||||
in Rect destinationRectangle,
|
|
||||||
Filter filter,
|
|
||||||
Window window
|
|
||||||
)
|
|
||||||
{
|
|
||||||
var refreshRect = destinationRectangle.ToRefresh();
|
|
||||||
var refreshTextureSlice = new Refresh.TextureSlice
|
|
||||||
{
|
|
||||||
texture = texture.Handle,
|
|
||||||
rectangle = new Refresh.Rect
|
|
||||||
{
|
|
||||||
x = 0,
|
|
||||||
y = 0,
|
|
||||||
w = (int) texture.Width,
|
|
||||||
h = (int) texture.Height
|
|
||||||
},
|
|
||||||
layer = 0,
|
|
||||||
level = 0,
|
|
||||||
depth = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
Refresh.Refresh_QueuePresent(
|
|
||||||
Device.Handle,
|
|
||||||
Handle,
|
|
||||||
refreshTextureSlice,
|
|
||||||
refreshRect,
|
|
||||||
(Refresh.Filter) filter,
|
|
||||||
window.Handle
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prepares a texture slice to be presented to a window.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="textureSlice">The texture slice to present.</param>
|
|
||||||
/// <param name="destinationRectangle">The area of the window to present to.</param>
|
|
||||||
/// <param name="filter">The filter to use when the texture size differs from the destination rectangle.</param>
|
|
||||||
public void QueuePresent(
|
|
||||||
in TextureSlice textureSlice,
|
|
||||||
in Rect destinationRectangle,
|
|
||||||
Filter filter,
|
|
||||||
Window window
|
|
||||||
)
|
|
||||||
{
|
|
||||||
var refreshTextureSlice = textureSlice.ToRefreshTextureSlice();
|
|
||||||
var refreshRect = destinationRectangle.ToRefresh();
|
|
||||||
|
|
||||||
Refresh.Refresh_QueuePresent(
|
|
||||||
Device.Handle,
|
|
||||||
Handle,
|
|
||||||
refreshTextureSlice,
|
|
||||||
refreshRect,
|
|
||||||
(Refresh.Filter) filter,
|
|
||||||
window.Handle
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ namespace MoonWorks.Graphics
|
||||||
public enum TextureFormat
|
public enum TextureFormat
|
||||||
{
|
{
|
||||||
R8G8B8A8,
|
R8G8B8A8,
|
||||||
|
B8G8R8A8,
|
||||||
R5G6B5,
|
R5G6B5,
|
||||||
A1R5G5B5,
|
A1R5G5B5,
|
||||||
B4G4R4A4,
|
B4G4R4A4,
|
||||||
|
|
|
@ -148,7 +148,11 @@ namespace MoonWorks.Graphics
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public struct ColorAttachmentInfo
|
public struct ColorAttachmentInfo
|
||||||
{
|
{
|
||||||
public RenderTarget RenderTarget;
|
public Texture Texture;
|
||||||
|
public uint Depth;
|
||||||
|
public uint Layer;
|
||||||
|
public uint Level;
|
||||||
|
public SampleCount SampleCount;
|
||||||
public Color ClearColor;
|
public Color ClearColor;
|
||||||
public LoadOp LoadOp;
|
public LoadOp LoadOp;
|
||||||
public StoreOp StoreOp;
|
public StoreOp StoreOp;
|
||||||
|
@ -157,7 +161,11 @@ namespace MoonWorks.Graphics
|
||||||
{
|
{
|
||||||
return new Refresh.ColorAttachmentInfo
|
return new Refresh.ColorAttachmentInfo
|
||||||
{
|
{
|
||||||
renderTarget = RenderTarget.Handle,
|
texture = Texture.Handle,
|
||||||
|
depth = Depth,
|
||||||
|
layer = Layer,
|
||||||
|
level = Level,
|
||||||
|
sampleCount = (Refresh.SampleCount) SampleCount,
|
||||||
clearColor = new Refresh.Vec4
|
clearColor = new Refresh.Vec4
|
||||||
{
|
{
|
||||||
x = ClearColor.R / 255f,
|
x = ClearColor.R / 255f,
|
||||||
|
@ -174,8 +182,11 @@ namespace MoonWorks.Graphics
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public struct DepthStencilAttachmentInfo
|
public struct DepthStencilAttachmentInfo
|
||||||
{
|
{
|
||||||
public RenderTarget DepthStencilTarget;
|
public Texture Texture;
|
||||||
public DepthStencilValue DepthStencilValue;
|
public uint Depth;
|
||||||
|
public uint Layer;
|
||||||
|
public uint Level;
|
||||||
|
public DepthStencilValue DepthStencilClearValue;
|
||||||
public LoadOp LoadOp;
|
public LoadOp LoadOp;
|
||||||
public StoreOp StoreOp;
|
public StoreOp StoreOp;
|
||||||
public LoadOp StencilLoadOp;
|
public LoadOp StencilLoadOp;
|
||||||
|
@ -185,8 +196,11 @@ namespace MoonWorks.Graphics
|
||||||
{
|
{
|
||||||
return new Refresh.DepthStencilAttachmentInfo
|
return new Refresh.DepthStencilAttachmentInfo
|
||||||
{
|
{
|
||||||
depthStencilTarget = DepthStencilTarget.Handle,
|
texture = Texture.Handle,
|
||||||
depthStencilValue = DepthStencilValue.ToRefresh(),
|
depth = Depth,
|
||||||
|
layer = Layer,
|
||||||
|
level = Level,
|
||||||
|
depthStencilClearValue = DepthStencilClearValue.ToRefresh(),
|
||||||
loadOp = (Refresh.LoadOp) LoadOp,
|
loadOp = (Refresh.LoadOp) LoadOp,
|
||||||
storeOp = (Refresh.StoreOp) StoreOp,
|
storeOp = (Refresh.StoreOp) StoreOp,
|
||||||
stencilLoadOp = (Refresh.LoadOp) StencilLoadOp,
|
stencilLoadOp = (Refresh.LoadOp) StencilLoadOp,
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
using System;
|
|
||||||
using RefreshCS;
|
|
||||||
|
|
||||||
namespace MoonWorks.Graphics
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// A render target is a structure that wraps a texture so that it can be rendered to.
|
|
||||||
/// </summary>
|
|
||||||
public class RenderTarget : GraphicsResource
|
|
||||||
{
|
|
||||||
public TextureSlice TextureSlice { get; }
|
|
||||||
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;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Creates a render target backed by a texture.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="device">An initialized GraphicsDevice.</param>
|
|
||||||
/// <param name="width">The width of the render target.</param>
|
|
||||||
/// <param name="height">The height of the render target.</param>
|
|
||||||
/// <param name="format">The format of the render target.</param>
|
|
||||||
/// <param name="canBeSampled">Whether the render target can be used by a sampler.</param>
|
|
||||||
/// <param name="sampleCount">The multisample count of the render target.</param>
|
|
||||||
/// <param name="levelCount">The mip level of the render target.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static RenderTarget CreateBackedRenderTarget(
|
|
||||||
GraphicsDevice device,
|
|
||||||
uint width,
|
|
||||||
uint height,
|
|
||||||
TextureFormat format,
|
|
||||||
bool canBeSampled,
|
|
||||||
SampleCount sampleCount = SampleCount.One,
|
|
||||||
uint levelCount = 1
|
|
||||||
)
|
|
||||||
{
|
|
||||||
TextureUsageFlags flags = 0;
|
|
||||||
|
|
||||||
if (
|
|
||||||
format == TextureFormat.D16 ||
|
|
||||||
format == TextureFormat.D32 ||
|
|
||||||
format == TextureFormat.D16S8 ||
|
|
||||||
format == TextureFormat.D32S8
|
|
||||||
)
|
|
||||||
{
|
|
||||||
flags |= TextureUsageFlags.DepthStencilTarget;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
flags |= TextureUsageFlags.ColorTarget;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (canBeSampled)
|
|
||||||
{
|
|
||||||
flags |= TextureUsageFlags.Sampler;
|
|
||||||
}
|
|
||||||
|
|
||||||
var texture = Texture.CreateTexture2D(
|
|
||||||
device,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
format,
|
|
||||||
flags,
|
|
||||||
sampleCount,
|
|
||||||
levelCount
|
|
||||||
);
|
|
||||||
|
|
||||||
return new RenderTarget(device, new TextureSlice(texture), sampleCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Creates a render target using a texture slice and an optional sample count.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="device">An initialized GraphicsDevice.</param>
|
|
||||||
/// <param name="textureSlice">The texture slice that will be rendered to.</param>
|
|
||||||
/// <param name="sampleCount">The desired multisample count of the render target.</param>
|
|
||||||
public RenderTarget(
|
|
||||||
GraphicsDevice device,
|
|
||||||
in TextureSlice textureSlice,
|
|
||||||
SampleCount sampleCount = SampleCount.One
|
|
||||||
) : base(device)
|
|
||||||
{
|
|
||||||
Handle = Refresh.Refresh_CreateRenderTarget(
|
|
||||||
device.Handle,
|
|
||||||
textureSlice.ToRefreshTextureSlice(),
|
|
||||||
(Refresh.SampleCount) sampleCount
|
|
||||||
);
|
|
||||||
TextureSlice = textureSlice;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -56,11 +56,16 @@ namespace MoonWorks.Graphics
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe static void SavePNG(string path, int width, int height, byte[] pixels)
|
public unsafe static void SavePNG(string path, int width, int height, TextureFormat format, byte[] pixels)
|
||||||
{
|
{
|
||||||
|
if (format != TextureFormat.R8G8B8A8 && format != TextureFormat.B8G8R8A8)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Texture format must be RGBA8 or BGRA8!", "format");
|
||||||
|
}
|
||||||
|
|
||||||
fixed (byte* ptr = &pixels[0])
|
fixed (byte* ptr = &pixels[0])
|
||||||
{
|
{
|
||||||
Refresh.Refresh_Image_SavePNG(path, width, height, (IntPtr) ptr);
|
Refresh.Refresh_Image_SavePNG(path, width, height, Conversions.BoolToByte(format == TextureFormat.B8G8R8A8), (IntPtr) ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,8 +196,28 @@ namespace MoonWorks.Graphics
|
||||||
IsCube = textureCreateInfo.IsCube;
|
IsCube = textureCreateInfo.IsCube;
|
||||||
SampleCount = textureCreateInfo.SampleCount;
|
SampleCount = textureCreateInfo.SampleCount;
|
||||||
LevelCount = textureCreateInfo.LevelCount;
|
LevelCount = textureCreateInfo.LevelCount;
|
||||||
SampleCount = textureCreateInfo.SampleCount;
|
|
||||||
UsageFlags = textureCreateInfo.UsageFlags;
|
UsageFlags = textureCreateInfo.UsageFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used by AcquireSwapchainTexture.
|
||||||
|
internal Texture(
|
||||||
|
GraphicsDevice device,
|
||||||
|
IntPtr handle,
|
||||||
|
TextureFormat format,
|
||||||
|
uint width,
|
||||||
|
uint height
|
||||||
|
) : base(device)
|
||||||
|
{
|
||||||
|
Handle = handle;
|
||||||
|
|
||||||
|
Format = format;
|
||||||
|
Width = width;
|
||||||
|
Height = height;
|
||||||
|
Depth = 1;
|
||||||
|
IsCube = false;
|
||||||
|
SampleCount = SampleCount.One;
|
||||||
|
LevelCount = 1;
|
||||||
|
UsageFlags = TextureUsageFlags.ColorTarget;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue