gralloc_priv.h revision a19f21d925628239ef52c8ce392fa4ada91df6fc
1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2008 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. 4cfd74d65d832137e20e193c960802afba73b5d38sm * 5cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 6cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 7cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 8cfd74d65d832137e20e193c960802afba73b5d38sm * 9cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 10cfd74d65d832137e20e193c960802afba73b5d38sm * 11cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 12cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 13cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 15cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 16cfd74d65d832137e20e193c960802afba73b5d38sm */ 17cfd74d65d832137e20e193c960802afba73b5d38sm 18cfd74d65d832137e20e193c960802afba73b5d38sm#ifndef GRALLOC_PRIV_H_ 19cfd74d65d832137e20e193c960802afba73b5d38sm#define GRALLOC_PRIV_H_ 20cfd74d65d832137e20e193c960802afba73b5d38sm 21cfd74d65d832137e20e193c960802afba73b5d38sm#include <stdint.h> 22cfd74d65d832137e20e193c960802afba73b5d38sm#include <limits.h> 23cfd74d65d832137e20e193c960802afba73b5d38sm#include <sys/cdefs.h> 24cfd74d65d832137e20e193c960802afba73b5d38sm#include <hardware/gralloc.h> 25cfd74d65d832137e20e193c960802afba73b5d38sm#include <pthread.h> 26cfd74d65d832137e20e193c960802afba73b5d38sm#include <errno.h> 27cfd74d65d832137e20e193c960802afba73b5d38sm#include <unistd.h> 28cfd74d65d832137e20e193c960802afba73b5d38sm 29cfd74d65d832137e20e193c960802afba73b5d38sm#include <cutils/native_handle.h> 30cfd74d65d832137e20e193c960802afba73b5d38sm 31cfd74d65d832137e20e193c960802afba73b5d38sm#include <linux/fb.h> 32cfd74d65d832137e20e193c960802afba73b5d38sm 33cfd74d65d832137e20e193c960802afba73b5d38sm#if defined(__cplusplus) && defined(HDMI_DUAL_DISPLAY) 34cfd74d65d832137e20e193c960802afba73b5d38sm#include "overlayLib.h" 35cfd74d65d832137e20e193c960802afba73b5d38smusing namespace overlay; 36cfd74d65d832137e20e193c960802afba73b5d38sm#endif 37cfd74d65d832137e20e193c960802afba73b5d38sm 38cfd74d65d832137e20e193c960802afba73b5d38sm#include <cutils/log.h> 39cfd74d65d832137e20e193c960802afba73b5d38sm 40cfd74d65d832137e20e193c960802afba73b5d38smenum { 41cfd74d65d832137e20e193c960802afba73b5d38sm /* gralloc usage bits indicating the type 42cfd74d65d832137e20e193c960802afba73b5d38sm * of allocation that should be used */ 43cfd74d65d832137e20e193c960802afba73b5d38sm 44cfd74d65d832137e20e193c960802afba73b5d38sm /* ADSP heap is deprecated, use only if using pmem */ 45cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_ADSP_HEAP = GRALLOC_USAGE_PRIVATE_0, 46cfd74d65d832137e20e193c960802afba73b5d38sm /* SF heap is used for application buffers, is not secured */ 47cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_UI_CONTIG_HEAP = GRALLOC_USAGE_PRIVATE_1, 48cfd74d65d832137e20e193c960802afba73b5d38sm /* SMI heap is deprecated, use only if using pmem */ 49cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_SMI_HEAP = GRALLOC_USAGE_PRIVATE_2, 50cfd74d65d832137e20e193c960802afba73b5d38sm /* SYSTEM heap comes from kernel vmalloc, 51cfd74d65d832137e20e193c960802afba73b5d38sm * can never be uncached, is not secured*/ 52cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP = GRALLOC_USAGE_PRIVATE_3, 53cfd74d65d832137e20e193c960802afba73b5d38sm /* IOMMU heap comes from manually allocated pages, 54cfd74d65d832137e20e193c960802afba73b5d38sm * can be cached/uncached, is not secured */ 55cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_IOMMU_HEAP = 0x01000000, 56cfd74d65d832137e20e193c960802afba73b5d38sm /* MM heap is a carveout heap for video, can be secured*/ 57cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_MM_HEAP = 0x02000000, 58cfd74d65d832137e20e193c960802afba73b5d38sm /* WRITEBACK heap is a carveout heap for writeback, can be secured*/ 59cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP = 0x04000000, 60cfd74d65d832137e20e193c960802afba73b5d38sm /* CAMERA heap is a carveout heap for camera, is not secured*/ 61cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_CAMERA_HEAP = 0x08000000, 62cfd74d65d832137e20e193c960802afba73b5d38sm 63cfd74d65d832137e20e193c960802afba73b5d38sm /* Set this for allocating uncached memory (using O_DSYNC) 64cfd74d65d832137e20e193c960802afba73b5d38sm * cannot be used with noncontiguous heaps */ 65cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_UNCACHED = 0x00100000, 66cfd74d65d832137e20e193c960802afba73b5d38sm 67cfd74d65d832137e20e193c960802afba73b5d38sm /* This flag needs to be set when using a non-contiguous heap from ION. 68cfd74d65d832137e20e193c960802afba73b5d38sm * If not set, the system heap is assumed to be coming from ashmem 69cfd74d65d832137e20e193c960802afba73b5d38sm */ 70cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_ION = 0x00200000, 71cfd74d65d832137e20e193c960802afba73b5d38sm 72cfd74d65d832137e20e193c960802afba73b5d38sm /* This flag can be set to disable genlock synchronization 73cfd74d65d832137e20e193c960802afba73b5d38sm * for the gralloc buffer. If this flag is set the caller 74cfd74d65d832137e20e193c960802afba73b5d38sm * is required to perform explicit synchronization. 75cfd74d65d832137e20e193c960802afba73b5d38sm * WARNING - flag is outside the standard PRIVATE region 76cfd74d65d832137e20e193c960802afba73b5d38sm * and may need to be moved if the gralloc API changes 77cfd74d65d832137e20e193c960802afba73b5d38sm */ 78cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_UNSYNCHRONIZED = 0X00400000, 79cfd74d65d832137e20e193c960802afba73b5d38sm 80cfd74d65d832137e20e193c960802afba73b5d38sm /* Set this flag when you need to avoid mapping the memory in userspace */ 81cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_PRIVATE_DO_NOT_MAP = 0X00800000, 82cfd74d65d832137e20e193c960802afba73b5d38sm 83cfd74d65d832137e20e193c960802afba73b5d38sm /* Buffer content should be displayed on an external display only */ 84cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_EXTERNAL_ONLY = 0x00010000, 85cfd74d65d832137e20e193c960802afba73b5d38sm 86cfd74d65d832137e20e193c960802afba73b5d38sm /* Only this buffer content should be displayed on external, even if 87cfd74d65d832137e20e193c960802afba73b5d38sm * other EXTERNAL_ONLY buffers are available. Used during suspend. 88cfd74d65d832137e20e193c960802afba73b5d38sm */ 89cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_USAGE_EXTERNAL_BLOCK = 0x00020000, 90cfd74d65d832137e20e193c960802afba73b5d38sm}; 91cfd74d65d832137e20e193c960802afba73b5d38sm 92cfd74d65d832137e20e193c960802afba73b5d38smenum { 93cfd74d65d832137e20e193c960802afba73b5d38sm /* Gralloc perform enums 94cfd74d65d832137e20e193c960802afba73b5d38sm */ 95cfd74d65d832137e20e193c960802afba73b5d38sm GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER = 0x080000001, 96cfd74d65d832137e20e193c960802afba73b5d38sm}; 97cfd74d65d832137e20e193c960802afba73b5d38sm 98cfd74d65d832137e20e193c960802afba73b5d38sm 99cfd74d65d832137e20e193c960802afba73b5d38smenum { 100cfd74d65d832137e20e193c960802afba73b5d38sm GPU_COMPOSITION, 101cfd74d65d832137e20e193c960802afba73b5d38sm C2D_COMPOSITION, 102cfd74d65d832137e20e193c960802afba73b5d38sm MDP_COMPOSITION, 103cfd74d65d832137e20e193c960802afba73b5d38sm CPU_COMPOSITION, 104cfd74d65d832137e20e193c960802afba73b5d38sm}; 105cfd74d65d832137e20e193c960802afba73b5d38sm 106cfd74d65d832137e20e193c960802afba73b5d38sm/* numbers of max buffers for page flipping */ 107cfd74d65d832137e20e193c960802afba73b5d38sm#define NUM_FRAMEBUFFERS_MIN 2 108cfd74d65d832137e20e193c960802afba73b5d38sm#define NUM_FRAMEBUFFERS_MAX 3 109cfd74d65d832137e20e193c960802afba73b5d38sm 110cfd74d65d832137e20e193c960802afba73b5d38sm/* number of default bufers for page flipping */ 111cfd74d65d832137e20e193c960802afba73b5d38sm#define NUM_DEF_FRAME_BUFFERS 2 112cfd74d65d832137e20e193c960802afba73b5d38sm#define NO_SURFACEFLINGER_SWAPINTERVAL 113cfd74d65d832137e20e193c960802afba73b5d38sm#define INTERLACE_MASK 0x80 114cfd74d65d832137e20e193c960802afba73b5d38sm#define S3D_FORMAT_MASK 0xFF000 115cfd74d65d832137e20e193c960802afba73b5d38sm#define COLOR_FORMAT(x) (x & 0xFFF) // Max range for colorFormats is 0 - FFF 116cfd74d65d832137e20e193c960802afba73b5d38sm#define DEVICE_PMEM "/dev/pmem" 117cfd74d65d832137e20e193c960802afba73b5d38sm#define DEVICE_PMEM_ADSP "/dev/pmem_adsp" 118cfd74d65d832137e20e193c960802afba73b5d38sm#define DEVICE_PMEM_SMIPOOL "/dev/pmem_smipool" 119cfd74d65d832137e20e193c960802afba73b5d38sm/*****************************************************************************/ 120cfd74d65d832137e20e193c960802afba73b5d38sm#ifdef __cplusplus 121cfd74d65d832137e20e193c960802afba73b5d38sm 122cfd74d65d832137e20e193c960802afba73b5d38sm//XXX: Remove framebuffer specific classes and defines to a different header 123cfd74d65d832137e20e193c960802afba73b5d38smtemplate <class T> 124cfd74d65d832137e20e193c960802afba73b5d38smstruct Node 125cfd74d65d832137e20e193c960802afba73b5d38sm{ 126cfd74d65d832137e20e193c960802afba73b5d38sm T data; 127cfd74d65d832137e20e193c960802afba73b5d38sm Node<T> *next; 128cfd74d65d832137e20e193c960802afba73b5d38sm}; 129cfd74d65d832137e20e193c960802afba73b5d38sm 130cfd74d65d832137e20e193c960802afba73b5d38smtemplate <class T> 131cfd74d65d832137e20e193c960802afba73b5d38smclass Queue 132cfd74d65d832137e20e193c960802afba73b5d38sm{ 133cfd74d65d832137e20e193c960802afba73b5d38smpublic: 134cfd74d65d832137e20e193c960802afba73b5d38sm Queue(): front(NULL), back(NULL), len(0) {dummy = new T;} 135cfd74d65d832137e20e193c960802afba73b5d38sm ~Queue() 136cfd74d65d832137e20e193c960802afba73b5d38sm { 137cfd74d65d832137e20e193c960802afba73b5d38sm clear(); 138cfd74d65d832137e20e193c960802afba73b5d38sm delete dummy; 139cfd74d65d832137e20e193c960802afba73b5d38sm } 140cfd74d65d832137e20e193c960802afba73b5d38sm void push(const T& item) //add an item to the back of the queue 141cfd74d65d832137e20e193c960802afba73b5d38sm { 142cfd74d65d832137e20e193c960802afba73b5d38sm if(len != 0) { //if the queue is not empty 143cfd74d65d832137e20e193c960802afba73b5d38sm back->next = new Node<T>; //create a new node 144cfd74d65d832137e20e193c960802afba73b5d38sm back = back->next; //set the new node as the back node 145cfd74d65d832137e20e193c960802afba73b5d38sm back->data = item; 146cfd74d65d832137e20e193c960802afba73b5d38sm back->next = NULL; 147cfd74d65d832137e20e193c960802afba73b5d38sm } else { 148cfd74d65d832137e20e193c960802afba73b5d38sm back = new Node<T>; 149cfd74d65d832137e20e193c960802afba73b5d38sm back->data = item; 150cfd74d65d832137e20e193c960802afba73b5d38sm back->next = NULL; 151cfd74d65d832137e20e193c960802afba73b5d38sm front = back; 152cfd74d65d832137e20e193c960802afba73b5d38sm } 153cfd74d65d832137e20e193c960802afba73b5d38sm len++; 154cfd74d65d832137e20e193c960802afba73b5d38sm } 155cfd74d65d832137e20e193c960802afba73b5d38sm void pop() //remove the first item from the queue 156cfd74d65d832137e20e193c960802afba73b5d38sm { 157cfd74d65d832137e20e193c960802afba73b5d38sm if (isEmpty()) 158cfd74d65d832137e20e193c960802afba73b5d38sm return; //if the queue is empty, no node to dequeue 159cfd74d65d832137e20e193c960802afba73b5d38sm T item = front->data; 160cfd74d65d832137e20e193c960802afba73b5d38sm Node<T> *tmp = front; 161cfd74d65d832137e20e193c960802afba73b5d38sm front = front->next; 162cfd74d65d832137e20e193c960802afba73b5d38sm delete tmp; 163cfd74d65d832137e20e193c960802afba73b5d38sm if(front == NULL) //if the queue is empty, update the back pointer 164cfd74d65d832137e20e193c960802afba73b5d38sm back = NULL; 165cfd74d65d832137e20e193c960802afba73b5d38sm len--; 166cfd74d65d832137e20e193c960802afba73b5d38sm return; 167cfd74d65d832137e20e193c960802afba73b5d38sm } 168cfd74d65d832137e20e193c960802afba73b5d38sm T& getHeadValue() const //return the value of the first item in the queue 169cfd74d65d832137e20e193c960802afba73b5d38sm { //without modification to the structure 170cfd74d65d832137e20e193c960802afba73b5d38sm if (isEmpty()) { 171cfd74d65d832137e20e193c960802afba73b5d38sm ALOGE("Error can't get head of empty queue"); 172cfd74d65d832137e20e193c960802afba73b5d38sm return *dummy; 173cfd74d65d832137e20e193c960802afba73b5d38sm } 174cfd74d65d832137e20e193c960802afba73b5d38sm return front->data; 175cfd74d65d832137e20e193c960802afba73b5d38sm } 176cfd74d65d832137e20e193c960802afba73b5d38sm 177cfd74d65d832137e20e193c960802afba73b5d38sm bool isEmpty() const //returns true if no elements are in the queue 178cfd74d65d832137e20e193c960802afba73b5d38sm { 179cfd74d65d832137e20e193c960802afba73b5d38sm return (front == NULL); 180cfd74d65d832137e20e193c960802afba73b5d38sm } 181cfd74d65d832137e20e193c960802afba73b5d38sm 182cfd74d65d832137e20e193c960802afba73b5d38sm size_t size() const //returns the amount of elements in the queue 183cfd74d65d832137e20e193c960802afba73b5d38sm { 184cfd74d65d832137e20e193c960802afba73b5d38sm return len; 185cfd74d65d832137e20e193c960802afba73b5d38sm } 186cfd74d65d832137e20e193c960802afba73b5d38sm 187cfd74d65d832137e20e193c960802afba73b5d38smprivate: 188cfd74d65d832137e20e193c960802afba73b5d38sm Node<T> *front; 189cfd74d65d832137e20e193c960802afba73b5d38sm Node<T> *back; 190cfd74d65d832137e20e193c960802afba73b5d38sm size_t len; 191cfd74d65d832137e20e193c960802afba73b5d38sm void clear() 192cfd74d65d832137e20e193c960802afba73b5d38sm { 193cfd74d65d832137e20e193c960802afba73b5d38sm while (!isEmpty()) 194cfd74d65d832137e20e193c960802afba73b5d38sm pop(); 195cfd74d65d832137e20e193c960802afba73b5d38sm } 196cfd74d65d832137e20e193c960802afba73b5d38sm T *dummy; 197cfd74d65d832137e20e193c960802afba73b5d38sm}; 198cfd74d65d832137e20e193c960802afba73b5d38sm#endif 199cfd74d65d832137e20e193c960802afba73b5d38sm 200cfd74d65d832137e20e193c960802afba73b5d38smenum { 201cfd74d65d832137e20e193c960802afba73b5d38sm /* OEM specific HAL formats */ 202cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_NV12_ENCODEABLE = 0x102, 203cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x108, 204cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_YCbCr_420_SP = 0x109, 205cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO = 0x10A, 206cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_YCrCb_422_SP = 0x10B, 207cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_R_8 = 0x10D, 208cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_RG_88 = 0x10E, 209cfd74d65d832137e20e193c960802afba73b5d38sm HAL_PIXEL_FORMAT_INTERLACE = 0x180, 210cfd74d65d832137e20e193c960802afba73b5d38sm 211cfd74d65d832137e20e193c960802afba73b5d38sm}; 212cfd74d65d832137e20e193c960802afba73b5d38sm 213cfd74d65d832137e20e193c960802afba73b5d38sm/* possible formats for 3D content*/ 214cfd74d65d832137e20e193c960802afba73b5d38smenum { 215cfd74d65d832137e20e193c960802afba73b5d38sm HAL_NO_3D = 0x0000, 216cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_IN_SIDE_BY_SIDE_L_R = 0x10000, 217cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_IN_TOP_BOTTOM = 0x20000, 218cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_IN_INTERLEAVE = 0x40000, 219cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_IN_SIDE_BY_SIDE_R_L = 0x80000, 220cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_OUT_SIDE_BY_SIDE = 0x1000, 221cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_OUT_TOP_BOTTOM = 0x2000, 222cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_OUT_INTERLEAVE = 0x4000, 223cfd74d65d832137e20e193c960802afba73b5d38sm HAL_3D_OUT_MONOSCOPIC = 0x8000 224cfd74d65d832137e20e193c960802afba73b5d38sm}; 225cfd74d65d832137e20e193c960802afba73b5d38sm 226cfd74d65d832137e20e193c960802afba73b5d38smenum { 227cfd74d65d832137e20e193c960802afba73b5d38sm BUFFER_TYPE_UI = 0, 228cfd74d65d832137e20e193c960802afba73b5d38sm BUFFER_TYPE_VIDEO 229cfd74d65d832137e20e193c960802afba73b5d38sm}; 230cfd74d65d832137e20e193c960802afba73b5d38sm 231cfd74d65d832137e20e193c960802afba73b5d38sm#if defined(HDMI_DUAL_DISPLAY) 232cfd74d65d832137e20e193c960802afba73b5d38smenum hdmi_mirroring_state { 233cfd74d65d832137e20e193c960802afba73b5d38sm HDMI_NO_MIRRORING, 234cfd74d65d832137e20e193c960802afba73b5d38sm HDMI_UI_MIRRORING, 235cfd74d65d832137e20e193c960802afba73b5d38sm HDMI_ORIGINAL_RESOLUTION_MIRRORING 236cfd74d65d832137e20e193c960802afba73b5d38sm}; 237cfd74d65d832137e20e193c960802afba73b5d38sm#endif 238cfd74d65d832137e20e193c960802afba73b5d38sm/*****************************************************************************/ 239cfd74d65d832137e20e193c960802afba73b5d38sm 240cfd74d65d832137e20e193c960802afba73b5d38smstruct private_module_t; 241cfd74d65d832137e20e193c960802afba73b5d38smstruct private_handle_t; 242cfd74d65d832137e20e193c960802afba73b5d38smstruct PmemAllocator; 243cfd74d65d832137e20e193c960802afba73b5d38sm 244cfd74d65d832137e20e193c960802afba73b5d38smstruct qbuf_t { 245cfd74d65d832137e20e193c960802afba73b5d38sm buffer_handle_t buf; 246cfd74d65d832137e20e193c960802afba73b5d38sm int idx; 247cfd74d65d832137e20e193c960802afba73b5d38sm}; 248cfd74d65d832137e20e193c960802afba73b5d38sm 249cfd74d65d832137e20e193c960802afba73b5d38smenum buf_state { 250cfd74d65d832137e20e193c960802afba73b5d38sm SUB, 251cfd74d65d832137e20e193c960802afba73b5d38sm REF, 252cfd74d65d832137e20e193c960802afba73b5d38sm AVL 253cfd74d65d832137e20e193c960802afba73b5d38sm}; 254cfd74d65d832137e20e193c960802afba73b5d38sm 255cfd74d65d832137e20e193c960802afba73b5d38smstruct avail_t { 256cfd74d65d832137e20e193c960802afba73b5d38sm pthread_mutex_t lock; 257cfd74d65d832137e20e193c960802afba73b5d38sm pthread_cond_t cond; 258cfd74d65d832137e20e193c960802afba73b5d38sm#ifdef __cplusplus 259cfd74d65d832137e20e193c960802afba73b5d38sm bool is_avail; 260cfd74d65d832137e20e193c960802afba73b5d38sm buf_state state; 261cfd74d65d832137e20e193c960802afba73b5d38sm#endif 262cfd74d65d832137e20e193c960802afba73b5d38sm}; 263cfd74d65d832137e20e193c960802afba73b5d38sm 264cfd74d65d832137e20e193c960802afba73b5d38smstruct private_module_t { 265cfd74d65d832137e20e193c960802afba73b5d38sm gralloc_module_t base; 266cfd74d65d832137e20e193c960802afba73b5d38sm 267cfd74d65d832137e20e193c960802afba73b5d38sm struct private_handle_t* framebuffer; 268cfd74d65d832137e20e193c960802afba73b5d38sm uint32_t fbFormat; 269cfd74d65d832137e20e193c960802afba73b5d38sm uint32_t flags; 270cfd74d65d832137e20e193c960802afba73b5d38sm uint32_t numBuffers; 271cfd74d65d832137e20e193c960802afba73b5d38sm uint32_t bufferMask; 272cfd74d65d832137e20e193c960802afba73b5d38sm pthread_mutex_t lock; 273cfd74d65d832137e20e193c960802afba73b5d38sm buffer_handle_t currentBuffer; 274cfd74d65d832137e20e193c960802afba73b5d38sm 275cfd74d65d832137e20e193c960802afba73b5d38sm struct fb_var_screeninfo info; 276cfd74d65d832137e20e193c960802afba73b5d38sm struct fb_fix_screeninfo finfo; 277cfd74d65d832137e20e193c960802afba73b5d38sm float xdpi; 278cfd74d65d832137e20e193c960802afba73b5d38sm float ydpi; 279 float fps; 280 int swapInterval; 281#ifdef __cplusplus 282 Queue<struct qbuf_t> disp; // non-empty when buffer is ready for display 283#endif 284 int currentIdx; 285 struct avail_t avail[NUM_FRAMEBUFFERS_MAX]; 286 pthread_mutex_t qlock; 287 pthread_cond_t qpost; 288 289 enum { 290 // flag to indicate we'll post this buffer 291 PRIV_USAGE_LOCKED_FOR_POST = 0x80000000, 292 PRIV_MIN_SWAP_INTERVAL = 0, 293 PRIV_MAX_SWAP_INTERVAL = 1, 294 }; 295#if defined(__cplusplus) && defined(HDMI_DUAL_DISPLAY) 296 Overlay* pobjOverlay; 297 int orientation; 298 bool videoOverlay; 299 uint32_t currentOffset; 300 int enableHDMIOutput; // holds the type of external display 301 bool trueMirrorSupport; 302 bool exitHDMIUILoop; 303 float actionsafeWidthRatio; 304 float actionsafeHeightRatio; 305 bool hdmiStateChanged; 306 hdmi_mirroring_state hdmiMirroringState; 307 pthread_mutex_t overlayLock; 308 pthread_cond_t overlayPost; 309#endif 310}; 311 312/*****************************************************************************/ 313 314#ifdef __cplusplus 315struct private_handle_t : public native_handle { 316#else 317struct private_handle_t { 318 native_handle_t nativeHandle; 319#endif 320 enum { 321 PRIV_FLAGS_FRAMEBUFFER = 0x00000001, 322 PRIV_FLAGS_USES_PMEM = 0x00000002, 323 PRIV_FLAGS_USES_PMEM_ADSP = 0x00000004, 324 PRIV_FLAGS_USES_ION = 0x00000008, 325 PRIV_FLAGS_USES_ASHMEM = 0x00000010, 326 PRIV_FLAGS_NEEDS_FLUSH = 0x00000020, 327 PRIV_FLAGS_DO_NOT_FLUSH = 0x00000040, 328 PRIV_FLAGS_SW_LOCK = 0x00000080, 329 PRIV_FLAGS_NONCONTIGUOUS_MEM = 0x00000100, 330 PRIV_FLAGS_HWC_LOCK = 0x00000200, // Set by HWC when storing the handle 331 PRIV_FLAGS_SECURE_BUFFER = 0x00000400, 332 PRIV_FLAGS_UNSYNCHRONIZED = 0x00000800, // For explicit synchronization 333 PRIV_FLAGS_NOT_MAPPED = 0x00001000, // Not mapped in userspace 334 PRIV_FLAGS_EXTERNAL_ONLY = 0x00002000, // Display on external only 335 PRIV_FLAGS_EXTERNAL_BLOCK = 0x00004000, // Display only this buffer on external 336 }; 337 338 // file-descriptors 339 int fd; 340 int genlockHandle; // genlock handle to be dup'd by the binder 341 // ints 342 int magic; 343 int flags; 344 int size; 345 int offset; 346 int bufferType; 347 348 // FIXME: the attributes below should be out-of-line 349 int base; 350 int gpuaddr; // The gpu address mapped into the mmu. If using ashmem, set to 0 They don't care 351 int pid; 352 int format; 353 int width; 354 int height; 355 int genlockPrivFd; // local fd of the genlock device. 356 357#ifdef __cplusplus 358 static const int sNumInts = 12; 359 static const int sNumFds = 2; 360 static const int sMagic = 'gmsm'; 361 362 private_handle_t(int fd, int size, int flags, int bufferType, int format, int width, int height) : 363 fd(fd), genlockHandle(-1), magic(sMagic), flags(flags), size(size), offset(0), 364 bufferType(bufferType), base(0), gpuaddr(0), pid(getpid()), format(format), 365 width(width), height(height), genlockPrivFd(-1) 366 { 367 version = sizeof(native_handle); 368 numInts = sNumInts; 369 numFds = sNumFds; 370 } 371 ~private_handle_t() { 372 magic = 0; 373 } 374 375 bool usesPhysicallyContiguousMemory() { 376 return (flags & PRIV_FLAGS_USES_PMEM) != 0; 377 } 378 379 static int validate(const native_handle* h) { 380 const private_handle_t* hnd = (const private_handle_t*)h; 381 if (!h || h->version != sizeof(native_handle) || 382 h->numInts != sNumInts || h->numFds != sNumFds || 383 hnd->magic != sMagic) 384 { 385 ALOGE("invalid gralloc handle (at %p)", h); 386 return -EINVAL; 387 } 388 return 0; 389 } 390 391 static private_handle_t* dynamicCast(const native_handle* in) { 392 if (validate(in) == 0) { 393 return (private_handle_t*) in; 394 } 395 return NULL; 396 } 397#endif 398}; 399 400#endif /* GRALLOC_PRIV_H_ */ 401