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