Repository navigation
Releases
EdgeScale 0.15.1
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[0.15.1] — 2026-11-11
Fixed
-
Infinite Swapchain Recreation Loop Elimination (16:9 on 16:10 / Resolution Mismatch):
- Fixed infinite recreation loop where games running at 16:9 (e.g.
1920x1080in CS2 or CoD4) on 16:10 laptop panels (1920x1200) caused hundreds of swapchain rebuilds per second until Steam minidump handlers (gameoverlayui) crashed the process. - Enforced concrete surface extent precedence in
layer/xfsr_layer.cpp: when the window surface is known (haveSurf),displayW/Hstrictly adheres tosurfW/Hand never inflates to a larger monitor hint. - Aligned
presentWandpresentHtotrueWandtrueHinsidesetupOffloadPipelineto ensure WSI swapchains always match physical surface capabilities. - Added
isRecreationStorm()dampener to bothxfsr_QueuePresentKHRandxfsr_AcquireNextImageKHRto throttle and clamp recreation storms (>3 within 600ms) to the detected extent.
- Fixed infinite recreation loop where games running at 16:9 (e.g.
-
HUD Overlay Layout & Visual Improvements:
- Added adaptive text scaling (
scale=1when width < 900px,scale=2otherwise) incomputeLayout()andrasterizeText(). - Added generous bottom padding (
physicalLines * lineH + startY * 2 + 8) eliminating text descender clipping against the bottom border. - Streamlined overlay status string to prevent awkward mid-token wraps like
(2.0/0x).
- Added adaptive text scaling (
-
Global Hotkey Isolation:
- Ensured
HOTKEYSdefaults to"shift"globally across all execution modes inscripts/edgerun, so bare keys likeF1(vote Yes) orF2(vote No) in CS2 never conflict.
- Ensured
[0.15.0] — 2026-11-10
Fixed
-
In-Game Hotkey Conflict Isolation (CS2 / Competitive Voting & Buy Menu):
- Fixed severe bug where pressing bare
F1(Vote YES / Console),F2(Vote NO),F3(Autobuy) in games like Counter-Strike 2 triggered CrossVulkan swapchain recreation (applyPresetIdxLocked), causing sudden stutters or complete game freezes/crashes. - Changed default hotkey modifier to
Shift(Shift+F1..F6,Shift+F10), strictly ignoring bareF1..F6keypresses during normal gameplay. - Added new hotkey mapping modes via
--hotkeys <shift|alt|ctrl|ctrl_alt|nav|bare|none>and--no-hotkeysinscripts/edgerunandEDGESCALE_HOTKEYS:shift(default):Shift+F1..F6,Shift+F10alt:Alt+F1..F6,Alt+F10ctrl:Ctrl+F1..F6,Ctrl+F10ctrl_alt:Ctrl+Alt+F1..F6,Ctrl+Alt+F10nav: Navigation cluster (Insertpreset,Homemode,PgUpupscaler,Deloffload,End1-way,PgDnfan,Pausepin) avoiding function keys altogethernone: Hotkey listener completely disabled (safest for competitive esports)bare: BareF1..F6(legacy opt-in)
- Automatically enforces modifier isolation in
--competitive/--esportsmode so in-game votes or key binds never trigger layer actions. - Added runtime hotkey switching via control file (
hotkeys <mode>).
- Fixed severe bug where pressing bare
-
HUD Overlay Layout & Automatic Dynamic Sizing:
- Fixed overlay text wrapping and bottom-line clipping where line 1 wrapped (
(2.0/0x)) and line 3 (dGPU... | iGPU...) was cut off at the card bottom. - Implemented
computeLayout()dynamically tracking text dimensions and soft wraps at the exact window/screen width boundary (wrapW), ensuring the card background, border, and swapchain blit rectangle perfectly enclose all rendered lines on any screen resolution. - Increased maximum overlay height allocation
kOhfrom 96px to 160px (supporting up to 6 physical lines with zero truncation). - Streamlined line 1 format strings:
EdgeScale [HYBRID] edge:comp (CAS:0.60) | 960x540 -> 1920x1080 (2.0x). - Added
cleanGpuName()sanitizing long device strings: cleans driver tags and verbose suffixes (e.g.AMD Radeon Vega 10 Graphics (RADV RAVEN)->Vega 10,NVIDIA GeForce GTX 1650 with Max-Q Design->GTX 1650).
- Fixed overlay text wrapping and bottom-line clipping where line 1 wrapped (
[0.14.0] — 2026-11-10
Added
- Hardware Fan Control & Anti-Throttling Engine (
F6Hotkey &--fan):- Integrated asynchronous, non-blocking fan curve control via
nbfc(NoteBook FanControl) and EC controllers inlayer/xfsr_controls.cppandscripts/edgerun. - Added dedicated worker thread (
FanWorker) ensuringnbfccommands never stall or jitter Vulkan present queues. - Added live cycling on hotkey
F6: cyclesAUTO (EC default)->AUTO-OPT (temp-reactive)->BALANCED (75%)->MAX (100%)->QUIET (50%)->AUTOwith live in-game toasts. - Added reactive dynamic curve in
AUTO-OPTmode: dynamically adjusts fan speed based on peak temperature across CPU and all GPUs (100% at ≥78°C, 85% at ≥70°C, 70% at ≥62°C, 50% below 60°C) with hysteresis damping to eliminate fan thrashing. - Added CLI flag
--fan auto|opt|balanced|max|quiet|<pct>inscripts/edgerunand control file commandfan <mode>for runtime scripting. - Automatically defaults to
optfan curve in--competitive/--esportsmode to prevent CPU/GPU thermal throttling downclocks during competitive matches.
- Integrated asynchronous, non-blocking fan curve control via
- CPU Thermal Observability:
- Added automatic sysfs hardware monitor discovery (
discoverCpuTemp()) scanningk10temp(AMD Ryzen),coretemp(Intel),zenpower, and ACPI thermal zones in sub-millisecond sysfs queries. - Real-time CPU temperature integrated into HUD telemetry and auto-curve decision loop.
- Added automatic sysfs hardware monitor discovery (
- Modern HUD Overlay Redesign:
- Re-architected in-game HUD overlay in
layer/xfsr_controls.cpp:- Dark obsidian slate glass card (
rgba(12, 16, 24, 235)) with rounded corners (radius 6px). - Glowing top accent header bar featuring a horizontal gradient from Electric Cyan (
#22d3ee) to Neon Violet (#a855f7). - 1px crisp card outline border (
rgba(56, 189, 248, 65)). - Sub-pixel text drop shadows at
(+1, +1)(rgba(0, 0, 0, 220)) before rendering glyph foregrounds, providing razor-sharp legibility across high-contrast in-game environments. - Color-coded thermal indicators: cool (<65°C, mint green), warm (65-75°C, amber), hot (≥76°C, coral red).
- Multi-color typography highlighting modes, resolutions, FPS, CPU thermals, and fan status.
- Dark obsidian slate glass card (
- Re-architected in-game HUD overlay in
Optimized
- Present Thread Polling Rate Limiting:
- Throttled synchronous hotkey polling (
XQueryKeymap) and control filestat()polling inpoll()to at most 60 Hz (~16ms intervals), eliminating redundant IPC roundtrips and filesystem syscalls at high framerates (120-200 FPS).
- Throttled synchronous hotkey polling (
- Fast 1:1 Native Resolution Pass in EdgePass (
shaders/edge_pass.comp.glsl):- Added
edgeNativefast path: whenrenderSize == displaySize(1080p -> 1080p native), heavy 12-tap Catmull-Rom cubic interpolation and sub-pixel edge tangent reconstruction are bypassed in favor of a fast 5-tap Contrast-Adaptive Sharpening (CAS) filter (or 1-tap sample if sharpness ≤ 0.01), reducing GPU compute time from ~1.0ms to <0.08ms.
- Added
[0.13.1] — 2026-11-09
Fixed
- Native Passthrough Stutter & Freeze in CS2 / Competitive Mode (
layer/xfsr_layer.cpp&scripts/edgerun):- 3-Slot Ring Overlay Synchronization: Resolved a severe driver deadlock where
queuePresentWithOverlayreused a single global binary semaphore (g_overlayDoneSem) and single fence (g_overlayFence) across consecutive frames on identity/passthrough swapchains. Replaced with a 3-slot multi-buffered ring buffer (kOverlayRingSize = 3), eliminating semaphore re-signaling race conditions and allowing asynchronous GPU presentation without blocking the CPU present thread. - Competitive Passthrough Bypass: Completely bypassed
queuePresentWithOverlayand swapchainTRANSFER_DSTflag injection when--competitive/EDGESCALE_LOW_LATENCY=1is active, providing direct, uninhibited zero-overhead driver swapchain presentation. - Preserved
WAYLAND_DISPLAYfor Native Mode: Prevented clearingWAYLAND_DISPLAYwhen--nativeis active, allowing native Linux titles like Counter-Strike 2 (SDL3) to run directly on native Wayland without forced Xwayland compositing latency, frame pacing jitter, or Pango text layout assertion failures.
- 3-Slot Ring Overlay Synchronization: Resolved a severe driver deadlock where
[0.13.0] — 2026-11-09
Added
- Competitive / Ultra-Low-Latency Mode (
--competitive/--esports) & F2 Live Cycling:- Added dedicated Competitive Mode (
edge competitive) designed for twitch and competitive shooters (CS2, Apex Legends, Call of Duty / Warzone). - Implemented an ultra-lightweight directional reconstruction pass in
shaders/edge_pass.comp.glslexecuting in sub-0.08mson GTX 1650 / Vega 10 with zero barrier and LDS overhead. - Added live hotkey cycling on
F2: now cyclesquality->perf->nearest->competitiveon the fly with in-game HUD toasts (edge competitive (lowest latency)). - Automatically overrides WSI swapchain to
VK_PRESENT_MODE_IMMEDIATE_KHR(orMAILBOX) inlayer/xfsr_layer.cppviaEDGESCALE_LOW_LATENCY=1to eliminate queue latency. - Automatically tunes DXVK in
scripts/edgerunwithdxvk.syncInterval = 0,dxvk.numBackBuffers = 1, andDXVK_ASYNC=1to minimize input lag and eliminate shader compilation stutter.
- Added dedicated Competitive Mode (
- DSR modes listed in-game (
scripts/edgerun): when t...
EdgeScale 0.15.0
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[0.15.0] — 2026-11-10
Fixed
-
In-Game Hotkey Conflict Isolation (CS2 / Competitive Voting & Buy Menu):
- Fixed severe bug where pressing bare
F1(Vote YES / Console),F2(Vote NO),F3(Autobuy) in games like Counter-Strike 2 triggered CrossVulkan swapchain recreation (applyPresetIdxLocked), causing sudden stutters or complete game freezes/crashes. - Changed default hotkey modifier to
Shift(Shift+F1..F6,Shift+F10), strictly ignoring bareF1..F6keypresses during normal gameplay. - Added new hotkey mapping modes via
--hotkeys <shift|alt|ctrl|ctrl_alt|nav|bare|none>and--no-hotkeysinscripts/edgerunandEDGESCALE_HOTKEYS:shift(default):Shift+F1..F6,Shift+F10alt:Alt+F1..F6,Alt+F10ctrl:Ctrl+F1..F6,Ctrl+F10ctrl_alt:Ctrl+Alt+F1..F6,Ctrl+Alt+F10nav: Navigation cluster (Insertpreset,Homemode,PgUpupscaler,Deloffload,End1-way,PgDnfan,Pausepin) avoiding function keys altogethernone: Hotkey listener completely disabled (safest for competitive esports)bare: BareF1..F6(legacy opt-in)
- Automatically enforces modifier isolation in
--competitive/--esportsmode so in-game votes or key binds never trigger layer actions. - Added runtime hotkey switching via control file (
hotkeys <mode>).
- Fixed severe bug where pressing bare
-
HUD Overlay Layout & Automatic Dynamic Sizing:
- Fixed overlay text wrapping and bottom-line clipping where line 1 wrapped (
(2.0/0x)) and line 3 (dGPU... | iGPU...) was cut off at the card bottom. - Implemented
computeLayout()dynamically tracking text dimensions and soft wraps at the exact window/screen width boundary (wrapW), ensuring the card background, border, and swapchain blit rectangle perfectly enclose all rendered lines on any screen resolution. - Increased maximum overlay height allocation
kOhfrom 96px to 160px (supporting up to 6 physical lines with zero truncation). - Streamlined line 1 format strings:
EdgeScale [HYBRID] edge:comp (CAS:0.60) | 960x540 -> 1920x1080 (2.0x). - Added
cleanGpuName()sanitizing long device strings: cleans driver tags and verbose suffixes (e.g.AMD Radeon Vega 10 Graphics (RADV RAVEN)->Vega 10,NVIDIA GeForce GTX 1650 with Max-Q Design->GTX 1650).
- Fixed overlay text wrapping and bottom-line clipping where line 1 wrapped (
[0.14.0] — 2026-11-10
Added
- Hardware Fan Control & Anti-Throttling Engine (
F6Hotkey &--fan):- Integrated asynchronous, non-blocking fan curve control via
nbfc(NoteBook FanControl) and EC controllers inlayer/xfsr_controls.cppandscripts/edgerun. - Added dedicated worker thread (
FanWorker) ensuringnbfccommands never stall or jitter Vulkan present queues. - Added live cycling on hotkey
F6: cyclesAUTO (EC default)->AUTO-OPT (temp-reactive)->BALANCED (75%)->MAX (100%)->QUIET (50%)->AUTOwith live in-game toasts. - Added reactive dynamic curve in
AUTO-OPTmode: dynamically adjusts fan speed based on peak temperature across CPU and all GPUs (100% at ≥78°C, 85% at ≥70°C, 70% at ≥62°C, 50% below 60°C) with hysteresis damping to eliminate fan thrashing. - Added CLI flag
--fan auto|opt|balanced|max|quiet|<pct>inscripts/edgerunand control file commandfan <mode>for runtime scripting. - Automatically defaults to
optfan curve in--competitive/--esportsmode to prevent CPU/GPU thermal throttling downclocks during competitive matches.
- Integrated asynchronous, non-blocking fan curve control via
- CPU Thermal Observability:
- Added automatic sysfs hardware monitor discovery (
discoverCpuTemp()) scanningk10temp(AMD Ryzen),coretemp(Intel),zenpower, and ACPI thermal zones in sub-millisecond sysfs queries. - Real-time CPU temperature integrated into HUD telemetry and auto-curve decision loop.
- Added automatic sysfs hardware monitor discovery (
- Modern HUD Overlay Redesign:
- Re-architected in-game HUD overlay in
layer/xfsr_controls.cpp:- Dark obsidian slate glass card (
rgba(12, 16, 24, 235)) with rounded corners (radius 6px). - Glowing top accent header bar featuring a horizontal gradient from Electric Cyan (
#22d3ee) to Neon Violet (#a855f7). - 1px crisp card outline border (
rgba(56, 189, 248, 65)). - Sub-pixel text drop shadows at
(+1, +1)(rgba(0, 0, 0, 220)) before rendering glyph foregrounds, providing razor-sharp legibility across high-contrast in-game environments. - Color-coded thermal indicators: cool (<65°C, mint green), warm (65-75°C, amber), hot (≥76°C, coral red).
- Multi-color typography highlighting modes, resolutions, FPS, CPU thermals, and fan status.
- Dark obsidian slate glass card (
- Re-architected in-game HUD overlay in
Optimized
- Present Thread Polling Rate Limiting:
- Throttled synchronous hotkey polling (
XQueryKeymap) and control filestat()polling inpoll()to at most 60 Hz (~16ms intervals), eliminating redundant IPC roundtrips and filesystem syscalls at high framerates (120-200 FPS).
- Throttled synchronous hotkey polling (
- Fast 1:1 Native Resolution Pass in EdgePass (
shaders/edge_pass.comp.glsl):- Added
edgeNativefast path: whenrenderSize == displaySize(1080p -> 1080p native), heavy 12-tap Catmull-Rom cubic interpolation and sub-pixel edge tangent reconstruction are bypassed in favor of a fast 5-tap Contrast-Adaptive Sharpening (CAS) filter (or 1-tap sample if sharpness ≤ 0.01), reducing GPU compute time from ~1.0ms to <0.08ms.
- Added
[0.13.1] — 2026-11-09
Fixed
- Native Passthrough Stutter & Freeze in CS2 / Competitive Mode (
layer/xfsr_layer.cpp&scripts/edgerun):- 3-Slot Ring Overlay Synchronization: Resolved a severe driver deadlock where
queuePresentWithOverlayreused a single global binary semaphore (g_overlayDoneSem) and single fence (g_overlayFence) across consecutive frames on identity/passthrough swapchains. Replaced with a 3-slot multi-buffered ring buffer (kOverlayRingSize = 3), eliminating semaphore re-signaling race conditions and allowing asynchronous GPU presentation without blocking the CPU present thread. - Competitive Passthrough Bypass: Completely bypassed
queuePresentWithOverlayand swapchainTRANSFER_DSTflag injection when--competitive/EDGESCALE_LOW_LATENCY=1is active, providing direct, uninhibited zero-overhead driver swapchain presentation. - Preserved
WAYLAND_DISPLAYfor Native Mode: Prevented clearingWAYLAND_DISPLAYwhen--nativeis active, allowing native Linux titles like Counter-Strike 2 (SDL3) to run directly on native Wayland without forced Xwayland compositing latency, frame pacing jitter, or Pango text layout assertion failures.
- 3-Slot Ring Overlay Synchronization: Resolved a severe driver deadlock where
[0.13.0] — 2026-11-09
Added
- Competitive / Ultra-Low-Latency Mode (
--competitive/--esports) & F2 Live Cycling:- Added dedicated Competitive Mode (
edge competitive) designed for twitch and competitive shooters (CS2, Apex Legends, Call of Duty / Warzone). - Implemented an ultra-lightweight directional reconstruction pass in
shaders/edge_pass.comp.glslexecuting in sub-0.08mson GTX 1650 / Vega 10 with zero barrier and LDS overhead. - Added live hotkey cycling on
F2: now cyclesquality->perf->nearest->competitiveon the fly with in-game HUD toasts (edge competitive (lowest latency)). - Automatically overrides WSI swapchain to
VK_PRESENT_MODE_IMMEDIATE_KHR(orMAILBOX) inlayer/xfsr_layer.cppviaEDGESCALE_LOW_LATENCY=1to eliminate queue latency. - Automatically tunes DXVK in
scripts/edgerunwithdxvk.syncInterval = 0,dxvk.numBackBuffers = 1, andDXVK_ASYNC=1to minimize input lag and eliminate shader compilation stutter.
- Added dedicated Competitive Mode (
- DSR modes listed in-game (
scripts/edgerun): when the render size is larger than the output (--dsr 4k,--render 3840x2160 --output 1920x1080),edgerunexportsWINE_FULLSCREEN_FSR=1andWINE_FULLSCREEN_FSR_CUSTOM_MODE=<render>. Proton then lists 3840x2160 in the game's resolution menu on a 1080p monitor.
Fixed
- D3D9 games rendering on the iGPU (
scripts/edgerun): DXVK D3D9 defaults tod3d9.enumerateByDisplays = True, which made adapter 0 the GPU wired to the laptop panel (AMD Vega 10) no matter how Vulkan devices were ordered (CoD4 was affected).edgerunnow addsdxvk.hideIntegratedGraphics = True; d3d9.enumerateByDisplays = FalsetoDXVK_CONFIGby default, and keeps any keys the user already set. The layer still sees the iGPU for--offload/--hybrid. - Image clipped / not filling the screen (
layer/xfsr_layer.cpp): when the X11 window is smaller than the display hint (CoD4 creates its first swapchain before Proton grows the window to fullscreen), the proxy now presents at the real window size instead of putting a 1920x1080 swapchain on a 1280x720 window. WhenSUBOPTIMAL/OUT_OF_DATEcomes back and the window size has changed, the proxy now returnsVK_ERROR_OUT_OF_DATE_KHRso the app rebuilds at the new size. Previously it ignored these forever.
[0.12.0] — 2026-11-09
Added
- In-Layer Discrete GPU Priority (
layer/xfsr_layer.cpp&scripts/edgerun):- Hooked
vkEnumeratePhysicalDevicesandvkEnumeratePhysicalDeviceGroups(KHR) in the layer to sortVK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU(NVIDIA GeForce GTX 1650) toGPU0andVK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU(AMD Radeon Vega 10) toGPU1(or vice-versa when--igpuis passed)....
- Hooked
EdgeScale 0.13.1
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[0.13.1] — 2026-11-09
Fixed
- Native Passthrough Stutter & Freeze in CS2 / Competitive Mode (
layer/xfsr_layer.cpp&scripts/edgerun):- 3-Slot Ring Overlay Synchronization: Resolved a severe driver deadlock where
queuePresentWithOverlayreused a single global binary semaphore (g_overlayDoneSem) and single fence (g_overlayFence) across consecutive frames on identity/passthrough swapchains. Replaced with a 3-slot multi-buffered ring buffer (kOverlayRingSize = 3), eliminating semaphore re-signaling race conditions and allowing asynchronous GPU presentation without blocking the CPU present thread. - Competitive Passthrough Bypass: Completely bypassed
queuePresentWithOverlayand swapchainTRANSFER_DSTflag injection when--competitive/EDGESCALE_LOW_LATENCY=1is active, providing direct, uninhibited zero-overhead driver swapchain presentation. - Preserved
WAYLAND_DISPLAYfor Native Mode: Prevented clearingWAYLAND_DISPLAYwhen--nativeis active, allowing native Linux titles like Counter-Strike 2 (SDL3) to run directly on native Wayland without forced Xwayland compositing latency, frame pacing jitter, or Pango text layout assertion failures.
- 3-Slot Ring Overlay Synchronization: Resolved a severe driver deadlock where
[0.13.0] — 2026-11-09
Added
- Competitive / Ultra-Low-Latency Mode (
--competitive/--esports) & F2 Live Cycling:- Added dedicated Competitive Mode (
edge competitive) designed for twitch and competitive shooters (CS2, Apex Legends, Call of Duty / Warzone). - Implemented an ultra-lightweight directional reconstruction pass in
shaders/edge_pass.comp.glslexecuting in sub-0.08mson GTX 1650 / Vega 10 with zero barrier and LDS overhead. - Added live hotkey cycling on
F2: now cyclesquality->perf->nearest->competitiveon the fly with in-game HUD toasts (edge competitive (lowest latency)). - Automatically overrides WSI swapchain to
VK_PRESENT_MODE_IMMEDIATE_KHR(orMAILBOX) inlayer/xfsr_layer.cppviaEDGESCALE_LOW_LATENCY=1to eliminate queue latency. - Automatically tunes DXVK in
scripts/edgerunwithdxvk.syncInterval = 0,dxvk.numBackBuffers = 1, andDXVK_ASYNC=1to minimize input lag and eliminate shader compilation stutter.
- Added dedicated Competitive Mode (
- DSR modes listed in-game (
scripts/edgerun): when the render size is larger than the output (--dsr 4k,--render 3840x2160 --output 1920x1080),edgerunexportsWINE_FULLSCREEN_FSR=1andWINE_FULLSCREEN_FSR_CUSTOM_MODE=<render>. Proton then lists 3840x2160 in the game's resolution menu on a 1080p monitor.
Fixed
- D3D9 games rendering on the iGPU (
scripts/edgerun): DXVK D3D9 defaults tod3d9.enumerateByDisplays = True, which made adapter 0 the GPU wired to the laptop panel (AMD Vega 10) no matter how Vulkan devices were ordered (CoD4 was affected).edgerunnow addsdxvk.hideIntegratedGraphics = True; d3d9.enumerateByDisplays = FalsetoDXVK_CONFIGby default, and keeps any keys the user already set. The layer still sees the iGPU for--offload/--hybrid. - Image clipped / not filling the screen (
layer/xfsr_layer.cpp): when the X11 window is smaller than the display hint (CoD4 creates its first swapchain before Proton grows the window to fullscreen), the proxy now presents at the real window size instead of putting a 1920x1080 swapchain on a 1280x720 window. WhenSUBOPTIMAL/OUT_OF_DATEcomes back and the window size has changed, the proxy now returnsVK_ERROR_OUT_OF_DATE_KHRso the app rebuilds at the new size. Previously it ignored these forever.
[0.12.0] — 2026-11-09
Added
- In-Layer Discrete GPU Priority (
layer/xfsr_layer.cpp&scripts/edgerun):- Hooked
vkEnumeratePhysicalDevicesandvkEnumeratePhysicalDeviceGroups(KHR) in the layer to sortVK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU(NVIDIA GeForce GTX 1650) toGPU0andVK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU(AMD Radeon Vega 10) toGPU1(or vice-versa when--igpuis passed). - Both GPUs remain visible for
--offload/--hybrid, and Proton/DXVK automatically picks the GTX 1650 without needing extra launch variables.
- Hooked
- Pre-Flight NVIDIA Driver / NVML Health Check (
scripts/edgerun):- Checks whether an NVIDIA PCI device (
0x10de) exists on the bus whennvidia-smifails (such as after a kernel/driver update before rebooting) and prints an immediate warning banner explaining why Vulkan would fall back to the iGPU.
- Checks whether an NVIDIA PCI device (
- Preserved EdgeScale HUD Overlay Inside
--any/--gamescope(scripts/edgerun&layer/xfsr_layer.cpp):- Kept the host
gamescopecompositor unhooked (DISABLE_XFSR=1) while enabling the EdgeScale layer inside the nested game container in HUD mode (XFSR_GAMESCOPE_OUT), so the EdgeScale overlay and dGPU sorting still work when--anyis used.
- Kept the host
Fixed
- Restored
maxImageExtentClamping for Upscaling (layer/xfsr_layer.cpp):- Fixed
applyCapsShrinkso that when upscaling (rw < winW || rh < winH),caps->maxImageExtentis clamped to{rw, rh}(1280x720), while DSR (scale < 1.0) continues to expandmaxImageExtentwithstd::max. - Games like Sonic Frontiers that pass explicit
1920x1080swapchain dimensions to DXVK are now clamped down to1280x720by DXVK just like Sonic Superstars.
- Fixed
- Fixed Overlay GPU Deduplication & Effective Scale Readout (
layer/xfsr_controls.cpp):- Prevented the iGPU name/tag from overwriting the dGPU slot when running on an integrated GPU or when NVML is offline, and detected AMD APUs via
mem_info_vram_total. - Updated the resolution readout in
formatStatusLockedto display the actual ratio (1.00x, tgt 1.50xwhen in passthrough vs1.50xwhen upscaling).
- Prevented the iGPU name/tag from overwriting the dGPU slot when running on an integrated GPU or when NVML is offline, and detected AMD APUs via
[0.11.2] — 2026-11-05
Added
- Automated AI Compute Multi-GPU Orchestrator (
edgerun --ai/ Auto-Split):- Added intelligent AI compute detection in
edgerunwhen executingllama-cliorllama-server. - Automatically identifies heterogeneous Vulkan devices (
dGPUprimary compute +iGPUsecondary compute), unmasks device selection, disables unnecessary graphics swapchain hooks (XFSR_OFFLOAD=0), and auto-injects optimal pipeline layer splits (--device <dGPU>,<iGPU> --split-mode layer --tensor-split 2,1). - Achieves 14.0 t/s prompt and 5.4 t/s decode with zero manual multi-GPU split parameters.
- Added intelligent AI compute detection in
Fixed
- EdgePass Default & Option Promotion:
- Fixed single-GPU mode (
--no-offload) defaulting to legacyfsr1instead ofedge. - Passing
--edge-modeor--edge-sharpnessnow automatically selectsUPSCALER=edge.
- Fixed single-GPU mode (
- Integrated GPU HUD Telemetry Tagging:
- Fixed HUD overlay incorrectly labeling single APU/iGPU devices (such as AMD Renoir/Vega) as
dGPU. Non-discrete single devices are now accurately tagged asiGPU.
- Fixed HUD overlay incorrectly labeling single APU/iGPU devices (such as AMD Renoir/Vega) as
[0.11.1] — 2026-11-05
Added
- Dual-GPU In-Game Telemetry & Dynamic NVML Discovery (
--overlay):- Integrated dynamic runtime loading of
libnvidia-ml.so.1(NVML) viadlopento sample NVIDIA dGPU utilization percentage, temperature (°C), and VRAM usage (MB) without introducing build-time dependencies. - Enhanced HUD overlay to distinguish and explicitly label multi-GPU topologies as
dGPUandiGPU(e.g.dGPU [GTX 1650]andiGPU [Vega 10 Graphics]) alongside execution mode (HYBRID,OFFLOAD,SAME-GPU,DSR 4K), active upscaler, FPS, and CPU usage. - Implemented dynamic bounding box rasterization in
rasterizeTextandrecordOverlay: the semi-transparent overlay badge now fits text line count and width dynamically in the corner, preventing unnecessary darkening of unused screen areas. - Hooked physical device property queries and companion discovery (
xfsr_ctrl::setDeviceInfo) across device creation and offload pipeline setup inlayer/xfsr_layer.cpp.
- Integrated dynamic runtime loading of
- Benchmark Suite Overlay Integration (
scripts/xfsr-bench.sh):- Enabled the built-in
--overlayby default in automated benchmarks and removed reliance on MangoHud.
- Enabled the built-in
[0.11.0] — 2026-11-05
Added
-
Distributed GPU Memory Management & Heterogeneous Workload Orchestration:
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
src/scheduler/gpu_scheduler.hpp,bench/scheduler_test.cpp). - Separates the Memory Manager (capacity discovery, heap compatibility, residency tracking, and oversubscription fallback) from the Execution Orchestrator (cost-aware placement scoring across bandwidth, compute throughput, transfer latency, and access frequency).
- Validated with controlled benchmark matrix demonstrating that offloading transformer layers to secondary compute (e.g. AMD Vega 10 iGPU) delivers +43% higher decode throughput (14.4 t/s) compared to spilling allocations to host system RAM over PCIe (9.6 t/s).
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
-
VRAM Observability & Cross-Vendor Telemetry Daemon (
vram_monitor):- Unified multi-GPU telemetry CLI and background daemon (
src/vram_monitor/) monitoring NVIDIA dGPU (NVML: VRAM used/free, BAR1, temperature, utilization), AMD iGPU/dGPU (sysfs:mem_info_vram_used,mem_info_gtt_used), and host DDR memory (/proc/meminfo). - Implements weighted resource residency scoring (
$S_i = \frac{F_i \cdot R_i \cdot C_i}{\text{Size}_{\text{MB}} \cdot (1 + A_i)}$ ) to drive cost-effective migration policies between VRAM, secondary GPU memory, and system RAM. - Supports
--once,--json,--daemon [interval], and--scorefor continuous observability.
- Unified multi-GPU telemetry CLI and background daemon (
- **AI ...
EdgeScale 0.12.0
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[0.12.0] — 2026-11-09
Added
- In-Layer Discrete GPU Priority (
layer/xfsr_layer.cpp&scripts/edgerun):- Hooked
vkEnumeratePhysicalDevicesandvkEnumeratePhysicalDeviceGroups(KHR) in the layer to sortVK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU(NVIDIA GeForce GTX 1650) toGPU0andVK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU(AMD Radeon Vega 10) toGPU1(or vice-versa when--igpuis passed). - Both GPUs remain visible for
--offload/--hybrid, and Proton/DXVK automatically picks the GTX 1650 without needing extra launch variables.
- Hooked
- Pre-Flight NVIDIA Driver / NVML Health Check (
scripts/edgerun):- Checks whether an NVIDIA PCI device (
0x10de) exists on the bus whennvidia-smifails (such as after a kernel/driver update before rebooting) and prints an immediate warning banner explaining why Vulkan would fall back to the iGPU.
- Checks whether an NVIDIA PCI device (
- Preserved EdgeScale HUD Overlay Inside
--any/--gamescope(scripts/edgerun&layer/xfsr_layer.cpp):- Kept the host
gamescopecompositor unhooked (DISABLE_XFSR=1) while enabling the EdgeScale layer inside the nested game container in HUD mode (XFSR_GAMESCOPE_OUT), so the EdgeScale overlay and dGPU sorting still work when--anyis used.
- Kept the host
Fixed
- Restored
maxImageExtentClamping for Upscaling (layer/xfsr_layer.cpp):- Fixed
applyCapsShrinkso that when upscaling (rw < winW || rh < winH),caps->maxImageExtentis clamped to{rw, rh}(1280x720), while DSR (scale < 1.0) continues to expandmaxImageExtentwithstd::max. - Games like Sonic Frontiers that pass explicit
1920x1080swapchain dimensions to DXVK are now clamped down to1280x720by DXVK just like Sonic Superstars.
- Fixed
- Fixed Overlay GPU Deduplication & Effective Scale Readout (
layer/xfsr_controls.cpp):- Prevented the iGPU name/tag from overwriting the dGPU slot when running on an integrated GPU or when NVML is offline, and detected AMD APUs via
mem_info_vram_total. - Updated the resolution readout in
formatStatusLockedto display the actual ratio (1.00x, tgt 1.50xwhen in passthrough vs1.50xwhen upscaling).
- Prevented the iGPU name/tag from overwriting the dGPU slot when running on an integrated GPU or when NVML is offline, and detected AMD APUs via
[0.11.2] — 2026-11-05
Added
- Automated AI Compute Multi-GPU Orchestrator (
edgerun --ai/ Auto-Split):- Added intelligent AI compute detection in
edgerunwhen executingllama-cliorllama-server. - Automatically identifies heterogeneous Vulkan devices (
dGPUprimary compute +iGPUsecondary compute), unmasks device selection, disables unnecessary graphics swapchain hooks (XFSR_OFFLOAD=0), and auto-injects optimal pipeline layer splits (--device <dGPU>,<iGPU> --split-mode layer --tensor-split 2,1). - Achieves 14.0 t/s prompt and 5.4 t/s decode with zero manual multi-GPU split parameters.
- Added intelligent AI compute detection in
Fixed
- EdgePass Default & Option Promotion:
- Fixed single-GPU mode (
--no-offload) defaulting to legacyfsr1instead ofedge. - Passing
--edge-modeor--edge-sharpnessnow automatically selectsUPSCALER=edge.
- Fixed single-GPU mode (
- Integrated GPU HUD Telemetry Tagging:
- Fixed HUD overlay incorrectly labeling single APU/iGPU devices (such as AMD Renoir/Vega) as
dGPU. Non-discrete single devices are now accurately tagged asiGPU.
- Fixed HUD overlay incorrectly labeling single APU/iGPU devices (such as AMD Renoir/Vega) as
[0.11.1] — 2026-11-05
Added
- Dual-GPU In-Game Telemetry & Dynamic NVML Discovery (
--overlay):- Integrated dynamic runtime loading of
libnvidia-ml.so.1(NVML) viadlopento sample NVIDIA dGPU utilization percentage, temperature (°C), and VRAM usage (MB) without introducing build-time dependencies. - Enhanced HUD overlay to distinguish and explicitly label multi-GPU topologies as
dGPUandiGPU(e.g.dGPU [GTX 1650]andiGPU [Vega 10 Graphics]) alongside execution mode (HYBRID,OFFLOAD,SAME-GPU,DSR 4K), active upscaler, FPS, and CPU usage. - Implemented dynamic bounding box rasterization in
rasterizeTextandrecordOverlay: the semi-transparent overlay badge now fits text line count and width dynamically in the corner, preventing unnecessary darkening of unused screen areas. - Hooked physical device property queries and companion discovery (
xfsr_ctrl::setDeviceInfo) across device creation and offload pipeline setup inlayer/xfsr_layer.cpp.
- Integrated dynamic runtime loading of
- Benchmark Suite Overlay Integration (
scripts/xfsr-bench.sh):- Enabled the built-in
--overlayby default in automated benchmarks and removed reliance on MangoHud.
- Enabled the built-in
[0.11.0] — 2026-11-05
Added
-
Distributed GPU Memory Management & Heterogeneous Workload Orchestration:
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
src/scheduler/gpu_scheduler.hpp,bench/scheduler_test.cpp). - Separates the Memory Manager (capacity discovery, heap compatibility, residency tracking, and oversubscription fallback) from the Execution Orchestrator (cost-aware placement scoring across bandwidth, compute throughput, transfer latency, and access frequency).
- Validated with controlled benchmark matrix demonstrating that offloading transformer layers to secondary compute (e.g. AMD Vega 10 iGPU) delivers +43% higher decode throughput (14.4 t/s) compared to spilling allocations to host system RAM over PCIe (9.6 t/s).
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
-
VRAM Observability & Cross-Vendor Telemetry Daemon (
vram_monitor):- Unified multi-GPU telemetry CLI and background daemon (
src/vram_monitor/) monitoring NVIDIA dGPU (NVML: VRAM used/free, BAR1, temperature, utilization), AMD iGPU/dGPU (sysfs:mem_info_vram_used,mem_info_gtt_used), and host DDR memory (/proc/meminfo). - Implements weighted resource residency scoring (
$S_i = \frac{F_i \cdot R_i \cdot C_i}{\text{Size}_{\text{MB}} \cdot (1 + A_i)}$ ) to drive cost-effective migration policies between VRAM, secondary GPU memory, and system RAM. - Supports
--once,--json,--daemon [interval], and--scorefor continuous observability.
- Unified multi-GPU telemetry CLI and background daemon (
-
AI CUDA Memory Virtualization & Oversubscription Engine (
ai_vram_test/ManagedLayerEngine):- Reusable stream-prefetched memory management engine (
src/ai_vram/ai_vram_adapter.hpp,src/ai_vram/ai_vram_test.cu) leveraging CUDA Heterogeneous Memory Management (HMM) and unified memory. - Successfully executes workloads exceeding physical GPU capacity (e.g. 5.25 GB across 6 layers on a 4 GB GTX 1650 at 3.03 GB/s streaming throughput) where standard allocations terminate with out-of-memory errors (
cudaErrorMemoryAllocation).
- Reusable stream-prefetched memory management engine (
-
Controlled Benchmark Matrix Suite (
tests/benchmark_matrix.sh):- Reproducible benchmark comparing native VRAM baseline (
$c=4096$ ), native driver failure ($c=32768$ ,VK_ERROR_OUT_OF_DEVICE_MEMORY), EdgeScale virtualized budget ($c=32768$ , 40.4 t/s prefill / 9.6 t/s decode), dual-GPU layer split (14.4 t/s decode), and dual-GPU oversubscription (3.6 t/s decode with 901 MB spilled).
- Reproducible benchmark comparing native VRAM baseline (
-
Automated Local LLM Launcher (
scripts/run_local_llm.sh):- Wrapper for running large local models (e.g. Qwen 3.5 4.3B GGUF) with large context windows under EdgeScale VRAM virtualization.
-
Graphics Benchmark Suite Expanded (
scripts/xfsr-bench.sh):- Updated the WSI/FPS benchmark suite across both Vulkan and OpenGL (Zink) to test modern execution modes (
--offloadone-way,--offload --no-one-wayround-trip,--hybrid,--native,--dsr 4k,--spoof-vram 8GB), all upscalers (edge[quality/perf/nearest],nis,fsr1,blit,nearest), and new modular test filters (XFSR_BENCH_MODES_ONLY,XFSR_BENCH_UPSCALERS_ONLY,XFSR_BENCH_PRESETS_ONLY).
- Updated the WSI/FPS benchmark suite across both Vulkan and OpenGL (Zink) to test modern execution modes (
Fixed
- Benchmark Terminal Redirection & Real-Time Token Parsing:
- Fixed an issue where
llama-cliwrote output directly to/dev/tty, bypassing shell redirection and producingN/Atoken rates in scripted benchmarks. Execution now cleanly detaches viasetsidand redirects standard streams.
- Fixed an issue where
- EdgePass Upscaler Mode Logging:
- Fixed logging in
src/edge_pass.cppwhere nearest-neighbor mode erroneously logged asquality.
- Fixed logging in
[0.10.0] — 2026-11-04
Added
- VRAM Capacity Spoofing & Oversubscription Fallback (
--spoof-vram [SIZE]/EDGESCALE_SPOOF_VRAM):- Intercepts
vkGetPhysicalDeviceMemoryPropertiesandvkGetPhysicalDeviceMemoryProperties2to report expandedDEVICE_LOCALVRAM capacity (e.g. 8GB, 12GB, 16GB, orauto). - Transparently intercepts
VK_EXT_memory_budget(VkPhysicalDeviceMemoryBudgetPropertiesEXT) so modern engines (DXVK / VKD3D-Proton / Unreal) see increased VRAM budget instead of locking out High/Ultra textures. - Implements graceful allocation spilling in
vkAllocateMemory: when physical local VRAM is exhausted (VK_ERROR_OUT_OF_DEVICE_MEMORY), automatically falls back to allocating over PCIe in system RAM (HOST_VISIBLE) instead of crashing the application. - Profile key:
spoof_vram=8GB.
- Intercepts
- Supersampling / DSR (4K Render on 1080p Display) (
--dsr 4k|1440p|<val>/--render 3840x2160 --output 1920x1080):- Enables true downsampling / Virtual Super Resolution (DSR / SSAA) in the Vulkan layer: the game renders internally at 4K (3840×2160) or 1440p, while the swapchain presents at native monitor resolution (e.g. 1080p).
- Shipped dedicated
edgeDownsamplecompute shader inshaders/edge_pass.comp.glsl: 4-tap staggered bilinear box filter covering up to a 4×4 texel area, combined with optional Contrast-Adaptive Sharpening (CAS) for clean, anti-aliased SSAA without shimmering. - Automatic positive mip LOD bias calculation (
-log2(scale) = +1.0at 4K→1080p) to match high-resolution texture sampling to display pixel density and eliminate texture crawling. - Profile key:
dsr=4k.
Fixed
- **Steam Overlay / ...
EdgeScale 0.11.2
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[Unreleased]
[0.11.2] — 2026-11-05
Added
- Automated AI Compute Multi-GPU Orchestrator (
edgerun --ai/ Auto-Split):- Added intelligent AI compute detection in
edgerunwhen executingllama-cliorllama-server. - Automatically identifies heterogeneous Vulkan devices (
dGPUprimary compute +iGPUsecondary compute), unmasks device selection, disables unnecessary graphics swapchain hooks (XFSR_OFFLOAD=0), and auto-injects optimal pipeline layer splits (--device <dGPU>,<iGPU> --split-mode layer --tensor-split 2,1). - Achieves 14.0 t/s prompt and 5.4 t/s decode with zero manual multi-GPU split parameters.
- Added intelligent AI compute detection in
Fixed
- EdgePass Default & Option Promotion:
- Fixed single-GPU mode (
--no-offload) defaulting to legacyfsr1instead ofedge. - Passing
--edge-modeor--edge-sharpnessnow automatically selectsUPSCALER=edge.
- Fixed single-GPU mode (
- Integrated GPU HUD Telemetry Tagging:
- Fixed HUD overlay incorrectly labeling single APU/iGPU devices (such as AMD Renoir/Vega) as
dGPU. Non-discrete single devices are now accurately tagged asiGPU.
- Fixed HUD overlay incorrectly labeling single APU/iGPU devices (such as AMD Renoir/Vega) as
[0.11.1] — 2026-11-05
Added
- Dual-GPU In-Game Telemetry & Dynamic NVML Discovery (
--overlay):- Integrated dynamic runtime loading of
libnvidia-ml.so.1(NVML) viadlopento sample NVIDIA dGPU utilization percentage, temperature (°C), and VRAM usage (MB) without introducing build-time dependencies. - Enhanced HUD overlay to distinguish and explicitly label multi-GPU topologies as
dGPUandiGPU(e.g.dGPU [GTX 1650]andiGPU [Vega 10 Graphics]) alongside execution mode (HYBRID,OFFLOAD,SAME-GPU,DSR 4K), active upscaler, FPS, and CPU usage. - Implemented dynamic bounding box rasterization in
rasterizeTextandrecordOverlay: the semi-transparent overlay badge now fits text line count and width dynamically in the corner, preventing unnecessary darkening of unused screen areas. - Hooked physical device property queries and companion discovery (
xfsr_ctrl::setDeviceInfo) across device creation and offload pipeline setup inlayer/xfsr_layer.cpp.
- Integrated dynamic runtime loading of
- Benchmark Suite Overlay Integration (
scripts/xfsr-bench.sh):- Enabled the built-in
--overlayby default in automated benchmarks and removed reliance on MangoHud.
- Enabled the built-in
[0.11.0] — 2026-11-05
Added
-
Distributed GPU Memory Management & Heterogeneous Workload Orchestration:
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
src/scheduler/gpu_scheduler.hpp,bench/scheduler_test.cpp). - Separates the Memory Manager (capacity discovery, heap compatibility, residency tracking, and oversubscription fallback) from the Execution Orchestrator (cost-aware placement scoring across bandwidth, compute throughput, transfer latency, and access frequency).
- Validated with controlled benchmark matrix demonstrating that offloading transformer layers to secondary compute (e.g. AMD Vega 10 iGPU) delivers +43% higher decode throughput (14.4 t/s) compared to spilling allocations to host system RAM over PCIe (9.6 t/s).
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
-
VRAM Observability & Cross-Vendor Telemetry Daemon (
vram_monitor):- Unified multi-GPU telemetry CLI and background daemon (
src/vram_monitor/) monitoring NVIDIA dGPU (NVML: VRAM used/free, BAR1, temperature, utilization), AMD iGPU/dGPU (sysfs:mem_info_vram_used,mem_info_gtt_used), and host DDR memory (/proc/meminfo). - Implements weighted resource residency scoring (
$S_i = \frac{F_i \cdot R_i \cdot C_i}{\text{Size}_{\text{MB}} \cdot (1 + A_i)}$ ) to drive cost-effective migration policies between VRAM, secondary GPU memory, and system RAM. - Supports
--once,--json,--daemon [interval], and--scorefor continuous observability.
- Unified multi-GPU telemetry CLI and background daemon (
-
AI CUDA Memory Virtualization & Oversubscription Engine (
ai_vram_test/ManagedLayerEngine):- Reusable stream-prefetched memory management engine (
src/ai_vram/ai_vram_adapter.hpp,src/ai_vram/ai_vram_test.cu) leveraging CUDA Heterogeneous Memory Management (HMM) and unified memory. - Successfully executes workloads exceeding physical GPU capacity (e.g. 5.25 GB across 6 layers on a 4 GB GTX 1650 at 3.03 GB/s streaming throughput) where standard allocations terminate with out-of-memory errors (
cudaErrorMemoryAllocation).
- Reusable stream-prefetched memory management engine (
-
Controlled Benchmark Matrix Suite (
tests/benchmark_matrix.sh):- Reproducible benchmark comparing native VRAM baseline (
$c=4096$ ), native driver failure ($c=32768$ ,VK_ERROR_OUT_OF_DEVICE_MEMORY), EdgeScale virtualized budget ($c=32768$ , 40.4 t/s prefill / 9.6 t/s decode), dual-GPU layer split (14.4 t/s decode), and dual-GPU oversubscription (3.6 t/s decode with 901 MB spilled).
- Reproducible benchmark comparing native VRAM baseline (
-
Automated Local LLM Launcher (
scripts/run_local_llm.sh):- Wrapper for running large local models (e.g. Qwen 3.5 4.3B GGUF) with large context windows under EdgeScale VRAM virtualization.
-
Graphics Benchmark Suite Expanded (
scripts/xfsr-bench.sh):- Updated the WSI/FPS benchmark suite across both Vulkan and OpenGL (Zink) to test modern execution modes (
--offloadone-way,--offload --no-one-wayround-trip,--hybrid,--native,--dsr 4k,--spoof-vram 8GB), all upscalers (edge[quality/perf/nearest],nis,fsr1,blit,nearest), and new modular test filters (XFSR_BENCH_MODES_ONLY,XFSR_BENCH_UPSCALERS_ONLY,XFSR_BENCH_PRESETS_ONLY).
- Updated the WSI/FPS benchmark suite across both Vulkan and OpenGL (Zink) to test modern execution modes (
Fixed
- Benchmark Terminal Redirection & Real-Time Token Parsing:
- Fixed an issue where
llama-cliwrote output directly to/dev/tty, bypassing shell redirection and producingN/Atoken rates in scripted benchmarks. Execution now cleanly detaches viasetsidand redirects standard streams.
- Fixed an issue where
- EdgePass Upscaler Mode Logging:
- Fixed logging in
src/edge_pass.cppwhere nearest-neighbor mode erroneously logged asquality.
- Fixed logging in
[0.10.0] — 2026-11-04
Added
- VRAM Capacity Spoofing & Oversubscription Fallback (
--spoof-vram [SIZE]/EDGESCALE_SPOOF_VRAM):- Intercepts
vkGetPhysicalDeviceMemoryPropertiesandvkGetPhysicalDeviceMemoryProperties2to report expandedDEVICE_LOCALVRAM capacity (e.g. 8GB, 12GB, 16GB, orauto). - Transparently intercepts
VK_EXT_memory_budget(VkPhysicalDeviceMemoryBudgetPropertiesEXT) so modern engines (DXVK / VKD3D-Proton / Unreal) see increased VRAM budget instead of locking out High/Ultra textures. - Implements graceful allocation spilling in
vkAllocateMemory: when physical local VRAM is exhausted (VK_ERROR_OUT_OF_DEVICE_MEMORY), automatically falls back to allocating over PCIe in system RAM (HOST_VISIBLE) instead of crashing the application. - Profile key:
spoof_vram=8GB.
- Intercepts
- Supersampling / DSR (4K Render on 1080p Display) (
--dsr 4k|1440p|<val>/--render 3840x2160 --output 1920x1080):- Enables true downsampling / Virtual Super Resolution (DSR / SSAA) in the Vulkan layer: the game renders internally at 4K (3840×2160) or 1440p, while the swapchain presents at native monitor resolution (e.g. 1080p).
- Shipped dedicated
edgeDownsamplecompute shader inshaders/edge_pass.comp.glsl: 4-tap staggered bilinear box filter covering up to a 4×4 texel area, combined with optional Contrast-Adaptive Sharpening (CAS) for clean, anti-aliased SSAA without shimmering. - Automatic positive mip LOD bias calculation (
-log2(scale) = +1.0at 4K→1080p) to match high-resolution texture sampling to display pixel density and eliminate texture crawling. - Profile key:
dsr=4k.
Fixed
- Steam Overlay / Companion iGPU Probe Crash (
SIGSEGVin CS2 / Steam titles):- Fixed a segmentation fault during companion iGPU initialization in games running with the Steam Overlay and Steam Fossilize layers (
libVkLayer_steam_fossilize.so). - Corrected
layerGIPAinDeviceContext::createLogicalViaLoader: the layer was previously forwardingpfnNextGetInstanceProcAddrintovkLayerCreateDevicerather than its own negotiatedvkGetInstanceProcAddr. This prevented the Vulkan loader from identifying EdgeScale in the layer chain and caused the loader to re-enter upstream layers (steamoverlayvulkanlayer.so), invoking an uninitialized function pointer. - Added a POSIX signal trap (
sigsetjmp/sigaction) around companion device discovery to isolate any third-party layer or driver faults, ensuring seamless fallback to same-GPU upscaling instead of terminating the game.
- Fixed a segmentation fault during companion iGPU initialization in games running with the Steam Overlay and Steam Fossilize layers (
- OpenGL / Zink Bidirectional Viewport & Downsampling Remapping:
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
gl/xfsr_gl_shim.cwhen downsampling or supersampling (DSR 4K / 1440p). - Replaced unidirectional
render < windowassumptions acrossglViewport,glScissor,glBlitFramebuffer,glfwGetFramebufferSize,SDL_GL_GetDrawableSize, and X11 window queries with bidirectional delta checks (abs(...) > threshold). - Allowed downsampling scale factors down to
0.125f(e.g.scale=0.50for 4K → 1080p SSAA) intarget_render_size,load_extents, andshrink_wl_size.
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
[0.9.0] — 2026-11-02
Added
- Linux AppImage: portable
EdgeScale-*-x86_64.AppImagerelease artifact (scripts/package-appimage.sh) with offline--installand--uninstallsupport; primary Linux install path replacing the curl installer. - Windows Setup.exe: Inno Setup installer/uninstaller (
packaging/windows/edgescale.iss) with icon integration, registry setup, and Add/Remove Programs support; ZIP +.batscripts remain as fallback. - Edge Nearest Neighbor mode (
--edge-mode nearest): EdgePass compute shader point-sampling...
EdgeScale 0.11.1
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[Unreleased]
[0.11.1] — 2026-11-05
Added
- Dual-GPU In-Game Telemetry & Dynamic NVML Discovery (
--overlay):- Integrated dynamic runtime loading of
libnvidia-ml.so.1(NVML) viadlopento sample NVIDIA dGPU utilization percentage, temperature (°C), and VRAM usage (MB) without introducing build-time dependencies. - Enhanced HUD overlay to distinguish and explicitly label multi-GPU topologies as
dGPUandiGPU(e.g.dGPU [GTX 1650]andiGPU [Vega 10 Graphics]) alongside execution mode (HYBRID,OFFLOAD,SAME-GPU,DSR 4K), active upscaler, FPS, and CPU usage. - Implemented dynamic bounding box rasterization in
rasterizeTextandrecordOverlay: the semi-transparent overlay badge now fits text line count and width dynamically in the corner, preventing unnecessary darkening of unused screen areas. - Hooked physical device property queries and companion discovery (
xfsr_ctrl::setDeviceInfo) across device creation and offload pipeline setup inlayer/xfsr_layer.cpp.
- Integrated dynamic runtime loading of
- Benchmark Suite Overlay Integration (
scripts/xfsr-bench.sh):- Enabled the built-in
--overlayby default in automated benchmarks and removed reliance on MangoHud.
- Enabled the built-in
[0.11.0] — 2026-11-05
Added
-
Distributed GPU Memory Management & Heterogeneous Workload Orchestration:
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
src/scheduler/gpu_scheduler.hpp,bench/scheduler_test.cpp). - Separates the Memory Manager (capacity discovery, heap compatibility, residency tracking, and oversubscription fallback) from the Execution Orchestrator (cost-aware placement scoring across bandwidth, compute throughput, transfer latency, and access frequency).
- Validated with controlled benchmark matrix demonstrating that offloading transformer layers to secondary compute (e.g. AMD Vega 10 iGPU) delivers +43% higher decode throughput (14.4 t/s) compared to spilling allocations to host system RAM over PCIe (9.6 t/s).
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
-
VRAM Observability & Cross-Vendor Telemetry Daemon (
vram_monitor):- Unified multi-GPU telemetry CLI and background daemon (
src/vram_monitor/) monitoring NVIDIA dGPU (NVML: VRAM used/free, BAR1, temperature, utilization), AMD iGPU/dGPU (sysfs:mem_info_vram_used,mem_info_gtt_used), and host DDR memory (/proc/meminfo). - Implements weighted resource residency scoring (
$S_i = \frac{F_i \cdot R_i \cdot C_i}{\text{Size}_{\text{MB}} \cdot (1 + A_i)}$ ) to drive cost-effective migration policies between VRAM, secondary GPU memory, and system RAM. - Supports
--once,--json,--daemon [interval], and--scorefor continuous observability.
- Unified multi-GPU telemetry CLI and background daemon (
-
AI CUDA Memory Virtualization & Oversubscription Engine (
ai_vram_test/ManagedLayerEngine):- Reusable stream-prefetched memory management engine (
src/ai_vram/ai_vram_adapter.hpp,src/ai_vram/ai_vram_test.cu) leveraging CUDA Heterogeneous Memory Management (HMM) and unified memory. - Successfully executes workloads exceeding physical GPU capacity (e.g. 5.25 GB across 6 layers on a 4 GB GTX 1650 at 3.03 GB/s streaming throughput) where standard allocations terminate with out-of-memory errors (
cudaErrorMemoryAllocation).
- Reusable stream-prefetched memory management engine (
-
Controlled Benchmark Matrix Suite (
tests/benchmark_matrix.sh):- Reproducible benchmark comparing native VRAM baseline (
$c=4096$ ), native driver failure ($c=32768$ ,VK_ERROR_OUT_OF_DEVICE_MEMORY), EdgeScale virtualized budget ($c=32768$ , 40.4 t/s prefill / 9.6 t/s decode), dual-GPU layer split (14.4 t/s decode), and dual-GPU oversubscription (3.6 t/s decode with 901 MB spilled).
- Reproducible benchmark comparing native VRAM baseline (
-
Automated Local LLM Launcher (
scripts/run_local_llm.sh):- Wrapper for running large local models (e.g. Qwen 3.5 4.3B GGUF) with large context windows under EdgeScale VRAM virtualization.
-
Graphics Benchmark Suite Expanded (
scripts/xfsr-bench.sh):- Updated the WSI/FPS benchmark suite across both Vulkan and OpenGL (Zink) to test modern execution modes (
--offloadone-way,--offload --no-one-wayround-trip,--hybrid,--native,--dsr 4k,--spoof-vram 8GB), all upscalers (edge[quality/perf/nearest],nis,fsr1,blit,nearest), and new modular test filters (XFSR_BENCH_MODES_ONLY,XFSR_BENCH_UPSCALERS_ONLY,XFSR_BENCH_PRESETS_ONLY).
- Updated the WSI/FPS benchmark suite across both Vulkan and OpenGL (Zink) to test modern execution modes (
Fixed
- Benchmark Terminal Redirection & Real-Time Token Parsing:
- Fixed an issue where
llama-cliwrote output directly to/dev/tty, bypassing shell redirection and producingN/Atoken rates in scripted benchmarks. Execution now cleanly detaches viasetsidand redirects standard streams.
- Fixed an issue where
- EdgePass Upscaler Mode Logging:
- Fixed logging in
src/edge_pass.cppwhere nearest-neighbor mode erroneously logged asquality.
- Fixed logging in
[0.10.0] — 2026-11-04
Added
- VRAM Capacity Spoofing & Oversubscription Fallback (
--spoof-vram [SIZE]/EDGESCALE_SPOOF_VRAM):- Intercepts
vkGetPhysicalDeviceMemoryPropertiesandvkGetPhysicalDeviceMemoryProperties2to report expandedDEVICE_LOCALVRAM capacity (e.g. 8GB, 12GB, 16GB, orauto). - Transparently intercepts
VK_EXT_memory_budget(VkPhysicalDeviceMemoryBudgetPropertiesEXT) so modern engines (DXVK / VKD3D-Proton / Unreal) see increased VRAM budget instead of locking out High/Ultra textures. - Implements graceful allocation spilling in
vkAllocateMemory: when physical local VRAM is exhausted (VK_ERROR_OUT_OF_DEVICE_MEMORY), automatically falls back to allocating over PCIe in system RAM (HOST_VISIBLE) instead of crashing the application. - Profile key:
spoof_vram=8GB.
- Intercepts
- Supersampling / DSR (4K Render on 1080p Display) (
--dsr 4k|1440p|<val>/--render 3840x2160 --output 1920x1080):- Enables true downsampling / Virtual Super Resolution (DSR / SSAA) in the Vulkan layer: the game renders internally at 4K (3840×2160) or 1440p, while the swapchain presents at native monitor resolution (e.g. 1080p).
- Shipped dedicated
edgeDownsamplecompute shader inshaders/edge_pass.comp.glsl: 4-tap staggered bilinear box filter covering up to a 4×4 texel area, combined with optional Contrast-Adaptive Sharpening (CAS) for clean, anti-aliased SSAA without shimmering. - Automatic positive mip LOD bias calculation (
-log2(scale) = +1.0at 4K→1080p) to match high-resolution texture sampling to display pixel density and eliminate texture crawling. - Profile key:
dsr=4k.
Fixed
- Steam Overlay / Companion iGPU Probe Crash (
SIGSEGVin CS2 / Steam titles):- Fixed a segmentation fault during companion iGPU initialization in games running with the Steam Overlay and Steam Fossilize layers (
libVkLayer_steam_fossilize.so). - Corrected
layerGIPAinDeviceContext::createLogicalViaLoader: the layer was previously forwardingpfnNextGetInstanceProcAddrintovkLayerCreateDevicerather than its own negotiatedvkGetInstanceProcAddr. This prevented the Vulkan loader from identifying EdgeScale in the layer chain and caused the loader to re-enter upstream layers (steamoverlayvulkanlayer.so), invoking an uninitialized function pointer. - Added a POSIX signal trap (
sigsetjmp/sigaction) around companion device discovery to isolate any third-party layer or driver faults, ensuring seamless fallback to same-GPU upscaling instead of terminating the game.
- Fixed a segmentation fault during companion iGPU initialization in games running with the Steam Overlay and Steam Fossilize layers (
- OpenGL / Zink Bidirectional Viewport & Downsampling Remapping:
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
gl/xfsr_gl_shim.cwhen downsampling or supersampling (DSR 4K / 1440p). - Replaced unidirectional
render < windowassumptions acrossglViewport,glScissor,glBlitFramebuffer,glfwGetFramebufferSize,SDL_GL_GetDrawableSize, and X11 window queries with bidirectional delta checks (abs(...) > threshold). - Allowed downsampling scale factors down to
0.125f(e.g.scale=0.50for 4K → 1080p SSAA) intarget_render_size,load_extents, andshrink_wl_size.
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
[0.9.0] — 2026-11-02
Added
- Linux AppImage: portable
EdgeScale-*-x86_64.AppImagerelease artifact (scripts/package-appimage.sh) with offline--installand--uninstallsupport; primary Linux install path replacing the curl installer. - Windows Setup.exe: Inno Setup installer/uninstaller (
packaging/windows/edgescale.iss) with icon integration, registry setup, and Add/Remove Programs support; ZIP +.batscripts remain as fallback. - Edge Nearest Neighbor mode (
--edge-mode nearest): EdgePass compute shader point-sampling mode dedicated for 2D pixel art games, preserving crisp sprite pixels with zero blur or haloing. F2 hotkey cyclesquality→perf→nearestwhen Edge upscaler is active. - Nearest-neighbor upscaler (
--upscaler nearest):VK_FILTER_NEARESTblit for 2D pixel art; F3 cycle includesblit → nearest → nis → edge. - Manual resolutions:
--render WxHfor absolute internal size;--output WxHauto-detects the primary display when omitted (supports 4K). Profile keysoutput=/render=. Adaptive scale max raised to 4.0×.
Changed
- README refreshed for EdgeScale branding (
EDGESCALE_*env vars primary), current one-way/fused offload guidance, AppImage + Setup.exe install, nearest + 4K docs. - Install script rename:
scripts/install-edge-run.shreplacesinstall-xfsr-run.sh(install-edgerun.shremains a symlink). Docs and CMakeinstall-edge-runtarget updated; user-facing copy no longer leads with proprietary FSR branding. - Godot 3 GLES (BunnyForest): auto-enable Zink with caps-shrink so the overlay and ...
EdgeScale 0.11.0
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[Unreleased]
[0.11.0] — 2026-11-05
Added
-
Distributed GPU Memory Management & Heterogeneous Workload Orchestration:
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
src/scheduler/gpu_scheduler.hpp,bench/scheduler_test.cpp). - Separates the Memory Manager (capacity discovery, heap compatibility, residency tracking, and oversubscription fallback) from the Execution Orchestrator (cost-aware placement scoring across bandwidth, compute throughput, transfer latency, and access frequency).
- Validated with controlled benchmark matrix demonstrating that offloading transformer layers to secondary compute (e.g. AMD Vega 10 iGPU) delivers +43% higher decode throughput (14.4 t/s) compared to spilling allocations to host system RAM over PCIe (9.6 t/s).
- Implemented cost-aware multi-GPU and memory tiering architecture that coordinates workloads across independent physical devices rather than treating disparate physical VRAMs as a single unified device (
-
VRAM Observability & Cross-Vendor Telemetry Daemon (
vram_monitor):- Unified multi-GPU telemetry CLI and background daemon (
src/vram_monitor/) monitoring NVIDIA dGPU (NVML: VRAM used/free, BAR1, temperature, utilization), AMD iGPU/dGPU (sysfs:mem_info_vram_used,mem_info_gtt_used), and host DDR memory (/proc/meminfo). - Implements weighted resource residency scoring (
$S_i = \frac{F_i \cdot R_i \cdot C_i}{\text{Size}_{\text{MB}} \cdot (1 + A_i)}$ ) to drive cost-effective migration policies between VRAM, secondary GPU memory, and system RAM. - Supports
--once,--json,--daemon [interval], and--scorefor continuous observability.
- Unified multi-GPU telemetry CLI and background daemon (
-
AI CUDA Memory Virtualization & Oversubscription Engine (
ai_vram_test/ManagedLayerEngine):- Reusable stream-prefetched memory management engine (
src/ai_vram/ai_vram_adapter.hpp,src/ai_vram/ai_vram_test.cu) leveraging CUDA Heterogeneous Memory Management (HMM) and unified memory. - Successfully executes workloads exceeding physical GPU capacity (e.g. 5.25 GB across 6 layers on a 4 GB GTX 1650 at 3.03 GB/s streaming throughput) where standard allocations terminate with out-of-memory errors (
cudaErrorMemoryAllocation).
- Reusable stream-prefetched memory management engine (
-
Controlled Benchmark Matrix Suite (
tests/benchmark_matrix.sh):- Reproducible benchmark comparing native VRAM baseline (
$c=4096$ ), native driver failure ($c=32768$ ,VK_ERROR_OUT_OF_DEVICE_MEMORY), EdgeScale virtualized budget ($c=32768$ , 40.4 t/s prefill / 9.6 t/s decode), dual-GPU layer split (14.4 t/s decode), and dual-GPU oversubscription (3.6 t/s decode with 901 MB spilled).
- Reproducible benchmark comparing native VRAM baseline (
-
Automated Local LLM Launcher (
scripts/run_local_llm.sh):- Wrapper for running large local models (e.g. Qwen 3.5 4.3B GGUF) with large context windows under EdgeScale VRAM virtualization.
Fixed
- Benchmark Terminal Redirection & Real-Time Token Parsing:
- Fixed an issue where
llama-cliwrote output directly to/dev/tty, bypassing shell redirection and producingN/Atoken rates in scripted benchmarks. Execution now cleanly detaches viasetsidand redirects standard streams.
- Fixed an issue where
- EdgePass Upscaler Mode Logging:
- Fixed logging in
src/edge_pass.cppwhere nearest-neighbor mode erroneously logged asquality.
- Fixed logging in
[0.10.0] — 2026-11-04
Added
- VRAM Capacity Spoofing & Oversubscription Fallback (
--spoof-vram [SIZE]/EDGESCALE_SPOOF_VRAM):- Intercepts
vkGetPhysicalDeviceMemoryPropertiesandvkGetPhysicalDeviceMemoryProperties2to report expandedDEVICE_LOCALVRAM capacity (e.g. 8GB, 12GB, 16GB, orauto). - Transparently intercepts
VK_EXT_memory_budget(VkPhysicalDeviceMemoryBudgetPropertiesEXT) so modern engines (DXVK / VKD3D-Proton / Unreal) see increased VRAM budget instead of locking out High/Ultra textures. - Implements graceful allocation spilling in
vkAllocateMemory: when physical local VRAM is exhausted (VK_ERROR_OUT_OF_DEVICE_MEMORY), automatically falls back to allocating over PCIe in system RAM (HOST_VISIBLE) instead of crashing the application. - Profile key:
spoof_vram=8GB.
- Intercepts
- Supersampling / DSR (4K Render on 1080p Display) (
--dsr 4k|1440p|<val>/--render 3840x2160 --output 1920x1080):- Enables true downsampling / Virtual Super Resolution (DSR / SSAA) in the Vulkan layer: the game renders internally at 4K (3840×2160) or 1440p, while the swapchain presents at native monitor resolution (e.g. 1080p).
- Shipped dedicated
edgeDownsamplecompute shader inshaders/edge_pass.comp.glsl: 4-tap staggered bilinear box filter covering up to a 4×4 texel area, combined with optional Contrast-Adaptive Sharpening (CAS) for clean, anti-aliased SSAA without shimmering. - Automatic positive mip LOD bias calculation (
-log2(scale) = +1.0at 4K→1080p) to match high-resolution texture sampling to display pixel density and eliminate texture crawling. - Profile key:
dsr=4k.
Fixed
- Steam Overlay / Companion iGPU Probe Crash (
SIGSEGVin CS2 / Steam titles):- Fixed a segmentation fault during companion iGPU initialization in games running with the Steam Overlay and Steam Fossilize layers (
libVkLayer_steam_fossilize.so). - Corrected
layerGIPAinDeviceContext::createLogicalViaLoader: the layer was previously forwardingpfnNextGetInstanceProcAddrintovkLayerCreateDevicerather than its own negotiatedvkGetInstanceProcAddr. This prevented the Vulkan loader from identifying EdgeScale in the layer chain and caused the loader to re-enter upstream layers (steamoverlayvulkanlayer.so), invoking an uninitialized function pointer. - Added a POSIX signal trap (
sigsetjmp/sigaction) around companion device discovery to isolate any third-party layer or driver faults, ensuring seamless fallback to same-GPU upscaling instead of terminating the game.
- Fixed a segmentation fault during companion iGPU initialization in games running with the Steam Overlay and Steam Fossilize layers (
- OpenGL / Zink Bidirectional Viewport & Downsampling Remapping:
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
gl/xfsr_gl_shim.cwhen downsampling or supersampling (DSR 4K / 1440p). - Replaced unidirectional
render < windowassumptions acrossglViewport,glScissor,glBlitFramebuffer,glfwGetFramebufferSize,SDL_GL_GetDrawableSize, and X11 window queries with bidirectional delta checks (abs(...) > threshold). - Allowed downsampling scale factors down to
0.125f(e.g.scale=0.50for 4K → 1080p SSAA) intarget_render_size,load_extents, andshrink_wl_size.
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
[0.9.0] — 2026-11-02
Added
- Linux AppImage: portable
EdgeScale-*-x86_64.AppImagerelease artifact (scripts/package-appimage.sh) with offline--installand--uninstallsupport; primary Linux install path replacing the curl installer. - Windows Setup.exe: Inno Setup installer/uninstaller (
packaging/windows/edgescale.iss) with icon integration, registry setup, and Add/Remove Programs support; ZIP +.batscripts remain as fallback. - Edge Nearest Neighbor mode (
--edge-mode nearest): EdgePass compute shader point-sampling mode dedicated for 2D pixel art games, preserving crisp sprite pixels with zero blur or haloing. F2 hotkey cyclesquality→perf→nearestwhen Edge upscaler is active. - Nearest-neighbor upscaler (
--upscaler nearest):VK_FILTER_NEARESTblit for 2D pixel art; F3 cycle includesblit → nearest → nis → edge. - Manual resolutions:
--render WxHfor absolute internal size;--output WxHauto-detects the primary display when omitted (supports 4K). Profile keysoutput=/render=. Adaptive scale max raised to 4.0×.
Changed
- README refreshed for EdgeScale branding (
EDGESCALE_*env vars primary), current one-way/fused offload guidance, AppImage + Setup.exe install, nearest + 4K docs. - Install script rename:
scripts/install-edge-run.shreplacesinstall-xfsr-run.sh(install-edgerun.shremains a symlink). Docs and CMakeinstall-edge-runtarget updated; user-facing copy no longer leads with proprietary FSR branding. - Godot 3 GLES (BunnyForest): auto-enable Zink with caps-shrink so the overlay and live upscaler/preset changes work; GL shim remaps default-framebuffer viewports only (keeps design RTs intact) and does not X11 size-lie when the exe links
libX11(avoids maximize/fullscreen postage-stamps). - Godot 4 sowrap + Zink (MMX): live F1 preset recreate is blocked (toast: restart
edgerunwith--preset); upscaler hotkeys still apply live.
Fixed
- Cross-device swapchain re-creation & offload safety:
- Prevented crash (
SIGSEGVin mesa/radv) when toggling between offload (iGPU swapchain) and same-GPU (dGPU swapchain) modes by properly tracking owning device and avoiding invalidoldSwapchainhandle reuse across physical devices. - Guarded
F4offload hotkey in games configured withoffload=0via profile or env var (e.g. D3D12 / VKD3D titles like Resident Evil Village) to avoid accidental runtime presentation lockups.
- Prevented crash (
- Fullscreen Upscaler Switching:
- Live upscaler hotkeys (
F3cycle between Edge, NIS, FSR1, Nearest, Blit) now update and run immediately in Fullscreen mode. Previously,xfsr_QueuePresentKHRguarded live switching behindps->renderW != ps->displayW, which froze upscaler state whenever the title ran at native display resolution. - Passes are lazily initialized and resized upon activation, ensuring live hotkey responsiveness regardless of whether scaling or 1:1 post-processing sharpening is in use.
- Fixed
caps_shrink=0(in-game resolution titles like Resident Evil Village) falsely taking the identity passthrough bypass when entering Fullscreen at lower resolutions due to compositor surface query matching.
- Live upscaler hotkeys (
- Zink image not filling the window:
- Avoid monitor-sized ...
EdgeScale 0.10.0
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[Unreleased]
[0.10.0] — 2026-11-04
Added
- VRAM Capacity Spoofing & Oversubscription Fallback (
--spoof-vram [SIZE]/EDGESCALE_SPOOF_VRAM):- Intercepts
vkGetPhysicalDeviceMemoryPropertiesandvkGetPhysicalDeviceMemoryProperties2to report expandedDEVICE_LOCALVRAM capacity (e.g. 8GB, 12GB, 16GB, orauto). - Transparently intercepts
VK_EXT_memory_budget(VkPhysicalDeviceMemoryBudgetPropertiesEXT) so modern engines (DXVK / VKD3D-Proton / Unreal) see increased VRAM budget instead of locking out High/Ultra textures. - Implements graceful allocation spilling in
vkAllocateMemory: when physical local VRAM is exhausted (VK_ERROR_OUT_OF_DEVICE_MEMORY), automatically falls back to allocating over PCIe in system RAM (HOST_VISIBLE) instead of crashing the application. - Profile key:
spoof_vram=8GB.
- Intercepts
- Supersampling / DSR (4K Render on 1080p Display) (
--dsr 4k|1440p|<val>/--render 3840x2160 --output 1920x1080):- Enables true downsampling / Virtual Super Resolution (DSR / SSAA) in the Vulkan layer: the game renders internally at 4K (3840×2160) or 1440p, while the swapchain presents at native monitor resolution (e.g. 1080p).
- Shipped dedicated
edgeDownsamplecompute shader inshaders/edge_pass.comp.glsl: 4-tap staggered bilinear box filter covering up to a 4×4 texel area, combined with optional Contrast-Adaptive Sharpening (CAS) for clean, anti-aliased SSAA without shimmering. - Automatic positive mip LOD bias calculation (
-log2(scale) = +1.0at 4K→1080p) to match high-resolution texture sampling to display pixel density and eliminate texture crawling. - Profile key:
dsr=4k.
Fixed
- OpenGL / Zink Bidirectional Viewport & Downsampling Remapping:
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
gl/xfsr_gl_shim.cwhen downsampling or supersampling (DSR 4K / 1440p). - Replaced unidirectional
render < windowassumptions acrossglViewport,glScissor,glBlitFramebuffer,glfwGetFramebufferSize,SDL_GL_GetDrawableSize, and X11 window queries with bidirectional delta checks (abs(...) > threshold). - Allowed downsampling scale factors down to
0.125f(e.g.scale=0.50for 4K → 1080p SSAA) intarget_render_size,load_extents, andshrink_wl_size.
- Fixed quarter-screen / bottom-left postage stamp rendering bug in
[0.9.0] — 2026-11-02
Added
- Linux AppImage: portable
EdgeScale-*-x86_64.AppImagerelease artifact (scripts/package-appimage.sh) with offline--installand--uninstallsupport; primary Linux install path replacing the curl installer. - Windows Setup.exe: Inno Setup installer/uninstaller (
packaging/windows/edgescale.iss) with icon integration, registry setup, and Add/Remove Programs support; ZIP +.batscripts remain as fallback. - Edge Nearest Neighbor mode (
--edge-mode nearest): EdgePass compute shader point-sampling mode dedicated for 2D pixel art games, preserving crisp sprite pixels with zero blur or haloing. F2 hotkey cyclesquality→perf→nearestwhen Edge upscaler is active. - Nearest-neighbor upscaler (
--upscaler nearest):VK_FILTER_NEARESTblit for 2D pixel art; F3 cycle includesblit → nearest → nis → edge. - Manual resolutions:
--render WxHfor absolute internal size;--output WxHauto-detects the primary display when omitted (supports 4K). Profile keysoutput=/render=. Adaptive scale max raised to 4.0×.
Changed
- README refreshed for EdgeScale branding (
EDGESCALE_*env vars primary), current one-way/fused offload guidance, AppImage + Setup.exe install, nearest + 4K docs. - Install script rename:
scripts/install-edge-run.shreplacesinstall-xfsr-run.sh(install-edgerun.shremains a symlink). Docs and CMakeinstall-edge-runtarget updated; user-facing copy no longer leads with proprietary FSR branding. - Godot 3 GLES (BunnyForest): auto-enable Zink with caps-shrink so the overlay and live upscaler/preset changes work; GL shim remaps default-framebuffer viewports only (keeps design RTs intact) and does not X11 size-lie when the exe links
libX11(avoids maximize/fullscreen postage-stamps). - Godot 4 sowrap + Zink (MMX): live F1 preset recreate is blocked (toast: restart
edgerunwith--preset); upscaler hotkeys still apply live.
Fixed
- Cross-device swapchain re-creation & offload safety:
- Prevented crash (
SIGSEGVin mesa/radv) when toggling between offload (iGPU swapchain) and same-GPU (dGPU swapchain) modes by properly tracking owning device and avoiding invalidoldSwapchainhandle reuse across physical devices. - Guarded
F4offload hotkey in games configured withoffload=0via profile or env var (e.g. D3D12 / VKD3D titles like Resident Evil Village) to avoid accidental runtime presentation lockups.
- Prevented crash (
- Fullscreen Upscaler Switching:
- Live upscaler hotkeys (
F3cycle between Edge, NIS, FSR1, Nearest, Blit) now update and run immediately in Fullscreen mode. Previously,xfsr_QueuePresentKHRguarded live switching behindps->renderW != ps->displayW, which froze upscaler state whenever the title ran at native display resolution. - Passes are lazily initialized and resized upon activation, ensuring live hotkey responsiveness regardless of whether scaling or 1:1 post-processing sharpening is in use.
- Fixed
caps_shrink=0(in-game resolution titles like Resident Evil Village) falsely taking the identity passthrough bypass when entering Fullscreen at lower resolutions due to compositor surface query matching.
- Live upscaler hotkeys (
- Zink image not filling the window:
- Avoid monitor-sized
DISPLAY_EXTENTunless--output/--render/ gamescope is set; CreateSwapchain ignores mismatched monitor seeds for windowed Zink. - GL shim proportionally remaps letterboxed viewports/scissors/blits (Godot keep-aspect), keeps SDL/GLFW window and drawable size queries in sync at render resolution, and preserves
GL_NEARESTon remapped blits when--upscaler nearest.
- Avoid monitor-sized
- BunnyForest maximize/fullscreen stamp: X11 size-lie desynced Godot from WSI after resize; lie auto-off for
libX11-linked titles; drawable-size queries stay real so stretch tracks the window.
[0.8.2] — 2026-11-01
Added
- Windows Native Vulkan Support:
- Added native Windows x86_64 implicit Vulkan layer support (
VkLayer_XFSR.dll) exportingvkGetInstanceProcAddr,vkGetDeviceProcAddr, andvkNegotiateLoaderLayerInterfaceVersion. - In-game Win32 hotkey polling using
GetAsyncKeyState(F1preset,F2RCAS/edge-mode,F3upscaler cycle,F10pin). - Win32 memory alignment and platform abstractions (
_aligned_malloc,_putenv_s,%LOCALAPPDATA%\EdgeScaleshader resolution, and%TEMP%control files). - Windows batch build & installation scripts (
scripts/build-windows.bat,scripts/install-windows.bat, andscripts/uninstall-windows.bat). - Standalone Linux-to-Windows cross-compilation pipeline (
scripts/build-windows-cross.sh). - Automated Windows packaging and release artifact generation in GitHub Actions (
.github/workflows/release.yml).
- Added native Windows x86_64 implicit Vulkan layer support (
- Technical Documentation & Branding:
- Comprehensive architectural deep-dive and comparison with Lossless Scaling and Magpie (
docs/ARCHITECTURE_AND_COMPARISON.md). - Integrated official project logo into README and updated all project links to
https://github.com/jersobh/edge.
- Comprehensive architectural deep-dive and comparison with Lossless Scaling and Magpie (
[0.8.1] — 2026-11-01
Changed
- Rebranded to EdgeScale (
edgerun):- The project is now EdgeScale, putting the custom Edge reconstruction engine and in-process scaling pipeline front and center.
- The primary CLI runner is now
edgerun(e.g.edgerun --preset performance %command%). - Full backward compatibility:
xfsr-runis maintained as a direct alias/symlink, and allXFSR_*environment variables and configs (~/.config/xfsr/profiles.conf) continue to work alongside newEDGESCALE_*/~/.config/edgescale/paths.
Fixed
- CS2 crash on startup with iGPU offload (NVIDIA Reflex): CS2 enables Reflex (
VK_NV_low_latency2) and passed the opaque one-way swapchain handle straight to the NVIDIA ICD (causing alibnvidia-glcoreSIGSEGV). The layer now interceptsvkSetLatencySleepModeNV,vkLatencySleepNV(signals the sleep timeline semaphore),vkSetLatencyMarkerNV,vkGetLatencyTimingsNV,vkGetRefreshCycleDurationGOOGLEandvkSetLocalDimmingAMD, stubbing them for proxy handles and forwarding real ones. --presetignored at startup: when caps-shrink is active, an engine's initial swapchain size (e.g. CoD4 starting windowed at 1280x720 on a 1080p display) no longer overwrites the chosen preset/scale back toquality. Ratio-derived scale is only used withXFSR_CAPS_SHRINK=0.
[0.8.0] — 2026-10-31
Fixed
- Edge upscaler colors: edge output now matches FSR1 / NIS / blit.
- Direct-to-swapchain stores no longer double-swizzle BGRA swapchains (the storage view already uses the swapchain format), which swapped red and blue and gave a blue tint.
- The contrast S-curve and saturation boost ("beautify") is now opt-in with
XFSR_EDGE_BEAUTIFY=1, so by default edge leaves colors unchanged.
- Freeze on quality/scale change with edge:
FrameTransfer::resetPipelinewaits on its own slot fences (2 s timeout) instead ofvkDeviceWaitIdleon the app device.
[0.7.0] — 2026-10-31
Added
- Always-On Dual-GPU iGPU Offload:
- Offload to iGPU enabled by default across all titles (
XFSR_OFFLOAD=1), routing rendering on discrete GPU (dGPU) a...
- Offload to iGPU enabled by default across all titles (
EdgeScale 0.9.0
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[Unreleased]
[0.9.0] — 2026-11-02
Added
- Linux AppImage: portable
EdgeScale-*-x86_64.AppImagerelease artifact (scripts/package-appimage.sh) with offline--installand--uninstallsupport; primary Linux install path replacing the curl installer. - Windows Setup.exe: Inno Setup installer/uninstaller (
packaging/windows/edgescale.iss) with icon integration, registry setup, and Add/Remove Programs support; ZIP +.batscripts remain as fallback. - Edge Nearest Neighbor mode (
--edge-mode nearest): EdgePass compute shader point-sampling mode dedicated for 2D pixel art games, preserving crisp sprite pixels with zero blur or haloing. F2 hotkey cyclesquality→perf→nearestwhen Edge upscaler is active. - Nearest-neighbor upscaler (
--upscaler nearest):VK_FILTER_NEARESTblit for 2D pixel art; F3 cycle includesblit → nearest → nis → edge. - Manual resolutions:
--render WxHfor absolute internal size;--output WxHauto-detects the primary display when omitted (supports 4K). Profile keysoutput=/render=. Adaptive scale max raised to 4.0×.
Changed
- README refreshed for EdgeScale branding (
EDGESCALE_*env vars primary), current one-way/fused offload guidance, AppImage + Setup.exe install, nearest + 4K docs. - Install script rename:
scripts/install-edge-run.shreplacesinstall-xfsr-run.sh(install-edgerun.shremains a symlink). Docs and CMakeinstall-edge-runtarget updated; user-facing copy no longer leads with proprietary FSR branding. - Godot 3 GLES (BunnyForest): auto-enable Zink with caps-shrink so the overlay and live upscaler/preset changes work; GL shim remaps default-framebuffer viewports only (keeps design RTs intact) and does not X11 size-lie when the exe links
libX11(avoids maximize/fullscreen postage-stamps). - Godot 4 sowrap + Zink (MMX): live F1 preset recreate is blocked (toast: restart
edgerunwith--preset); upscaler hotkeys still apply live.
Fixed
- Cross-device swapchain re-creation & offload safety:
- Prevented crash (
SIGSEGVin mesa/radv) when toggling between offload (iGPU swapchain) and same-GPU (dGPU swapchain) modes by properly tracking owning device and avoiding invalidoldSwapchainhandle reuse across physical devices. - Guarded
F4offload hotkey in games configured withoffload=0via profile or env var (e.g. D3D12 / VKD3D titles like Resident Evil Village) to avoid accidental runtime presentation lockups.
- Prevented crash (
- Fullscreen Upscaler Switching:
- Live upscaler hotkeys (
F3cycle between Edge, NIS, FSR1, Nearest, Blit) now update and run immediately in Fullscreen mode. Previously,xfsr_QueuePresentKHRguarded live switching behindps->renderW != ps->displayW, which froze upscaler state whenever the title ran at native display resolution. - Passes are lazily initialized and resized upon activation, ensuring live hotkey responsiveness regardless of whether scaling or 1:1 post-processing sharpening is in use.
- Fixed
caps_shrink=0(in-game resolution titles like Resident Evil Village) falsely taking the identity passthrough bypass when entering Fullscreen at lower resolutions due to compositor surface query matching.
- Live upscaler hotkeys (
- Zink image not filling the window:
- Avoid monitor-sized
DISPLAY_EXTENTunless--output/--render/ gamescope is set; CreateSwapchain ignores mismatched monitor seeds for windowed Zink. - GL shim proportionally remaps letterboxed viewports/scissors/blits (Godot keep-aspect), keeps SDL/GLFW window and drawable size queries in sync at render resolution, and preserves
GL_NEARESTon remapped blits when--upscaler nearest.
- Avoid monitor-sized
- BunnyForest maximize/fullscreen stamp: X11 size-lie desynced Godot from WSI after resize; lie auto-off for
libX11-linked titles; drawable-size queries stay real so stretch tracks the window.
[0.8.2] — 2026-11-01
Added
- Windows Native Vulkan Support:
- Added native Windows x86_64 implicit Vulkan layer support (
VkLayer_XFSR.dll) exportingvkGetInstanceProcAddr,vkGetDeviceProcAddr, andvkNegotiateLoaderLayerInterfaceVersion. - In-game Win32 hotkey polling using
GetAsyncKeyState(F1preset,F2RCAS/edge-mode,F3upscaler cycle,F10pin). - Win32 memory alignment and platform abstractions (
_aligned_malloc,_putenv_s,%LOCALAPPDATA%\EdgeScaleshader resolution, and%TEMP%control files). - Windows batch build & installation scripts (
scripts/build-windows.bat,scripts/install-windows.bat, andscripts/uninstall-windows.bat). - Standalone Linux-to-Windows cross-compilation pipeline (
scripts/build-windows-cross.sh). - Automated Windows packaging and release artifact generation in GitHub Actions (
.github/workflows/release.yml).
- Added native Windows x86_64 implicit Vulkan layer support (
- Technical Documentation & Branding:
- Comprehensive architectural deep-dive and comparison with Lossless Scaling and Magpie (
docs/ARCHITECTURE_AND_COMPARISON.md). - Integrated official project logo into README and updated all project links to
https://github.com/jersobh/edge.
- Comprehensive architectural deep-dive and comparison with Lossless Scaling and Magpie (
[0.8.1] — 2026-11-01
Changed
- Rebranded to EdgeScale (
edgerun):- The project is now EdgeScale, putting the custom Edge reconstruction engine and in-process scaling pipeline front and center.
- The primary CLI runner is now
edgerun(e.g.edgerun --preset performance %command%). - Full backward compatibility:
xfsr-runis maintained as a direct alias/symlink, and allXFSR_*environment variables and configs (~/.config/xfsr/profiles.conf) continue to work alongside newEDGESCALE_*/~/.config/edgescale/paths.
Fixed
- CS2 crash on startup with iGPU offload (NVIDIA Reflex): CS2 enables Reflex (
VK_NV_low_latency2) and passed the opaque one-way swapchain handle straight to the NVIDIA ICD (causing alibnvidia-glcoreSIGSEGV). The layer now interceptsvkSetLatencySleepModeNV,vkLatencySleepNV(signals the sleep timeline semaphore),vkSetLatencyMarkerNV,vkGetLatencyTimingsNV,vkGetRefreshCycleDurationGOOGLEandvkSetLocalDimmingAMD, stubbing them for proxy handles and forwarding real ones. --presetignored at startup: when caps-shrink is active, an engine's initial swapchain size (e.g. CoD4 starting windowed at 1280x720 on a 1080p display) no longer overwrites the chosen preset/scale back toquality. Ratio-derived scale is only used withXFSR_CAPS_SHRINK=0.
[0.8.0] — 2026-10-31
Fixed
- Edge upscaler colors: edge output now matches FSR1 / NIS / blit.
- Direct-to-swapchain stores no longer double-swizzle BGRA swapchains (the storage view already uses the swapchain format), which swapped red and blue and gave a blue tint.
- The contrast S-curve and saturation boost ("beautify") is now opt-in with
XFSR_EDGE_BEAUTIFY=1, so by default edge leaves colors unchanged.
- Freeze on quality/scale change with edge:
FrameTransfer::resetPipelinewaits on its own slot fences (2 s timeout) instead ofvkDeviceWaitIdleon the app device.
[0.7.0] — 2026-10-31
Added
- Always-On Dual-GPU iGPU Offload:
- Offload to iGPU enabled by default across all titles (
XFSR_OFFLOAD=1), routing rendering on discrete GPU (dGPU) and post-processing/upscaling/presentation on integrated GPU (iGPU). - One-way direct WSI presentation on iGPU supported under Mesa Zink (OpenGL) using monotonic opaque swapchain handles and triple-buffered WSI (
minImageCount >= 3) to eliminate acquire stalls. - Fused asynchronous round-trip offload pipeline (
OffloadRoundTrip::submit/submitBlit) across all spatial upscalers (EdgePass,FsrPass,NisPass, andBlit), replacing the synchronous multi-copy CPU blocking fallback. - Offload resilience: never falls back to single-GPU or disables offload when render and display extents match (1:1 stubborn titles) or when one-way WSI fails; seamlessly transitions to round-trip iGPU offload.
- Overlay PCIe optimization: overlay texture buffer upload is gated on text changes, eliminating redundant 460 KB host-to-device transfers every frame.
- Offload to iGPU enabled by default across all titles (
- Universal Vulkan and OpenGL Compatibility:
- Automatic OpenGL and Zink detection in
scripts/xfsr-runacross both Linux ELF binaries and Windows PE executables (opengl32.dll,glew32.dll, OpenGL entry points). - Seamless Proton / Wine WOW64 support: automatically exports
PROTON_USE_WOW64=1for 32-bit Windows games so the 64-bitlibVkLayer_XFSR.soVulkan layer attaches correctly. - Extended OpenGL interceptor (
gl/xfsr_gl_shim.c) withglBlitFramebuffer,SDL_GL_GetDrawableSize, andSDL_GetWindowSizeInPixelshooks so FBO-blitting engines and SDL games properly scale to the shrunk swapchain. - Surface capability shrinking fixes (
applyCapsShrink): dynamically queries live surface display extents, advertises scaled sizes incurrentExtentandmaxImageExtent, and keepsminImageExtentun-raised to preserve in-game low-resolution choices (e.g. Resident Evil Village).
- Automatic OpenGL and Zink detection in
- Beautifying High-Performance Edge Upscaler for Weaker Hardware:
- Re-engineered edge_pass.comp.glsl with zero shared memory (LDS) and zero barriers, achieving 100% GPU occupancy on weaker discrete cards (GTX 1650, Pascal/Turing), integrated APUs, and handhelds.
- Sub-Pixel Edge Tangent Reconstruction: Traces continuous edge normals and blends along edge tangents to eliminate jagged staircases on geometry silhouettes in low rendering resolutions.
- **...
EdgeScale 0.8.3
Changelog
All notable changes to EdgeScale (edgerun / legacy xfsr-run) are documented here.
Format based on Keep a Changelog.
Versioning follows Semantic Versioning.
[Unreleased]
[0.8.3] — 2026-11-02
Added
- Linux AppImage: portable
EdgeScale-*-x86_64.AppImagerelease artifact (scripts/package-appimage.sh); primary Linux install path (curl installer demoted). - Windows Setup.exe: Inno Setup installer/uninstaller (
packaging/windows/edgescale.iss) with Add/Remove Programs support; ZIP +.batscripts remain as fallback. - Nearest-neighbor upscaler (
--upscaler nearest):VK_FILTER_NEARESTblit for 2D pixel art; F3 cycle includesblit → nearest → nis → edge. - Manual resolutions:
--render WxHfor absolute internal size;--output WxHauto-detects the primary display when omitted (supports 4K). Profile keysoutput=/render=. Adaptive scale max raised to 4.0×.
Changed
- README refreshed for EdgeScale branding (
EDGESCALE_*env vars primary), current one-way/fused offload guidance, AppImage + Setup.exe install, nearest + 4K docs. - Install script rename:
scripts/install-edge-run.shreplacesinstall-xfsr-run.sh(install-edgerun.shremains a symlink). Docs and CMakeinstall-edge-runtarget updated; user-facing copy no longer leads with proprietary FSR branding. - Godot 3 GLES (BunnyForest): auto-enable Zink with caps-shrink so the overlay and live upscaler/preset changes work; GL shim remaps default-framebuffer viewports only (keeps design RTs intact) and does not X11 size-lie when the exe links
libX11(avoids maximize/fullscreen postage-stamps). - Godot 4 sowrap + Zink (MMX): live F1 preset recreate is blocked (toast: restart
edgerunwith--preset); upscaler hotkeys still apply live.
Fixed
- Zink image not filling the window:
- Avoid monitor-sized
DISPLAY_EXTENTunless--output/--render/ gamescope is set; CreateSwapchain ignores mismatched monitor seeds for windowed Zink. - GL shim proportionally remaps letterboxed viewports/scissors/blits (Godot keep-aspect), keeps SDL/GLFW window and drawable size queries in sync at render resolution, and preserves
GL_NEARESTon remapped blits when--upscaler nearest.
- Avoid monitor-sized
- BunnyForest maximize/fullscreen stamp: X11 size-lie desynced Godot from WSI after resize; lie auto-off for
libX11-linked titles; drawable-size queries stay real so stretch tracks the window.
[0.8.2] — 2026-11-01
Added
- Windows Native Vulkan Support:
- Added native Windows x86_64 implicit Vulkan layer support (
VkLayer_XFSR.dll) exportingvkGetInstanceProcAddr,vkGetDeviceProcAddr, andvkNegotiateLoaderLayerInterfaceVersion. - In-game Win32 hotkey polling using
GetAsyncKeyState(F1preset,F2RCAS/edge-mode,F3upscaler cycle,F10pin). - Win32 memory alignment and platform abstractions (
_aligned_malloc,_putenv_s,%LOCALAPPDATA%\EdgeScaleshader resolution, and%TEMP%control files). - Windows batch build & installation scripts (
scripts/build-windows.bat,scripts/install-windows.bat, andscripts/uninstall-windows.bat). - Standalone Linux-to-Windows cross-compilation pipeline (
scripts/build-windows-cross.sh). - Automated Windows packaging and release artifact generation in GitHub Actions (
.github/workflows/release.yml).
- Added native Windows x86_64 implicit Vulkan layer support (
- Technical Documentation & Branding:
- Comprehensive architectural deep-dive and comparison with Lossless Scaling and Magpie (
docs/ARCHITECTURE_AND_COMPARISON.md). - Integrated official project logo into README and updated all project links to
https://github.com/jersobh/edge.
- Comprehensive architectural deep-dive and comparison with Lossless Scaling and Magpie (
[0.8.1] — 2026-11-01
Changed
- Rebranded to EdgeScale (
edgerun):- The project is now EdgeScale, putting the custom Edge reconstruction engine and in-process scaling pipeline front and center.
- The primary CLI runner is now
edgerun(e.g.edgerun --preset performance %command%). - Full backward compatibility:
xfsr-runis maintained as a direct alias/symlink, and allXFSR_*environment variables and configs (~/.config/xfsr/profiles.conf) continue to work alongside newEDGESCALE_*/~/.config/edgescale/paths.
Fixed
- CS2 crash on startup with iGPU offload (NVIDIA Reflex): CS2 enables Reflex (
VK_NV_low_latency2) and passed the opaque one-way swapchain handle straight to the NVIDIA ICD (causing alibnvidia-glcoreSIGSEGV). The layer now interceptsvkSetLatencySleepModeNV,vkLatencySleepNV(signals the sleep timeline semaphore),vkSetLatencyMarkerNV,vkGetLatencyTimingsNV,vkGetRefreshCycleDurationGOOGLEandvkSetLocalDimmingAMD, stubbing them for proxy handles and forwarding real ones. --presetignored at startup: when caps-shrink is active, an engine's initial swapchain size (e.g. CoD4 starting windowed at 1280x720 on a 1080p display) no longer overwrites the chosen preset/scale back toquality. Ratio-derived scale is only used withXFSR_CAPS_SHRINK=0.
[0.8.0] — 2026-10-31
Fixed
- Edge upscaler colors: edge output now matches FSR1 / NIS / blit.
- Direct-to-swapchain stores no longer double-swizzle BGRA swapchains (the storage view already uses the swapchain format), which swapped red and blue and gave a blue tint.
- The contrast S-curve and saturation boost ("beautify") is now opt-in with
XFSR_EDGE_BEAUTIFY=1, so by default edge leaves colors unchanged.
- Freeze on quality/scale change with edge:
FrameTransfer::resetPipelinewaits on its own slot fences (2 s timeout) instead ofvkDeviceWaitIdleon the app device.
[0.7.0] — 2026-10-31
Added
- Always-On Dual-GPU iGPU Offload:
- Offload to iGPU enabled by default across all titles (
XFSR_OFFLOAD=1), routing rendering on discrete GPU (dGPU) and post-processing/upscaling/presentation on integrated GPU (iGPU). - One-way direct WSI presentation on iGPU supported under Mesa Zink (OpenGL) using monotonic opaque swapchain handles and triple-buffered WSI (
minImageCount >= 3) to eliminate acquire stalls. - Fused asynchronous round-trip offload pipeline (
OffloadRoundTrip::submit/submitBlit) across all spatial upscalers (EdgePass,FsrPass,NisPass, andBlit), replacing the synchronous multi-copy CPU blocking fallback. - Offload resilience: never falls back to single-GPU or disables offload when render and display extents match (1:1 stubborn titles) or when one-way WSI fails; seamlessly transitions to round-trip iGPU offload.
- Overlay PCIe optimization: overlay texture buffer upload is gated on text changes, eliminating redundant 460 KB host-to-device transfers every frame.
- Offload to iGPU enabled by default across all titles (
- Universal Vulkan and OpenGL Compatibility:
- Automatic OpenGL and Zink detection in
scripts/xfsr-runacross both Linux ELF binaries and Windows PE executables (opengl32.dll,glew32.dll, OpenGL entry points). - Seamless Proton / Wine WOW64 support: automatically exports
PROTON_USE_WOW64=1for 32-bit Windows games so the 64-bitlibVkLayer_XFSR.soVulkan layer attaches correctly. - Extended OpenGL interceptor (
gl/xfsr_gl_shim.c) withglBlitFramebuffer,SDL_GL_GetDrawableSize, andSDL_GetWindowSizeInPixelshooks so FBO-blitting engines and SDL games properly scale to the shrunk swapchain. - Surface capability shrinking fixes (
applyCapsShrink): dynamically queries live surface display extents, advertises scaled sizes incurrentExtentandmaxImageExtent, and keepsminImageExtentun-raised to preserve in-game low-resolution choices (e.g. Resident Evil Village).
- Automatic OpenGL and Zink detection in
- Beautifying High-Performance Edge Upscaler for Weaker Hardware:
- Re-engineered edge_pass.comp.glsl with zero shared memory (LDS) and zero barriers, achieving 100% GPU occupancy on weaker discrete cards (GTX 1650, Pascal/Turing), integrated APUs, and handhelds.
- Sub-Pixel Edge Tangent Reconstruction: Traces continuous edge normals and blends along edge tangents to eliminate jagged staircases on geometry silhouettes in low rendering resolutions.
- Diagonal-Adaptive Edge Reconstruction: Smooths 45° and 135° diagonal boundaries without blur or moiré artifacts.
- Anti-Ringing Catmull-Rom Texture Filter: Enforces strict local bounding-box clamps to eradicate dark and bright halos around text, UI elements, foliage, and specular highlights.
- Integrated Contrast-Adaptive Sharpening (CAS): Recovers crisp micro-detail in textures while suppressing noise on flat gradients.
- Clarity & Vibrancy Beautification: Applies subtle S-curve contrast and selective saturation recovery to lift muddy, washed-out low-resolution frames into vibrant, rich visuals.
- Fast Perf Mode (Edge-Lite): Ultra-low latency 5-tap diagonal reconstruction with under 0.15 ms execution time for maximum framerates.
- Defaulted EdgePass to the high-fidelity
qualitymode with default sharpness of0.60.
- In-Game Resolution Indicator:
- HUD and status outputs now label sub-1.35x non-standard aspect or internal resolutions as
in-game(e.g.in-game 1.11x) rather than misleadingly bucketing them into the 1.5xqualitypreset label.
- HUD and status outputs now label sub-1.35x non-standard aspect or internal resolutions as
- Native Game Profiles:
- Call of Duty 4 (
[app:7940], D3D9iw3mp.exe/iw3sp.exe): direct layer upscaling withgamescope=0,caps_shrink=1,upscaler=edge,overlay=1. - Street Fighter 30th Anniversary Collection (
[app:586200], OpenGL) & Mega Man Legacy Collection ([app:363440], 32-bit D3D11Proteus.exe):gamescope=1with native Wayland backend. - Resident Evil Village (
[app:1196590]):preset=quality,upscaler=edge,edge_mode=quality, `edge_sharpnes...
- Call of Duty 4 (