From 119f5f069ccbaec869e298383ae84e5809d70272 Mon Sep 17 00:00:00 2001 From: matthew Date: Sat, 1 Nov 2025 16:16:46 +1100 Subject: [PATCH] work on basic rendering --- assets/shaders/pbr.frag.spv | Bin 7244 -> 3004 bytes assets/shaders/pbr.vert.spv | Bin 4596 -> 4680 bytes src/VulkanRenderer | 2 +- src/gears/game2.d | 284 ++++++++++++++++++++++++++++++++++-- src/gears/main.d | 11 ++ src/shaders/pbr.frag.glsl | 7 + src/shaders/pbr.vert.glsl | 4 +- 7 files changed, 292 insertions(+), 16 deletions(-) diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv index f0971413101b86ca8284551452f8cd5f78951cd5..4e609a2ee5e207c0e58864ec8db22bfd9f0905f4 100644 GIT binary patch literal 3004 zcmZve+j1L45QbOQAtok?L(Utb}nevf~DX>@Lk}?vspk*=&#(zo+paO(yYRlw|R+NKRt( z7AtzmWSGuJRfVQBs^j)9jh*iE0|z#>!wq5kd)>`n`kkM> zrq{jc?Dw`iB}lx~b}Nfs?u?@&l|e|$)p|b~&(b)19!FW67vPN`)Os(SzKGJ?<$=sN zN#d9AmOi04xy`caZ`5|`YT$A5OOvDHVxUT>VlAB(`rLwO{33}bwt_FeM$NrVd028t zO|ff=6rFh8-Ho2ZTJDaxd^#KR!^4=PkxtXy8;{Rl8OA+2h+h?R9F=<9-Dgn|X9=f6 zEKPTxnU`^%V&pnX4iD#fEUe}9$TOeC!+9FHy$vVN{5YBD>g8-^e#tRPXUCB^adNM1 zfAqi}f=x$px?d%QKlg3I%EFt}iO~oJ%g5bD=l)Hg#|0n|`K`877BL@-lb6y3Tzk z76$s6 z%<7CD_F$pN^y(#czk*q9=oR*-w}=OyCRgJ@58s@f^_QKU$KnFl@jUD_Fh6_>D0=%h~FMKf4cCHNT?W@wK9J$Da9h&06B2 z=!SMBM`V13`esjb!Jn2g{S1cwd2#ejUMgjLx3xR*VT&GX_`D!q6S0O*WZnR6SRLzfGsZ?#4*(WlrW x^ScT5SSN`e?hB(X`d0|&+tD{Y@Q#SSp*OylCiS=?0{=l4_(A?Js41>m@IT`M+c5wD literal 7244 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 O=*GzZmv2$q@BDuSebyxa diff --git a/assets/shaders/pbr.vert.spv b/assets/shaders/pbr.vert.spv index 3440819d84b8f392f27d6be6b6b1934a992ef097..12d75f6c70fe0872805a013c3893a10d6b43f23d 100644 GIT binary patch delta 1706 zcmYk6+fEZv6oz*@(*l8MBx6!hR1k?FghUgKCPre>swhQ{iboi5fNCkwgNlhEK7ld& z1-$VAh}T|l=VSN^Cf=I(f4i-8lb^Nzwf?>KX?6Y#{X8Fd$)OIDN|Tuo| zvnV_hVqsHwBb0@z@Lt$E`1T_?>YJPL8Ee}mlQt>G6XNCV%2re|iZwJz`_Vglh04Y9 za{aArN`I^(-V!U~yHypVpwledLoXa#kuq19n9NTvEHC7jlu4UNvH6+&t;MO_oC}Im zb=4;PaEzVbu0-!9x1tSvW^j`EXlthwSEl2r5?5=D_#2z^vm>0(sdIIX=xTA^h4_7~ zE^#YXv!DEML{r^}wpNRAx#mt!jMKj=uCLdtv0`acvp@W7j*KT%H;d(BIj&NS`y%cO zQE6wB^RRywFGRJtQjALIi0yqJPOT;Pxxh05Q|{_N7YL^`oF{`b;LEaXhyh=bg#$QC z;wPJYwaHucxVS-qA^pDVhjR_?3UH$cC_+K_QQmWXlWpecp>{1CZDX$I`m3eoEzl+f z>cY>Nt1Yqb8W8~l0T)HF#stq@EdD)RUd{eahl!d!>EIWe(|Z82_{ z*kyq=co^19wDF@geLYgHEATx13hZEaXjgjr^P`&9C;2UbWe3D>%Tl6WxZdPEEHUzT zW!Vn-6XFGX&=c}kVAjN|CwbO(dlMcGhD*})*RUxUu! z*Q7MaFau7HFqokaf(dPJCbYkT9y^oiPZ8a=LFU5Xj&kgzU-Nclw*_MCq#|qVK_=|N zIb%B15WAVPxw;r{!yLXyv<5Neyp!d5D`$wR?mS~ce76Q8r6dc*yKyaktKWqmXScEoCr1e)=S wb_9Pcpe4>3Y0f7CcQ7Du2XJ)M;1tgV8WjDw>t<8 delta 1630 zcmYk5-A+?c5QTR+ZGmWOOeGaipjKlD@h?$hVl-AkK;@@`ia$UP6G}ows0$6D`Sr{9j{carr!`io*2?a-F>w>Mv55cC8MKv3mE}fLikSYW zDjte$?3I7uq%OTyCO36|a%_5jd46m`nYekQ*xc;cgJ(~2Pi-)$vgl``sY?a1(VF{i zvh1#VHWRm}opZ}O+g@$jb8B9Gmwn@A&3B{eVeVknxyE}f?e5%Z-h02>kT{H0{m;?V za1|Tn3<#7M*MAxaXDj$Cc@BiZX(JrKX(8*5 zfG-9-{Cz<@BVgzY^5-Bj@s{lqCKK-$uGEw(Fx>-VNIJZyo!FLM^jE8y*aP zsEyjUmN6FEte-Y%+oYKW!%3o6jJi`yy8vMY2!qmeA6Yn+MX35Vd)Bf*7G*5Rp%CbDR zB(OESAYgsk%9TgAVk3IO^622jAV%d?|7Rkb;Su#nGln6U1gDVcgS#5@yPOdoq1?Mk^GYJXFluwK$4a zK2UJ?Q1Mi2;sE2<0onVRz%$&_0pZUDw8Uuu&vHSaL0n7?I%xw4 J|7x3C!arP-sS^MI diff --git a/src/VulkanRenderer b/src/VulkanRenderer index 1b4d997..d46741a 160000 --- a/src/VulkanRenderer +++ b/src/VulkanRenderer @@ -1 +1 @@ -Subproject commit 1b4d9979765ca8a1c1f45ddf8420edc93d1b79dc +Subproject commit d46741a48033b5136fa189c1b80a574986e68f64 diff --git a/src/gears/game2.d b/src/gears/game2.d index cfbdaf3..324d376 100644 --- a/src/gears/game2.d +++ b/src/gears/game2.d @@ -8,25 +8,28 @@ const u32 UNI_MAX = 50; struct GameState { RenderState rds; + u64 frame; + u64 frame_idx; } struct RenderState { - Renderer rd; - Arena[2] frame_arenas; + Renderer rd; + Arena[2] frame_arenas; + Arena perm_arena; - PushConst pc; - ShaderGlobals globals; + PushConst pc; + ShaderGlobals globals; - Pipeline pipeline_pbr; - DescSetLayout desc_layout_globals; - DescSetLayout desc_layout_resources; - DescSet[2] desc_set_globals; - DescSet[2] desc_set_resources; - PipelineLayout pipeline_layout_pbr; + Pipeline[PID.Max] pipelines; + DescSetLayout desc_layout_globals; + DescSetLayout desc_layout_resources; + DescSet[2] desc_set_globals; + DescSet[2] desc_set_resources; + PipelineLayout pipeline_layout_pbr; - ImageView placeholder_tex; - Buffer globals_buffer; + ImageView placeholder_tex; + Buffer globals_buffer; } struct ShaderGlobals @@ -38,6 +41,68 @@ struct ShaderGlobals f32 alpha = 0.0; } +struct Model +{ + Buffer v_buf; + Buffer i_buf; + Buffer s_buf; + ModelState state; + ModelRenderInfo info; + Vertex[] v; + u32[] idx; +} + +struct ModelRenderInfo +{ + PushConst pc; + PipelineID pid; + + alias pc this; +} + +struct ModelState +{ + Mat4 matrix; +} + +enum PBRMod : u32 +{ + AlbedoValue = 0x0001, + AmbientValue = 0x0002, + SpecularValue = 0x0004, + AlphaValue = 0x0008, + AlbedoTexture = 0x0010, + AmbientTexture = 0x0020, + SpecularTexture = 0x0040, + AlphaTexture = 0x0080, +} + +enum PipelineID : u32 +{ + None, + PBRVVVV, + PBRTVVV, + PBRVTVV, + PBRVVTV, + PBRVVVT, + PBRTTVV, + PBRTVTV, + PBRTVVT, + PBRVTTV, + PBRVTVT, + PBRVVTT, + PBRVTTT, + PBRTVTT, + PBRTTVT, + PBRTTTV, + PBRTTTT, + Max, +} + +alias PID = PipelineID; + +const PID[] PBR_PIPELINES = [PID.PBRVVVV, PID.PBRTVVV, PID.PBRVTVV, PID.PBRVVTV, PID.PBRVVVT, PID.PBRTTVV, PID.PBRTVTV, PID.PBRTVVT, PID.PBRVTTV, PID.PBRVTVT, PID.PBRVVTT, PID.PBRTTTV, PID.PBRTTVT, PID.PBRTVTT, PID.PBRVTTT, PID.PBRTTTT]; + struct PushConst { union @@ -72,6 +137,8 @@ struct Vertex Vec2 uv; } +Model g_box; + GameState InitGame(PlatformWindow* window) { @@ -81,6 +148,34 @@ InitGame(PlatformWindow* window) return g; } +void +RunCycle(GameState* g) +{ + g.frame_idx = g.frame % 2; + + Reset(&g.rds.frame_arenas[g.frame_idx]); + + Renderer* rd = &g.rds.rd; + + BeginFrame(rd); + + BeginRendering(rd); + + PushConstants(rd, g.rds.pipelines[g_box.info.pid], &g_box.info.pc); + + Bind(rd, g.rds.pipelines[g_box.info.pid], [g.rds.desc_set_globals[g.frame_idx], g.rds.desc_set_resources[g.frame_idx]]); + + BindBuffers(rd, &g_box.i_buf, &g_box.v_buf); + + DrawIndexed(rd, cast(u32)g_box.idx.length, 1, 0); + + FinishRendering(rd); + + SubmitAndPresent(rd); + + g.frame += 1; +} + void Init(RenderState* rds, PlatformWindow* window) { @@ -113,6 +208,7 @@ Init(RenderState* rds, PlatformWindow* window) ]; rds.rd = InitRenderer(handles, MB(24), MB(32)); + rds.perm_arena = CreateArena(MB(4)); rds.frame_arenas = [ CreateArena(MB(4)), CreateArena(MB(4)), @@ -129,6 +225,19 @@ Init(RenderState* rds, PlatformWindow* window) rds.desc_set_resources[i] = AllocDescSet(&rds.rd, rds.desc_layout_resources); } + u32[4] spec_data; + + Specialization spec = { + data: spec_data.ptr, + size: u32.sizeof * spec_data.length, + entries: [ + { constantID: 0, size: u32.sizeof, offset: u32.sizeof*0 }, + { constantID: 1, size: u32.sizeof, offset: u32.sizeof*1 }, + { constantID: 2, size: u32.sizeof, offset: u32.sizeof*2 }, + { constantID: 3, size: u32.sizeof, offset: u32.sizeof*3 }, + ], + }; + GfxPipelineInfo pbr_info = { vertex_shader: LoadAssetData(&rds.frame_arenas[0], "shaders/pbr.vert.spv"), frag_shader: LoadAssetData(&rds.frame_arenas[0], "shaders/pbr.frag.spv"), @@ -136,10 +245,21 @@ Init(RenderState* rds, PlatformWindow* window) input_rate_stride: Vertex.sizeof, layout: rds.pipeline_layout_pbr, vertex_attributes: attributes, + vert_spec: spec, + frag_spec: spec, }; - bool result = CreateGraphicsPipeline(&rds.rd, &rds.pipeline_pbr, &pbr_info); - assert(result); + foreach(pid; PBR_PIPELINES) + { + u32 mod = PIDToPBR(pid); + spec_data[0] = mod & PBRMod.AlbedoTexture; + spec_data[1] = mod & PBRMod.AmbientTexture; + spec_data[2] = mod & PBRMod.SpecularTexture; + spec_data[3] = mod & PBRMod.AlphaTexture; + + bool result = CreateGraphicsPipeline(&rds.rd, &rds.pipelines[pid], &pbr_info); + assert(result); + } const u64 tex_size = 32*32*4; u8[tex_size] placeholder_tex; @@ -160,4 +280,140 @@ Init(RenderState* rds, PlatformWindow* window) CreateImageView(&rds.rd, &rds.placeholder_tex, 32, 32, 4, placeholder_tex); CreateBuffer(&rds.rd, &rds.globals_buffer, BT.Uniform, ShaderGlobals.sizeof, false); + bool transfer = Transfer(&rds.rd, &rds.globals_buffer, &rds.globals); + + assert(transfer); + + g_box = MakeBox(rds, 6.0, 6.0, Vec4(0.3, 0.4, 0.8, 1.0)); + + CreateBuffer(&rds.rd, &g_box.v_buf, BT.Vertex, g_box.v.length * Vertex.sizeof, false); + CreateBuffer(&rds.rd, &g_box.i_buf, BT.Index, g_box.idx.length * u32.sizeof, false); + CreateBuffer(&rds.rd, &g_box.s_buf, BT.Uniform, ModelState.sizeof, false); + + transfer = Transfer(&rds.rd, &g_box.v_buf, g_box.v); + transfer &= Transfer(&rds.rd, &g_box.i_buf, g_box.idx); + transfer &= Transfer(&rds.rd, &g_box.s_buf, &g_box.state); + + assert(transfer); + + Write(&rds.rd, rds.desc_set_globals[0], &rds.globals_buffer, 0, DT.Uniform); + Write(&rds.rd, rds.desc_set_globals[1], &rds.globals_buffer, 0, DT.Uniform); + + Write(&rds.rd, rds.desc_set_resources[0], &g_box.s_buf, 2, 0, DT.Uniform); + Write(&rds.rd, rds.desc_set_resources[1], &g_box.s_buf, 2, 0, DT.Uniform); +} + +PipelineID +PBRToPID(u32 mod) +{ + switch(mod) + { + case GetPBRMod(false, false, false, false): return PID.PBRVVVV; + case GetPBRMod(true , false, false, false): return PID.PBRTVVV; + case GetPBRMod(false, true , false, false): return PID.PBRVTVV; + case GetPBRMod(false, false, true , false): return PID.PBRVVTV; + case GetPBRMod(false, false, false, true ): return PID.PBRVVVT; + case GetPBRMod(true , true , false, false): return PID.PBRTTVV; + case GetPBRMod(true , false, true , false): return PID.PBRTVTV; + case GetPBRMod(true , false, false, true ): return PID.PBRTVVT; + case GetPBRMod(false, true , true , false): return PID.PBRVTTV; + case GetPBRMod(false, true , false, true ): return PID.PBRVTVT; + case GetPBRMod(false, false, true , true ): return PID.PBRVVTT; + case GetPBRMod(false, true , true , true ): return PID.PBRVTTT; + case GetPBRMod(true , false, true , true ): return PID.PBRTVTT; + case GetPBRMod(true , true , false, true ): return PID.PBRTTVT; + case GetPBRMod(true , true , true , false): return PID.PBRTTTV; + case GetPBRMod(true , true , true , true ): return PID.PBRTTTT; + default: return PID.None; + } +} + +u32 +PIDToPBR(PipelineID pid) +{ + switch(pid) with(PID) + { + case PBRVVVV: return GetPBRMod(false, false, false, false); + case PBRTVVV: return GetPBRMod(true , false, false, false); + case PBRVTVV: return GetPBRMod(false, true , false, false); + case PBRVVTV: return GetPBRMod(false, false, true , false); + case PBRVVVT: return GetPBRMod(false, false, false, true ); + case PBRTTVV: return GetPBRMod(true , true , false, false); + case PBRTVTV: return GetPBRMod(true , false, true , false); + case PBRTVVT: return GetPBRMod(true , false, false, true ); + case PBRVTTV: return GetPBRMod(false, true , true , false); + case PBRVTVT: return GetPBRMod(false, true , false, true ); + case PBRVVTT: return GetPBRMod(false, false, true , true ); + case PBRTTTV: return GetPBRMod(true , true , true , false); + case PBRTTVT: return GetPBRMod(true , true , false, true ); + case PBRTVTT: return GetPBRMod(true , false, true , true ); + case PBRVTTT: return GetPBRMod(false, true , true , true ); + case PBRTTTT: return GetPBRMod(true , true , true , true ); + default: return 0; + } +} + +static u32 +GetPBRMod(bool albedo = false, bool ambient = false, bool specular = false, bool alpha = false) +{ + with(PBRMod) + { + return + (albedo ? AlbedoTexture : AlbedoValue) | + (ambient ? AmbientTexture : AmbientValue) | + (specular ? SpecularTexture : SpecularValue) | + (alpha ? AlphaTexture : AlphaValue); + } +} + +Model +MakeBox(RenderState* rds, f32 width, f32 height, Vec4 col) +{ + Model box = { + v: Alloc!(Vertex)(&rds.perm_arena, 8), + idx: Alloc!(u32)(&rds.perm_arena, 36), + info: { + pid: PID.PBRVVVV, + }, + state: { + matrix: Mat4Identity(), + }, + }; + + const Vec3[8] positions = [ + Vec3(-1.0, 0.0, -1.0), Vec3(+1.0, 0.0, -1.0), Vec3(+1.0, 1.0, -1.0), Vec3(-1.0, 1.0, -1.0), + Vec3(-1.0, 0.0, +1.0), Vec3(+1.0, 0.0, +1.0), Vec3(+1.0, 1.0, +1.0), Vec3(-1.0, 1.0, +1.0), + ]; + + const u32[36] indices = [ + 0, 1, 3, 3, 1, 2, + 1, 5, 2, 2, 5, 6, + 5, 4, 6, 6, 4, 7, + 4, 0, 7, 7, 0, 3, + 3, 2, 7, 7, 2, 6, + 4, 5, 0, 0, 5, 1, + ]; + + f32 half_width = width/2.0; + + Vec3 pos = Vec3(half_width, height, half_width); + for(u64 i = 0; i < positions.length; i += 1) + { + box.v[i].pos = pos * positions[i]; + } + + box.idx[] = indices[]; + + return box; +} + +unittest +{ + with(PBRMod) with(PID) + { + foreach(pid; PBR_PIPELINES) + { + assert(PBRToPID(PIDToPBR(pid)) == pid); + } + } } diff --git a/src/gears/main.d b/src/gears/main.d index 0e3b733..27ee0a5 100644 --- a/src/gears/main.d +++ b/src/gears/main.d @@ -10,5 +10,16 @@ void main(string[] argv) PlatformWindow window = CreateWindow("Video Game", 1920, 1080); GameState g = InitGame(&window); + + for(;;) + { + Inputs* inputs = GetEvents(&window); + if(window.close) + { + break; + } + + RunCycle(&g); + } } diff --git a/src/shaders/pbr.frag.glsl b/src/shaders/pbr.frag.glsl index b05c6ac..1ce8bd6 100644 --- a/src/shaders/pbr.frag.glsl +++ b/src/shaders/pbr.frag.glsl @@ -5,12 +5,14 @@ #include "structures.layout" layout (location = 0) in struct FragDataIn { + vec4 col; vec3 normal; vec2 uv; } FragData; layout (location = 0, index = 0) out vec4 FragColor; +/* vec4 CalculateDirectionalLight(vec4 diff_col, vec4 diff_samp, vec4 light_col, vec3 dir, vec3 normal) { float diffuse_factor = max(dot(normal, -dir), 0.0); @@ -36,9 +38,13 @@ vec4 UnPreMultLinearToSRGB(vec4 col) col.b = UnPreMultLinearToSRGB(col.x); return col; } +*/ void main() { + FragColor = FragData.col; + + /* ivec2 coord = ivec2(gl_FragCoord.xy); int store_mask = 0; int view_size = int(G.res.x) * int(G.res.y); @@ -75,4 +81,5 @@ void main() { FragColor = vec4(0.0); //vec4(out_col.rgb * out_col.a, out_col.a); // Change to vec4(0.0) to disable tail blending } + */ } diff --git a/src/shaders/pbr.vert.glsl b/src/shaders/pbr.vert.glsl index 940b63b..5292f36 100644 --- a/src/shaders/pbr.vert.glsl +++ b/src/shaders/pbr.vert.glsl @@ -34,6 +34,7 @@ layout (location = 3) in vec3 in_normal; layout (location = 4) in vec2 in_uv; layout (location = 0) out struct FragDataOut { + vec4 col; vec3 normal; vec2 uv; } FragData; @@ -49,6 +50,7 @@ void main() { gl_Position = G.projection * G.view * ModelMatrix * vec4(in_pos, 1.0); - FragData.uv = in_uv; + FragData.uv = in_uv; FragData.normal = mat3(ModelMatrix) * in_normal; + FragData.col = in_col; }