<event name="active">
<arg name="usage" type="uint"/>
<arg name="queue_size" type="uint"/>
+ <arg name="queue_width" type="uint"/>
+ <arg name="queue_height" type="uint"/>
<arg name="need_flush" type="uint"/>
</event>
int active_flush;
int active_flush_done;
int active_flush_size;
+ int active_flush_width;
+ int active_flush_height;
int active_flush_invalid;
int usage;
struct wl_list attach_bufs;
struct wl_tbm_queue *wl_tbm_queue,
uint32_t usage,
uint32_t queue_size,
+ uint32_t queue_width,
+ uint32_t queue_height,
uint32_t need_flush)
{
struct wayland_tbm_surface_queue *queue_info =
if (need_flush) {
queue_info->active_flush = need_flush;
queue_info->active_flush_size = queue_size;
+ queue_info->active_flush_width = queue_width;
+ queue_info->active_flush_height = queue_height;
queue_info->active_flush_done = 0;
queue_info->wait_usable = 0;
}
tbm_surface_queue_notify_dequeuable(surface_queue);
}
+static int
+_wayland_tbm_client_is_active_flush_valid(struct wayland_tbm_surface_queue *queue_info)
+{
+ if (queue_info->width != queue_info->active_flush_width ||
+ queue_info->height != queue_info->active_flush_height)
+ return 0;
+
+ return 1;
+}
+
static void
_handle_tbm_surface_queue_can_dequeue_notify(tbm_surface_queue_h surface_queue,
void *data)
return;
}
+ if (!_wayland_tbm_client_is_active_flush_valid(queue_info)) {
+ pthread_mutex_unlock(&queue_info->lock);
+ return;
+ }
+
if (!queue_info->active_flush_done) {
queue_size = queue_info->active_flush_size;
pthread_mutex_unlock(&queue_info->lock);
void
wayland_tbm_server_client_queue_activate(struct wayland_tbm_client_queue *cqueue,
- uint32_t usage, uint32_t queue_size, uint32_t need_flush)
+ uint32_t usage, uint32_t queue_size, uint32_t queue_width,
+ uint32_t queue_height, uint32_t need_flush)
{
struct wl_client *wl_client = NULL;
#endif
WL_TBM_LOG("send active queue pid:%d", cqueue->pid);
- wl_tbm_queue_send_active(cqueue->wl_tbm_queue, usage, queue_size, need_flush);
+ wl_tbm_queue_send_active(cqueue->wl_tbm_queue, usage, queue_size,
+ queue_width, queue_height, need_flush);
wl_client = wl_resource_get_client(cqueue->wl_tbm_queue);
if (wl_client)
void
wayland_tbm_server_client_queue_activate(struct wayland_tbm_client_queue *client_queue,
- uint32_t usage, uint32_t queue_size, uint32_t need_flush);
+ uint32_t usage, uint32_t queue_size, uint32_t queue_width,
+ uint32_t queue_height, uint32_t need_flush);
void
wayland_tbm_server_client_queue_deactivate(struct wayland_tbm_client_queue *client_queue);
i++;
}
- wayland_tbm_server_client_queue_activate(wlt_queue, usage, queue_size, need_flush);
+ wayland_tbm_server_client_queue_activate(wlt_queue, usage, queue_size, width, height, need_flush);
} else {
wayland_tbm_server_client_queue_deactivate(wlt_queue);
}