summaryrefslogtreecommitdiff
path: root/src/screen/main.zig
blob: 0514210e623e7f7d146204e9cda50beeae009ce4 (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
92
93
94
95
96
97
98
99
100
const std = @import("std");
const drm = @import("drm/root.zig");

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 card.connector(resources.connector_ids[0]);
	defer connector.deinit();

	const mode = connector.modes[0];

	var crtc = try card.crtc(resources.crtc_ids[
		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 Pos = struct { x: f32, y: f32 };

	var vec = Pos { .x = 10, .y = 10 };
	var pos = Pos { .x = 0, .y = 0 };
	var delta: f32 = 0;
	const size = 100;

	const width: f32 = @floatFromInt(buffer.current.width);
	const height: f32 = @floatFromInt(buffer.current.height);

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

		@memset(
			buffer.current.pixels,
			.{
				.red = 0x25,
				.green = 0x25,
				.blue = 0x25
			}
		);

		pos.x += vec.x * delta;
		pos.y += vec.y * delta;

		if (pos.x < 0) {
			pos.x = -pos.x;
			vec.x = -vec.x;
		} else if (pos.x + size >= width) {
			pos.x = width - size;
			vec.x = -vec.x;
		}

		if (pos.y < 0) {
			pos.y = -pos.y;
			vec.y = -vec.y;
		} else if (pos.y + size >= height) {
			pos.y = height - size;
			vec.y = -vec.y;
		}

		for (0..size) |w| {
			for (0..size) |h| {
				const x = @as(usize, @intFromFloat(pos.x)) + w;
				const y = @as(usize, @intFromFloat(pos.y)) + h;
				buffer.current.pixels[x + buffer.current.width * y] = .{
					.red = 0xff,
					.green = 0,
					.blue = 0,
				};
			}
		}

		const end = try std.time.Instant.now();
		const elapsed = (@as(f32, @floatFromInt(end.since(start))) / std.time.ns_per_s);
		delta = elapsed * 60;

		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 => {},
			}
		}
	}
}