1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2008 The Android Open Source Project
3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License");
6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * you may not use this file except in compliance with the License.
7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * You may obtain a copy of the License at
8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *      http://www.apache.org/licenses/LICENSE-2.0
10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Unless required by applicable law or agreed to in writing, software
12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS,
13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * See the License for the specific language governing permissions and
15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * limitations under the License.
16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */
17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifndef GR_H_
19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define GR_H_
20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <stdint.h>
22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifdef HAVE_ANDROID_OS      // just want PAGE_SIZE define
23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby# include <asm/page.h>
24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#else
25b166940edca6e312463461438e2aa66e9852c26aBenoit Goby# include <sys/user.h>
26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif
27b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <limits.h>
28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <sys/cdefs.h>
29b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <hardware/gralloc.h>
30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <pthread.h>
31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <errno.h>
32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <cutils/native_handle.h>
34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <utils/Singleton.h>
35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
36b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*****************************************************************************/
37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
38b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct private_module_t;
39b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct private_handle_t;
40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
41b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline size_t roundUpToPageSize(size_t x) {
42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
45b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline size_t ALIGN(size_t x, size_t align) {
46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return (x + align-1) & ~(align-1);
47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define FALSE 0
50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define TRUE  1
51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
52b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint mapFrameBufferLocked(struct private_module_t* module);
53b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint terminateBuffer(gralloc_module_t const* module, private_handle_t* hnd);
54b166940edca6e312463461438e2aa66e9852c26aBenoit Gobysize_t getBufferSizeAndDimensions(int width, int height, int format,
55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                  int& alignedw, int &alignedh);
56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
57b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint decideBufferHandlingMechanism(int format, const char *compositionUsed,
58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                  int hasBlitEngine, int *needConversion,
59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                  int *useBufferDirectly);
60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Allocate buffer from width, height, format into a private_handle_t
62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// It is the responsibility of the caller to free the buffer
63b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage);
64b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid free_buffer(private_handle_t *hnd);
65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*****************************************************************************/
67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
68b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass Locker {
69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    pthread_mutex_t mutex;
70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    public:
71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    class Autolock {
72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        Locker& locker;
73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        public:
74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        inline Autolock(Locker& locker) : locker(locker) {  locker.lock(); }
75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        inline ~Autolock() { locker.unlock(); }
76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    };
77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    inline Locker()        { pthread_mutex_init(&mutex, 0); }
78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    inline ~Locker()       { pthread_mutex_destroy(&mutex); }
79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    inline void lock()     { pthread_mutex_lock(&mutex); }
80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    inline void unlock()   { pthread_mutex_unlock(&mutex); }
81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
84b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass AdrenoMemInfo : public android::Singleton <AdrenoMemInfo>
85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    public:
87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    AdrenoMemInfo();
88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ~AdrenoMemInfo();
90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /*
92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby     * Function to compute the adreno stride based on the width and format.
93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby     *
94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby     * @return stride.
95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby     */
96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int getStride(int width, int format);
97b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    private:
99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // Pointer to the padding library.
100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        void *libadreno_utils;
101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // link to the surface padding library.
103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        int (*LINK_adreno_compute_padding) (int width, int bpp,
104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                                int surface_tile_height,
105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                                int screen_tile_height,
106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                                int padding_threshold);
107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif /* GR_H_ */
109