1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2008 The Android Open Source Project
3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License");
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License.
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *      http://www.apache.org/licenses/LICENSE-2.0
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS,
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef GR_H_
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define GR_H_
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdint.h>
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <limits.h>
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/cdefs.h>
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hardware/gralloc.h>
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <pthread.h>
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <errno.h>
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/native_handle.h>
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Singleton.h>
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct private_module_t;
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct private_handle_t;
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
3692e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shahinline unsigned int roundUpToPageSize(unsigned int x) {
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
4015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.Rtemplate <class Type>
4115c7eb9ba46119290695b650d23180884f1156faArun Kumar K.Rinline Type ALIGN(Type x, Type align) {
42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return (x + align-1) & ~(align-1);
43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define FALSE 0
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define TRUE  1
47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint mapFrameBufferLocked(struct private_module_t* module);
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint terminateBuffer(gralloc_module_t const* module, private_handle_t* hnd);
5092e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shahunsigned int getBufferSizeAndDimensions(int width, int height, int format,
5192e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah        int usage, int& alignedw, int &alignedh);
5292e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shahunsigned int getBufferSizeAndDimensions(int width, int height, int format,
5392e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah        int& alignedw, int &alignedh);
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
55a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
56a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// Attributes include aligned width, aligned height, tileEnabled and size of the buffer
57a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid getBufferAttributes(int width, int height, int format, int usage,
58a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                           int& alignedw, int &alignedh,
5992e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah                           int& tileEnabled, unsigned int &size);
60a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
61a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
62a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool isMacroTileEnabled(int format, int usage);
63a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint decideBufferHandlingMechanism(int format, const char *compositionUsed,
65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                  int hasBlitEngine, int *needConversion,
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                  int *useBufferDirectly);
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Allocate buffer from width, height, format into a private_handle_t
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// It is the responsibility of the caller to free the buffer
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage);
71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid free_buffer(private_handle_t *hnd);
720a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmedint getYUVPlaneInfo(private_handle_t* pHnd, struct android_ycbcr* ycbcr);
73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/
75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass Locker {
77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    pthread_mutex_t mutex;
78a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    pthread_cond_t cond;
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    public:
80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    class Autolock {
81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        Locker& locker;
82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        public:
83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        inline Autolock(Locker& locker) : locker(locker) {  locker.lock(); }
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        inline ~Autolock() { locker.unlock(); }
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
86a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    inline Locker()        {
87a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        pthread_mutex_init(&mutex, 0);
88a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        pthread_cond_init(&cond, 0);
89a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    }
90a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    inline ~Locker()       {
91a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        pthread_mutex_destroy(&mutex);
92a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        pthread_cond_destroy(&cond);
93a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    }
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    inline void lock()     { pthread_mutex_lock(&mutex); }
95a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    inline void wait()     { pthread_cond_wait(&cond, &mutex); }
96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    inline void unlock()   { pthread_mutex_unlock(&mutex); }
97a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    inline void signal()   { pthread_cond_signal(&cond); }
98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass AdrenoMemInfo : public android::Singleton <AdrenoMemInfo>
102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    public:
104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    AdrenoMemInfo();
105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ~AdrenoMemInfo();
107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /*
109a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * Function to compute the adreno aligned width and aligned height
110a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * based on the width and format.
111a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     *
112a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * @return aligned width, aligned height
113a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     */
114a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    void getAlignedWidthAndHeight(int width, int height, int format,
115a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                            int tileEnabled, int& alignedw, int &alignedh);
116a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
117a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /*
118a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * Function to return whether GPU support MacroTile feature
119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     *
120a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * @return >0 : supported
121a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     *          0 : not supported
122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     */
123a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int isMacroTilingSupportedByGPU();
124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    private:
126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        // Pointer to the padding library.
127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        void *libadreno_utils;
128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
129f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran        // link(s)to adreno surface padding library.
130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int (*LINK_adreno_compute_padding) (int width, int bpp,
131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                                int surface_tile_height,
132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                                int screen_tile_height,
133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                                int padding_threshold);
134f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran
135a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        void (*LINK_adreno_compute_aligned_width_and_height) (int width,
136a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                                int height,
137a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                                int bpp,
138a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                                int tile_mode,
139a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                                int raster_mode,
140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                                int padding_threshold,
141a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                                int *aligned_w,
142a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                                int *aligned_h);
143f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran
144a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        int (*LINK_adreno_isMacroTilingSupportedByGpu) (void);
145a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
146f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran        void(*LINK_adreno_compute_compressedfmt_aligned_width_and_height)(
147f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int width,
148f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int height,
149f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int format,
150f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int tile_mode,
151f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int raster_mode,
152f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int padding_threshold,
153f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int *aligned_w,
154f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int *aligned_h,
155f058c5c852ee901f47249a92edbbfc64973c79e9Jeykumar Sankaran                                                int *bpp);
156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif /* GR_H_ */
158