This commit is contained in:
Rakarake 2026-01-28 01:05:17 +01:00
parent b20f48ebc0
commit e934c1f61d
3 changed files with 63 additions and 32 deletions

View file

@ -68,7 +68,7 @@ int main(int argc, char *argv[]) {
render(&renderer, width, height, time, shader_path, 0);
printf("about to 🦬 swap buf %p\n", event.data.draw.surface);
swap_buffers(&state, event.data.draw.surface);
printf("🦬🦬🦬 swaping a buffalo\n");
printf("🦬🦬🦬 swaped a buffalo\n");
}
if (event.type == EVENT_NONE) {
printf("nothing, absolutely nothing\n");

View file

@ -330,6 +330,7 @@ void wayland_init(struct client_state *state, int output_type) {
state->wl_display = wl_display_connect(NULL);
state->wl_registry = wl_display_get_registry(state->wl_display);
state->surface_list = NULL;
state->surface_list_next = NULL;
wl_registry_add_listener(state->wl_registry, &wl_registry_listener, state);
wl_display_roundtrip(state->wl_display);
@ -363,15 +364,22 @@ void commit(struct client_state *state) {
}
struct event wait_for_event(struct client_state *state) {
for (;;) {
// before dispatch: check that there is nothing elese to do
// check for dirty surface
struct surface_list *next = state->surface_list;
printf("checking for events\n");
while (next != NULL) {
struct surface_list *next = state->surface_list_next;
// keep track of one loop.
struct surface_list *original = next;
while (true) {
if (next == NULL) {
next = state->surface_list;
}
// do here
if (next->data.dirty) {
next->data.dirty = false;
printf("dirty\n");
state->surface_list->next = next->next;
printf("dirty %p\n", &next->data);
if (eglMakeCurrent(state->egl_display, next->data.egl_surface,
next->data.egl_surface, state->egl_context)) {
@ -390,28 +398,49 @@ struct event wait_for_event(struct client_state *state) {
};
return event;
}
next = next->next;
if (next == original) {
state->surface_list_next = next;
break;
}
}
wl_display_dispatch(state->wl_display);
struct event event = {
.type = EVENT_NONE,
};
return event;
}
void print_surface_list(struct client_state *state) {
struct surface_list *next = state->surface_list;
printf("[\n");
while (next != NULL) {
printf("ITEM: %p\n", &next->data);
next = next->next;
}
printf("]\n");
}
void swap_buffers(struct client_state *state, struct surface *surface) {
struct surface_list *next = state->surface_list;
print_surface_list(state);
while (next != NULL) {
printf("going to swap buffers 🐃🐃🐃: %p, surface: %p\n", &next->data, surface);
if (&next->data == surface) {
printf("swapping this buffer 🐃: %p\n", &next->data);
eglSwapBuffers(state->egl_display, next->data.egl_surface);
// maybe unecessary TODO maybe really bad?
wl_display_dispatch(state->wl_display);
//wl_display_dispatch(state->wl_display);
/* Request another frame */
//struct wl_callback *cb = wl_surface_frame(surface->wl_surface);
//wl_callback_add_listener(cb, &wl_surface_frame_listener, surface);
printf("done swapping\n");
return;
}
printf("next BUF: %p\n", next->next);
next = next->next;
}
fprintf(stderr, "didn't find surface for buffer swap\n");
}

View file

@ -43,6 +43,8 @@ struct client_state {
struct zwlr_layer_shell_v1 *zwlr_layer_shell_v1;
struct surface_list *surface_list;
/// Next in queue to check if it wants to be rendered.
struct surface_list *surface_list_next;
EGLDisplay egl_display;
EGLConfig egl_config;