OSDN Git Service
(root)
/
android-x86
/
external-drm_hwcomposer.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge remote-tracking branch 'origin/master' into oreo-x86
[android-x86/external-drm_hwcomposer.git]
/
drmdisplaycompositor.cpp
diff --git
a/drmdisplaycompositor.cpp
b/drmdisplaycompositor.cpp
index
8936d08
..
60adbac
100644
(file)
--- a/
drmdisplaycompositor.cpp
+++ b/
drmdisplaycompositor.cpp
@@
-26,7
+26,7
@@
#include <sstream>
#include <vector>
#include <sstream>
#include <vector>
-#include <
cutils
/log.h>
+#include <
log
/log.h>
#include <drm/drm_mode.h>
#include <sync/sync.h>
#include <utils/Trace.h>
#include <drm/drm_mode.h>
#include <sync/sync.h>
#include <utils/Trace.h>
@@
-292,6
+292,13
@@
int DrmDisplayCompositor::Init(DrmResources *drm, int display) {
return ret;
}
return ret;
}
+ pre_compositor_.reset(new GLWorkerCompositor());
+ ret = pre_compositor_->Init();
+ if (ret) {
+ ALOGE("Failed to initialize OpenGL compositor %d", ret);
+ pre_compositor_.reset();
+ }
+
initialized_ = true;
return 0;
}
initialized_ = true;
return 0;
}
@@
-413,14
+420,16
@@
int DrmDisplayCompositor::ApplySquash(DrmDisplayComposition *display_comp) {
}
std::vector<DrmCompositionRegion> ®ions = display_comp->squash_regions();
}
std::vector<DrmCompositionRegion> ®ions = display_comp->squash_regions();
- ret = pre_compositor_->Composite(display_comp->layers().data(),
+ if (pre_compositor_) {
+ ret = pre_compositor_->Composite(display_comp->layers().data(),
regions.data(), regions.size(), fb.buffer(),
display_comp->importer());
regions.data(), regions.size(), fb.buffer(),
display_comp->importer());
- pre_compositor_->Finish();
+
pre_compositor_->Finish();
- if (ret) {
- ALOGE("Failed to squash layers");
- return ret;
+ if (ret) {
+ ALOGE("Failed to squash layers");
+ return ret;
+ }
}
ret = display_comp->CreateNextTimelineFence();
}
ret = display_comp->CreateNextTimelineFence();
@@
-447,14
+456,16
@@
int DrmDisplayCompositor::ApplyPreComposite(
}
std::vector<DrmCompositionRegion> ®ions = display_comp->pre_comp_regions();
}
std::vector<DrmCompositionRegion> ®ions = display_comp->pre_comp_regions();
- ret = pre_compositor_->Composite(display_comp->layers().data(),
+ if (pre_compositor_) {
+ ret = pre_compositor_->Composite(display_comp->layers().data(),
regions.data(), regions.size(), fb.buffer(),
display_comp->importer());
regions.data(), regions.size(), fb.buffer(),
display_comp->importer());
- pre_compositor_->Finish();
+
pre_compositor_->Finish();
- if (ret) {
- ALOGE("Failed to pre-composite layers");
- return ret;
+ if (ret) {
+ ALOGE("Failed to pre-composite layers");
+ return ret;
+ }
}
ret = display_comp->CreateNextTimelineFence();
}
ret = display_comp->CreateNextTimelineFence();
@@
-600,8
+611,6
@@
int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
std::vector<DrmHwcLayer> &layers = display_comp->layers();
std::vector<DrmCompositionPlane> &comp_planes =
display_comp->composition_planes();
std::vector<DrmHwcLayer> &layers = display_comp->layers();
std::vector<DrmCompositionPlane> &comp_planes =
display_comp->composition_planes();
- std::vector<DrmCompositionRegion> &pre_comp_regions =
- display_comp->pre_comp_regions();
uint64_t out_fences[drm_->crtcs().size()];
DrmConnector *connector = drm_->GetConnectorForDisplay(display_);
uint64_t out_fences[drm_->crtcs().size()];
DrmConnector *connector = drm_->GetConnectorForDisplay(display_);
@@
-632,6
+641,13
@@
int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
}
if (mode_.needs_modeset) {
}
if (mode_.needs_modeset) {
+ ret = drmModeAtomicAddProperty(pset, crtc->id(), crtc->active_property().id(), 1);
+ if (ret < 0) {
+ ALOGE("Failed to add crtc active to pset\n");
+ drmModeAtomicFree(pset);
+ return ret;
+ }
+
ret = drmModeAtomicAddProperty(pset, crtc->id(), crtc->mode_property().id(),
mode_.blob_id) < 0 ||
drmModeAtomicAddProperty(pset, connector->id(),
ret = drmModeAtomicAddProperty(pset, crtc->id(), crtc->mode_property().id(),
mode_.blob_id) < 0 ||
drmModeAtomicAddProperty(pset, connector->id(),
@@
-682,17
+698,19
@@
int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
rotation = 0;
if (layer.transform & DrmHwcTransform::kFlipH)
rotation = 0;
if (layer.transform & DrmHwcTransform::kFlipH)
- rotation |=
1 << DRM
_REFLECT_X;
+ rotation |=
DRM_MODE
_REFLECT_X;
if (layer.transform & DrmHwcTransform::kFlipV)
if (layer.transform & DrmHwcTransform::kFlipV)
- rotation |=
1 << DRM
_REFLECT_Y;
+ rotation |=
DRM_MODE
_REFLECT_Y;
if (layer.transform & DrmHwcTransform::kRotate90)
if (layer.transform & DrmHwcTransform::kRotate90)
- rotation |=
1 << DRM
_ROTATE_90;
+ rotation |=
DRM_MODE
_ROTATE_90;
else if (layer.transform & DrmHwcTransform::kRotate180)
else if (layer.transform & DrmHwcTransform::kRotate180)
- rotation |=
1 << DRM
_ROTATE_180;
+ rotation |=
DRM_MODE
_ROTATE_180;
else if (layer.transform & DrmHwcTransform::kRotate270)
else if (layer.transform & DrmHwcTransform::kRotate270)
- rotation |= 1 << DRM_ROTATE_270;
+ rotation |= DRM_MODE_ROTATE_270;
+ else
+ rotation |= DRM_MODE_ROTATE_0;
- if (fence_fd
<
0) {
+ if (fence_fd
>=
0) {
int prop_id = plane->in_fence_fd_property().id();
if (prop_id == 0) {
ALOGE("Failed to get IN_FENCE_FD property id");
int prop_id = plane->in_fence_fd_property().id();
if (prop_id == 0) {
ALOGE("Failed to get IN_FENCE_FD property id");
@@
-720,7
+738,7
@@
int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
}
// TODO: Once we have atomic test, this should fall back to GL
}
// TODO: Once we have atomic test, this should fall back to GL
- if (rotation && plane->rotation_property().id() == 0) {
+ if (rotation
!= DRM_MODE_ROTATE_0
&& plane->rotation_property().id() == 0) {
ALOGE("Rotation is not supported on plane %d", plane->id());
ret = -EINVAL;
break;
ALOGE("Rotation is not supported on plane %d", plane->id());
ret = -EINVAL;
break;
@@
-789,7
+807,6
@@
int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
}
}
}
}
-out:
if (!ret) {
uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
if (test_only)
if (!ret) {
uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
if (test_only)
@@
-1092,10
+1109,13
@@
int DrmDisplayCompositor::SquashFrame(DrmDisplayComposition *src,
goto move_layers_back;
}
goto move_layers_back;
}
- if (comp_plane.type() == DrmCompositionPlane::Type::kDisable) {
+ if (comp_plane.plane()->type() == DRM_PLANE_TYPE_PRIMARY)
+ squashed_comp.set_plane(comp_plane.plane());
+ else
dst->AddPlaneDisable(comp_plane.plane());
dst->AddPlaneDisable(comp_plane.plane());
+
+ if (comp_plane.type() == DrmCompositionPlane::Type::kDisable)
continue;
continue;
- }
for (auto i : comp_plane.source_layers()) {
DrmHwcLayer &layer = src_layers[i];
for (auto i : comp_plane.source_layers()) {
DrmHwcLayer &layer = src_layers[i];
@@
-1114,11
+1134,12
@@
int DrmDisplayCompositor::SquashFrame(DrmDisplayComposition *src,
squashed_comp.source_layers().push_back(
squashed_comp.source_layers().size());
}
squashed_comp.source_layers().push_back(
squashed_comp.source_layers().size());
}
+ }
- if (comp_plane.plane()->type() == DRM_PLANE_TYPE_PRIMARY)
-
squashed_comp.set_plane(comp_plane.plane()
);
- else
-
dst->AddPlaneDisable(comp_plane.plane())
;
+ if (squashed_comp.plane() == NULL) {
+
ALOGE("Primary plane not found for squash"
);
+ ret = -ENOTSUP;
+
goto move_layers_back
;
}
ret = dst->SetLayers(dst_layers.data(), dst_layers.size(), false);
}
ret = dst->SetLayers(dst_layers.data(), dst_layers.size(), false);