107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* 207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2008 The Android Open Source Project 307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Licensed under the Apache License, Version 2.0 (the "License"); 607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * you may not use this file except in compliance with the License. 707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * You may obtain a copy of the License at 807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * http://www.apache.org/licenses/LICENSE-2.0 1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Unless required by applicable law or agreed to in writing, software 1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * distributed under the License is distributed on an "AS IS" BASIS, 1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * See the License for the specific language governing permissions and 1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * limitations under the License. 1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */ 1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef GR_H_ 1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define GR_H_ 2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <stdint.h> 2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <limits.h> 2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <sys/cdefs.h> 2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <hardware/gralloc.h> 2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <pthread.h> 2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <errno.h> 2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <cutils/native_handle.h> 2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <utils/Singleton.h> 3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/ 3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanistruct private_module_t; 3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanistruct private_handle_t; 3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniinline unsigned int roundUpToPageSize(unsigned int x) { 3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1); 3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanitemplate <class Type> 4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniinline Type ALIGN(Type x, Type align) { 4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani return (x + align-1) & ~(align-1); 4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define FALSE 0 4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define TRUE 1 4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint mapFrameBufferLocked(struct private_module_t* module); 4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint terminateBuffer(gralloc_module_t const* module, private_handle_t* hnd); 5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniunsigned int getBufferSizeAndDimensions(int width, int height, int format, 5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int usage, int& alignedw, int &alignedh); 5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniunsigned int getBufferSizeAndDimensions(int width, int height, int format, 5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int& alignedw, int &alignedh); 5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// Attributes include aligned width, aligned height, tileEnabled and size of the buffer 5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid getBufferAttributes(int width, int height, int format, int usage, 5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int& alignedw, int &alignedh, 5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int& tileEnabled, unsigned int &size); 6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanibool isMacroTileEnabled(int format, int usage); 6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint decideBufferHandlingMechanism(int format, const char *compositionUsed, 6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int hasBlitEngine, int *needConversion, 6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int *useBufferDirectly); 6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// Allocate buffer from width, height, format into a private_handle_t 6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// It is the responsibility of the caller to free the buffer 7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage); 7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanivoid free_buffer(private_handle_t *hnd); 7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniint getYUVPlaneInfo(private_handle_t* pHnd, struct android_ycbcr* ycbcr); 7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/ 7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass Locker { 7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani pthread_mutex_t mutex; 7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani pthread_cond_t cond; 7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani public: 8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani class Autolock { 8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani Locker& locker; 8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani public: 8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline Autolock(Locker& locker) : locker(locker) { locker.lock(); } 8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline ~Autolock() { locker.unlock(); } 8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani }; 8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline Locker() { 8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani pthread_mutex_init(&mutex, 0); 8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani pthread_cond_init(&cond, 0); 8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline ~Locker() { 9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani pthread_mutex_destroy(&mutex); 9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani pthread_cond_destroy(&cond); 9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani } 9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline void lock() { pthread_mutex_lock(&mutex); } 9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline void wait() { pthread_cond_wait(&cond, &mutex); } 9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline void unlock() { pthread_mutex_unlock(&mutex); } 9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani inline void signal() { pthread_cond_signal(&cond); } 9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; 9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass AdrenoMemInfo : public android::Singleton <AdrenoMemInfo> 10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{ 10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani public: 10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani AdrenoMemInfo(); 10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ~AdrenoMemInfo(); 10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani /* 10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Function to compute the adreno aligned width and aligned height 11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * based on the width and format. 11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 11207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * @return aligned width, aligned height 11307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */ 11407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani void getAlignedWidthAndHeight(int width, int height, int format, 11507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int tileEnabled, int& alignedw, int &alignedh); 11607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 11707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani /* 11807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Function to return whether GPU support MacroTile feature 11907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 12007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * @return >0 : supported 12107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 0 : not supported 12207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */ 12307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int isMacroTilingSupportedByGPU(); 12407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 12507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani private: 12607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // Pointer to the padding library. 12707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani void *libadreno_utils; 12807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 12907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // link(s)to adreno surface padding library. 13007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int (*LINK_adreno_compute_padding) (int width, int bpp, 13107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int surface_tile_height, 13207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int screen_tile_height, 13307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int padding_threshold); 13407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 13507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani void (*LINK_adreno_compute_aligned_width_and_height) (int width, 13607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int height, 13707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int bpp, 13807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int tile_mode, 13907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int raster_mode, 14007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int padding_threshold, 14107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int *aligned_w, 14207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int *aligned_h); 14307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 14407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int (*LINK_adreno_isMacroTilingSupportedByGpu) (void); 14507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 14607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani void(*LINK_adreno_compute_compressedfmt_aligned_width_and_height)( 14707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int width, 14807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int height, 14907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int format, 15007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int tile_mode, 15107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int raster_mode, 15207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int padding_threshold, 15307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int *aligned_w, 15407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int *aligned_h, 15507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int *bpp); 15607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 15707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani unsigned int (*LINK_adreno_get_gpu_pixel_alignment) (); 15807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; 15907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif /* GR_H_ */ 160