check the has_atomic when the output_commit 19/201619/1
authorSooChan Lim <sc1.lim@samsung.com>
Mon, 18 Mar 2019 07:16:55 +0000 (16:16 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 18 Mar 2019 07:16:55 +0000 (16:16 +0900)
check whether it does atomit_commit or layers_commit.

Change-Id: I2792b465a7133d12cfeff03683511b154aa6df59

src/tdm_vc4_display.c

index c2909a1..c60fb09 100644 (file)
@@ -402,7 +402,6 @@ _tdm_vc4_display_wait_vblank(int fd, int pipe, uint *target_msc, void *data)
        return TDM_ERROR_NONE;
 }
 
-#if 0
 static tdm_error
 _tdm_vc4_display_commit_layer(tdm_vc4_layer_data *layer_data)
 {
@@ -474,7 +473,6 @@ _tdm_vc4_display_commit_layer(tdm_vc4_layer_data *layer_data)
 
        return TDM_ERROR_NONE;
 }
-#endif
 
 static void
 _tdm_vc4_display_cb_event(int fd, unsigned int sequence,
@@ -1816,8 +1814,8 @@ _vc4_layer_make_atomic_request(tdm_vc4_layer_data *layer_data, drmModeAtomicReqP
        return TDM_ERROR_NONE;
 }
 
-tdm_error
-vc4_output_commit(tdm_output *output, int sync, void *user_data)
+static tdm_error
+_vc4_output_atomic_commit(tdm_output *output, int sync, void *user_data)
 {
        tdm_vc4_output_data *output_data = output;
        tdm_vc4_layer_data *layer_data = NULL;
@@ -1895,32 +1893,30 @@ vc4_output_commit(tdm_output *output, int sync, void *user_data)
 
        drmModeAtomicFree(request);
 
-#if 0
+       return TDM_ERROR_NONE;
+}
+
+static tdm_error
+_vc4_output_layers_commit(tdm_output *output, int sync, void *user_data)
+{
+       tdm_vc4_output_data *output_data = output;
        tdm_vc4_data *vc4_data;
-       vc4_data = output_data->vc4_data;
-       int do_waitvblank = 0;
+       tdm_vc4_layer_data *layer_data = NULL;
+       tdm_error ret;
+       int do_waitvblank = 1;
 
-       event_data = calloc(1, sizeof(tdm_vc4_event_data));
-       if (!event_data) {
-               TDM_ERR("fail to alloc event_data.");
-               drmModeAtomicFree(request);
-               return TDM_ERROR_OUT_OF_MEMORY;
-       }
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
 
-       event_data->type = TDM_DRM_EVENT_TYPE_COMMIT;
-       event_data->output_data = output_data;
-       event_data->user_data = user_data;
+       vc4_data = output_data->vc4_data;
 
        LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link) {
                ret = _tdm_vc4_display_commit_layer(layer_data);
-               if (ret != TDM_ERROR_NONE) {
-                       free(event_data);
+               if (ret != TDM_ERROR_NONE)
                        return ret;
-               }
        }
 
        if (do_waitvblank == 1) {
-               event_data = calloc(1, sizeof(tdm_vc4_event_data));
+               tdm_vc4_event_data *event_data = calloc(1, sizeof(tdm_vc4_event_data));
                uint target_msc;
 
                if (!event_data) {
@@ -1948,7 +1944,35 @@ vc4_output_commit(tdm_output *output, int sync, void *user_data)
                        return ret;
                }
        }
-#endif
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+vc4_output_commit(tdm_output *output, int sync, void *user_data)
+{
+       tdm_vc4_output_data *output_data = output;
+       tdm_vc4_data *vc4_data;
+       tdm_error ret = TDM_ERROR_NONE;
+
+       RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
+       vc4_data = output_data->vc4_data;
+
+       /* check the atomic pageflip */
+       if (vc4_data->has_atomic) {
+               ret = _vc4_output_atomic_commit(output, sync, user_data);
+               if (ret != TDM_ERROR_NONE) {
+                       TDM_ERR("_vc4_output_atomic_commit failed.");
+                       return ret;
+               }
+       } else {
+               ret = _vc4_output_layers_commit(output, sync, user_data);
+               if (ret != TDM_ERROR_NONE) {
+                       TDM_ERR("_vc4_output_layers_commit failed.");
+                       return ret;
+               }
+       }
 
        return TDM_ERROR_NONE;
 }