Home | History | Annotate | Download | only in libgralloc
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 #ifndef GR_H_
     19 #define GR_H_
     20 
     21 #include <stdint.h>
     22 #include <limits.h>
     23 #include <sys/cdefs.h>
     24 #include <hardware/gralloc.h>
     25 #include <pthread.h>
     26 #include <errno.h>
     27 
     28 #include <cutils/native_handle.h>
     29 #include <utils/Singleton.h>
     30 #include "adreno_utils.h"
     31 
     32 /*****************************************************************************/
     33 
     34 struct private_module_t;
     35 struct private_handle_t;
     36 
     37 inline unsigned int roundUpToPageSize(unsigned int x) {
     38     return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
     39 }
     40 
     41 template <class Type>
     42 inline Type ALIGN(Type x, Type align) {
     43     return (x + align-1) & ~(align-1);
     44 }
     45 
     46 #define FALSE 0
     47 #define TRUE  1
     48 
     49 int mapFrameBufferLocked(struct private_module_t* module);
     50 int terminateBuffer(gralloc_module_t const* module, private_handle_t* hnd);
     51 unsigned int getBufferSizeAndDimensions(int width, int height, int format,
     52         int usage, int& alignedw, int &alignedh);
     53 unsigned int getBufferSizeAndDimensions(int width, int height, int format,
     54         int& alignedw, int &alignedh);
     55 
     56 
     57 // Attributes include aligned width, aligned height, tileEnabled and size of the buffer
     58 void getBufferAttributes(int width, int height, int format, int usage,
     59                            int& alignedw, int &alignedh,
     60                            int& tileEnabled, unsigned int &size);
     61 
     62 
     63 bool isMacroTileEnabled(int format, int usage);
     64 
     65 int decideBufferHandlingMechanism(int format, const char *compositionUsed,
     66                                   int hasBlitEngine, int *needConversion,
     67                                   int *useBufferDirectly);
     68 
     69 // Allocate buffer from width, height, format into a private_handle_t
     70 // It is the responsibility of the caller to free the buffer
     71 int alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage);
     72 void free_buffer(private_handle_t *hnd);
     73 int getYUVPlaneInfo(private_handle_t* pHnd, struct android_ycbcr* ycbcr);
     74 
     75 // To query if UBWC is enabled, based on format and usage flags
     76 bool isUBwcEnabled(int format, int usage);
     77 
     78 // Function to check if the format is an uncompressed RGB format
     79 bool isUncompressedRgbFormat(int format);
     80 
     81 /*****************************************************************************/
     82 
     83 class Locker {
     84     pthread_mutex_t mutex;
     85     pthread_cond_t cond;
     86     public:
     87     class Autolock {
     88         Locker& locker;
     89         public:
     90         inline Autolock(Locker& locker) : locker(locker) {  locker.lock(); }
     91         inline ~Autolock() { locker.unlock(); }
     92     };
     93     inline Locker()        {
     94         pthread_mutex_init(&mutex, 0);
     95         pthread_cond_init(&cond, 0);
     96     }
     97     inline ~Locker()       {
     98         pthread_mutex_destroy(&mutex);
     99         pthread_cond_destroy(&cond);
    100     }
    101     inline void lock()     { pthread_mutex_lock(&mutex); }
    102     inline void wait()     { pthread_cond_wait(&cond, &mutex); }
    103     inline void unlock()   { pthread_mutex_unlock(&mutex); }
    104     inline void signal()   { pthread_cond_signal(&cond); }
    105 };
    106 
    107 
    108 class AdrenoMemInfo : public android::Singleton <AdrenoMemInfo>
    109 {
    110     public:
    111     AdrenoMemInfo();
    112 
    113     ~AdrenoMemInfo();
    114 
    115     /*
    116      * Function to compute aligned width and aligned height based on
    117      * width, height, format and usage flags.
    118      *
    119      * @return aligned width, aligned height
    120      */
    121     void getAlignedWidthAndHeight(int width, int height, int format,
    122                             int usage, int& aligned_w, int& aligned_h);
    123 
    124     /*
    125      * Function to compute the adreno aligned width and aligned height
    126      * based on the width and format.
    127      *
    128      * @return aligned width, aligned height
    129      */
    130     void getGpuAlignedWidthHeight(int width, int height, int format,
    131                             int tileEnabled, int& alignedw, int &alignedh);
    132 
    133     /*
    134      * Function to return whether GPU support MacroTile feature
    135      *
    136      * @return >0 : supported
    137      *          0 : not supported
    138      */
    139     int isMacroTilingSupportedByGPU();
    140 
    141     /*
    142      * Function to query whether GPU supports UBWC for given HAL format
    143      * @return > 0 : supported
    144      *           0 : not supported
    145      */
    146     int isUBWCSupportedByGPU(int format);
    147 
    148     /*
    149      * Function to get the corresponding Adreno format for given HAL format
    150      */
    151     ADRENOPIXELFORMAT getGpuPixelFormat(int hal_format);
    152 
    153     private:
    154         // Pointer to the padding library.
    155         void *libadreno_utils;
    156 
    157         // link(s)to adreno surface padding library.
    158         int (*LINK_adreno_compute_padding) (int width, int bpp,
    159                                                 int surface_tile_height,
    160                                                 int screen_tile_height,
    161                                                 int padding_threshold);
    162 
    163         void (*LINK_adreno_compute_aligned_width_and_height) (int width,
    164                                                 int height,
    165                                                 int bpp,
    166                                                 int tile_mode,
    167                                                 int raster_mode,
    168                                                 int padding_threshold,
    169                                                 int *aligned_w,
    170                                                 int *aligned_h);
    171 
    172         int (*LINK_adreno_isMacroTilingSupportedByGpu) (void);
    173 
    174         void(*LINK_adreno_compute_compressedfmt_aligned_width_and_height)(
    175                                                 int width,
    176                                                 int height,
    177                                                 int format,
    178                                                 int tile_mode,
    179                                                 int raster_mode,
    180                                                 int padding_threshold,
    181                                                 int *aligned_w,
    182                                                 int *aligned_h,
    183                                                 int *bpp);
    184 
    185         int (*LINK_adreno_isUBWCSupportedByGpu) (ADRENOPIXELFORMAT format);
    186 };
    187 #endif /* GR_H_ */
    188