From ebaf95cc422ca91b846585c9a7404158c7a0324d Mon Sep 17 00:00:00 2001 From: Kelsi Date: Thu, 12 Mar 2026 21:59:41 -0700 Subject: [PATCH] fix: remove Y-flip counter-hacks in FSR shaders; invert mouse by default; FSR1 disables MSAA FSR EASU and FSR2 sharpen fragment shaders had a manual Y-flip to undo the now-removed postprocess.vert flip. Strip those since the vertex shader no longer flips, making all postprocess paths consistent. Also flip the default mouse Y-axis to match user expectation (mouse down = look up / flight-sim style) and make FSR1 disable MSAA on enable, matching FSR2 behaviour (FSR provides its own spatial AA). --- assets/shaders/fsr2_sharpen.frag.glsl | 4 +--- assets/shaders/fsr2_sharpen.frag.spv | Bin 4596 -> 2108 bytes assets/shaders/fsr_easu.frag.glsl | 4 +--- assets/shaders/fsr_easu.frag.spv | Bin 10292 -> 4792 bytes include/rendering/camera_controller.hpp | 2 +- src/rendering/renderer.cpp | 8 +++++++- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/assets/shaders/fsr2_sharpen.frag.glsl b/assets/shaders/fsr2_sharpen.frag.glsl index 9cd1271c..392a3a37 100644 --- a/assets/shaders/fsr2_sharpen.frag.glsl +++ b/assets/shaders/fsr2_sharpen.frag.glsl @@ -10,9 +10,7 @@ layout(push_constant) uniform PushConstants { } pc; void main() { - // Undo the vertex shader Y flip (postprocess.vert flips for Vulkan overlay, - // but we need standard UV coords for texture sampling) - vec2 tc = vec2(TexCoord.x, 1.0 - TexCoord.y); + vec2 tc = TexCoord; vec2 texelSize = pc.params.xy; float sharpness = pc.params.z; diff --git a/assets/shaders/fsr2_sharpen.frag.spv b/assets/shaders/fsr2_sharpen.frag.spv index 20672a9e3b5a7a4d58c1526172ed40486f399819..24519b931ca6b9e9294d1d1d4000feb10e24a51d 100644 GIT binary patch literal 2108 zcmZ9M%}bS05XRp$wen_uq*0dnQBhdZhel*tLUj!UueA`WjbK4xwMZg@Fq5EF|3gGX zg^LzJC6!AJ`+wR5{eJhJ$rlfd=b7i3Gc#w-d#$eOsmroWS$(!W`;}EzQ&t6&!PS=c z;@GvZzK65ZefPW)}`-a&pa`SvJh zd;`1j-k~G)Cg<5k_N|!xdRD(Fajp2x;7-h3y~%F@yF9;>-Sg%%eovX_56gJ{b}V|` z3pU<<>}`L--gP%hck->5U*WgYzjHRu`Ug^woc-%NZ<7&Y zXTzVZ=oi9Y#Q(jvHe|hTV0-nx*3bH*3=4i0&e~z8`F5O(@8UAYAD9~U zAz0tDfccgqu+F*_^L=~+W9*|1lOLhJ^WBFnk#b0-7dm;H&@*45?DU!Uk1zBL)0&Vt*;jK zN5R%ti~3i<@|r8^NA7VrYvps7@GI}Lo_hk$+-i~gDp+1~MeYJG;x{^(IN#qHJB!e+ z=QMjXS7JjsigTGZLBw)(>B(-mD9{&Y~;M1)2wIg0^gVSyNjvY z)2qZiO8hLlZ)MzLOnwD>nYbt5RZK0ug{NS7S8#J+IcFQ(eB%6#*k>*KbIcfL?HOZ2 zTL6b<4P!%lk<*Ox_ZxS44ff97CGPwNEbn}SdkdELeS>=kmUq^{y$8$t)=}dFSl&Kj zULV2MRg1V!VCTJvMZV8qXRj7#zkq!cxkCE?@)hj;dogo+&bXN8cd#+8;C_JPTyQ@V e=iE!o-T!CHnCFdGpTUOtFT2FPjQyqZ8SEbjAAY_7 literal 4596 zcmZve_ji;<6ox;D2^K)WiUot%QEXsCkfJPVGy&`_uE|PPlij$xq1iwz*n4l-d+%MW zzv%ztFP`J`?Dt)q!{OuHGw=J}J9qBP+}Y4Ee%6F68<*{oP0Iev@^5N39wkHTYLBI! zRXuZ>t-(2S=bd20DU9?hD{+(odrN0WX-Z)n6yi_dsgb{ zFZK48dd}$|7#;0zw$=|<`iHBvO8;QBQ5k4e*Hnz#HHoX%28PE5(|}GQ(sesoV>i}l z4P;p-|E%Mp%DScXdSejS*7nn1SyvfeRo%c6XkFQK#=f!U(9(LX*(%psO?Vd`b-&Sa zqdbCW{sZMj{#oGWP`NQ$t2CWsJ;yK(RBEkCBVTV0yjmL_Yn?k%Ud@8WoQzhhH(Eo* zoP~_d`q*|}g0HPKTMX^^6^xbg|NIL0NVT@Iv?TYtxsmd^?c7Uflxr@>{LYM0vc|yZ z%0g=AT%T(fFu*&qO^j>XxHEfzvAwTKtzvF-e9Bl~Q)x7Z>U9fK^NyD_%Bz>whwH9U zVsD=L49ssiF>!{Tm0yXq)a(W0J)c7{zu+@-+UBki`SxO#^JbExgHgOMsEe^1+mC$q znp|Hud{;&_O};zhxPs3wxHYTo1E0v)jrq+k_@tb+=T8P3>l*qUr(#*Q@vMlS1~bNb z_GdK4KAlnQUCmk!V6hM*^^3DQC8yiDy;PsJ z`Hb*yX!|!V3jP`V@4x<9VE&)M*6M!EFW-i#okFj;KA1hP-iPKI`(ozOw~*7{ta&&;F=Nzw=@#F>Ntn9kHx9GM%x`b#kNk7NY5sX|^SgiV>Qu~qr005C zq2FHI#p!UhIMXx0z8CdP#W~Lhn_FMhekR!U^+oLq!0MV`TDyI$KWaY=JUPhZr!46LsCrM3FT^hd4B!D+4M!qZyMgIjCb z+U(|XT*!A>9t(Sw$C5YVTi(+2g^l0_S~``>%$3 zHxqeH#$SV(&-ZDp{+Qbj_AG*53wFJjTL#BmW3Nqo*CjsJFgE55BtGjk*0<^JtiD*U z0#5gGJv`mZYIwSrA-MIpFJtvbt|~a)%MI{!FE_$tuCe-~-r>aO8peiiB=K3VvF^pc z5&B~NI#@0EDA@h_+iblzVaBLCzgB1w--N66@mp&A7}iS6{#Rdv8LK~H*Mg@ewxx(& zho;XtuGwHzi#2ZsyXHeh{4HR$4Ory96}+=LZbLU-f5hGn-dPtfuDsYlG6U}MtX>AT?S5p#DDa~Nafxd*K7eVTU*7Cr5J{o%Ve@wvXS zk>@_}EG%O02S*;~>346N81=;&KL|di;I97=X3SmeUH&lUdFOhrJp%U}^~K#h3O1L% z$o&{NeJ_v0eJ{}~Pk@b4k2z0*eJ2s~6xcZRh(&?ZUI3^2e-ZBfb3NbxOK|tEFXp`rPUmffJ5N3S|MLpixm&U5$ydSZVevLz zL$f~p-rEC=YHa1F&)G5%VF~JByf)z{aUZjUR*6^S$K1C!fIGtG+k~waEK9crf8#fUm$} zoiD-0sK+{Afz?05%=sy!TIBp1?0EzkscAMe$C51*`dm_8VBuoT2?*XyY0C_|4g$@ej=T S#_PAYU2_|wzJJMZ8ulM+N_9E_ diff --git a/assets/shaders/fsr_easu.frag.glsl b/assets/shaders/fsr_easu.frag.glsl index 20e5ed32..6a36be75 100644 --- a/assets/shaders/fsr_easu.frag.glsl +++ b/assets/shaders/fsr_easu.frag.glsl @@ -21,9 +21,7 @@ vec3 fsrFetch(vec2 p, vec2 off) { } void main() { - // Undo the vertex shader Y flip (postprocess.vert flips for Vulkan overlay, - // but we need standard UV coords for texture sampling) - vec2 tc = vec2(TexCoord.x, 1.0 - TexCoord.y); + vec2 tc = TexCoord; // Map output pixel to input space vec2 pp = tc * fsr.con2.xy; // output pixel position diff --git a/assets/shaders/fsr_easu.frag.spv b/assets/shaders/fsr_easu.frag.spv index 5ddc2ea8f71d374f23c73a50e87cc4a107ade85c..12780757b4bc45f9bac29ddb33f99caa22745f5a 100644 GIT binary patch literal 4792 zcmZ9PU5Hjy6oyYTjvD!ICN(*JW`d@UmF8IEI7i6LGEJf=sAS4At+6bFf}$d%A}XTa z(ZDi@!m@;Jx~S={3zZ5|(78yk$O$UCFuRF*p7ZS$d(P%8_FC`ydDq@&pL4#iwPp60 zqByHKrx;&6+)`9ya?t`(fQ_!^)oX8B+xf_jO`S`wxYU3NMQasj%*0|$F^XB~@7uCX z#{y(G&Pl|HLr|{vHn|#Z>lr7P zJ#`=sZTky*DpAJGBF7r)=b?>eZXnZ%cMaP5w9ihq@#kYrOt!t|BkXqS*}riO@+YSt zvF>EMKaTm>a!s$SqF25P(8b)(4m8&$mWy>S1hY5&*43VouxZ$?xq;Z1JlZo6hxrX= z^Q{|w%t3ePpU-Tr`(b@;_f{w*@P`-OknpUyV*;#zk5@h zSk&4K#?F+HcOSM`p0@?t+HyqP))bRt_otW~djQOOIo6+Y#iQP~6w}0-d-oui_aG#C zeh7Tmz`*jz-HvU4%2MtH6L+XNygz?~v@!R9dY={|p23x%4d%-b&%Ec*81M1ri1>Ok z%vqc;aR+S`JJWq%f^JP?qUJJmYjz<~^GbB_sCgB-nBuVJxMFO@*OP4dtZ%IA9LKq` zpAs>CEMn}lsh6vhT~_m`>K*a{fxauANiqAd^?SCW-;crU*JnHW{RB)r`rVH%rjS~l z{n&#~!K`b{t#s%feugf$KI44`*3+@i#Q`w=io?m6=SzBP=fhx2##Z5;yK50Y&rDR zIflUWD-Nfe<0L={=JOpKzkrG79H+45&{yXe2Gg%NoN|so0ZK6655aL7Og!iK3tJ9- zb&fM&`W1&$&halm3FiAII9k!gbB-Ohy;aIi_IC zp^s|>$5a6Qilffa4qk%$J`9eT=;Ap?16vM#Tq8JU0q9p8b&h%9CAja`;8=(*o^y0! z%b|~J1jix({feW`(FI-%XC%k=gEbQ7JKO#aB67>+`(5l1VxHeI{So^ux^eapvEQLbtbX62*7zQ=j{eC1 z0o`8hE%J|`N51~ZKZCUw`Bep<6?Lf~~{W7jbPVj_Lon(J4-!&xQAM47&OH0-JzttsI+%ZCsw)p5nw-Qmun| zCgL~W-^VV>@4h^Zau+ARx$cwu627IG&%JRk!q=7gtYPfu^w`b3 z9I=)$AJK(<^d#JSXdiJON^pDZMWW}G=v;+8TgP1EqW&s$`^@WKgDoEQqt+TQuBw(f z#^tqcz;1i^#!&W-C8-e728@l){kv1v6s1@{^s0{K7?2|upQ{bh;{A7 zxJS{A)faJ(q5IvJE8-qUH&$Q7J%R4GTmFc965UvRf$c;;fDC5XbLirSGwcO)@iQ6r zBD#1RJW=l@Y;nKofxUt)?l(BFSFy$YW_osA@9Ws&{@;r8{1&#)m;beH5&HothgPCu< Te$VF${+aAX*Y^+1%aH#7TX$HV literal 10292 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 Z-}5#t-vgetMsaaSamples() > VK_SAMPLE_COUNT_1_BIT) { + pendingMsaaSamples_ = VK_SAMPLE_COUNT_1_BIT; + msaaChangePending_ = true; + } + } else { // Defer destruction to next beginFrame() — can't destroy mid-render fsr_.needsRecreate = true; }