wl_display@1.error(wl_display@1, 1, "invalid arguments for wl_surface@6.attach") root cause: wl_surface_attach(wl_surface* surface, wl_buffer* buffer, int, int); ((wl_proxy*)surface)->display != ((wl_proxy*)buffer)->display surface's display and buffer's display were not matched. wayland server can't find the buffer object in surface's client connection. solution: correct source code, let wl_surface and wl_buffer use the same display. By the way, each time you call wl_display_get(NULL). you will get a new display.