summaryrefslogtreecommitdiff
path: root/hwcomposer/display.c
diff options
context:
space:
mode:
authorGowtham Tammana <g-tammana@ti.com>2017-12-21 14:17:33 -0600
committerGowtham Tammana <g-tammana@ti.com>2018-01-02 16:34:21 -0600
commit01ce70d558cfa06a6aa2f56cb7be1c0d2d286780 (patch)
treed3fefbee3caf2c2a6acd88b2a6249fea329a2e28 /hwcomposer/display.c
parent93ebb954edaf5c76a9ee84a98cf2dd18e25ceba9 (diff)
downloaddra7xx-01ce70d558cfa06a6aa2f56cb7be1c0d2d286780.tar.gz
hwc: Add support for pageflip display update moded-oreo-r6-release
Currently the hwc implementation is using atomic modeset API to update display. Adding support for pageflip way of updating display to support some demo/test usecases. To enable pageflip option set the following through either makefile or Board config file. Makefile option: - {m,mm,mmm} HWC_USE_DRM_PAGEFLIP_MODE=true <project> or add below to BoardConfig.mk file - HWC_USE_DRM_PAGEFLIP_MODE := true Change-Id: Icefc82e49c95f7bee34bb553adc7b109d28ef2bb Signed-off-by: Gowtham Tammana <g-tammana@ti.com>
Diffstat (limited to 'hwcomposer/display.c')
-rw-r--r--hwcomposer/display.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/hwcomposer/display.c b/hwcomposer/display.c
index b58d3f9..098643f 100644
--- a/hwcomposer/display.c
+++ b/hwcomposer/display.c
@@ -840,11 +840,14 @@ int init_primary_display(omap_hwc_device_t *hwc_dev)
ALOGE("failed to set DRM_CLIENT_CAP_UNIVERSAL_PLANES");
goto close;
}
+
+#ifndef HWC_USE_DRM_PAGEFLIP_API
i = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_ATOMIC, 1);
if (i) {
ALOGE("omapdrm is not capable of atomic modesetting");
goto close;
}
+#endif
resources = drmModeGetResources(drm_fd);
if (!resources) {
@@ -1200,14 +1203,16 @@ static int display_configure_pipes(display_t *display)
}
plane_info->fb_info = fb_info;
+#ifndef HWC_USE_DRM_PAGEFLIP_MODE
err = set_plane_properties(kdisp->atomic_req, plane_info, &fb_info);
if (err) {
ALOGE("Failed to configure plane %d (error: %s)",
plane_info->plane_id, strerror(err));
}
+#endif
}
}
- if (comp->used_ovls == 1 && display->layer_stats.nv12) {
+ if (comp->used_ovls == 1 && comp->use_dss && display->layer_stats.nv12) {
plane_info = &comp->plane_info[comp->ovl_indices[1]];
plane_info->crtc_w = kdisp->dummy_fb.width;
plane_info->crtc_h = kdisp->dummy_fb.height;
@@ -1308,13 +1313,21 @@ int update_display(omap_hwc_device_t *ctx, int disp,
fence_fd = timeline_create_fence(&display->retire_sync, "hwc_retire_fence2",
TWO_FLIP_EVENTS);
+#ifndef HWC_USE_DRM_PAGEFLIP_MODE
kdisp->atomic_req = drmModeAtomicAlloc();
+#endif
ret = display_configure_pipes(display);
+#ifndef HWC_USE_DRM_PAGEFLIP_MODE
ret = drmModeAtomicCommit(ctx->drm_fd, kdisp->atomic_req,
DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK, display);
+#else
+ ret = drmModePageFlip(ctx->drm_fd, kdisp->crtc_id,
+ comp->plane_info[comp->ovl_indices[0]].fb_info.fb_id,
+ DRM_MODE_PAGE_FLIP_EVENT, display);
+#endif
if (ret) {
- ALOGE("cannot do atomic commit %d (%s): %d",
+ ALOGE("cannot do atomic commit/page flip %d (%s): %d",
errno, strerror(errno), ret);
pthread_mutex_unlock(&display->lock);
close(fence_fd);
@@ -1323,7 +1336,9 @@ int update_display(omap_hwc_device_t *ctx, int disp,
goto fb_cleanup;
}
+#ifndef HWC_USE_DRM_PAGEFLIP_MODE
drmModeAtomicFree(kdisp->atomic_req);
+#endif
for (i = 0; i < DSS_AVAILABLE_PIPES; i++) {
kdisp->fb_bufs[i].next = comp->plane_info[comp->ovl_indices[i]].fb_info;