libgralloc: Use new GFX API to calculate stride

Use new GFX API compute_aligned_width_and_height to get the stride
value for RGB surfaces.
Backward compatible with GFX old API when old GFX library is used.

Change-Id: I15b0954602b816bf4e88f48622494144fc77c14f
This commit is contained in:
Ramkumar Radhakrishnan
2013-11-04 14:29:18 -08:00
committed by Manoj Kumar AVM
parent 15eeacdcd6
commit 473f4085e3
3 changed files with 61 additions and 24 deletions

View File

@@ -86,8 +86,13 @@ static bool useUncached(int usage)
//-------------- AdrenoMemInfo-----------------------//
AdrenoMemInfo::AdrenoMemInfo()
{
LINK_adreno_compute_aligned_width_and_height = NULL;
LINK_adreno_compute_padding = NULL;
libadreno_utils = ::dlopen("libadreno_utils.so", RTLD_NOW);
if (libadreno_utils) {
*(void **)&LINK_adreno_compute_aligned_width_and_height =
::dlsym(libadreno_utils, "compute_aligned_width_and_height");
*(void **)&LINK_adreno_compute_padding = ::dlsym(libadreno_utils,
"compute_surface_padding");
}
@@ -100,9 +105,11 @@ AdrenoMemInfo::~AdrenoMemInfo()
}
}
int AdrenoMemInfo::getStride(int width, int format)
void AdrenoMemInfo::getAlignedWidthAndHeight(int width, int height, int format,
int& aligned_w, int& aligned_h)
{
int stride = ALIGN(width, 32);
aligned_w = ALIGN(width, 32);
aligned_h = ALIGN(height, 32);
// Currently surface padding is only computed for RGB* surfaces.
if (format <= HAL_PIXEL_FORMAT_sRGB_X_8888) {
// Don't add any additional padding if debug.gralloc.map_fb_memory
@@ -111,7 +118,7 @@ int AdrenoMemInfo::getStride(int width, int format)
if((property_get("debug.gralloc.map_fb_memory", property, NULL) > 0) &&
(!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
(!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
return stride;
return;
}
int bpp = 4;
@@ -125,25 +132,39 @@ int AdrenoMemInfo::getStride(int width, int format)
break;
default: break;
}
if ((libadreno_utils) && (LINK_adreno_compute_padding)) {
int surface_tile_height = 1; // Linear surface
if (libadreno_utils) {
int raster_mode = 0; // Adreno unknown raster mode.
int padding_threshold = 512; // Threshold for padding surfaces.
// the function below expects the width to be a multiple of
// 32 pixels, hence we pass stride instead of width.
stride = LINK_adreno_compute_padding(stride, bpp,
// the function below computes aligned width and aligned height
// based on linear or macro tile mode selected.
if(LINK_adreno_compute_aligned_width_and_height) {
int tile_mode = 0; // Linear surface
LINK_adreno_compute_aligned_width_and_height(width,
height, bpp, tile_mode,
raster_mode, padding_threshold,
&aligned_w, &aligned_h);
} else if(LINK_adreno_compute_padding) {
int surface_tile_height = 1; // Linear surface
aligned_w = LINK_adreno_compute_padding(width, bpp,
surface_tile_height, raster_mode,
padding_threshold);
ALOGW("%s: Warning!! Old GFX API is used to calculate stride",
__FUNCTION__);
} else {
ALOGW("%s: Warning!! Symbols compute_surface_padding and " \
"compute_aligned_width_and_height not found", __FUNCTION__);
}
}
} else {
switch (format)
{
case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
case HAL_PIXEL_FORMAT_RAW_SENSOR:
stride = ALIGN(width, 32);
aligned_w = ALIGN(width, 32);
break;
case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
stride = ALIGN(width, 128);
aligned_w = ALIGN(width, 128);
break;
case HAL_PIXEL_FORMAT_YCbCr_420_SP:
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
@@ -152,22 +173,21 @@ int AdrenoMemInfo::getStride(int width, int format)
case HAL_PIXEL_FORMAT_YCrCb_422_SP:
case HAL_PIXEL_FORMAT_YCbCr_422_I:
case HAL_PIXEL_FORMAT_YCrCb_422_I:
stride = ALIGN(width, 16);
aligned_w = ALIGN(width, 16);
break;
case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width);
aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12, width);
break;
case HAL_PIXEL_FORMAT_BLOB:
stride = width;
aligned_w = width;
break;
case HAL_PIXEL_FORMAT_NV21_ZSL:
stride = ALIGN(width, 64);
aligned_w = ALIGN(width, 64);
break;
default: break;
}
}
return stride;
}
//-------------- IAllocController-----------------------//
@@ -274,8 +294,11 @@ size_t getBufferSizeAndDimensions(int width, int height, int format,
{
size_t size;
alignedw = AdrenoMemInfo::getInstance().getStride(width, format);
alignedh = ALIGN(height, 32);
AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
height,
format,
alignedw,
alignedh);
switch (format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:

View File

@@ -89,12 +89,13 @@ class AdrenoMemInfo : public android::Singleton <AdrenoMemInfo>
~AdrenoMemInfo();
/*
* Function to compute the adreno stride based on the width and format.
* Function to compute the adreno aligned width and aligned height
* based on the width and format.
*
* @return stride.
* @return aligned width, aligned height
*/
int getStride(int width, int format);
void getAlignedWidthAndHeight(int width, int height, int format,
int& alignedw, int &alignedh);
private:
// Pointer to the padding library.
void *libadreno_utils;
@@ -104,5 +105,15 @@ class AdrenoMemInfo : public android::Singleton <AdrenoMemInfo>
int surface_tile_height,
int screen_tile_height,
int padding_threshold);
// link to the surface padding library.
void (*LINK_adreno_compute_aligned_width_and_height) (int width,
int height,
int bpp,
int tile_mode,
int raster_mode,
int padding_threshold,
int *aligned_w,
int *aligned_h);
};
#endif /* GR_H_ */

View File

@@ -329,7 +329,10 @@ int gralloc_perform(struct gralloc_module_t const* module,
int width = va_arg(args, int);
int format = va_arg(args, int);
int *stride = va_arg(args, int *);
*stride = AdrenoMemInfo::getInstance().getStride(width, format);
int alignedw = 0, alignedh = 0;
AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
0, format, alignedw, alignedh);
*stride = alignedw;
res = 0;
} break;
case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE: