drm_hwcomposer: Fix float to 16.16 fixed point conversion
Previously, the fractional part was truncated.
Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
diff --git a/drm/DrmPlane.cpp b/drm/DrmPlane.cpp
index 8114234..bce1800 100644
--- a/drm/DrmPlane.cpp
+++ b/drm/DrmPlane.cpp
@@ -206,6 +206,12 @@
return rotation;
}
+/* Convert float to 16.16 fixed point */
+static int To1616FixPt(float in) {
+ constexpr int kBitShift = 16;
+ return int(in * (1 << kBitShift));
+}
+
auto DrmPlane::AtomicSetState(drmModeAtomicReq &pset, DrmHwcLayer &layer,
uint32_t zpos, uint32_t crtc_id) -> int {
if (!layer.fb_id_handle) {
@@ -237,14 +243,12 @@
layer.display_frame.left) ||
!crtc_h_property_.AtomicSet(pset, layer.display_frame.bottom -
layer.display_frame.top) ||
- !src_x_property_.AtomicSet(pset, (int)(layer.source_crop.left) << 16) ||
- !src_y_property_.AtomicSet(pset, (int)(layer.source_crop.top) << 16) ||
- !src_w_property_.AtomicSet(pset, (int)(layer.source_crop.right -
- layer.source_crop.left)
- << 16) ||
- !src_h_property_.AtomicSet(pset, (int)(layer.source_crop.bottom -
- layer.source_crop.top)
- << 16)) {
+ !src_x_property_.AtomicSet(pset, To1616FixPt(layer.source_crop.left)) ||
+ !src_y_property_.AtomicSet(pset, To1616FixPt(layer.source_crop.top)) ||
+ !src_w_property_.AtomicSet(pset, To1616FixPt(layer.source_crop.right -
+ layer.source_crop.left)) ||
+ !src_h_property_.AtomicSet(pset, To1616FixPt(layer.source_crop.bottom -
+ layer.source_crop.top))) {
return -EINVAL;
}