Merge "libgralloc: Store unaligned buffer resolution in private handle."
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index 8d43f98..3ecc9fa 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -1000,7 +1000,8 @@
aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, height);
break;
case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
- aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, width);
+ // The macro returns the stride which is 4/3 times the width, hence * 3/4
+ aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, width) * 3) / 4;
aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, height);
break;
default:
diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h
index 336ac60..8f1c12d 100644
--- a/libgralloc/gralloc_priv.h
+++ b/libgralloc/gralloc_priv.h
@@ -118,7 +118,6 @@
#define HAL_PIXEL_FORMAT_BGRX_1010102 0x11C
#define HAL_PIXEL_FORMAT_XBGR_2101010 0x11D
#define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x11F
-#define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x120
#define HAL_PIXEL_FORMAT_INTERLACE 0x180
@@ -131,6 +130,7 @@
// UBWC aligned Venus format
#define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC 0x7FA30C06
+#define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x7FA30C09
//Khronos ASTC formats
#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
diff --git a/libgralloc1/gr_allocator.cpp b/libgralloc1/gr_allocator.cpp
index b45ba83..1a269be 100644
--- a/libgralloc1/gr_allocator.cpp
+++ b/libgralloc1/gr_allocator.cpp
@@ -670,6 +670,11 @@
*aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, width);
*aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, height);
break;
+ case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
+ // The macro returns the stride which is 4/3 times the width, hence * 3/4
+ *aligned_w = (VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, width) * 3) / 4;
+ *aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, height);
+ break;
default:
ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format);
*aligned_w = 0;
diff --git a/libgralloc1/gralloc_priv.h b/libgralloc1/gralloc_priv.h
index 64cb1f5..af7e173 100644
--- a/libgralloc1/gralloc_priv.h
+++ b/libgralloc1/gralloc_priv.h
@@ -107,7 +107,6 @@
#define HAL_PIXEL_FORMAT_BGRX_1010102 0x11C
#define HAL_PIXEL_FORMAT_XBGR_2101010 0x11D
#define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x11F
-#define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x120
#define HAL_PIXEL_FORMAT_INTERLACE 0x180
@@ -120,6 +119,7 @@
// UBWC aligned Venus format
#define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC 0x7FA30C06
+#define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x7FA30C09
// Khronos ASTC formats
#define HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index 4ae696d..93fb81b 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -226,6 +226,7 @@
bool needs_roi_merge = false; // Merge ROI's of both the DSI's
bool dynamic_fps = false; // Panel Supports dynamic fps
bool dfps_porch_mode = false; // dynamic fps VFP or HFP mode
+ bool ping_pong_split = false; // Supports Ping pong split
uint32_t min_fps = 0; // Min fps supported by panel
uint32_t max_fps = 0; // Max fps supported by panel
bool is_primary_panel = false; // Panel is primary display
@@ -245,6 +246,7 @@
(needs_roi_merge != panel_info.needs_roi_merge) ||
(dynamic_fps != panel_info.dynamic_fps) || (min_fps != panel_info.min_fps) ||
(dfps_porch_mode != panel_info.dfps_porch_mode) ||
+ (ping_pong_split != panel_info.ping_pong_split) ||
(max_fps != panel_info.max_fps) || (is_primary_panel != panel_info.is_primary_panel) ||
(split_info != panel_info.split_info) ||
(s3d_mode != panel_info.s3d_mode));
diff --git a/sdm/include/utils/sys.h b/sdm/include/utils/sys.h
index b90007a..6b40df4 100644
--- a/sdm/include/utils/sys.h
+++ b/sdm/include/utils/sys.h
@@ -54,6 +54,7 @@
#else
typedef int (*ioctl)(int, int, ...);
#endif
+ typedef int (*access)(const char *, int);
typedef int (*open)(const char *, int, ...);
typedef int (*close)(int);
typedef int (*poll)(struct pollfd *, nfds_t, int);
@@ -68,6 +69,7 @@
static bool getline_(fstream &fs, std::string &line); // NOLINT
static ioctl ioctl_;
+ static access access_;
static open open_;
static close close_;
static poll poll_;
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index cddb05d..27168bb 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -107,12 +107,28 @@
}
DisplayError HWDevice::Init() {
- char device_name[64] = {0};
-
// Read the fb node index
fb_node_index_ = GetFBNodeIndex(device_type_);
if (fb_node_index_ == -1) {
- DLOGE("%s should be present", device_name_);
+ DLOGE("device type = %d should be present", device_type_);
+ return kErrorHardware;
+ }
+
+ const char *dev_name = NULL;
+ vector<string> dev_paths = {"/dev/graphics/fb", "/dev/fb"};
+ for (size_t i = 0; i < dev_paths.size(); i++) {
+ dev_paths[i] += to_string(fb_node_index_);
+ if (Sys::access_(dev_paths[i].c_str(), F_OK) >= 0) {
+ dev_name = dev_paths[i].c_str();
+ DLOGI("access(%s) successful", dev_name);
+ break;
+ }
+
+ DLOGI("access(%s), errno = %d, error = %s", dev_paths[i].c_str(), errno, strerror(errno));
+ }
+
+ if (!dev_name) {
+ DLOGE("access() failed for all possible paths");
return kErrorHardware;
}
@@ -122,10 +138,9 @@
hw_resource_ = HWResourceInfo();
hw_info_intf_->GetHWResourceInfo(&hw_resource_);
- snprintf(device_name, sizeof(device_name), "%s%d", "/dev/graphics/fb", fb_node_index_);
- device_fd_ = Sys::open_(device_name, O_RDWR);
+ device_fd_ = Sys::open_(dev_name, O_RDWR);
if (device_fd_ < 0) {
- DLOGE("open %s failed err = %d errstr = %s", device_name, errno, strerror(errno));
+ DLOGE("open %s failed errno = %d, error = %s", dev_name, errno, strerror(errno));
return kErrorResources;
}
@@ -785,6 +800,7 @@
hw_panel_info_.min_roi_width, hw_panel_info_.min_roi_height,
hw_panel_info_.needs_roi_merge);
DLOGI("FPS: min = %d, max =%d", hw_panel_info_.min_fps, hw_panel_info_.max_fps);
+ DLOGI("Ping Pong Split = %d", hw_panel_info_.ping_pong_split);
DLOGI("Left Split = %d, Right Split = %d", hw_panel_info_.split_info.left_split,
hw_panel_info_.split_info.right_split);
}
@@ -847,6 +863,8 @@
panel_info->dynamic_fps = atoi(tokens[1]);
} else if (!strncmp(tokens[0], "dfps_porch_mode", strlen("dfps_porch_mode"))) {
panel_info->dfps_porch_mode = atoi(tokens[1]);
+ } else if (!strncmp(tokens[0], "is_pingpong_split", strlen("is_pingpong_split"))) {
+ panel_info->ping_pong_split = atoi(tokens[1]);
} else if (!strncmp(tokens[0], "min_fps", strlen("min_fps"))) {
panel_info->min_fps = UINT32(atoi(tokens[1]));
} else if (!strncmp(tokens[0], "max_fps", strlen("max_fps"))) {
diff --git a/sdm/libs/core/fb/hw_hdmi.cpp b/sdm/libs/core/fb/hw_hdmi.cpp
index e825272..f8cac1d 100644
--- a/sdm/libs/core/fb/hw_hdmi.cpp
+++ b/sdm/libs/core/fb/hw_hdmi.cpp
@@ -118,11 +118,7 @@
ReadScanInfo();
- error = GetPanelS3DMode();
- if (error != kErrorNone) {
- Deinit();
- return error;
- }
+ GetPanelS3DMode();
s3d_mode_sdm_to_mdp_.insert(std::pair<HWS3DMode, msm_hdmi_s3d_mode>
(kS3DModeNone, HDMI_S3D_NONE));
@@ -577,8 +573,9 @@
// Three level inception!
// The string looks like 16=SSH,4=FP:TAB:SSH,5=FP:SSH,32=FP:TAB:SSH
- char *saveptr_l1, *saveptr_l2, *saveptr_l3;
- char *l1, *l2, *l3;
+ // Initialize all the pointers to NULL to avoid crash in function strtok_r()
+ char *saveptr_l1 = NULL, *saveptr_l2 = NULL, *saveptr_l3 = NULL;
+ char *l1 = NULL, *l2 = NULL, *l3 = NULL;
int edid_s3d_node = Sys::open_(edid_s3d_path, O_RDONLY);
if (edid_s3d_node < 0) {
diff --git a/sdm/libs/core/fb/hw_primary.cpp b/sdm/libs/core/fb/hw_primary.cpp
index 1659625..f3c7639 100644
--- a/sdm/libs/core/fb/hw_primary.cpp
+++ b/sdm/libs/core/fb/hw_primary.cpp
@@ -245,7 +245,8 @@
display_attributes_.vsync_period_ns = UINT32(1000000000L / display_attributes_.fps);
display_attributes_.is_device_split = (hw_panel_info_.split_info.left_split ||
(var_screeninfo.xres > hw_resource_.max_mixer_width)) ? true : false;
- display_attributes_.h_total += display_attributes_.is_device_split ? h_blanking : 0;
+ display_attributes_.h_total += (display_attributes_.is_device_split ||
+ hw_panel_info_.ping_pong_split)? h_blanking : 0;
return kErrorNone;
}
diff --git a/sdm/libs/utils/sys.cpp b/sdm/libs/utils/sys.cpp
index 0d1ab0e..f5e0f29 100644
--- a/sdm/libs/utils/sys.cpp
+++ b/sdm/libs/utils/sys.cpp
@@ -45,6 +45,7 @@
// Pointer to actual driver interfaces.
Sys::ioctl Sys::ioctl_ = ::ioctl;
+Sys::access Sys::access_ = ::access;
Sys::open Sys::open_ = ::open;
Sys::close Sys::close_ = ::close;
Sys::poll Sys::poll_ = ::poll;