commonsys-intf: display: add changes for display-android-commonsys.lnx.1.0

Relocate changes from display.lnx.5.0 to display-android-commonsys.lnx.1.0

CRs-Fixed: 2251141
Change-Id: Ia65f6d7f83e21702cf61f0672ba97ae006ae7886
This commit is contained in:
Mohan Pallaka
2018-08-01 10:40:13 -07:00
parent 001bc79f72
commit 5d8144382d
5 changed files with 337 additions and 33 deletions

View File

@@ -58,6 +58,7 @@ struct private_handle_t : public native_handle_t {
PRIV_FLAGS_UBWC_ALIGNED = 0x08000000,
PRIV_FLAGS_DISP_CONSUMER = 0x10000000,
PRIV_FLAGS_CLIENT_ALLOCATED = 0x20000000, // Ion buffer allocated outside of gralloc
PRIV_FLAGS_UBWC_ALIGNED_PI = 0x40000000, // PI format
};
// file-descriptors dup'd over IPC

View File

@@ -49,11 +49,19 @@ inline int roundUpToPageSize(int x) {
* cannot be used with noncontiguous heaps */
#define GRALLOC_USAGE_PRIVATE_UNCACHED (UINT32_C(1) << 29)
/* This flag is used to indicate P010 format */
/* This flag is used to indicate 10 bit format.
* When both GRALLOC_USAGE_PRIVATE_ALLOC_UBWC & GRALLOC_USAGE_PRIVATE_10BIT
* are set then it will indicate UBWC_TP10 format.
* When only GRALLOC_USAGE_PRIVATE_10BIT is set it will indicate linear P010 format.
*/
#define GRALLOC_USAGE_PRIVATE_10BIT (UINT32_C(1) << 30)
/* This flag is used for SECURE display usecase */
#define GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY (UINT32_C(1) << 31)
/* This flag is used to indicate video NV21 format */
#define GRALLOC_USAGE_PRIVATE_VIDEO_NV21_ENCODER 1ULL << 48
/* unused legacy flags */
#define GRALLOC_USAGE_PRIVATE_MM_HEAP 0
#define GRALLOC_USAGE_PRIVATE_IOMMU_HEAP 0
@@ -63,8 +71,11 @@ inline int roundUpToPageSize(int x) {
/* This flag is set for WFD usecase */
#define GRALLOC_USAGE_PRIVATE_WFD (UINT32_C(1) << 21)
/* This flag is used to indicate 10-bit tight pack format (e.g. TP10) */
#define GRALLOC_USAGE_PRIVATE_10BIT_TP (UINT32_C(1) << 27)
/* TODO(user): Remove when clients stop referencing this flag */
#define GRALLOC_USAGE_PRIVATE_10BIT_TP 0
/* This flag indicates PI format is being used */
#define GRALLOC_USAGE_PRIVATE_ALLOC_UBWC_PI 1ULL << 49
/* Legacy gralloc1 definitions */
/* Some clients may still be using the old flags */
@@ -76,6 +87,7 @@ inline int roundUpToPageSize(int x) {
#define GRALLOC1_PRODUCER_USAGE_PRIVATE_10BIT GRALLOC_USAGE_PRIVATE_10BIT
#define GRALLOC1_PRODUCER_USAGE_PRIVATE_10BIT_TP GRALLOC_USAGE_PRIVATE_10BIT_TP
#define GRALLOC1_CONSUMER_USAGE_PRIVATE_10BIT_TP GRALLOC_USAGE_PRIVATE_10BIT_TP
#define GRALLOC1_PRODUCER_USAGE_PRIVATE_VIDEO_NV21_ENCODER GRALLOC_USAGE_PRIVATE_VIDEO_NV21_ENCODER
// for PERFORM API :
#define GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER 1
@@ -93,11 +105,13 @@ inline int roundUpToPageSize(int x) {
#define GRALLOC_MODULE_PERFORM_SET_SINGLE_BUFFER_MODE 13
#define GRALLOC1_MODULE_PERFORM_GET_BUFFER_SIZE_AND_DIMENSIONS 14
#define GRALLOC1_MODULE_PERFORM_GET_INTERLACE_FLAG 15
#define GRALLOC_MODULE_PERFORM_GET_GRAPHICS_METADATA 16
// OEM specific HAL formats
#define HAL_PIXEL_FORMAT_RGBA_5551 6
#define HAL_PIXEL_FORMAT_RGBA_4444 7
#define HAL_PIXEL_FORMAT_NV12_ENCODEABLE 0x102
#define HAL_PIXEL_FORMAT_NV21_ENCODEABLE 0x7FA30C00
#define HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS 0x7FA30C04
#define HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED 0x7FA30C03
#define HAL_PIXEL_FORMAT_YCbCr_420_SP 0x109

View File

@@ -133,6 +133,13 @@ int setMetaDataVa(MetaData_t *data, DispParamType paramType,
case SET_VIDEO_PERF_MODE:
data->isVideoPerfMode = *((uint32_t *)param);
break;
case SET_GRAPHICS_METADATA: {
GraphicsMetadata payload = *((GraphicsMetadata*)(param));
data->graphics_metadata.size = payload.size;
memcpy(data->graphics_metadata.data, payload.data,
sizeof(data->graphics_metadata.data));
break;
}
default:
ALOGE("Unknown paramType %d", paramType);
break;
@@ -271,6 +278,12 @@ int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
ret = 0;
}
break;
case GET_GRAPHICS_METADATA:
if (data->operation & SET_GRAPHICS_METADATA) {
memcpy(param, data->graphics_metadata.data, sizeof(data->graphics_metadata.data));
ret = 0;
}
break;
default:
ALOGE("Unknown paramType %d", paramType);
break;

View File

@@ -37,6 +37,7 @@ extern "C" {
#endif
#define MAX_UBWC_STATS_LENGTH 32
#define GRAPHICS_METADATA_SIZE 4096
enum ColorSpace_t{
ITU_R_601,
@@ -97,6 +98,11 @@ struct S3DGpuComp_t {
uint32_t s3dMode; /* the S3D format of this layer to be accessed by client */
};
typedef struct GraphicsMetadata {
uint32_t size;
uint32_t data[GRAPHICS_METADATA_SIZE];
} GraphicsMetadata;
struct MetaData_t {
int32_t operation;
int32_t interlaced;
@@ -137,42 +143,47 @@ struct MetaData_t {
/* Set by camera to indicate that this buffer will be used for a High
* Performance Video Usecase */
uint32_t isVideoPerfMode;
/* Populated and used by adreno during buffer size calculation.
* Set only for RGB formats. */
GraphicsMetadata graphics_metadata;
};
enum DispParamType {
SET_VT_TIMESTAMP = 0x0001,
COLOR_METADATA = 0x0002,
PP_PARAM_INTERLACED = 0x0004,
SET_VIDEO_PERF_MODE = 0x0008,
UNUSED3 = 0x0010,
UNUSED4 = 0x0020,
SET_UBWC_CR_STATS_INFO = 0x0040,
UPDATE_BUFFER_GEOMETRY = 0x0080,
UPDATE_REFRESH_RATE = 0x0100,
UPDATE_COLOR_SPACE = 0x0200,
MAP_SECURE_BUFFER = 0x0400,
S3D_FORMAT = 0x0800,
LINEAR_FORMAT = 0x1000,
SET_IGC = 0x2000,
SET_SINGLE_BUFFER_MODE = 0x4000,
SET_S3D_COMP = 0x8000,
SET_VT_TIMESTAMP = 0x0001,
COLOR_METADATA = 0x0002,
PP_PARAM_INTERLACED = 0x0004,
SET_VIDEO_PERF_MODE = 0x0008,
SET_GRAPHICS_METADATA = 0x0010,
SET_UNUSED = 0x0020,
SET_UBWC_CR_STATS_INFO = 0x0040,
UPDATE_BUFFER_GEOMETRY = 0x0080,
UPDATE_REFRESH_RATE = 0x0100,
UPDATE_COLOR_SPACE = 0x0200,
MAP_SECURE_BUFFER = 0x0400,
S3D_FORMAT = 0x0800,
LINEAR_FORMAT = 0x1000,
SET_IGC = 0x2000,
SET_SINGLE_BUFFER_MODE = 0x4000,
SET_S3D_COMP = 0x8000,
};
enum DispFetchParamType {
GET_VT_TIMESTAMP = 0x0001,
GET_COLOR_METADATA = 0x0002,
GET_PP_PARAM_INTERLACED = 0x0004,
GET_VIDEO_PERF_MODE = 0x0008,
GET_UBWC_CR_STATS_INFO = 0x0040,
GET_BUFFER_GEOMETRY = 0x0080,
GET_REFRESH_RATE = 0x0100,
GET_COLOR_SPACE = 0x0200,
GET_MAP_SECURE_BUFFER = 0x0400,
GET_S3D_FORMAT = 0x0800,
GET_LINEAR_FORMAT = 0x1000,
GET_IGC = 0x2000,
GET_SINGLE_BUFFER_MODE = 0x4000,
GET_S3D_COMP = 0x8000,
GET_VT_TIMESTAMP = 0x0001,
GET_COLOR_METADATA = 0x0002,
GET_PP_PARAM_INTERLACED = 0x0004,
GET_VIDEO_PERF_MODE = 0x0008,
GET_GRAPHICS_METADATA = 0x0010,
GET_UNUSED = 0X0020,
GET_UBWC_CR_STATS_INFO = 0x0040,
GET_BUFFER_GEOMETRY = 0x0080,
GET_REFRESH_RATE = 0x0100,
GET_COLOR_SPACE = 0x0200,
GET_MAP_SECURE_BUFFER = 0x0400,
GET_S3D_FORMAT = 0x0800,
GET_LINEAR_FORMAT = 0x1000,
GET_IGC = 0x2000,
GET_SINGLE_BUFFER_MODE = 0x4000,
GET_S3D_COMP = 0x8000,
};
struct private_handle_t;

View File

@@ -34,6 +34,24 @@
static const int kFBNodeMax = 4;
namespace qdutils {
static int parseLine(char *input, char *tokens[], const uint32_t maxToken, uint32_t *count) {
char *tmpToken = NULL;
char *tmpPtr;
uint32_t index = 0;
const char *delim = ", =\n";
if (!input) {
return -1;
}
tmpToken = strtok_r(input, delim, &tmpPtr);
while (tmpToken && index < maxToken) {
tokens[index++] = tmpToken;
tmpToken = strtok_r(NULL, delim, &tmpPtr);
}
*count = index;
return 0;
}
static int getExternalNode(const char *type) {
FILE *displayDeviceFP = NULL;
char fbType[MAX_FRAME_BUFFER_NAME_SIZE];
@@ -66,6 +84,92 @@ static int getExternalNode(const char *type) {
return -1;
}
static int querySDEInfoDRM(HWQueryType type, int *value) {
char property[PROPERTY_VALUE_MAX] = {0};
// TODO(user): If future targets don't support WB UBWC, add separate
// properties in target specific system.prop and have clients like WFD
// directly rely on those.
switch(type) {
case HAS_UBWC:
case HAS_WB_UBWC: // WFD stack still uses this
*value = 1;
property_get(DISABLE_UBWC_PROP, property, "0");
if(!(strncmp(property, "1", PROPERTY_VALUE_MAX)) ||
!(strncmp(property, "true", PROPERTY_VALUE_MAX))) {
*value = 0;
}
break;
default:
ALOGE("Invalid query type %d", type);
return -EINVAL;
}
return 0;
}
static int querySDEInfoFB(HWQueryType type, int *value) {
FILE *fileptr = NULL;
const char *featureName;
char stringBuffer[MAX_STRING_LENGTH];
uint32_t tokenCount = 0;
const uint32_t maxCount = 10;
char *tokens[maxCount] = { NULL };
switch(type) {
case HAS_UBWC:
featureName = "ubwc";
break;
case HAS_WB_UBWC:
featureName = "wb_ubwc";
break;
default:
ALOGE("Invalid query type %d", type);
return -EINVAL;
}
fileptr = fopen("/sys/devices/virtual/graphics/fb0/mdp/caps", "rb");
if (!fileptr) {
ALOGE("File '%s' not found", stringBuffer);
return -EINVAL;
}
size_t len = MAX_STRING_LENGTH;
ssize_t read;
char *line = stringBuffer;
while ((read = getline(&line, &len, fileptr)) != -1) {
// parse the line and update information accordingly
if (parseLine(line, tokens, maxCount, &tokenCount)) {
continue;
}
if (strncmp(tokens[0], "features", strlen("features"))) {
continue;
}
for (uint32_t i = 0; i < tokenCount; i++) {
if (!strncmp(tokens[i], featureName, strlen(featureName))) {
*value = 1;
}
}
}
fclose(fileptr);
return 0;
}
int querySDEInfo(HWQueryType type, int *value) {
if (!value) {
return -EINVAL;
}
if (getDriverType() == DriverType::DRM) {
return querySDEInfoDRM(type, value);
}
return querySDEInfoFB(type, value);
}
int getHDMINode(void) {
return getExternalNode("dtv panel");
}
@@ -97,4 +201,165 @@ int getEdidRawData(char *buffer)
return size;
}
bool isDPConnected() {
char connectPath[MAX_FRAME_BUFFER_NAME_SIZE];
FILE *connectFile = NULL;
size_t len = MAX_STRING_LENGTH;
char stringBuffer[MAX_STRING_LENGTH];
char *line = stringBuffer;
int nodeId = getExternalNode("dp panel");
if (nodeId < 0) {
ALOGE("%s no DP node found", __func__);
return false;
}
snprintf(connectPath, sizeof(connectPath),
"/sys/devices/virtual/graphics/fb%d/connected", nodeId);
connectFile = fopen(connectPath, "rb");
if (!connectFile) {
ALOGW("Failed to open connect node for device node %s", connectPath);
return false;
}
if (getline(&line, &len, connectFile) < 0) {
fclose(connectFile);
return false;
}
fclose(connectFile);
return atoi(line);
}
int getDPTestConfig(uint32_t *panelBpp, uint32_t *patternType) {
if (!panelBpp || !patternType) {
return -1;
}
char configPath[MAX_FRAME_BUFFER_NAME_SIZE];
FILE *configFile = NULL;
uint32_t tokenCount = 0;
const uint32_t maxCount = 10;
char *tokens[maxCount] = { NULL };
size_t len = MAX_STRING_LENGTH;
char stringBuffer[MAX_STRING_LENGTH];
char *line = stringBuffer;
int nodeId = getExternalNode("dp panel");
if (nodeId < 0) {
ALOGE("%s no DP node found", __func__);
return -EINVAL;
}
snprintf(configPath, sizeof(configPath),
"/sys/devices/virtual/graphics/fb%d/config", nodeId);
configFile = fopen(configPath, "rb");
if (!configFile) {
ALOGW("Failed to open config node for device node %s", configPath);
return -EINVAL;
}
while (getline(&line, &len, configFile) != -1) {
if (!parseLine(line, tokens, maxCount, &tokenCount)) {
if (tokens[0] != NULL) {
if (!strncmp(tokens[0], "bpp", strlen("bpp"))) {
*panelBpp = static_cast<uint32_t>(atoi(tokens[1]));
} else if (!strncmp(tokens[0], "pattern", strlen("pattern"))) {
*patternType = static_cast<uint32_t>(atoi(tokens[1]));
}
}
}
}
fclose(configFile);
return 0;
}
DriverType getDriverType() {
const char *fb_caps = "/sys/devices/virtual/graphics/fb0/mdp/caps";
// 0 - File exists
return access(fb_caps, F_OK) ? DriverType::DRM : DriverType::FB;
}
const char *GetHALPixelFormatString(int format) {
switch (format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
return "RGBA_8888";
case HAL_PIXEL_FORMAT_RGBX_8888:
return "RGBX_8888";
case HAL_PIXEL_FORMAT_RGB_888:
return "RGB_888";
case HAL_PIXEL_FORMAT_RGB_565:
return "RGB_565";
case HAL_PIXEL_FORMAT_BGR_565:
return "BGR_565";
case HAL_PIXEL_FORMAT_BGRA_8888:
return "BGRA_8888";
case HAL_PIXEL_FORMAT_RGBA_5551:
return "RGBA_5551";
case HAL_PIXEL_FORMAT_RGBA_4444:
return "RGBA_4444";
case HAL_PIXEL_FORMAT_YV12:
return "YV12";
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
return "YCbCr_422_SP_NV16";
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
return "YCrCb_420_SP_NV21";
case HAL_PIXEL_FORMAT_YCbCr_422_I:
return "YCbCr_422_I_YUY2";
case HAL_PIXEL_FORMAT_YCrCb_422_I:
return "YCrCb_422_I_YVYU";
case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
return "NV12_ENCODEABLE";
case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
return "YCbCr_420_SP_TILED_TILE_4x2";
case HAL_PIXEL_FORMAT_YCbCr_420_SP:
return "YCbCr_420_SP";
case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
return "YCrCb_420_SP_ADRENO";
case HAL_PIXEL_FORMAT_YCrCb_422_SP:
return "YCrCb_422_SP";
case HAL_PIXEL_FORMAT_R_8:
return "R_8";
case HAL_PIXEL_FORMAT_RG_88:
return "RG_88";
case HAL_PIXEL_FORMAT_INTERLACE:
return "INTERLACE";
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
return "YCbCr_420_SP_VENUS";
case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
return "YCrCb_420_SP_VENUS";
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
return "YCbCr_420_SP_VENUS_UBWC";
case HAL_PIXEL_FORMAT_RGBA_1010102:
return "RGBA_1010102";
case HAL_PIXEL_FORMAT_ARGB_2101010:
return "ARGB_2101010";
case HAL_PIXEL_FORMAT_RGBX_1010102:
return "RGBX_1010102";
case HAL_PIXEL_FORMAT_XRGB_2101010:
return "XRGB_2101010";
case HAL_PIXEL_FORMAT_BGRA_1010102:
return "BGRA_1010102";
case HAL_PIXEL_FORMAT_ABGR_2101010:
return "ABGR_2101010";
case HAL_PIXEL_FORMAT_BGRX_1010102:
return "BGRX_1010102";
case HAL_PIXEL_FORMAT_XBGR_2101010:
return "XBGR_2101010";
case HAL_PIXEL_FORMAT_YCbCr_420_P010:
return "YCbCr_420_P010";
case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
return "YCbCr_420_TP10_UBWC";
case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
return "YCbCr_420_P010_VENUS";
default:
return "Unknown_format";
}
}
}; //namespace qdutils