Files
VulkanDriver/src/soft/SoftFramebuffer.zig
T
kbz_8 fc2407d10d
Test / build_and_test (push) Successful in 26s
Build / build (push) Successful in 56s
adding attachments resolving to renderpass commands
2026-05-28 01:05:23 +02:00

74 lines
3.1 KiB
Zig

const std = @import("std");
const vk = @import("vulkan");
const base = @import("base");
const VkError = base.VkError;
const Device = base.Device;
const blitter = @import("device/blitter.zig");
const SoftImage = @import("SoftImage.zig");
const SoftRenderPass = @import("SoftRenderPass.zig");
const Self = @This();
pub const Interface = base.Framebuffer;
interface: Interface,
pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const vk.FramebufferCreateInfo) VkError!*Self {
const self = allocator.create(Self) catch return VkError.OutOfHostMemory;
errdefer allocator.destroy(self);
var interface = try Interface.init(device, allocator, info);
interface.vtable = &.{
.destroy = destroy,
};
self.* = .{
.interface = interface,
};
return self;
}
pub fn destroy(interface: *Interface, allocator: std.mem.Allocator) void {
const self: *Self = @alignCast(@fieldParentPtr("interface", interface));
allocator.destroy(self);
}
pub fn resolveAttachments(self: *Self, render_pass: *SoftRenderPass, subpass_index: usize) VkError!void {
const subpass = render_pass.interface.subpasses[subpass_index];
if (subpass.resolve_attachments) |resolve_attachments| {
if (subpass.color_attachments) |color_attachments| {
for (color_attachments[0..], resolve_attachments[0..]) |color, resolve| {
if (resolve.attachment != vk.ATTACHMENT_UNUSED) {
const src_image_view = self.interface.attachments[color.attachment];
const src_image: *SoftImage = @alignCast(@fieldParentPtr("interface", src_image_view.image));
const dst_image_view = self.interface.attachments[resolve.attachment];
const dst_image: *SoftImage = @alignCast(@fieldParentPtr("interface", dst_image_view.image));
try blitter.resolve(src_image, dst_image, .{
.src_subresource = .{
.aspect_mask = src_image_view.subresource_range.aspect_mask,
.base_array_layer = src_image_view.subresource_range.base_array_layer,
.layer_count = src_image_view.subresource_range.layer_count,
.mip_level = src_image_view.subresource_range.base_mip_level,
},
.src_offset = .{ .x = 0, .y = 0, .z = 0 },
.dst_subresource = .{
.aspect_mask = dst_image_view.subresource_range.aspect_mask,
.base_array_layer = dst_image_view.subresource_range.base_array_layer,
.layer_count = dst_image_view.subresource_range.layer_count,
.mip_level = dst_image_view.subresource_range.base_mip_level,
},
.dst_offset = .{ .x = 0, .y = 0, .z = 0 },
.extent = src_image.getMipLevelExtent(src_image_view.subresource_range.base_mip_level),
});
}
}
}
}
}