diff --git a/assets/shaders/gradient.comp.spv b/assets/shaders/gradient.comp.spv index 093c46c..1c69531 100644 Binary files a/assets/shaders/gradient.comp.spv and b/assets/shaders/gradient.comp.spv differ diff --git a/assets/shaders/gui.frag.spv b/assets/shaders/gui.frag.spv index 01ddf0d..1bc133c 100644 Binary files a/assets/shaders/gui.frag.spv and b/assets/shaders/gui.frag.spv differ diff --git a/assets/shaders/gui.vert.spv b/assets/shaders/gui.vert.spv index bd0b856..16a4611 100644 Binary files a/assets/shaders/gui.vert.spv and b/assets/shaders/gui.vert.spv differ diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv index 24f0715..72eaac1 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 555c343..93f724d 100644 Binary files a/assets/shaders/pbr.vert.spv and b/assets/shaders/pbr.vert.spv differ diff --git a/assets/shaders/triangle.frag.spv b/assets/shaders/triangle.frag.spv index 8d87e42..de36fcf 100644 Binary files a/assets/shaders/triangle.frag.spv and b/assets/shaders/triangle.frag.spv differ diff --git a/assets/shaders/triangle.vert.spv b/assets/shaders/triangle.vert.spv index 5aea80f..1a44ef9 100644 Binary files a/assets/shaders/triangle.vert.spv and b/assets/shaders/triangle.vert.spv differ diff --git a/src/gears/main.d b/src/gears/main.d index 0c59ddd..b8ddc6a 100644 --- a/src/gears/main.d +++ b/src/gears/main.d @@ -14,6 +14,25 @@ void main() r.Renderer rd = r.Init(&window); scope(exit) r.Destroy(&rd); + u64 os_freq = OSTimeFreq(); + u64 cpu_start = RDTSC(); + u64 os_start = OSTime(); + u64 os_end = 0; + u64 os_elapsed = 0; + + while (os_elapsed < os_freq) + { + os_end = OSTime(); + os_elapsed = os_end - os_start; + } + + u64 cpu_end = RDTSC(); + u64 cpu_elapsed = cpu_end - cpu_start; + + writefln(" OS Timer: %s -> %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; +}