map/unmap bo of display buffer when output commit 56/250456/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 16 Dec 2020 09:48:34 +0000 (18:48 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 28 Dec 2020 04:08:13 +0000 (13:08 +0900)
if api of tbm_surface is called in callback of delete user data,
it cause deadlock.

Change-Id: Ieae19c8f8d251a57b7e6c7e38ede177c3f78b4a6

src/tdm_fbdev.h
src/tdm_fbdev_display.c

index dd034dbb72fd7a0ecb8c2ae056c55963b248b4b7..bc66fb02fc9ce441d523c5f17d706c55218b0cee 100644 (file)
@@ -151,12 +151,6 @@ struct _tdm_fbdev_display_buffer {
 
        int width;
        int height;
-       int size;
-
-       /*
-        * Buffer's mapped memory
-        */
-       void *mem;
 
        tbm_surface_h buffer;
 };
index 155e9448d2feb733902f1356cfdbf1248714201e..63ee64e7c5c79888ae2b5220b116c139c9c0d524 100644 (file)
@@ -41,7 +41,6 @@ _tdm_fbdev_display_cb_destroy_buffer(tbm_surface_h buffer, void *user_data)
 {
        tdm_fbdev_data *fbdev_data;
        tdm_fbdev_display_buffer *display_buffer;
-       tbm_bo bo;
 
        if (!user_data) {
                TDM_ERR("no user_data");
@@ -62,19 +61,6 @@ _tdm_fbdev_display_cb_destroy_buffer(tbm_surface_h buffer, void *user_data)
 
        LIST_DEL(&display_buffer->link);
 
-       if (display_buffer->mem != NULL) {
-               bo = tbm_surface_internal_get_bo(buffer, 0);
-
-               /*
-                * TODO: Check tbm_bo_unmap return status
-                */
-               tbm_bo_unmap(bo);
-
-               TDM_DBG("unmap success");
-       } else {
-               TDM_DBG("unmap was not called");
-       }
-
        free(display_buffer);
 }
 
@@ -534,6 +520,8 @@ fbdev_output_commit(tdm_output *output, int sync, void *user_data)
        tdm_fbdev_output_data *fbdev_output = (tdm_fbdev_output_data *) output;
        tdm_fbdev_layer_data *fbdev_layer;
        tdm_fbdev_display_buffer *display_buffer;
+       tbm_bo bo;
+       tbm_bo_handle bo_handle;
 
        RETURN_VAL_IF_FAIL(fbdev_output, TDM_ERROR_INVALID_PARAMETER);
 
@@ -548,10 +536,24 @@ fbdev_output_commit(tdm_output *output, int sync, void *user_data)
 
        display_buffer = fbdev_layer->display_buffer;
 
+       bo = tbm_surface_internal_get_bo(display_buffer->buffer, 0);
+       if (!bo) {
+               TDM_ERR("get bo fail");
+               return TDM_ERROR_OPERATION_FAILED;
+       }
+
+       bo_handle = tbm_bo_map(bo, TBM_DEVICE_CPU, TBM_OPTION_READ);
+       if (!bo_handle.ptr) {
+               TDM_ERR("map bo fail");
+               return TDM_ERROR_OPERATION_FAILED;
+       }
+
        /*
         * Display buffer's content to screen
         */
-       memcpy(fbdev_output->mem, display_buffer->mem, display_buffer->size * sizeof(char));
+       memcpy(fbdev_output->mem, bo_handle.ptr, tbm_bo_size(bo) * sizeof(char));
+
+       tbm_bo_unmap(bo);
 
        if (fbdev_output->commit_func) {
                TDM_ERR("trace");
@@ -778,10 +780,6 @@ fbdev_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
        tdm_fbdev_layer_data *fbdev_layer = (tdm_fbdev_layer_data *) layer;
        tdm_fbdev_display_buffer *display_buffer;
        tdm_fbdev_data *fbdev_data;
-       int opt = 0;
-       unsigned int format;
-       tbm_bo bo;
-       tbm_bo_handle bo_handle;
        tdm_error err = TDM_ERROR_NONE;
 
        RETURN_VAL_IF_FAIL(fbdev_layer, TDM_ERROR_INVALID_PARAMETER);
@@ -803,6 +801,8 @@ fbdev_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
                }
 
                display_buffer->buffer = buffer;
+               display_buffer->width = tbm_surface_get_width(buffer);
+               display_buffer->height = tbm_surface_get_height(buffer);
 
                err = tdm_buffer_add_destroy_handler(buffer, _tdm_fbdev_display_cb_destroy_buffer, fbdev_data);
                if (err != TDM_ERROR_NONE) {
@@ -814,33 +814,6 @@ fbdev_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
                LIST_ADDTAIL(&display_buffer->link, &fbdev_data->buffer_list);
        }
 
-       if (display_buffer->mem == NULL) {
-               display_buffer->width = tbm_surface_get_width(buffer);
-               display_buffer->height = tbm_surface_get_height(buffer);
-
-               /*
-                * TODO: We have got drm format here, have to be checked whether
-                *  Framebuffer device supports this format.
-                *  Do we need it at all?
-                */
-               format = tbm_surface_get_format(buffer);
-               (void) format;
-
-               bo = tbm_surface_internal_get_bo(buffer, 0);
-               bo_handle = tbm_bo_map(bo, TBM_DEVICE_CPU, opt);
-
-               display_buffer->size = tbm_bo_size(bo);
-
-               /*
-                * When surface will be about to be destroyed there will have been
-                *  invoked our destroy handler which will unmap bo and free
-                *  display_buffer memory
-                */
-               display_buffer->mem = bo_handle.ptr;
-
-               TDM_DBG("mmap success");
-       }
-
        fbdev_layer->display_buffer = display_buffer;
        fbdev_layer->display_buffer_changed = 1;