qcom/display: Update HALs
- Update the display HAL from Code Aurora Forum
- Add updated overlay library
- Enable HWC with basic video going through overlay
- Cleanup some files
Change-Id: I65c687c51be458cee71213c79e03eeda962d9086
diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h
index 0679621..846a611 100644
--- a/libgralloc/gralloc_priv.h
+++ b/libgralloc/gralloc_priv.h
@@ -28,13 +28,6 @@
#include <cutils/native_handle.h>
-#include <linux/fb.h>
-
-#if defined(__cplusplus) && defined(HDMI_DUAL_DISPLAY)
-#include "overlayLib.h"
-using namespace overlay;
-#endif
-
#include <cutils/log.h>
enum {
@@ -87,6 +80,14 @@
* other EXTERNAL_ONLY buffers are available. Used during suspend.
*/
GRALLOC_USAGE_EXTERNAL_BLOCK = 0x00020000,
+
+ /* Use this flag to request content protected buffers. Please note
+ * that this flag is different from the GRALLOC_USAGE_PROTECTED flag
+ * which can be used for buffers that are not secured for DRM
+ * but still need to be protected from screen captures
+ * 0x00040000 is reserved and these values are subject to change.
+ */
+ GRALLOC_USAGE_PRIVATE_CP_BUFFER = 0x00080000,
};
enum {
@@ -96,107 +97,12 @@
};
-enum {
- GPU_COMPOSITION,
- C2D_COMPOSITION,
- MDP_COMPOSITION,
- CPU_COMPOSITION,
-};
-
-/* numbers of max buffers for page flipping */
-#define NUM_FRAMEBUFFERS_MIN 2
-#define NUM_FRAMEBUFFERS_MAX 3
-
-/* number of default bufers for page flipping */
-#define NUM_DEF_FRAME_BUFFERS 2
-#define NO_SURFACEFLINGER_SWAPINTERVAL
#define INTERLACE_MASK 0x80
#define S3D_FORMAT_MASK 0xFF000
-#define COLOR_FORMAT(x) (x & 0xFFF) // Max range for colorFormats is 0 - FFF
#define DEVICE_PMEM "/dev/pmem"
#define DEVICE_PMEM_ADSP "/dev/pmem_adsp"
#define DEVICE_PMEM_SMIPOOL "/dev/pmem_smipool"
/*****************************************************************************/
-#ifdef __cplusplus
-
-//XXX: Remove framebuffer specific classes and defines to a different header
-template <class T>
-struct Node
-{
- T data;
- Node<T> *next;
-};
-
-template <class T>
-class Queue
-{
-public:
- Queue(): front(NULL), back(NULL), len(0) {dummy = new T;}
- ~Queue()
- {
- clear();
- delete dummy;
- }
- void push(const T& item) //add an item to the back of the queue
- {
- if(len != 0) { //if the queue is not empty
- back->next = new Node<T>; //create a new node
- back = back->next; //set the new node as the back node
- back->data = item;
- back->next = NULL;
- } else {
- back = new Node<T>;
- back->data = item;
- back->next = NULL;
- front = back;
- }
- len++;
- }
- void pop() //remove the first item from the queue
- {
- if (isEmpty())
- return; //if the queue is empty, no node to dequeue
- T item = front->data;
- Node<T> *tmp = front;
- front = front->next;
- delete tmp;
- if(front == NULL) //if the queue is empty, update the back pointer
- back = NULL;
- len--;
- return;
- }
- T& getHeadValue() const //return the value of the first item in the queue
- { //without modification to the structure
- if (isEmpty()) {
- ALOGE("Error can't get head of empty queue");
- return *dummy;
- }
- return front->data;
- }
-
- bool isEmpty() const //returns true if no elements are in the queue
- {
- return (front == NULL);
- }
-
- size_t size() const //returns the amount of elements in the queue
- {
- return len;
- }
-
-private:
- Node<T> *front;
- Node<T> *back;
- size_t len;
- void clear()
- {
- while (!isEmpty())
- pop();
- }
- T *dummy;
-};
-#endif
-
enum {
/* OEM specific HAL formats */
HAL_PIXEL_FORMAT_NV12_ENCODEABLE = 0x102,
@@ -206,6 +112,8 @@
HAL_PIXEL_FORMAT_YCrCb_422_SP = 0x10B,
HAL_PIXEL_FORMAT_R_8 = 0x10D,
HAL_PIXEL_FORMAT_RG_88 = 0x10E,
+ HAL_PIXEL_FORMAT_YCbCr_444_SP = 0x10F,
+ HAL_PIXEL_FORMAT_YCrCb_444_SP = 0x110,
HAL_PIXEL_FORMAT_INTERLACE = 0x180,
};
@@ -224,89 +132,8 @@
};
enum {
- BUFFER_TYPE_UI = 0,
- BUFFER_TYPE_VIDEO
-};
-
-#if defined(HDMI_DUAL_DISPLAY)
-enum hdmi_mirroring_state {
- HDMI_NO_MIRRORING,
- HDMI_UI_MIRRORING,
- HDMI_ORIGINAL_RESOLUTION_MIRRORING
-};
-#endif
-/*****************************************************************************/
-
-struct private_module_t;
-struct private_handle_t;
-struct PmemAllocator;
-
-struct qbuf_t {
- buffer_handle_t buf;
- int idx;
-};
-
-enum buf_state {
- SUB,
- REF,
- AVL
-};
-
-struct avail_t {
- pthread_mutex_t lock;
- pthread_cond_t cond;
-#ifdef __cplusplus
- bool is_avail;
- buf_state state;
-#endif
-};
-
-struct private_module_t {
- gralloc_module_t base;
-
- struct private_handle_t* framebuffer;
- uint32_t fbFormat;
- uint32_t flags;
- uint32_t numBuffers;
- uint32_t bufferMask;
- pthread_mutex_t lock;
- buffer_handle_t currentBuffer;
-
- struct fb_var_screeninfo info;
- struct fb_fix_screeninfo finfo;
- float xdpi;
- float ydpi;
- float fps;
- int swapInterval;
-#ifdef __cplusplus
- Queue<struct qbuf_t> disp; // non-empty when buffer is ready for display
-#endif
- int currentIdx;
- struct avail_t avail[NUM_FRAMEBUFFERS_MAX];
- pthread_mutex_t qlock;
- pthread_cond_t qpost;
-
- enum {
- // flag to indicate we'll post this buffer
- PRIV_USAGE_LOCKED_FOR_POST = 0x80000000,
- PRIV_MIN_SWAP_INTERVAL = 0,
- PRIV_MAX_SWAP_INTERVAL = 1,
- };
-#if defined(__cplusplus) && defined(HDMI_DUAL_DISPLAY)
- Overlay* pobjOverlay;
- int orientation;
- bool videoOverlay;
- uint32_t currentOffset;
- int enableHDMIOutput; // holds the type of external display
- bool trueMirrorSupport;
- bool exitHDMIUILoop;
- float actionsafeWidthRatio;
- float actionsafeHeightRatio;
- bool hdmiStateChanged;
- hdmi_mirroring_state hdmiMirroringState;
- pthread_mutex_t overlayLock;
- pthread_cond_t overlayPost;
-#endif
+ BUFFER_TYPE_UI = 0,
+ BUFFER_TYPE_VIDEO
};
/*****************************************************************************/
@@ -314,87 +141,114 @@
#ifdef __cplusplus
struct private_handle_t : public native_handle {
#else
-struct private_handle_t {
- native_handle_t nativeHandle;
+ struct private_handle_t {
+ native_handle_t nativeHandle;
#endif
- enum {
- PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
- PRIV_FLAGS_USES_PMEM = 0x00000002,
- PRIV_FLAGS_USES_PMEM_ADSP = 0x00000004,
- PRIV_FLAGS_USES_ION = 0x00000008,
- PRIV_FLAGS_USES_ASHMEM = 0x00000010,
- PRIV_FLAGS_NEEDS_FLUSH = 0x00000020,
- PRIV_FLAGS_DO_NOT_FLUSH = 0x00000040,
- PRIV_FLAGS_SW_LOCK = 0x00000080,
- PRIV_FLAGS_NONCONTIGUOUS_MEM = 0x00000100,
- PRIV_FLAGS_HWC_LOCK = 0x00000200, // Set by HWC when storing the handle
- PRIV_FLAGS_SECURE_BUFFER = 0x00000400,
- PRIV_FLAGS_UNSYNCHRONIZED = 0x00000800, // For explicit synchronization
- PRIV_FLAGS_NOT_MAPPED = 0x00001000, // Not mapped in userspace
- PRIV_FLAGS_EXTERNAL_ONLY = 0x00002000, // Display on external only
- PRIV_FLAGS_EXTERNAL_BLOCK = 0x00004000, // Display only this buffer on external
- };
+ enum {
+ PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
+ PRIV_FLAGS_USES_PMEM = 0x00000002,
+ PRIV_FLAGS_USES_PMEM_ADSP = 0x00000004,
+ PRIV_FLAGS_USES_ION = 0x00000008,
+ PRIV_FLAGS_USES_ASHMEM = 0x00000010,
+ PRIV_FLAGS_NEEDS_FLUSH = 0x00000020,
+ PRIV_FLAGS_DO_NOT_FLUSH = 0x00000040,
+ PRIV_FLAGS_SW_LOCK = 0x00000080,
+ PRIV_FLAGS_NONCONTIGUOUS_MEM = 0x00000100,
+ // Set by HWC when storing the handle
+ PRIV_FLAGS_HWC_LOCK = 0x00000200,
+ PRIV_FLAGS_SECURE_BUFFER = 0x00000400,
+ // For explicit synchronization
+ PRIV_FLAGS_UNSYNCHRONIZED = 0x00000800,
+ // Not mapped in userspace
+ PRIV_FLAGS_NOT_MAPPED = 0x00001000,
+ // Display on external only
+ PRIV_FLAGS_EXTERNAL_ONLY = 0x00002000,
+ // Display only this buffer on external
+ PRIV_FLAGS_EXTERNAL_BLOCK = 0x00004000,
+ };
- // file-descriptors
- int fd;
- int genlockHandle; // genlock handle to be dup'd by the binder
- // ints
- int magic;
- int flags;
- int size;
- int offset;
- int bufferType;
-
- // FIXME: the attributes below should be out-of-line
- int base;
- int gpuaddr; // The gpu address mapped into the mmu. If using ashmem, set to 0 They don't care
- int pid;
- int format;
- int width;
- int height;
- int genlockPrivFd; // local fd of the genlock device.
+ // file-descriptors
+ int fd;
+ // genlock handle to be dup'd by the binder
+ int genlockHandle;
+ // ints
+ int magic;
+ int flags;
+ int size;
+ int offset;
+ int bufferType;
+ int base;
+ // The gpu address mapped into the mmu.
+ // If using ashmem, set to 0, they don't care
+ int gpuaddr;
+ int pid;
+ int format;
+ int width;
+ int height;
+ // local fd of the genlock device.
+ int genlockPrivFd;
#ifdef __cplusplus
- static const int sNumInts = 12;
- static const int sNumFds = 2;
- static const int sMagic = 'gmsm';
+ static const int sNumInts = 12;
+ static const int sNumFds = 2;
+ static const int sMagic = 'gmsm';
- private_handle_t(int fd, int size, int flags, int bufferType, int format, int width, int height) :
- fd(fd), genlockHandle(-1), magic(sMagic), flags(flags), size(size), offset(0),
- bufferType(bufferType), base(0), gpuaddr(0), pid(getpid()), format(format),
- width(width), height(height), genlockPrivFd(-1)
- {
- version = sizeof(native_handle);
- numInts = sNumInts;
- numFds = sNumFds;
- }
- ~private_handle_t() {
- magic = 0;
- }
+ private_handle_t(int fd, int size, int flags, int bufferType,
+ int format,int width, int height) :
+ fd(fd), genlockHandle(-1), magic(sMagic),
+ flags(flags), size(size), offset(0),
+ bufferType(bufferType), base(0), gpuaddr(0),
+ pid(getpid()), format(format),
+ width(width), height(height), genlockPrivFd(-1)
+ {
+ version = sizeof(native_handle);
+ numInts = sNumInts;
+ numFds = sNumFds;
+ }
+ ~private_handle_t() {
+ magic = 0;
+ }
- bool usesPhysicallyContiguousMemory() {
- return (flags & PRIV_FLAGS_USES_PMEM) != 0;
- }
+ bool usesPhysicallyContiguousMemory() {
+ return (flags & PRIV_FLAGS_USES_PMEM) != 0;
+ }
- static int validate(const native_handle* h) {
- const private_handle_t* hnd = (const private_handle_t*)h;
- if (!h || h->version != sizeof(native_handle) ||
+ static int validate(const native_handle* h) {
+ const private_handle_t* hnd = (const private_handle_t*)h;
+ if (!h || h->version != sizeof(native_handle) ||
h->numInts != sNumInts || h->numFds != sNumFds ||
hnd->magic != sMagic)
- {
- ALOGE("invalid gralloc handle (at %p)", h);
- return -EINVAL;
+ {
+ ALOGD("Invalid gralloc handle (at %p): "
+ "ver(%d/%d) ints(%d/%d) fds(%d/%d) magic(%c%c%c%c/%c%c%c%c)",
+ h,
+ h ? h->version : -1, sizeof(native_handle),
+ h ? h->numInts : -1, sNumInts,
+ h ? h->numFds : -1, sNumFds,
+ 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) : '-') : '?',
+ (sMagic >> 24) & 0xFF,
+ (sMagic >> 16) & 0xFF,
+ (sMagic >> 8) & 0xFF,
+ (sMagic >> 0) & 0xFF);
+ return -EINVAL;
+ }
+ return 0;
}
- return 0;
- }
- static private_handle_t* dynamicCast(const native_handle* in) {
- if (validate(in) == 0) {
- return (private_handle_t*) in;
+ static private_handle_t* dynamicCast(const native_handle* in) {
+ if (validate(in) == 0) {
+ return (private_handle_t*) in;
+ }
+ return NULL;
}
- return NULL;
- }
#endif
-};
+ };
#endif /* GRALLOC_PRIV_H_ */