/* static */ bool TbbEvaluator::EvalStencils( const float *src, BufferDescriptor const &srcDesc, float *dst, BufferDescriptor const &dstDesc, float *du, BufferDescriptor const &duDesc, float *dv, BufferDescriptor const &dvDesc, const int * sizes, const int * offsets, const int * indices, const float * weights, const float * duWeights, const float * dvWeights, int start, int end) { if (end <= start) return true; if (srcDesc.length != dstDesc.length) return false; if (srcDesc.length != duDesc.length) return false; if (srcDesc.length != dvDesc.length) return false; TbbEvalStencils(src, srcDesc, dst, dstDesc, du, duDesc, dv, dvDesc, NULL, BufferDescriptor(), NULL, BufferDescriptor(), NULL, BufferDescriptor(), sizes, offsets, indices, weights, duWeights, dvWeights, NULL, NULL, NULL, start, end); return true; }
/* static */ bool TbbEvaluator::EvalPatches( const float *src, BufferDescriptor const &srcDesc, float *dst, BufferDescriptor const &dstDesc, int numPatchCoords, const PatchCoord *patchCoords, const PatchArray *patchArrayBuffer, const int *patchIndexBuffer, const PatchParam *patchParamBuffer) { if (srcDesc.length != dstDesc.length) return false; TbbEvalPatches(src, srcDesc, dst, dstDesc, NULL, BufferDescriptor(), NULL, BufferDescriptor(), NULL, BufferDescriptor(), NULL, BufferDescriptor(), NULL, BufferDescriptor(), numPatchCoords, patchCoords, patchArrayBuffer, patchIndexBuffer, patchParamBuffer); return true; }
gralloc1_error_t BufferManager::Perform(int operation, va_list args) { switch (operation) { case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER: { int fd = va_arg(args, int); unsigned int size = va_arg(args, unsigned int); unsigned int offset = va_arg(args, unsigned int); void *base = va_arg(args, void *); int width = va_arg(args, int); int height = va_arg(args, int); int format = va_arg(args, int); native_handle_t **handle = va_arg(args, native_handle_t **); private_handle_t *hnd = reinterpret_cast<private_handle_t *>( native_handle_create(private_handle_t::kNumFds, private_handle_t::NumInts())); if (hnd) { unsigned int alignedw = 0, alignedh = 0; hnd->magic = private_handle_t::kMagic; hnd->fd = fd; hnd->flags = private_handle_t::PRIV_FLAGS_USES_ION; hnd->size = size; hnd->offset = offset; hnd->base = uint64_t(base) + offset; hnd->gpuaddr = 0; BufferDescriptor descriptor(width, height, format); allocator_->GetAlignedWidthAndHeight(descriptor, &alignedw, &alignedh); hnd->unaligned_width = width; hnd->unaligned_height = height; hnd->width = INT(alignedw); hnd->height = INT(alignedh); hnd->format = format; *handle = reinterpret_cast<native_handle_t *>(hnd); } } break; case GRALLOC_MODULE_PERFORM_GET_STRIDE: { int width = va_arg(args, int); int format = va_arg(args, int); int *stride = va_arg(args, int *); unsigned int alignedw = 0, alignedh = 0; BufferDescriptor descriptor(width, width, format); allocator_->GetAlignedWidthAndHeight(descriptor, &alignedw, &alignedh); *stride = INT(alignedw); } break; case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE: { private_handle_t *hnd = va_arg(args, private_handle_t *); int *stride = va_arg(args, int *); if (private_handle_t::validate(hnd) != 0) { return GRALLOC1_ERROR_BAD_HANDLE; } BufferDim_t buffer_dim; if (getMetaData(hnd, GET_BUFFER_GEOMETRY, &buffer_dim) == 0) { *stride = buffer_dim.sliceWidth; } else { *stride = hnd->width; } } break; // TODO(user) : this alone should be sufficient, ask gfx to get rid of above case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE: { private_handle_t *hnd = va_arg(args, private_handle_t *); int *stride = va_arg(args, int *); int *height = va_arg(args, int *); if (private_handle_t::validate(hnd) != 0) { return GRALLOC1_ERROR_BAD_HANDLE; } BufferDim_t buffer_dim; if (getMetaData(hnd, GET_BUFFER_GEOMETRY, &buffer_dim) == 0) { *stride = buffer_dim.sliceWidth; *height = buffer_dim.sliceHeight; } else { *stride = hnd->width; *height = hnd->height; } } break; case GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES: { // TODO(user): Usage is split now. take care of it from Gfx client. // see if we can directly expect descriptor from gfx client. int width = va_arg(args, int); int height = va_arg(args, int); int format = va_arg(args, int); uint64_t producer_usage = va_arg(args, uint64_t); uint64_t consumer_usage = va_arg(args, uint64_t); gralloc1_producer_usage_t prod_usage = static_cast<gralloc1_producer_usage_t>(producer_usage); gralloc1_consumer_usage_t cons_usage = static_cast<gralloc1_consumer_usage_t>(consumer_usage); int *aligned_width = va_arg(args, int *); int *aligned_height = va_arg(args, int *); int *tile_enabled = va_arg(args, int *); unsigned int alignedw, alignedh; BufferDescriptor descriptor(width, height, format, prod_usage, cons_usage); *tile_enabled = allocator_->IsUBwcEnabled(format, prod_usage, cons_usage); allocator_->GetAlignedWidthAndHeight(descriptor, &alignedw, &alignedh); *aligned_width = INT(alignedw); *aligned_height = INT(alignedh); } break; case GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE: { private_handle_t *hnd = va_arg(args, private_handle_t *); int *color_space = va_arg(args, int *); if (private_handle_t::validate(hnd) != 0) { return GRALLOC1_ERROR_BAD_HANDLE; } #ifdef USE_COLOR_METADATA ColorMetaData color_metadata; if (getMetaData(hnd, GET_COLOR_METADATA, &color_metadata) == 0) { switch (color_metadata.colorPrimaries) { case ColorPrimaries_BT709_5: *color_space = HAL_CSC_ITU_R_709; break; case ColorPrimaries_BT601_6_525: *color_space = ((color_metadata.range) ? HAL_CSC_ITU_R_601_FR : HAL_CSC_ITU_R_601); break; case ColorPrimaries_BT2020: *color_space = (color_metadata.range) ? HAL_CSC_ITU_R_2020_FR : HAL_CSC_ITU_R_2020; break; default: ALOGE("Unknown Color Space = %d", color_metadata.colorPrimaries); break; } break; } if (getMetaData(hnd, GET_COLOR_SPACE, &color_metadata) != 0) { *color_space = 0; } #else *color_space = 0; #endif } break; case GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO: { private_handle_t *hnd = va_arg(args, private_handle_t *); android_ycbcr *ycbcr = va_arg(args, struct android_ycbcr *); if (private_handle_t::validate(hnd) != 0) { return GRALLOC1_ERROR_BAD_HANDLE; } if (allocator_->GetYUVPlaneInfo(hnd, ycbcr)) { return GRALLOC1_ERROR_UNDEFINED; } } break; case GRALLOC_MODULE_PERFORM_GET_MAP_SECURE_BUFFER_INFO: { private_handle_t *hnd = va_arg(args, private_handle_t *); int *map_secure_buffer = va_arg(args, int *); if (private_handle_t::validate(hnd) != 0) { return GRALLOC1_ERROR_BAD_HANDLE; } if (getMetaData(hnd, GET_MAP_SECURE_BUFFER, map_secure_buffer) == 0) { *map_secure_buffer = 0; } } break; case GRALLOC_MODULE_PERFORM_GET_UBWC_FLAG: { private_handle_t *hnd = va_arg(args, private_handle_t *); int *flag = va_arg(args, int *); if (private_handle_t::validate(hnd) != 0) { return GRALLOC1_ERROR_BAD_HANDLE; } *flag = hnd->flags &private_handle_t::PRIV_FLAGS_UBWC_ALIGNED; } break; case GRALLOC_MODULE_PERFORM_GET_RGB_DATA_ADDRESS: { private_handle_t *hnd = va_arg(args, private_handle_t *); void **rgb_data = va_arg(args, void **); if (private_handle_t::validate(hnd) != 0) { return GRALLOC1_ERROR_BAD_HANDLE; } if (allocator_->GetRgbDataAddress(hnd, rgb_data)) { return GRALLOC1_ERROR_UNDEFINED; } } break; case GRALLOC1_MODULE_PERFORM_GET_BUFFER_SIZE_AND_DIMENSIONS: { int width = va_arg(args, int); int height = va_arg(args, int); int format = va_arg(args, int); uint64_t p_usage = va_arg(args, uint64_t); uint64_t c_usage = va_arg(args, uint64_t); gralloc1_producer_usage_t producer_usage = static_cast<gralloc1_producer_usage_t>(p_usage); gralloc1_consumer_usage_t consumer_usage = static_cast<gralloc1_consumer_usage_t>(c_usage); uint32_t *aligned_width = va_arg(args, uint32_t *); uint32_t *aligned_height = va_arg(args, uint32_t *); uint32_t *size = va_arg(args, uint32_t *); auto descriptor = BufferDescriptor(width, height, format, producer_usage, consumer_usage); allocator_->GetBufferSizeAndDimensions(descriptor, size, aligned_width, aligned_height); // Align size auto align = GetDataAlignment(format, producer_usage, consumer_usage); *size = ALIGN(*size, align); } break; // TODO(user): Break out similar functionality, preferably moving to a common lib. case GRALLOC1_MODULE_PERFORM_ALLOCATE_BUFFER: { int width = va_arg(args, int); int height = va_arg(args, int); int format = va_arg(args, int); uint64_t p_usage = va_arg(args, uint64_t); uint64_t c_usage = va_arg(args, uint64_t); buffer_handle_t *hnd = va_arg(args, buffer_handle_t*); gralloc1_producer_usage_t producer_usage = static_cast<gralloc1_producer_usage_t>(p_usage); gralloc1_consumer_usage_t consumer_usage = static_cast<gralloc1_consumer_usage_t>(c_usage); BufferDescriptor descriptor(width, height, format, producer_usage, consumer_usage); unsigned int size; unsigned int alignedw, alignedh; allocator_->GetBufferSizeAndDimensions(descriptor, &size, &alignedw, &alignedh); AllocateBuffer(descriptor, hnd, size); } break; default: break; } return GRALLOC1_ERROR_NONE; }