tldr: Fringing happens because the subpixels are not properly aligned. It can be alleviated by "shifting" the underlying data to colocale in the center of the pixel. On the Samsung Panel, a simplistic solution to this is as follows:
green_amt = 0.2
red_amt = 0.4
blue_amt = 0.3
for i in range(1, im.shape[0]-1):
for j in range(1, im.shape[1]-1):
green_out[i, j] = green[i, j+1]*(green_amt) + green[i, j]*(1-green_amt)
red_out[i, j] = red[i, j-1]*(red_amt) + red[i, j]*(1-red_amt)
blue_out[i, j] = blue[i+1, j]*(blue_amt) + blue[i, j]*(1-blue_amt)
outim[:, :, 1] = green_out
The above ignores that green/red are a bit above the center and blue alternates between being in the left and right. Refinements are possible but for my personal usecases are not necessary at the moment.
It's been a long time since I looked at the vkBasalt stuff. Sorry :(
How bad is the performance impact? I know some frame drops are possible but I've never seen something egregious. vkBasalt more than likely would have the same issues as gamescope though so maybe you're better off with injected reshade.