static void _tdm_layer_committed(tdm_private_layer *private_layer);
static void _tdm_layer_cb_wait_vblank(tdm_vblank *vblank, tdm_error error, unsigned int sequence,
unsigned int tv_sec, unsigned int tv_usec, void *user_data);
+static void _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data);
+static void _tbm_layer_queue_destroy_cb(tbm_surface_queue_h surface_queue, void *data);
EXTERN tdm_error
tdm_display_get_capabilities(tdm_display *dpy,
tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
{
tdm_func_layer *func_layer;
+ tdm_private_layer_buffer *layer_buffer;
LAYER_FUNC_ENTRY();
return TDM_ERROR_NOT_IMPLEMENTED;
}
+ layer_buffer = calloc(1, sizeof * layer_buffer);
+ if (!layer_buffer) {
+ _pthread_mutex_unlock(&private_display->lock);
+ TDM_ERR("alloc failed");
+ return TDM_ERROR_OUT_OF_MEMORY;
+ }
+
ret = func_layer->layer_set_buffer(private_layer->layer_backend, buffer);
TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
*/
if (private_layer->waiting_buffer) {
_pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->waiting_buffer);
+ tdm_buffer_unref_backend(private_layer->waiting_buffer->buffer);
_pthread_mutex_lock(&private_display->lock);
+ free(private_layer->waiting_buffer);
}
- private_layer->waiting_buffer = tdm_buffer_ref_backend(buffer);
+ private_layer->waiting_buffer = layer_buffer;
+ private_layer->waiting_buffer->buffer = tdm_buffer_ref_backend(buffer);
if (tdm_debug_module & TDM_DEBUG_BUFFER)
TDM_INFO("layer(%p) waiting_buffer(%p)",
- private_layer, private_layer->waiting_buffer);
- }
+ private_layer, private_layer->waiting_buffer->buffer);
+ } else
+ free(layer_buffer);
_pthread_mutex_unlock(&private_display->lock);
func_layer = &private_display->func_layer;
+ if (private_layer->buffer_queue) {
+ if (private_layer->waiting_buffer)
+ tbm_surface_queue_release(private_layer->buffer_queue, private_layer->waiting_buffer->buffer);
+ if (private_layer->showing_buffer)
+ tbm_surface_queue_release(private_layer->buffer_queue, private_layer->showing_buffer->buffer);
+ tbm_surface_queue_remove_acquirable_cb(private_layer->buffer_queue, _tbm_layer_queue_acquirable_cb, layer);
+ tbm_surface_queue_remove_destroy_cb(private_layer->buffer_queue, _tbm_layer_queue_destroy_cb, layer);
+ private_layer->buffer_queue = NULL;
+ }
+
if (private_layer->waiting_buffer) {
_pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->waiting_buffer);
+ tdm_buffer_unref_backend(private_layer->waiting_buffer->buffer);
_pthread_mutex_lock(&private_display->lock);
+ free(private_layer->waiting_buffer);
private_layer->waiting_buffer = NULL;
if (tdm_debug_module & TDM_DEBUG_BUFFER)
if (private_layer->showing_buffer) {
_pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->showing_buffer);
+ tdm_buffer_unref_backend(private_layer->showing_buffer->buffer);
_pthread_mutex_lock(&private_display->lock);
+ free(private_layer->showing_buffer);
private_layer->showing_buffer = NULL;
if (tdm_debug_module & TDM_DEBUG_BUFFER)
if (private_layer->showing_buffer) {
_pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->showing_buffer);
+ tdm_buffer_unref_backend(private_layer->showing_buffer->buffer);
_pthread_mutex_lock(&private_display->lock);
if (private_layer->buffer_queue) {
_pthread_mutex_unlock(&private_display->lock);
tbm_surface_queue_release(private_layer->buffer_queue,
- private_layer->showing_buffer);
+ private_layer->showing_buffer->buffer);
_pthread_mutex_lock(&private_display->lock);
}
}
if (tdm_debug_module & TDM_DEBUG_BUFFER)
TDM_INFO("layer(%p) waiting_buffer(%p) showing_buffer(%p)",
private_layer, private_layer->waiting_buffer,
- private_layer->showing_buffer);
+ (private_layer->showing_buffer) ? private_layer->showing_buffer->buffer : NULL);
}
static void
*error = TDM_ERROR_NONE;
if (private_layer->showing_buffer) {
- buffer = private_layer->showing_buffer;
+ buffer = private_layer->showing_buffer->buffer;
} else {
if (error)
*error = TDM_ERROR_OPERATION_FAILED;
tdm_layer *layer = data;
tdm_func_layer *func_layer;
tbm_surface_h surface = NULL;
+ tdm_private_layer_buffer *layer_buffer;
LAYER_FUNC_ENTRY_VOID_RETURN();
_pthread_mutex_lock(&private_display->lock);
return;
}
+ layer_buffer = calloc(1, sizeof * layer_buffer);
+ if (!layer_buffer) {
+ _pthread_mutex_unlock(&private_display->lock);
+ TDM_ERR("alloc failed");
+ return;
+ }
+
if (TBM_SURFACE_QUEUE_ERROR_NONE != tbm_surface_queue_acquire(private_layer->buffer_queue, &surface) ||
surface == NULL) {
TDM_ERR("layer(%p) tbm_surface_queue_acquire() failed surface:%p",
private_layer, surface);
_pthread_mutex_unlock(&private_display->lock);
+ free(layer_buffer);
return;
}
if (ret == TDM_ERROR_NONE) {
if (private_layer->waiting_buffer) {
- TDM_DBG("layer(%p) drop waiting_buffer(%p)", private_layer, private_layer->waiting_buffer);
+ TDM_DBG("layer(%p) drop waiting_buffer(%p)", private_layer, private_layer->waiting_buffer->buffer);
_pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->waiting_buffer);
+ tdm_buffer_unref_backend(private_layer->waiting_buffer->buffer);
tbm_surface_queue_release(private_layer->buffer_queue,
- private_layer->waiting_buffer);
+ private_layer->waiting_buffer->buffer);
_pthread_mutex_lock(&private_display->lock);
+ free(private_layer->waiting_buffer);
}
- private_layer->waiting_buffer = tdm_buffer_ref_backend(surface);
+ private_layer->waiting_buffer = layer_buffer;
+ private_layer->waiting_buffer->buffer = tdm_buffer_ref_backend(surface);
if (tdm_debug_module & TDM_DEBUG_BUFFER)
TDM_INFO("layer(%p) waiting_buffer(%p)",
- private_layer, private_layer->waiting_buffer);
+ private_layer, private_layer->waiting_buffer->buffer);
if (private_display->commit_type == TDM_COMMIT_TYPE_OUTPUT) {
ret = _tdm_output_commit(private_layer->private_output, 0, NULL, NULL);
} else {
TDM_NEVER_GET_HERE();
}
- }
+ } else
+ free(layer_buffer);
_pthread_mutex_unlock(&private_display->lock);
}
if (private_layer->waiting_buffer) {
_pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->waiting_buffer);
+ tdm_buffer_unref_backend(private_layer->waiting_buffer->buffer);
tbm_surface_queue_release(private_layer->buffer_queue,
- private_layer->waiting_buffer);
+ private_layer->waiting_buffer->buffer);
_pthread_mutex_lock(&private_display->lock);
+ free(private_layer->waiting_buffer);
+ private_layer->waiting_buffer = NULL;
}
private_layer->buffer_queue = NULL;
if (private_layer->waiting_buffer) {
_pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->waiting_buffer);
+ tdm_buffer_unref_backend(private_layer->waiting_buffer->buffer);
tbm_surface_queue_release(private_layer->buffer_queue,
- private_layer->waiting_buffer);
+ private_layer->waiting_buffer->buffer);
+ free(private_layer->waiting_buffer);
private_layer->waiting_buffer = NULL;
_pthread_mutex_lock(&private_display->lock);
EXTERN tdm_error
tdm_layer_unset_buffer_queue(tdm_layer *layer)
{
- tdm_func_layer *func_layer;
- LAYER_FUNC_ENTRY();
-
- _pthread_mutex_lock(&private_display->lock);
-
- func_layer = &private_display->func_layer;
-
- if (private_layer->waiting_buffer) {
- _pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->waiting_buffer);
- tbm_surface_queue_release(private_layer->buffer_queue,
- private_layer->waiting_buffer);
- private_layer->waiting_buffer = NULL;
- _pthread_mutex_lock(&private_display->lock);
-
- if (tdm_debug_module & TDM_DEBUG_BUFFER)
- TDM_INFO("layer(%p) waiting_buffer(%p)",
- private_layer, private_layer->waiting_buffer);
- }
-
- if (private_layer->showing_buffer) {
- _pthread_mutex_unlock(&private_display->lock);
- tdm_buffer_unref_backend(private_layer->showing_buffer);
- tbm_surface_queue_release(private_layer->buffer_queue,
- private_layer->showing_buffer);
- _pthread_mutex_lock(&private_display->lock);
- private_layer->showing_buffer = NULL;
-
- if (tdm_debug_module & TDM_DEBUG_BUFFER)
- TDM_INFO("layer(%p) showing_buffer(%p)",
- private_layer, private_layer->showing_buffer);
- }
-
- tbm_surface_queue_remove_acquirable_cb(private_layer->buffer_queue, _tbm_layer_queue_acquirable_cb, layer);
- tbm_surface_queue_remove_destroy_cb(private_layer->buffer_queue, _tbm_layer_queue_destroy_cb, layer);
- private_layer->buffer_queue = NULL;
- private_layer->usable = 1;
-
- if (private_layer->usable)
- TDM_INFO("layer(%p) now usable", private_layer);
-
- if (!func_layer->layer_unset_buffer) {
- _pthread_mutex_unlock(&private_display->lock);
- TDM_ERR("not implemented!!");
- return TDM_ERROR_NOT_IMPLEMENTED;
- }
-
- ret = func_layer->layer_unset_buffer(private_layer->layer_backend);
-
- _pthread_mutex_unlock(&private_display->lock);
-
- return ret;
+ return tdm_layer_unset_buffer(layer);
}
EXTERN tdm_error