// At least #version 420. #if XE_GUEST_OUTPUT_DITHER #include "dither_8bpc.xesli" #endif // XE_GUEST_OUTPUT_DITHER layout(push_constant) uniform XeFsrRcasConstants { // 16 occupied by the vertex shader. layout(offset = 16) ivec2 xe_fsr_rcas_output_offset; // FsrRcasCon const0.x. layout(offset = 24) float xe_fsr_rcas_sharpness_post_setup; }; layout(set = 0, binding = 0) uniform sampler2D xe_texture; layout(location = 0) out vec4 xe_frag_color; #define A_GPU 1 #define A_GLSL 1 #include "../../../../third_party/FidelityFX-FSR/ffx-fsr/ffx_a.h" #define FSR_RCAS_F 1 vec4 FsrRcasLoadF(ivec2 p) { return vec4(texelFetch(xe_texture, p, 0).rgb, 1.0); } void FsrRcasInputF(inout float r, inout float g, inout float b) {} #include "../../../../third_party/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h" void main() { uvec2 pixel_coord = uvec2(ivec2(gl_FragCoord.xy) - xe_fsr_rcas_output_offset); // FsrRcasCon with smaller push constant usage. uvec4 rcas_const = uvec4(floatBitsToUint(xe_fsr_rcas_sharpness_post_setup), packHalf2x16(vec2(xe_fsr_rcas_sharpness_post_setup)), 0u, 0u); FsrRcasF(xe_frag_color.r, xe_frag_color.g, xe_frag_color.b, pixel_coord, rcas_const); #if XE_GUEST_OUTPUT_DITHER // Clamping because on Vulkan, the surface may specify any format, including // floating-point. xe_frag_color.rgb = clamp(xe_frag_color.rgb + XeDitherOffset8bpc(pixel_coord), vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0)); #endif // XE_GUEST_OUTPUT_DITHER // Force alpha to 1 to make sure the surface won't be translucent. xe_frag_color.a = 1.0; }