capture: support hwc capture 42/203242/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 11 Apr 2019 04:35:54 +0000 (13:35 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 11 Apr 2019 04:35:59 +0000 (13:35 +0900)
Change-Id: I1dc32e1b4b085a4b5fec35aa399c77ad31d14631
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/tdm_sprd_capture.c

index 2074a61..9bd0969 100644 (file)
@@ -5,6 +5,8 @@
 #include "tdm_sprd.h"
 #include "tdm_helper.h"
 
+#define NUM_LAYERS  2
+
 typedef struct _tdm_sprd_capture_buffer {
        tbm_surface_h buffer;
        struct list_head link;
@@ -421,12 +423,11 @@ _tdm_sprd_capture_oneshot_composite_layers_sw(tdm_sprd_capture_data *capture_dat
        tbm_surface_info_s buf_info;
        const tdm_output_mode *current_mode = NULL;
        tbm_surface_h surface = NULL;
-       tdm_layer **tdm_layer_array = NULL;
        tdm_sprd_capture_composite *composite_data = NULL;
        tdm_sprd_capture_pp_data ** pp_tasks = NULL;
-       int layer_count = 0;
        int int_err, i;
        tdm_error tdm_err = TDM_ERROR_NONE;
+
        if ((sprd_output_get_mode(capture_data->output_data, &current_mode)) != TDM_ERROR_NONE) {
                TDM_ERR("can't get output mode");
                return TDM_ERROR_OPERATION_FAILED;
@@ -438,15 +439,7 @@ _tdm_sprd_capture_oneshot_composite_layers_sw(tdm_sprd_capture_data *capture_dat
 
        int_err = tbm_surface_get_info(buffer, &buf_info);
        RETURN_VAL_IF_FAIL(int_err == TBM_SURFACE_ERROR_NONE, TDM_ERROR_BAD_REQUEST);
-       tdm_layer_array = sprd_output_get_layers(capture_data->output_data, &layer_count, &tdm_err);
-       if (tdm_err != TDM_ERROR_NONE) {
-               TDM_WRN("can't get layers list");
-               goto fail;
-       }
-       if (layer_count == 0) {
-               TDM_WRN("layer list is empty nothing to capture");
-               goto fail;
-       }
+
        composite_data = calloc(1, sizeof(tdm_sprd_capture_composite));
        if (composite_data == NULL) {
                TDM_WRN("Out of memory");
@@ -456,33 +449,40 @@ _tdm_sprd_capture_oneshot_composite_layers_sw(tdm_sprd_capture_data *capture_dat
 
        composite_data->client_buffer = tdm_buffer_ref_backend(buffer);
        LIST_ADD(&composite_data->link, &capture_data->composite_list);
-       pp_tasks = calloc(layer_count, sizeof(tdm_sprd_capture_pp_data *));
+       pp_tasks = calloc(NUM_LAYERS, sizeof(tdm_sprd_capture_pp_data *));
        if (pp_tasks == NULL) {
                TDM_WRN("Out of memory");
                tdm_err = TDM_ERROR_OUT_OF_MEMORY;
                goto fail;
        }
-       for (i = 0; i < layer_count; ++i) {
+       for (i = 0; i < NUM_LAYERS; ++i) {
+               tdm_sprd_output_data *output_data = NULL;
+               tdm_sprd_layer_data *layer_data = NULL;
                tdm_info_layer layer_info;
+
+               output_data = (tdm_sprd_output_data *)capture_data->output_data;
+               layer_data = sprd_output_data_get_layer_data(output_data, i);
+               if (!layer_data) continue;
+
                CLEAR(layer_info);
-               if (sprd_layer_get_info(tdm_layer_array[i], &layer_info) != TDM_ERROR_NONE) {
-                       TDM_WRN("can't get layer %p info. Skip", tdm_layer_array[i]);
+               if (sprd_layer_get_info(layer_data, &layer_info) != TDM_ERROR_NONE) {
+                       TDM_WRN("can't get layer %p info. Skip", layer_data);
                        continue;
                }
                if (layer_info.src_config.pos.h == 0 || layer_info.src_config.pos.w == 0) {
-                       TDM_INFO("layer %p info is NULL. Skip", tdm_layer_array[i]);
+                       TDM_INFO("layer %p info is NULL. Skip", layer_data);
                        continue;
                }
-               if (sprd_layer_get_buffer(tdm_layer_array[i], &surface) != TDM_ERROR_NONE) {
-                       TDM_WRN("can't get layer %p surface. Skip", tdm_layer_array[i]);
+               if (sprd_layer_get_buffer(layer_data, &surface) != TDM_ERROR_NONE) {
+                       TDM_WRN("can't get layer %p surface. Skip", layer_data);
                        continue;
                }
                if (surface == NULL) {
-                       TDM_INFO("layer %p buffer is NULL. Skip", tdm_layer_array[i]);
+                       TDM_INFO("layer %p buffer is NULL. Skip", layer_data);
                        continue;
                }
                tdm_buffer_ref_backend(surface);
-               TDM_DBG("Get layer %p surface %p", tdm_layer_array[i], surface);
+               TDM_DBG("Get layer %p surface %p", layer_data, surface);
                if (1) {
 
                        int output_width = current_mode->hdisplay;
@@ -570,8 +570,8 @@ _tdm_sprd_capture_oneshot_composite_layers_sw(tdm_sprd_capture_data *capture_dat
                        }
 
                        int zpos;
-                       if (sprd_layer_get_zpos(tdm_layer_array[i], &zpos) != TDM_ERROR_NONE) {
-                               TDM_WRN("can't get layer %p zpos", tdm_layer_array[i]);
+                       if (sprd_layer_get_zpos(layer_data, &zpos) != TDM_ERROR_NONE) {
+                               TDM_WRN("can't get layer %p zpos", layer_data);
                                _tdm_sprd_capture_destroy_converter(&pp_tasks[i]);
                                tdm_buffer_unref_backend(surface);
                                tdm_buffer_unref_backend(temp_buffer);
@@ -610,7 +610,7 @@ _tdm_sprd_capture_oneshot_composite_layers_sw(tdm_sprd_capture_data *capture_dat
                }
                composite_data->composite_buf_pp_task = pp_task;
        }
-       for (i = 0; i < layer_count; i++) {
+       for (i = 0; i < NUM_LAYERS; i++) {
                if (pp_tasks[i]) {
                        tdm_err = sprd_pp_commit(pp_tasks[i]->pp_link);
                        if (tdm_err != TDM_ERROR_NONE) {
@@ -625,16 +625,15 @@ _tdm_sprd_capture_oneshot_composite_layers_sw(tdm_sprd_capture_data *capture_dat
                TDM_WRN("Can't capture layers");
                goto fail;
        }
-       if (tdm_layer_array) {
-               free(tdm_layer_array);
-       }
        if (pp_tasks) {
                free(pp_tasks);
        }
+
        return TDM_ERROR_NONE;
+
 fail:
        if (pp_tasks) {
-               for (i = 0; i < layer_count; ++i) {
+               for (i = 0; i < NUM_LAYERS; ++i) {
                        if (pp_tasks[i])
                                _tdm_sprd_capture_destroy_converter(&pp_tasks[i]);
                }
@@ -664,9 +663,7 @@ fail:
                }
                free(composite_data);
        }
-       if (tdm_layer_array) {
-               free(tdm_layer_array);
-       }
+
        return tdm_err;
 }