summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGowtham Tammana <g-tammana@ti.com>2017-12-20 13:43:44 -0600
committerGowtham Tammana <g-tammana@ti.com>2017-12-20 13:57:30 -0600
commit8a94ee8f343c0c279ecd3330ca18f4fa31b7ec9e (patch)
tree9e7dfb66420264d47181eef9e9a0e0c69d46bddd
parent10ac16a95518196e22f716d4da804dc09bf1be1f (diff)
downloaddra7xx-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.c13
-rw-r--r--hwcomposer/display.h2
-rw-r--r--hwcomposer/hwc.c12
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;
}