From fd310560f9b153eb8a454cb65b627af7e3454d8c Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 4 Nov 2024 12:32:36 +1300 Subject: [PATCH] first commit --- .../command_buffer.h.80BF74E22FA9A8B1.idx | Bin 0 -> 500 bytes .../index/copy_pass.h.75DC6BAB12A460E6.idx | Bin 0 -> 476 bytes .../index/device.c.6C259B36172A19C7.idx | Bin 0 -> 362 bytes .../index/device.h.17FFF3FE11DD7B5E.idx | Bin 0 -> 214 bytes .../index/device.h.5489FF8BB9CB1FFB.idx | Bin 0 -> 334 bytes .../clangd/index/file.c.CB50DC29A19B1694.idx | Bin 0 -> 926 bytes .../clangd/index/file.h.9B3CB7460AC25849.idx | Bin 0 -> 680 bytes .../clangd/index/init.h.5C86A0883D04E9FA.idx | Bin 0 -> 250 bytes .cache/clangd/index/io.c.83B1619B498EFDA2.idx | Bin 0 -> 966 bytes .cache/clangd/index/io.h.A5F7786F8F198D59.idx | Bin 0 -> 674 bytes .../clangd/index/main.c.360458CBCE130659.idx | Bin 0 -> 5272 bytes .../clangd/index/main.c.FC90165D9662D1FF.idx | Bin 0 -> 3434 bytes .../clangd/index/pch.h.FAF6765EBEF7A460.idx | Bin 0 -> 594 bytes .../index/shaders.c.F6267E88DF3F57D6.idx | Bin 0 -> 866 bytes .../index/shaders.h.DC6F6E4EB912EE60.idx | Bin 0 -> 436 bytes .../index/shaders.h.FB84043E831F692A.idx | Bin 0 -> 430 bytes .../index/systems.h.4B3B0C8EFC1B6118.idx | Bin 0 -> 250 bytes .../index/upload.h.CC70961FD695C6D2.idx | Bin 0 -> 470 bytes .clang-format | 25 ++++ .gitignore | 8 ++ compile_commands.json | 21 ++++ shader.frag | 10 ++ shader.frag.spv | Bin 0 -> 380 bytes shader.spv | Bin 0 -> 1332 bytes shader.vert | 12 ++ shader.vert.spv | Bin 0 -> 1048 bytes src/brimstone/graphics/command_buffer.c | 24 ++++ src/brimstone/graphics/command_buffer.h | 9 ++ src/brimstone/graphics/device.c | 14 +++ src/brimstone/graphics/device.h | 8 ++ src/brimstone/graphics/pipeline.c | 62 +++++++++ src/brimstone/graphics/pipeline.h | 9 ++ src/brimstone/graphics/shaders.c | 20 +++ src/brimstone/graphics/shaders.h | 8 ++ src/brimstone/graphics/upload.c | 53 ++++++++ src/brimstone/graphics/upload.h | 8 ++ src/brimstone/graphics/vertex.h | 13 ++ src/brimstone/init/systems.c | 8 ++ src/brimstone/init/systems.h | 6 + src/brimstone/io/copy_pass.c | 18 +++ src/brimstone/io/copy_pass.h | 9 ++ src/brimstone/io/file.c | 32 +++++ src/brimstone/io/file.h | 15 +++ src/brimstone/main.c | 119 ++++++++++++++++++ src/pch.h | 30 +++++ xmake.lua | 12 ++ 46 files changed, 553 insertions(+) create mode 100644 .cache/clangd/index/command_buffer.h.80BF74E22FA9A8B1.idx create mode 100644 .cache/clangd/index/copy_pass.h.75DC6BAB12A460E6.idx create mode 100644 .cache/clangd/index/device.c.6C259B36172A19C7.idx create mode 100644 .cache/clangd/index/device.h.17FFF3FE11DD7B5E.idx create mode 100644 .cache/clangd/index/device.h.5489FF8BB9CB1FFB.idx create mode 100644 .cache/clangd/index/file.c.CB50DC29A19B1694.idx create mode 100644 .cache/clangd/index/file.h.9B3CB7460AC25849.idx create mode 100644 .cache/clangd/index/init.h.5C86A0883D04E9FA.idx create mode 100644 .cache/clangd/index/io.c.83B1619B498EFDA2.idx create mode 100644 .cache/clangd/index/io.h.A5F7786F8F198D59.idx create mode 100644 .cache/clangd/index/main.c.360458CBCE130659.idx create mode 100644 .cache/clangd/index/main.c.FC90165D9662D1FF.idx create mode 100644 .cache/clangd/index/pch.h.FAF6765EBEF7A460.idx create mode 100644 .cache/clangd/index/shaders.c.F6267E88DF3F57D6.idx create mode 100644 .cache/clangd/index/shaders.h.DC6F6E4EB912EE60.idx create mode 100644 .cache/clangd/index/shaders.h.FB84043E831F692A.idx create mode 100644 .cache/clangd/index/systems.h.4B3B0C8EFC1B6118.idx create mode 100644 .cache/clangd/index/upload.h.CC70961FD695C6D2.idx create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 compile_commands.json create mode 100644 shader.frag create mode 100644 shader.frag.spv create mode 100644 shader.spv create mode 100644 shader.vert create mode 100644 shader.vert.spv create mode 100644 src/brimstone/graphics/command_buffer.c create mode 100644 src/brimstone/graphics/command_buffer.h create mode 100644 src/brimstone/graphics/device.c create mode 100644 src/brimstone/graphics/device.h create mode 100644 src/brimstone/graphics/pipeline.c create mode 100644 src/brimstone/graphics/pipeline.h create mode 100644 src/brimstone/graphics/shaders.c create mode 100644 src/brimstone/graphics/shaders.h create mode 100644 src/brimstone/graphics/upload.c create mode 100644 src/brimstone/graphics/upload.h create mode 100644 src/brimstone/graphics/vertex.h create mode 100644 src/brimstone/init/systems.c create mode 100644 src/brimstone/init/systems.h create mode 100644 src/brimstone/io/copy_pass.c create mode 100644 src/brimstone/io/copy_pass.h create mode 100644 src/brimstone/io/file.c create mode 100644 src/brimstone/io/file.h create mode 100644 src/brimstone/main.c create mode 100644 src/pch.h create mode 100644 xmake.lua diff --git a/.cache/clangd/index/command_buffer.h.80BF74E22FA9A8B1.idx b/.cache/clangd/index/command_buffer.h.80BF74E22FA9A8B1.idx new file mode 100644 index 0000000000000000000000000000000000000000..2be85a972e6361659aa652ee41828a909a044ed2 GIT binary patch literal 500 zcmWIYbaQ*d$iU#7;#rZKT9U}Zz`!63#Kk2=nTLRME>NywPH(?0f0Kbg+wWiriI#)i zg~?8;g@p===UU|0uWS*CewFm+y_ipk5c~Aq)$iy1PFnq8pJ&&b5V_Bv9koNhe!XYP zJ5%AlbJrb)t8lz^?}Bg>P0=^Go~*TD!8%Z$ax*_t)=i zuSPNlC967q(TMeZz<<+kSq}U2gX)L&)&484%uR9v`ecS*P3ilf-`+e7tUw+JaI=cB zYB6xKFfp)mGIFy@SjEhm^02F&hk*?u&%n*b$|k|U$;`;W!39)Ml$usN11J@Hc+s<` z6SnX&@^G^;uz^Ah3}6;8azYG-3cog6EZ$Vo5x~gB&B(zh0TpEsGn(p}^ffh)iHDn& zfmH;i8EB*=n=Z^LFdAqi*eOuWe-BQ+@%xqV37`X5wOK7-dW%wX5l0K|L(8;1v+}u%iq_1e|O^6?!3b~mQRm=+2gLs9eQ-z zx|wmTBD)Qj>+9>!e|A>=KKI=jV#oH}Ja>})WBHvqu_`~GBp+MzFzXfHDy42+r^5%j zH@!%I@TT!f%mx95s3|-?ii(a|s=<33LmsyVs(YPX`ZCbc;d110!Da1cZ$(mj*&4S9 z91s=Vmh^z{y_{;k)$0R{m9Fnt|5Z$3D6Y&+asv7zQ_{h8f9D}79tJib4+OZ_SlI*^ zI9Zq&csLokSTBCJetvDa-yR+YR){fqUz8)}1f)EVEjHbFKeND|{ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/device.c.6C259B36172A19C7.idx b/.cache/clangd/index/device.c.6C259B36172A19C7.idx new file mode 100644 index 0000000000000000000000000000000000000000..4dca8e878e3cd69774ee92b1e764ff6fb9f1eecf GIT binary patch literal 362 zcmWIYbaP8$WMFVk@vO*AElFfyU|U4-4 zoO*Z1rT7<1HqJHTKUvZ>|9ybKE+N+N@6Uwz*aaB%JtaTvV%9NaaC4X{vUyWN{#O@E zP0Q>PJC7#cT{AaUoNbl#0>i3>S1PlV)AbYmN-kS)PEWe>%jCF1{Jy}zn=yNJrri%T zT%&f3O=`x%*z23U%(-Xe#QKMtT%PtU=Y;>OEAro1lRkZz8SlCyTHSro{u}?!Regx) z{lIids{af_ab<3jJkZ_Z8>6~)$~XD&FmN+4@G`M834;ls3|>~W_6 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/device.h.17FFF3FE11DD7B5E.idx b/.cache/clangd/index/device.h.17FFF3FE11DD7B5E.idx new file mode 100644 index 0000000000000000000000000000000000000000..ac34a877d8b4baf4cb34532b6639c999cf529129 GIT binary patch literal 214 zcmWIYbaOk$z`)>~;#rZKT9U{DWD5gvaY<2TDv&M%;)*%GJ%(Hj1_CU#6QgfLMn`ej zIefA4RXOQ7>GR)XN(q~HGaoi*Bfo zrBQ1$Urk@ep}xiHhJ#=EF`J&d;-@RK1>+y@)V#n@T$!5$w1}Z7HLX}2NY^yq`n$4t t!*@n5Mn(=s0gx0J6s6`Qf*8d`$zXL1Ob~Gp$yln#H*Z_tCuc?`1^~4DMf(5% literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/device.h.5489FF8BB9CB1FFB.idx b/.cache/clangd/index/device.h.5489FF8BB9CB1FFB.idx new file mode 100644 index 0000000000000000000000000000000000000000..554c17b5baf2bcd4a17be77b484578f2150e1fdd GIT binary patch literal 334 zcmWIYbaQiKWMFVk@vO*AElFfyU|gGT`xbG>V7%_gd>-=p%cZgJC#qC2%RhUzZ_*kL4uGg&x&_Gn`cqtrJbd3l&rQwkrIXEM~a6bVfp5zU-UwwJMC~ zGi-Kr>^sBq_3MvGnUUVQc8rOYR;!9DbCVQ-E)w4u)vZ&$$%lu53CIHhR#tviX$DS4 zMh0dUMpjmaqSUlvSD-jdB_k(91z0fy!{39GZ~T5Ge1ee&sFsx%rmCj-*58%I8@@Ag qu`+Tn3P2Sz08PtD1aXRsl8ePb3^ot}0j%c^ul~%J_kRW>8v_86LutqW literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/file.c.CB50DC29A19B1694.idx b/.cache/clangd/index/file.c.CB50DC29A19B1694.idx new file mode 100644 index 0000000000000000000000000000000000000000..1f79fe26ad6dd791fc821fb2248413f678fb3516 GIT binary patch literal 926 zcmWIYbaR`=%)sEB;#rZKT9U}Zz`!63#Kk2=nOuwv3@J9>$wkJh12@ zw{}k30uN4+RY$tawYvB>%=DS9`CECnXTXv2a^V0i4Uw-|`)68Kr}4?0jq5JbZPUK{ zGH3FGT)yDRd%9!Y*7Du_c%%H5-)8+sA@$2=HwP_PHT%`4M<2Pal=85=`oj_+e`iYdf}(9z7V))t3yT^GBb5Fb90 zR$Q5z{% z2vi`>D$Xm;!^*?Uz{$+WASnt|P?VZh`~(=bF^}fAzkha#fssdyTZ~%-*170 zIaxU2p5xFsJZaI<)^27VF(w8kxRpF&f;@sEFugot;(X#_u)v1VK#zk$9OiM^+0Dxh zn?2S8EnpX5mw*Wy%kKO9L&$LpP*{RRf&->mw)R}XlUZj$!Yn*20x;FjI?J@3`ggqt zhMo|o5HG?35_}RuFuhZQcUkOMpYk1K6AL>hOi@v4P9n&h;-chYaS#LU1_nkkiMV+W gHXHnT!6?CyoSTvZay2hEKPMLlI~%t!4=W!70B&?5NB{r; literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/file.h.9B3CB7460AC25849.idx b/.cache/clangd/index/file.h.9B3CB7460AC25849.idx new file mode 100644 index 0000000000000000000000000000000000000000..50b90209fe92bf298b28c30f7bb412cbf97ab440 GIT binary patch literal 680 zcmWIYbaPw4#K7R3;#rZKT9U}Zz`!63#Kk2=ndgA?GDZf5iaBd1ICe1^3b+ z%bCBfc*8PzEn~ui7YegEqK^s5dbZU*T78&n`IBU^Wl{ItnItkNzNvF zM~>t_QER1>4N4lNY!WrL^>u80_lN!TZo0CWZrc8ele2Kb#^TD{q=i6V6^Kl9 z&#hrl;$h%mVBlfmWD?}%=HwP+;ACZDVB=)uWi5Ip(wFEF*v`iwz{0@G!ObBECP2zT zfJ5W(q(w(tySW+I7#MgtnK-$?1Oq2n7N~!gkI9w4K3!9I7}$Xph_j0G^763q@G@{R zGcpKr0Tn#!EYo)C-}Ro4fg5N6J1@H+n1ETpP?VZhdxP}f6+d3d=QxH(`p z@bL2R@rc3v1EYcVg8c*4;vVBsc=^tjYd{MaIT!_@q6{$mfx;jk!i0-ba}q)9;-chY dWe|fOL_h$q3Ok>cQhBfo6CXbVA54^i0RRk|z7hZc literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/init.h.5C86A0883D04E9FA.idx b/.cache/clangd/index/init.h.5C86A0883D04E9FA.idx new file mode 100644 index 0000000000000000000000000000000000000000..a9c3854d10848f917f4728a93da682d3b882a5c8 GIT binary patch literal 250 zcmWIYbaVT}z`)>~;#rZKT9U{DWD5gvaY<2TERaqF;)*%R7cQiHICENubDfT!=ULq} zk8N7X9;eTEZoPE<`uP**eXr{Kow-_m(qHea?^$ilYy29g&U^W?8BOXkD(?3F^tpkn zYtqDunGTx|w8XJFN7kirF*AfmDTOc;SLP-u0&TEY|G78&{@HjQ1|}d61X!3^nFSa) z85tQ^nHgDF8H!TViuHiv7Yw%BKJmFA!^p+L$ic`5RtqFx1~76$G(yFTQgc8aU??t1 VF6IW(Oe|4(%kJ1m6jw7a005;2N__wT literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/io.c.83B1619B498EFDA2.idx b/.cache/clangd/index/io.c.83B1619B498EFDA2.idx new file mode 100644 index 0000000000000000000000000000000000000000..73cda9fcc131615a30ba03a8e69f1603ad18f1e1 GIT binary patch literal 966 zcmWIYbaUIs%)sEB;#rZKT9U}Zz`!63#Kk2=nNo}l46aNJ3>9;xPQ2@N*g>H6d0^E= zZta}5MIM|YtB!P;YjyE&m^s%h_#1oK)9sQC$Z~f7t zh1s?@OCD9TIZtfz|JtG@t3JK!AZppFCZw%g*y-DqvD76ydik?%$H`agx<9ifh{_~i;_G(k zO^#Qu=}bI+rPHX(yYxd%8c(pwn{;UB#8TNlw6!DiE3Io?FA9#KR!Oz#z`T$s#Dm&B-muz{$eI zARxjh#yZQ#eWf*a^UogKt&`4H3R$-W;Vg+92 z5BW8zAYm3(4w&%NCkLL)DC(>L3Ui5YNy3ENe;j!k68OCZD9p>k%MBAQdM47B=n>cs z6c*(a<%bDZ>|fIB`~4P3n45(g?l}&P!;=;rZS7{}5ocjwfm_KVF3ck=0@KSQF3Be; z1`BK$4fHrD#9vFyIjKZG2&0EMMkq&Q%jWoyqBJehSC zB+SOcCID0Ytg}qpsejjdVCac(itr*FAjKyo1k*b;c$dYF^(o&$HnDJW!W0#y<|Km5 zDK1Jb)(0^pK?DTAox{K&1`}go6i@r;_rWRJzn@u5LXsglHzfz;8(waHPA(31Hf~`a HRz3y*odPQ% literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/io.h.A5F7786F8F198D59.idx b/.cache/clangd/index/io.h.A5F7786F8F198D59.idx new file mode 100644 index 0000000000000000000000000000000000000000..1394c23b74020b6465f21fe76b31ea031d165cd3 GIT binary patch literal 674 zcmWIYbaR`<#K7R3;#rZKT9U}Zz`!63#Kk2=nJ0jB6e9ye#hkhQ2eX_E1zbOC=07~7 ze&b;5NiWBk>AzSDjeaSeId$4(J=Y+;k1`Gm)89@&AYkrL-?eqwnaM^^j_Gf>A;zHQ$#PWHg6o>g8dkeacQ~bEiacCfIhm5z%uCp)aN_otPuV904zniB zxm@=Bp5)@k(px@U>8kR-ULVo8HS+EG*?wu$9-QUpVlC+}uFOqZ2=q^Z$VB(t8U`gE z1`Z$(1bDbPxdj(e!bhk+d|1XRVt%EQaR$;`+gzy(zBtg}qpsejjd zJ_c@}1?;@+f?xt>0Yg!0TJaU2)|0oh7jhNI@i21nFmf;oLJeauu|2|dqcTc_k%xza zg@X&`T$sNYIU)XmDsTUBEUJbXN2FmJ+WpuJ#kLbbpw0$Kp_A@{DS9Moa8#X#HaD$Sf{9;GX zPnn$=MN<^TqrVxM>4`x=QT9kMf9I}^6GF6x^{s!pcm7SkEL+u}yvW!9I@IUg^sG(K zvc?Rb^d`Rj)3X-_c1fYD&Mvojo8y?h>B8*Jx);+&cUbxtXP()9t)seSrcbH&mI
B{Oxnm5_4lVAJ!7 zNi%A6Y@9C~Kel|&oJ!@c>FL8BY6`h$xuH3!e#)St{yIl158qZ9$s5|9S6nx`-xSon zXN7yE>(t=0hL`P6-;C+JyCdmc>;YNKAzyEeO3&_uOVE`wmv5E-Fwr8U@>|)$&7HO; zmIG4!T)f6kSn%1R*yZm9ODhi=RK_>5hp$eo)RYarzU6CRr83_Y9c+8s44LQL49sr3RuX8q$VL&w%N;yxN0@qS80&QgTH1>(!6x88F?w z=kbiS%JA)SN`by@pktuhGhq6Oo`vQ>c-bjAWhty&q0;XeFded`%~8Fm|7kg8Ei6s0 zuh%nR`inBqD~CVxSWc-0ZMjOXXTWr?9SeReONe|br)&jnrM{|Xz;ycTxC|`?MO96I zG&KIpG74CJF~}B!9o});=Z+YIFl*?=^4UzbB^I;%ZD4PMHO7C%G-d&pz#{!LS=spJD$!fGmVtVky%&HmB;g0-jDMmNIUCZM!9l?3Td~3q80k# zX{GnqJg=RTW`c-xE}hJ8nW|NBso38Xi5Jm}jPdL@&h(z^d5k#{Zvw4N&>s`{$bjr0 zN96})K~Tz1C>Sj7XzVx;&t`d#0Um0M-1iog<=pwv5*f_{IuB%+ST`-~*^~U{frvN@ z%vmtN#L|Gk)s|pojfi^iuZI9kWZX--Tk0{u1`*4^d>MFP;$`#IbL~$<1|uRL=zNf4 zV&7ku%H^+y+VyB?Edvuw#D@(pv0B?;kBBv(wFXp}2#RiK9-LlEN+R`kDmjJg!^qAqOjRl{#wYVap9^C4|9cxrQXz^O}rr!uH zmX8RC7=y#i@>xt4C!#7assb~NEi2~OzV38zL)P|!&R$SrYnMltPx@#Y>5hoQKpzGU z6OK1}nej9I^Z^Fx&-Zc%l`=1t)`*588T|EX)FnyG!}t^ZpTn*nxH+vrTub82`K1 zR6k_ag>%uzvsvDk^Cjr`$szfN!jwTsw-%UMFvQbxqVCT=s$Ct7ylKLj7~*)byd`HT zLAIQ&1i5qW5){k@OHeEqD?y1|q6Fn|ITCaLxC0=;r$BKE28b(Y21TlV zw)k)8yI{1VNIH_-$^HhKBH!O%k4ED4K(80?q-*ZKkNbJd8iR;TE>nT`kBdbw**}T| z%NK!Z5fI;ReO;#>xBF%|(%uaHH^UIDpY`XAg?#Di2;}`Jn8bnb4Dq0j#aNnL}rVCD*~11)MBtKhQSzfVSN%FdTEl7zTGgpApA92 zue#$=NmB|EPvfSMLo{h>NoskXTPhN#a;YQ}88~eTh<-miRd4|vMN+Qd0;XC_Sh((@ z6f6{7yo6N=lb7#OwWT5L;oNYN_gUVb^CxJT{oauwX2I#`%Nbk-sRBl~%u0&$dS@W< zd0@_qHOi{+iq8!lDiaacKzYkjMi-^sjwOPz#eNID7W^>*`MC=2deL&VYH=-lsw+`n;h^PR= z3LphD^~<;QE!R#6gptCCWXhW}@=Xh@9}425AU_JEwzOe*Hh_V?gk;y#Z@_-QE-Ys+5T`)$2h{@b! zaswILiyKSo^EAk)BkjmyGpGjB9t1ro*kJfz$;<+z>#On|h9`Z{PBHkpJy#I_3i4mU z3KO_ZqhVz4U)Vtr=Us)_TKglUlqim`r9P*q@U zRUs1RgCbwNw3_&;xPR~} z1N6arnOPctX^&6&PDCuST||0`#8!ujr!D6Dkl%`cE|Qj$VlXTgLqFVl$cl}&t))o+ zIw-D-z18DALP;5@q?FV7OCs^Ur%OG2@K4 zlp_n%x#=XNck?=LoqMcZB@`9Lgai>46~P0ecGiVpp9Y>F3G3rF!dBMqSgv)2{*F;NE49@Gzv5oQM4*rQu^YR@%=@v4EQoJ7qR?F&_4+V zBHsXd4In%)dwwk62u6)SY$7<2c&GUg)EUY7Ufya~c@8lkmD4;s9zOUoYUh6Oa7 zLb}_4-X@L7ZZO;}mR9`e5$XbZ@nHRh3qL(zN{Y{;MTHIw9ga6K@546b$CqvwkT{Nx zBUyG;;rJs3tF7u#Q>q@SmNccV2ChS~N%Z6}@DtJODMf?g5-uT2^`NL1)4+)L>tioI z`dc7w0&`RJ)7RQfw?B6yccYKcYT|&p3$?SRID}q9;+gbJQ@ql}s=xI^*LJn`*q=}j z6ETsUY;~;l;HDdhSPEK8#Tr5%E{OFnZ@htAHcU2*^d2nlCG#REGR3og$CZfRkajH$ zsuf#|WVolk=9S#Wp}v?g*27;zeKBJpK{kwy1liGcy5dYX#!bQnF+ma(!^B8X0+S#? z3z!8Gv>%xLAi?Nd)rj?w<(q(QlHzt?+eNJEIQrM7m7m(s{^~$cCtktDUlMI&o|f7aT_pgVi@OoI{wtOx8^<~CaESl;zRJwr_aI=eTRq0$wTR( zB#12UNqZ9Hd*t~^|LoQdq-$nqHVA(UKfr~fj$Yr`q{rIj4Sng|U1)Y47}tq;R960~ z%qJp24iB;iVp!?(wujQxCn}iVqAVX-RRjocHvoN%5 z8&xa6_$Lyt1KoAvfmpF^P~l3Gu8)YADw|4t`=7e#k?oCjpO9Ds78>zf*J<)%8*aW9 zh`HQca^u~HmQLpjr+q=oWJXb>HKZu=M4>1WIf^3rn*u&`Reguux<`$AhDOFF15C}# zE%Xig^;fDWW6?IL3=~CDJ4K=YMZ`bS5mFS%?G$B>X^JBCgQ8+mVv~ipx2`VNo6*sx L`}CD*vDE(nm$4=y literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/main.c.FC90165D9662D1FF.idx b/.cache/clangd/index/main.c.FC90165D9662D1FF.idx new file mode 100644 index 0000000000000000000000000000000000000000..6696877c6a017f4d5ec55c03b763eeb527636381 GIT binary patch literal 3434 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 BGBf}H literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/shaders.h.DC6F6E4EB912EE60.idx b/.cache/clangd/index/shaders.h.DC6F6E4EB912EE60.idx new file mode 100644 index 0000000000000000000000000000000000000000..528d0b8320788503951f610747934761ff92475d GIT binary patch literal 436 zcmWIYbaPw7$iU#7;#rZKT9U}Zz`!63#Kk2=nMZ-N2T-nJPHC?pf0Kbg>+fJI0}aKv zE4`hKM~)tBv6x&nXG`0*W$bz_|Me0~W6TTYoIZ~=v^ULfn=wO^AtRqNBJzZ7*|eC`1zi8!EM|EdOpAVh%;~`TwS2GE@fv+N z^QiaV11r7@6(PJ5?Y`lHJ^9}!Px-o6y4zpnV7>-Jab<3jBG5MpzhtMh-%4`hVF39P z1lU;lStS`bnHU+ESsB?_8H!TVii?5b>8IactAC#-$;iXT>dqPo(+Hy(IUyRsW-u^F zF5GH%@fG8GMlLo+4n{$!D8t`_lW+WfC42&8h!m?jO!GfS&N^=)-3K6H23B5}FwpLt fM3C0vqU2(65Q8o6ZPHXJzvuak>6|;Yb;2>H30I0D&9gqdJ2ZEh;CJ{i+*Nx*z(lmEj!Y-x7_0u`hME= zc!Tv}Rj0K%$2W?#{qA3;s`^B#^>$=j_avWton1TTK7V2OT|n}Ka@2wUjW*l7cbpHK zoE2!)Q=@+FacuM1GaL+Ax}0k!Ovreny7HV;+Ly@%M&*}1ZfBZ`^8Cx=K9pCrYX6pd zQW>UQVp6TS@j^cFhbu*{uAbi|zwt}n!Q#r?Bt@V<5`M`}X}^`^#=`*eAqcRs^0P`Z za56D6FtakUu`(2;rWF?h#nVr}zgGV~Pm+;`jn$ns5~dMGGjc*Sg3VxHkX*Rc?BXlN z^^9C>j2w)DP*H}z2Pfb7{Yv-*$Pg)3b(rRVj+}MgLb?w?!VIjuFkztGIf)>x#YM@* Y;vfb)h=2gLytheHrTm`fGqN)P09mJ-S^xk5 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/systems.h.4B3B0C8EFC1B6118.idx b/.cache/clangd/index/systems.h.4B3B0C8EFC1B6118.idx new file mode 100644 index 0000000000000000000000000000000000000000..73d01fbf8852a44ce7821a992168a3c2acbbf463 GIT binary patch literal 250 zcmWIYbaVT}z`)>~;#rZKT9U{DWD5gvaY<2T9FR@{;)*%GJ%(Hj20RR(Wn$0VyLr_2 z18bCW?+mtC5g)#b#oT%Kz~V*K45QzlW=xhi67cXrHG=I7}rYCqxBUF$2TNYrEEkta|a5k&A_qgHa4B3e=U82x1o( VB^Psp7%UUL_)Z;iw|dLK000P`PhbE5 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/upload.h.CC70961FD695C6D2.idx b/.cache/clangd/index/upload.h.CC70961FD695C6D2.idx new file mode 100644 index 0000000000000000000000000000000000000000..aabbe33b8ed3a400a5cedc86cc909d153046e465 GIT binary patch literal 470 zcmWIYbaOk$$iU#7;#rZKT9U}Zz`!63#Kk2=nU{dH7f`NZPHvxn{viXNqn`td9x$vp zl=NoG+lkQ+Md`dcD@FpTO|(uDDU|ECKQT&(mM0cmI5|EiC?P`sTZ`Sys_1 zJ9E14X zr@rSYCTOuf8a8#$1O~mvmW8h8L9z990do40%nCF<75hKa|t6-MPc& z8EgOlU5l>==Nmd`eF**U?tQR1`3m2g4!x}`Ki8gJY;s)l>Cya08ikg{mAOfZK%ezq z4lQbl*$~OYzzpPp02?bSt1ts66C(o)DH&+eWO56sTYJMWqE&e_v$ZJ!R|R0yFL`g~oz(5jHd(5d`j|7gEInI88aKY3(* zDYSJ}tqW&?xP^Tg=B2pRZlEp8TEr9L4z>(KzKnJg|3<=moUn7gXA%8A(kT+XS_-r=4QTD z<<8uxxEthhG;49+bz=7Yiag(eSmZ_g2AKP->BZHNV)k~Q9OvJ{JDYPkzq$Wi%=%5d zcT?|Q2-{8WOi#Hf-+}MS<-7Ppb_@TK8}Uy3e}C!r42yi3#4CTGKgb)Q z&$HPRbHZfiednDsGiRHPorw_Mh3POEzJ|e>4-J?AH(vSH>BZ?@zr5btKlr9%HZ&`t znz=Al#bf;6w)2ia<^%Q_Tf>_C8u(`lk}$^aO`E`|zt4K*Nw?_sh}Br%u8D*>mccj0 z_C?p$TVoZFfE zR}{ls!Vd1^aX$BI(^1?4yThh{BX)kVGyI{#`90GEH{{IAjq03D&N*VOv7B$$BIAAP z?By)6_adzPHX3V;mx;#lDYk;14_;yKO2LzOwem+bb{{$Q@A1}))yH||)r;NN9d^NL zXR#2Tj+elTM5&NtUi=ADzYbo)TO+qg(!h0 zeSXr_cQzM$t`j?BylaD4&J#JmwcKdWt(qI{nZjAG-n>13v5Vh(8}sdaALkIK*ekbw G$NmGxxjyOu literal 0 HcmV?d00001 diff --git a/src/brimstone/graphics/command_buffer.c b/src/brimstone/graphics/command_buffer.c new file mode 100644 index 0000000..3165b88 --- /dev/null +++ b/src/brimstone/graphics/command_buffer.c @@ -0,0 +1,24 @@ +#include +#include + +SDL_GPUCommandBuffer* CommandBufferAcquire(SDL_GPUDevice* device) { + assert(device != NULL); + + SDL_GPUCommandBuffer* command_buffer = SDL_AcquireGPUCommandBuffer(device); + if(command_buffer == NULL) { + SDL_Log("Failed to acquire command buffer: %s", SDL_GetError()); + } + + return command_buffer; +} + +bool CommandBufferSubmit(SDL_GPUCommandBuffer* command_buffer) { + assert(command_buffer != NULL); + + bool success = SDL_SubmitGPUCommandBuffer(command_buffer); + if(!success) { + SDL_Log("Failed to submit command buffer: %s", SDL_GetError()); + } + + return success; +} diff --git a/src/brimstone/graphics/command_buffer.h b/src/brimstone/graphics/command_buffer.h new file mode 100644 index 0000000..c0e327e --- /dev/null +++ b/src/brimstone/graphics/command_buffer.h @@ -0,0 +1,9 @@ +#ifndef COMMAND_BUFFER_H +#define COMMAND_BUFFER_H + +#include + +SDL_GPUCommandBuffer* CommandBufferAcquire(SDL_GPUDevice* device); +bool CommandBufferSubmit(SDL_GPUCommandBuffer* command_buffer); + +#endif diff --git a/src/brimstone/graphics/device.c b/src/brimstone/graphics/device.c new file mode 100644 index 0000000..33304b1 --- /dev/null +++ b/src/brimstone/graphics/device.c @@ -0,0 +1,14 @@ +#include +#include +#include + +SDL_GPUDevice* DeviceCreate() { + SDL_GPUDevice* device = SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV, true, NULL); + if(device == NULL) { + SDL_Log("Failed to create device: %s", SDL_GetError()); + } else { + SDL_Log("Created GPU device using %s", SDL_GetGPUDeviceDriver(device)); + } + + return device; +} diff --git a/src/brimstone/graphics/device.h b/src/brimstone/graphics/device.h new file mode 100644 index 0000000..df20aa8 --- /dev/null +++ b/src/brimstone/graphics/device.h @@ -0,0 +1,8 @@ +#ifndef DEVICE_H +#define DEVICE_H + +#include + +SDL_GPUDevice* DeviceCreate(); + +#endif diff --git a/src/brimstone/graphics/pipeline.c b/src/brimstone/graphics/pipeline.c new file mode 100644 index 0000000..4ec9a09 --- /dev/null +++ b/src/brimstone/graphics/pipeline.c @@ -0,0 +1,62 @@ +#include +#include + +SDL_GPUGraphicsPipeline* GraphicsPipelineCreate(SDL_GPUDevice* device, SDL_Window* window, + SDL_GPUShader* vertex_shader, SDL_GPUShader* fragment_shader) { + assert(device != NULL); + assert(window != NULL); + assert(vertex_shader != NULL); + assert(fragment_shader != NULL); + + SDL_GPUGraphicsPipeline* pipeline = SDL_CreateGPUGraphicsPipeline(device, + &(SDL_GPUGraphicsPipelineCreateInfo){ + .target_info = { + .num_color_targets = 1, + .color_target_descriptions = (SDL_GPUColorTargetDescription[]){ + { + .format = SDL_GetGPUSwapchainTextureFormat(device, window), + }, + }, + }, + .vertex_input_state = (SDL_GPUVertexInputState){ + .num_vertex_buffers = 1, + .vertex_buffer_descriptions = (SDL_GPUVertexBufferDescription[]){ + { + .slot = 0, + .input_rate = SDL_GPU_VERTEXINPUTRATE_VERTEX, + .instance_step_rate = 0, + .pitch = sizeof(float) * 3, + }, + { + .slot = 1, + .input_rate = SDL_GPU_VERTEXINPUTRATE_VERTEX, + .instance_step_rate = 0, + .pitch = sizeof(float) * 3, + } + }, + .num_vertex_attributes = 2, + .vertex_attributes = (SDL_GPUVertexAttribute[]){ + { + .buffer_slot = 0, + .format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3, + .location = 0, + .offset = 0, + }, + { + .buffer_slot = 1, + .format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3, + .location = 1, + .offset = 0, + } + } + }, + .primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, + .vertex_shader = vertex_shader, + .fragment_shader = fragment_shader, + }); + if(pipeline == NULL) { + SDL_Log("Failed to create pipeline: %s", SDL_GetError()); + } + + return pipeline; +} diff --git a/src/brimstone/graphics/pipeline.h b/src/brimstone/graphics/pipeline.h new file mode 100644 index 0000000..c2cca64 --- /dev/null +++ b/src/brimstone/graphics/pipeline.h @@ -0,0 +1,9 @@ +#ifndef GRAPHICS_PIPELINE_H +#define GRAPHICS_PIPELINE_H + +#include + +SDL_GPUGraphicsPipeline* GraphicsPipelineCreate(SDL_GPUDevice* device, SDL_Window* window, + SDL_GPUShader* vertex_shader, SDL_GPUShader* fragment_shader); + +#endif diff --git a/src/brimstone/graphics/shaders.c b/src/brimstone/graphics/shaders.c new file mode 100644 index 0000000..6e2a22a --- /dev/null +++ b/src/brimstone/graphics/shaders.c @@ -0,0 +1,20 @@ +#include + +SDL_GPUShader* ShaderLoad(SDL_GPUDevice* device, const char* filename, SDL_GPUShaderStage stage) { + assert(device != NULL); + + FileData file = FileRead(filename); + SDL_GPUShader* shader = SDL_CreateGPUShader(device, + &(SDL_GPUShaderCreateInfo){ + .code = file.data, + .code_size = file.length, + .stage = stage, + .format = SDL_GPU_SHADERFORMAT_SPIRV, + .entrypoint = "main", + }); + if(shader == NULL) { + SDL_Log("Failed to create shader: %s", SDL_GetError()); + } + + return shader; +} diff --git a/src/brimstone/graphics/shaders.h b/src/brimstone/graphics/shaders.h new file mode 100644 index 0000000..1f24c9d --- /dev/null +++ b/src/brimstone/graphics/shaders.h @@ -0,0 +1,8 @@ +#ifndef SHADERS_H +#define SHADERS_H + +#include + +SDL_GPUShader* ShaderLoad(SDL_GPUDevice* device, const char* filename, SDL_GPUShaderStage stage); + +#endif diff --git a/src/brimstone/graphics/upload.c b/src/brimstone/graphics/upload.c new file mode 100644 index 0000000..7b20aef --- /dev/null +++ b/src/brimstone/graphics/upload.c @@ -0,0 +1,53 @@ +#include "brimstone/graphics/command_buffer.h" +#include +#include + +bool UploadToBuffer(SDL_GPUDevice* device, const void* data, size_t byte_size, SDL_GPUBuffer* buffer) { + assert(device != NULL); + assert(data != NULL); + assert(buffer != NULL); + + SDL_GPUTransferBuffer* transfer_buffer = SDL_CreateGPUTransferBuffer(device, + &(SDL_GPUTransferBufferCreateInfo){ + .usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, + .size = byte_size, + }); + if(transfer_buffer == NULL) { + SDL_Log("Failed to create transfer buffer: %s", SDL_GetError()); + return false; + } + + void* mapped_buffer = SDL_MapGPUTransferBuffer(device, transfer_buffer, false); + if(mapped_buffer == NULL) { + SDL_Log("Failed to map GPU transfer buffer: %s", SDL_GetError()); + return false; + } + + memcpy(mapped_buffer, data, byte_size); + + SDL_UnmapGPUTransferBuffer(device, transfer_buffer); + + SDL_GPUCommandBuffer* copy_command_buffer = CommandBufferAcquire(device); + assert(copy_command_buffer != NULL); + + SDL_GPUCopyPass* copy_pass = CopyPassBegin(copy_command_buffer); + assert(copy_pass != NULL); + + SDL_UploadToGPUBuffer(copy_pass, + &(SDL_GPUTransferBufferLocation){ + .transfer_buffer = transfer_buffer, + .offset = 0, + }, + &(SDL_GPUBufferRegion){ + .buffer = buffer, + .offset = 0, + .size = byte_size, + }, + false); + + CopyPassEnd(copy_pass); + bool submit_success = CommandBufferSubmit(copy_command_buffer); + SDL_ReleaseGPUTransferBuffer(device, transfer_buffer); + + return submit_success; +} diff --git a/src/brimstone/graphics/upload.h b/src/brimstone/graphics/upload.h new file mode 100644 index 0000000..6e00f22 --- /dev/null +++ b/src/brimstone/graphics/upload.h @@ -0,0 +1,8 @@ +#ifndef UPLOAD_H +#define UPLOAD_H + +#include + +bool UploadToBuffer(SDL_GPUDevice* device, const void* data, size_t byte_size, SDL_GPUBuffer* buffer); + +#endif diff --git a/src/brimstone/graphics/vertex.h b/src/brimstone/graphics/vertex.h new file mode 100644 index 0000000..d685077 --- /dev/null +++ b/src/brimstone/graphics/vertex.h @@ -0,0 +1,13 @@ +#ifndef VERTEX_H +#define VERTEX_H + +typedef struct { + struct { + float x, y, z; + } pos; + struct { + float r, g, b; + } color; +} Vertex; + +#endif diff --git a/src/brimstone/init/systems.c b/src/brimstone/init/systems.c new file mode 100644 index 0000000..2fe182f --- /dev/null +++ b/src/brimstone/init/systems.c @@ -0,0 +1,8 @@ +#include + +void InitSystems() { + if(!SDL_Init(SDL_INIT_VIDEO)) { + SDL_Log("Failed to initialize SDL: %s", SDL_GetError()); + exit(EXIT_FAILURE); + } +} diff --git a/src/brimstone/init/systems.h b/src/brimstone/init/systems.h new file mode 100644 index 0000000..ba4dcf8 --- /dev/null +++ b/src/brimstone/init/systems.h @@ -0,0 +1,6 @@ +#ifndef INIT_SYSTEMS_H +#define INIT_SYSTEMS_H + +void InitSystems(); + +#endif diff --git a/src/brimstone/io/copy_pass.c b/src/brimstone/io/copy_pass.c new file mode 100644 index 0000000..1c48296 --- /dev/null +++ b/src/brimstone/io/copy_pass.c @@ -0,0 +1,18 @@ +#include + +SDL_GPUCopyPass* CopyPassBegin(SDL_GPUCommandBuffer* copy_command_buffer) { + assert(copy_command_buffer != NULL); + + SDL_GPUCopyPass* copy_pass = SDL_BeginGPUCopyPass(copy_command_buffer); + if(copy_pass == NULL) { + SDL_Log("Failed to begin copy pass: %s", SDL_GetError()); + } + + return copy_pass; +} + +void CopyPassEnd(SDL_GPUCopyPass* copy_pass) { + assert(copy_pass != NULL); + + SDL_EndGPUCopyPass(copy_pass); +} diff --git a/src/brimstone/io/copy_pass.h b/src/brimstone/io/copy_pass.h new file mode 100644 index 0000000..3e7ad1f --- /dev/null +++ b/src/brimstone/io/copy_pass.h @@ -0,0 +1,9 @@ +#ifndef COPY_PASS_H +#define COPY_PASS_H + +#include + +SDL_GPUCopyPass* CopyPassBegin(SDL_GPUCommandBuffer* copy_command_buffer); +void CopyPassEnd(SDL_GPUCopyPass* copy_pass); + +#endif diff --git a/src/brimstone/io/file.c b/src/brimstone/io/file.c new file mode 100644 index 0000000..16ded48 --- /dev/null +++ b/src/brimstone/io/file.c @@ -0,0 +1,32 @@ +#include "pch.h" + +FileData FileRead(const char* filename) { + FILE* f = fopen(filename, "r"); + if(f == NULL) { + perror(filename); + return (FileData){ 0 }; + } + fseek(f, 0, SEEK_END); + size_t length = ftell(f); + rewind(f); + + uint8_t* buffer = malloc(length); + if(buffer == NULL) { + perror("Failed to allocate memory"); + return (FileData){ 0 }; + } + size_t read_count = fread(buffer, sizeof(char), length, f); + if(read_count != length) { + perror("Failed to read entire file"); + return (FileData){ 0 }; + } + + return (FileData){ + .data = buffer, + .length = length, + }; +} + +void FileFree(FileData file) { + free(file.data); +} diff --git a/src/brimstone/io/file.h b/src/brimstone/io/file.h new file mode 100644 index 0000000..b596f90 --- /dev/null +++ b/src/brimstone/io/file.h @@ -0,0 +1,15 @@ +#ifndef FILE_IO_H +#define FILE_IO_H + +#include +#include + +typedef struct { + uint8_t* data; + size_t length; +} FileData; + +FileData FileRead(const char* filename); +void FileFree(FileData file); + +#endif diff --git a/src/brimstone/main.c b/src/brimstone/main.c new file mode 100644 index 0000000..aec2534 --- /dev/null +++ b/src/brimstone/main.c @@ -0,0 +1,119 @@ +#include "brimstone/graphics/pipeline.h" +#include + +int main(int argc, char** argv) { + InitSystems(); + + SDL_GPUDevice* device = DeviceCreate(); + assert(device != NULL); + + SDL_Window* window = SDL_CreateWindow("Brimstone", 800, 600, 0); + if(window == NULL) { + SDL_Log("SDL_CreateWindow: %s", SDL_GetError()); + exit(EXIT_FAILURE); + } + SDL_ClaimWindowForGPUDevice(device, window); + + /*Vertex vertices[] = { + { -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f }, + { 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f }, + { 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f }, + };*/ + float vertices[3][3] = { + { -0.5f, -0.5f, 0.0f }, + { 0.5f, -0.5f, 0.0f }, + { 0.0f, 0.5f, 0.0f }, + }; + + float colors[3][3] = { + { 1.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f }, + }; + + SDL_GPUBuffer* vertex_buffer = SDL_CreateGPUBuffer(device, + &(SDL_GPUBufferCreateInfo){ + .usage = SDL_GPU_BUFFERUSAGE_VERTEX, + .size = sizeof(vertices), + }); + + bool upload_successful = UploadToBuffer(device, vertices, sizeof(vertices), vertex_buffer); + assert(upload_successful); + + SDL_GPUBuffer* color_buffer = SDL_CreateGPUBuffer(device, + &(SDL_GPUBufferCreateInfo){ + .usage = SDL_GPU_BUFFERUSAGE_VERTEX, + .size = sizeof(colors), + }); + + upload_successful = UploadToBuffer(device, colors, sizeof(colors), color_buffer); + assert(upload_successful); + + SDL_GPUShader* vertex_shader = ShaderLoad(device, "shader.vert.spv", SDL_GPU_SHADERSTAGE_VERTEX); + assert(vertex_shader != NULL); + + SDL_GPUShader* fragment_shader = ShaderLoad(device, "shader.frag.spv", SDL_GPU_SHADERSTAGE_FRAGMENT); + assert(fragment_shader != NULL); + + SDL_GPUGraphicsPipeline* pipeline = GraphicsPipelineCreate( + device, window, vertex_shader, fragment_shader); + assert(pipeline != NULL); + + bool running = true; + SDL_Event event; + while(running) { + while(SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_EVENT_QUIT: + running = false; + break; + } + } + + SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(device); + if(cmd == NULL) { + SDL_Log("SDL_AcquireGPUCommandBuffer: %s", SDL_GetError()); + exit(EXIT_FAILURE); + } + + SDL_GPUTexture* swapchain; + uint32_t swapchain_width, swapchain_height; + SDL_AcquireGPUSwapchainTexture(cmd, window, &swapchain, &swapchain_width, &swapchain_height); + + SDL_GPURenderPass* render_pass = SDL_BeginGPURenderPass(cmd, + &(SDL_GPUColorTargetInfo){ + .texture = swapchain, + .load_op = SDL_GPU_LOADOP_CLEAR, + .clear_color = (SDL_FColor){ .r = 0.1f, .g = 0.3f, .b = 0.4f, .a = 1.0f }, + }, + 1, NULL); + if(render_pass == NULL) { + SDL_Log("SDL_BeginGPURenderPass: %s", SDL_GetError()); + exit(EXIT_FAILURE); + } + + SDL_BindGPUGraphicsPipeline(render_pass, pipeline); + SDL_BindGPUVertexBuffers(render_pass, 0, + (SDL_GPUBufferBinding[]){ + { + .buffer = vertex_buffer, + .offset = 0, + }, + { + .buffer = color_buffer, + .offset = 0, + }, + }, + 2); + SDL_DrawGPUPrimitives(render_pass, 3, 1, 0, 0); + + SDL_EndGPURenderPass(render_pass); + + if(!SDL_SubmitGPUCommandBuffer(cmd)) { + SDL_Log("SDL_SubmitGPUCommandBuffer: %s", SDL_GetError()); + exit(EXIT_FAILURE); + } + } + + return 0; +} diff --git a/src/pch.h b/src/pch.h new file mode 100644 index 0000000..152a8b0 --- /dev/null +++ b/src/pch.h @@ -0,0 +1,30 @@ +#ifndef PCH_H +#define PCH_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/xmake.lua b/xmake.lua new file mode 100644 index 0000000..8608525 --- /dev/null +++ b/xmake.lua @@ -0,0 +1,12 @@ +add_rules("mode.debug", "mode.release") + +add_requires("stc") + +target("brimstone") + set_kind("binary") + set_rundir(".") + add_files("src/**.c") + add_links("SDL3") + add_includedirs("src") + set_pcheader("src/pch.h") + add_packages("stc")