From 3e45ac42f4b6fac6772455237ae15b891511fb9d Mon Sep 17 00:00:00 2001 From: "Arun Kumar K.R" Date: Wed, 8 Mar 2017 19:00:02 -0800 Subject: 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 --- libqdutils/qdMetaData.cpp | 71 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 16 deletions(-) (limited to 'libqdutils') 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(MAP_FAILED)) { @@ -168,41 +171,77 @@ int getMetaData(private_handle_t *handle, DispFetchParamType paramType, MetaData_t *data = reinterpret_cast (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) { -- cgit v1.2.3