summaryrefslogtreecommitdiff
path: root/src/screen/main.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-02-07 20:39:58 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-02-07 20:39:58 +0100
commitdae5bc02b1c934075e95694953b4330676e21611 (patch)
treefaa1a80849e5642d0b4bd8b4a91331b1da5b75bf /src/screen/main.zig
parentfef523a8d7c87f272de18c8abd57e0cc53e2ef40 (diff)
estd: add graphics module
Diffstat (limited to 'src/screen/main.zig')
-rw-r--r--src/screen/main.zig88
1 files changed, 37 insertions, 51 deletions
diff --git a/src/screen/main.zig b/src/screen/main.zig
index 0514210..7b73450 100644
--- a/src/screen/main.zig
+++ b/src/screen/main.zig
@@ -1,5 +1,6 @@
const std = @import("std");
const drm = @import("drm/root.zig");
+const graphics = @import("estd").graphics;
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
@@ -11,14 +12,15 @@ pub fn main() !void {
var resources = try card.resources();
defer resources.deinit();
- var connector = try card.connector(resources.connector_ids[0]);
+ var connector = try resources.connector(0);
defer connector.deinit();
- const mode = connector.modes[0];
+ const mode = connector.modes[12];
+ std.debug.print("using mode: {s}@{d:.2}\n", .{mode.name, mode.frame_rate()});
- var crtc = try card.crtc(resources.crtc_ids[
+ 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);
@@ -26,62 +28,46 @@ pub fn main() !void {
try crtc.attach(&buffer, &connector, mode);
- const Pos = struct { x: f32, y: f32 };
+ const center_x: i64 = @intCast(buffer.current.width / 2 - 100);
+ const center_y: i64 = @intCast(buffer.current.height / 2 - 100);
- var vec = Pos { .x = 10, .y = 10 };
- var pos = Pos { .x = 0, .y = 0 };
- var delta: f32 = 0;
- const size = 100;
+ var box = graphics.Box {
+ .x = @intCast(center_x),
+ .y = @intCast(center_y),
+ .width = 200,
+ .height = 200,
+ .color = .{ .red = 0xff, .green = 0x05, .blue = 0x07 },
+ .radius = 0,
+ };
- const width: f32 = @floatFromInt(buffer.current.width);
- const height: f32 = @floatFromInt(buffer.current.height);
+ var last_duration: f64 = 0;
+ var dir: f64 = 1;
+ var delta: f64 = 0;
+ var radius: f64 = 0;
while (true) {
const start = try std.time.Instant.now();
+ const canvas = buffer.canvas();
+ canvas.fill(.{ .red = 0x25, .green = 0x25, .blue = 0x25 });
+ box.render(&canvas);
- @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,
- };
- }
+ radius += delta * dir;
+ if (radius > 100) {
+ std.debug.print("HERE\n", .{});
+ radius = 100;
+ dir = -1;
+ } else if (radius < 0) {
+ radius = 0;
+ dir = 1;
}
+ box.radius = @intFromFloat(radius);
const end = try std.time.Instant.now();
- const elapsed = (@as(f32, @floatFromInt(end.since(start))) / std.time.ns_per_s);
- delta = elapsed * 60;
+ 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);