swapchain API revision

cosmonaut 2022-09-29 13:57:39 -07:00
parent 1a07a71745
commit d6e0feeecf
4 changed files with 70 additions and 24 deletions

@ -1 +1 @@
Subproject commit eaed76f4dcc60022b3f10997fb34eb8ead9ae7d7 Subproject commit 7c31601ab48ca0ccf3f475193643ca5f652bd509

View File

@ -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
); );

View File

@ -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);
} }

View File

@ -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;