943 Commits

Author SHA1 Message Date
Mitchell Hashimoto
a7c1f63ad8 metal: populate the greyscale texture, prep ubershader 2022-10-31 09:44:37 -07:00
Mitchell Hashimoto
89610f9b8d metal: setup vertex data 2022-10-31 09:44:37 -07:00
Mitchell Hashimoto
6b7ed3fefb metal: use content scale when resizing 2022-10-31 09:44:37 -07:00
Mitchell Hashimoto
ea0265f021 projection matrix, render cell 2022-10-31 09:44:37 -07:00
Mitchell Hashimoto
a17a7426a3 draw a square, handle resize 2022-10-31 09:44:37 -07:00
Mitchell Hashimoto
4d4c1790cb draw a triangle 2022-10-31 09:44:36 -07:00
Mitchell Hashimoto
fc7e457098 add first pass metal shader 2022-10-31 09:44:36 -07:00
Mitchell Hashimoto
90a284e176 boilerplate for rendering 2022-10-31 09:44:36 -07:00
Mitchell Hashimoto
873afd042b don't test stage1 2022-10-31 09:44:36 -07:00
Mitchell Hashimoto
090bab6798 metal: setup the render loop, draw the background color 2022-10-31 09:44:36 -07:00
Mitchell Hashimoto
07271a6cfd Initial metal abstraction (noop) 2022-10-31 09:44:36 -07:00
Mitchell Hashimoto
19f003d7d0 mac: load emoji font last so it is not preferred for text 2022-10-31 09:44:19 -07:00
Mitchell Hashimoto
7557b7b831 update zig 2022-10-30 22:27:08 -07:00
Mitchell Hashimoto
6203893d45 update README about release builds 2022-10-30 22:22:39 -07:00
Mitchell Hashimoto
f89b5d12f6 fixed bugs 2022-10-29 09:48:57 -07:00
Mitchell Hashimoto
6d0b8a24d9 pkg/objc: shortcut for set/get property 2022-10-28 14:38:50 -07:00
Mitchell Hashimoto
1e5c17dffa Comment to show native access 2022-10-28 10:02:32 -07:00
Mitchell Hashimoto
71042b6f1b pkg/objc: more methods 2022-10-28 09:36:56 -07:00
Mitchell Hashimoto
b4a83d98c4 window no longer makes any OpenGL calls 2022-10-28 09:24:40 -07:00
Mitchell Hashimoto
209cad609c update zig 2022-10-27 17:06:54 -07:00
Mitchell Hashimoto
7d3eb2579a Objective-C Runtime (Low-level ObjC interfacing)
This adds a new homemade package `pkg/objc` that wraps the Objective-C runtime so that Zig can interface with ObjC. This doesn't have 100% API coverage but all the hard problems (mainly `objc_msgSend`) are done. We can merge this now, start working on ObjC stuff, and expand APIs as we need them.

The `objc` package is of course only available to Mac builds.
2022-10-25 21:32:56 -07:00
Mitchell Hashimoto
59cb774cdd pkg/objc: properties 2022-10-25 21:25:07 -07:00
Mitchell Hashimoto
aaaae38fa1 pkg/objc: more message send stuff 2022-10-25 20:55:41 -07:00
Mitchell Hashimoto
f587b222e7 don't need fstage1 2022-10-25 20:55:34 -07:00
Mitchell Hashimoto
7d48e564b5 pkg/objc: message send 2022-10-25 20:30:42 -07:00
Mitchell Hashimoto
10ee05b435 pkg/objc: selectors 2022-10-25 16:33:45 -07:00
Mitchell Hashimoto
dd8fde52d9 pkg/objc starting 2022-10-25 16:21:11 -07:00
Mitchell Hashimoto
e7ffb823af propertly deinit the GPA so we can detect leaks in debug 2022-10-25 15:49:21 -07:00
Mitchell Hashimoto
d8cdd5d8fe Fix the primary leak with config 2022-10-25 15:48:13 -07:00
Mitchell Hashimoto
233ee2b3eb fixing more memory leaks 2022-10-25 15:40:26 -07:00
Mitchell Hashimoto
bcf485342e fix a couple more memory leaks 2022-10-24 16:17:18 -07:00
Mitchell Hashimoto
ef57e1e56a free memory in cells LRU 2022-10-24 16:09:08 -07:00
Mitchell Hashimoto
8dd9e7b325 Fix memory leak forgetting to clean up fontconfig 2022-10-24 15:55:57 -07:00
Mitchell Hashimoto
9ef431c632 use the c allocator when running under valgrind 2022-10-24 15:34:30 -07:00
Mitchell Hashimoto
cf14ea506f update zig 2022-10-24 14:35:42 -07:00
Mitchell Hashimoto
d346309cb3 pkg/libuv: generate cimport.zig for specific platforms 2022-10-24 14:35:30 -07:00
Mitchell Hashimoto
672e0d1d63 Multi-threaded Rendering
This moves the OpenGL renderer out to a dedicated thread. The immediate effect
is noticeably improved FPS under high load scenarios. But the future impact is
also important: (1) required for multiple windows, tabs, etc. one day (2) forced
a refactor to support pluggable renderers.

== Architectural Notes

Windowing events and IO remain on the main thread for now, but I plan to move
IO to a dedicated thread in a future PR. Windowing events have to remain on the
main thread for eternity since some platforms force all Window events onto one
thread.

This is one of the reasons that this will be required for multi-window. As more
windows are opened, the windowing system will send more and more window events
to our main thread, taking more and more time away from other tasks on the main
thread. Windowing events are effectively free, so if the thread is ONLY handling
windowing events, this can scale basically forever.

Further, with OpenGL, each window must have its own "context." A context is the
state used to draw. OpenGL mandates at most one context is active at any given
time _per OS thread_. For multiple windows, this means that a single thread
would have to draw one window at a time in serial. With multiple rendering
threads, each thread can have its own context activated and draw in parallel.

The renderer thread and main thread **do have shared state** and will have some
shared state forever. The terminal screen state for example is shared memory.
An immutable data structure or double buffering would be too expensive (I think,
I'll check one day) so we use a mutex to protect access to the terminal state.

The primary instigator of terminal state change is PTY read. This is the
primary motivator to eventually move IO to its own dedicated thread as well.
As multiple windows come up, each PTY under heavy load conditions will block
only its own thread and hold the lock only for its own terminal state (and
therefore its own renderer thread).

We can continue to optimize critical areas from this point forward though and
lower any contention.

== Performance Notes

I haven't done any hard benchmarking on this, only did some cursory
memory measurements, CPU measurements, etc. I also ran superficial test
programs such as `cat`-ing large files, scrolling through large buffers
in vim, etc.

In any case, it seems that responsivity is generally higher, although it
appears that `cat`-ing large files slowed down by roughly 10%. This is
probably due to the lock overhead with the renderer and optimizing for
higher framerates with this setup.
2022-10-24 11:20:21 -07:00
Mitchell Hashimoto
c2ce158342 remove the max timer 2022-10-24 10:55:16 -07:00
Mitchell Hashimoto
c0f96f591b remove render timer from window 2022-10-24 10:50:42 -07:00
Mitchell Hashimoto
536f5c4487 set proper opengl background 2022-10-24 10:04:40 -07:00
Mitchell Hashimoto
b4859625bf bring back out of focus no blink 2022-10-24 10:01:38 -07:00
Mitchell Hashimoto
dc908cb73d support screen size, rip out shared state 2022-10-24 09:52:08 -07:00
Mitchell Hashimoto
45ff936ddf no longer store grid size on the renderer 2022-10-24 09:32:51 -07:00
Mitchell Hashimoto
ce384c2356 renderer: extract the size structs to a shared file 2022-10-24 09:27:09 -07:00
Mitchell Hashimoto
aa3d132947 run rendering on another real thread (still bugs) 2022-10-24 09:17:48 -07:00
Mitchell Hashimoto
77b981950c pkg/libuv: Idle handles 2022-10-23 21:15:58 -07:00
Mitchell Hashimoto
aeb592bae9 move to new renderstate, new render method 2022-10-23 21:04:52 -07:00
Mitchell Hashimoto
b347ff458b prepare our render state on the window 2022-10-23 20:55:04 -07:00
Mitchell Hashimoto
9913bba2e8 introduce renderer thread logic (not starting it yet) 2022-10-23 20:18:10 -07:00
Mitchell Hashimoto
89a4c59f3c make opengl loader context-aware 2022-10-23 19:39:02 -07:00