free(display_buffer);
}
+static tdm_exynos_display_buffer *
+_tdm_exynos_display_create_buffer(tdm_exynos_data *exynos_data, tbm_surface_h buffer, tdm_error *err)
+{
+ tdm_exynos_display_buffer *display_buffer = NULL;
+ tdm_error res = TDM_ERROR_NONE;
+ int count, i;
+
+ display_buffer = calloc(1, sizeof(tdm_exynos_display_buffer));
+ if (!display_buffer) {
+ TDM_ERR("alloc failed");
+ if (err)
+ *err = TDM_ERROR_OUT_OF_MEMORY;
+ return NULL;
+ }
+
+ display_buffer->buffer = buffer;
+
+ res = tdm_buffer_add_destroy_handler(buffer, _tdm_exynos_display_cb_destroy_buffer, exynos_data);
+ if (res != TDM_ERROR_NONE) {
+ TDM_ERR("add destroy handler fail");
+ free(display_buffer);
+ if (err)
+ *err = res;
+ return NULL;
+ }
+
+ display_buffer->width = tbm_surface_get_width(buffer);
+ display_buffer->height = tbm_surface_get_height(buffer);
+ display_buffer->format = tbm_surface_get_format(buffer);
+ display_buffer->count = tbm_surface_internal_get_num_bos(buffer);
+ count = tbm_surface_internal_get_num_planes(display_buffer->format);
+ TDM_DBG("create buffer:%p %dx%d %c%c%c%c bo_num:%d plane_num:%d",
+ buffer, display_buffer->width, display_buffer->height,
+ FOURCC_STR(display_buffer->format), display_buffer->count, count);
+
+ for (i = 0; i < count; i++) {
+ int bo_idx = 0;
+ tbm_bo bo = NULL;
+
+ bo_idx = tbm_surface_internal_get_plane_bo_idx(buffer, i);
+ bo = tbm_surface_internal_get_bo(buffer, bo_idx);
+ display_buffer->handles[i] = tbm_bo_get_handle(bo, TBM_DEVICE_DEFAULT).u32;
+ display_buffer->fds[i] = tbm_bo_get_handle(bo, TBM_DEVICE_3D).u32;
+
+ tbm_surface_internal_get_plane_data(buffer, i, &display_buffer->size,
+ &display_buffer->offsets[i],
+ &display_buffer->pitches[i]);
+ TDM_DBG(" create buffer:%p plane%d(size:%d offset:%d pitch:%d) bo%d(fd:%d handle:%d)",
+ buffer, i, display_buffer->size, display_buffer->offsets[i],
+ display_buffer->pitches[i], bo_idx, display_buffer->fds[i],
+ display_buffer->handles[i]);
+ }
+
+ if (IS_RGB(display_buffer->format))
+ display_buffer->width = display_buffer->pitches[0] >> 2;
+ else
+ display_buffer->width = display_buffer->pitches[0];
+
+ LIST_ADDTAIL(&display_buffer->link, &exynos_data->buffer_list);
+
+ if (err)
+ *err = TDM_ERROR_NONE;
+
+ return display_buffer;
+}
+
tdm_exynos_output_data *
_tdm_exynos_display_create_output_LCD(tdm_exynos_data *exynos_data)
{
tdm_exynos_data *exynos_data;
tdm_exynos_display_buffer *display_buffer;
tdm_error err = TDM_ERROR_NONE;
- int i, count;
RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
RETURN_VAL_IF_FAIL(surface, TDM_ERROR_INVALID_PARAMETER);
exynos_data = layer_data->exynos_data;
display_buffer = _tdm_exynos_display_find_buffer(exynos_data, surface);
if (!display_buffer) {
- display_buffer = calloc(1, sizeof(tdm_exynos_display_buffer));
- if (!display_buffer) {
- TDM_ERR("alloc failed");
- return TDM_ERROR_OUT_OF_MEMORY;
- }
- display_buffer->buffer = surface;
-
- err = tdm_buffer_add_destroy_handler(surface,
- _tdm_exynos_display_cb_destroy_buffer, exynos_data);
- if (err != TDM_ERROR_NONE) {
- TDM_ERR("add destroy handler fail");
- free(display_buffer);
- return TDM_ERROR_OPERATION_FAILED;
- }
- LIST_ADDTAIL(&display_buffer->link, &exynos_data->buffer_list);
-
- display_buffer->width = tbm_surface_get_width(surface);
- display_buffer->height = tbm_surface_get_height(surface);
- display_buffer->format = tbm_surface_get_format(surface);
- display_buffer->count = tbm_surface_internal_get_num_bos(surface);
- count = tbm_surface_internal_get_num_planes(display_buffer->format);
- TDM_DBG("set buffer layer(%d): %dx%d %c%c%c%c bo_num:%d plane_num:%d",
- layer_data->capabilities,
- display_buffer->width, display_buffer->height,
- FOURCC_STR(display_buffer->format), display_buffer->count, count);
-
- for (i = 0; i < display_buffer->count; i++) {
- tbm_bo bo = tbm_surface_internal_get_bo(surface, i);
- display_buffer->handles[i] = tbm_bo_get_handle(bo, TBM_DEVICE_DEFAULT).u32;
- display_buffer->fds[i] = tbm_bo_get_handle(bo, TBM_DEVICE_MM).u32; /* ToDo */
- TDM_DBG(" set buffer layer(%d): bo%d(fd:%d handle:%d)",
- layer_data->capabilities,
- i, display_buffer->fds[i], display_buffer->handles[i]);
- }
- for (i = 0; i < count; i++) {
- tbm_surface_internal_get_plane_data(surface, i, &display_buffer->size,
- &display_buffer->offsets[i],
- &display_buffer->pitches[i]);
- TDM_DBG(" set buffer layer(%d): plane%d(size:%d offset:%d pitch:%d)",
- layer_data->capabilities,
- i, display_buffer->size, display_buffer->offsets[i],
- display_buffer->pitches[i]);
- }
-
- if (IS_RGB(display_buffer->format))
- display_buffer->width = display_buffer->pitches[0] >> 2;
- else
- display_buffer->width = display_buffer->pitches[0];
+ display_buffer = _tdm_exynos_display_create_buffer(exynos_data, surface, &err);
+ RETURN_VAL_IF_FAIL(display_buffer != NULL, err);
}
if (layer_data->display_buffer != display_buffer) {