From fd03759f57ec13b28a8f5d83ec29bcb51814d21c Mon Sep 17 00:00:00 2001 From: matthew Date: Wed, 23 Jul 2025 08:16:27 +1000 Subject: [PATCH] fix rdtsc, example for rdtsc -> real time, start work on lighting --- assets/shaders/gradient.comp.spv | Bin 3512 -> 3688 bytes assets/shaders/gui.frag.spv | Bin 2284 -> 2460 bytes assets/shaders/gui.vert.spv | Bin 4756 -> 4932 bytes assets/shaders/pbr.frag.spv | Bin 2192 -> 2368 bytes assets/shaders/pbr.vert.spv | Bin 3844 -> 4256 bytes assets/shaders/triangle.frag.spv | Bin 2248 -> 2424 bytes assets/shaders/triangle.vert.spv | Bin 3140 -> 3316 bytes src/gears/main.d | 19 ++++++++++++ src/gears/renderer.d | 49 +++++++++++++++++-------------- src/gears/vulkan.d | 6 +--- src/shaders/pbr.vert.glsl | 12 ++++---- src/shaders/structures.layout | 4 ++- src/shared/util.d | 29 ++++++++++++++++-- 13 files changed, 84 insertions(+), 35 deletions(-) diff --git a/assets/shaders/gradient.comp.spv b/assets/shaders/gradient.comp.spv index 093c46cd5c0019f4816a242fc0e85ae0020d963c..1c69531582a3c26933478565fe84648d9b2cb845 100644 GIT binary patch delta 256 zcmdlX{X%BLJVtvqh7bk_D9cPOkIzjkDax#1U}N9_i!%bH3X1ZxQj<$E^YdV`3_y7n zusqY|gN$bxmDw3mp@!ts*#!jmmn zcm!c0Oh8d(Aa2;~$g-4Co&|0^OdHHPcAz4G$q!k@CmXP^@Pb4^hJ&;^Z2ro+mysP} VL(t}}?52$D5OabyzvVd10sy4^ESCTP delta 120 zcmaDMvqO5rJVs@9h7bk_D9Cx7Kw4gktQ74-lB diff --git a/assets/shaders/gui.vert.spv b/assets/shaders/gui.vert.spv index bd0b856ee8a221a80acb3a3ff35259ea71822442..16a46110350b433cb392ed1ccfaf2bc2fb216399 100644 GIT binary patch delta 309 zcmbQDdPHqQ8p9zYUgJBZH?!~$qy z%0RvYk{A<^4H9eEe3SJk$S|0#FvDPcWW!)$AdMgZvJ@l+vJ`B==C$mG%XF*$E@E{`-TqvhmI!FC`iDAWu98qqIs delta 109 zcmX@2Hbr$q8#nT+fZV|XWXagG(m8K7o##e13v=!gFGP1KWsDeZ%_cHe~ svoi2cPGl3_oWZh>ksm4nlv4&P$Yoo~4Ai+z6a)lRKoo(&1SVjBXdvQ=wlmXV8hX0NnH~_Ycm&_W zTlGROd;#Cb!&<9MX{(Ss_1W0{C5SfdQ)C&(Z6>8uAijID2dk6LC^nY6vWY5 z6b@wHguQj=PHXX+-|qMQVfHKz{WwZOzY`6@b{0KR5*Nq$MM*mzb;=Gkd6es~c{N4$ zyk~wd$Oh535{1;g-Qo{pe<>WSgo7;1@w&tD!IloAEJ_oh8*+bol;cs7El1yR}6i`j7Lv$ziK`^=_qrts`(tD<3OCY{919k z8pQXCc~J(QDLCs%6h5``=`A?5_Xp`C<|R$c%D!rD=Psxs#joTu+mcSMHSy(c&~Zt$3Z*nrm-CIy)^Z`UW($_b1tSO8%OY~w9}&~RPVl=>!k7)P4@wyG0M;yFQx2OiVcdEA7DSwp`#vLLnSNL@=j6=X z<>JiM@tvn8YR1MQx1HB8aQjOIR!M%lB%dqEoZtN48_U)FJ5sKH zPB!W%AF;2GeJlByEyj%!ezPPmmgHMwxth--c`73M#J7t)Ec6v|?n=?OVlLP3PBEA0 zR#)5kE@&?@%lc}1xvz%J7Opx=v5$D=edsUl17lxP#Pc8)b%H$?QGX~tBVw7pe!faR z+w5V#&9l{le^)m4lgsq={ndQFu@eLPWAU<`Szqr@G3V$N(GKlm-;6YLd29j4#qkDk2uRAMS4w~J;ZuloO=OAZuFxLo0fh|GCeGMRrTJG%$)$oADwSB zn4Rr}!d)M@_bB~u&z?}}r`f2XAP#qHT#l+4qPGZuB{aSsg9u^cnw;oUJLoUv=De_#KC%69=7l8tZ^|eTWCojGa9S(*sde>p}Jd%v>gs8lTWoLZk4EPcQ{jtN)x!bXb7^d^v1pU0uK%A-rt6ZytfmFY)CArVSxq-2W3zoXC4-TR*;^FNiNM*@6u%_`M`!*%7BPD( z+QZx}i|_%*hZ*=(#Ejk76Q}3*Mfibp*S3i0Klcb5`|$fr#4|DdbIJHDxj0`+W>(9z zMYoK-Ux~QS+zaBc7k_)s*#A;?>oMH&_>#$s?*nmkJIktM&VnrvNB>8eE{OgGdGK)M literal 3844 zcmZveTXPgu5XUFkOMq|@xrJL?j35f)Eg;Gz2}xYgK+uJN*U9YegiO_BcAcFC@rjS% z_wZGHzz4s8-^WXpRsMf7)0GmY?u|)= z|8lV4zn1)Y$$t}{^y;}^bEUO%VUTq%%wBwl2z$Ls9*7wGJUMDrMO#6XAny`QiB5=4 zi_VHJi9QlFMYly?ioOx8ivm$w)D>0qZ(RHj1+RKLyyl9({P3Qi^par`ZS>MD|GQxj zM;lR?%DxMGb9J@3vg~*IeSeTWjYB_e`6=Z4jz0wg<_YR9civ7D`x)!EcnB(;l#|K+)5M@y>5jv6k)1w@ZlB^Z|kbeTR zQKxK+anxUm23e4F!qGlDjBOalBU??qp|31*roU0*_j?2Mn)j;o+d&qlQ4r%(FEQj` zs~v?&Hp0lO8*OY12b@{Y_ma<`A9jXukg|t7iAgR&+zz`vUsY$rR8^RbzLl{@#=5>6 z`)VSKH!=z{d!4;S+|6LH?P2x_>_y(b>rnT0=J9v9@m+`fjH0HU_-sarMq;2g<$XFW zZhbQBjIhOC!dJ+^=p7hKQ{YD$PWsO*-(5tm<}=+JW`3s^=W&_udqsl?A*`Oydn?%L z$6`X6@eauv!3+Qxa-VgUFT!tJ1T0P8+VHP z#kpUJw>E=rn7Z)_Tqds{2c2-U7t0~v%Ux`Vn4@*^r8IbQYb$ufz=8$h$~Vys%!iBm z+XY7X@~Gzbmwr%GQ@!H8FjF^WMP^MFY=n_N7~K5W1IFALh788MHT9R-pBAw=i+QuN zkXbVY%VU6X2G~m?;@TdthJ$ey7>}L#aW2@bgE8M=mmQ3m2D|ED%rV%!gE6~cOAf}Y zg54BRBXfF6#4_D-re@}ITttpGtL$fCKQI2Xo@eB@9htfcyqMwbK34NL+C7t*=1h7= zoNJ@K6>rXw=N);$kry4ATJ2oslyfQ~YD4E77CQHXyr_?JnN6!@&5<8CGWVhAM{zf# zsxw7@>>lwg?E4#LJ)@6c)Cx8)A{Xuzxw1^(&b5-?wc^}bF5_o0@#k)_pSY%P@2`66 zrJWeq(Or8WonF}fcBxmy@$WkJ1L^>APN`?ukq=8^E*qjF@}~#r%=DE0GK*m74gF;f zv4dYJb$-*q&Pj(C_xRbI>AQuo&MOkJ_K5HSH!|P7!aVQU@8-L&^Z_?tv+=DAvv_9P z@7VCcj*Yxu7Lfz7iGlAS<$gfCA!3maI{$;Aw<1;iD{g&$ zPcn@cHa_b5BKI%adMIovCC{O?Okh_(N!e7o$BJgD3+8lx3!t$LA)N6lGR0urY9e#TkK81x5K;smUdo`FSu|2B16( zSe|KfF5^Q+Wp)N_s3E!eDXBRKbwGuzU^&Lgq0F`75KSOMS%KICNP;Y9oV<})c=8Qq z9zmE06Hrtch#NLPWIoC$&jL3drVVBtJ5Z6p!gFGP1KWXoEy2_cGV= uvqB_*TxB43*c`}mlo2QhRsa=bm>kQtl^JNlW=Zy$jLggo+LL#3><0h}zZ8W4 diff --git a/assets/shaders/triangle.vert.spv b/assets/shaders/triangle.vert.spv index 5aea80ffa543a2b183e0f1fc86441ff0ded68e66..1a44ef984879c4c8c8de9bd14140c0b540be537f 100644 GIT binary patch delta 264 zcmX>i@kMe26O%m~gE<2Plx3!t$LA)N6lGR0urY9e#TkK81x5K;smUdo`FSu|2B16( zSe|LKD$_$oWp)N{s3E!eDXBRKbwGuzU^&Lgyev26A(}vjvI4OOkOWx{;z~qN4 z;({|FpEJ-K>(y3BnC1RB<8UBB-=qIc8E=8 Tn|nDc8QCFbnQi9ewq^tXB2*~J delta 108 zcmew&c|>9Z6O%GKgE<2Pl;;=aq{QbYmK0@HfJE3BSio|On;n@RGP1KWc!NYIyRzJz r?8GXxIfL~OBR^CSD6R~W++4_hkck %s = %s elapsed", os_start, os_end, os_elapsed); + writefln("OS Seconds: %.4f", cast(f64)(os_elapsed)/cast(f64)(os_freq)); + writefln(" CPU Timer: %s -> %s = %s elapsed", cpu_start, cpu_end, cpu_elapsed); + while (true) { p.HandleEvents(&window); diff --git a/src/gears/renderer.d b/src/gears/renderer.d index 5e81d4c..bf5a8de 100644 --- a/src/gears/renderer.d +++ b/src/gears/renderer.d @@ -49,6 +49,24 @@ enum BufferType : int alias BT = BufferType; +struct GlobalUniforms +{ + Mat4 view_matrix; + Mat4 projection_matrix; + Vec2 res; +} + +struct ShaderUniforms +{ + f32 placeholder; +} + +struct PushConst +{ + Mat4 model_matrix; + u32 mat_id; +} + enum PipelineType : int { Graphics, @@ -109,25 +127,15 @@ struct Renderer struct Camera { - Vec3 pos = Vec3(0.0); - Vec3 target = Vec3(0.0); -} - -struct GlobalUniforms -{ - Mat4 world_matrix; - Vec2 res; -} - -struct ShaderUniforms -{ - f32 placeholder; + Vec3 pos = Vec3(0.0, 0.0, 3.0); + Vec3 front = Vec3(0.0, 0.0, -1.0); + Vec3 up = Vec3(0.0, 1.0, 0.0); } extern(C) struct Material { Vec4 ambient; - Vec4 diffuse; + Vec4 albedo; Vec4 specular; u32 albedo_texture; u32 ambient_texture; @@ -227,9 +235,9 @@ Init(p.Window* window) rd.ui_pipeline = BuildGfxPipeline(&rd, &ui_info); rd.compute_pipeline = BuildCompPipeline(&rd, &gradient_info); - rd.model = LoadModel(&rd, "models/Tree01.m3d"); + rd.model = LoadModel(&rd, "models/yoda.m3d"); - ReadModel(&rd, "models/Tree01.m3d"); + ReadModel(&rd, "models/yoda.m3d"); return rd; } @@ -239,11 +247,7 @@ Cycle(Renderer* rd) { rd.ui_count = 0; - f32 radius = 10.0; - f32 cam_x = sin(RDTSC()) * radius * 0.000000000001; - f32 cam_z = cos(RDTSC()) * radius * 0.000000000001; - - rd.globals.world_matrix = Mat4(1.0); + rd.globals.view_matrix = Mat4(1.0); BeginFrame(rd); @@ -460,6 +464,7 @@ LoadModel(Renderer* rd, string name) { switch (m3d.material[i].prop[j].type) { + case m3dp_Kd: ConvertColor(&mats[i].albedo, m3d.material[i].prop[j].value.color); break; case m3dp_Ka: ConvertColor(&mats[i].ambient, m3d.material[i].prop[j].value.color); break; case m3dp_Ks: ConvertColor(&mats[i].specular, m3d.material[i].prop[j].value.color); break; case m3dp_Ns: mats[i].shininess = m3d.material[i].prop[j].value.fnum; break; @@ -478,7 +483,7 @@ LoadModel(Renderer* rd, string name) mats[i].specular_texture = tex_lookup[m3d.material[i].prop[j].value.textureid]; mats[i].specular_has_texture = true; } break; - default: break; + default: Logf("Unimplemented: %s", m3d.material[i].prop[j].type); break; } } diff --git a/src/gears/vulkan.d b/src/gears/vulkan.d index ee7b761..e241f41 100644 --- a/src/gears/vulkan.d +++ b/src/gears/vulkan.d @@ -91,11 +91,6 @@ enum DescType : u32 alias DT = DescType; -struct PushConst -{ - u32 mat_id; -} - struct Image { VkImage image; @@ -1269,6 +1264,7 @@ CreateGraphicsPipeline(Vulkan* vk, GfxPipelineInfo* build_info) VkPipelineRasterizationStateCreateInfo rasterization_info = { sType: VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + cullMode: VK_CULL_MODE_BACK_BIT, polygonMode: VK_POLYGON_MODE_FILL, lineWidth: 1.0, frontFace: VK_FRONT_FACE_COUNTER_CLOCKWISE, diff --git a/src/shaders/pbr.vert.glsl b/src/shaders/pbr.vert.glsl index 3d3da30..41c2a9c 100644 --- a/src/shaders/pbr.vert.glsl +++ b/src/shaders/pbr.vert.glsl @@ -24,12 +24,14 @@ void main() { gl_Position = in_pos * y_matrix; + vec4 col = Materials[nonuniformEXT(PC.mat_id)].diffuse; + if (Materials[nonuniformEXT(PC.mat_id)].albedo_has_texture) { - out_col = texture(sampler2D(Textures[nonuniformEXT(Materials[nonuniformEXT(PC.mat_id)].albedo_texture)], SamplerNearest), in_uv); - } - else - { - out_col = Materials[nonuniformEXT(PC.mat_id)].diffuse; + vec4 tex_col = texture(sampler2D(Textures[nonuniformEXT(Materials[nonuniformEXT(PC.mat_id)].albedo_texture)], SamplerNearest), in_uv); + col = mix(col, tex_col, 0.5); } + + out_col = col; + out_uv = in_uv; } diff --git a/src/shaders/structures.layout b/src/shaders/structures.layout index 1a7d626..8ed9782 100644 --- a/src/shaders/structures.layout +++ b/src/shaders/structures.layout @@ -3,7 +3,8 @@ // **************************************************************************** layout (set = 0, binding = 0) uniform GlobalUniforms { - mat4 world_matrix; + mat4 view_matrix; + mat4 projection_matrix; vec2 res; } G; @@ -31,5 +32,6 @@ layout (set = 2, binding = 0) uniform Material { } Materials[]; layout (push_constant) uniform Constants { + mat4 model_matrix; uint mat_id; } PC; diff --git a/src/shared/util.d b/src/shared/util.d index 30903bc..7f5ae8a 100644 --- a/src/shared/util.d +++ b/src/shared/util.d @@ -359,7 +359,7 @@ Hash(string str) return xxh3_64bits_withSeed(str.ptr, str.length, HASH_SEED); } -u64 +pragma(inline): u64 RDTSC() { union u64_split @@ -367,8 +367,8 @@ RDTSC() u64 full; struct { - u32 upper; u32 lower; + u32 upper; }; }; @@ -386,3 +386,28 @@ RDTSC() return val.full; } +pragma(inline): u64 +OSTimeFreq() +{ + version (linux) + { + u64 freq = 1000000; + } + + return freq; +} + +pragma(inline): u64 +OSTime() +{ + version(linux) + { + import core.sys.linux.sys.time; + timeval value; + gettimeofday(&value, null); + + u64 time = OSTimeFreq() * cast(u64)(value.tv_sec) + cast(u64)(value.tv_usec); + } + + return time; +}