aboutsummaryrefslogtreecommitdiff
path: root/hwcomposer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hwcomposer.cpp')
-rw-r--r--hwcomposer.cpp57
1 files changed, 25 insertions, 32 deletions
diff --git a/hwcomposer.cpp b/hwcomposer.cpp
index 6a30fbe..6c007bc 100644
--- a/hwcomposer.cpp
+++ b/hwcomposer.cpp
@@ -181,13 +181,8 @@ static int hwc_prepare(hwc_composer_device_1_t *dev, size_t num_displays,
for (int j = 0; j < num_layers; j++) {
hwc_layer_1_t *layer = &display_contents[i]->hwLayers[j];
- if (crtc->requires_modeset()) {
- if (layer->compositionType == HWC_OVERLAY)
- layer->compositionType = HWC_FRAMEBUFFER;
- } else {
- if (layer->compositionType == HWC_FRAMEBUFFER)
- layer->compositionType = HWC_OVERLAY;
- }
+ if (layer->compositionType == HWC_FRAMEBUFFER)
+ layer->compositionType = HWC_OVERLAY;
}
}
@@ -254,17 +249,6 @@ static int hwc_set(hwc_composer_device_1_t *dev, size_t num_displays,
if (!display_contents[i])
continue;
- DrmCrtc *crtc = ctx->drm.GetCrtcForDisplay(i);
- if (!crtc) {
- ALOGE("No crtc for display %d", i);
- hwc_set_cleanup(num_displays, display_contents, composition);
- return -ENODEV;
- }
- bool use_target = false;
- if (crtc->requires_modeset()) {
- use_target = true;
- }
-
hwc_display_contents_1_t *dc = display_contents[i];
int j;
unsigned num_layers = 0;
@@ -273,16 +257,14 @@ static int hwc_set(hwc_composer_device_1_t *dev, size_t num_displays,
hwc_layer_1_t *layer = &dc->hwLayers[j];
if (layer->flags & HWC_SKIP_LAYER)
continue;
- if ((use_target && layer->compositionType == HWC_FRAMEBUFFER_TARGET) ||
- layer->compositionType == HWC_OVERLAY) {
+ if (layer->compositionType == HWC_OVERLAY)
num_layers++;
- }
}
unsigned num_planes = composition->GetRemainingLayers(i, num_layers);
bool use_pre_compositor = false;
- if (!use_target && num_layers > num_planes) {
+ if (num_layers > num_planes) {
use_pre_compositor = true;
// Reserve one of the planes for the result of the pre compositor.
num_planes--;
@@ -292,13 +274,8 @@ static int hwc_set(hwc_composer_device_1_t *dev, size_t num_displays,
hwc_layer_1_t *layer = &dc->hwLayers[j];
if (layer->flags & HWC_SKIP_LAYER)
continue;
- if (use_target) {
- if (layer->compositionType != HWC_FRAMEBUFFER_TARGET)
- continue;
- } else {
- if (layer->compositionType != HWC_OVERLAY)
- continue;
- }
+ if (layer->compositionType != HWC_OVERLAY)
+ continue;
ret = hwc_add_layer(i, ctx, layer, composition);
if (ret) {
@@ -606,12 +583,28 @@ static int hwc_set_active_config(struct hwc_composer_device_1 *dev, int display,
return -EINVAL;
}
- int ret = ctx->drm.SetDisplayActiveMode(display, hd->config_ids[index]);
+ DrmConnector *c = ctx->drm.GetConnectorForDisplay(display);
+ if (!c) {
+ ALOGE("Failed to get connector for display %d", display);
+ return -ENODEV;
+ }
+ DrmMode mode;
+ for (DrmConnector::ModeIter iter = c->begin_modes(); iter != c->end_modes();
+ ++iter) {
+ if (iter->id() == hd->config_ids[index]) {
+ mode = *iter;
+ break;
+ }
+ }
+ if (mode.id() != hd->config_ids[index]) {
+ ALOGE("Could not find active mode for %d/%d", index, hd->config_ids[index]);
+ return -ENOENT;
+ }
+ int ret = ctx->drm.SetDisplayActiveMode(display, mode);
if (ret) {
- ALOGE("Failed to set config for display %d", display);
+ ALOGE("Failed to set active config %d", ret);
return ret;
}
-
return ret;
}