summaryrefslogtreecommitdiff
path: root/libqdutils
diff options
context:
space:
mode:
authorArun Kumar K.R <akumarkr@codeaurora.org>2017-03-08 19:00:02 -0800
committerNaseer Ahmed <naseer@codeaurora.org>2017-03-28 21:14:21 -0400
commit3e45ac42f4b6fac6772455237ae15b891511fb9d (patch)
treefb966594962ffb10d91f9a160abc6c504736655a /libqdutils
parentbaa39c57743371f9304a0f9f8493f7189e92bfca (diff)
downloaddisplay-3e45ac42f4b6fac6772455237ae15b891511fb9d.tar.gz
display: Use getMetaData in hwc2
Use getMetaData API to get the metadata information in hwc2. As it maps the metadata in the process before accessing it. Change-Id: I346d223058e6eadb00f16bb9f2be8a46e87fbdef CRs-fixed: 2019985
Diffstat (limited to 'libqdutils')
-rw-r--r--libqdutils/qdMetaData.cpp71
1 files changed, 55 insertions, 16 deletions
diff --git a/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp
index 8f1e6171..cd7727ff 100644
--- a/libqdutils/qdMetaData.cpp
+++ b/libqdutils/qdMetaData.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -145,8 +145,9 @@ int clearMetaData(private_handle_t *handle, DispParamType paramType) {
int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
void *param) {
- if (!handle) {
- ALOGE("%s: Private handle is null!", __func__);
+ int ret = -1;
+ if (private_handle_t::validate(handle)) {
+ ALOGE("%s: Private handle is invalid! handle=%p", __func__, handle);
return -1;
}
if (handle->fd_metadata == -1) {
@@ -158,6 +159,8 @@ int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
return -1;
}
unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
+ // TODO: must be mmapped once and freed when the handle gets freed rather
+ // than mapping and un-mapping while getting each metadata field
void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
handle->fd_metadata, 0);
if (base == reinterpret_cast<void*>(MAP_FAILED)) {
@@ -168,41 +171,77 @@ int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
switch (paramType) {
case GET_PP_PARAM_INTERLACED:
- *((int32_t *)param) = data->interlaced;
+ if (data->operation & PP_PARAM_INTERLACED) {
+ *((int32_t *)param) = data->interlaced;
+ ret = 0;
+ }
break;
case GET_BUFFER_GEOMETRY:
- *((BufferDim_t *)param) = data->bufferDim;
+ if (data->operation & UPDATE_BUFFER_GEOMETRY) {
+ *((BufferDim_t *)param) = data->bufferDim;
+ ret = 0;
+ }
break;
case GET_REFRESH_RATE:
- *((float *)param) = data->refreshrate;
+ if (data->operation & UPDATE_REFRESH_RATE) {
+ *((float *)param) = data->refreshrate;
+ ret = 0;
+ }
break;
case GET_COLOR_SPACE:
- *((ColorSpace_t *)param) = data->colorSpace;
+ if (data->operation & UPDATE_COLOR_SPACE) {
+ *((ColorSpace_t *)param) = data->colorSpace;
+ ret = 0;
+ }
break;
case GET_MAP_SECURE_BUFFER:
- *((int32_t *)param) = data->mapSecureBuffer;
+ if (data->operation & MAP_SECURE_BUFFER) {
+ *((int32_t *)param) = data->mapSecureBuffer;
+ ret = 0;
+ }
break;
case GET_S3D_FORMAT:
- *((uint32_t *)param) = data->s3dFormat;
+ if (data->operation & S3D_FORMAT) {
+ *((uint32_t *)param) = data->s3dFormat;
+ ret = 0;
+ }
break;
case GET_LINEAR_FORMAT:
- *((uint32_t *)param) = data->linearFormat;
+ if (data->operation & LINEAR_FORMAT) {
+ *((uint32_t *)param) = data->linearFormat;
+ ret = 0;
+ }
break;
case GET_IGC:
- *((IGC_t *)param) = data->igc;
+ if (data->operation & SET_IGC) {
+ *((IGC_t *)param) = data->igc;
+ ret = 0;
+ }
break;
case GET_SINGLE_BUFFER_MODE:
- *((uint32_t *)param) = data->isSingleBufferMode ;
+ if (data->operation & SET_SINGLE_BUFFER_MODE) {
+ *((uint32_t *)param) = data->isSingleBufferMode;
+ ret = 0;
+ }
break;
case GET_S3D_COMP:
- *((S3DGpuComp_t *)param) = data->s3dComp;
+ if (data->operation & SET_S3D_COMP) {
+ *((S3DGpuComp_t *)param) = data->s3dComp;
+ ret = 0;
+ }
break;
case GET_VT_TIMESTAMP:
- *((uint64_t *)param) = data->vtTimeStamp;
+ if (data->operation & SET_VT_TIMESTAMP) {
+ *((uint64_t *)param) = data->vtTimeStamp;
+ ret = 0;
+ }
break;
#ifdef USE_COLOR_METADATA
case GET_COLOR_METADATA:
- *((ColorMetaData *)param) = data->color;
+ if (data->operation & COLOR_METADATA) {
+ *((ColorMetaData *)param) = data->color;
+ ret = 0;
+ }
#endif
break;
default:
@@ -212,7 +251,7 @@ int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
if(munmap(base, size))
ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
errno);
- return 0;
+ return ret;
}
int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {