update dependencies, fix up vulkan initialization, start model loading to gpu

This commit is contained in:
matthew 2025-11-21 18:45:12 +11:00
parent 25899ff448
commit bd4e1cc07e
12 changed files with 2612 additions and 2659 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -7,7 +7,7 @@
"targetType": "executable", "targetType": "executable",
"targetName": "Gears", "targetName": "Gears",
"targetPath": "build", "targetPath": "build",
"sourceFiles-linux": ["build/libvma.a", "build/libstb.a", "build/libm3d.a", "build/libcglm.a"], "sourceFiles-linux": ["build/libvma.a", "build/libstb.a", "build/libm3d.a", "build/libcglm.a", "build/libcgltf.a"],
"sourceFiles-windows": [], "sourceFiles-windows": [],
"importPaths": ["src/gears", "src/dlib", "src/dlib/external/xxhash", "src/VulkanRenderer"], "importPaths": ["src/gears", "src/dlib", "src/dlib/external/xxhash", "src/VulkanRenderer"],
"sourcePaths": ["src/gears", "src/dlib", "src/dlib/external/xxhash", "src/VulkanRenderer"], "sourcePaths": ["src/gears", "src/dlib", "src/dlib/external/xxhash", "src/VulkanRenderer"],
@ -17,7 +17,7 @@
"preGenerateCommands-linux": ["./build.sh"], "preGenerateCommands-linux": ["./build.sh"],
"preGenerateCommands-windows": [], "preGenerateCommands-windows": [],
"dflags": ["-Xcc=-mno-sse", "-P-I/usr/include/freetype2", "-Jbuild", "-Jassets/fonts"], "dflags": ["-Xcc=-mno-sse", "-P-I/usr/include/freetype2", "-Jbuild", "-Jassets/fonts"],
"dflags-dmd": ["-P=-DSTBI_NO_SIMD"] "dflags-dmd": []
}, },
{ {
"name": "packer", "name": "packer",

@ -1 +1 @@
Subproject commit d46741a48033b5136fa189c1b80a574986e68f64 Subproject commit c42238a456f5048c7d1b2d5ebd71ecf13bb10ece

@ -1 +1 @@
Subproject commit c83ffabce69071a3e7a0af3f26aa420082eeda1f Subproject commit 493c17cba26952861ae4c5402f1676013b8317c6

View File

@ -1,4 +1,5 @@
import dlib; import dlib;
/*
public import vulkan : PlatformHandles; public import vulkan : PlatformHandles;
import vulkan : Destroy; import vulkan : Destroy;
import vulkan; import vulkan;
@ -414,6 +415,7 @@ DrawRect(Game* g, f32 p0_x, f32 p0_y, f32 p1_x, f32 p1_y, Vec4 col)
AddUIIndices(g); AddUIIndices(g);
} }
/*
// TODO: integrate this with vulkan again // TODO: integrate this with vulkan again
Model Model
LoadModel(Game* g, string name) LoadModel(Game* g, string name)
@ -697,3 +699,4 @@ ReadModel(Game* g, string name)
const(char)[] mat_name = m3d.material[i].name[0 .. strlen(m3d.material[i].name)]; const(char)[] mat_name = m3d.material[i].name[0 .. strlen(m3d.material[i].name)];
} }
} }
*/

View File

@ -10,8 +10,6 @@ ImageView[256] TEXTURES;
Buffer[256] MATERIALS; Buffer[256] MATERIALS;
Buffer[256] MODEL_STATES; Buffer[256] MODEL_STATES;
DescIndices[DESC_SET_MAX] DESC_INDICES];
struct GameState struct GameState
{ {
RenderState rds; RenderState rds;
@ -29,6 +27,7 @@ struct RenderState
Pipeline[PID.Max] pipelines; Pipeline[PID.Max] pipelines;
DescSetLayout desc_layout_globals; DescSetLayout desc_layout_globals;
DescSetLayout desc_layout_resources; DescSetLayout desc_layout_resources;
DescSetLayout desc_layout_state;
DescSet[2] desc_set_globals; DescSet[2] desc_set_globals;
PipelineLayout pipeline_layout_pbr; PipelineLayout pipeline_layout_pbr;
@ -41,13 +40,6 @@ struct RenderState
Buffer globals_buffer; Buffer globals_buffer;
} }
struct DescIndices
{
u32 tex;
u32 mat;
u32 state;
}
struct ShaderGlobals struct ShaderGlobals
{ {
Vec4 ambient; Vec4 ambient;
@ -57,41 +49,6 @@ struct ShaderGlobals
f32 alpha = 0.0; f32 alpha = 0.0;
} }
struct MeshPart
{
u32 mat;
u32 offset;
u32 length;
PushConst pc;
alias pc this;
}
struct ModelData
{
MeshPart[] parts;
ModelState state;
Vertex[] v;
u32[] idx;
TextureData[] tex;
}
struct TextureData
{
u8[] name;
u8[] data;
u32 width;
u32 height;
u32 ch;
}
struct Model
{
Buffer v_buf;
Buffer i_buf;
MeshPart[] parts;
}
struct ModelRenderInfo struct ModelRenderInfo
{ {
PushConst pc; PushConst pc;
@ -105,15 +62,6 @@ struct ModelState
Mat4 matrix; Mat4 matrix;
} }
struct Material
{
Vec4 ambient;
Vec4 diffuse;
Vec4 specular;
float shininess;
float alpha;
}
enum PBRMod : u32 enum PBRMod : u32
{ {
AlbedoValue = 0x0001, AlbedoValue = 0x0001,
@ -182,17 +130,14 @@ struct PushConst
} }
} }
struct Vertex
{
Vec4 col;
Vec4 tangent;
Vec3 pos;
Vec3 normal;
Vec2 uv;
}
ModelData g_box; ModelData g_box;
void
RunCycle(GameState* g)
{
}
GameState GameState
InitGame(PlatformWindow* window) InitGame(PlatformWindow* window)
{ {
@ -225,7 +170,7 @@ Init(RenderState* rds, PlatformWindow* window)
{ binding: 2, descriptorType: DT.StorageImage, descriptorCount: 1, stageFlags: SS.All }, { binding: 2, descriptorType: DT.StorageImage, descriptorCount: 1, stageFlags: SS.All },
]; ];
DescLayoutBinding[3] resource_bindings = [ DescLayoutBinding[6] resource_bindings = [
{ binding: 0, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All }, { binding: 0, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
{ binding: 1, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All }, { binding: 1, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
{ binding: 2, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All }, { binding: 2, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
@ -234,8 +179,12 @@ Init(RenderState* rds, PlatformWindow* window)
{ binding: 5, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All }, { binding: 5, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All },
]; ];
DescLayoutBinding[1] state_bindings = [
{ binding: 0, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All },
];
Attribute[5] attributes = [ Attribute[5] attributes = [
{ binding: 0, location: 0, format: FMT.RGBA_F32, offset: Vertex.col.offsetof }, { binding: 0, location: 0, format: FMT.RGBA_F32, offset: Vertex.color.offsetof },
{ binding: 0, location: 1, format: FMT.RGBA_F32, offset: Vertex.tangent.offsetof }, { binding: 0, location: 1, format: FMT.RGBA_F32, offset: Vertex.tangent.offsetof },
{ binding: 0, location: 2, format: FMT.RGB_F32, offset: Vertex.pos.offsetof }, { binding: 0, location: 2, format: FMT.RGB_F32, offset: Vertex.pos.offsetof },
{ binding: 0, location: 3, format: FMT.RGB_F32, offset: Vertex.normal.offsetof }, { binding: 0, location: 3, format: FMT.RGB_F32, offset: Vertex.normal.offsetof },
@ -251,8 +200,9 @@ Init(RenderState* rds, PlatformWindow* window)
rds.desc_layout_globals = CreateDescSetLayout(&rds.rd, global_bindings); rds.desc_layout_globals = CreateDescSetLayout(&rds.rd, global_bindings);
rds.desc_layout_resources = CreateDescSetLayout(&rds.rd, resource_bindings); rds.desc_layout_resources = CreateDescSetLayout(&rds.rd, resource_bindings);
rds.desc_layout_state = CreateDescSetLayout(&rds.rd, state_bindings);
rds.pipeline_layout_pbr = CreatePipelineLayout(&rds.rd, [rds.desc_layout_globals, rds.desc_layout_resources], PushConst.sizeof); rds.pipeline_layout_pbr = CreatePipelineLayout(&rds.rd, [rds.desc_layout_globals, rds.desc_layout_resources, rds.desc_layout_state], PushConst.sizeof);
foreach(i; 0 .. 2) foreach(i; 0 .. 2)
{ {
@ -273,8 +223,8 @@ Init(RenderState* rds, PlatformWindow* window)
}; };
GfxPipelineInfo pbr_info = { GfxPipelineInfo pbr_info = {
vertex_shader: LoadAssetData(&rds.frame_arenas[0], "shaders/pbr.vert.spv"), vertex_shader: LoadFile(&rds.frame_arenas[0], "assets/shaders/pbr.vert.spv"),
frag_shader: LoadAssetData(&rds.frame_arenas[0], "shaders/pbr.frag.spv"), frag_shader: LoadFile(&rds.frame_arenas[0], "assets/shaders/pbr.frag.spv"),
input_rate: IR.Vertex, input_rate: IR.Vertex,
input_rate_stride: Vertex.sizeof, input_rate_stride: Vertex.sizeof,
layout: rds.pipeline_layout_pbr, layout: rds.pipeline_layout_pbr,
@ -315,7 +265,7 @@ Init(RenderState* rds, PlatformWindow* window)
CreateBuffer(&rds.rd, &rds.globals_buffer, BT.Uniform, ShaderGlobals.sizeof, false); CreateBuffer(&rds.rd, &rds.globals_buffer, BT.Uniform, ShaderGlobals.sizeof, false);
g_box = MakeBox ModelData md = LoadGLTF(&rds.frame_arenas[0], "assets/models/DamagedHelmet.glb");
} }
PipelineID PipelineID
@ -381,6 +331,7 @@ GetPBRMod(bool albedo = false, bool ambient = false, bool specular = false, bool
} }
} }
/*
ModelData ModelData
MakeBox(RenderState* rds, f32 width, f32 height, Vec4 col) MakeBox(RenderState* rds, f32 width, f32 height, Vec4 col)
{ {
@ -428,9 +379,9 @@ Model
Upload(RenderState* rds, ModelData* data) Upload(RenderState* rds, ModelData* data)
{ {
Model model; Model model;
u32[] tex_idx = Alloc!(&rds.frame_arenas[0], data.text.length); u32[] tex_idx = Alloc!(u32)(&rds.frame_arenas[0], data.text.length);
u32[] mat_idx = Alloc!(&rds.frame_arenas[0], data.materials.length); u32[] mat_idx = Alloc!(u32)(&rds.frame_arenas[0], data.materials.length);
u32[] state_idx = Alloc!(&rds.frame_arenas[0], data.model_states.length); u32[] state_idx = Alloc!(u32)(&rds.frame_arenas[0], data.model_states.length);
bool result = true; bool result = true;
@ -450,20 +401,18 @@ Upload(RenderState* rds, ModelData* data)
{ {
Buffer* buf = &rds.materials[rds.imat++]; Buffer* buf = &rds.materials[rds.imat++];
CreateBuffer(&rds.rd, buf, BT.Uniform, Material.sizeof); CreateBuffer(&rds.rd, buf, BT.Uniform, Material.sizeof);
result = Transfer(&rds.rd, buf, ) //result = Transfer(&rds.rd, buf, )
} }
for(u64 i = 0; i < data.model_states.length; i += 1) for(u64 i = 0; i < data.model_states.length; i += 1)
{ {
Buffer* buf = &rds.model_states[rds.istate++]; Buffer* buf = &rds.model_states[rds.istate++];
CreateBuffer(&rds) //CreateBuffer(&rds)
} }
model.parts = data.parts; model.parts = data.parts;
} }
*/
DescIndices*
GetDescIndices()
unittest unittest
{ {

View File

@ -44,7 +44,8 @@ layout (set = 2, binding = 4) uniform MaterialData {
float shininess; float shininess;
float alpha; float alpha;
} Material; } Material;
layout (set = 2, binding = 5) uniform ModelState {
layout (set = 3, binding = 0) uniform ModelState {
mat4 model_matrix; mat4 model_matrix;
} State; } State;