swapchain API revision
parent
1a07a71745
commit
d6e0feeecf
|
@ -1 +1 @@
|
||||||
Subproject commit eaed76f4dcc60022b3f10997fb34eb8ead9ae7d7
|
Subproject commit 7c31601ab48ca0ccf3f475193643ca5f652bd509
|
|
@ -13,15 +13,18 @@ namespace MoonWorks.Graphics
|
||||||
public IntPtr Handle { get; }
|
public IntPtr Handle { get; }
|
||||||
|
|
||||||
// some state for debug validation
|
// some state for debug validation
|
||||||
GraphicsPipeline currentGraphicsPipeline = null;
|
GraphicsPipeline currentGraphicsPipeline;
|
||||||
ComputePipeline currentComputePipeline = null;
|
ComputePipeline currentComputePipeline;
|
||||||
bool renderPassActive = false;
|
bool renderPassActive;
|
||||||
|
|
||||||
// called from RefreshDevice
|
// called from RefreshDevice
|
||||||
internal CommandBuffer(GraphicsDevice device, IntPtr handle)
|
internal CommandBuffer(GraphicsDevice device, IntPtr handle)
|
||||||
{
|
{
|
||||||
Device = device;
|
Device = device;
|
||||||
Handle = handle;
|
Handle = handle;
|
||||||
|
currentGraphicsPipeline = null;
|
||||||
|
currentComputePipeline = null;
|
||||||
|
renderPassActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: we can probably use the NativeMemory functions to not have to generate arrays here
|
// FIXME: we can probably use the NativeMemory functions to not have to generate arrays here
|
||||||
|
@ -815,7 +818,7 @@ namespace MoonWorks.Graphics
|
||||||
return new Texture(
|
return new Texture(
|
||||||
Device,
|
Device,
|
||||||
texturePtr,
|
texturePtr,
|
||||||
Device.GetSwapchainFormat(window),
|
window.SwapchainFormat,
|
||||||
width,
|
width,
|
||||||
height
|
height
|
||||||
);
|
);
|
||||||
|
|
|
@ -10,6 +10,9 @@ namespace MoonWorks.Graphics
|
||||||
public IntPtr Handle { get; }
|
public IntPtr Handle { get; }
|
||||||
public Backend Backend { get; }
|
public Backend Backend { get; }
|
||||||
|
|
||||||
|
private uint windowFlags;
|
||||||
|
public SDL2.SDL.SDL_WindowFlags WindowFlags => (SDL2.SDL.SDL_WindowFlags) windowFlags;
|
||||||
|
|
||||||
// Built-in video pipeline
|
// Built-in video pipeline
|
||||||
private ShaderModule VideoVertexShader { get; }
|
private ShaderModule VideoVertexShader { get; }
|
||||||
private ShaderModule VideoFragmentShader { get; }
|
private ShaderModule VideoFragmentShader { get; }
|
||||||
|
@ -20,22 +23,13 @@ namespace MoonWorks.Graphics
|
||||||
private readonly List<WeakReference<GraphicsResource>> resources = new List<WeakReference<GraphicsResource>>();
|
private readonly List<WeakReference<GraphicsResource>> resources = new List<WeakReference<GraphicsResource>>();
|
||||||
|
|
||||||
public GraphicsDevice(
|
public GraphicsDevice(
|
||||||
IntPtr deviceWindowHandle,
|
|
||||||
Backend preferredBackend,
|
Backend preferredBackend,
|
||||||
Refresh.PresentMode presentMode,
|
|
||||||
bool debugMode
|
bool debugMode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Backend = (Backend) Refresh.Refresh_SelectBackend((Refresh.Backend) preferredBackend, out uint flags);
|
Backend = (Backend) Refresh.Refresh_SelectBackend((Refresh.Backend) preferredBackend, out windowFlags);
|
||||||
|
|
||||||
var presentationParameters = new Refresh.PresentationParameters
|
|
||||||
{
|
|
||||||
deviceWindowHandle = deviceWindowHandle,
|
|
||||||
presentMode = presentMode
|
|
||||||
};
|
|
||||||
|
|
||||||
Handle = Refresh.Refresh_CreateDevice(
|
Handle = Refresh.Refresh_CreateDevice(
|
||||||
presentationParameters,
|
|
||||||
Conversions.BoolToByte(debugMode)
|
Conversions.BoolToByte(debugMode)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -60,6 +54,43 @@ namespace MoonWorks.Graphics
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool ClaimWindow(Window window, PresentMode presentMode)
|
||||||
|
{
|
||||||
|
var success = Conversions.ByteToBool(
|
||||||
|
Refresh.Refresh_ClaimWindow(
|
||||||
|
Handle,
|
||||||
|
window.Handle,
|
||||||
|
(Refresh.PresentMode) presentMode
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
window.Claimed = true;
|
||||||
|
window.SwapchainFormat = GetSwapchainFormat(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnclaimWindow(Window window)
|
||||||
|
{
|
||||||
|
Refresh.Refresh_UnclaimWindow(
|
||||||
|
Handle,
|
||||||
|
window.Handle
|
||||||
|
);
|
||||||
|
window.Claimed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPresentMode(Window window, PresentMode presentMode)
|
||||||
|
{
|
||||||
|
Refresh.Refresh_SetSwapchainPresentMode(
|
||||||
|
Handle,
|
||||||
|
window.Handle,
|
||||||
|
(Refresh.PresentMode) presentMode
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public CommandBuffer AcquireCommandBuffer()
|
public CommandBuffer AcquireCommandBuffer()
|
||||||
{
|
{
|
||||||
return new CommandBuffer(this, Refresh.Refresh_AcquireCommandBuffer(Handle, 0));
|
return new CommandBuffer(this, Refresh.Refresh_AcquireCommandBuffer(Handle, 0));
|
||||||
|
@ -86,7 +117,7 @@ namespace MoonWorks.Graphics
|
||||||
Refresh.Refresh_Wait(Handle);
|
Refresh.Refresh_Wait(Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextureFormat GetSwapchainFormat(Window window)
|
private TextureFormat GetSwapchainFormat(Window window)
|
||||||
{
|
{
|
||||||
return (TextureFormat) Refresh.Refresh_GetSwapchainFormat(Handle, window.Handle);
|
return (TextureFormat) Refresh.Refresh_GetSwapchainFormat(Handle, window.Handle);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using SDL2;
|
using SDL2;
|
||||||
|
|
||||||
namespace MoonWorks
|
namespace MoonWorks
|
||||||
|
@ -10,29 +11,32 @@ namespace MoonWorks
|
||||||
public uint Width { get; private set; }
|
public uint Width { get; private set; }
|
||||||
public uint Height { get; private set; }
|
public uint Height { get; private set; }
|
||||||
|
|
||||||
|
public bool Claimed { get; internal set; }
|
||||||
|
public MoonWorks.Graphics.TextureFormat SwapchainFormat { get; internal set; }
|
||||||
|
|
||||||
private bool IsDisposed;
|
private bool IsDisposed;
|
||||||
|
|
||||||
public Window(WindowCreateInfo windowCreateInfo)
|
private static Dictionary<uint, Window> idLookup = new Dictionary<uint, Window>();
|
||||||
{
|
|
||||||
var windowFlags = SDL.SDL_WindowFlags.SDL_WINDOW_VULKAN;
|
|
||||||
|
|
||||||
|
public Window(WindowCreateInfo windowCreateInfo, SDL.SDL_WindowFlags flags)
|
||||||
|
{
|
||||||
if (windowCreateInfo.ScreenMode == ScreenMode.Fullscreen)
|
if (windowCreateInfo.ScreenMode == ScreenMode.Fullscreen)
|
||||||
{
|
{
|
||||||
windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN;
|
flags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN;
|
||||||
}
|
}
|
||||||
else if (windowCreateInfo.ScreenMode == ScreenMode.BorderlessWindow)
|
else if (windowCreateInfo.ScreenMode == ScreenMode.BorderlessWindow)
|
||||||
{
|
{
|
||||||
windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP;
|
flags |= SDL.SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (windowCreateInfo.SystemResizable)
|
if (windowCreateInfo.SystemResizable)
|
||||||
{
|
{
|
||||||
windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_RESIZABLE;
|
flags |= SDL.SDL_WindowFlags.SDL_WINDOW_RESIZABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (windowCreateInfo.StartMaximized)
|
if (windowCreateInfo.StartMaximized)
|
||||||
{
|
{
|
||||||
windowFlags |= SDL.SDL_WindowFlags.SDL_WINDOW_MAXIMIZED;
|
flags |= SDL.SDL_WindowFlags.SDL_WINDOW_MAXIMIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScreenMode = windowCreateInfo.ScreenMode;
|
ScreenMode = windowCreateInfo.ScreenMode;
|
||||||
|
@ -43,11 +47,13 @@ namespace MoonWorks
|
||||||
SDL.SDL_WINDOWPOS_UNDEFINED,
|
SDL.SDL_WINDOWPOS_UNDEFINED,
|
||||||
(int) windowCreateInfo.WindowWidth,
|
(int) windowCreateInfo.WindowWidth,
|
||||||
(int) windowCreateInfo.WindowHeight,
|
(int) windowCreateInfo.WindowHeight,
|
||||||
windowFlags
|
flags
|
||||||
);
|
);
|
||||||
|
|
||||||
Width = windowCreateInfo.WindowWidth;
|
Width = windowCreateInfo.WindowWidth;
|
||||||
Height = windowCreateInfo.WindowHeight;
|
Height = windowCreateInfo.WindowHeight;
|
||||||
|
|
||||||
|
idLookup.Add(SDL.SDL_GetWindowID(Handle), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ChangeScreenMode(ScreenMode screenMode)
|
public void ChangeScreenMode(ScreenMode screenMode)
|
||||||
|
@ -81,6 +87,11 @@ namespace MoonWorks
|
||||||
Height = height;
|
Height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static Window Lookup(uint windowID)
|
||||||
|
{
|
||||||
|
return idLookup.ContainsKey(windowID) ? idLookup[windowID] : null;
|
||||||
|
}
|
||||||
|
|
||||||
internal void SizeChanged(uint width, uint height)
|
internal void SizeChanged(uint width, uint height)
|
||||||
{
|
{
|
||||||
Width = width;
|
Width = width;
|
||||||
|
@ -96,6 +107,7 @@ namespace MoonWorks
|
||||||
// dispose managed state (managed objects)
|
// dispose managed state (managed objects)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
idLookup.Remove(SDL.SDL_GetWindowID(Handle));
|
||||||
SDL.SDL_DestroyWindow(Handle);
|
SDL.SDL_DestroyWindow(Handle);
|
||||||
|
|
||||||
IsDisposed = true;
|
IsDisposed = true;
|
||||||
|
|
Loading…
Reference in New Issue