From 9d02e4137f2c568a9302b48d17684ab73cad4f08 Mon Sep 17 00:00:00 2001 From: Milenko <39630670+MrMilenko@users.noreply.github.com> Date: Sun, 17 May 2026 19:52:29 -0400 Subject: [PATCH] Selectable Renderer New settings option to select renderer (requires restart). Modify config.ini's Renderer key or select from ImGUI. Renderer keys: - auto - d3d11 - vulkan - opengl - metal - opengles --- .github/workflows/build.yml | 40 +++++++++++++++++++ Data/shaders/essl/fs_blit.bin | Bin 0 -> 304 bytes Data/shaders/essl/fs_crt.bin | Bin 0 -> 3974 bytes Data/shaders/essl/fs_ff.bin | Bin 0 -> 1687 bytes Data/shaders/essl/fs_imgui.bin | Bin 0 -> 307 bytes Data/shaders/essl/fs_simple.bin | Bin 0 -> 161 bytes Data/shaders/essl/vs_blit.bin | Bin 0 -> 372 bytes Data/shaders/essl/vs_ff.bin | Bin 0 -> 4673 bytes Data/shaders/essl/vs_imgui.bin | Bin 0 -> 480 bytes Data/shaders/essl/vs_simple.bin | Bin 0 -> 423 bytes Data/shaders/glsl/fs_blit.bin | Bin 0 -> 180 bytes Data/shaders/glsl/fs_crt.bin | Bin 0 -> 3866 bytes Data/shaders/glsl/fs_ff.bin | Bin 0 -> 1553 bytes Data/shaders/glsl/fs_imgui.bin | Bin 0 -> 183 bytes Data/shaders/glsl/fs_simple.bin | Bin 0 -> 82 bytes Data/shaders/glsl/vs_blit.bin | Bin 0 -> 298 bytes Data/shaders/glsl/vs_ff.bin | Bin 0 -> 4347 bytes Data/shaders/glsl/vs_imgui.bin | Bin 0 -> 394 bytes Data/shaders/glsl/vs_simple.bin | Bin 0 -> 349 bytes build/Makefile | 66 +++++++++++++++++++++++++++++++- theseus/desktop/menu_bar.cpp | 23 +++++++++++ theseus/desktop/panel_shared.h | 1 + theseus/desktop/sdl_main.cpp | 45 ++++++++++++++++++---- 23 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 Data/shaders/essl/fs_blit.bin create mode 100644 Data/shaders/essl/fs_crt.bin create mode 100644 Data/shaders/essl/fs_ff.bin create mode 100644 Data/shaders/essl/fs_imgui.bin create mode 100644 Data/shaders/essl/fs_simple.bin create mode 100644 Data/shaders/essl/vs_blit.bin create mode 100644 Data/shaders/essl/vs_ff.bin create mode 100644 Data/shaders/essl/vs_imgui.bin create mode 100644 Data/shaders/essl/vs_simple.bin create mode 100644 Data/shaders/glsl/fs_blit.bin create mode 100644 Data/shaders/glsl/fs_crt.bin create mode 100644 Data/shaders/glsl/fs_ff.bin create mode 100644 Data/shaders/glsl/fs_imgui.bin create mode 100644 Data/shaders/glsl/fs_simple.bin create mode 100644 Data/shaders/glsl/vs_blit.bin create mode 100644 Data/shaders/glsl/vs_ff.bin create mode 100644 Data/shaders/glsl/vs_imgui.bin create mode 100644 Data/shaders/glsl/vs_simple.bin diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b0fbd59..34a9e01 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,6 +47,13 @@ jobs: - name: Verify run: file ~/builds/theseus/desktop/theseus + - name: Upload macOS build + uses: actions/upload-artifact@v4 + with: + name: theseus-macos + path: ~/builds/theseus/desktop/ + if-no-files-found: error + desktop-linux: name: Desktop / Linux runs-on: ubuntu-latest @@ -79,6 +86,13 @@ jobs: - name: Verify run: file ~/builds/theseus/desktop/theseus + - name: Upload Linux build + uses: actions/upload-artifact@v4 + with: + name: theseus-linux-x64 + path: ~/builds/theseus/desktop/ + if-no-files-found: error + desktop-linux-arm64: name: Desktop / Linux ARM64 runs-on: ubuntu-24.04-arm @@ -127,6 +141,13 @@ jobs: - name: Verify run: file ~/builds/theseus/desktop/theseus + - name: Upload Linux ARM64 build + uses: actions/upload-artifact@v4 + with: + name: theseus-linux-arm64 + path: ~/builds/theseus/desktop/ + if-no-files-found: error + # Windows binaries cross-compiled from Ubuntu via mingw-w64. # SDL2/SDL2_mixer/libcurl mingw devel are pulled from upstream tarballs; # libmpv comes from shinchiro's mpv-winbuild-cmake nightly archive @@ -215,3 +236,22 @@ jobs: - name: Verify run: file ~/builds/theseus/desktop-win64/theseus.exe + + - name: Stage drop dir + # Strip the *.o / *.d compile cruft + intermediate subdirs so + # the artifact is just the runnable distro. + run: | + DROP=$HOME/builds/theseus-win64-drop + mkdir -p "$DROP" + cp -R ~/builds/theseus/desktop-win64/. "$DROP/" + find "$DROP" -name '*.o' -delete + find "$DROP" -name '*.d' -delete + rm -rf "$DROP/desktop" "$DROP/shared" "$DROP/engine" "$DROP/render" "$DROP/xbox" || true + ls -la "$DROP" + + - name: Upload Win64 build + uses: actions/upload-artifact@v4 + with: + name: theseus-windows-x64 + path: ~/builds/theseus-win64-drop/ + if-no-files-found: error diff --git a/Data/shaders/essl/fs_blit.bin b/Data/shaders/essl/fs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..4dec297b496315a56c73ed4ed0163d0cc11e59db GIT binary patch literal 304 zcmZ9G!D_=W42F}-4qhKZ$7JlVhTTF>Eur^4fN>Hh71)t+95*m_+LP`T_5@SNGS&)# z#K*5+fAw~LOh3QB60S6P7-elR@U}G9j)(KQ!4YYI3-%WWID}H%!_JUmOj7`>Tb!(e zsGC=)`)-z%SN)L;`BLDp@+g}HylkX^D1)9GBHuEc2JFaN7?pKK`{D#^vQk9C7OY~Q zEEn$rz|i&gSFkQBFZU(WZHEJ}ZJ4}(_i5%gFfKY&nV+94{50`*qnQ-5jyLVrPK zXJ=nDY4}pXkj#C|eDm$hH_K0-|NQ06KmYyP!_UvXXqPYR{pV$|DSB^u>JLA^9`cX% z{;x&7SntG7t;4c?ICI0lz3uh3b+IgWWwn8?<>S{al$-r5Y7RcEss#>Lhdr!|`|_~f z!m(J6;LGE~Isa5I9zRyAs-8vVMvY52=KJEjtg8BcIExOO@}a8Nuv@IRtD=^FfD6dY zl084D?kU+lmCd4KRo=sTfl%Tk`W6AKsuRJ@V5v~%VuphR^Ki`37J&MNd59XIe1JIi z5v3RS0K;^cB%tiFk^OpmT+}&wZVrv~5HA>^hu9+qZqU{^3D#uIHSZ9D-QNdt0dQaK z!440=EJ$cNfj%^0_t90BB~ zygPx$u-;;sghnc<)4&9ak?nzU&tJ-oCJdl1_J?|-pPtkYeKikFrq{-yQ7#+K#sU3f zMZb6AYV&*W2D0?R{waT$!AW3bf|MyUm{a)QJL@St=?Ny&oDwg+=U4jgDW6* zm12*1lBDNwhqBbVLt#jaeIM~OKs*f)-*h0Jb|SuZ`DcEnNqSWdpP*Rn3a%Xvw`;40 ze!l39YWMS#JvUC)75bM|Rjo;r@>?BhaO!tK_;-jQ7U{U_sDrHn1x?jChbD#{o3AZ- zB1n1MUO~Lym}hy~D=%uRq&18ifBmDMn=Bxw$omL_XhqAmb)S^*+F?cn*92vI*3g>48!p%q14X{-#)CE4hb$E%F}}mLqGB8;SOMyXDt3TPYK+)@ zfmitSO5Gbff@ro7l+p|d+WnmiZXovVWJ*VHQ+PfRYOk1Lw&I;Deq8ZI3NKAesjJEf zE;2HKJ8mG(5Vtq-9$b58V7Nu$L}f!>%@=1cX{jkFG(HD+sUdyHY#gkg4$CcNHyYGJ z2oUNcYld4-^6H(Kz^1A>HwFxlTdEBO7$Y=;roNrQTQoq5-M-9)Z%l9qLHpr;VwMmG zD3aWq_$FsrkTzHgLk)v7rF55(>)?!Lkd1X-{`P~k6__5MqD@z zPQtU7+#7sn>Pj?M>0}PC88xf5zlUzMuZ&vvpD+hx))KXDMlURU9<>dJ%A7BZVBQMU z(HM0?Nz&EbEp5vGE2ND9T21q4P!?1n3^P_Rd%q{$^H!>s*9S3HuO6gje3kEzt5XA* zfAf=JuafjuLN5fUCpy>Y>cxy3LIQ3`q-{i8LQ-|TzA0OLy4a}11c5h&_e8N9)uKpR toq06K^hB`CJ#S>akqR3i6Bu literal 0 HcmV?d00001 diff --git a/Data/shaders/essl/fs_ff.bin b/Data/shaders/essl/fs_ff.bin new file mode 100644 index 0000000000000000000000000000000000000000..deea06caa865bfe84bc16e9c7dfbad2bc954bbc3 GIT binary patch literal 1687 zcmaJ>+isgc5G7TW2P*X&rY{k+76M`?wp{n6mDTrt0HR#%mB5R*+KKYiFYPb%3p%^( z!fwDp7P4kIXV08Hn*FbzA8!8q`)lCy-ngxTIyt+>jlq8S^aXD$d~AY!x-Y}SJ_`?( z_ip%7Z}?-wy)}%YOd?VddV(W4919?)dTYKerWp;fOq&|=BqmK>K$}EM_k@~ literal 0 HcmV?d00001 diff --git a/Data/shaders/essl/fs_imgui.bin b/Data/shaders/essl/fs_imgui.bin new file mode 100644 index 0000000000000000000000000000000000000000..86b353e83ea4e1fd426e676bb70aabe8cce0a574 GIT binary patch literal 307 zcmZ9GL8`()42J7U7{N1S*@}y&xGSy{aqj_!dF`|YI?XVh83l3WNxgz6Fva?K8UhI) zfByWt!+tWlJ?;tDC>eJWO&yTezPYA6tkVT{NG%+(K3c%m=i(by4JpPHJQ!VKFczXN zR`6R_XSs8#-cUm>7udddltmAI-ed_;dVMa4T*)xBSdlZ(DPtS$mRlI2s7C^6kRKPSJ)nkzF8B3>4s3=%M~<|@n2Oi{>91WIUVa#eFF QplMOCRY0h%<>F!h0L8pCj{pDw literal 0 HcmV?d00001 diff --git a/Data/shaders/essl/vs_blit.bin b/Data/shaders/essl/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..3024a92440eca096ac61d106ffe6994c27bdc601 GIT binary patch literal 372 zcmZ9IK@Ng25Jk(jUSgJz7$WG7xOZt{;+8ak&;*$VYDJAJPwEvsfdkT{(nZt!-~Z=j zj)&cX(eYlNH)FzMOtnQOJBbZcvaA%yMkjnOo@x{%OZ&+b*&0Nuu#=ji|4vMfF8U0y z%~uJ>i=L_}wE>f6SYtakVlteNL7Br@&_F-n4-RgFJ}V>IG)hRe@9+v+h(c<0wElJ{ r)x`uT>vTU+lV{^Y%!0X94%67=5ITY1oM9(EAuI=u@d^_DT4xCR?7ZIJUby z?UU{+>=TTnj(60*tTPHD<{f_|f8>#Oz4__;7X$b_`|F>-KO1~{A73wixq0{e*gDQf%_un=E~3$ln&5Ws?7}+Bx}`xc@rI^J1~M-W03y6M%w$@R3Vz(!5OE(hJo3 z`8t`G#l}g$K+nel-}ZH|advX2nXq&+gu@RkkWG zhfU!kFA@-EylI!tCn|~OMP6*iJ#t-_hp>M|jI`zJVw;uVLVYCwjWXTOi(+#NMvD8= zxJcG_)_QFrP&=t~zseS1)F>{Ka-xtONaE$NZ;jL0yTc~7xq}=d_C<>SYZE2Acauqb z@4731-YwTu3QsQwm&09=-Ku2*IrjYFhoLf@QR-Eauiqyzq?E-JD&;>0-I{b!1^*ou zM;z7`L$%s0at)MS14Ha+c(BrnAjEs_DsMC}r`(yL~s(MsI)1&?22;wAm2T!TH zJbq`+A*>Pga7@%G=R|9Yj}izQz-H);N8>X^UtofkvxV|JV;wjG+rFGj)>L^2ZCe*F9%4Lzz7p!J#e)15*-og9G(+kj@Kh~b)~|Z?J3#@ z277E{CWUQlplzEDnzW6lP1v5I?J3!|L^bmI&?L*}o!}!@v-6 z=jsYh!#J3TqE=k5hGEOoxq6A2m|07Y*beYh!<;>ZX_&K^vya2PK+H(XvuE8jfm+B5 zfTWPvJL_hZ9&8d^HUae@48asbFdpqOLo{JLQEI;WmS{FDrLJ;lsbHK>s$j3HTfsO` zCDPot&t7WW#YA8A$p)y{c%cbK*aZ2D5h+p36rB0j3cAI~i9K{tC9>5Z7~8>R z@+}O?fO3vpfVreyvkE00X2yof4a21ZbK+`v*^5M{%ckkF61H4&*KWawD!~Ov)PcmUnG4pD!zo1nQ z4%K=uHiY3WMM^mo&V`vDHHZ#J>K)p_AffizfPJmu4GLOOg`!$;gM*_U2Tkn^uaWM{ zPNoiYsgB;rM+$=D$CQQrgMQPOd20Zz#)(lY5pd;^H%q4>Vz0DnB+94>LQ?2JY#u6z zR)8&-I(ZHV2&J1`I!7Jcv93otPtOl)(|2%c|TfIhl>OPe3 zfe_{}y$6_X)4&Z4u#9gAV*=yhr#DFLo=R??>!={#;ilraQNT&V{C(6ow1X`)(~xcI z&H)kf>qZO+@m~VqnCDgRkL;N8jk#|&gu3b{NDxj5=tFqhH#9>*gKvw7v4uzMi*Btc3w2c3z(G}q7F1(1ek<;4 zlq9R^lPil2$h^QBO)}RXNN@3|ELqM;O2n3ZfoOJAgq56;;yb8DM* literal 0 HcmV?d00001 diff --git a/Data/shaders/essl/vs_simple.bin b/Data/shaders/essl/vs_simple.bin new file mode 100644 index 0000000000000000000000000000000000000000..fa69dc02ae903d58a0904cdab4b2c30432ce30cc GIT binary patch literal 423 zcmZ9II}XAy5JZhcWeTpaB~U~l=q!5ZkdSC2D+E{+XCvbze8dU32KVC%ED%Q_uGTa5 zo3S_RMNja0K3>a?=;xuKZJcZ{E?1V0-Hs65k1eh|Wj2oRgp|So_lFEHbxO9yT|$~= z^oNQ#nt=`@O304?^(pHaozO8-Ny=Tt{az{RD|w1LvZgYPb~9+zRI(u4g3+8h7|NT3 zCdrws&^DYXmi-)*Fo#LNg&NxVa%HvI31FXutEwVWjnWjzB|Fuy-#i@V^$deHmkP5a8w!k&1f0MX`YO|CPu|?~4k0-E z0dNR_yJ`<^d1w(7DZfr(08Q8f43(#;1f#SuPz;>2O%jP~lT;`jL)^&H^hTL9T}sTs|m>p$nj1?jP%|d3vHR z{%9VV&Mu83yI)uHy-mH0$S;Zf;JnHBeOQfoc9!^D-@@NGaxzB3$PH4A|9j^m#pgW6 zQkrtvWoKh9rODRVHkjNJ65k^3kjH6uiY>@fs|8_5t^W}5Btkri5MOm5o^&F)rZM-F~^nX>rSZ@3&!vm z>y={V^O&eyohHOQDg8P?NdypUzpaj&0JQMb5r~?eaetuBd3G@q2YYe=d8P_g-rzi; z9Lp3tfWEk6hd7-|#2#up;WInUQ0z#eIXzfoHuK%LnUdMD+PZ0?WD4u8Xd4ow{P?5TNjc- zG;L&j*e%Qf3Zu*-xwhpNg?7n07<$BL10EVoXi@lJLTE+6U*sb6&)0^C4Xxw=L#Lw_ zKBA4!81d;eIEl|*%RC5!(G6%yzZ^_yWpcghi&)TKK ztu6OMus;FlXsjZk44IDZmNSa~3ON&iPR9Zo$OARPC>PaomwDE@U?+{a0jQFGXRvU2dB|5GGZV2O{+h)0YSu3jwhcTdDh!$m)9!fL0j0NZ43_{}Sb?x5=$~g`S`@ z?6S;a9AqJTXTNX0nfW}kUq7!e{`~uE;q%$LDx)en_|}C*AAICN&>no*Mzh7N5X)I6 zmSyls-!ubZ8+gC8taJ^#Bp$*pit{Wl{6|}!gm{7p<2*0sc(`4si@aDtDOQ^-DZ*!v zdd^0IHd6DO;ywz7kM=H4=dco}#BuFc8(@*;q5_d^ev1g1fi&MitvJH_0O`7dYPH#k zBD$mB&3Bkm$T72f2e*S6GR&|abL?V93^VG-ymT@540GR)*>^Dy4D-;32~|CHpH<;w z1{xy>M_Fx)1ROcG0iUi+xB$m#yEX;ib>S5|2~C@kr7?+jIKEJVH%PKFQPlDtTg9IDK-%b>@DY6F!nt!MvS5{ea^juf)H`NV(AQJwFUo0T z>tRhiL#WAwZa10KA09Qu87?ApY;&TgH>syT0N?Wm5O}^aLOVZRYk-?g?~1@DC~?yw zlxszG0YiHXDD~O}=2{88BmAJeF5KLJF7-PY%Li|{+RyW}j72f8JwmT#7SRHKA_3HR MxzI@En{8YF0Vln`>;M1& literal 0 HcmV?d00001 diff --git a/Data/shaders/glsl/fs_imgui.bin b/Data/shaders/glsl/fs_imgui.bin new file mode 100644 index 0000000000000000000000000000000000000000..bd43d7ec3cfb9e14dc7c3e17f26eecc620fa2b4d GIT binary patch literal 183 zcmZ<@_TXl0{`8Om2pAdIi{mqM(@QgfOb`NsNkE*Lr%;xfY@$#WpPZkQUu0m-1rad< zij<^QB^D@)&i*gl;6LSl4Qj3gS6riSAbCu<1rYPhl0<~#qa#eFFD5U4a pyA>s-JA=$quvO3i8dFkQl&YWs)uMxJw5Ea<+-^;4u39cG1^^GCHYO;w!S$uMSPJWSrHCI`FW{N^?B2Yp@ldGCbK_NXS U-mNGx-5DgWV2h-(mWzu40Jnx0WB>pF literal 0 HcmV?d00001 diff --git a/Data/shaders/glsl/vs_blit.bin b/Data/shaders/glsl/vs_blit.bin new file mode 100644 index 0000000000000000000000000000000000000000..d8124754575e27d82245ebe97688b19322109a32 GIT binary patch literal 298 zcmWFw_TXj!0>vc#fzLu;S_ zjICF$V5?xL2Q&#utfI0CD2nVH1%>pS_yDNufO0VHAZ;+mARC3`8n8)7ZbQ-lu?OUL T4WJWrK<)q&n$}#kTwDwQSLj;& literal 0 HcmV?d00001 diff --git a/Data/shaders/glsl/vs_ff.bin b/Data/shaders/glsl/vs_ff.bin new file mode 100644 index 0000000000000000000000000000000000000000..e6c49a6c7afa4ef1118d6349ca66ca8c72f543d1 GIT binary patch literal 4347 zcma)9O>f&q5LJo*MHRHjt=H|vAYDflNl}*J#Fqv}duR}#g?l7eeWXGuQI%*}QtDHG zY5zihL1$)Xc88?oMi2yXcJ}Se+u66nyPtn}(SgsizyJN`i_Yiw+3oDtyZ6tZbvn<{ z-1(9$<+_;M&8H6y`@3?z$crDBTW^1f{c{I~vGi8T)b8hVB+A3J(<3Fa8?2tuNJqU`$ z!RCDyQS~&;yDXwI60=Z4wS-1zfY`90f`HW{>g^%@I87lp^DX3=hLmFyiKb4=EfwoRfo7L@O5HU+$*)JTR^W$hefZ7Cq}J0#8rp1sw1bde-BN9 zLh*#?u)5An)Q^)UCs<%AIv0p8(CE_KKy~-yfhtlXwaBbGhAz!3WPjvVdc=c`pBm=q zDNN?fVU9ix^9nK3NS`GaCMW73uKraXvzYY@S9K(^cuCBOmTpgVa#Xw- zU*@vlxksdpx)A9%;9SUH5+b4{$j1jW#DT$Tv9frIOG>fAMPOmP*ofBTUP!3X{QX&moX3XYLXFH-E0HU{Y3Y`{Kcc&s7w@4#WB+Fera*n4yOm z3XDG8F(`(Krmy-i$~PYH;VJ@?mjwn;(ehsun~!1*5%l6Hq9ey44i%!P5F@tE!nnv6 zD^S{IrwMnUwo!WtJH$ek|F*HT`pUmh>4jE$!?4jXP!P4+(oIr~nlH_K@37xJV1;Q8 z_&f@u++4z}dRjQ`WV1mSzELs8qsT7s9Z-Wf5=dQTJq%Lm+HO>+Ml@(>WtFHpK?e_q zd<7s+7ueeQA9uSPLD$nU8r|w6IDWVw+#hbhqbcsNC(W8i_h< zg3uIt5VsE&qLp9^rcRy*0>Z3FJ(*=76VB=Fjb44?9{2yMO@*HP8@vvr{A3!OW%+yV z>({;yv?@N)-FX6cDRt*UG>bD60K?ePGdN};In-JVkaB(my()Zje;s)OA)H|2D;PgC*O H?RNeHFd(#= literal 0 HcmV?d00001 diff --git a/Data/shaders/glsl/vs_imgui.bin b/Data/shaders/glsl/vs_imgui.bin new file mode 100644 index 0000000000000000000000000000000000000000..8fdf2984d9eaa9f336d26cce2bb3a3b572bc9190 GIT binary patch literal 394 zcmY+AOA5j;5QbB56)!Q%DiUgSSKRAP5ZsnhwM1-3Vj5e;l_&KIp1_HH7_*xE-^@Rc z?PfV-^t|W$<*{KIukx&vYlX*w$JoFkmQW-MF#B{4Nu1&dRS@w;nUQkFi_{W}P76uX z`zl3LJ4(b-H?^j(ZKV*5n^+d|fGUSP(Q|MniMT DXBC compilation to fxc.exe, which only ships in +# the Windows SDK. Vertex shaders go through vs_5_0, fragment shaders +# through ps_5_0. The runtime loader picks Data/shaders/dx11/ when +# bgfx::getRendererType() == RendererType::Direct3D11. +shaders-bgfx-dx11: + @mkdir -p $(SHADERS_OUT_DIR)/dx11 + @for SC in $(SHADERS_SRC_DIR)/vs_*.sc; do \ + NAME=$$(basename $$SC .sc); \ + echo "shaderc [dx11] $$NAME"; \ + $(SHADERC) -f $$SC -o $(SHADERS_OUT_DIR)/dx11/$$NAME.bin \ + --type v --platform windows --profile s_5_0 -i $(BGFX_SHADER_INC) \ + || exit 1; \ + done + @for SC in $(SHADERS_SRC_DIR)/fs_*.sc; do \ + NAME=$$(basename $$SC .sc); \ + echo "shaderc [dx11] $$NAME"; \ + $(SHADERC) -f $$SC -o $(SHADERS_OUT_DIR)/dx11/$$NAME.bin \ + --type f --platform windows --profile s_5_0 -i $(BGFX_SHADER_INC) \ + || exit 1; \ + done + @echo "=== bgfx shaders compiled to $(SHADERS_OUT_DIR)/dx11/ ===" + desktop: $(DESKTOP_TARGET) @echo "=== desktop build complete: $(DESKTOP_TARGET) ===" diff --git a/theseus/desktop/menu_bar.cpp b/theseus/desktop/menu_bar.cpp index 4806d28..7976084 100644 --- a/theseus/desktop/menu_bar.cpp +++ b/theseus/desktop/menu_bar.cpp @@ -397,6 +397,29 @@ void RenderSettingsWindow() { SaveDesktopSettings(); } + ImGui::AlignTextToFramePadding(); ImGui::Text("Renderer:"); + ImGui::SameLine(kLabelX); ImGui::SetNextItemWidth(kWidgetW); + static const char* s_rendererLabels[] = { + "Auto", + "Direct3D 11", + "Vulkan", + "OpenGL", + "Metal", + "OpenGL ES", + }; + if (ImGui::Combo("##renderer", &g_rendererPref, s_rendererLabels, 6)) { + SaveDesktopSettings(); + } + ImGui::SameLine(); + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip( + "Takes effect on next launch.\n" + "Auto picks the best backend for your OS\n" + "(Metal on macOS, Direct3D 11 on Windows,\n" + "Vulkan on Linux). Pick a specific backend\n" + "if Auto doesn't work for you."); + ImGui::AlignTextToFramePadding(); ImGui::Text("Display Mode:"); ImGui::SameLine(kLabelX); ImGui::SetNextItemWidth(kWidgetW); if (ImGui::Combo("##dispmode", &g_windowMode, s_displayModeLabels, 3)) { diff --git a/theseus/desktop/panel_shared.h b/theseus/desktop/panel_shared.h index 03bec2c..1253d5b 100644 --- a/theseus/desktop/panel_shared.h +++ b/theseus/desktop/panel_shared.h @@ -43,6 +43,7 @@ extern int g_msaaSamples; // sdl_main.cpp extern bool g_msaaChangeRequested; extern int g_vsyncMode; // 0=adaptive, 1=on, 2=off extern bool g_vsyncChangeRequested; +extern int g_rendererPref; // 0=auto, 1=d3d11, 2=vulkan, 3=opengl (next-launch) extern int g_fpsCap; // 0=unlimited; manual frame pacing target extern bool g_hwdec; // mpv hwdec; takes effect on next media open extern int g_windowResolution; // 720 / 1080 / 1440 / 2160; 0 = native diff --git a/theseus/desktop/sdl_main.cpp b/theseus/desktop/sdl_main.cpp index 76d890f..4541939 100644 --- a/theseus/desktop/sdl_main.cpp +++ b/theseus/desktop/sdl_main.cpp @@ -481,6 +481,17 @@ void LoadDesktopSettings() { } else if (strncmp(line, "Hwdec=", 6) == 0) g_hwdec = atoi(line + 6) != 0; + else if (strncmp(line, "Renderer=", 9) == 0) { + const char* v = line + 9; + // Order matters: opengles before opengl, metal before "" prefix. + if (strncmp(v, "auto", 4) == 0) g_rendererPref = 0; + else if (strncmp(v, "d3d11", 5) == 0) g_rendererPref = 1; + else if (strncmp(v, "vulkan", 6) == 0) g_rendererPref = 2; + else if (strncmp(v, "opengles", 8) == 0 || + strncmp(v, "gles", 4) == 0) g_rendererPref = 5; + else if (strncmp(v, "opengl", 6) == 0) g_rendererPref = 3; + else if (strncmp(v, "metal", 5) == 0) g_rendererPref = 4; + } else if (strncmp(line, "Resolution=", 11) == 0) { int n = atoi(line + 11); if (n == 0 || n == 720 || n == 1080 || n == 1440 || n == 2160) @@ -540,6 +551,15 @@ void SaveDesktopSettings() { fprintf(fp, "Vsync=%d\n", g_vsyncMode); fprintf(fp, "FpsCap=%d\n", g_fpsCap); fprintf(fp, "Hwdec=%d\n", g_hwdec ? 1 : 0); + { + const char* rname = (g_rendererPref == 1) ? "d3d11" + : (g_rendererPref == 2) ? "vulkan" + : (g_rendererPref == 3) ? "opengl" + : (g_rendererPref == 4) ? "metal" + : (g_rendererPref == 5) ? "opengles" + : "auto"; + fprintf(fp, "Renderer=%s\n", rname); + } fprintf(fp, "Resolution=%d\n", g_windowResolution); fprintf(fp, "DisplayMode=%d\n", g_windowMode); fprintf(fp, "\n[CRT]\n"); @@ -794,6 +814,11 @@ int g_msaaSamples = 4; // 0=off, 2/4/8x MSAA (default 4x) bool g_msaaChangeRequested = false; // 0=adaptive (-1, fall back to 1), 1=on (1), 2=off (0). Default adaptive. int g_vsyncMode = 0; +// 0 = auto, 1 = d3d11, 2 = vulkan, 3 = opengl, 4 = metal, 5 = opengles. +// Takes effect on next launch; bgfx::init cannot switch backends mid-session. +// Picking a backend the host doesn't support (e.g. d3d11 on Linux, metal on +// Windows) falls through to bgfx auto-pick during init. +int g_rendererPref = 0; bool g_vsyncChangeRequested = false; // Manual FPS cap (0 = unlimited). Applied via SDL_Delay before SwapWindow. @@ -1189,13 +1214,19 @@ int main(int argc, char* argv[]) { bgfxInit.resolution.width = 1280; bgfxInit.resolution.height = 720; bgfxInit.resolution.reset = BgfxResetFlags(); - // macOS: auto-pick (Metal). Windows: pin Vulkan. D3D11 would work - // too but needs DXBC, which only fxc.exe (Windows-only) can build. -#if defined(_WIN32) - bgfxInit.type = bgfx::RendererType::Vulkan; -#else - bgfxInit.type = bgfx::RendererType::Count; // auto-pick best backend -#endif + // Renderer pick. User override via Config.ini Renderer key + // (auto / d3d11 / vulkan / opengl / metal / opengles). Default + // is auto, which lets bgfx pick the best backend for the host + // (Metal on macOS, D3D11 on Windows, Vulkan on Linux). Picking + // a backend the host doesnt provide drops through to auto. + switch (g_rendererPref) { + case 1: bgfxInit.type = bgfx::RendererType::Direct3D11; break; + case 2: bgfxInit.type = bgfx::RendererType::Vulkan; break; + case 3: bgfxInit.type = bgfx::RendererType::OpenGL; break; + case 4: bgfxInit.type = bgfx::RendererType::Metal; break; + case 5: bgfxInit.type = bgfx::RendererType::OpenGLES; break; + default: bgfxInit.type = bgfx::RendererType::Count; break; + } if (!bgfx::init(bgfxInit)) { fprintf(stderr, "bgfx::init failed\n"); } else {