X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftdm_server.c;h=aa546e6444b15a59b5602f8d57cf81576e841b75;hb=b86fd8a4f6e17ca00edd5345b862aa8c08756331;hp=e301ab3d659c816c0816dfd1cc6564df48e8114c;hpb=2151dd496cc649dbeabc2e180e5fb0f7bd99c91c;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/src/tdm_server.c b/src/tdm_server.c index e301ab3..aa546e6 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -71,7 +71,7 @@ typedef struct _tdm_server_output_info { typedef struct _tdm_server_voutput_buffer { struct list_head link; struct wl_resource *wl_buffer; - tbm_surface_h surface; + tbm_surface_h buffer; } tdm_server_voutput_buffer; typedef struct _tdm_server_voutput_info { @@ -93,6 +93,7 @@ typedef struct _tdm_server_voutput_info { struct list_head buffer_list; tdm_server_voutput_buffer *attach_buffer; + int committing; } tdm_server_voutput_info; typedef struct _tdm_server_vblank_info { @@ -813,6 +814,9 @@ _tdm_voutput_cb_commit_done(struct wl_client *client, struct wl_resource *resour // handle error return; } +// tdm_output_commit_done(voutput_info->output, voutput_info->attach_buffer->buffer); + voutput_info->committing = 0; + voutput_info->attach_buffer = NULL; } static const struct wl_tdm_voutput_interface tdm_voutput_implementation = { @@ -845,7 +849,7 @@ _tdm_voutput_buffer_destory(struct wl_resource *wl_buffer) LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) { if (vb->wl_buffer == wl_buffer) { - tbm_surface_internal_unref(vb->surface); + tbm_surface_internal_unref(vb->buffer); wl_resource_set_user_data(wl_buffer, NULL); free(vb); } @@ -873,7 +877,7 @@ _tdm_voutput_create_wl_buffer(tdm_server_voutput_info *voutput_info) struct wl_resource * _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info, - tbm_surface_h surface) + tbm_surface_h buffer) { int bufs[TBM_SURF_PLANE_MAX] = { -1, -1, -1, -1}; struct wl_resource *wl_buffer = NULL; @@ -884,9 +888,9 @@ _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info, int *p; TDM_RETURN_VAL_IF_FAIL(voutput_info != NULL, NULL); - TDM_RETURN_VAL_IF_FAIL(surface != NULL, NULL); + TDM_RETURN_VAL_IF_FAIL(buffer != NULL, NULL); - if (tbm_surface_get_info(surface, &info) != TBM_SURFACE_ERROR_NONE) { + if (tbm_surface_get_info(buffer, &info) != TBM_SURFACE_ERROR_NONE) { TDM_ERR("Failed to create buffer from surface"); return NULL; } @@ -896,14 +900,14 @@ _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info, return NULL; } - num_buf = tbm_surface_internal_get_num_bos(surface); + num_buf = tbm_surface_internal_get_num_bos(buffer); if (num_buf == 0) { TDM_ERR("surface doesn't have any bo."); return NULL; } for (i = 0; i < num_buf; i++) { - tbm_bo bo = tbm_surface_internal_get_bo(surface, i); + tbm_bo bo = tbm_surface_internal_get_bo(buffer, i); if (bo == NULL) { TDM_ERR("Failed to get bo from surface"); goto err; @@ -944,7 +948,7 @@ _tdm_voutput_export_buffer(tdm_server_voutput_info *voutput_info, for (i = 0; i < 3; i++) { p = wl_array_add(&plane_buf_idx, sizeof(int)); - *p = tbm_surface_internal_get_plane_bo_idx(surface, i); + *p = tbm_surface_internal_get_plane_bo_idx(buffer, i); p = wl_array_add(&plane_offset, sizeof(int)); *p = info.planes[i].offset; p = wl_array_add(&plane_stride, sizeof(int)); @@ -991,47 +995,47 @@ err: } tdm_server_voutput_buffer * -_tdm_output_get_voutput_buffer(tdm_server_voutput_info *voutput_info, tbm_surface_h surface) +_tdm_output_get_voutput_buffer(tdm_server_voutput_info *voutput_info, tbm_surface_h buffer) { tdm_server_voutput_buffer *voutput_buffer = NULL, *vb = NULL; LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) { - if (vb && vb->surface == surface) + if (vb && vb->buffer == buffer) return vb; } - tbm_surface_internal_ref(surface); + tbm_surface_internal_ref(buffer); voutput_buffer = calloc(1, sizeof *voutput_buffer); if (!voutput_buffer) { /* LCOV_EXCL_START */ TDM_ERR("fail calloc"); - tbm_surface_internal_unref(surface); + tbm_surface_internal_unref(buffer); return NULL; /* LCOV_EXCL_STOP */ } - voutput_buffer->wl_buffer = _tdm_voutput_export_buffer(voutput_info, surface); + voutput_buffer->wl_buffer = _tdm_voutput_export_buffer(voutput_info, buffer); if (!voutput_buffer->wl_buffer) { /* LCOV_EXCL_START */ TDM_ERR("fail export buffer"); free(voutput_buffer); - tbm_surface_internal_unref(surface); + tbm_surface_internal_unref(buffer); return NULL; /* LCOV_EXCL_STOP */ } - voutput_buffer->surface = surface; + voutput_buffer->buffer = buffer; LIST_ADDTAIL(&voutput_info->link, &voutput_info->buffer_list); return voutput_buffer; } INTERN tdm_error -tdm_output_send_buffer(tdm_output *output, tbm_surface_h surface) +tdm_output_send_buffer(tdm_output *output, tbm_surface_h buffer) { tdm_private_server *private_server = keep_private_server; tdm_server_voutput_info *voutput_info = NULL, *vo = NULL; @@ -1046,16 +1050,19 @@ tdm_output_send_buffer(tdm_output *output, tbm_surface_h surface) } } TDM_RETURN_VAL_IF_FAIL(voutput_info != NULL, TDM_ERROR_INVALID_PARAMETER); + TDM_RETURN_VAL_IF_FAIL(voutput_info->attach_buffer == NULL, TDM_ERROR_OPERATION_FAILED); - voutput_buffer = _tdm_output_get_voutput_buffer(voutput_info, surface); + voutput_buffer = _tdm_output_get_voutput_buffer(voutput_info, buffer); TDM_RETURN_VAL_IF_FAIL(voutput_buffer != NULL, TDM_ERROR_OUT_OF_MEMORY); voutput_info->attach_buffer = voutput_buffer; + wl_tdm_voutput_send_attach_buffer(voutput_info->resource, voutput_buffer->wl_buffer); + return TDM_ERROR_NONE; } -tdm_error +INTERN tdm_error tdm_output_commit_buffer(tdm_output *output) { tdm_private_server *private_server = keep_private_server; @@ -1070,7 +1077,10 @@ tdm_output_commit_buffer(tdm_output *output) } } TDM_RETURN_VAL_IF_FAIL(voutput_info != NULL, TDM_ERROR_INVALID_PARAMETER); - TDM_RETURN_VAL_IF_FAIL(voutput_info->attach_buffer != NULL, TDM_ERROR_INVALID_PARAMETER); + TDM_RETURN_VAL_IF_FAIL(voutput_info->attach_buffer != NULL, TDM_ERROR_OPERATION_FAILED); + TDM_RETURN_VAL_IF_FAIL(voutput_info->committing == 0, TDM_ERROR_OPERATION_FAILED); + + voutput_info->committing = 1; wl_tdm_voutput_send_commit(voutput_info->resource);