1202a77d28ac251545f6f998a974690212309b927Iliyan Malchev/*
2202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Copyright (C) 2008 The Android Open Source Project
3a43fb8fce6d9be5577de1e0f49c99bd4fe2f6d44Duy Truong * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
4202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *
5202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
6202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * you may not use this file except in compliance with the License.
7202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * You may obtain a copy of the License at
8202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *
9202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
10202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *
11202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
12202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
13202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * See the License for the specific language governing permissions and
15202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * limitations under the License.
16202a77d28ac251545f6f998a974690212309b927Iliyan Malchev */
17202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
18202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#ifndef GR_H_
19202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#define GR_H_
20202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
21202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <stdint.h>
22bec6017f76872b4ef63e8afeafcdad137519cd03Elliott Hughes#include <sys/user.h>
23202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <limits.h>
24202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <sys/cdefs.h>
25202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <hardware/gralloc.h>
26202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <pthread.h>
27202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <errno.h>
28202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
29202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <cutils/native_handle.h>
30bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis#include <utils/Singleton.h>
31202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
32202a77d28ac251545f6f998a974690212309b927Iliyan Malchev/*****************************************************************************/
33202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
34202a77d28ac251545f6f998a974690212309b927Iliyan Malchevstruct private_module_t;
35202a77d28ac251545f6f998a974690212309b927Iliyan Malchevstruct private_handle_t;
36202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
37202a77d28ac251545f6f998a974690212309b927Iliyan Malchevinline size_t roundUpToPageSize(size_t x) {
38202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
39202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
40202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
41202a77d28ac251545f6f998a974690212309b927Iliyan Malchevinline size_t ALIGN(size_t x, size_t align) {
42202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return (x + align-1) & ~(align-1);
43202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
44202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
45202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#define FALSE 0
46202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#define TRUE  1
47202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
48202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint mapFrameBufferLocked(struct private_module_t* module);
49202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint terminateBuffer(gralloc_module_t const* module, private_handle_t* hnd);
50202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsize_t getBufferSizeAndDimensions(int width, int height, int format,
5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                  int& alignedw, int &alignedh);
52202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
53202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint decideBufferHandlingMechanism(int format, const char *compositionUsed,
5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                  int hasBlitEngine, int *needConversion,
5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                  int *useBufferDirectly);
56202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
57202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// Allocate buffer from width, height, format into a private_handle_t
58202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// It is the responsibility of the caller to free the buffer
59202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage);
60202a77d28ac251545f6f998a974690212309b927Iliyan Malchevvoid free_buffer(private_handle_t *hnd);
61202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
62202a77d28ac251545f6f998a974690212309b927Iliyan Malchev/*****************************************************************************/
63202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
64202a77d28ac251545f6f998a974690212309b927Iliyan Malchevclass Locker {
65202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    pthread_mutex_t mutex;
6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    public:
67202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    class Autolock {
68202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        Locker& locker;
6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        public:
70202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        inline Autolock(Locker& locker) : locker(locker) {  locker.lock(); }
71202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        inline ~Autolock() { locker.unlock(); }
72202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    };
73202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    inline Locker()        { pthread_mutex_init(&mutex, 0); }
74202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    inline ~Locker()       { pthread_mutex_destroy(&mutex); }
75202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    inline void lock()     { pthread_mutex_lock(&mutex); }
76202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    inline void unlock()   { pthread_mutex_unlock(&mutex); }
77202a77d28ac251545f6f998a974690212309b927Iliyan Malchev};
78202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
79bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis
80bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luisclass AdrenoMemInfo : public android::Singleton <AdrenoMemInfo>
81bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis{
82bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis    public:
8331d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis    AdrenoMemInfo();
84bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis
8531d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis    ~AdrenoMemInfo();
86bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis
8731d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis    /*
8831d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis     * Function to compute the adreno stride based on the width and format.
8931d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis     *
9031d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis     * @return stride.
9131d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis     */
92bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis    int getStride(int width, int format);
93bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis
94bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis    private:
9531d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis        // Pointer to the padding library.
9631d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis        void *libadreno_utils;
9731d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis
9831d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis        // link to the surface padding library.
9931d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis        int (*LINK_adreno_compute_padding) (int width, int bpp,
10031d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis                                                int surface_tile_height,
10131d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis                                                int screen_tile_height,
10231d8eebf849f5ccce6d6f4fa7b349713d4b1d73dNaomi Luis                                                int padding_threshold);
103bb0862a8db32349e2c1fc14f8287e815dde4d9a7Naomi Luis};
104202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#endif /* GR_H_ */
105