0.1.5 shipped one d4r/zluda/nvapi64.dll (the gfx1101 build) for all targets, and compat_nvapi_path() preferred it over d4r/nvapi/<arch>/. Nothing on Windows ever set D4R_GPU_ARCH, so on any other GPU NVAPI failed with "No selected gfx1101 device", NGX CUDA init failed, and DLSS stayed unavailable (black frames, no OptiScaler upscaler section). - Select the NVAPI per architecture; never fall back to a shared DLL in a multi-target folder, and report a missing build by name. - The loader and runtime publish D4R_GPU_ARCH and D4R_GPU_LUID for the game's adapter, so NVAPI picks the right device with several GPUs. - nvapi64.dll exports the target it was built for; the runtime refuses a mismatch, and the packager and d4r-check read the same marker. - Release packaging no longer ships d4r/zluda/nvapi64.dll and rejects NVAPI builds for the wrong target, without a marker, or missing. - Move target resolution, device matching and loader choice into gpu_selection.h; regression tests cover all 11 targets, bad or missing D4R_GPU_ARCH, mixed installs, multi-GPU and missing files. - d4r-check: accept the FSR keys in the shipped d4r.ini.
21 lines
871 B
C++
21 lines
871 B
C++
#pragma once
|
|
// Publishes the GPU the game renders on to the rest of the process. The NVAPI
|
|
// compatibility DLL, the NGX core's CUDA initialization and any later shim
|
|
// start from the environment, so the loader and the shim state the adapter's
|
|
// real architecture and LUID before they load them.
|
|
#include "gpu_selection.h"
|
|
#include <windows.h>
|
|
#include <cstdlib>
|
|
|
|
namespace d4r::diag {
|
|
// Updates the OS block (other DLLs, ZLUDA) and the CRT copy that getenv reads.
|
|
inline void set_process_variable(const char* name, const std::string& value) {
|
|
SetEnvironmentVariableA(name, value.c_str());
|
|
_putenv_s(name, value.c_str());
|
|
}
|
|
inline void publish_selected_gpu(const std::string& architecture, const AdapterLuid* luid = nullptr) {
|
|
set_process_variable("D4R_GPU_ARCH", architecture);
|
|
if (luid) set_process_variable("D4R_GPU_LUID", format_luid(*luid));
|
|
}
|
|
}
|