From c81ec8c74d093b75f55e8926975d7a42a2eaefb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 20 Apr 2023 00:21:06 +0200 Subject: [PATCH] List Vulkan present modes in system info, show the current one --- Common/GPU/Vulkan/VulkanContext.cpp | 11 ++++++++--- Common/GPU/Vulkan/VulkanContext.h | 12 ++++++++++++ Common/GPU/Vulkan/thin3d_vulkan.cpp | 1 - UI/DevScreens.cpp | 19 ++++++++++++++----- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index d1d2a0c83a..c1531801ca 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -62,7 +62,7 @@ std::string VulkanVendorString(uint32_t vendorId) { } } -const char *PresentModeString(VkPresentModeKHR presentMode) { +const char *VulkanPresentModeToString(VkPresentModeKHR presentMode) { switch (presentMode) { case VK_PRESENT_MODE_IMMEDIATE_KHR: return "IMMEDIATE"; case VK_PRESENT_MODE_MAILBOX_KHR: return "MAILBOX"; @@ -1233,16 +1233,19 @@ bool VulkanContext::InitSwapchain() { surfCapabilities_.maxImageExtent.width, surfCapabilities_.maxImageExtent.height, swapChainExtent_.width, swapChainExtent_.height); + availablePresentModes_.clear(); // TODO: Find a better way to specify the prioritized present mode while being able // to fall back in a sensible way. VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR; std::string modes = ""; for (size_t i = 0; i < presentModeCount; i++) { - modes += PresentModeString(presentModes[i]); + modes += VulkanPresentModeToString(presentModes[i]); if (i != presentModeCount - 1) { modes += ", "; } + availablePresentModes_.push_back(presentModes[i]); } + INFO_LOG(G3D, "Supported present modes: %s", modes.c_str()); for (size_t i = 0; i < presentModeCount; i++) { bool match = false; @@ -1276,7 +1279,7 @@ bool VulkanContext::InitSwapchain() { } INFO_LOG(G3D, "Chosen present mode: %d (%s). numSwapChainImages: %d/%d", - swapchainPresentMode, PresentModeString(swapchainPresentMode), + swapchainPresentMode, VulkanPresentModeToString(swapchainPresentMode), desiredNumberOfSwapChainImages, surfCapabilities_.maxImageCount); // We mostly follow the practices from @@ -1356,6 +1359,8 @@ bool VulkanContext::InitSwapchain() { swap_chain_info.clipped = true; swap_chain_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + presentMode_ = swapchainPresentMode; + // Don't ask for TRANSFER_DST for the swapchain image, we don't use that. // if (surfCapabilities_.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) // swap_chain_info.imageUsage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index 49e6eb96c3..de760b934b 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -375,6 +375,14 @@ public: return surfFormats_; } + VkPresentModeKHR GetPresentMode() const { + return presentMode_; + } + + std::vector GetAvailablePresentModes() const { + return availablePresentModes_; + } + private: bool ChooseQueue(); @@ -462,6 +470,9 @@ private: VkSurfaceCapabilitiesKHR surfCapabilities_{}; std::vector surfFormats_{}; + VkPresentModeKHR presentMode_; + std::vector availablePresentModes_; + std::vector cmdQueue_; VmaAllocator allocator_ = VK_NULL_HANDLE; @@ -487,6 +498,7 @@ bool GLSLtoSPV(const VkShaderStageFlagBits shader_type, const char *sourceCode, const char *VulkanColorSpaceToString(VkColorSpaceKHR colorSpace); const char *VulkanFormatToString(VkFormat format); +const char *VulkanPresentModeToString(VkPresentModeKHR presentMode); std::string FormatDriverVersion(const VkPhysicalDeviceProperties &props); diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index fe1929cd52..47d42c9956 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -1527,7 +1527,6 @@ std::vector VKContext::GetFeatureList() const { AddFeature(features, "geometryShader", available.geometryShader, enabled.geometryShader); AddFeature(features, "depthBounds", available.depthBounds, enabled.depthBounds); AddFeature(features, "depthClamp", available.depthClamp, enabled.depthClamp); - AddFeature(features, "fillModeNonSolid", available.fillModeNonSolid, enabled.fillModeNonSolid); AddFeature(features, "pipelineStatisticsQuery", available.pipelineStatisticsQuery, enabled.pipelineStatisticsQuery); AddFeature(features, "samplerAnisotropy", available.samplerAnisotropy, enabled.samplerAnisotropy); AddFeature(features, "textureCompressionBC", available.textureCompressionBC, enabled.textureCompressionBC); diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index ba1fd9caf2..59feb097de 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -784,20 +784,29 @@ void SystemInfoScreen::CreateViews() { } } } else if (GetGPUBackend() == GPUBackend::VULKAN) { +#if !PPSSPP_PLATFORM(UWP) + // Vulkan specific code here, can't be bothered to abstract. + // OK because of above check. + tabHolder->AddTab(si->T("Vulkan Features"), gpuExtensionsScroll); + VulkanContext *vk = (VulkanContext *)draw->GetNativeObject(Draw::NativeObject::CONTEXT); gpuExtensions->Add(new ItemHeader(si->T("Vulkan Features"))); std::vector features = draw->GetFeatureList(); for (auto &feature : features) { gpuExtensions->Add(new TextView(feature, new LayoutParams(FILL_PARENT, WRAP_CONTENT)))->SetFocusable(true); } - -#if !PPSSPP_PLATFORM(UWP) - // Vulkan specific code here, can't be bothered to abstract. - // OK because of above check. + gpuExtensions->Add(new ItemHeader(si->T("Present Modes"))); + for (auto mode : vk->GetAvailablePresentModes()) { + std::string str = VulkanPresentModeToString(mode); + if (mode == vk->GetPresentMode()) { + str += std::string(" (") + di->T("Current") + ")"; + } + gpuExtensions->Add(new TextView(VulkanPresentModeToString(mode), new LayoutParams(FILL_PARENT, WRAP_CONTENT)))->SetFocusable(true); + } + gpuExtensions->Add(new ItemHeader(si->T("Display Color Formats"))); - VulkanContext *vk = (VulkanContext *)draw->GetNativeObject(Draw::NativeObject::CONTEXT); if (vk) { for (auto &format : vk->SurfaceFormats()) { std::string line = StringFromFormat("%s : %s", VulkanFormatToString(format.format), VulkanColorSpaceToString(format.colorSpace));