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. 3472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedtypedef EGLClientBuffer (*functype_eglGetRenderBufferANDROID) ( 3572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed EGLDisplay dpy, 3672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed EGLSurface draw); 3772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedtypedef EGLSurface (*functype_eglGetCurrentSurface)(EGLint readdraw); 3872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 3931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedclass CopyBit { 4031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedpublic: 4131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Sets up members and prepares copybit if conditions are met 425b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed static bool prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list); 4331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Draws layer if the layer is set for copybit in prepare 445b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed static bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list, EGLDisplay dpy, 4531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed EGLSurface sur); 4631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Receives data from hwc 4731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void setStats(int yuvCount, int yuvLayerIndex, bool isYuvLayerSkip); 4831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 4931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void updateEglHandles(void*); 505b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed static int drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer, 5131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed EGLDisplay dpy, EGLSurface surface, 5231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed functype_eglGetRenderBufferANDROID& LINK_eglGetRenderBufferANDROID, 5331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed functype_eglGetCurrentSurface LINK_eglGetCurrentSurface); 5445a9960377b09b1f72fe0c7ed662f1e0110e2d68Naseer Ahmed static bool canUseCopybitForYUV (hwc_context_t *ctx); 5545a9960377b09b1f72fe0c7ed662f1e0110e2d68Naseer Ahmed static bool canUseCopybitForRGB (hwc_context_t *ctx, 565b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_display_contents_1_t *list); 5745a9960377b09b1f72fe0c7ed662f1e0110e2d68Naseer Ahmed static bool validateParams (hwc_context_t *ctx, 585b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed const hwc_display_contents_1_t *list); 5931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void closeEglLib(); 6031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void openEglLibAndGethandle(); 6131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedprivate: 6231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Marks layer flags if this feature is used 635b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed static void markFlags(hwc_layer_1_t *layer); 6431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //returns yuv count 6531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static int getYuvCount(); 6631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 6731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Number of yuv layers in this drawing round 6831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static int sYuvCount; 6931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Index of YUV layer, relevant only if count is 1 7031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static int sYuvLayerIndex; 7131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Flags if a yuv layer is animating or below something that is animating 7231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static bool sIsLayerSkip; 7331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //Flags if this feature is on. 7431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static bool sIsModeOn; 7531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed //handle for adreno lib 7631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static void* egl_lib; 7731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 7831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static functype_eglGetRenderBufferANDROID LINK_eglGetRenderBufferANDROID; 7931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed static functype_eglGetCurrentSurface LINK_eglGetCurrentSurface; 8031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 815b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed static unsigned int getRGBRenderingArea (const hwc_display_contents_1_t *list); 8231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 835b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed static void getLayerResolution(const hwc_layer_1_t* layer, 8445a9960377b09b1f72fe0c7ed662f1e0110e2d68Naseer Ahmed unsigned int &width, unsigned int& height); 8531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed}; 8631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 8772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass CopybitEngine { 8872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedpublic: 8972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ~CopybitEngine(); 9072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed // API to get copybit engine(non static) 9172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed struct copybit_device_t *getEngine(); 9272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed // API to get singleton 9372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed static CopybitEngine* getInstance(); 9472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedprivate: 9572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed CopybitEngine(); 9672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed struct copybit_device_t *sEngine; 9772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed static CopybitEngine* sInstance; // singleton 9872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}; 9972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 10072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 10131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedinline void CopyBit::setStats(int yuvCount, int yuvLayerIndex, 10231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed bool isYuvLayerSkip) { 10331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed sYuvCount = yuvCount; 10431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed sYuvLayerIndex = yuvLayerIndex; 10531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed sIsLayerSkip = isYuvLayerSkip; 10631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed} 10731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 10831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedinline int CopyBit::getYuvCount() { return sYuvCount; } 10931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 11031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 11131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed}; //namespace qhwc 11231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 11331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#endif //HWC_COPYBIT_H 114