display: add display_create_buffer function 20/204120/3
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 19 Apr 2019 10:06:50 +0000 (19:06 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 22 Apr 2019 09:11:43 +0000 (18:11 +0900)
- remove unused fb_id of display_buffer
- set handle and fd to all planes of display_buffer

Change-Id: I1a915cf7c8481b12556923ab50286d19e4aacfa7

src/tdm_exynos_display.c
src/tdm_exynos_types.h

index 035b482ec377bd8264f3b75a858a427cbe4e48fc..f3a00c7f569bfe98d9647eb86da628415141d562 100644 (file)
@@ -622,6 +622,72 @@ _tdm_exynos_display_cb_destroy_buffer(tbm_surface_h buffer, void *user_data)
        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)
 {
@@ -1710,7 +1776,6 @@ exynos_layer_set_buffer(tdm_layer *layer, tbm_surface_h surface)
        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);
@@ -1720,54 +1785,8 @@ exynos_layer_set_buffer(tdm_layer *layer, tbm_surface_h surface)
        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) {
index 0e8cc4a8f2e91ba3579b9f399226fb000ab6d716..82995241010169d67d5e2dad862ed6d12b783642 100644 (file)
@@ -156,7 +156,6 @@ struct _tdm_exynos_vblank_data_s {
 typedef struct _tdm_exynos_display_buffer {
        struct list_head link;
 
-       unsigned int fb_id;
        tbm_surface_h buffer;
        int width;
        unsigned int height;