diff options
author | Gowtham Tammana <g-tammana@ti.com> | 2017-12-20 13:43:44 -0600 |
---|---|---|
committer | Gowtham Tammana <g-tammana@ti.com> | 2017-12-20 13:57:30 -0600 |
commit | 8a94ee8f343c0c279ecd3330ca18f4fa31b7ec9e (patch) | |
tree | 9e7dfb66420264d47181eef9e9a0e0c69d46bddd | |
parent | 10ac16a95518196e22f716d4da804dc09bf1be1f (diff) | |
download | dra7xx-8a94ee8f343c0c279ecd3330ca18f4fa31b7ec9e.tar.gz |
hwc: Use index buffer for overlay asssignment
DSS pipelines have different capabilities. Adding an index buffer to
allow flexible mapping of layers to pipelines.
Change-Id: I813052833d01ac7d8df4b4d586033010c91bc374
Signed-off-by: Gowtham Tammana <g-tammana@ti.com>
-rw-r--r-- | hwcomposer/display.c | 13 | ||||
-rw-r--r-- | hwcomposer/display.h | 2 | ||||
-rw-r--r-- | hwcomposer/hwc.c | 12 |
3 files changed, 16 insertions, 11 deletions
diff --git a/hwcomposer/display.c b/hwcomposer/display.c index 965e50d..f647bcd 100644 --- a/hwcomposer/display.c +++ b/hwcomposer/display.c @@ -1061,15 +1061,16 @@ static int display_configure_pipes(display_t *display) kms_display_t *kdisp = &display->disp_link; composition_t *comp = &display->composition; omap_hwc_device_t *hwc_dev = kdisp->ctx; + drm_plane_props_t *plane_info = NULL; uint32_t i = 0; if (!kdisp->is_crtc_set) return 0; for (i = 0; i < comp->used_ovls; i++) { - if (comp->plane_info[i].layer) { + plane_info = &comp->plane_info[comp->ovl_indices[i]]; + if (plane_info->layer && plane_info->layer->handle) { drm_fb_info_t fb_info = { 0 }; - drm_plane_props_t *plane_info = &comp->plane_info[i]; buffer_handle_t handle = plane_info->layer->handle; /* if blitter is enabled we use only one pipe and the @@ -1165,7 +1166,7 @@ int update_display(omap_hwc_device_t *ctx, int disp, if (!kdisp->con) return 0; - hwc_layer_1_t *target = comp->plane_info[0].layer; + hwc_layer_1_t *target = comp->plane_info[comp->ovl_indices[0]].layer; buffer_handle_t hnd; if (ctx->blitter && ctx->displays[disp]->composition.use_blitter) { @@ -1173,8 +1174,8 @@ int update_display(omap_hwc_device_t *ctx, int disp, } else { hnd = target->handle; for (i = 0; i < comp->used_ovls; i++) { - hwc_layer_1_t *layer = comp->plane_info[i].layer; - if (comp->plane_info[i].layer) { + hwc_layer_1_t *layer = comp->plane_info[comp->ovl_indices[i]].layer; + if (layer) { ret = fence_wait(layer->acquireFenceFd); if (ret) { ALOGE("Wait on acquirefence failed for overlay %d\n", i); @@ -1254,7 +1255,7 @@ int update_display(omap_hwc_device_t *ctx, int disp, drmModeAtomicFree(kdisp->atomic_req); for (i = 0; i < DSS_AVAILABLE_PIPES; i++) { - kdisp->fb_bufs[i].next = comp->plane_info[i].fb_info; + kdisp->fb_bufs[i].next = comp->plane_info[comp->ovl_indices[i]].fb_info; kdisp->fb_bufs[i].updated = true; } display->is_flip_pending = true; diff --git a/hwcomposer/display.h b/hwcomposer/display.h index 688642f..2062a14 100644 --- a/hwcomposer/display.h +++ b/hwcomposer/display.h @@ -148,13 +148,13 @@ struct composition { bool swap_rb; uint32_t tiler1d_slot_size; - uint32_t ovl_ix_base; /* index of first overlay used in composition */ uint32_t wanted_ovls; /* # of overlays required for current composition */ uint32_t avail_ovls; /* # of overlays available for current composition */ uint32_t scaling_ovls; /* # of overlays available with scaling caps */ uint32_t used_ovls; /* # of overlays used in composition */ drm_plane_props_t plane_info[DSS_AVAILABLE_PIPES]; + uint32_t ovl_indices[DSS_AVAILABLE_PIPES]; drmModePlane planes[4]; /* TODO: Rename to dss_pipeline_planes to */ /* from the above drm plane info distinguish */ diff --git a/hwcomposer/hwc.c b/hwcomposer/hwc.c index 954d472..be7a829 100644 --- a/hwcomposer/hwc.c +++ b/hwcomposer/hwc.c @@ -105,7 +105,6 @@ static void reserve_overlays_for_displays(omap_hwc_device_t *hwc_dev) max_pipes -= 2; avail_gfx_pipes = 0; - primary_comp->ovl_ix_base = OMAP_DSS_GFX; primary_comp->wanted_ovls = max_pipes; primary_comp->avail_ovls = max_pipes; primary_comp->scaling_ovls = max_pipes - avail_gfx_pipes; @@ -114,7 +113,6 @@ static void reserve_overlays_for_displays(omap_hwc_device_t *hwc_dev) if (hdmi_display) { composition_t *hdmi_comp = &hdmi_display->composition; - hdmi_comp->ovl_ix_base = OMAP_DSS_VIDEO1; hdmi_comp->wanted_ovls = max_pipes; hdmi_comp->avail_ovls = 0; primary_comp->scaling_ovls = 0; @@ -230,8 +228,10 @@ static int hwc_prepare_for_display(omap_hwc_device_t *hwc_dev, int disp) composition_t *comp = &display->composition; uint32_t i = 0; - for (i = 0; i < DSS_AVAILABLE_PIPES; i++) + for (i = 0; i < DSS_AVAILABLE_PIPES; i++) { reset_drm_plane(&comp->plane_info[i]); + comp->ovl_indices[i] = i; + } comp->num_buffers = 0; @@ -256,6 +256,8 @@ static int hwc_prepare_for_display(omap_hwc_device_t *hwc_dev, int disp) */ adjust_drm_plane_to_layer(&list->hwLayers[0], 0, &comp->plane_info[1]); adjust_drm_plane_to_layer(&list->hwLayers[1], 1, &comp->plane_info[0]); + comp->ovl_indices[0] = 1; + comp->ovl_indices[1] = 0; } } @@ -343,6 +345,7 @@ static int hwc_set_for_display(omap_hwc_device_t *hwc_dev, int disp, hwc_display layer_statistics_t *layer_stats = &display->layer_stats; composition_t *comp = &display->composition; blit_device_t *blitter = hwc_dev->blitter; + hwc_layer_1_t *layer = NULL; uint32_t i = 0; int err = 0; @@ -361,7 +364,8 @@ static int hwc_set_for_display(omap_hwc_device_t *hwc_dev, int disp, hwc_display } list->retireFenceFd = -1; - if (!comp->plane_info[0].layer || !comp->plane_info[0].layer->handle) { + layer = comp->plane_info[comp->ovl_indices[0]].layer; + if (!layer || !layer->handle) { ALOGE("Got empty handle, nothing we can do here"); goto clear_acquire_fences; } |