render: pass Output by constant pointer

This is semantically what we want as we store a pointer to the output in
the SurfaceRenderData struct.
This commit is contained in:
Isaac Freund 2021-01-06 17:53:04 +01:00
parent b73cb7bb69
commit 751b63f6fa
No known key found for this signature in database
GPG key ID: 86DED400DDFD7A11

View file

@ -65,14 +65,15 @@ pub fn renderOutput(output: *Output) void {
if (fullscreen_view) |view| { if (fullscreen_view) |view| {
// Always clear with solid black for fullscreen // Always clear with solid black for fullscreen
renderer.clear(&[_]f32{ 0, 0, 0, 1 }); renderer.clear(&[_]f32{ 0, 0, 0, 1 });
renderView(output.*, view, &now); renderView(output, view, &now);
if (build_options.xwayland) renderXwaylandUnmanaged(output.*, &now); if (build_options.xwayland) renderXwaylandUnmanaged(output, &now);
if (!view.destroying) renderViewPopups(output, view, &now);
} else { } else {
// No fullscreen view, so render normal layers/views // No fullscreen view, so render normal layers/views
renderer.clear(&config.background_color); renderer.clear(&config.background_color);
renderLayer(output.*, output.getLayer(.background).*, &now, .toplevels); renderLayer(output, output.getLayer(.background).*, &now, .toplevels);
renderLayer(output.*, output.getLayer(.bottom).*, &now, .toplevels); renderLayer(output, output.getLayer(.bottom).*, &now, .toplevels);
// The first view in the list is "on top" so iterate in reverse. // The first view in the list is "on top" so iterate in reverse.
it = ViewStack(View).iter(output.views.last, .reverse, output.current.tags, renderFilter); it = ViewStack(View).iter(output.views.last, .reverse, output.current.tags, renderFilter);
@ -80,8 +81,8 @@ pub fn renderOutput(output: *Output) void {
// Focused views are rendered on top of normal views, skip them for now // Focused views are rendered on top of normal views, skip them for now
if (view.current.focus != 0) continue; if (view.current.focus != 0) continue;
renderView(output.*, view, &now); renderView(output, view, &now);
if (view.draw_borders) renderBorders(output.*, view, &now); if (view.draw_borders) renderBorders(output, view, &now);
} }
// Render focused views // Render focused views
@ -90,25 +91,31 @@ pub fn renderOutput(output: *Output) void {
// Skip unfocused views since we already rendered them // Skip unfocused views since we already rendered them
if (view.current.focus == 0) continue; if (view.current.focus == 0) continue;
renderView(output.*, view, &now); renderView(output, view, &now);
if (view.draw_borders) renderBorders(output.*, view, &now); if (view.draw_borders) renderBorders(output, view, &now);
renderViewPopups(output.*, view, &now);
} }
if (build_options.xwayland) renderXwaylandUnmanaged(output.*, &now); if (build_options.xwayland) renderXwaylandUnmanaged(output, &now);
renderLayer(output.*, output.getLayer(.top).*, &now, .toplevels); renderLayer(output, output.getLayer(.top).*, &now, .toplevels);
renderLayer(output.*, output.getLayer(.background).*, &now, .popups); // Render popups of focused views
renderLayer(output.*, output.getLayer(.bottom).*, &now, .popups); it = ViewStack(View).iter(output.views.last, .reverse, output.current.tags, renderFilter);
renderLayer(output.*, output.getLayer(.top).*, &now, .popups); while (it.next()) |view| {
if (view.current.focus == 0 or view.destroying) continue;
renderViewPopups(output, view, &now);
}
renderLayer(output, output.getLayer(.background).*, &now, .popups);
renderLayer(output, output.getLayer(.bottom).*, &now, .popups);
renderLayer(output, output.getLayer(.top).*, &now, .popups);
} }
// The overlay layer is rendered in both fullscreen and normal cases // The overlay layer is rendered in both fullscreen and normal cases
renderLayer(output.*, output.getLayer(.overlay).*, &now, .toplevels); renderLayer(output, output.getLayer(.overlay).*, &now, .toplevels);
renderLayer(output.*, output.getLayer(.overlay).*, &now, .popups); renderLayer(output, output.getLayer(.overlay).*, &now, .popups);
renderDragIcons(output.*, &now); renderDragIcons(output, &now);
// Hardware cursors are rendered by the GPU on a separate plane, and can be // Hardware cursors are rendered by the GPU on a separate plane, and can be
// moved around without re-rendering what's beneath them - which is more // moved around without re-rendering what's beneath them - which is more
@ -149,7 +156,7 @@ fn renderFilter(view: *View, filter_tags: u32) bool {
/// Render all surfaces on the passed layer /// Render all surfaces on the passed layer
fn renderLayer( fn renderLayer(
output: Output, output: *const Output,
layer: std.TailQueue(LayerSurface), layer: std.TailQueue(LayerSurface),
now: *os.timespec, now: *os.timespec,
role: enum { toplevels, popups }, role: enum { toplevels, popups },
@ -158,7 +165,7 @@ fn renderLayer(
while (it) |node| : (it = node.next) { while (it) |node| : (it = node.next) {
const layer_surface = &node.data; const layer_surface = &node.data;
var rdata = SurfaceRenderData{ var rdata = SurfaceRenderData{
.output = &output, .output = output,
.output_x = layer_surface.box.x, .output_x = layer_surface.box.x,
.output_y = layer_surface.box.y, .output_y = layer_surface.box.y,
.when = now, .when = now,
@ -179,7 +186,7 @@ fn renderLayer(
} }
} }
fn renderView(output: Output, view: *View, now: *os.timespec) void { fn renderView(output: *const Output, view: *View, now: *os.timespec) void {
// If we have saved buffers, we are in the middle of a transaction // If we have saved buffers, we are in the middle of a transaction
// and need to render those buffers until the transaction is complete. // and need to render those buffers until the transaction is complete.
if (view.saved_buffers.items.len != 0) { if (view.saved_buffers.items.len != 0) {
@ -200,7 +207,7 @@ fn renderView(output: Output, view: *View, now: *os.timespec) void {
// Since there is no stashed buffer, we are not in the middle of // Since there is no stashed buffer, we are not in the middle of
// a transaction and may simply render each toplevel surface. // a transaction and may simply render each toplevel surface.
var rdata = SurfaceRenderData{ var rdata = SurfaceRenderData{
.output = &output, .output = output,
.output_x = view.current.box.x - view.surface_box.x, .output_x = view.current.box.x - view.surface_box.x,
.output_y = view.current.box.y - view.surface_box.y, .output_y = view.current.box.y - view.surface_box.y,
.when = now, .when = now,
@ -211,9 +218,9 @@ fn renderView(output: Output, view: *View, now: *os.timespec) void {
} }
} }
fn renderViewPopups(output: Output, view: *View, now: *os.timespec) void { fn renderViewPopups(output: *const Output, view: *View, now: *os.timespec) void {
var rdata = SurfaceRenderData{ var rdata = SurfaceRenderData{
.output = &output, .output = output,
.output_x = view.current.box.x - view.surface_box.x, .output_x = view.current.box.x - view.surface_box.x,
.output_y = view.current.box.y - view.surface_box.y, .output_y = view.current.box.y - view.surface_box.y,
.when = now, .when = now,
@ -222,7 +229,7 @@ fn renderViewPopups(output: Output, view: *View, now: *os.timespec) void {
view.forEachPopup(*SurfaceRenderData, renderSurfaceIterator, &rdata); view.forEachPopup(*SurfaceRenderData, renderSurfaceIterator, &rdata);
} }
fn renderDragIcons(output: Output, now: *os.timespec) void { fn renderDragIcons(output: *const Output, now: *os.timespec) void {
const output_box = output.root.output_layout.getBox(output.wlr_output).?; const output_box = output.root.output_layout.getBox(output.wlr_output).?;
var it = output.root.drag_icons.first; var it = output.root.drag_icons.first;
@ -230,7 +237,7 @@ fn renderDragIcons(output: Output, now: *os.timespec) void {
const drag_icon = &node.data; const drag_icon = &node.data;
var rdata = SurfaceRenderData{ var rdata = SurfaceRenderData{
.output = &output, .output = output,
.output_x = @floatToInt(i32, drag_icon.seat.cursor.wlr_cursor.x) + .output_x = @floatToInt(i32, drag_icon.seat.cursor.wlr_cursor.x) +
drag_icon.wlr_drag_icon.surface.sx - output_box.x, drag_icon.wlr_drag_icon.surface.sx - output_box.x,
.output_y = @floatToInt(i32, drag_icon.seat.cursor.wlr_cursor.y) + .output_y = @floatToInt(i32, drag_icon.seat.cursor.wlr_cursor.y) +
@ -243,7 +250,7 @@ fn renderDragIcons(output: Output, now: *os.timespec) void {
} }
/// Render all xwayland unmanaged windows that appear on the output /// Render all xwayland unmanaged windows that appear on the output
fn renderXwaylandUnmanaged(output: Output, now: *os.timespec) void { fn renderXwaylandUnmanaged(output: *const Output, now: *os.timespec) void {
const output_box = output.root.output_layout.getBox(output.wlr_output).?; const output_box = output.root.output_layout.getBox(output.wlr_output).?;
var it = output.root.xwayland_unmanaged_views.first; var it = output.root.xwayland_unmanaged_views.first;
@ -251,7 +258,7 @@ fn renderXwaylandUnmanaged(output: Output, now: *os.timespec) void {
const xwayland_surface = node.data.xwayland_surface; const xwayland_surface = node.data.xwayland_surface;
var rdata = SurfaceRenderData{ var rdata = SurfaceRenderData{
.output = &output, .output = output,
.output_x = xwayland_surface.x - output_box.x, .output_x = xwayland_surface.x - output_box.x,
.output_y = xwayland_surface.y - output_box.y, .output_y = xwayland_surface.y - output_box.y,
.when = now, .when = now,
@ -269,7 +276,7 @@ fn renderSurfaceIterator(
rdata: *SurfaceRenderData, rdata: *SurfaceRenderData,
) callconv(.C) void { ) callconv(.C) void {
renderTexture( renderTexture(
rdata.output.*, rdata.output,
surface.getTexture() orelse return, surface.getTexture() orelse return,
.{ .{
.x = rdata.output_x + surface_x, .x = rdata.output_x + surface_x,
@ -287,7 +294,7 @@ fn renderSurfaceIterator(
/// Render the given texture at the given box, taking the scale and transform /// Render the given texture at the given box, taking the scale and transform
/// of the output into account. /// of the output into account.
fn renderTexture( fn renderTexture(
output: Output, output: *const Output,
texture: *wlr.Texture, texture: *wlr.Texture,
wlr_box: wlr.Box, wlr_box: wlr.Box,
transform: wl.Output.Transform, transform: wl.Output.Transform,
@ -312,7 +319,7 @@ fn renderTexture(
renderer.renderTextureWithMatrix(texture, &matrix, opacity) catch return; renderer.renderTextureWithMatrix(texture, &matrix, opacity) catch return;
} }
fn renderBorders(output: Output, view: *View, now: *os.timespec) void { fn renderBorders(output: *const Output, view: *View, now: *os.timespec) void {
const config = &output.root.server.config; const config = &output.root.server.config;
const color = if (view.current.focus != 0) &config.border_color_focused else &config.border_color_unfocused; const color = if (view.current.focus != 0) &config.border_color_focused else &config.border_color_unfocused;
const border_width = config.border_width; const border_width = config.border_width;
@ -347,7 +354,7 @@ fn renderBorders(output: Output, view: *View, now: *os.timespec) void {
renderRect(output, border, color); renderRect(output, border, color);
} }
fn renderRect(output: Output, box: Box, color: *const [4]f32) void { fn renderRect(output: *const Output, box: Box, color: *const [4]f32) void {
var wlr_box = box.toWlrBox(); var wlr_box = box.toWlrBox();
scaleBox(&wlr_box, output.wlr_output.scale); scaleBox(&wlr_box, output.wlr_output.scale);
output.wlr_output.backend.getRenderer().?.renderRect( output.wlr_output.backend.getRenderer().?.renderRect(