correct supported formats 97/172497/1
authorBoram Park <boram1288.park@samsung.com>
Wed, 14 Mar 2018 07:38:35 +0000 (16:38 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 14 Mar 2018 07:40:26 +0000 (16:40 +0900)
Changing between RGB and YUV format for a plane doesn't work properly.
And YUV420 format also dosen't work properly.

Change-Id: Ic926932fa0306576418d10fd119e4474d3fc4855

src/tdm_vc4_display.c

index 4667316..fc2b82a 100644 (file)
@@ -1749,6 +1749,19 @@ vc4_output_set_status_handler(tdm_output *output,
        return TDM_ERROR_NONE;
 }
 
+static int
+_get_primary_layer_zpos(tdm_vc4_output_data *output_data)
+{
+       tdm_vc4_layer_data *layer_data = NULL;
+
+       LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link) {
+               if (layer_data->capabilities & TDM_LAYER_CAPABILITY_PRIMARY)
+                       return layer_data->zpos;
+       }
+
+       return -1;
+}
+
 tdm_error
 vc4_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
 {
@@ -1757,6 +1770,7 @@ vc4_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
        drmModePlanePtr plane = NULL;
        drmModeObjectPropertiesPtr props = NULL;
        int i, format_count = 0;
+       int primary_zpos = _get_primary_layer_zpos(layer_data->output_data);
        tdm_error ret;
 
        RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_INVALID_PARAMETER);
@@ -1773,7 +1787,7 @@ vc4_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
        }
 
        caps->capabilities = layer_data->capabilities;
-       caps->zpos = layer_data->zpos;  /* if VIDEO layer, zpos is -1 */
+       caps->zpos = layer_data->zpos;
 
        caps->format_count = plane->count_formats;
        caps->formats = calloc(1, sizeof(tbm_format) * caps->format_count);
@@ -1784,12 +1798,18 @@ vc4_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps)
        }
 
        for (i = 0; i < caps->format_count; i++) {
-               /* TODO: kernel reports wrong formats */
-               if (plane->formats[i] != DRM_FORMAT_XRGB8888 &&
-                        plane->formats[i] != DRM_FORMAT_ARGB8888 &&
-                        plane->formats[i] != DRM_FORMAT_NV12 &&
-                        plane->formats[i] != DRM_FORMAT_YUV420)
-                       continue;
+               /* Changing between RGB and YUV format for a plane doesn't work properly
+                * only support AR24, XR24 for primary, overlay
+                */
+               if (layer_data->zpos >= primary_zpos) {
+                       if (plane->formats[i] != DRM_FORMAT_XRGB8888 && plane->formats[i] != DRM_FORMAT_ARGB8888)
+                               continue;
+               } else {
+                       /* only support NV12 for underlay */
+                       if (plane->formats[i] != DRM_FORMAT_NV12)
+                               continue;
+               }
+
                caps->formats[format_count] = tdm_vc4_format_to_tbm_format(plane->formats[i]);
                format_count++;
        }