Change Overscan/Underscan settings without Catalyst Control Center

I've had extensive discussion about the overscan/underscan dilemma with AMD developers who work on the Catalyst drivers.

The basic idea is that AMD would rather underscan some people whose HDMI displays don't overscan, and create too small of a picture (blank spaces around the picture), rather than not underscan and cause people whose displays always overscan (with no setting to change it and incorrect EDID information) to have the desktop display too large. The argument is that if the desktop is too large, then the user can't see where the Catalyst icon is or the start menu, and they therefore can't navigate the UI in order to make the appropriate change. So they are sticking to their guns on underscanning by default on HDMI to ensure that nobody gets stuck with a desktop that's too big for their screen (with UI elements hanging "off the screen").

I don't agree with the policy, but that's the way it is. It also seems to be a fairly unique decision among graphics driver developers, as I can't reproduce the weirdness on a number of other non-AMD devices: Android tablets, Nvidia cards, and Intel on-chip graphics.

There is a way to directly tweak the underscan/overscan on Linux by modifying values in the "PCSDB" (Persistent Configuration Store Database). I don't know what the equivalent is on Windows, or if you can even read/write the settings without using Catalyst.

I can't personally test this solution, but it appears that it worked for people on fairly recent drivers, so give it a shot: go to Tom's Hardware or I'll just re-post it here:

I found a fix for the overscan issue  
Go to the following key in the registry:  
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\video{####....}\0000 
Create a new DWORD: 
"DigitalHDTVDefaultUnderscan" = dword 0x0000 
Note: there might be several {####....} , should be the one with most of the ATI settings. 
Source:http://forum.beyond3d.com/showthread.php?t=62100

Here is a quote from an AMD source (who will remain anonymous) from several years ago about their HDMI underscan/overscan policy. Note that this applies to both Windows and Linux.

The purpose of defaulting to underscan is not so we rely on HDTVs to overscan back to full screen. This would be horrible due to the image quality loss on the downscale by GPU and then back upscaled by TV. Rather, it solves the problem where a TV defaults to overscan and has no mechanism to disable it (many cheap HDTVs). In this case, the TV will overscan the image and so the menus will typically be displayed off the edge of the screen and prevent the user from easily accessing them. The default is purely for usability purposes, and CCC-LE should be able to change it to 0% (or you can use that registry/PCS key to forced default of 0%).

If you have a smart HDTV that tells us if they overscan or not, we will do the right thing and default to 0%. However not many manufacturers properly set that property in the display's EDID so we fallback to the default of underscanning.

Underscanning should only be the default on HDMI. DisplayPort or DVI should not underscan by default.


For Linux, the fix is to enter this in the Terminal:

sudo aticonfig --set-pcs-val=MCIL,DigitalHDTVDefaultUnderscan,0

(posting this here to just need a single bookmark for all platforms)


I used steffen's answer to get this working on Windows 10 and tracked it down in a bit more detail.

I had previously tried disabling TVEnableOverscan and DigitalHDTVDefaultUnderscan without success (changing them also in the amdkmdag key under CurrentControlSet\Services) as well as multiple versions and combinations of legacy CCC/driver installers. Prior to the Windows 10 upgrade it was working fine on Windows 8.1 (I cannot remember doing anything special to get it working but not 100% sure).

Firstly, on Windows 10 the unpacked installer package (13.4 beta) refuses to run. Instead I went to Device Manager and uninstalled the display adapter, checking the box to delete the driver. I then chose Action->Scan for hardware changes and got a "Microsoft Basic Display Adapter". I right-clicked and chose update driver, then chose the option to specify the driver myself. I picked the folder Packages\Drivers\Display\W86A_INF from the unpacked AMD package as steffen described. There was quite a long period of hardware detection/installation and at the end of it the driver version was still the Windows 10 version (03/01/2015, 8.970.100.9001 instead of 04/24/2013, 8.970.100.0000 from the package). However, running the setup program and installing the VISION Conrol Center resulted in a functioning CCC. It reported the correct, older version of the driver.

At this point I was able to adjust overscan whilst running Process Monitor and watching which registry values were being set when I pressed Apply:

15:26:19.6441241    CCC.exe 6740    RegSetValue HKLM\System\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000\GDOADJR6 DFP    SUCCESS Type: REG_BINARY, Length: 384, Data: 00 00 00 00 02 00 00 00 10 00 00 00 00 00 00 00
15:26:19.6457995    CCC.exe 6740    RegSetValue HKLM\System\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000\DALR6 DFP1920x1080x0x59 SUCCESS Type: REG_BINARY, Length: 48, Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
15:26:19.6468669    CCC.exe 6740    RegSetValue HKLM\System\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000\DAL_DFPOptions  SUCCESS Type: REG_BINARY, Length: 4, Data: 18 00 00 00

I believe the prefixes are the same paths resolved by the key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video mentioned by steffen and others. Process Monitor does not show the full data but a bit of experimentation and zooming in with RegEdit showed that the relevant bytes are in both DALR6 and GDOADJR6 - in the former at byte 37 (offset 0x24) and in the latter at byte 21 (offset 0x14). These are 0 with overscan fully off (to the right in the GUI) and increase by one for each increment of the slider to the left.

Finally, I again uninstalled the display adapter driver from Device Manager (including deleting the driver). Windows automatically went through another prolonged detection cycle and returned to the original, Microsoft-supplied driver. For some reason CCC appears to still work and now displays the more modern driver version. This allowed me to make the change in the GUI again and observe the effect. Confusingly, new entries are created under the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video key when switching device/driver. More confusingly, the second time around it appeared that my display was at 60Hz instead of 59Hz, so the relevant key had changed slightly. However, both offsets were still correct and changed with the slider/apply process.

I did not test this without having first installed CCC but it was still working after removing it. I can only assume they are read by the driver: at worst at startup and probably on every major display event (like changing resolution).

Windows 10 TH2 (Threshold 2)

After install TH2 the overscan was back and worse. The binary blobs have changed size and the default is now 8 instead of 2. The driver version remains the same and the location of the binary data remains the same. DALR6 ones are still at byte 37 (offset 0x24), GDOADJR6 is still at byte 21 (offset 0x14). I initially mis-read the hex offsets in RegEdit, so installed the same Catalyst 13.4 beta VISION Control Center as before (without the driver). This time it worked first time and was immediately able to control the overscan from the GUI.