diff options
author | Ray Zhang <rayz@codeaurora.org> | 2016-08-08 19:36:03 +0800 |
---|---|---|
committer | rayz <rayz@codeaurora.org> | 2016-08-17 17:40:04 +0800 |
commit | 8ace84d1171a61bf04c7e8c7d7c8cd77279fef6d (patch) | |
tree | b6dde6eeffff53ea20b7b658c385d344ec1427a4 /libqdutils | |
parent | 31d3cc7e545fbd2101b74ab8689bfcaac16e6392 (diff) | |
download | display-8ace84d1171a61bf04c7e8c7d7c8cd77279fef6d.tar.gz |
sdm: Notify surfaceflinger to draw S3D framebuffer target
Set S3D flag to private handle so that SurfaceFlinger can help
to draw S3D framebuffer target according to the flag in case
MDP can not handle some of S3D cases.
Change-Id: Ic39d0c0dd47c71e8a677d1e52af2c485494235b3
CRs-fixed: 999055
Diffstat (limited to 'libqdutils')
-rw-r--r-- | libqdutils/qdMetaData.cpp | 41 | ||||
-rw-r--r-- | libqdutils/qdMetaData.h | 12 |
2 files changed, 52 insertions, 1 deletions
diff --git a/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp index 72edfdf4..130cf46b 100644 --- a/libqdutils/qdMetaData.cpp +++ b/libqdutils/qdMetaData.cpp @@ -87,6 +87,43 @@ int setMetaData(private_handle_t *handle, DispParamType paramType, case SET_SINGLE_BUFFER_MODE: data->isSingleBufferMode = *((uint32_t *)param); break; + case SET_S3D_COMP: + data->s3dComp = *((S3DGpuComp_t *)param); + break; + default: + ALOGE("Unknown paramType %d", paramType); + break; + } + if(munmap(base, size)) + ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base, + errno); + return 0; +} + +int clearMetaData(private_handle_t *handle, DispParamType paramType) { + if (!handle) { + ALOGE("%s: Private handle is null!", __func__); + return -1; + } + if (handle->fd_metadata == -1) { + ALOGE("%s: Bad fd for extra data!", __func__); + return -1; + } + + unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); + void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, + handle->fd_metadata, 0); + if (base == reinterpret_cast<void*>(MAP_FAILED)) { + ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno)); + return -1; + } + MetaData_t *data = reinterpret_cast <MetaData_t *>(base); + data->operation &= ~paramType; + switch (paramType) { + case SET_S3D_COMP: + data->s3dComp.displayId = -1; + data->s3dComp.s3dMode = 0; + break; default: ALOGE("Unknown paramType %d", paramType); break; @@ -120,7 +157,6 @@ int getMetaData(private_handle_t *handle, DispFetchParamType paramType, } MetaData_t *data = reinterpret_cast <MetaData_t *>(base); - data->operation |= paramType; switch (paramType) { case GET_PP_PARAM_INTERLACED: *((int32_t *)param) = data->interlaced; @@ -149,6 +185,9 @@ int getMetaData(private_handle_t *handle, DispFetchParamType paramType, case GET_SINGLE_BUFFER_MODE: *((uint32_t *)param) = data->isSingleBufferMode ; break; + case GET_S3D_COMP: + *((S3DGpuComp_t *)param) = data->s3dComp; + break; default: ALOGE("Unknown paramType %d", paramType); break; diff --git a/libqdutils/qdMetaData.h b/libqdutils/qdMetaData.h index fd4f4447..8c0a0b09 100644 --- a/libqdutils/qdMetaData.h +++ b/libqdutils/qdMetaData.h @@ -57,6 +57,11 @@ struct BufferDim_t { int32_t sliceHeight; }; +struct S3DGpuComp_t { + int32_t displayId; /* on which display S3D is composed by client */ + uint32_t s3dMode; /* the S3D format of this layer to be accessed by client */ +}; + struct MetaData_t { int32_t operation; int32_t interlaced; @@ -79,6 +84,8 @@ struct MetaData_t { /* Set by graphics to indicate that this buffer will be written to but not * swapped out */ uint32_t isSingleBufferMode; + /* Indicate GPU to draw S3D layer on dedicate display device */ + struct S3DGpuComp_t s3dComp; }; enum DispParamType { @@ -97,6 +104,7 @@ enum DispParamType { LINEAR_FORMAT = 0x1000, SET_IGC = 0x2000, SET_SINGLE_BUFFER_MODE = 0x4000, + SET_S3D_COMP = 0x8000, }; enum DispFetchParamType { @@ -109,6 +117,7 @@ enum DispFetchParamType { GET_LINEAR_FORMAT = 0x1000, GET_IGC = 0x2000, GET_SINGLE_BUFFER_MODE = 0x4000, + GET_S3D_COMP = 0x8000, }; struct private_handle_t; @@ -119,6 +128,9 @@ int getMetaData(struct private_handle_t *handle, enum DispFetchParamType paramTy void *param); int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst); + +int clearMetaData(struct private_handle_t *handle, enum DispParamType paramType); + #ifdef __cplusplus } #endif |