From 69df1ea67ed3c5b26552c4529064d0982aa3d285 Mon Sep 17 00:00:00 2001 From: Peter Li Date: Wed, 16 Apr 2025 22:56:00 -0700 Subject: [PATCH] updating spv parser --- .../_cooked/dxil/hello-triangle.vert.dxil | Bin 3800 -> 4660 bytes .../_cooked/msl/hello-triangle.vert.msl | 63 ++++++++----- .../_cooked/spv/hello-triangle.vert.spv | Bin 1568 -> 2420 bytes lib/sdl3/content/hello-triangle.vert.hlsl | 19 +++- lib/sdl3/content/hello-triangle.vert.json | 88 +++++++++++++++++- lib/sdl3/shaderTypes/shaderTypes.zig | 14 +++ lib/sdl3/spvreflect/reflected.zig | 26 ++++++ lib/sdl3/spvreflect/spvreflect.py | 69 ++++++++++---- 8 files changed, 235 insertions(+), 44 deletions(-) diff --git a/lib/sdl3/content/_cooked/dxil/hello-triangle.vert.dxil b/lib/sdl3/content/_cooked/dxil/hello-triangle.vert.dxil index a29b0fe9191aca62d43e89d0f1c9ba7a4024cda1..75815cc1f0a3f5abdf05f656e8690850e962f10c 100644 GIT binary patch literal 4660 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 W$BJ%D2u?p>?od8pb_wqNKjdG)!NA-A delta 2127 zcmchYeM}qY9mk)u4|BH9&H-LHFpg|PTpUPtb_kG!EybF!!QU* z(>2j-^Ws{_PEFhl60?>UhoY8c)VNInt@8^6ltSwyq;i9WXi6E4qAlyPF4?MS&o$jk zH0{4_kMz5@@9+D2?(X@0?m~G9$u8Xy?Oxrk+t1gFdBp3d8}8rwq2xIP0FV#@kP7!@ zFpMxfCl@tKX00A#TQFr8N zBRm8I%$tMPwR^+MG8}*(`?#!pm1rMJdzP;a5Nc5=Mwau`2VHuvNV<2w>mtZfYghF` zZ?}BfL{~W6pSFMAg(`j7JgqGk)>6y$Txo45>XQdL;O4WA0k0_C*yZMT1dK#gF4zo2 zYgpKP1}LwPHD0=o(@&b+v`{Ah6W+7OvO)Gx7RUJx){dtLQH?;&8G7MH^TUjvwgD*2d1Q&~dauq$0*iz&2Xr^_4I;Mu~HYa{*V*)?Z?2ms$p>}Z<9 z4oG-g%#iX?0E9jnp0RZ^#WLY_6`ap2UPz$>B7+(2&+F^TDe(dn(W89L@TE`Zd&1ufRISWl{w;y`3h{ z3bZBGBUs^$;-)zE;SzCLH_|oce9iV+z@@;@B3e4gWyuZ@oVxb-xrnn9W2;u)RgrV{ zm3cd?nz^`Cm3{PK-*-`oc5nZZz0mmBm`S3;d_v@`(%l{`Asw(7XQS%GI`Ha(O+v4oj>J zqlYAFrbs9_l^0Y_QjM38@EjjZ5~Ts`vl!K&t~8X{?1YVk5;Q{Pi|yPn0dL=3Z`O z-E4mN;b-N(jI{h6PcE)zUTy>^TPk2$0uDWWNDuq#oALTPeaC+fg6}*xyZf%MW8@Qt zs~m_T!`UnXvL6Etg~H!Kd;fn4n)&|-+Ass!E4~^2_J4y-z`&+tU?XNs8|zG)bcO+R zKQIhpya9Y}BX;v`CwRyn-2Mo(Xa5znUMW7yu~7Mm1=#GhF?-%L>Ua|~63*Ja+CrSh z1&9^v6HK!~7#$caMz5hX(1$uNPPCj4{yDhCH&hTSmtT+)^AN9M6ndK#SbLC;I|clT zXET2$$n0(uv(8|ZX&=XL_(TxG7r&*;#*L0yi6T{Ej9Bimn5hn=+k^Bd-}>&z<%y!n zP|0P8U*i#{`oTQlx65#+6)(nWn>k{qP+;e_?Pw&h9SM{1aJHtw)ahBcw6NJTI`3&R z5Qkx(zg^(-m!E3&rxOPlLZS%>$uPQKqAu&%8KQ#fiQ$r9srp?deb9-2wC|Gjx4(F% zY1GTV zWtWnoYVYx*Gk6KQiJVuXTB_O(q!`CU7R7$!R-obfHo~pIqxCFRPRm!W@u&KpynVMY zqDqbh5SWkazRizkR|z^j|0&-F4Wf%sH(lp^UiHa zMwET5e9>d_edIAYx(WZM+|RhFf4Gq?(2YJO-$%r5G7n&F2odC+wDaB=OKq~lg@WU6 DJ^t$b diff --git a/lib/sdl3/content/_cooked/msl/hello-triangle.vert.msl b/lib/sdl3/content/_cooked/msl/hello-triangle.vert.msl index 564cda3..715ac92 100644 --- a/lib/sdl3/content/_cooked/msl/hello-triangle.vert.msl +++ b/lib/sdl3/content/_cooked/msl/hello-triangle.vert.msl @@ -3,6 +3,14 @@ using namespace metal; +struct type_TransformBuffer +{ + float4x4 modelMatrix; + float4x4 viewMatrix; + float4x4 projectionMatrix; + float time; +}; + struct Scene { float4 color; @@ -13,8 +21,19 @@ struct type_StructuredBuffer_Scene Scene _m0[1]; }; -constant float2 _30 = {}; -constant float4 _31 = {}; +struct Scene2 +{ + float4 color; + float4 lmfao; +}; + +struct type_StructuredBuffer_Scene2 +{ + Scene2 _m0[1]; +}; + +constant float2 _40 = {}; +constant float4 _41 = {}; struct main0_out { @@ -22,45 +41,45 @@ struct main0_out float4 gl_Position [[position]]; }; -vertex main0_out main0(const device type_StructuredBuffer_Scene& test [[buffer(0)]], uint gl_VertexIndex [[vertex_id]]) +vertex main0_out main0(constant type_TransformBuffer& TransformBuffer [[buffer(0)]], const device type_StructuredBuffer_Scene& test [[buffer(1)]], const device type_StructuredBuffer_Scene2& test2 [[buffer(2)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4 _58; - float2 _59; + float4 _68; + float2 _69; if (gl_VertexIndex == 0u) { - _58 = test._m0[0u].color; - _59 = float2(-1.0); + _68 = test._m0[0u].color; + _69 = float2(-1.0); } else { - float4 _56; - float2 _57; + float4 _66; + float2 _67; if (gl_VertexIndex == 1u) { - _56 = test._m0[1u].color; - _57 = float2(1.0, -1.0); + _66 = test2._m0[1u].color; + _67 = float2(1.0, -1.0); } else { - bool _48 = gl_VertexIndex == 2u; - float4 _53; - if (_48) + bool _58 = gl_VertexIndex == 2u; + float4 _63; + if (_58) { - _53 = test._m0[2u].color; + _63 = test._m0[2u].color; } else { - _53 = _31; + _63 = _41; } - _56 = _53; - _57 = select(_30, float2(0.0, 1.0), bool2(_48)); + _66 = _63; + _67 = select(_40, float2(0.0, 1.0), bool2(_58)); } - _58 = _56; - _59 = _57; + _68 = _66; + _69 = _67; } - out.out_var_TEXCOORD0 = _58; - out.gl_Position = float4(_59, 0.0, 1.0); + out.out_var_TEXCOORD0 = _68; + out.gl_Position = TransformBuffer.modelMatrix * float4(_69, 0.0, 1.0); return out; } diff --git a/lib/sdl3/content/_cooked/spv/hello-triangle.vert.spv b/lib/sdl3/content/_cooked/spv/hello-triangle.vert.spv index 203031d5bdf08c772e442955a70395a92e847e7f..613ba1d9d059a359f5874314ce6438cf83ad3c45 100644 GIT binary patch literal 2420 zcmaKs*-{fx5QYySQE>s0Rgf6K6)@t4D6)g#R-kafZ7NKvVv!6rOi=H51Ybj6LSM>q zsj|xdo0$$%TzIHX?|=8{K0|9}^t5v=&bfB?TECo5mq{$Gk&d^+ooULoQnikf5fPD% zc&p2a@5q=_EOPj1-z#nhrTRg|4{A$|O2rFgcBk}*pHuU9y}dW3FsOcP+NpO~^*$tK z*<(EF?FasQuN+qWx_QCNMR@cQR%@P^bgDRavV6|9IbAsJZ7U2K<**TWyK!^Ht+H45 zl$(ui8*4Fse0%50{+`bzh-m}II|#+3pVi-gaqq`*S$9rCge?obqjL<~Y|LS=Rw?=7 z)H^RuJ%Dn$1^4wEVezmO6t`D*mNz!utxP7dGbTc3XI2*-th|VW&g@1+ z;FvxvnS;*V@pDX1`{_09N5>D|y1KXhk4opHZS3b_WXm?==+|PvAaCJ>?PMNt>AZ|| z@{UA?h3#Y>wsan|A@93rO_QQ`V!*I>fuF-HE{HR~_zr9;J{GgC7_;@u1tvOmz_h&_ z$Hz9iH@MVk7pG1^L>}*tbDWoL+N=&S)ag-vhj>8*?s%eu&B5O(UO>^okA5lAoa+@z zm*j#7A9Au&6oydlZ#6CFEyLMP{{I62tz(%Bn1 zmdAduk;mN8$t#GHhYfvLyhRkxI~#pB>r_WkK*x7itdTPL0;5mm=FIi zxifE@TsSr8_kjriZ{>hTE*Mtxp=A2tEmQN6IER|}rbLfL01-`XCnE zP0gL1Er_TKebH-T=Zm5R(V&R^r|-g@40lN~_hmNJu$o{ji}>c_xy8Qp9@vNBtVm{8 zlOiy!1~{uC-WonI@hz%%zJ=!^-oMR)?_w>nzf}z1|GEeaj@e#F#>V^HOlI^_GO_pu fM7^TV!eD-{MEJp;)6V!l=oy*s1^-{6O^f~kvt6eg literal 1568 zcmZ9L*-leY6o$7QR2;y{FMIbl??m+Q^TT)A6qSVw=6YqQ-eF>k+I3y;1 z-|1PVaVM*5{{OYt*)5l5kEC=cr8Jz@`1RCMsfd(w-|R>_`p9#UlivP*yW8ApwGZ0lE9o%xeJ^2GbDvOZb>4QmXlocQ zW$h1{@hYBtonF@bxYupIdcON~YwP8+g*;cuXO7u6=yks1$PGl_IrTmIVom2>-oguyftG?XhGv>=zfe%VaL9Vy9fO`m6K>WjOn{8=kDLXlFnkgGjT?#Jcn)&Igi#J zBX$98?-W`rYnKabzpXKSv9-n54{Y(n@4snl%K2V=C)#3OMB?ssYSZCJbT3mPX8ay;aib&4(*ZC+&ppVr#i2o^b;+Y%#4t|fod4%n^^1F%|9O5h^b;O*Q t=3X$n|Fg%4c~8Vvu#Nflwu}3(Vq0r2{;#X--ghszw(s7$KXfi3e*xuCT%`a2 diff --git a/lib/sdl3/content/hello-triangle.vert.hlsl b/lib/sdl3/content/hello-triangle.vert.hlsl index 66931b6..78e2585 100644 --- a/lib/sdl3/content/hello-triangle.vert.hlsl +++ b/lib/sdl3/content/hello-triangle.vert.hlsl @@ -9,12 +9,27 @@ struct Output float4 Position : SV_Position; }; +struct Scene2 +{ + float4 color; + float4 lmfao; +}; + struct Scene { float4 color; }; +cbuffer TransformBuffer : register(b0, space1) +{ + float4x4 modelMatrix; + float4x4 viewMatrix; + float4x4 projectionMatrix; + float time; +}; + StructuredBuffer test: register(t0, space0); +StructuredBuffer test2: register(t1, space0); Output main(Input input) { @@ -30,7 +45,7 @@ Output main(Input input) if (input.VertexIndex == 1) { pos = float2(1.0f, -1.0f); - output.Color = test[1].color; + output.Color = test2[1].color; } else { @@ -41,6 +56,6 @@ Output main(Input input) } } } - output.Position = float4(pos, 0.0f, 1.0f); + output.Position = mul(modelMatrix, float4(pos, 0.0f, 1.0f)); return output; } diff --git a/lib/sdl3/content/hello-triangle.vert.json b/lib/sdl3/content/hello-triangle.vert.json index ac9907b..6d5fadb 100644 --- a/lib/sdl3/content/hello-triangle.vert.json +++ b/lib/sdl3/content/hello-triangle.vert.json @@ -6,7 +6,38 @@ } ], "types" : { - "_6" : { + "_5" : { + "name" : "type.TransformBuffer", + "members" : [ + { + "name" : "modelMatrix", + "type" : "mat4", + "offset" : 0, + "matrix_stride" : 16, + "row_major" : true + }, + { + "name" : "viewMatrix", + "type" : "mat4", + "offset" : 64, + "matrix_stride" : 16, + "row_major" : true + }, + { + "name" : "projectionMatrix", + "type" : "mat4", + "offset" : 128, + "matrix_stride" : 16, + "row_major" : true + }, + { + "name" : "time", + "type" : "float", + "offset" : 192 + } + ] + }, + "_8" : { "name" : "Scene", "members" : [ { @@ -16,12 +47,12 @@ } ] }, - "_5" : { + "_7" : { "name" : "type.StructuredBuffer.Scene", "members" : [ { "name" : "_m0", - "type" : "_6", + "type" : "_8", "array" : [ 0 ], @@ -32,6 +63,38 @@ "array_stride" : 16 } ] + }, + "_11" : { + "name" : "Scene2", + "members" : [ + { + "name" : "color", + "type" : "vec4", + "offset" : 0 + }, + { + "name" : "lmfao", + "type" : "vec4", + "offset" : 16 + } + ] + }, + "_10" : { + "name" : "type.StructuredBuffer.Scene2", + "members" : [ + { + "name" : "_m0", + "type" : "_11", + "array" : [ + 0 + ], + "array_size_is_literal" : [ + true + ], + "offset" : 0, + "array_stride" : 32 + } + ] } }, "outputs" : [ @@ -43,12 +106,29 @@ ], "ssbos" : [ { - "type" : "_5", + "type" : "_7", "name" : "test", "readonly" : true, "block_size" : 0, "set" : 0, "binding" : 0 + }, + { + "type" : "_10", + "name" : "test2", + "readonly" : true, + "block_size" : 0, + "set" : 0, + "binding" : 1 + } + ], + "ubos" : [ + { + "type" : "_5", + "name" : "type.TransformBuffer", + "block_size" : 196, + "set" : 1, + "binding" : 0 } ] } \ No newline at end of file diff --git a/lib/sdl3/shaderTypes/shaderTypes.zig b/lib/sdl3/shaderTypes/shaderTypes.zig index dc0eff2..cc132ff 100644 --- a/lib/sdl3/shaderTypes/shaderTypes.zig +++ b/lib/sdl3/shaderTypes/shaderTypes.zig @@ -92,3 +92,17 @@ pub const FieldDetail = struct { size: usize, offset: usize, }; + +pub const ShaderLoadArgs = struct { + num_samplers: u32, // The number of samplers defined in the shader. + num_storage_textures: u32, // The number of storage textures defined in the shader. + num_storage_buffers: u32, // The number of storage buffers defined in the shader. + num_uniform_buffers: u32, // The number of uniform buffers defined in the shader. +}; + +pub const BufferInfo = union(enum(usize)) { + sampler: usize, // sampler + texture: usize, // storage texture + storage: usize, // storate buffer object + uniform: usize, // uniform/push constant +}; diff --git a/lib/sdl3/spvreflect/reflected.zig b/lib/sdl3/spvreflect/reflected.zig index f7588ae..976654f 100644 --- a/lib/sdl3/spvreflect/reflected.zig +++ b/lib/sdl3/spvreflect/reflected.zig @@ -10,6 +10,32 @@ pub const vec4 = shaderTypes.vec4; pub const mat4 = shaderTypes.mat4; pub const float = shaderTypes.float; +pub const BufferInfo = shaderTypes.BufferInfo; pub const Scene = struct { color: vec4, + + pub const Buffer: BufferInfo = .{ .storage = 0 }; +}; + +pub const Scene2 = struct { + color: vec4, + lmfao: vec4, + + pub const Buffer: BufferInfo = .{ .storage = 1 }; +}; + +pub const TransformBuffer = struct { + modelMatrix: mat4, + viewMatrix: mat4, + projectionMatrix: mat4, + time: float, + + pub const Buffer: BufferInfo = .{ .uniform = 0 }; +}; + +pub const LoadArgs = shaderTypes.ShaderLoadArgs{ + .num_samplers = 0, // The number of samplers defined in the shader. + .num_storage_textures = 0, // The number of storage textures defined in the shader. + .num_storage_buffers = 2, // The number of storage buffers defined in the shader. + .num_uniform_buffers = 0, // The number of uniform buffers defined in the shader. }; diff --git a/lib/sdl3/spvreflect/spvreflect.py b/lib/sdl3/spvreflect/spvreflect.py index e0909f6..9330e27 100644 --- a/lib/sdl3/spvreflect/spvreflect.py +++ b/lib/sdl3/spvreflect/spvreflect.py @@ -27,7 +27,7 @@ def generate(): with open(infile) as f: reflect = json.load(f) - print(reflect) + print(json.dumps(reflect, indent=2)) ostring = "pub const shaderTypes = @import(\"shaderTypes\");\n" @@ -42,35 +42,72 @@ pub const vec4 = shaderTypes.vec4; pub const mat4 = shaderTypes.mat4; pub const float = shaderTypes.float; +pub const BufferInfo = shaderTypes.BufferInfo; """ types = reflect['types'] - for t in types: - name = types[t]['name']; - if 'type.StructuredBuffer' in name: - continue + storageIndex = 0 + for ssbo in reflect['ssbos']: + zs = parseTypeToZig(types, ssbo['type'], "storage", storageIndex) + storageIndex += 1 + ostring += zs + "\n" - if name.startswith("type.StructuredBuffer"): - name = name[len("type.StructuredBuffer"):] + uniformIndex = 0 + for uniform in reflect['ubos']: + zs = parseTypeToZig(types, uniform['type'], "uniform", uniformIndex) + ostring += zs + "\n" - zs = f"pub const {name} = " + 'struct {\n' + zs = "pub const LoadArgs = shaderTypes.ShaderLoadArgs{" - for member in types[t]['members']: - zs += member['name'] + ':' + member['type'] + ',\n' + samplerIndex = 0 + textureIndex = 0 - zs += "};\n" + zs += f""" + .num_samplers = {samplerIndex}, // The number of samplers defined in the shader. + .num_storage_textures = {textureIndex}, // The number of storage textures defined in the shader. + .num_storage_buffers = {storageIndex}, // The number of storage buffers defined in the shader. + .num_uniform_buffers = {uniformIndex}, // The number of uniform buffers defined in the shader. + """ + zs += "};" - print(zs) + ostring += zs - ostring += zs - - - with open(outfile, 'w') as f: + with open(outfile, 'w', newline='\n') as f: f.write(ostring) + subprocess.run(['zig', 'fmt', outfile]) +def parseTypeToZig(types, typeId, bufferType, bufferIndex): + + displayName = types[typeId]['name'] + + isStructured = False + + typeInner = types[typeId] + arrayStride = None + + if "type.StructuredBuffer." in displayName: + displayName = displayName[len("type.StructuredBuffer."):] + isStructured = True + arrayStride = typeInner['members'][0]['array_stride'] + typeInner = types[typeInner['members'][0]['type']] + + if "type." in displayName: + displayName = displayName[len("type."):] + + zs = "pub const " + displayName + " = struct {" + + for t in typeInner['members']: + zs += t['name'] + ':' + t['type'] + ',' + + zs += '\n\npub const Buffer: BufferInfo = .{ .' + bufferType + ' = ' + str(bufferIndex) + ' };' + + zs += "};\n" + + return zs + if __name__ == '__main__': generate()