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)
{
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);
}
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);
}
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++;
}