aboutsummaryrefslogtreecommitdiff
path: root/libs/nak/src/dxvk.rs
diff options
context:
space:
mode:
Diffstat (limited to 'libs/nak/src/dxvk.rs')
-rw-r--r--libs/nak/src/dxvk.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/libs/nak/src/dxvk.rs b/libs/nak/src/dxvk.rs
new file mode 100644
index 0000000..97e4222
--- /dev/null
+++ b/libs/nak/src/dxvk.rs
@@ -0,0 +1,71 @@
+//! DXVK configuration management for Fluorine Manager.
+//!
+//! Downloads dxvk.conf from upstream, appends Fluorine-specific settings,
+//! and stores at `~/.var/app/com.fluorine.manager/config/dxvk.conf`.
+
+use std::error::Error;
+use std::fs;
+use std::path::{Path, PathBuf};
+
+use crate::logging::{log_info, log_warning};
+
+const DXVK_CONF_URL: &str =
+ "https://raw.githubusercontent.com/doitsujin/dxvk/master/dxvk.conf";
+
+const DXVK_CUSTOM_SETTINGS: &str = r#"
+# Fluorine Custom Settings
+# Disable Graphics Pipeline Library (can cause issues with modded games)
+dxvk.enableGraphicsPipelineLibrary = False
+"#;
+
+/// Get the path where the DXVK config will be stored.
+pub fn get_dxvk_conf_path() -> PathBuf {
+ let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
+ PathBuf::from(home)
+ .join(".var/app/com.fluorine.manager/config/dxvk.conf")
+}
+
+/// Ensure the dxvk.conf file exists, downloading if necessary.
+///
+/// Returns the path to the config file.
+pub fn ensure_dxvk_conf() -> Result<PathBuf, Box<dyn Error>> {
+ let conf_path = get_dxvk_conf_path();
+
+ // If it already exists, return it
+ if conf_path.exists() {
+ return Ok(conf_path);
+ }
+
+ download_and_create_dxvk_conf(&conf_path)
+}
+
+/// Download the upstream dxvk.conf, append custom settings, and write to `dest`.
+pub fn download_and_create_dxvk_conf(dest: &Path) -> Result<PathBuf, Box<dyn Error>> {
+ // Ensure parent directory exists
+ if let Some(parent) = dest.parent() {
+ fs::create_dir_all(parent)?;
+ }
+
+ log_info("Downloading dxvk.conf from upstream...");
+
+ let upstream_content = match ureq::get(DXVK_CONF_URL).call() {
+ Ok(response) => {
+ let mut body = String::new();
+ response.into_reader().read_to_string(&mut body)?;
+ body
+ }
+ Err(e) => {
+ log_warning(&format!("Failed to download dxvk.conf: {}", e));
+ // Create with just custom settings if download fails
+ String::new()
+ }
+ };
+
+ let full_content = format!("{}\n{}", upstream_content, DXVK_CUSTOM_SETTINGS);
+ fs::write(dest, &full_content)?;
+
+ log_info(&format!("Created dxvk.conf at {:?}", dest));
+ Ok(dest.to_path_buf())
+}
+
+use std::io::Read as _;