hwc_utils.h revision 31da0b1f44d5ff8f95be2b440df3cdd8c5c396d4
131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed/* 231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Copyright (C) 2012, Code Aurora Forum. All rights reserved. 431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * 531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Not a Contribution, Apache license notifications and license are retained 631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * for attribution purposes only. 731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * 831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * you may not use this file except in compliance with the License. 1031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * You may obtain a copy of the License at 1131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * 1231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 1331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * 1431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 1531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 1631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * See the License for the specific language governing permissions and 1831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * limitations under the License. 1931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed */ 2031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#ifndef HWC_COPYBIT_H 2131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define HWC_COPYBIT_H 2231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include "hwc_utils.h" 2331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include <EGL/egl.h> 2431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include <EGL/eglext.h> 2531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include <gralloc_priv.h> 2631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include <gr.h> 2731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include <dlfcn.h> 2831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 2931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 3031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 3131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 3231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmednamespace qhwc { 3331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed//Feature for using Copybit to display RGB layers. 3431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedclass CopyBit { 3531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedpublic: 3631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Sets up members and prepares copybit if conditions are met 3731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static bool prepare(hwc_context_t *ctx, hwc_layer_list_t *list); 3831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Draws layer if the layer is set for copybit in prepare 3931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static bool draw(hwc_context_t *ctx, hwc_layer_list_t *list, EGLDisplay dpy, 4031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed EGLSurface sur); 4131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Receives data from hwc 4231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void setStats(int yuvCount, int yuvLayerIndex, bool isYuvLayerSkip); 4331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 4431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void updateEglHandles(void*); 4531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static int drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_t *layer, 4631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed EGLDisplay dpy, EGLSurface surface, 4731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed functype_eglGetRenderBufferANDROID& LINK_eglGetRenderBufferANDROID, 4831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed functype_eglGetCurrentSurface LINK_eglGetCurrentSurface); 4931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static bool canUseCopybit(hwc_context_t* ctx, const hwc_layer_list_t* list, 5031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed const int numYUVBuffers); 5131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void closeEglLib(); 5231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void openEglLibAndGethandle(); 5331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedprivate: 5431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Marks layer flags if this feature is used 5531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void markFlags(hwc_layer_t *layer); 5631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //returns yuv count 5731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static int getYuvCount(); 5831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 5931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Number of yuv layers in this drawing round 6031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static int sYuvCount; 6131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Index of YUV layer, relevant only if count is 1 6231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static int sYuvLayerIndex; 6331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Flags if a yuv layer is animating or below something that is animating 6431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static bool sIsLayerSkip; 6531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Flags if this feature is on. 6631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static bool sIsModeOn; 6731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //handle for adreno lib 6831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void* egl_lib; 6931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 7031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static functype_eglGetRenderBufferANDROID LINK_eglGetRenderBufferANDROID; 7131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static functype_eglGetCurrentSurface LINK_eglGetCurrentSurface; 7231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 7331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void getLayerResolution(const hwc_layer_t* layer, int& width, 7431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed int& height); 7531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 7631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed}; 7731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 7831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedinline void CopyBit::setStats(int yuvCount, int yuvLayerIndex, 7931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed bool isYuvLayerSkip) { 8031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed sYuvCount = yuvCount; 8131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed sYuvLayerIndex = yuvLayerIndex; 8231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed sIsLayerSkip = isYuvLayerSkip; 8331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed} 8431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 8531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedinline int CopyBit::getYuvCount() { return sYuvCount; } 8631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 8731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 8831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed}; //namespace qhwc 8931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 9031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#endif //HWC_COPYBIT_H 91