diff --git a/assets/shaders/gradient.comp.spv b/assets/shaders/gradient.comp.spv index 4763e9c..1bae4a0 100644 Binary files a/assets/shaders/gradient.comp.spv and b/assets/shaders/gradient.comp.spv differ diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv index 22086e9..a354898 100644 Binary files a/assets/shaders/pbr.frag.spv and b/assets/shaders/pbr.frag.spv differ diff --git a/assets/shaders/pbr.vert.spv b/assets/shaders/pbr.vert.spv index d66f785..24c8ef2 100644 Binary files a/assets/shaders/pbr.vert.spv and b/assets/shaders/pbr.vert.spv differ diff --git a/dub.json b/dub.json index ad9be9c..8d71202 100644 --- a/dub.json +++ b/dub.json @@ -13,6 +13,7 @@ "sourcePaths": ["src/gears", "src/dlib", "src/dlib/external/xxhash", "src/VulkanRenderer"], "libs-linux": ["xcb", "X11", "X11-xcb", "vulkan", "stdc++", "xcb-xfixes", "freetype"], "libs-windows": [], + "versions": ["VULKAN_DEBUG"], "preGenerateCommands-linux": ["./build.sh"], "preGenerateCommands-windows": [], "dflags": ["-Xcc=-mno-sse", "-P-I/usr/include/freetype2", "-vgc", "-Jbuild", "-Jassets/fonts"], @@ -25,7 +26,7 @@ "targetName": "Packer", "importPaths": ["src/packer", "src/shared", "external/xxhash", "external/inteli"], "sourcePaths": ["src/packer", "src/shared", "external/xxhash", "external/inteli"], - "sourceFiles-linux": ["build/libstb.a", "build/libm3d.a", "build/libcglm.a"], + "sourceFiles-linux": ["build/libstb.a", "build/libm3d.a", "build/libcglm.a", "build/libspirv_reflect.a"], "preGenerateCommands-linux": ["./build.sh"], "postGenerateCommands-linux": [], "preGenerateCommands-windows": [], diff --git a/src/VulkanRenderer b/src/VulkanRenderer index 6021713..53c500c 160000 --- a/src/VulkanRenderer +++ b/src/VulkanRenderer @@ -1 +1 @@ -Subproject commit 6021713286482893ca0614c894419290c6f425d4 +Subproject commit 53c500c302e87799b01bb99356780c9c51b41170 diff --git a/src/game2.d b/src/game2.d deleted file mode 100644 index 8dafa55..0000000 --- a/src/game2.d +++ /dev/null @@ -1,60 +0,0 @@ -import dlib; -import vulkan; - -struct GameState -{ - RenderState rds; -} - -struct RenderState -{ - Renderer rd; - struct - { - Pipeline pbr; - } pipelines; - struct - { - DescSetLayout globals; - DescSetLayout resources; - } desc_layouts; - struct - { - DescSet pbr; - } desc_sets; - struct - { - PipelineLayout pbr; - } layouts; -} - -GameState -InitGame(PlatformWindow* window) -{ - GameState g; - Init(&g.rds); - -} - -void -Init(RendererState* rds, PlatformWindow* window) -{ - version(linux) - { - PlatformHandles handles = { - conn: window.conn, - window: window.window, - }; - } - - rds.rd = InitRenderer(handles, MB(24), MB(32)); - - DescLayoutBinding[5] bindings = [ - { binding: 0, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All }, - { binding: 1, descriptorType: DT.Storage, descriptorCount: 1, stageFlags: SS.All }, - { binding: 2, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All }, - ]; - - rds.desc_layouts.pbr = - -} diff --git a/src/gears/game2.d b/src/gears/game2.d new file mode 100644 index 0000000..d5ad175 --- /dev/null +++ b/src/gears/game2.d @@ -0,0 +1,127 @@ +import dlib; +import vulkan; + +const u32 IMG_MAX = 100; +const u32 BUF_MAX = 25; +const u32 UNI_MAX = 50; + +struct GameState +{ + RenderState rds; +} + +struct RenderState +{ + Renderer rd; + Arena[2] frame_arenas; + 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; +} + +struct PushConst +{ + union + { + struct + { + u32 t0; + u32 t1; + u32 t2; + u32 t3; + u32 m0; + u32 s0; + }; + struct + { + u32 albedo; + u32 ambient; + u32 specular; + u32 alpha; + u32 material; + u32 state; + }; + } +} + +struct Vertex +{ + Vec4 col; + Vec4 tangent; + Vec3 pos; + Vec3 normal; + Vec2 uv; +} + +GameState +InitGame(PlatformWindow* window) +{ + GameState g; + Init(&g.rds, window); + + return g; +} + +void +Init(RenderState* rds, PlatformWindow* window) +{ + version(linux) + { + PlatformHandles handles = { + conn: window.conn, + window: window.window, + }; + } + + DescLayoutBinding[5] global_bindings = [ + { binding: 0, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All }, + { binding: 1, descriptorType: DT.StorageTexelBuf, descriptorCount: 1, stageFlags: SS.All }, + { binding: 2, descriptorType: DT.StorageImage, descriptorCount: 1, stageFlags: SS.All }, + ]; + + DescLayoutBinding[3] resource_bindings = [ + { binding: 0, descriptorType: DT.Image, descriptorCount: IMG_MAX, stageFlags: SS.All }, + { binding: 1, descriptorType: DT.Uniform, descriptorCount: BUF_MAX, stageFlags: SS.All }, + { binding: 2, descriptorType: DT.Uniform, descriptorCount: UNI_MAX, stageFlags: SS.All }, + ]; + + Attribute[5] attributes = [ + { binding: 0, location: 0, format: FMT.RGBA_F32, offset: Vertex.col.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: 3, format: FMT.RGB_F32, offset: Vertex.normal.offsetof }, + { binding: 0, location: 4, format: FMT.RG_F32, offset: Vertex.uv.offsetof }, + ]; + + rds.rd = InitRenderer(handles, MB(24), MB(32)); + rds.frame_arenas = [ + CreateArena(MB(4)), + CreateArena(MB(4)), + ]; + + rds.desc_layout_globals = CreateDescSetLayout(&rds.rd, global_bindings); + rds.desc_layout_resources = CreateDescSetLayout(&rds.rd, resource_bindings); + + rds.pipeline_layout_pbr = CreatePipelineLayout(&rds.rd, [rds.desc_layout_globals, rds.desc_layout_resources], PushConst.sizeof); + + foreach(i; 0 .. 2) + { + rds.desc_set_globals[i] = AllocDescSet(&rds.rd, rds.desc_layout_globals); + rds.desc_set_resources[i] = AllocDescSet(&rds.rd, rds.desc_layout_resources); + } + + 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"), + input_rate: IR.Vertex, + input_rate_stride: Vertex.sizeof, + layout: rds.pipeline_layout_pbr, + vertex_attributes: attributes, + }; + + bool result = CreateGraphicsPipeline(&rds.rd, &rds.pipeline_pbr, &pbr_info); + assert(result); +} diff --git a/src/gears/main.d b/src/gears/main.d index 0707b7c..0e3b733 100644 --- a/src/gears/main.d +++ b/src/gears/main.d @@ -1,7 +1,7 @@ import dlib; import std.stdio; import core.memory; -import game; +import game2; import core.simd; import core.stdc.string : memcpy; @@ -9,19 +9,6 @@ void main(string[] argv) { PlatformWindow window = CreateWindow("Video Game", 1920, 1080); - Game g = InitGame(&window); - - while (true) - { - g.inputs = GetInputs(&window); - if (window.close) - { - break; - } - - Cycle(&g); - } - - Destroy(&g); + GameState g = InitGame(&window); } diff --git a/src/shaders/structures.layout b/src/shaders/structures.layout index ee4045d..02a1100 100644 --- a/src/shaders/structures.layout +++ b/src/shaders/structures.layout @@ -19,7 +19,9 @@ layout (rgba16f, set = 0, binding = 0) uniform image2D DrawImage; layout (set = 0, binding = 1) uniform sampler SamplerNearest; -layout (set = 0, binding = 0) uniform Globals { +// SET 1 + +layout (set = 1, binding = 0) uniform Globals { mat4 view; mat4 projection; vec4 light_color; @@ -28,15 +30,15 @@ layout (set = 0, binding = 0) uniform Globals { vec2 res; } G; -layout (set = 0, binding = 1, rg32ui) uniform coherent uimageBuffer ImageABuffer; +layout (set = 1, binding = 1, rg32ui) uniform coherent uimageBuffer ImageABuffer; -layout (set = 0, binding = 2, r32ui) uniform coherent uimage2D ImageAux; +layout (set = 2, binding = 2, r32ui) uniform coherent uimage2D ImageAux; // SET 2 -layout (set = 2, binding = 0) uniform texture2D Textures[IMG_MAX]; +layout (set = 1, binding = 0) uniform texture2D Textures[IMG_MAX]; -layout (set = 2, binding = 1) uniform Material { +layout (set = 1, binding = 1) uniform Material { vec4 ambient; vec4 diffuse; vec4 specular; @@ -48,7 +50,7 @@ layout (set = 2, binding = 1) uniform Material { float alpha; } Materials[BUF_MAX]; -layout (set = 2, binding = 2) uniform ModelState { +layout (set = 1, binding = 2) uniform ModelState { mat4 model_matrix; } State[UNI_MAX];