struct list_head buffer_list;
tbm_bufmgr bufmgr;
- tdm_private_client_buffer *commit_buffer;
+ tdm_private_client_buffer *attach_buffer;
} tdm_private_client_voutput;
struct _tdm_private_client_vblank {
}
void
+tdm_client_voutput_cb_attach_buffer(void *data,
+ struct wl_tdm_voutput *wl_voutput,
+ struct wl_buffer *wl_buffer)
+{
+ tdm_private_client_voutput *private_voutput = (tdm_private_client_voutput *)data;
+ tdm_private_client_buffer *cb = NULL, *cbb = NULL;
+
+ TDM_RETURN_IF_FAIL(private_voutput != NULL);
+
+ LIST_FOR_EACH_ENTRY_SAFE(cb, cbb, &private_voutput->buffer_list, link) {
+ if (wl_buffer == cb->wl_buffer) {
+ private_voutput->attach_buffer = cb;
+ break;
+ }
+ }
+
+ return;
+}
+
+void
tdm_client_voutput_cb_commit(void *data, struct wl_tdm_voutput *wl_voutput)
{
tdm_private_client_voutput *private_voutput;
tdm_client_voutput_cb_buffer_import_with_id,
tdm_client_voutput_cb_buffer_import_with_fd,
tdm_client_voutput_cb_buffer_destroy,
+ tdm_client_voutput_cb_attach_buffer,
tdm_client_voutput_cb_commit,
tdm_client_voutput_cb_ack_message
};
TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
private_voutput = (tdm_private_client_voutput *)voutput;
+ private_voutput->attach_buffer = NULL;
wl_tdm_voutput_commit_done(private_voutput->wl_voutput);
return TDM_ERROR_NONE;
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 {
struct list_head buffer_list;
tdm_server_voutput_buffer *attach_buffer;
+ int committing;
} tdm_server_voutput_info;
typedef struct _tdm_server_vblank_info {
// 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 = {
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);
}
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;
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;
}
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;
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));
}
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;
}
}
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;
}
}
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);