GPU-driven DDC/CI controller for Windows. Targets monitors through the GPU I2C path using vendor APIs (NVIDIA NVAPI, AMD ADL/X).
- List detected displays (
-list) with names, serial numbers, and Windows display numbers (DISPLAY#) when available. - Set and get VCP codes on a target display (serial-based targeting for both NVIDIA and AMD).
- Optional register override and LG input shortcut:
-lginputsets VCP0xF4on register0x50; value is required (e.g., DP=208, HDMI=144). - Verbose reads:
-vdumps raw VCP response bytes. - Zero external runtime dependencies besides GPU driver + vendor SDK import libs/headers at build time.
external/ is used for the vendor SDK's (do not commit them to GitHub due to licensing):
external/nvapi/- Headers:
external/nvapi/- Drop all nvapi headers here - Libs:
external/nvapi/nvapi64.lib
- Headers:
external/adlx/- Drop the ADLXHelper.h header here- Headers:
external/adlx/include- Drop all of the adlx headers here
- Headers:
external/adlx-sdk/include- Drop the adl headers here
- Install CMake and a Visual Studio build toolchain.
- Configure + build:
cmake -B build -S .cmake --build build --config Release
- If you only need one vendor, you can disable the other in CMake:
-DGPUDDC_ENABLE_NVAPI=OFFor-DGPUDDC_ENABLE_ADLX=OFF. - Missing SDKs will leave that backend stubbed and the related commands will raise a runtime error.
# Help
gpuddc -help
# List detected monitors
gpuddc -list
# Set brightness (VCP 0x10) to 50 on an NVIDIA display with display serial 1234
gpuddc -gpu nvidia -serial 1234 -vcp 0x10 -value 50
# Set brightness on an AMD display with display serial ABCD
gpuddc -gpu amd -serial ABCD -vcp 0x10 -value 50
# Read brightness (with raw dump) on NVIDIA
gpuddc -gpu nvidia -serial 1234 -getvcp 0x10 -v
# LG input switch shortcut (uses VCP 0xF4, register 0x50); DisplayPort value = 208
gpuddc -gpu nvidia -serial 1234 -lginput 208
- NVAPI: Nvidia display driver must be installed for Nvidia support.
- ADLX: AMD display driver must be installed for AMD support.
- DDC/CI defaults: device address
0x6E, register0x51for standard VCP; override with-devaddr/-reg. LG shortcut forces register0x50and VCP0xF4.