Start implementing the graphics pipeline
This commit is contained in:
parent
5bc8af66ef
commit
34ca91f6f7
4 changed files with 83 additions and 0 deletions
10
build.zig
10
build.zig
|
@ -1,5 +1,6 @@
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const sdl = @import("sdl");
|
const sdl = @import("sdl");
|
||||||
|
const vkgen = @import("vulkan_zig");
|
||||||
|
|
||||||
// Although this function looks imperative, note that its job is to
|
// Although this function looks imperative, note that its job is to
|
||||||
// declaratively construct a build graph that will be executed by an external
|
// declaratively construct a build graph that will be executed by an external
|
||||||
|
@ -29,6 +30,15 @@ pub fn build(b: *std.Build) void {
|
||||||
const vkzig_bindings = vkzig_dep.module("vulkan-zig");
|
const vkzig_bindings = vkzig_dep.module("vulkan-zig");
|
||||||
exe.root_module.addImport("vulkan", vkzig_bindings);
|
exe.root_module.addImport("vulkan", vkzig_bindings);
|
||||||
|
|
||||||
|
const shader_comp = vkgen.ShaderCompileStep.create(
|
||||||
|
b,
|
||||||
|
&[_][]const u8{ "glslc", "--target-env=vulkan1.3" },
|
||||||
|
"-o",
|
||||||
|
);
|
||||||
|
shader_comp.add("shader_frag", "src/shaders/shader.frag", .{});
|
||||||
|
shader_comp.add("shader_vert", "src/shaders/shader.vert", .{});
|
||||||
|
exe.root_module.addImport("shaders", shader_comp.getModule());
|
||||||
|
|
||||||
const sdl_sdk = sdl.init(b, null);
|
const sdl_sdk = sdl.init(b, null);
|
||||||
sdl_sdk.link(exe, .dynamic);
|
sdl_sdk.link(exe, .dynamic);
|
||||||
|
|
||||||
|
|
11
src/shaders/shader.frag
Normal file
11
src/shaders/shader.frag
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
// Interpolated colour from vertex (location must match)
|
||||||
|
layout(location = 0) in vec3 fragColour;
|
||||||
|
|
||||||
|
// Final output output (must also have location)
|
||||||
|
layout(location = 0) out vec4 outColour;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
outColour = vec4(fragColour, 1.0);
|
||||||
|
}
|
23
src/shaders/shader.vert
Normal file
23
src/shaders/shader.vert
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
// Output colour for vertex (location is required)
|
||||||
|
layout(location = 0) out vec3 fragColour;
|
||||||
|
|
||||||
|
// Triangle vertex positions
|
||||||
|
vec3 positions[3] = vec3[](
|
||||||
|
vec3(0.0, -0.4, 0.0),
|
||||||
|
vec3(0.4, 0.4, 0.0),
|
||||||
|
vec3(-0.4, 0.4, 0.0)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Triangle vertex colours
|
||||||
|
vec3 colours[3] = vec3[](
|
||||||
|
vec3(1.0, 0.0, 0.0),
|
||||||
|
vec3(0.0, 1.0, 0.0),
|
||||||
|
vec3(0.0, 0.0, 1.0)
|
||||||
|
);
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = vec4(positions[gl_VertexIndex], 1.0);
|
||||||
|
fragColour = colours[gl_VertexIndex];
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ const std = @import("std");
|
||||||
const sdl = @import("sdl2");
|
const sdl = @import("sdl2");
|
||||||
const vk = @import("vulkan");
|
const vk = @import("vulkan");
|
||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
|
const shaders = @import("shaders");
|
||||||
|
|
||||||
const Utilities = @import("utilities.zig");
|
const Utilities = @import("utilities.zig");
|
||||||
const QueueFamilyIndices = Utilities.QueueFamilyIndices;
|
const QueueFamilyIndices = Utilities.QueueFamilyIndices;
|
||||||
|
@ -71,6 +72,7 @@ pub const VulkanRenderer = struct {
|
||||||
try self.getPhysicalDevice();
|
try self.getPhysicalDevice();
|
||||||
try self.createLogicalDevice();
|
try self.createLogicalDevice();
|
||||||
try self.createSwapchain();
|
try self.createSwapchain();
|
||||||
|
try self.createGraphicsPipeline();
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -248,6 +250,43 @@ pub const VulkanRenderer = struct {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn createGraphicsPipeline(self: *Self) !void {
|
||||||
|
// Create shader modules
|
||||||
|
const vert = try self.device.createShaderModule(&.{
|
||||||
|
.code_size = shaders.shader_vert.len,
|
||||||
|
.p_code = @ptrCast(&shaders.shader_vert),
|
||||||
|
}, null);
|
||||||
|
defer self.device.destroyShaderModule(vert, null);
|
||||||
|
|
||||||
|
const frag = try self.device.createShaderModule(&.{
|
||||||
|
.code_size = shaders.shader_frag.len,
|
||||||
|
.p_code = @ptrCast(&shaders.shader_frag),
|
||||||
|
}, null);
|
||||||
|
defer self.device.destroyShaderModule(frag, null);
|
||||||
|
|
||||||
|
// -- Shader stage creation information
|
||||||
|
|
||||||
|
// Vertex stage creation information
|
||||||
|
const vertex_shader_create_info: vk.PipelineShaderStageCreateInfo = .{
|
||||||
|
.stage = .{ .vertex_bit = true },
|
||||||
|
.module = vert,
|
||||||
|
.p_name = "main",
|
||||||
|
};
|
||||||
|
|
||||||
|
// Fragment stage creation information
|
||||||
|
const fragment_shader_create_info: vk.PipelineShaderStageCreateInfo = .{
|
||||||
|
.stage = .{ .fragment_bit = true },
|
||||||
|
.module = frag,
|
||||||
|
.p_name = "main",
|
||||||
|
};
|
||||||
|
|
||||||
|
const shader_create_infos = [_]vk.PipelineShaderStageCreateInfo{
|
||||||
|
vertex_shader_create_info,
|
||||||
|
fragment_shader_create_info,
|
||||||
|
};
|
||||||
|
_ = shader_create_infos;
|
||||||
|
}
|
||||||
|
|
||||||
fn getPhysicalDevice(self: *Self) !void {
|
fn getPhysicalDevice(self: *Self) !void {
|
||||||
var pdev_count: u32 = 0;
|
var pdev_count: u32 = 0;
|
||||||
_ = try self.instance.enumeratePhysicalDevices(&pdev_count, null);
|
_ = try self.instance.enumeratePhysicalDevices(&pdev_count, null);
|
||||||
|
|
Loading…
Reference in a new issue