tbm_surface_h tbm_surface;
int bo_name;
- struct wl_proxy *wl_buffer;
+ struct wl_buffer *wl_buffer;
int dx, dy; /* position to attach to wl_surface */
int width, height; /* size to attach to wl_surface */
_get_tbm_surface_bo_name(tbm_surface_h tbm_surface);
static void
__cb_wl_vk_buffer_free(tpl_wl_vk_buffer_t *wl_vk_buffer);
+static void
+__cb_wl_buffer_release(void *data, struct wl_proxy *wl_buffer);
static tpl_result_t
_thread_swapchain_create_tbm_queue(tpl_wl_vk_surface_t *wl_vk_surface);
static void
wl_vk_surface->reset = TPL_FALSE;
wl_vk_surface->is_activated = TPL_FALSE;
- wl_vk_surface->vblank_done = TPL_FALSE;
+ wl_vk_surface->vblank_done = TPL_TRUE;
wl_vk_surface->render_done_cnt = 0;
if (wl_vk_buffer->wl_buffer) {
wayland_tbm_client_destroy_buffer(wl_vk_display->wl_tbm_client,
- (void *)wl_vk_buffer->wl_buffer);
+ wl_vk_buffer->wl_buffer);
wl_vk_buffer->wl_buffer = NULL;
}
return TPL_ERROR_NONE;
}
+static const struct wl_buffer_listener wl_buffer_release_listener = {
+ (void *)__cb_wl_buffer_release,
+};
+
static tpl_result_t
_thread_surface_queue_acquire(tpl_wl_vk_surface_t *wl_vk_surface)
{
_get_tbm_surface_bo_name(tbm_surface));
if (wl_vk_buffer->wl_buffer == NULL) {
- wl_vk_buffer->wl_buffer =
- (struct wl_proxy *)wayland_tbm_client_create_buffer(
+ wl_vk_buffer->wl_buffer = wayland_tbm_client_create_buffer(
wl_vk_display->wl_tbm_client, tbm_surface);
if (!wl_vk_buffer->wl_buffer) {
"[WL_BUFFER_CREATE] wl_vk_buffer(%p) wl_buffer(%p) tbm_surface(%p)",
wl_vk_buffer, wl_vk_buffer->wl_buffer, tbm_surface);
}
+
+ if (wl_vk_buffer->acquire_fence_fd == -1 ||
+ wl_vk_display->use_explicit_sync == TPL_FALSE) {
+ wl_buffer_add_listener(wl_vk_buffer->wl_buffer,
+ &wl_buffer_release_listener, wl_vk_buffer);
+ }
}
if (!wl_vk_display->use_wait_vblank || wl_vk_surface->vblank_done)
}
}
-static const struct wl_buffer_listener wl_buffer_release_listener = {
- (void *)__cb_wl_buffer_release,
-};
-
static void
__cb_tdm_client_vblank(tdm_client_vblank *vblank, tdm_error error,
unsigned int sequence, unsigned int tv_sec,
"wl_vk_buffer sould be not NULL");
if (wl_vk_buffer->wl_buffer == NULL) {
- wl_vk_buffer->wl_buffer =
- (struct wl_proxy *)wayland_tbm_client_create_buffer(
- wl_vk_display->wl_tbm_client,
- wl_vk_buffer->tbm_surface);
+ wl_vk_buffer->wl_buffer = wayland_tbm_client_create_buffer(
+ wl_vk_display->wl_tbm_client,
+ wl_vk_buffer->tbm_surface);
+ if (wl_vk_buffer->wl_buffer &&
+ (wl_vk_buffer->acquire_fence_fd == -1 ||
+ wl_vk_display->use_explicit_sync == TPL_FALSE)) {
+ wl_buffer_add_listener(wl_vk_buffer->wl_buffer,
+ &wl_buffer_release_listener, wl_vk_buffer);
+ }
}
TPL_CHECK_ON_FALSE_ASSERT_FAIL(wl_vk_buffer->wl_buffer != NULL,
"[FATAL] Failed to create wl_buffer");
version = wl_proxy_get_version((struct wl_proxy *)wl_surface);
- wl_surface_attach(wl_surface, (void *)wl_vk_buffer->wl_buffer,
+ wl_surface_attach(wl_surface, wl_vk_buffer->wl_buffer,
wl_vk_buffer->dx, wl_vk_buffer->dy);
if (wl_vk_buffer->num_rects < 1 || wl_vk_buffer->rects == NULL) {
}
if (wl_vk_display->use_explicit_sync &&
- wl_vk_surface->surface_sync) {
+ wl_vk_surface->surface_sync &&
+ wl_vk_buffer->acquire_fence_fd != -1) {
zwp_linux_surface_synchronization_v1_set_acquire_fence(wl_vk_surface->surface_sync,
wl_vk_buffer->acquire_fence_fd);
wl_vk_buffer->buffer_release, &zwp_release_listner, wl_vk_buffer);
TPL_DEBUG("add explicit_sync_release_listener.");
}
- } else {
- wl_buffer_add_listener((void *)wl_vk_buffer->wl_buffer,
- &wl_buffer_release_listener, wl_vk_buffer);
}
wl_surface_commit(wl_surface);