summaryrefslogtreecommitdiff
path: root/src/screen/main.zig
blob: 2cb8c03e4a8e213c8e07f75d59aa98c86c710c12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
const std = @import("std");
const drm = @import("drm/root.zig");
const graphics = @import("estd").graphics;

pub fn main() !void {
	var gpa = std.heap.GeneralPurposeAllocator(.{}){};
	const allocator = gpa.allocator();

	var card = try drm.Card.open("card0", allocator);
	defer card.close();

	var resources = try card.resources();
	defer resources.deinit();

	var connector = try resources.connector(0);
	defer connector.deinit();

	const mode = connector.modes[12];
	std.debug.print("using mode: {s}@{d:.2}\n", .{mode.name, mode.frame_rate()});

	var crtc = try resources.crtc(
		connector.compatible_crtc() orelse @panic("no crtc found")
	);
	defer crtc.detach();

	var buffer = try card.create_buffer(mode.horizontal.size, mode.vertical.size);
	defer buffer.deinit();

	try crtc.attach(&buffer, &connector, mode);

	const center_x = (buffer.current.width / 2);
	const center_y = (buffer.current.height / 2);

	var line = graphics.Line {
		.start = .{ .x = center_x, .y = center_y },
		.end = .{ .x = center_x + 110 , .y = center_y + 100  },
		.color = .{ .red = 0xff, .green = 0, .blue = 0 },
	};

	var last_duration: f64 = 0;
	var delta: f64 = 0;
	var angle: f64 = 0;

	while (true) {
		const start = try std.time.Instant.now();
		const canvas = buffer.canvas();

		canvas.fill(.{ .red = 0x25, .green = 0x25, .blue = 0x25 });

		(graphics.Box {
			.x = center_x - 100,
			.y = center_y - 100,
			.width = 200,
			.height = 200,
			.radius = 100,
			.color = .{ .red = 0xff, .green = 0xff, .blue = 0xff },
		}).render(&canvas);

		line.render(&canvas);
		const cos = @cos(std.math.degreesToRadians(angle));
		const sin = @sin(std.math.degreesToRadians(angle));
		line.end.x = @intCast(@as(i64, @intCast(center_x)) + @as(i64, @intFromFloat(100 * cos)));
		line.end.y = @intCast(@as(i64, @intCast(center_y)) + @as(i64, @intFromFloat(100 * sin)));

		angle += delta;
		if (angle > 360) {
			angle = 0;
		}

		const end = try std.time.Instant.now();
		const duration: f64 = @floatFromInt(end.since(start));
		const average = (duration + last_duration) / 2;
		last_duration = duration;
		std.debug.print("@FPS: {d:.3}\r", .{ std.time.ns_per_s / average });
		delta = 60 * last_duration / std.time.ns_per_s;

		try crtc.page_flip(&buffer);

		while (true) {
			var event: ?drm.Event = null;
			while (event == null) {
				event = try card.poll_event(5000);
			}

			switch ((event orelse unreachable).kind) {
				.page_flip_complete => break,
				else => {},
			}
		}
	}
}