mirror of https://github.com/snes9xgit/snes9x.git
vulkan: Remove waiting extensions.
I guess these aren't widely supported.
This commit is contained in:
parent
15ae9de25b
commit
645a4712e7
|
@ -245,26 +245,6 @@ bool Context::init_device(int preferred_device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<const char *> present_wait_extensions =
|
|
||||||
{
|
|
||||||
VK_KHR_PRESENT_ID_EXTENSION_NAME,
|
|
||||||
VK_KHR_PRESENT_WAIT_EXTENSION_NAME
|
|
||||||
};
|
|
||||||
|
|
||||||
if (check_extensions(present_wait_extensions, physical_device))
|
|
||||||
{
|
|
||||||
for (auto &ext : present_wait_extensions)
|
|
||||||
required_extensions.push_back(ext);
|
|
||||||
supports_VK_KHR_present_wait = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
supports_VK_KHR_present_wait = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto extension_properties = physical_device.enumerateDeviceExtensionProperties().value;
|
|
||||||
physical_device.getProperties(&physical_device_props);
|
|
||||||
|
|
||||||
graphics_queue_family_index = find_graphics_queue(physical_device);
|
graphics_queue_family_index = find_graphics_queue(physical_device);
|
||||||
if (graphics_queue_family_index == UINT32_MAX)
|
if (graphics_queue_family_index == UINT32_MAX)
|
||||||
return false;
|
return false;
|
||||||
|
@ -273,14 +253,6 @@ bool Context::init_device(int preferred_device)
|
||||||
vk::DeviceQueueCreateInfo dqci({}, graphics_queue_family_index, priorities);
|
vk::DeviceQueueCreateInfo dqci({}, graphics_queue_family_index, priorities);
|
||||||
vk::DeviceCreateInfo dci({}, dqci, {}, required_extensions);
|
vk::DeviceCreateInfo dci({}, dqci, {}, required_extensions);
|
||||||
|
|
||||||
vk::PhysicalDevicePresentWaitFeaturesKHR physical_device_present_wait_feature(true);
|
|
||||||
vk::PhysicalDevicePresentIdFeaturesKHR physical_device_present_id_feature(true);
|
|
||||||
if (supports_VK_KHR_present_wait)
|
|
||||||
{
|
|
||||||
dci.setPNext(&physical_device_present_wait_feature);
|
|
||||||
physical_device_present_wait_feature.setPNext(&physical_device_present_id_feature);
|
|
||||||
}
|
|
||||||
|
|
||||||
device = physical_device.createDevice(dci).value;
|
device = physical_device.createDevice(dci).value;
|
||||||
queue = device.getQueue(graphics_queue_family_index, 0);
|
queue = device.getQueue(graphics_queue_family_index, 0);
|
||||||
|
|
||||||
|
|
|
@ -51,8 +51,6 @@ class Context
|
||||||
vk::PhysicalDeviceProperties physical_device_props;
|
vk::PhysicalDeviceProperties physical_device_props;
|
||||||
vk::UniqueSurfaceKHR surface;
|
vk::UniqueSurfaceKHR surface;
|
||||||
|
|
||||||
bool supports_VK_KHR_present_wait = false;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool init_vma();
|
bool init_vma();
|
||||||
bool init_device(int preferred_device = 0);
|
bool init_device(int preferred_device = 0);
|
||||||
|
|
|
@ -22,7 +22,12 @@ Swapchain::~Swapchain()
|
||||||
|
|
||||||
void Swapchain::set_vsync(bool new_setting)
|
void Swapchain::set_vsync(bool new_setting)
|
||||||
{
|
{
|
||||||
vsync = new_setting;
|
if (vsync != new_setting)
|
||||||
|
{
|
||||||
|
vsync = new_setting;
|
||||||
|
if (swapchain_object)
|
||||||
|
recreate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Swapchain::on_render_pass_end(std::function<void ()> function)
|
void Swapchain::on_render_pass_end(std::function<void ()> function)
|
||||||
|
@ -80,7 +85,6 @@ bool Swapchain::recreate(int new_width, int new_height)
|
||||||
if (swapchain_object)
|
if (swapchain_object)
|
||||||
{
|
{
|
||||||
device.waitIdle();
|
device.waitIdle();
|
||||||
wait_on_frames();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return create(num_swapchain_images, new_width, new_height);
|
return create(num_swapchain_images, new_width, new_height);
|
||||||
|
@ -269,8 +273,6 @@ bool Swapchain::create_resources()
|
||||||
.setLayers(1)
|
.setLayers(1)
|
||||||
.setRenderPass(render_pass.get());
|
.setRenderPass(render_pass.get());
|
||||||
image.framebuffer = device.createFramebufferUnique(framebuffer_create_info).value;
|
image.framebuffer = device.createFramebufferUnique(framebuffer_create_info).value;
|
||||||
|
|
||||||
image.fence = device.createFenceUnique(fence_create_info).value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
current_swapchain_image = 0;
|
current_swapchain_image = 0;
|
||||||
|
@ -350,25 +352,6 @@ bool Swapchain::swap()
|
||||||
.setSwapchains(swapchain_object.get())
|
.setSwapchains(swapchain_object.get())
|
||||||
.setImageIndices(current_swapchain_image);
|
.setImageIndices(current_swapchain_image);
|
||||||
|
|
||||||
vk::SwapchainPresentModeInfoEXT present_mode_info;
|
|
||||||
auto present_mode = get_present_mode();
|
|
||||||
present_mode_info.setPresentModes(present_mode);
|
|
||||||
|
|
||||||
auto &present_fence = image_data[current_swapchain_image].fence.get();
|
|
||||||
device.resetFences(present_fence);
|
|
||||||
vk::SwapchainPresentFenceInfoEXT present_fence_info(present_fence);
|
|
||||||
|
|
||||||
present_info.setPNext(&present_mode_info);
|
|
||||||
present_mode_info.setPNext(&present_fence_info);
|
|
||||||
|
|
||||||
vk::PresentIdKHR present_id;
|
|
||||||
if (context.supports_VK_KHR_present_wait)
|
|
||||||
{
|
|
||||||
presentation_id++;
|
|
||||||
present_id.setPresentIds(presentation_id);
|
|
||||||
present_fence_info.setPNext(&present_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
vk::Result result = queue.presentKHR(present_info);
|
vk::Result result = queue.presentKHR(present_info);
|
||||||
if (result == vk::Result::eErrorOutOfDateKHR)
|
if (result == vk::Result::eErrorOutOfDateKHR)
|
||||||
{
|
{
|
||||||
|
@ -425,27 +408,6 @@ void Swapchain::end_render_pass()
|
||||||
get_cmd().endRenderPass();
|
get_cmd().endRenderPass();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Swapchain::wait_on_frame(int frame_num)
|
|
||||||
{
|
|
||||||
auto result = device.waitForFences({ image_data[frame_num].fence.get() }, true, 33000000);
|
|
||||||
return (result == vk::Result::eSuccess);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Swapchain::wait_on_frames()
|
|
||||||
{
|
|
||||||
for (auto i = 0; i < image_data.size(); i++)
|
|
||||||
wait_on_frame(i);
|
|
||||||
|
|
||||||
if (context.supports_VK_KHR_present_wait)
|
|
||||||
{
|
|
||||||
auto result = device.waitForPresentKHR(swapchain_object.get(), presentation_id, 16666666);
|
|
||||||
if (result != vk::Result::eSuccess)
|
|
||||||
{
|
|
||||||
printf("Error waiting on present: %s\n", vk::to_string(result).c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vk::Extent2D Swapchain::get_extents()
|
vk::Extent2D Swapchain::get_extents()
|
||||||
{
|
{
|
||||||
return extents;
|
return extents;
|
||||||
|
|
|
@ -20,11 +20,9 @@ class Swapchain
|
||||||
bool begin_frame();
|
bool begin_frame();
|
||||||
void begin_render_pass();
|
void begin_render_pass();
|
||||||
void end_render_pass();
|
void end_render_pass();
|
||||||
bool wait_on_frame(int frame_num);
|
|
||||||
bool end_frame();
|
bool end_frame();
|
||||||
void end_frame_without_swap();
|
void end_frame_without_swap();
|
||||||
bool swap();
|
bool swap();
|
||||||
void wait_on_frames();
|
|
||||||
void set_vsync(bool on);
|
void 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; }
|
||||||
|
@ -51,7 +49,6 @@ class Swapchain
|
||||||
struct ImageData
|
struct ImageData
|
||||||
{
|
{
|
||||||
vk::Image image;
|
vk::Image image;
|
||||||
vk::UniqueFence fence;
|
|
||||||
vk::UniqueImageView image_view;
|
vk::UniqueImageView image_view;
|
||||||
vk::UniqueFramebuffer framebuffer;
|
vk::UniqueFramebuffer framebuffer;
|
||||||
};
|
};
|
||||||
|
|
|
@ -179,6 +179,8 @@ void EmuCanvasVulkan::draw()
|
||||||
if (!window->isVisible())
|
if (!window->isVisible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
context->swapchain->set_vsync(config->enable_vsync);
|
||||||
|
|
||||||
if (S9xImGuiDraw(width() * devicePixelRatioF(), height() * devicePixelRatioF()))
|
if (S9xImGuiDraw(width() * devicePixelRatioF(), height() * devicePixelRatioF()))
|
||||||
{
|
{
|
||||||
auto draw_data = ImGui::GetDrawData();
|
auto draw_data = ImGui::GetDrawData();
|
||||||
|
@ -203,11 +205,10 @@ void EmuCanvasVulkan::draw()
|
||||||
if (retval)
|
if (retval)
|
||||||
{
|
{
|
||||||
throttle();
|
throttle();
|
||||||
context->swapchain->set_vsync(config->enable_vsync);
|
|
||||||
context->swapchain->swap();
|
context->swapchain->swap();
|
||||||
if (config->reduce_input_lag)
|
if (config->reduce_input_lag)
|
||||||
{
|
{
|
||||||
context->swapchain->wait_on_frames();
|
context->wait_idle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue