endRendering
Normally this is called for you in end, but you can call it separately in
case you want to do something after everything has been rendered.
Parameters
- self:*Self
- *Self
- opts:endOptions
- endOptions
Source
Implementation
pub fn endRendering(self: *Self, opts: endOptions) void {
// Frame phase timing: the build phase ends here and the render phase begins.
// Close out the event/build phases before the toasts/dialogs/debug below,
// since those register widgets that must not be taken for the build phase.
const render_start = self.backend.nanoTime();
self.ft_awaiting_build = false;
self.frame_timing_last.events_ns = nsSince(self.ft_build_start, self.ft_events_start);
self.frame_timing_last.build_ns = nsSince(render_start, self.ft_build_start);
// The build phase is over, so stop capturing the widget tree for
// `Debug.dumpFrame` before the inspector/dialogs below register widgets.
dvui.debug.capturing = false;
if (opts.show_toasts) {
dvui.toastsShow(null, dvui.windowRect());
}
var dialog_it = self.dialogs.iterator(null);
while (dialog_it.next()) |d| {
d.display(d.id) catch |err| {
dvui.logError(@src(), err, "Dialog {x}", .{d.id});
};
}
if (self.is_primary)
dvui.debug.show();
for (self.subwindows.stack.items) |*sw| {
self.renderCommands(sw.render_cmds.items) catch |err| {
dvui.logError(@src(), err, "Failed to render commands for subwindow {x}", .{sw.id});
};
// Set to empty because it's allocated on the arena and will be freed there
sw.render_cmds = .empty;
self.renderCommands(sw.render_cmds_after.items) catch |err| {
dvui.logError(@src(), err, "Failed to render commands after for subwindow {x}", .{sw.id});
};
// Set to empty because it's allocated on the arena and will be freed there
sw.render_cmds_after = .empty;
}
self.render_stats_last = self.render_stats;
self.frame_timing_last.render_ns = nsSince(self.backend.nanoTime(), render_start);
self.end_rendering_done = true;
}