hwc_utils.h revision 7c958d445fe88a82eedbd1b887cd1e474a7526b1
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2012, Code Aurora Forum. All rights reserved.
429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * you may not use this file except in compliance with the License.
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * You may obtain a copy of the License at
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * See the License for the specific language governing permissions and
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * limitations under the License.
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#ifndef HWC_UTILS_H
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define HWC_UTILS_H
2072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <hardware/hwcomposer.h>
2272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <gralloc_priv.h>
2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define ALIGN_TO(x, align)     (((x) + ((align)-1)) & ~((align)-1))
2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
2731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F
2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//Fwrd decls
3029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t;
3172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedstruct framebuffer_device_t;
3272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
3372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmednamespace overlay {
3472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass Overlay;
3572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
3672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace qhwc {
3872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//fwrd decl
3972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass QueuedBufferStore;
4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedenum external_display_type {
4231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    EXT_TYPE_NONE,
4331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    EXT_TYPE_HDMI,
4431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    EXT_TYPE_WIFI
4531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
4631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedenum HWCCompositionType {
4731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    HWC_USE_GPU = HWC_FRAMEBUFFER, // This layer is to be handled by
4831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed                                   //                 Surfaceflinger
4931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    HWC_USE_OVERLAY = HWC_OVERLAY, // This layer is to be handled by the overlay
5031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    HWC_USE_COPYBIT                // This layer is to be handled by copybit
5131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
5231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
537c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedenum {
547c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    HWC_MDPCOMP = 0x00000002,
557c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    HWC_LAYER_RESERVED_0 = 0x00000004,
567c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    HWC_LAYER_RESERVED_1 = 0x00000008
577c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed};
587c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
5931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
6072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass ExternalDisplay;
6172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass CopybitEngine;
6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Utility functions - implemented in hwc_utils.cpp
6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid dumpLayer(hwc_layer_t const* l);
6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid getLayerStats(hwc_context_t *ctx, const hwc_layer_list_t *list);
6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid initContext(hwc_context_t *ctx);
6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid closeContext(hwc_context_t *ctx);
68f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Crops source buffer against destination and FB boundaries
69f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
70f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        const int fbWidth, const int fbHeight);
7129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
7229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Inline utility functions
7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_t* l) {
7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));
7529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
7729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Returns true if the buffer is yuv
7829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) {
7929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO));
8029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
8129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
8229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//Return true if buffer is marked locked
8329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) {
8429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags));
8529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
8631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
8772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed// Initialize uevent thread
8872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx);
8929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
907c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedinline void getLayerResolution(const hwc_layer_t* layer,
917c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed                                         int& width, int& height)
927c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed{
937c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
947c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    width = displayFrame.right - displayFrame.left;
957c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    height = displayFrame.bottom - displayFrame.top;
967c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
97f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //qhwc namespace
9829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
9929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
10029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// HWC context
10129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// This structure contains overall state
10229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t {
10329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hwc_composer_device_t device;
10429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int numHwLayers;
105a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed    int mdpVersion;
106a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed    bool hasOverlay;
107f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int overlayInUse;
10829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Framebuffer device
11072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    framebuffer_device_t *mFbDev;
11131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
11231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    //Copybit Engine
11331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    qhwc::CopybitEngine* mCopybitEngine;
11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Overlay object - NULL for non overlay devices
11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    overlay::Overlay *mOverlay;
11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //QueuedBufferStore to hold buffers for overlay
11929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    qhwc::QueuedBufferStore *qbuf;
1200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    // External display related information
12272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    qhwc::ExternalDisplay *mExtDisplay;
12372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
12429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
12529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
12629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif //HWC_UTILS_H
127