hwc_utils.h revision ed68f0b13f56426735e7897519aa1c43072ceb90
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
3befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2012, Code Aurora Forum. All rights reserved.
4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
5befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
6befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License.
7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License.
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#ifndef HWC_UTILS_H
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define HWC_UTILS_H
201589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
21660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed#define HWC_REMOVE_DEPRECATED_VERSIONS 1
22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <hardware/hwcomposer.h>
231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <gralloc_priv.h>
24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
25bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define ALIGN_TO(x, align)     (((x) + ((align)-1)) & ~((align)-1))
26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
28bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F
29660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed#define MAX_NUM_DISPLAYS 4 //Yes, this is ambitious
30befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//Fwrd decls
32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t;
331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedstruct framebuffer_device_t;
341589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmednamespace overlay {
361589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass Overlay;
371589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
381589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace qhwc {
401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//fwrd decl
411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass QueuedBufferStore;
42b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedclass ExternalDisplay;
43b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedclass CopybitEngine;
44b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed
45b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedstruct MDPInfo {
46b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    int version;
47b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    char panel;
48b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    bool hasOverlay;
49b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed};
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
51bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmedenum external_display_type {
52bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    EXT_TYPE_NONE,
53bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    EXT_TYPE_HDMI,
54bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    EXT_TYPE_WIFI
55bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed};
56bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmedenum HWCCompositionType {
57bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    HWC_USE_GPU = HWC_FRAMEBUFFER, // This layer is to be handled by
58bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed                                   //                 Surfaceflinger
59bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    HWC_USE_OVERLAY = HWC_OVERLAY, // This layer is to be handled by the overlay
60bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    HWC_USE_COPYBIT                // This layer is to be handled by copybit
61bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed};
62bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
63c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedenum {
64c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    HWC_MDPCOMP = 0x00000002,
65c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    HWC_LAYER_RESERVED_0 = 0x00000004,
66c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    HWC_LAYER_RESERVED_1 = 0x00000008
67c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed};
68c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
69bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// -----------------------------------------------------------------------------
71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Utility functions - implemented in hwc_utils.cpp
72660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l);
73660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid getLayerStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list);
74befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid initContext(hwc_context_t *ctx);
75befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid closeContext(hwc_context_t *ctx);
76ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed//Crops source buffer against destination and FB boundaries
77ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
78ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed        const int fbWidth, const int fbHeight);
79befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
80a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah// Waits for the fb_post to be called
81a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shahvoid wait4fbPost(hwc_context_t* ctx);
82a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah
83a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah// Waits for the fb_post to finish PAN (primary commit)
84a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shahvoid wait4Pan(hwc_context_t* ctx);
85a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Inline utility functions
87660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) {
88befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Returns true if the buffer is yuv
92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) {
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO));
94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
96ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah// Returns true if the buffer is secure
97ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) {
98ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah    return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags));
99ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah}
100befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed//Return true if buffer is marked locked
101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) {
102befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags));
103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
104bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
1055d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only
1065d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) {
1075d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY));
1085d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed}
1095d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed
1105d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag.
1115d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) {
1125d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK));
1135d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed}
1145d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed
1155d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag.
1165d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) {
1175d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC));
1185d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed}
1195d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed
1201589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed// Initialize uevent thread
1211589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx);
122befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
123660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer,
124c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed                                         int& width, int& height)
125c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
126c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
127c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    width = displayFrame.right - displayFrame.left;
128c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    height = displayFrame.bottom - displayFrame.top;
129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
130ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed}; //qhwc namespace
131befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
132befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// -----------------------------------------------------------------------------
133befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// HWC context
134befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// This structure contains overall state
135befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t {
136660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    hwc_composer_device_1_t device;
137359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    const hwc_procs_t* proc;
138befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int numHwLayers;
139ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    int overlayInUse;
140660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    hwc_display_t dpys[MAX_NUM_DISPLAYS];
141befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
142befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    //Framebuffer device
1431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    framebuffer_device_t *mFbDev;
144bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
145bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    //Copybit Engine
146bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    qhwc::CopybitEngine* mCopybitEngine;
147befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
148befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    //Overlay object - NULL for non overlay devices
149befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    overlay::Overlay *mOverlay;
150befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
151befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    //QueuedBufferStore to hold buffers for overlay
152befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    qhwc::QueuedBufferStore *qbuf;
153ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
154ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    // External display related information
1551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    qhwc::ExternalDisplay *mExtDisplay;
1561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
157b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    qhwc::MDPInfo mMDP;
158b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed
159befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
160befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
161befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif //HWC_UTILS_H
162