mirror of https://github.com/snes9xgit/snes9x.git
Vulkan: Refactor present modes. Add relaxed.
This commit is contained in:
parent
2e25b70cf0
commit
33e40a8f16
|
@ -92,6 +92,28 @@ vk::Image Swapchain::get_image()
|
||||||
return image_data[current_swapchain_image].image;
|
return image_data[current_swapchain_image].image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static bool vector_find(std::vector<T> haystack, T&& needle)
|
||||||
|
{
|
||||||
|
for (auto &elem : haystack)
|
||||||
|
if (elem == needle)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
vk::PresentModeKHR Swapchain::get_present_mode() {
|
||||||
|
auto present_mode = vk::PresentModeKHR::eFifo;
|
||||||
|
if (supports_relaxed)
|
||||||
|
present_mode = vk::PresentModeKHR::eFifoRelaxed;
|
||||||
|
if (!vsync) {
|
||||||
|
if (supports_mailbox)
|
||||||
|
present_mode = vk::PresentModeKHR::eMailbox;
|
||||||
|
if (supports_immediate)
|
||||||
|
present_mode = vk::PresentModeKHR::eImmediate;
|
||||||
|
}
|
||||||
|
return present_mode;
|
||||||
|
}
|
||||||
|
|
||||||
bool Swapchain::check_and_resize(int width, int height)
|
bool Swapchain::check_and_resize(int width, int height)
|
||||||
{
|
{
|
||||||
vk::SurfaceCapabilitiesKHR surface_capabilities;
|
vk::SurfaceCapabilitiesKHR surface_capabilities;
|
||||||
|
@ -167,21 +189,9 @@ bool Swapchain::create(unsigned int desired_num_swapchain_images, int new_width,
|
||||||
extents.height = surface_capabilities.minImageExtent.height;
|
extents.height = surface_capabilities.minImageExtent.height;
|
||||||
|
|
||||||
auto present_modes = physical_device.getSurfacePresentModesKHR(surface).value;
|
auto present_modes = physical_device.getSurfacePresentModesKHR(surface).value;
|
||||||
supports_mailbox =
|
supports_mailbox = vector_find(present_modes, vk::PresentModeKHR::eMailbox);
|
||||||
std::find(present_modes.begin(), present_modes.end(),
|
supports_immediate = vector_find(present_modes, vk::PresentModeKHR::eImmediate);
|
||||||
vk::PresentModeKHR::eMailbox) != present_modes.end();
|
supports_relaxed = vector_find(present_modes, vk::PresentModeKHR::eFifoRelaxed);
|
||||||
supports_immediate =
|
|
||||||
std::find(present_modes.begin(), present_modes.end(),
|
|
||||||
vk::PresentModeKHR::eImmediate) != present_modes.end();
|
|
||||||
|
|
||||||
auto present_mode = vk::PresentModeKHR::eFifo;
|
|
||||||
if (!vsync)
|
|
||||||
{
|
|
||||||
if (supports_mailbox)
|
|
||||||
present_mode = vk::PresentModeKHR::eMailbox;
|
|
||||||
if (supports_immediate)
|
|
||||||
present_mode = vk::PresentModeKHR::eImmediate;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto swapchain_maintenance_info = vk::SwapchainPresentModesCreateInfoEXT{}
|
auto swapchain_maintenance_info = vk::SwapchainPresentModesCreateInfoEXT{}
|
||||||
.setPresentModes(present_modes);
|
.setPresentModes(present_modes);
|
||||||
|
@ -195,7 +205,7 @@ bool Swapchain::create(unsigned int desired_num_swapchain_images, int new_width,
|
||||||
.setImageUsage(vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc)
|
.setImageUsage(vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc)
|
||||||
.setCompositeAlpha(vk::CompositeAlphaFlagBitsKHR::eOpaque)
|
.setCompositeAlpha(vk::CompositeAlphaFlagBitsKHR::eOpaque)
|
||||||
.setClipped(true)
|
.setClipped(true)
|
||||||
.setPresentMode(present_mode)
|
.setPresentMode(get_present_mode())
|
||||||
.setSurface(surface)
|
.setSurface(surface)
|
||||||
.setPreTransform(vk::SurfaceTransformFlagBitsKHR::eIdentity)
|
.setPreTransform(vk::SurfaceTransformFlagBitsKHR::eIdentity)
|
||||||
.setImageArrayLayers(1)
|
.setImageArrayLayers(1)
|
||||||
|
@ -342,14 +352,7 @@ bool Swapchain::swap()
|
||||||
.setImageIndices(current_swapchain_image);
|
.setImageIndices(current_swapchain_image);
|
||||||
|
|
||||||
vk::SwapchainPresentModeInfoEXT present_mode_info;
|
vk::SwapchainPresentModeInfoEXT present_mode_info;
|
||||||
vk::PresentModeKHR present_mode = vk::PresentModeKHR::eFifo;
|
auto present_mode = get_present_mode();
|
||||||
if (!vsync)
|
|
||||||
{
|
|
||||||
if (supports_mailbox)
|
|
||||||
present_mode = vk::PresentModeKHR::eMailbox;
|
|
||||||
if (supports_immediate)
|
|
||||||
present_mode = vk::PresentModeKHR::eImmediate;
|
|
||||||
}
|
|
||||||
present_mode_info.setPresentModes(present_mode);
|
present_mode_info.setPresentModes(present_mode);
|
||||||
present_info.setPNext(&present_mode_info);
|
present_info.setPNext(&present_mode_info);
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ class Swapchain
|
||||||
bool set_vsync(bool on);
|
bool set_vsync(bool on);
|
||||||
void on_render_pass_end(std::function<void()> function);
|
void on_render_pass_end(std::function<void()> function);
|
||||||
int get_num_frames() { return num_swapchain_images; }
|
int get_num_frames() { return num_swapchain_images; }
|
||||||
|
vk::PresentModeKHR get_present_mode();
|
||||||
|
|
||||||
vk::Image get_image();
|
vk::Image get_image();
|
||||||
vk::Framebuffer get_framebuffer();
|
vk::Framebuffer get_framebuffer();
|
||||||
|
@ -69,6 +70,7 @@ class Swapchain
|
||||||
bool vsync = true;
|
bool vsync = true;
|
||||||
bool supports_immediate = false;
|
bool supports_immediate = false;
|
||||||
bool supports_mailbox = false;
|
bool supports_mailbox = false;
|
||||||
|
bool supports_relaxed = false;
|
||||||
std::vector<Frame> frames;
|
std::vector<Frame> frames;
|
||||||
std::vector<ImageData> image_data;
|
std::vector<ImageData> image_data;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue