diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index 3923a21dfa..da21bf075f 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -158,7 +158,7 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { #endif #endif - if ((flags_ & VULKAN_FLAG_VALIDATE) && g_Config.sCustomDriver.empty()) { + if ((flags_ & VulkanInitFlags::VALIDATE) && g_Config.sCustomDriver.empty()) { if (IsInstanceExtensionAvailable(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) { // Enable the validation layers for (size_t i = 0; i < ARRAY_SIZE(validationLayers); i++) { @@ -170,7 +170,7 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { INFO_LOG(Log::G3D, "Vulkan debug_utils validation enabled."); } else { ERROR_LOG(Log::G3D, "Validation layer extension not available - not enabling Vulkan validation."); - flags_ &= ~VULKAN_FLAG_VALIDATE; + flags_ &= ~VulkanInitFlags::VALIDATE; } } @@ -509,15 +509,15 @@ bool VulkanContext::CheckLayers(const std::vector &layer_props, return true; } -int VulkanContext::GetPhysicalDeviceByName(const std::string &name) { +int VulkanContext::GetPhysicalDeviceByName(std::string_view name) const { for (size_t i = 0; i < physical_devices_.size(); i++) { - if (physicalDeviceProperties_[i].properties.deviceName == name) + if (equals(physicalDeviceProperties_[i].properties.deviceName, name)) return (int)i; } return -1; } -int VulkanContext::GetBestPhysicalDevice() { +int VulkanContext::GetBestPhysicalDevice() const { // Rules: Prefer discrete over embedded. // Prefer nVidia over Intel. @@ -1375,10 +1375,10 @@ bool VulkanContext::InitSwapchain() { INFO_LOG(Log::G3D, "Supported present modes: %s", modes.c_str()); for (size_t i = 0; i < presentModeCount; i++) { bool match = false; - match = match || ((flags_ & VULKAN_FLAG_PRESENT_MAILBOX) && presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR); - match = match || ((flags_ & VULKAN_FLAG_PRESENT_IMMEDIATE) && presentModes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR); - match = match || ((flags_ & VULKAN_FLAG_PRESENT_FIFO_RELAXED) && presentModes[i] == VK_PRESENT_MODE_FIFO_RELAXED_KHR); - match = match || ((flags_ & VULKAN_FLAG_PRESENT_FIFO) && presentModes[i] == VK_PRESENT_MODE_FIFO_KHR); + match = match || ((flags_ & VulkanInitFlags::PRESENT_MAILBOX) && presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR); + match = match || ((flags_ & VulkanInitFlags::PRESENT_IMMEDIATE) && presentModes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR); + match = match || ((flags_ & VulkanInitFlags::PRESENT_FIFO_RELAXED) && presentModes[i] == VK_PRESENT_MODE_FIFO_RELAXED_KHR); + match = match || ((flags_ & VulkanInitFlags::PRESENT_FIFO) && presentModes[i] == VK_PRESENT_MODE_FIFO_KHR); // Default to the first present mode from the list. if (match || swapchainPresentMode == VK_PRESENT_MODE_MAX_ENUM_KHR) { diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index b5757da0b7..f6ceea7939 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -1,11 +1,14 @@ #pragma once +#include #include #include +#include #include #include #include +#include "Common/Common.h" #include "Common/Log.h" #include "Common/GPU/Vulkan/VulkanLoader.h" #include "Common/GPU/Vulkan/VulkanDebug.h" @@ -20,13 +23,14 @@ #define VK_PROFILE_BEGIN(vulkan, cmd, stage, ...) vulkan->GetProfiler()->Begin(cmd, stage, __VA_ARGS__); #define VK_PROFILE_END(vulkan, cmd, stage) vulkan->GetProfiler()->End(cmd, stage); -enum { - VULKAN_FLAG_VALIDATE = 1, - VULKAN_FLAG_PRESENT_MAILBOX = 2, - VULKAN_FLAG_PRESENT_IMMEDIATE = 4, - VULKAN_FLAG_PRESENT_FIFO_RELAXED = 8, - VULKAN_FLAG_PRESENT_FIFO = 16, +enum class VulkanInitFlags : uint32_t { + VALIDATE = (1 << 0), + PRESENT_MAILBOX = (1 << 1), + PRESENT_IMMEDIATE = (1 << 2), + PRESENT_FIFO_RELAXED = (1 << 3), + PRESENT_FIFO = (1 << 4), }; +ENUM_CLASS_BITOPS(VulkanInitFlags); enum { VULKAN_VENDOR_NVIDIA = 0x000010de, @@ -178,14 +182,14 @@ public: struct CreateInfo { const char *app_name; int app_ver; - uint32_t flags; + VulkanInitFlags flags; }; VkResult CreateInstance(const CreateInfo &info); void DestroyInstance(); - int GetBestPhysicalDevice(); - int GetPhysicalDeviceByName(const std::string &name); + int GetBestPhysicalDevice() const; + int GetPhysicalDeviceByName(std::string_view name) const; // Convenience method to avoid code duplication. // If it returns false, delete the context. @@ -202,8 +206,8 @@ public: VkDevice GetDevice() const { return device_; } VkInstance GetInstance() const { return instance_; } - uint32_t GetFlags() const { return flags_; } - void UpdateFlags(uint32_t flags) { flags_ = flags; } + VulkanInitFlags GetInitFlags() const { return flags_; } + void UpdateInitFlags(VulkanInitFlags flags) { flags_ = flags; } VulkanDeleteList &Delete() { return globalDeleteList_; } @@ -483,7 +487,7 @@ private: // Swap chain extent VkExtent2D swapChainExtent_{}; - int flags_ = 0; + VulkanInitFlags flags_{}; PerfClass devicePerfClass_ = PerfClass::SLOW; int inflightFrames_ = MAX_INFLIGHT_FRAMES; diff --git a/Common/GPU/Vulkan/VulkanImage.cpp b/Common/GPU/Vulkan/VulkanImage.cpp index 67f4a31579..7d7ca3f198 100644 --- a/Common/GPU/Vulkan/VulkanImage.cpp +++ b/Common/GPU/Vulkan/VulkanImage.cpp @@ -79,7 +79,7 @@ bool VulkanTexture::CreateDirect(int w, int h, int depth, int numMips, VkFormat // The graphics debugger always "needs" TRANSFER_SRC but in practice doesn't matter - // unless validation is on. So let's only force it on when being validated, for now. - if (vulkan_->GetFlags() & VULKAN_FLAG_VALIDATE) { + if (vulkan_->GetInitFlags() & VulkanInitFlags::VALIDATE) { image_create_info.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; } VmaAllocationCreateInfo allocCreateInfo{}; diff --git a/Core/Config.h b/Core/Config.h index 4936f2cdb6..03eaef7cb5 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -262,6 +262,7 @@ public: bool bUberShaderFragment; int iDefaultTab; int iScreenshotMode; + bool bProhibitVulkanLayers; std::vector vPostShaderNames; // Off for chain end (only Off for no shader) std::map mPostShaderSetting; diff --git a/SDL/SDLVulkanGraphicsContext.cpp b/SDL/SDLVulkanGraphicsContext.cpp index a581818bdc..ed371fad3f 100644 --- a/SDL/SDLVulkanGraphicsContext.cpp +++ b/SDL/SDLVulkanGraphicsContext.cpp @@ -28,15 +28,15 @@ static const bool g_Validate = false; #endif // TODO: Share this between backends. -static uint32_t FlagsFromConfig() { - uint32_t flags; +static VulkanInitFlags FlagsFromConfig() { + VulkanInitFlags flags; if (g_Config.bVSync) { - flags = VULKAN_FLAG_PRESENT_FIFO; + flags = VulkanInitFlags::PRESENT_FIFO; } else { - flags = VULKAN_FLAG_PRESENT_MAILBOX | VULKAN_FLAG_PRESENT_IMMEDIATE; + flags = VulkanInitFlags::PRESENT_MAILBOX | VulkanInitFlags::PRESENT_IMMEDIATE; } if (g_Validate) { - flags |= VULKAN_FLAG_VALIDATE; + flags |= VulkanInitFlags::VALIDATE; } return flags; } diff --git a/Windows/GPU/WindowsVulkanContext.cpp b/Windows/GPU/WindowsVulkanContext.cpp index cec6f494ca..7f5473212a 100644 --- a/Windows/GPU/WindowsVulkanContext.cpp +++ b/Windows/GPU/WindowsVulkanContext.cpp @@ -67,11 +67,10 @@ static const bool g_validate_ = true; static const bool g_validate_ = false; #endif -static uint32_t FlagsFromConfig() { - uint32_t flags = 0; - flags = g_Config.bVSync ? VULKAN_FLAG_PRESENT_FIFO : VULKAN_FLAG_PRESENT_MAILBOX; +static VulkanInitFlags FlagsFromConfig() { + VulkanInitFlags flags = g_Config.bVSync ? VulkanInitFlags::PRESENT_FIFO : VulkanInitFlags::PRESENT_MAILBOX; if (g_validate_) { - flags |= VULKAN_FLAG_VALIDATE; + flags |= VulkanInitFlags::VALIDATE; } return flags; } @@ -175,7 +174,7 @@ void WindowsVulkanContext::Shutdown() { void WindowsVulkanContext::Resize() { draw_->HandleEvent(Draw::Event::LOST_BACKBUFFER, vulkan_->GetBackbufferWidth(), vulkan_->GetBackbufferHeight()); vulkan_->DestroySwapchain(); - vulkan_->UpdateFlags(FlagsFromConfig()); + vulkan_->UpdateInitFlags(FlagsFromConfig()); vulkan_->InitSwapchain(); draw_->HandleEvent(Draw::Event::GOT_BACKBUFFER, vulkan_->GetBackbufferWidth(), vulkan_->GetBackbufferHeight()); } diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index 804b3cd32e..616f62b763 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -1132,6 +1132,26 @@ true true + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true true @@ -1644,6 +1664,16 @@ true true + + true + true + true + true + true + true + true + true + @@ -1764,4 +1794,4 @@ - + \ No newline at end of file diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index 0b2ea0898d..c76ee2585e 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -580,6 +580,12 @@ Other Platforms\iOS + + Other Platforms\iOS + + + Other Platforms\iOS + @@ -592,12 +598,6 @@ Resource Files - - Resource Files - - - Resource Files - Resource Files @@ -818,6 +818,9 @@ Other Platforms\iOS + + Other Platforms\iOS + @@ -856,4 +859,4 @@ Other Platforms\SDL - + \ No newline at end of file diff --git a/android/jni/AndroidVulkanContext.cpp b/android/jni/AndroidVulkanContext.cpp index f6002bf490..f8c447fc5f 100644 --- a/android/jni/AndroidVulkanContext.cpp +++ b/android/jni/AndroidVulkanContext.cpp @@ -21,15 +21,15 @@ static const bool g_Validate = false; #endif // TODO: Share this between backends. -static uint32_t FlagsFromConfig() { - uint32_t flags; +static VulkanInitFlags FlagsFromConfig() { + VulkanInitFlags flags; if (g_Config.bVSync) { - flags = VULKAN_FLAG_PRESENT_FIFO; + flags = VulkanInitFlags::PRESENT_FIFO; } else { - flags = VULKAN_FLAG_PRESENT_MAILBOX | VULKAN_FLAG_PRESENT_IMMEDIATE; + flags = VulkanInitFlags::PRESENT_MAILBOX | VulkanInitFlags::PRESENT_IMMEDIATE; } if (g_Validate) { - flags |= VULKAN_FLAG_VALIDATE; + flags |= VulkanInitFlags::VALIDATE; } return flags; } diff --git a/ios/ViewControllerMetal.mm b/ios/ViewControllerMetal.mm index f45c2cc43e..22bcf32cba 100644 --- a/ios/ViewControllerMetal.mm +++ b/ios/ViewControllerMetal.mm @@ -29,12 +29,12 @@ // https://www.progressconcepts.com/blog/ios-appdelegate-viewcontroller-method-order/ // TODO: Share this between backends. -static uint32_t FlagsFromConfig() { - uint32_t flags; +static VulkanInitFlags FlagsFromConfig() { + VulkanInitFlags flags; if (g_Config.bVSync) { - flags = VULKAN_FLAG_PRESENT_FIFO; + flags = VulkanInitFlags::PRESENT_FIFO; } else { - flags = VULKAN_FLAG_PRESENT_MAILBOX | VULKAN_FLAG_PRESENT_IMMEDIATE; + flags = VulkanInitFlags::PRESENT_MAILBOX | VulkanInitFlags::PRESENT_IMMEDIATE; } return flags; }