| /* |
| * Copyright (c) 2020 The Linux Foundation. All rights reserved. |
| * |
| * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * Neither the name of The Linux Foundation. nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /* |
| * Changes from Qualcomm Innovation Center are provided under the following license: |
| * |
| * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. |
| * SPDX-License-Identifier: BSD-3-Clause-Clear |
| */ |
| |
| #ifndef __QTIGRALLOCPRIV_H__ |
| #define __QTIGRALLOCPRIV_H__ |
| |
| #include <color_metadata.h> |
| #include <cutils/native_handle.h> |
| #include <log/log.h> |
| |
| #include <cinttypes> |
| #include <string> |
| |
| #include "QtiGrallocMetadata.h" |
| |
| |
| /* |
| * |
| * DISCLAIMER: |
| * INTERNAL GRALLOC USE ONLY - THIS FILE SHOULD NOT BE INCLUDED BY GRALLOC CLIENTS |
| * The location will be changed and this file will not be exposed |
| * once qdMetaData copy functions are deprecated |
| * |
| */ |
| |
| #define METADATA_V2 |
| |
| // TODO: MetaData_t should be in qtigralloc namespace |
| struct MetaData_t { |
| int32_t operation; |
| int32_t interlaced; |
| float refreshrate; |
| int32_t mapSecureBuffer; |
| /* Deprecated */ |
| uint32_t s3dFormat; |
| /* VENUS output buffer is linear for UBWC Interlaced video */ |
| uint32_t linearFormat; |
| /* Set by graphics to indicate that this buffer will be written to but not |
| * swapped out */ |
| uint32_t isSingleBufferMode; |
| |
| /* Set by camera to program the VT Timestamp */ |
| uint64_t vtTimeStamp; |
| /* Color Aspects + HDR info */ |
| ColorMetaData color; |
| /* Consumer should read this data as follows based on |
| * Gralloc flag "interlaced" listed above. |
| * [0] : If it is progressive. |
| * [0] : Top field, if it is interlaced. |
| * [1] : Do not read, if it is progressive. |
| * [1] : Bottom field, if it is interlaced. |
| */ |
| struct UBWCStats ubwcCRStats[UBWC_STATS_ARRAY_SIZE]; |
| /* 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; |
| /* Video histogram stats populated by video decoder */ |
| struct VideoHistogramMetadata video_histogram_stats; |
| /* |
| * Producer (camera) will set cvp metadata and consumer (video) will |
| * use it. The format of metadata is known to producer and consumer. |
| */ |
| CVPMetadata cvpMetadata; |
| CropRectangle_t crop; |
| int32_t blendMode; |
| char name[MAX_NAME_LEN]; |
| ReservedRegion reservedRegion; |
| bool isStandardMetadataSet[METADATA_SET_SIZE]; |
| bool isVendorMetadataSet[METADATA_SET_SIZE]; |
| uint64_t reservedSize; |
| VideoTimestampInfo videoTsInfo; |
| BufferPermission bufferPerm[BUFFER_CLIENT_MAX]; |
| int64_t memHandle; |
| |
| /* Set by clients to indicate that timed rendering will be enabled |
| * or disabled for this buffer. */ |
| uint32_t timedRendering; |
| /* Video transcode stat populated by video decoder */ |
| struct VideoTranscodeStatsMetadata video_transcode_stats; |
| int32_t videoEarlyNotifyLineCount; |
| char heapName[MAX_NAME_LEN]; |
| /* Last buffer dequeue duration used by SmoMo to detect blocking */ |
| int64_t bufferDequeueDuration; |
| }; |
| |
| namespace qtigralloc { |
| #define QTI_HANDLE_CONST(exp) static_cast<const private_handle_t *>(exp) |
| |
| #pragma pack(push, 4) |
| struct private_handle_t : public native_handle_t { |
| // file-descriptors dup'd over IPC |
| int fd; |
| int fd_metadata; |
| |
| // values sent over IPC |
| int magic; |
| int flags; |
| int width; // holds width of the actual buffer allocated |
| int height; // holds height of the actual buffer allocated |
| int unaligned_width; // holds width client asked to allocate |
| int unaligned_height; // holds height client asked to allocate |
| int format; |
| int buffer_type; |
| unsigned int layer_count; |
| uint64_t id; |
| uint64_t usage; |
| |
| unsigned int size; |
| unsigned int offset; |
| unsigned int offset_metadata; |
| uint64_t base; |
| uint64_t base_metadata; |
| uint64_t gpuaddr; |
| unsigned int reserved_size; |
| unsigned int custom_content_md_reserved_size; |
| static const int kNumFds = 2; |
| static const int kMagic = 'gmsm'; |
| unsigned int linear_size; |
| int ubwcp_format; |
| |
| static inline int NumInts() { |
| return ((sizeof(private_handle_t) - sizeof(native_handle_t)) / sizeof(int)) - kNumFds; |
| } |
| |
| private_handle_t(int fd, int meta_fd, int flags, int width, int height, int uw, int uh, |
| int format, int buf_type, unsigned int size, uint64_t usage = 0) |
| : fd(fd), |
| fd_metadata(meta_fd), |
| magic(kMagic), |
| flags(flags), |
| width(width), |
| height(height), |
| unaligned_width(uw), |
| unaligned_height(uh), |
| format(format), |
| buffer_type(buf_type), |
| layer_count(1), |
| id(0), |
| usage(usage), |
| size(size), |
| offset(0), |
| offset_metadata(0), |
| base(0), |
| base_metadata(0), |
| gpuaddr(0), |
| reserved_size(0), |
| linear_size(0), |
| ubwcp_format(format), |
| custom_content_md_reserved_size(0) { |
| version = static_cast<int>(sizeof(native_handle)); |
| numInts = NumInts(); |
| numFds = kNumFds; |
| } |
| |
| ~private_handle_t() { magic = 0; } |
| |
| static int validate(const native_handle *h) { |
| auto *hnd = static_cast<const private_handle_t *>(h); |
| if (!h || h->version != sizeof(native_handle) || h->numInts != NumInts() || |
| h->numFds != kNumFds) { |
| ALOGW("Invalid gralloc handle (at %p): ver(%d/%zu) ints(%d/%d) fds(%d/%d)", h, |
| h ? h->version : -1, sizeof(native_handle), h ? h->numInts : -1, NumInts(), |
| h ? h->numFds : -1, kNumFds); |
| return -1; |
| } |
| if (hnd->magic != kMagic) { |
| ALOGE("handle = %p invalid magic(%c%c%c%c/%c%c%c%c)", hnd, |
| hnd ? (((hnd->magic >> 24) & 0xFF) ? ((hnd->magic >> 24) & 0xFF) : '-') : '?', |
| hnd ? (((hnd->magic >> 16) & 0xFF) ? ((hnd->magic >> 16) & 0xFF) : '-') : '?', |
| hnd ? (((hnd->magic >> 8) & 0xFF) ? ((hnd->magic >> 8) & 0xFF) : '-') : '?', |
| hnd ? (((hnd->magic >> 0) & 0xFF) ? ((hnd->magic >> 0) & 0xFF) : '-') : '?', |
| (kMagic >> 24) & 0xFF, (kMagic >> 16) & 0xFF, (kMagic >> 8) & 0xFF, |
| (kMagic >> 0) & 0xFF); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| static void Dump(const private_handle_t *hnd) { |
| ALOGD("handle id:%" PRIu64 |
| " wxh:%dx%d uwxuh:%dx%d size: %d fd:%d fd_meta:%d flags:0x%x " |
| "usage:0x%" PRIx64 " format:0x%x layer_count: %d reserved_size = %d " |
| "custom_content_md_reserved_size = %u", |
| hnd->id, hnd->width, hnd->height, hnd->unaligned_width, hnd->unaligned_height, hnd->size, |
| hnd->fd, hnd->fd_metadata, hnd->flags, hnd->usage, hnd->format, hnd->layer_count, |
| hnd->reserved_size, hnd->custom_content_md_reserved_size); |
| } |
| }; |
| #pragma pack(pop) |
| |
| } // namespace qtigralloc |
| |
| #endif //__QTIGRALLOCPRIV_H__ |