Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -497,10 +497,13 @@ Because comma is also used as option delimiter and needs to be escaped for value

### Vulkan Vsync

- `0` = Adaptive VSync (FIFO_RELAXED_KHR)
- `0` = Adaptive VSync (FIFO_RELAXED_KHR) (Tear-free when keeping pace, tears on missed Vblanks to minimize latency.)
- `1` = Off (IMMEDIATE_KHR)
- `2` = Mailbox (VSync with uncapped FPS) (MAILBOX_KHR)
- `2` = Mailbox (MAILBOX_KHR) (VSync with uncapped FPS. Tear-free, low latency, no pacing guarantees.)
- `3` = On (FIFO_KHR)
- `4` = (SHARED_DEMAND_REFRESH_KHR) (Shared image update, demand-driven refresh. Tearing, low-latency, no pacing guarantees. Rarely used.)
- `5` = (SHARED_CONTINUOUS_REFRESH_KHR) (Shared image update, continuous refresh. Tearing, low-latency, no pacing guarantees. Rarely used.)
- `6` = FIFO Latest Ready (FIFO_LATEST_READY_KHR) (VSync with uncapped FPS. Tear-free, low latency, improved pacing versus MAILBOX_KHR.)

Not all vulkan vsync options may be supported on your device, you can check what your device supports here [vulkan.gpuinfo.org](https://vulkan.gpuinfo.org/listsurfacepresentmodes.php?platform=linux)

Expand Down
2 changes: 1 addition & 1 deletion src/hud_elements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1713,7 +1713,7 @@ void HudElements::present_mode() {
ImguiNextColumnOrNewRow();


right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width * 1.5f, "%s\n", HUDElements.get_present_mode().c_str());
right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width * 1.75f, "%s\n", HUDElements.get_present_mode().c_str());

ImGui::PopFont();
}
Expand Down
8 changes: 5 additions & 3 deletions src/hud_elements.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,21 +151,23 @@ class HudElements{

void TextColored(ImVec4 col, const char *fmt, ...);

std::array<VkPresentModeKHR, 6> presentModes = {
std::array<VkPresentModeKHR, 7> presentModes = {
VK_PRESENT_MODE_FIFO_RELAXED_KHR,
VK_PRESENT_MODE_IMMEDIATE_KHR,
VK_PRESENT_MODE_MAILBOX_KHR,
VK_PRESENT_MODE_FIFO_KHR,
VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR,
VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR};
VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR,
VK_PRESENT_MODE_FIFO_LATEST_READY_KHR};

std::map<VkPresentModeKHR, std::string> presentModeMap = {
{VK_PRESENT_MODE_IMMEDIATE_KHR, "IMMEDIATE"},
{VK_PRESENT_MODE_MAILBOX_KHR, "MAILBOX"},
{VK_PRESENT_MODE_FIFO_KHR, "FIFO"},
{VK_PRESENT_MODE_FIFO_RELAXED_KHR, "FIFO Relaxed"},
{VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR, "DEMAND"},
{VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, "CONTINUOUS"}
{VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, "CONTINUOUS"},
{VK_PRESENT_MODE_FIFO_LATEST_READY_KHR, "FIFO Latest Ready"},
};

VkPresentModeKHR cur_present_mode;
Expand Down
58 changes: 37 additions & 21 deletions src/vulkan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#ifdef _WIN32
#include <windows.h>
#endif
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
Expand Down Expand Up @@ -1584,13 +1585,19 @@ static VkResult overlay_CreateSwapchainKHR(
struct device_data *device_data = FIND(struct device_data, device);
const auto& params = device_data->instance->params;

if (params.vsync < 4) {
VkPresentModeKHR target_present_mode = HUDElements.presentModes[params.vsync];
if (is_present_mode_supported(device_data->physical_device, createInfo.surface, target_present_mode)) {
createInfo.presentMode = target_present_mode;
}
else {
SPDLOG_WARN("Present mode is not supported: {}", HUDElements.presentModeMap[target_present_mode]);
if ((int)params.vsync != -1) {
if (params.vsync < HUDElements.presentModes.size()) {
VkPresentModeKHR target_present_mode = HUDElements.presentModes[params.vsync];
if (is_present_mode_supported(device_data->physical_device, createInfo.surface, target_present_mode)) {
createInfo.presentMode = target_present_mode;
}
else {
SPDLOG_WARN("Present mode is not supported: {}", HUDElements.presentModeMap[target_present_mode]);
}
} else {
SPDLOG_WARN(
"Ignoring out of range requested present mode: {} of (0 .. {})",
params.vsync, HUDElements.presentModes.size() - 1);
}
}

Expand Down Expand Up @@ -1851,27 +1858,36 @@ static VkResult overlay_CreateDevice(
std::vector<VkExtensionProperties> available_extensions(extension_count);
instance_data->pd_vtable.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extension_count, available_extensions.data());

auto has_extension = [](const auto& list, const char *name) {
return std::any_of(list.begin(), list.end(), [&](const auto& e) {
return e == std::string_view(name);
});
};

bool can_get_driver_info = instance_data->api_version < VK_API_VERSION_1_1 ? false : true;

// VK_KHR_driver_properties became core in 1.2
if (instance_data->api_version < VK_API_VERSION_1_2 && can_get_driver_info) {
for (auto& extension : available_extensions) {
if (extension.extensionName == std::string(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) {
for (auto& enabled : enabled_extensions) {
if (enabled == std::string(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME))
goto DONT;
bool can_get_driver_info = false;

for (auto& extension : available_extensions) {
if (extension.extensionName == std::string_view(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) {
can_get_driver_info = true;
if (instance_data->api_version < VK_API_VERSION_1_2) {
if (!has_extension(enabled_extensions, VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) {
enabled_extensions.push_back(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME);
}
enabled_extensions.push_back(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME);
DONT:
goto FOUND;
}
}
can_get_driver_info = false;
FOUND:;
if (extension.extensionName == std::string_view(VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME)) {
if (!has_extension(enabled_extensions, VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME)) {
enabled_extensions.push_back(VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME);
}
}
}

VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
VkDeviceCreateInfo pCreateInfoPatched = *pCreateInfo;
pCreateInfoPatched.ppEnabledExtensionNames = enabled_extensions.data();
pCreateInfoPatched.enabledExtensionCount = (uint32_t) enabled_extensions.size();

VkResult result = fpCreateDevice(physicalDevice, &pCreateInfoPatched, pAllocator, pDevice);
if (result != VK_SUCCESS) return result;

struct device_data *device_data = new_device_data(*pDevice, instance_data);
Expand Down
15 changes: 15 additions & 0 deletions subprojects/packagefiles/vulkan-headers/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
project(
'vulkan-headers',
'c',
license: 'Apache-2.0',
version: '1.4.345',
meson_version: '>=0.56.0',
)

vulkan_api_xml = files('registry/vk.xml')

vulkan_headers_dep = declare_dependency(
include_directories: include_directories('include'),
)

meson.override_dependency('vulkanheaders', vulkan_headers_dep)
16 changes: 6 additions & 10 deletions subprojects/vulkan-headers.wrap
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
[wrap-file]
directory = Vulkan-Headers-1.3.283
source_url = https://github.com/KhronosGroup/Vulkan-Headers/archive/v1.3.283.tar.gz
source_filename = vulkan-headers-1.3.283.tar.gz
source_hash = a76ff77815012c76abc9811215c2167128a73a697bcc23948e858d1f7dd54a85
patch_filename = vulkan-headers_1.3.283-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/vulkan-headers_1.3.283-1/get_patch
patch_hash = 00e30d35117ae90a19b5b8878746fceaf31b41778b817ca9e6b3ae6063be8233
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/vulkan-headers_1.3.283-1/vulkan-headers-1.3.283.tar.gz
wrapdb_version = 1.3.283-1
directory = Vulkan-Headers-1.4.345
source_url = https://github.com/KhronosGroup/Vulkan-Headers/archive/v1.4.345.tar.gz
source_filename = vulkan-headers-1.4.345.tar.gz
source_hash = 99e19205df172c33229f18b5574c9258bc73ea229ec7d6b04daa357b2430f6c8
patch_directory = vulkan-headers

[provide]
vulkanheaders = vulkan_headers_dep
dependency_names = vulkanheaders