int usage;
struct wl_list attach_bufs;
+ int active_flush_invalid;
+ int active_flush_reset;
+
tbm_surface_queue_h tbm_queue;
struct wl_tbm *wl_tbm;
pthread_mutex_lock(&queue_info->lock);
- if (queue_info->is_active && queue_info->active_flush) {
+ if (queue_info->is_active && queue_info->active_flush && !queue_info->active_flush_invalid) {
wl_list_for_each_reverse(buffer, &queue_info->attach_bufs, link) {
if (!buffer->allocated && buffer->usable && !buffer->expire) {
if (_wayland_tbm_client_is_valid_attach_bufs(queue_info, buffer)) {
wl_buffer_destroy(wl_buffer);
}
+static int
+_wayland_tbm_client_is_active_flush_valid(struct wayland_tbm_surface_queue *queue_info)
+{
+ struct wayland_tbm_buffer *buffer;
+
+ if (wl_list_empty(&queue_info->attach_bufs)) return 0;
+
+ wl_list_for_each_reverse(buffer, &queue_info->attach_bufs, link) {
+ if (buffer->expire) continue;
+
+ if (_wayland_tbm_client_is_valid_attach_bufs(queue_info, buffer))
+ return 1;
+ }
+
+ return 0;
+}
+
static void
handle_tbm_queue_active(void *data,
struct wl_tbm_queue *wl_tbm_queue,
queue_info->is_active = 1;
queue_info->usage = usage;
- if (need_flush)
+ if (need_flush) {
queue_info->active_flush = need_flush;
+ if (!_wayland_tbm_client_is_active_flush_valid(queue_info)) {
+ WL_TBM_LOG("active_flush invalid queue");
+ queue_info->active_flush_invalid = 1;
+ pthread_mutex_unlock(&queue_info->lock);
+ return;
+ }
+
+ queue_info->active_flush_reset = 1;
+ }
+
tbm_queue = queue_info->tbm_queue;
pthread_mutex_unlock(&queue_info->lock);
return;
}
- queue_info->is_active = 0;
-
if (queue_info->active_flush) {
queue_info->active_flush = 0;
_wayland_tbm_client_queue_get_attach_bufs(queue_info, 1, surfaces, &count);
/* flush the attached surfaces */
_wayland_tbm_client_queue_destroy_unused_attach_bufs(queue_info, &flush);
- need_flush = 1;
+
+ if (!queue_info->active_flush_invalid)
+ need_flush = 1;
}
}
+ queue_info->is_active = 0;
+ queue_info->active_flush_invalid = 0;
+
tbm_queue = queue_info->tbm_queue;
queue_size = queue_info->queue_size;
void *data)
{
struct wayland_tbm_surface_queue *queue_info = data;
+ int recover_size = 0;
int width;
int height;
int format;
+ int queue_size;
#ifdef DEBUG_TRACE
WL_TBM_TRACE(" pid:%d", getpid());
width = tbm_surface_queue_get_width(surface_queue);
height = tbm_surface_queue_get_height(surface_queue);
format = tbm_surface_queue_get_format(surface_queue);
+ queue_size = tbm_surface_queue_get_size(surface_queue);
pthread_mutex_lock(&queue_info->lock);
queue_info->height = height;
queue_info->format = format;
+ if (queue_info->is_active && queue_info->active_flush) {
+ if (queue_info->active_flush_reset) {
+ queue_info->active_flush_reset = 0;
+ }
+ else {
+ WL_TBM_LOG("active_flush invalid queue");
+ queue_info->active_flush_invalid = 1;
+ if (queue_size != queue_info->queue_size)
+ recover_size = queue_info->queue_size;
+ }
+ }
+
pthread_mutex_unlock(&queue_info->lock);
+
+ if (recover_size)
+ tbm_surface_queue_set_size(surface_queue, recover_size, 0);
}
static void
}
if (queue_info->active_flush) {
+ if (queue_info->active_flush_invalid) {
+ pthread_mutex_unlock(&queue_info->lock);
+ return 0;
+ }
+
if (wl_list_empty(&queue_info->attach_bufs)) {
pthread_mutex_unlock(&queue_info->lock);
return 0;