create swapchain, fetch images, image views
This commit is contained in:
121
src/main.zig
121
src/main.zig
@@ -246,12 +246,12 @@ fn create_device(
|
|||||||
|
|
||||||
fn find_surface_format(
|
fn find_surface_format(
|
||||||
pdev: vk.PhysicalDevice,
|
pdev: vk.PhysicalDevice,
|
||||||
|
vki: gfx.InstanceDispatch,
|
||||||
surface: vk.SurfaceKHR,
|
surface: vk.SurfaceKHR,
|
||||||
preferred: vk.SurfaceFormatKHR,
|
preferred: vk.SurfaceFormatKHR,
|
||||||
vki: gfx.InstanceDispatch,
|
|
||||||
) !vk.SurfaceFormatKHR {
|
) !vk.SurfaceFormatKHR {
|
||||||
var formats_buf: [64]vk.SurfaceFormatKHR = undefined;
|
var formats_buf: [64]vk.SurfaceFormatKHR = undefined;
|
||||||
var formats_count: u32 = 64;
|
var formats_count: u32 = @intCast(formats_buf.len);
|
||||||
_ = try vki.getPhysicalDeviceSurfaceFormatsKHR(pdev, surface, &formats_count, &formats_buf);
|
_ = try vki.getPhysicalDeviceSurfaceFormatsKHR(pdev, surface, &formats_count, &formats_buf);
|
||||||
const formats = formats_buf[0..formats_count];
|
const formats = formats_buf[0..formats_count];
|
||||||
|
|
||||||
@@ -264,6 +264,57 @@ fn find_surface_format(
|
|||||||
return formats[0];
|
return formats[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn find_present_mode(
|
||||||
|
pdev: vk.PhysicalDevice,
|
||||||
|
vki: gfx.InstanceDispatch,
|
||||||
|
surface: vk.SurfaceKHR,
|
||||||
|
preferred: vk.PresentModeKHR,
|
||||||
|
) !vk.PresentModeKHR {
|
||||||
|
var modes_buf: [8]vk.PresentModeKHR = undefined;
|
||||||
|
var modes_count: u32 = @intCast(modes_buf.len);
|
||||||
|
_ = try vki.getPhysicalDeviceSurfacePresentModesKHR(pdev, surface, &modes_count, &modes_buf);
|
||||||
|
const modes = modes_buf[0..modes_count];
|
||||||
|
|
||||||
|
for (modes) |mode| {
|
||||||
|
if (std.meta.eql(mode, preferred)) {
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return .mailbox_khr;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_swap_extent(
|
||||||
|
pdev: vk.PhysicalDevice,
|
||||||
|
vki: gfx.InstanceDispatch,
|
||||||
|
surface: vk.SurfaceKHR,
|
||||||
|
window: *c.GLFWwindow,
|
||||||
|
) !vk.Extent2D {
|
||||||
|
const caps = try vki.getPhysicalDeviceSurfaceCapabilitiesKHR(pdev, surface);
|
||||||
|
var extent = caps.current_extent;
|
||||||
|
|
||||||
|
if (extent.width == std.math.maxInt(u32)) {
|
||||||
|
c.glfwGetFramebufferSize(window, @ptrCast(&extent.width), @ptrCast(&extent.height));
|
||||||
|
extent.width = std.math.clamp(extent.width, caps.min_image_extent.width, caps.max_image_extent.width);
|
||||||
|
extent.height = std.math.clamp(extent.height, caps.min_image_extent.height, caps.max_image_extent.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
return extent;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_swap_image_count(
|
||||||
|
pdev: vk.PhysicalDevice,
|
||||||
|
vki: gfx.InstanceDispatch,
|
||||||
|
surface: vk.SurfaceKHR,
|
||||||
|
) !u32 {
|
||||||
|
const caps = try vki.getPhysicalDeviceSurfaceCapabilitiesKHR(pdev, surface);
|
||||||
|
var count = caps.min_image_count + 1;
|
||||||
|
if (caps.max_image_count > 0) {
|
||||||
|
count = @min(count, caps.max_image_count);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main() !void {
|
pub fn main() !void {
|
||||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||||
defer _ = gpa.deinit();
|
defer _ = gpa.deinit();
|
||||||
@@ -302,22 +353,60 @@ pub fn main() !void {
|
|||||||
.format = .b8g8r8a8_srgb,
|
.format = .b8g8r8a8_srgb,
|
||||||
.color_space = .srgb_nonlinear_khr,
|
.color_space = .srgb_nonlinear_khr,
|
||||||
};
|
};
|
||||||
const format = try find_surface_format(pdev, surface, preferred_format, vki);
|
const format = try find_surface_format(pdev, vki, surface, preferred_format);
|
||||||
|
extent = try find_swap_extent(pdev, vki, surface, window);
|
||||||
|
|
||||||
_ = &extent;
|
const present_mode = try find_present_mode(pdev, vki, surface, .mailbox_khr);
|
||||||
|
|
||||||
// const gc: Context = .{
|
const swap_image_count = try find_swap_image_count(pdev, vki, surface);
|
||||||
// .vki = vki,
|
|
||||||
// .vkd = vkd,
|
var swapchain: vk.SwapchainKHR = .null_handle;
|
||||||
// .pdev = pdev,
|
defer vkd.destroySwapchainKHR(dev, swapchain, null);
|
||||||
// .dev = dev,
|
|
||||||
// .surface = surface,
|
var image_buf: [8]vk.Image = undefined;
|
||||||
// .queue = queue,
|
@memset(&image_buf, .null_handle);
|
||||||
// .family = family,
|
var images: []vk.Image = &.{};
|
||||||
// };
|
var image_views_buf: [8]vk.ImageView = undefined;
|
||||||
//
|
@memset(&image_views_buf, .null_handle);
|
||||||
// var swapchain = try Swapchain.init(&gc, ally, extent, format);
|
var image_views: []vk.ImageView = &.{};
|
||||||
// defer swapchain.deinit();
|
|
||||||
|
swapchain = try vkd.createSwapchainKHR(dev, &.{
|
||||||
|
.surface = surface,
|
||||||
|
.min_image_count = swap_image_count,
|
||||||
|
.image_format = format.format,
|
||||||
|
.image_color_space = format.color_space,
|
||||||
|
.image_extent = extent,
|
||||||
|
.image_array_layers = 1,
|
||||||
|
.image_usage = .{ .color_attachment_bit = true },
|
||||||
|
.image_sharing_mode = .exclusive,
|
||||||
|
.pre_transform = .{ .identity_bit_khr = true },
|
||||||
|
.composite_alpha = .{ .opaque_bit_khr = true },
|
||||||
|
.present_mode = present_mode,
|
||||||
|
.clipped = vk.TRUE,
|
||||||
|
.old_swapchain = swapchain,
|
||||||
|
}, null);
|
||||||
|
|
||||||
|
var image_count: u32 = @intCast(image_buf.len);
|
||||||
|
_ = try vkd.getSwapchainImagesKHR(dev, swapchain, &image_count, &image_buf);
|
||||||
|
images = image_buf[0..image_count];
|
||||||
|
image_views = image_views_buf[0..image_count];
|
||||||
|
defer for (image_views) |view| vkd.destroyImageView(dev, view, null);
|
||||||
|
|
||||||
|
for (images, image_views) |image, *view| {
|
||||||
|
view.* = try vkd.createImageView(dev, &.{
|
||||||
|
.image = image,
|
||||||
|
.view_type = .@"2d",
|
||||||
|
.format = format.format,
|
||||||
|
.components = .{ .r = .identity, .g = .identity, .b = .identity, .a = .identity },
|
||||||
|
.subresource_range = .{
|
||||||
|
.aspect_mask = .{ .color_bit = true },
|
||||||
|
.base_mip_level = 0,
|
||||||
|
.level_count = 1,
|
||||||
|
.base_array_layer = 0,
|
||||||
|
.layer_count = 1,
|
||||||
|
},
|
||||||
|
}, null);
|
||||||
|
}
|
||||||
|
|
||||||
const pipeline_layout = try vkd.createPipelineLayout(dev, &.{
|
const pipeline_layout = try vkd.createPipelineLayout(dev, &.{
|
||||||
.flags = .{},
|
.flags = .{},
|
||||||
|
Reference in New Issue
Block a user