@@ -238,12 +238,21 @@ int drm_plane_create_format_blob(struct drm_device *dev,
mod = modifiers_ptr(blob_data);
for (i = 0; i < modifier_count; i++) {
for (j = 0; j < format_count; j++) {
- if (is_async ||
- !plane->funcs->format_mod_supported ||
- plane->funcs->format_mod_supported(plane,
- formats[j],
- modifiers[i])) {
- mod->formats |= 1ULL << j;
+ if (is_async) {
+ if (!plane->funcs->format_mod_supported_async ||
+ plane->funcs->format_mod_supported_async(plane,
+ formats[j],
+ modifiers[i])) {
+ mod->formats |= 1ULL << j;
+ }
+
+ } else {
+ if (!plane->funcs->format_mod_supported ||
+ plane->funcs->format_mod_supported(plane,
+ formats[j],
+ modifiers[i])) {
+ mod->formats |= 1ULL << j;
+ }
}
}
@@ -910,6 +919,7 @@ bool drm_plane_has_format(struct drm_plane *plane,
u32 format, u64 modifier)
{
unsigned int i;
+ bool is_async = plane->crtc->state->async_flip;
for (i = 0; i < plane->format_count; i++) {
if (format == plane->format_types[i])
@@ -918,8 +928,12 @@ bool drm_plane_has_format(struct drm_plane *plane,
if (i == plane->format_count)
return false;
- if (plane->funcs->format_mod_supported) {
- if (!plane->funcs->format_mod_supported(plane, format, modifier))
+ if (is_async ? plane->funcs->format_mod_supported_async :
+ plane->funcs->format_mod_supported) {
+ if (!(is_async ? plane->funcs->format_mod_supported_async(
+ plane, format, modifier) :
+ plane->funcs->format_mod_supported(
+ plane, format, modifier)))
return false;
} else {
if (!plane->modifier_count)
Seperate function for async flips is to be called in order to check the provided format/modifier support. At present the flag for async flip is stored in crtc_state as async flip is supported on only one plane for a given crtc. The same is being used over here to decide the async function pointer. Signed-off-by: Arun R Murthy <arun.r.murthy@intel.com> --- drivers/gpu/drm/drm_plane.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-)