Avalonia - Couple fixes and improvements to vulkan (#3483)
* drop split devices, rebase * add fallback to opengl if vulkan is not available * addressed review * ensure present image references are incremented and decremented when necessary * allow changing vsync for vulkan * fix screenshot on avalonia vulkan * save favorite when toggled * improve sync between popups * use separate devices for each new window * fix crash when closing window * addressed review * don't create the main window with immediate mode * change skia vk delegate to method * update vulkan throwonerror * addressed review
This commit is contained in:
parent
0ec933a615
commit
c8f9292bab
28 changed files with 585 additions and 312 deletions
|
@ -25,6 +25,8 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
private int _width;
|
||||
private int _height;
|
||||
private bool _vsyncEnabled;
|
||||
private bool _vsyncModeChanged;
|
||||
private VkFormat _format;
|
||||
|
||||
public unsafe Window(VulkanRenderer gd, SurfaceKHR surface, PhysicalDevice physicalDevice, Device device)
|
||||
|
@ -47,6 +49,8 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
private void RecreateSwapchain()
|
||||
{
|
||||
_vsyncModeChanged = false;
|
||||
|
||||
for (int i = 0; i < _swapchainImageViews.Length; i++)
|
||||
{
|
||||
_swapchainImageViews[i].Dispose();
|
||||
|
@ -110,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
ImageArrayLayers = 1,
|
||||
PreTransform = capabilities.CurrentTransform,
|
||||
CompositeAlpha = CompositeAlphaFlagsKHR.CompositeAlphaOpaqueBitKhr,
|
||||
PresentMode = ChooseSwapPresentMode(presentModes),
|
||||
PresentMode = ChooseSwapPresentMode(presentModes, _vsyncEnabled),
|
||||
Clipped = true,
|
||||
OldSwapchain = oldSwapchain
|
||||
};
|
||||
|
@ -178,9 +182,9 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
return availableFormats[0];
|
||||
}
|
||||
|
||||
private static PresentModeKHR ChooseSwapPresentMode(PresentModeKHR[] availablePresentModes)
|
||||
private static PresentModeKHR ChooseSwapPresentMode(PresentModeKHR[] availablePresentModes, bool vsyncEnabled)
|
||||
{
|
||||
if (availablePresentModes.Contains(PresentModeKHR.PresentModeImmediateKhr))
|
||||
if (!vsyncEnabled && availablePresentModes.Contains(PresentModeKHR.PresentModeImmediateKhr))
|
||||
{
|
||||
return PresentModeKHR.PresentModeImmediateKhr;
|
||||
}
|
||||
|
@ -188,6 +192,10 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
{
|
||||
return PresentModeKHR.PresentModeMailboxKhr;
|
||||
}
|
||||
else if (availablePresentModes.Contains(PresentModeKHR.PresentModeFifoKhr))
|
||||
{
|
||||
return PresentModeKHR.PresentModeFifoKhr;
|
||||
}
|
||||
else
|
||||
{
|
||||
return PresentModeKHR.PresentModeFifoKhr;
|
||||
|
@ -224,7 +232,8 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
ref nextImage);
|
||||
|
||||
if (acquireResult == Result.ErrorOutOfDateKhr ||
|
||||
acquireResult == Result.SuboptimalKhr)
|
||||
acquireResult == Result.SuboptimalKhr ||
|
||||
_vsyncModeChanged)
|
||||
{
|
||||
RecreateSwapchain();
|
||||
}
|
||||
|
@ -404,6 +413,12 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
// Not needed as we can get the size from the surface.
|
||||
}
|
||||
|
||||
public override void ChangeVSyncMode(bool vsyncEnabled)
|
||||
{
|
||||
_vsyncEnabled = vsyncEnabled;
|
||||
_vsyncModeChanged = true;
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue