mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 04:29:15 +01:00
[dxvk] Improve swapchain scaling
This commit is contained in:
parent
1b529c711c
commit
851e96f83a
@ -9,7 +9,29 @@ layout(location = 0) out vec4 o_color;
|
||||
|
||||
void main() {
|
||||
vec2 coord = vec2(src_offset) + vec2(src_extent) * i_coord;
|
||||
o_color = input_to_sc_rgb(textureLod(s_image, coord, 0.0f));
|
||||
vec2 delta = vec2(dFdx(coord.x), dFdy(coord.y));
|
||||
|
||||
ivec2 i_coord = ivec2(coord);
|
||||
vec2 f_coord = fract(coord);
|
||||
|
||||
if (all(lessThan(delta, vec2(1.0f)))) {
|
||||
// Map pixel rectangle to source image. If it is entirely contained within one
|
||||
// source pixel, just sample that pixel, otherwise do a linear interpolation.
|
||||
// For even scaling factors, this is essentially integer scaling.
|
||||
vec2 lo = max(coord - 0.5f * delta, vec2(src_offset));
|
||||
vec2 hi = min(coord + 0.5f * delta, vec2(src_offset + src_extent - 1));
|
||||
|
||||
i_coord = ivec2(lo);
|
||||
f_coord = mix((hi - floor(hi)) / delta, vec2(0.0), equal(floor(lo), floor(hi)));
|
||||
}
|
||||
|
||||
// Manually interpolate in the correct color space
|
||||
o_color = mix(mix(input_to_sc_rgb(texelFetch(s_image, i_coord + ivec2(0, 0), 0)),
|
||||
input_to_sc_rgb(texelFetch(s_image, i_coord + ivec2(1, 0), 0)), f_coord.x),
|
||||
mix(input_to_sc_rgb(texelFetch(s_image, i_coord + ivec2(0, 1), 0)),
|
||||
input_to_sc_rgb(texelFetch(s_image, i_coord + ivec2(1, 1), 0)), f_coord.x),
|
||||
f_coord.y);
|
||||
|
||||
o_color = composite_image(o_color);
|
||||
o_color = sc_rgb_to_output(o_color);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user