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