Home | History | Annotate | Download | only in gralloc960
      1 /*
      2  * Copyright (C) 2016 ARM Limited. All rights reserved.
      3  *
      4  * Copyright (C) 2008 The Android Open Source Project
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * You may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 #include <hardware/hardware.h>
     19 #include <hardware/gralloc1.h>
     20 
     21 #include "mali_gralloc_module.h"
     22 
     23 #include "mali_gralloc_private_interface.h"
     24 #include "mali_gralloc_buffer.h"
     25 #include "mali_gralloc_ion.h"
     26 #include "mali_gralloc_bufferdescriptor.h"
     27 #include "mali_gralloc_bufferallocation.h"
     28 #include "mali_gralloc_reference.h"
     29 #include "mali_gralloc_bufferaccess.h"
     30 #include "framebuffer_device.h"
     31 #include "gralloc_buffer_priv.h"
     32 #include "mali_gralloc_debug.h"
     33 
     34 typedef struct mali_gralloc_func
     35 {
     36 	gralloc1_function_descriptor_t desc;
     37 	gralloc1_function_pointer_t func;
     38 } mali_gralloc_func;
     39 
     40 static void mali_gralloc_dump(gralloc1_device_t *device, uint32_t *outSize, char *outBuffer)
     41 {
     42 	if (NULL == outSize)
     43 	{
     44 		ALOGE("Invalid pointer to outSize and return");
     45 		return;
     46 	}
     47 
     48 	mali_gralloc_dump_internal(outSize, outBuffer);
     49 	GRALLOC_UNUSED(device);
     50 }
     51 
     52 static int32_t mali_gralloc_create_descriptor(gralloc1_device_t *device, gralloc1_buffer_descriptor_t *outDescriptor)
     53 {
     54 	int ret = 0;
     55 	ret = mali_gralloc_create_descriptor_internal(outDescriptor);
     56 	GRALLOC_UNUSED(device);
     57 	return ret;
     58 }
     59 
     60 static int32_t mali_gralloc_destroy_descriptor(gralloc1_device_t *device, gralloc1_buffer_descriptor_t descriptor)
     61 {
     62 	int ret = 0;
     63 	ret = mali_gralloc_destroy_descriptor_internal(descriptor);
     64 	GRALLOC_UNUSED(device);
     65 	return ret;
     66 }
     67 
     68 static int32_t mali_gralloc_set_consumer_usage(gralloc1_device_t *device, gralloc1_buffer_descriptor_t descriptor,
     69                                                /*uint64_t */ gralloc1_consumer_usage_t usage)
     70 {
     71 	int ret = 0;
     72 	ret = mali_gralloc_set_consumerusage_internal(descriptor, usage);
     73 	GRALLOC_UNUSED(device);
     74 	return ret;
     75 }
     76 
     77 static int32_t mali_gralloc_set_dimensions(gralloc1_device_t *device, gralloc1_buffer_descriptor_t descriptor,
     78                                            uint32_t width, uint32_t height)
     79 {
     80 	int ret = 0;
     81 	ret = mali_gralloc_set_dimensions_internal(descriptor, width, height);
     82 	GRALLOC_UNUSED(device);
     83 	return ret;
     84 }
     85 
     86 static int32_t mali_gralloc_set_format(gralloc1_device_t *device, gralloc1_buffer_descriptor_t descriptor,
     87                                        /*int32_t*/ android_pixel_format_t format)
     88 {
     89 	int ret = 0;
     90 	ret = mali_gralloc_set_format_internal(descriptor, format);
     91 	GRALLOC_UNUSED(device);
     92 	return ret;
     93 }
     94 
     95 static int32_t mali_gralloc_set_producer_usage(gralloc1_device_t *device, gralloc1_buffer_descriptor_t descriptor,
     96                                                /*uint64_t */ gralloc1_producer_usage_t usage)
     97 {
     98 	int ret = 0;
     99 	ret = mali_gralloc_set_producerusage_internal(descriptor, usage);
    100 	GRALLOC_UNUSED(device);
    101 	return ret;
    102 }
    103 
    104 static int32_t mali_gralloc_get_backing_store(gralloc1_device_t *device, buffer_handle_t buffer,
    105                                               gralloc1_backing_store_t *outStore)
    106 {
    107 	int ret = 0;
    108 	ret = mali_gralloc_get_backing_store_internal(buffer, outStore);
    109 	GRALLOC_UNUSED(device);
    110 	return ret;
    111 }
    112 
    113 static int32_t mali_gralloc_get_consumer_usage(gralloc1_device_t *device, buffer_handle_t buffer,
    114                                                uint64_t * /*gralloc1_consumer_usage_t*/ outUsage)
    115 {
    116 	int ret = 0;
    117 	ret = mali_gralloc_get_consumer_usage_internal(buffer, outUsage);
    118 	GRALLOC_UNUSED(device);
    119 	return ret;
    120 }
    121 
    122 static int32_t mali_gralloc_get_dimensions(gralloc1_device_t *device, buffer_handle_t buffer, uint32_t *outWidth,
    123                                            uint32_t *outHeight)
    124 {
    125 	int ret = 0;
    126 	ret = mali_gralloc_get_dimensions_internal(buffer, outWidth, outHeight);
    127 	GRALLOC_UNUSED(device);
    128 	return ret;
    129 }
    130 
    131 static int32_t mali_gralloc_get_format(gralloc1_device_t *device, buffer_handle_t buffer, int32_t *outFormat)
    132 {
    133 	int ret = 0;
    134 	ret = mali_gralloc_get_format_internal(buffer, outFormat);
    135 	GRALLOC_UNUSED(device);
    136 	return ret;
    137 }
    138 
    139 static int32_t mali_gralloc_get_producer_usage(gralloc1_device_t *device, buffer_handle_t buffer,
    140                                                uint64_t * /*gralloc1_producer_usage_t*/ outUsage)
    141 {
    142 	int ret = 0;
    143 	ret = mali_gralloc_get_producer_usage_internal(buffer, outUsage);
    144 	GRALLOC_UNUSED(device);
    145 	return ret;
    146 }
    147 
    148 static int32_t mali_gralloc_get_stride(gralloc1_device_t *device, buffer_handle_t buffer, uint32_t *outStride)
    149 {
    150 	GRALLOC_UNUSED(device);
    151 
    152 	int stride;
    153 
    154 	if (mali_gralloc_query_getstride(buffer, &stride) < 0)
    155 	{
    156 		return GRALLOC1_ERROR_UNSUPPORTED;
    157 	}
    158 
    159 	*outStride = (uint32_t)stride;
    160 
    161 	return GRALLOC1_ERROR_NONE;
    162 }
    163 
    164 static int32_t mali_gralloc_allocate(gralloc1_device_t *device, uint32_t numDescriptors,
    165                                      const gralloc1_buffer_descriptor_t *descriptors, buffer_handle_t *outBuffers)
    166 {
    167 	mali_gralloc_module *m;
    168 	m = reinterpret_cast<private_module_t *>(device->common.module);
    169 	buffer_descriptor_t *bufDescriptor = (buffer_descriptor_t *)(*descriptors);
    170 	uint64_t usage;
    171 	bool shared = false;
    172 
    173 	usage = bufDescriptor->producer_usage | bufDescriptor->consumer_usage;
    174 
    175 #if DISABLE_FRAMEBUFFER_HAL != 1
    176 
    177 	if (usage & GRALLOC_USAGE_HW_FB)
    178 	{
    179 		int byte_stride;
    180 		int pixel_stride;
    181 		int width, height;
    182 		uint64_t format;
    183 
    184 		format = bufDescriptor->hal_format;
    185 		width = bufDescriptor->width;
    186 		height = bufDescriptor->height;
    187 
    188 #if GRALLOC_FB_SWAP_RED_BLUE == 1
    189 #ifdef GRALLOC_16_BITS
    190 		format = HAL_PIXEL_FORMAT_RGB_565;
    191 #else
    192 		format = HAL_PIXEL_FORMAT_BGRA_8888;
    193 #endif
    194 #endif
    195 
    196 		if (fb_alloc_framebuffer(m, bufDescriptor->consumer_usage, bufDescriptor->producer_usage, outBuffers,
    197 		                         &pixel_stride, &byte_stride) < 0)
    198 		{
    199 			return GRALLOC1_ERROR_NO_RESOURCES;
    200 		}
    201 		else
    202 		{
    203 			private_handle_t *hnd = (private_handle_t *)*outBuffers;
    204 
    205 			/* Allocate a meta-data buffer for framebuffer too. fbhal
    206 			 * ones wont need it but for hwc they will.
    207 			 *
    208 			 * Explicitly ignore allocation errors since it is not critical to have
    209 			 */
    210 			(void)gralloc_buffer_attr_allocate(hnd);
    211 
    212 			hnd->req_format = format;
    213 			hnd->yuv_info = MALI_YUV_BT601_NARROW;
    214 			hnd->internal_format = format;
    215 			hnd->byte_stride = byte_stride;
    216 			hnd->width = width;
    217 			hnd->height = height;
    218 			hnd->stride = pixel_stride;
    219 			hnd->internalWidth = width;
    220 			hnd->internalHeight = height;
    221 		}
    222 	}
    223 	else
    224 #endif
    225 	{
    226 		if (mali_gralloc_buffer_allocate(m, (gralloc_buffer_descriptor_t *)descriptors, numDescriptors, outBuffers,
    227 		                                 &shared) < 0)
    228 		{
    229 			ALOGE("Failed to allocate buffer.");
    230 			return GRALLOC1_ERROR_NO_RESOURCES;
    231 		}
    232 
    233 		if (!shared && 1 != numDescriptors)
    234 		{
    235 			return GRALLOC1_ERROR_NOT_SHARED;
    236 		}
    237 	}
    238 
    239 	return GRALLOC1_ERROR_NONE;
    240 }
    241 
    242 static int32_t mali_gralloc_retain(gralloc1_device_t *device, buffer_handle_t buffer)
    243 {
    244 	mali_gralloc_module *m;
    245 	m = reinterpret_cast<private_module_t *>(device->common.module);
    246 
    247 	if (private_handle_t::validate(buffer) < 0)
    248 	{
    249 		return GRALLOC1_ERROR_BAD_HANDLE;
    250 	}
    251 
    252 	if (mali_gralloc_reference_retain(m, buffer) < 0)
    253 	{
    254 		return GRALLOC1_ERROR_NO_RESOURCES;
    255 	}
    256 
    257 	return GRALLOC1_ERROR_NONE;
    258 }
    259 
    260 static int32_t mali_gralloc_release(gralloc1_device_t *device, buffer_handle_t buffer)
    261 {
    262 	mali_gralloc_module *m;
    263 	m = reinterpret_cast<private_module_t *>(device->common.module);
    264 
    265 	if (mali_gralloc_reference_release(m, buffer, true) < 0)
    266 	{
    267 		return GRALLOC1_ERROR_BAD_HANDLE;
    268 	}
    269 
    270 	return GRALLOC1_ERROR_NONE;
    271 }
    272 
    273 static int32_t mali_gralloc1_get_num_flex_planes(gralloc1_device_t *device, buffer_handle_t buffer,
    274                                                  uint32_t *outNumPlanes)
    275 {
    276 	mali_gralloc_module *m;
    277 	m = reinterpret_cast<private_module_t *>(device->common.module);
    278 
    279 	if (private_handle_t::validate(buffer) < 0)
    280 	{
    281 		return GRALLOC1_ERROR_BAD_HANDLE;
    282 	}
    283 
    284 	if (mali_gralloc_get_num_flex_planes(m, buffer, outNumPlanes) < 0)
    285 	{
    286 		return GRALLOC1_ERROR_UNSUPPORTED;
    287 	}
    288 
    289 	return GRALLOC1_ERROR_NONE;
    290 }
    291 
    292 static int32_t mali_gralloc1_lock_async(gralloc1_device_t *device, buffer_handle_t buffer,
    293                                         uint64_t /*gralloc1_producer_usage_t*/ producerUsage,
    294                                         uint64_t /*gralloc1_consumer_usage_t*/ consumerUsage,
    295                                         const gralloc1_rect_t *accessRegion, void **outData, int32_t acquireFence)
    296 {
    297 	mali_gralloc_module *m;
    298 	m = reinterpret_cast<private_module_t *>(device->common.module);
    299 
    300 	if (private_handle_t::validate(buffer) < 0)
    301 	{
    302 		return GRALLOC1_ERROR_BAD_HANDLE;
    303 	}
    304 
    305 	if (!((producerUsage | consumerUsage) & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)))
    306 	{
    307 		return GRALLOC1_ERROR_BAD_VALUE;
    308 	}
    309 
    310 	if (mali_gralloc_lock_async(m, buffer, producerUsage | consumerUsage, accessRegion->left, accessRegion->top,
    311 	                            accessRegion->width, accessRegion->height, outData, acquireFence) < 0)
    312 	{
    313 		return GRALLOC1_ERROR_UNSUPPORTED;
    314 	}
    315 
    316 	return GRALLOC1_ERROR_NONE;
    317 }
    318 
    319 static int32_t mali_gralloc1_lock_flex_async(gralloc1_device_t *device, buffer_handle_t buffer,
    320                                              uint64_t /*gralloc1_producer_usage_t*/ producerUsage,
    321                                              uint64_t /*gralloc1_consumer_usage_t*/ consumerUsage,
    322                                              const gralloc1_rect_t *accessRegion,
    323                                              struct android_flex_layout *outFlexLayout, int32_t acquireFence)
    324 {
    325 	mali_gralloc_module *m;
    326 	m = reinterpret_cast<private_module_t *>(device->common.module);
    327 
    328 	if (private_handle_t::validate(buffer) < 0)
    329 	{
    330 		return GRALLOC1_ERROR_BAD_HANDLE;
    331 	}
    332 
    333 	if (!((producerUsage | consumerUsage) & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)))
    334 	{
    335 		return GRALLOC1_ERROR_BAD_VALUE;
    336 	}
    337 
    338 	if (mali_gralloc_lock_flex_async(m, buffer, producerUsage | consumerUsage, accessRegion->left, accessRegion->top,
    339 	                                 accessRegion->width, accessRegion->height, outFlexLayout, acquireFence) < 0)
    340 	{
    341 		return GRALLOC1_ERROR_UNSUPPORTED;
    342 	}
    343 
    344 	return GRALLOC1_ERROR_NONE;
    345 }
    346 
    347 static int32_t mali_gralloc1_unlock_async(gralloc1_device_t *device, buffer_handle_t buffer, int32_t *outReleaseFence)
    348 {
    349 	mali_gralloc_module *m;
    350 	m = reinterpret_cast<private_module_t *>(device->common.module);
    351 
    352 	if (private_handle_t::validate(buffer) < 0)
    353 	{
    354 		return GRALLOC1_ERROR_BAD_HANDLE;
    355 	}
    356 
    357 	mali_gralloc_unlock_async(m, buffer, outReleaseFence);
    358 	return GRALLOC1_ERROR_NONE;
    359 }
    360 
    361 static const mali_gralloc_func mali_gralloc_func_list[] = {
    362 	{ GRALLOC1_FUNCTION_DUMP, (gralloc1_function_pointer_t)mali_gralloc_dump },
    363 	{ GRALLOC1_FUNCTION_CREATE_DESCRIPTOR, (gralloc1_function_pointer_t)mali_gralloc_create_descriptor },
    364 	{ GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR, (gralloc1_function_pointer_t)mali_gralloc_destroy_descriptor },
    365 	{ GRALLOC1_FUNCTION_SET_CONSUMER_USAGE, (gralloc1_function_pointer_t)mali_gralloc_set_consumer_usage },
    366 	{ GRALLOC1_FUNCTION_SET_DIMENSIONS, (gralloc1_function_pointer_t)mali_gralloc_set_dimensions },
    367 	{ GRALLOC1_FUNCTION_SET_FORMAT, (gralloc1_function_pointer_t)mali_gralloc_set_format },
    368 	{ GRALLOC1_FUNCTION_SET_PRODUCER_USAGE, (gralloc1_function_pointer_t)mali_gralloc_set_producer_usage },
    369 	{ GRALLOC1_FUNCTION_GET_BACKING_STORE, (gralloc1_function_pointer_t)mali_gralloc_get_backing_store },
    370 	{ GRALLOC1_FUNCTION_GET_CONSUMER_USAGE, (gralloc1_function_pointer_t)mali_gralloc_get_consumer_usage },
    371 	{ GRALLOC1_FUNCTION_GET_DIMENSIONS, (gralloc1_function_pointer_t)mali_gralloc_get_dimensions },
    372 	{ GRALLOC1_FUNCTION_GET_FORMAT, (gralloc1_function_pointer_t)mali_gralloc_get_format },
    373 	{ GRALLOC1_FUNCTION_GET_PRODUCER_USAGE, (gralloc1_function_pointer_t)mali_gralloc_get_producer_usage },
    374 	{ GRALLOC1_FUNCTION_GET_STRIDE, (gralloc1_function_pointer_t)mali_gralloc_get_stride },
    375 	{ GRALLOC1_FUNCTION_ALLOCATE, (gralloc1_function_pointer_t)mali_gralloc_allocate },
    376 	{ GRALLOC1_FUNCTION_RETAIN, (gralloc1_function_pointer_t)mali_gralloc_retain },
    377 	{ GRALLOC1_FUNCTION_RELEASE, (gralloc1_function_pointer_t)mali_gralloc_release },
    378 	{ GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES, (gralloc1_function_pointer_t)mali_gralloc1_get_num_flex_planes },
    379 	{ GRALLOC1_FUNCTION_LOCK, (gralloc1_function_pointer_t)mali_gralloc1_lock_async },
    380 	{ GRALLOC1_FUNCTION_LOCK_FLEX, (gralloc1_function_pointer_t)mali_gralloc1_lock_flex_async },
    381 	{ GRALLOC1_FUNCTION_UNLOCK, (gralloc1_function_pointer_t)mali_gralloc1_unlock_async },
    382 
    383 	/* GRALLOC1_FUNCTION_INVALID has to be the last descriptor on the list. */
    384 	{ GRALLOC1_FUNCTION_INVALID, NULL }
    385 };
    386 
    387 static void mali_gralloc_getCapabilities(gralloc1_device_t *dev, uint32_t *outCount, int32_t *outCapabilities)
    388 {
    389 	GRALLOC_UNUSED(dev);
    390 	GRALLOC_UNUSED(outCapabilities);
    391 
    392 	if (outCount != NULL)
    393 	{
    394 		*outCount = 0;
    395 	}
    396 }
    397 
    398 static gralloc1_function_pointer_t mali_gralloc_getFunction(gralloc1_device_t *dev, int32_t descriptor)
    399 {
    400 	GRALLOC_UNUSED(dev);
    401 	gralloc1_function_pointer_t rval = NULL;
    402 	uint32_t pos = 0;
    403 
    404 	while (mali_gralloc_func_list[pos].desc != GRALLOC1_FUNCTION_INVALID)
    405 	{
    406 		if (mali_gralloc_func_list[pos].desc == descriptor)
    407 		{
    408 			rval = mali_gralloc_func_list[pos].func;
    409 			break;
    410 		}
    411 
    412 		pos++;
    413 	}
    414 
    415 	if (rval == NULL)
    416 	{
    417 		rval = mali_gralloc_private_interface_getFunction(descriptor);
    418 	}
    419 
    420 	return rval;
    421 }
    422 
    423 int mali_gralloc_device_open(hw_module_t const *module, const char *name, hw_device_t **device)
    424 {
    425 	gralloc1_device_t *dev;
    426 
    427 	GRALLOC_UNUSED(name);
    428 
    429 	dev = new gralloc1_device_t;
    430 
    431 	if (NULL == dev)
    432 	{
    433 		return -1;
    434 	}
    435 
    436 	/* initialize our state here */
    437 	memset(dev, 0, sizeof(*dev));
    438 
    439 	/* initialize the procs */
    440 	dev->common.tag = HARDWARE_DEVICE_TAG;
    441 	dev->common.version = 0;
    442 	dev->common.module = const_cast<hw_module_t *>(module);
    443 	dev->common.close = mali_gralloc_ion_device_close;
    444 
    445 	dev->getCapabilities = mali_gralloc_getCapabilities;
    446 	dev->getFunction = mali_gralloc_getFunction;
    447 
    448 	*device = &dev->common;
    449 
    450 	return 0;
    451 }
    452