107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*
207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2008 The Android Open Source Project
307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Licensed under the Apache License, Version 2.0 (the "License");
607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * you may not use this file except in compliance with the License.
707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * You may obtain a copy of the License at
807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *      http://www.apache.org/licenses/LICENSE-2.0
1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Unless required by applicable law or agreed to in writing, software
1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * distributed under the License is distributed on an "AS IS" BASIS,
1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * See the License for the specific language governing permissions and
1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * limitations under the License.
1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */
1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef GR_H_
1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define GR_H_
2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <stdint.h>
2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <limits.h>
2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <sys/cdefs.h>
2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <hardware/gralloc.h>
2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <pthread.h>
2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <errno.h>
2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <cutils/native_handle.h>
2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <utils/Singleton.h>
3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/
3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanistruct private_module_t;
3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanistruct private_handle_t;
3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniinline unsigned int roundUpToPageSize(unsigned int x) {
3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanitemplate <class Type>
4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniinline Type ALIGN(Type x, Type align) {
4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    return (x + align-1) & ~(align-1);
4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define FALSE 0
4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define TRUE  1
4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint mapFrameBufferLocked(struct private_module_t* module);
4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint terminateBuffer(gralloc_module_t const* module, private_handle_t* hnd);
5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniunsigned int getBufferSizeAndDimensions(int width, int height, int format,
5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int usage, int& alignedw, int &alignedh);
5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniunsigned int getBufferSizeAndDimensions(int width, int height, int format,
5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int& alignedw, int &alignedh);
5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// Attributes include aligned width, aligned height, tileEnabled and size of the buffer
5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getBufferAttributes(int width, int height, int format, int usage,
5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                           int& alignedw, int &alignedh,
5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                           int& tileEnabled, unsigned int &size);
6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool isMacroTileEnabled(int format, int usage);
6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint decideBufferHandlingMechanism(int format, const char *compositionUsed,
6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                  int hasBlitEngine, int *needConversion,
6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                  int *useBufferDirectly);
6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// Allocate buffer from width, height, format into a private_handle_t
6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// It is the responsibility of the caller to free the buffer
7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage);
7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid free_buffer(private_handle_t *hnd);
7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint getYUVPlaneInfo(private_handle_t* pHnd, struct android_ycbcr* ycbcr);
7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/
7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass Locker {
7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    pthread_mutex_t mutex;
7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    pthread_cond_t cond;
7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    public:
8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    class Autolock {
8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        Locker& locker;
8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        public:
8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        inline Autolock(Locker& locker) : locker(locker) {  locker.lock(); }
8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        inline ~Autolock() { locker.unlock(); }
8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    inline Locker()        {
8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        pthread_mutex_init(&mutex, 0);
8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        pthread_cond_init(&cond, 0);
8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    inline ~Locker()       {
9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        pthread_mutex_destroy(&mutex);
9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        pthread_cond_destroy(&cond);
9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    inline void lock()     { pthread_mutex_lock(&mutex); }
9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    inline void wait()     { pthread_cond_wait(&cond, &mutex); }
9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    inline void unlock()   { pthread_mutex_unlock(&mutex); }
9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    inline void signal()   { pthread_cond_signal(&cond); }
9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass AdrenoMemInfo : public android::Singleton <AdrenoMemInfo>
10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    public:
10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    AdrenoMemInfo();
10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    ~AdrenoMemInfo();
10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /*
10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * Function to compute the adreno aligned width and aligned height
11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * based on the width and format.
11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     *
11207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * @return aligned width, aligned height
11307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     */
11407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void getAlignedWidthAndHeight(int width, int height, int format,
11507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                            int tileEnabled, int& alignedw, int &alignedh);
11607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
11707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /*
11807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * Function to return whether GPU support MacroTile feature
11907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     *
12007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * @return >0 : supported
12107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     *          0 : not supported
12207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     */
12307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int isMacroTilingSupportedByGPU();
12407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
12507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    private:
12607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        // Pointer to the padding library.
12707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        void *libadreno_utils;
12807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
12907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        // link(s)to adreno surface padding library.
13007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int (*LINK_adreno_compute_padding) (int width, int bpp,
13107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int surface_tile_height,
13207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int screen_tile_height,
13307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int padding_threshold);
13407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
13507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        void (*LINK_adreno_compute_aligned_width_and_height) (int width,
13607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int height,
13707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int bpp,
13807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int tile_mode,
13907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int raster_mode,
14007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int padding_threshold,
14107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int *aligned_w,
14207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int *aligned_h);
14307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
14407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int (*LINK_adreno_isMacroTilingSupportedByGpu) (void);
14507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
14607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        void(*LINK_adreno_compute_compressedfmt_aligned_width_and_height)(
14707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int width,
14807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int height,
14907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int format,
15007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int tile_mode,
15107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int raster_mode,
15207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int padding_threshold,
15307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int *aligned_w,
15407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int *aligned_h,
15507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                                int *bpp);
15607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
15707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        unsigned int (*LINK_adreno_get_gpu_pixel_alignment) ();
15807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
15907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif /* GR_H_ */
160