summaryrefslogtreecommitdiff
path: root/libqdutils
diff options
context:
space:
mode:
authorRay Zhang <rayz@codeaurora.org>2016-08-08 19:36:03 +0800
committerrayz <rayz@codeaurora.org>2016-08-17 17:40:04 +0800
commit8ace84d1171a61bf04c7e8c7d7c8cd77279fef6d (patch)
treeb6dde6eeffff53ea20b7b658c385d344ec1427a4 /libqdutils
parent31d3cc7e545fbd2101b74ab8689bfcaac16e6392 (diff)
downloaddisplay-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.cpp41
-rw-r--r--libqdutils/qdMetaData.h12
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