diff --git a/src/common/config.cpp b/src/common/config.cpp index 9c842f8b7..77da8a74e 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -71,6 +71,7 @@ static bool separateupdatefolder = false; static bool compatibilityData = false; static bool checkCompatibilityOnStartup = false; static std::string trophyKey; +static std::string ppFilter; // Gui static bool load_game_size = true; @@ -232,6 +233,10 @@ u32 vblankDiv() { return vblankDivider; } +std::string getPostProcessingFilter() { + return ppFilter; +} + bool vkValidationEnabled() { return vkValidation; } @@ -633,6 +638,7 @@ void load(const std::filesystem::path& path) { screenWidth = toml::find_or(gpu, "screenWidth", screenWidth); screenHeight = toml::find_or(gpu, "screenHeight", screenHeight); + ppFilter = toml::find_or(gpu, "ppFilter", "linear"); isNullGpu = toml::find_or(gpu, "nullGpu", false); shouldCopyGPUBuffers = toml::find_or(gpu, "copyGPUBuffers", false); shouldDumpShaders = toml::find_or(gpu, "dumpShaders", false); @@ -747,6 +753,7 @@ void save(const std::filesystem::path& path) { data["Input"]["isMotionControlsEnabled"] = isMotionControlsEnabled; data["GPU"]["screenWidth"] = screenWidth; data["GPU"]["screenHeight"] = screenHeight; + data["GPU"]["ppFilter"] = ppFilter; data["GPU"]["nullGpu"] = isNullGpu; data["GPU"]["copyGPUBuffers"] = shouldCopyGPUBuffers; data["GPU"]["dumpShaders"] = shouldDumpShaders; diff --git a/src/common/config.h b/src/common/config.h index f9e4c2815..1d42109f6 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -44,6 +44,7 @@ bool getIsMotionControlsEnabled(); u32 getScreenWidth(); u32 getScreenHeight(); +std::string getPostProcessingFilter(); s32 getGpuId(); bool debugDump(); diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 36d64a5d5..b45283164 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -278,9 +278,19 @@ void Presenter::CreatePostProcessPipeline() { instance.GetDevice().destroyShaderModule(fs_module); // Create sampler resource + const auto filters = std::unordered_map{ + {"linear", vk::Filter::eLinear}, + {"nearest", vk::Filter::eNearest}, + }; + auto pp_filter = vk::Filter::eLinear; + if (const auto filter = Config::getPostProcessingFilter(); filters.contains(filter)) { + pp_filter = filters.at(filter); + } else { + LOG_WARNING(Render_Vulkan, "Unknown post processing filter: {}", filter); + } const vk::SamplerCreateInfo sampler_ci = { - .magFilter = vk::Filter::eLinear, - .minFilter = vk::Filter::eLinear, + .magFilter = pp_filter, + .minFilter = pp_filter, .mipmapMode = vk::SamplerMipmapMode::eNearest, .addressModeU = vk::SamplerAddressMode::eClampToEdge, .addressModeV = vk::SamplerAddressMode::eClampToEdge,