+static void
+_tdm_layer_reset_pending_data(tdm_private_layer *private_layer)
+{
+ private_layer->pending_info_changed = 0;
+ memset(&private_layer->pending_info, 0, sizeof private_layer->pending_info);
+
+ private_layer->pending_buffer_changed = 0;
+ if (private_layer->pending_buffer) {
+ tbm_surface_internal_unref(private_layer->pending_buffer);
+ private_layer->pending_buffer = NULL;
+ }
+}
+
+INTERN tdm_error
+tdm_layer_commit_pending_data(tdm_private_layer *private_layer)
+{
+ tdm_private_module *private_module;
+ tdm_func_layer *func_layer;
+ tdm_error ret = TDM_ERROR_NONE;
+
+ private_module = private_layer->private_module;
+ func_layer = &private_module->func_layer;
+
+ if (private_layer->pending_info_changed) {
+ ret = func_layer->layer_set_info(private_layer->layer_backend, &private_layer->pending_info);
+ TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
+ }
+
+ if (private_layer->pending_buffer_changed) {
+ tdm_private_layer_buffer *layer_buffer;
+
+ layer_buffer = calloc(1, sizeof(tdm_private_layer_buffer));
+ TDM_GOTO_IF_FAIL(layer_buffer != NULL, done);
+
+ LIST_INITHEAD(&layer_buffer->link);
+
+ ret = func_layer->layer_set_buffer(private_layer->layer_backend, private_layer->pending_buffer);
+ TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
+
+ if (tdm_debug_module & TDM_DEBUG_BUFFER)
+ TDM_INFO("layer(%p,%d) pending_buffer(%p) committed",
+ private_layer, private_layer->index, private_layer->pending_buffer);
+
+ if (ret == TDM_ERROR_NONE) {
+ if (private_layer->waiting_buffer)
+ tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer);
+
+ private_layer->waiting_buffer = layer_buffer;
+ private_layer->waiting_buffer->buffer = tdm_buffer_ref_backend(private_layer->pending_buffer);
+ if (tdm_debug_module & TDM_DEBUG_BUFFER)
+ TDM_INFO("layer(%p,%d) waiting_buffer(%p)",
+ private_layer, private_layer->index, private_layer->waiting_buffer->buffer);
+ } else
+ tdm_layer_free_buffer(private_layer, layer_buffer);
+ }
+
+done:
+ _tdm_layer_reset_pending_data(private_layer);
+
+ return ret;
+}
+