1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2008 The Android Open Source Project 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (c) 2010 - 2014, The Linux Foundation. All rights reserved. 4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Not a Contribution, Apache license notifications and license are retained 6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * for attribution purposes only. 7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License"); 9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * you may not use this file except in compliance with the License. 10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * You may obtain a copy of the License at 11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * http://www.apache.org/licenses/LICENSE-2.0 13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Unless required by applicable law or agreed to in writing, software 15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS, 16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * See the License for the specific language governing permissions and 18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * limitations under the License. 19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/log.h> 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <linux/msm_mdp.h> 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <linux/fb.h> 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <stdint.h> 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <string.h> 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <unistd.h> 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <errno.h> 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <fcntl.h> 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/ioctl.h> 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/types.h> 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/mman.h> 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <copybit.h> 37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "gralloc_priv.h" 39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "software_converter.h" 40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <qdMetaData.h> 41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define DEBUG_MDP_ERRORS 1 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/******************************************************************************/ 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define MAX_SCALE_FACTOR (4) 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define MAX_DIMENSION (4096) 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/******************************************************************************/ 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct blitReq{ 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_buf_sync sync; 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint32_t count; 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_blit_req req[10]; 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** State information for each device instance */ 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct copybit_context_t { 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_device_t device; 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int mFD; 60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint8_t mAlpha; 61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int mFlags; 62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin bool mBlitToFB; 63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int acqFence[MDP_MAX_FENCE_FD]; 64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int relFence; 65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_buf_sync sync; 66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct blitReq list; 67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** 70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Common hardware methods 71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int open_copybit(const struct hw_module_t* module, const char* name, 74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct hw_device_t** device); 75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic struct hw_module_methods_t copybit_module_methods = { 77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinopen: open_copybit 78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The COPYBIT Module 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstruct copybit_module_t HAL_MODULE_INFO_SYM = { 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjincommon: { 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintag: HARDWARE_MODULE_TAG, 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin version_major: 1, 87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin version_minor: 0, 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin id: COPYBIT_HARDWARE_MODULE_ID, 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin name: "QCT MSM7K COPYBIT Module", 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin author: "Google, Inc.", 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin methods: ©bit_module_methods 92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/******************************************************************************/ 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** min of int a, b */ 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic inline int min(int a, int b) { 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (a<b) ? a : b; 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** max of int a, b */ 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic inline int max(int a, int b) { 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return (a>b) ? a : b; 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** scale each parameter by mul/div. Assume div isn't 0 */ 108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic inline void MULDIV(uint32_t *a, uint32_t *b, int mul, int div) { 109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (mul != div) { 110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *a = (mul * *a) / div; 111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *b = (mul * *b) / div; 112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** Determine the intersection of lhs & rhs store in out */ 116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic void intersect(struct copybit_rect_t *out, 117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const struct copybit_rect_t *lhs, 118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const struct copybit_rect_t *rhs) { 119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin out->l = max(lhs->l, rhs->l); 120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin out->t = max(lhs->t, rhs->t); 121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin out->r = min(lhs->r, rhs->r); 122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin out->b = min(lhs->b, rhs->b); 123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** convert COPYBIT_FORMAT to MDP format */ 126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int get_format(int format) { 127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch (format) { 128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGB_565: return MDP_RGB_565; 129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGBA_5551: return MDP_RGBA_5551; 130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGBA_4444: return MDP_RGBA_4444; 131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGBX_8888: return MDP_RGBX_8888; 132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_BGRX_8888: return MDP_BGRX_8888; 133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGB_888: return MDP_RGB_888; 134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGBA_8888: return MDP_RGBA_8888; 135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_BGRA_8888: return MDP_BGRA_8888; 136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_422_I: return MDP_YCRYCB_H2V1; 137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_422_I: return MDP_YCBYCR_H2V1; 138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_422_SP: return MDP_Y_CRCB_H2V1; 139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_420_SP: return MDP_Y_CRCB_H2V2; 140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_422_SP: return MDP_Y_CBCR_H2V1; 141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_420_SP: return MDP_Y_CBCR_H2V2; 142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: return MDP_Y_CBCR_H2V2_ADRENO; 143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: return MDP_Y_CBCR_H2V2_VENUS; 144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: return MDP_Y_CBCR_H2V2; 145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -1; 147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** convert from copybit image to mdp image structure */ 150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic void set_image(struct mdp_img *img, const struct copybit_image_t *rhs) 151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* hnd = (private_handle_t*)rhs->handle; 153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(hnd == NULL){ 154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("copybit: Invalid handle"); 155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return; 156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin img->width = rhs->w; 158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin img->height = rhs->h; 159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin img->format = get_format(rhs->format); 160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin img->offset = (uint32_t)hnd->offset; 161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin img->memory_id = hnd->fd; 162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** setup rectangles */ 164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic void set_rects(struct copybit_context_t *dev, 165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_blit_req *e, 166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const struct copybit_rect_t *dst, 167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const struct copybit_rect_t *src, 168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const struct copybit_rect_t *scissor) { 169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t clip; 170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin intersect(&clip, scissor, dst); 171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->dst_rect.x = clip.l; 173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->dst_rect.y = clip.t; 174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->dst_rect.w = clip.r - clip.l; 175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->dst_rect.h = clip.b - clip.t; 176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint32_t W, H, delta_x, delta_y; 178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delta_x = (clip.t - dst->t); 180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delta_y = (dst->r - clip.r); 181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.w = (clip.b - clip.t); 182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.h = (clip.r - clip.l); 183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin W = dst->b - dst->t; 184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin H = dst->r - dst->l; 185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delta_x = (clip.l - dst->l); 187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin delta_y = (clip.t - dst->t); 188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.w = (clip.r - clip.l); 189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.h = (clip.b - clip.t); 190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin W = dst->r - dst->l; 191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin H = dst->b - dst->t; 192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MULDIV(&delta_x, &e->src_rect.w, src->r - src->l, W); 195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MULDIV(&delta_y, &e->src_rect.h, src->b - src->t, H); 196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.x = delta_x + src->l; 198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.y = delta_y + src->t; 199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_V) { 201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w); 203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }else{ 204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h); 205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_H) { 209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h); 211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }else{ 212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w); 213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** setup mdp request */ 218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic void set_infos(struct copybit_context_t *dev, 219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_blit_req *req, int flags) 220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->alpha = dev->mAlpha; 222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->transp_mask = MDP_TRANSP_NOP; 223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->flags = dev->mFlags | flags; 224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // check if we are blitting to f/b 225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (COPYBIT_ENABLE == dev->mBlitToFB) { 226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->flags |= MDP_MEMORY_ID_TYPE_FB; 227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#if defined(COPYBIT_QSD8K) 229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->flags |= MDP_BLEND_FG_PREMULT; 230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** copy the bits */ 234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int msm_copybit(struct copybit_context_t *dev, void const *list) 235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int err; 237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dev->relFence != -1) { 238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin close(dev->relFence); 239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin dev->relFence = -1; 240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin err = ioctl(dev->mFD, MSMFB_ASYNC_BLIT, 242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (struct mdp_async_blit_req_list const*)list); 243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE_IF(err<0, "copyBits failed (%s)", strerror(errno)); 244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (err == 0) { 245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#if DEBUG_MDP_ERRORS 248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct mdp_async_blit_req_list const* l = 249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (struct mdp_async_blit_req_list const*)list; 250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for (unsigned int i=0 ; i<l->count ; i++) { 251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%d: src={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n" 252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin " dst={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n" 253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin " flags=%08x" 254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin , 255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin i, 256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].src.width, 257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].src.height, 258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].src.format, 259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].src_rect.x, 260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].src_rect.y, 261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].src_rect.w, 262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].src_rect.h, 263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].dst.width, 264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].dst.height, 265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].dst.format, 266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].dst_rect.x, 267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].dst_rect.y, 268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].dst_rect.w, 269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].dst_rect.h, 270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin l->req[i].flags 271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ); 272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -errno; 275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** Set a parameter to value */ 281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int set_parameter_copybit( 282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_device_t *dev, 283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int name, 284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int value) 285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int status = 0; 288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx) { 289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch(name) { 290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_ROTATION_DEG: 291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch (value) { 292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case 0: 293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~0x7; 294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case 90: 296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~0x7; 297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= MDP_ROT_90; 298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case 180: 300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~0x7; 301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= MDP_ROT_180; 302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case 270: 304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~0x7; 305054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= MDP_ROT_270; 306054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 307054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin default: 308054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Invalid value for COPYBIT_ROTATION_DEG"); 309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = -EINVAL; 310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 311054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 312054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 313054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_PLANE_ALPHA: 314054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (value < 0) value = MDP_ALPHA_NOP; 315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (value >= 256) value = 255; 316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mAlpha = (uint8_t)value; 317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_DITHER: 319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (value == COPYBIT_ENABLE) { 320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= MDP_DITHER; 321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else if (value == COPYBIT_DISABLE) { 322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~MDP_DITHER; 323054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 324054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 325054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_BLUR: 326054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (value == COPYBIT_ENABLE) { 327054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= MDP_BLUR; 328054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else if (value == COPYBIT_DISABLE) { 329054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~MDP_BLUR; 330054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 331054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 332054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_BLEND_MODE: 333054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(value == COPYBIT_BLENDING_PREMULT) { 334054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= MDP_BLEND_FG_PREMULT; 335054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 336054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~MDP_BLEND_FG_PREMULT; 337054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 338054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 339054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_TRANSFORM: 340054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~0x7; 341054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= value & 0x7; 342054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 343054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_BLIT_TO_FRAMEBUFFER: 344054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (COPYBIT_ENABLE == value) { 345054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mBlitToFB = value; 346054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else if (COPYBIT_DISABLE == value) { 347054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mBlitToFB = value; 348054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 349054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s:Invalid input for COPYBIT_BLIT_TO_FRAMEBUFFER : %d", 350054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin __FUNCTION__, value); 351054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 352054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 353054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_FG_LAYER: 354054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(value == COPYBIT_ENABLE) { 355054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags |= MDP_IS_FG; 356054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else if (value == COPYBIT_DISABLE) { 357054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags &= ~MDP_IS_FG; 358054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 359054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break ; 360054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin default: 361054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = -EINVAL; 362054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 363054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 364054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 365054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = -EINVAL; 366054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 367054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return status; 368054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 369054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 370054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** Get a static info value */ 371054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int get(struct copybit_device_t *dev, int name) 372054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 373054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 374054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int value; 375054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx) { 376054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch(name) { 377054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_MINIFICATION_LIMIT: 378054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin value = MAX_SCALE_FACTOR; 379054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 380054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_MAGNIFICATION_LIMIT: 381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin value = MAX_SCALE_FACTOR; 382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_SCALING_FRAC_BITS: 384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin value = 32; 385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case COPYBIT_ROTATION_STEP_DEG: 387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin value = 90; 388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin break; 389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin default: 390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin value = -EINVAL; 391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin value = -EINVAL; 394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return value; 396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int set_sync_copybit(struct copybit_device_t *dev, 399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int acquireFenceFd) 400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (acquireFenceFd != -1) { 403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx->list.sync.acq_fen_fd_cnt < (MDP_MAX_FENCE_FD - 1)) { 404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->acqFence[ctx->list.sync.acq_fen_fd_cnt++] = acquireFenceFd; 405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int ret = -EINVAL; 407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct blitReq *list = &ctx->list; 408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Since fence is full kick off what is already in the list 410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ret = msm_copybit(ctx, list); 411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ret < 0) { 412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Blit call failed", __FUNCTION__); 413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->count = 0; 416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->sync.acq_fen_fd_cnt = 0; 417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->acqFence[list->sync.acq_fen_fd_cnt++] = acquireFenceFd; 418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** do a stretch blit type operation */ 424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int stretch_copybit( 425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_device_t *dev, 426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_image_t const *dst, 427054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_image_t const *src, 428054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t const *dst_rect, 429054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t const *src_rect, 430054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_region_t const *region) 431054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 432054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 433054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct blitReq *list; 434054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int status = 0; 435054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t *yv12_handle = NULL; 436054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 437054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx) { 438054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list = &ctx->list; 439054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 440054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx->mAlpha < 255) { 441054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin switch (src->format) { 442054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // we don't support plane alpha with RGBA formats 443054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGBA_8888: 444054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_BGRA_8888: 445054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGBA_5551: 446054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin case HAL_PIXEL_FORMAT_RGBA_4444: 447054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s : Unsupported Pixel format %d", __FUNCTION__, 448054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin src->format); 449054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 450054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 451054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 452054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 453054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (src_rect->l < 0 || (uint32_t)src_rect->r > src->w || 454054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin src_rect->t < 0 || (uint32_t)src_rect->b > src->h) { 455054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // this is always invalid 456054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s : Invalid source rectangle : src_rect l %d t %d r %d b %d",\ 457054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin __FUNCTION__, src_rect->l, src_rect->t, src_rect->r, src_rect->b); 458054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 459054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 460054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 461054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 462054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (src->w > MAX_DIMENSION || src->h > MAX_DIMENSION) { 463054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s : Invalid source dimensions w %d h %d", __FUNCTION__, src->w, src->h); 464054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 465054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 466054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 467054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) { 468054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s : Invalid DST dimensions w %d h %d", __FUNCTION__, dst->w, dst->h); 469054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 470054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 471054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 472054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(src->format == HAL_PIXEL_FORMAT_YV12) { 473054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int usage = 474054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED; 475054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (0 == alloc_buffer(&yv12_handle,src->w,src->h, 476054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin src->format, usage)){ 477054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(0 == convertYV12toYCrCb420SP(src,yv12_handle)){ 478054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (const_cast<copybit_image_t *>(src))->format = 479054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin HAL_PIXEL_FORMAT_YCrCb_420_SP; 480054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (const_cast<copybit_image_t *>(src))->handle = 481054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin yv12_handle; 482054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (const_cast<copybit_image_t *>(src))->base = 483054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (void *)yv12_handle->base; 484054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 485054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin else{ 486054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Error copybit conversion from yv12 failed"); 487054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(yv12_handle) 488054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin free_buffer(yv12_handle); 489054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 490054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 491054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 492054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin else{ 493054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Error:unable to allocate memeory for yv12 software conversion"); 494054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 495054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 496054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 497054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const uint32_t maxCount = 498054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (uint32_t)(sizeof(list->req)/sizeof(list->req[0])); 499054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin const struct copybit_rect_t bounds = { 0, 0, (int)dst->w, (int)dst->h }; 500054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t clip; 501054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = 0; 502054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin while ((status == 0) && region->next(region, &clip)) { 503054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin intersect(&clip, &bounds, &clip); 504054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mdp_blit_req* req = &list->req[list->count]; 505054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int flags = 0; 506054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 507054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private_handle_t* src_hnd = (private_handle_t*)src->handle; 508054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(src_hnd != NULL && 509054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin (!(src_hnd->flags & private_handle_t::PRIV_FLAGS_CACHED))) { 510054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin flags |= MDP_BLIT_NON_CACHED; 511054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 512054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 513054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // Set Color Space for MDP to configure CSC matrix 514054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->color_space = ITU_R_601; 515054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin MetaData_t *metadata = (MetaData_t *)src_hnd->base_metadata; 516054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (metadata && (metadata->operation & UPDATE_COLOR_SPACE)) { 517054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->color_space = metadata->colorSpace; 518054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 519054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 520054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_infos(ctx, req, flags); 521054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_image(&req->dst, dst); 522054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_image(&req->src, src); 523054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_rects(ctx, req, dst_rect, src_rect, &clip); 524054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 525054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (req->src_rect.w<=0 || req->src_rect.h<=0) 526054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin continue; 527054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 528054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (req->dst_rect.w<=0 || req->dst_rect.h<=0) 529054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin continue; 530054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 531054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (++list->count == maxCount) { 532054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = msm_copybit(ctx, list); 533054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->sync.acq_fen_fd_cnt = 0; 534054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->count = 0; 535054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 536054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 537054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(yv12_handle) { 538054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin //Before freeing the buffer we need buffer passed through blit call 539054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (list->count != 0) { 540054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = msm_copybit(ctx, list); 541054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->sync.acq_fen_fd_cnt = 0; 542054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->count = 0; 543054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 544054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin free_buffer(yv12_handle); 545054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 546054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 547054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s : Invalid COPYBIT context", __FUNCTION__); 548054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = -EINVAL; 549054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 550054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return status; 551054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 552054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 553054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** Perform a blit type operation */ 554054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int blit_copybit( 555054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_device_t *dev, 556054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_image_t const *dst, 557054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_image_t const *src, 558054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_region_t const *region) 559054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 560054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t dr = { 0, 0, (int)dst->w, (int)dst->h }; 561054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t sr = { 0, 0, (int)src->w, (int)src->h }; 562054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return stretch_copybit(dev, dst, src, &dr, &sr, region); 563054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 564054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 565054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int finish_copybit(struct copybit_device_t *dev) 566054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 567054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin // NOP for MDP copybit 568054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!dev) 569054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 570054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 571054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 572054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 573054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int clear_copybit(struct copybit_device_t *dev, 574054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_image_t const *buf, 575054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t *rect) 576054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 577054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 578054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint32_t color = 0; // black color 579054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 580054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!ctx) { 581054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s: Invalid copybit context", __FUNCTION__); 582054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 583054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 584054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 585054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct blitReq list1; 586054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset((char *)&list1 , 0 ,sizeof (struct blitReq) ); 587054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list1.count = 1; 588054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int my_tmp_get_fence = -1; 589054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 590054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list1.sync.acq_fen_fd = ctx->acqFence; 591054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list1.sync.rel_fen_fd = &my_tmp_get_fence; 592054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list1.sync.acq_fen_fd_cnt = ctx->list.sync.acq_fen_fd_cnt; 593054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mdp_blit_req* req = &list1.req[0]; 594054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 595054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if(!req) { 596054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s : Invalid request", __FUNCTION__); 597054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 598054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 599054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 600054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_image(&req->dst, buf); 601054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_image(&req->src, buf); 602054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 603054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > req->dst.width || 604054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin rect->t < 0 || (uint32_t)(rect->b - rect->t) > req->dst.height) { 605054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE ("%s : Invalid rect : src_rect l %d t %d r %d b %d",\ 606054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin __FUNCTION__, rect->l, rect->t, rect->r, rect->b); 607054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 608054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 609054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 610054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.x = rect->l; 611054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.y = rect->t; 612054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.w = rect->r - rect->l; 613054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.h = rect->b - rect->t; 614054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 615054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->src_rect = req->dst_rect; 616054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 617054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.b = (uint32_t)((color >> 16) & 0xff); 618054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.g = (uint32_t)((color >> 8) & 0xff); 619054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.r = (uint32_t)((color >> 0) & 0xff); 620054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.alpha = MDP_ALPHA_NOP; 621054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 622054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->transp_mask = MDP_TRANSP_NOP; 623054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->flags = MDP_SOLID_FILL | MDP_MEMORY_ID_TYPE_FB | MDP_BLEND_FG_PREMULT; 624054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int status = msm_copybit(ctx, &list1); 625054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 626054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->list.sync.acq_fen_fd_cnt = 0; 627054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (my_tmp_get_fence != -1) 628054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin close(my_tmp_get_fence); 629054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 630054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return status; 631054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 632054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 633054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** Fill the rect on dst with RGBA color **/ 634054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int fill_color(struct copybit_device_t *dev, 635054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_image_t const *dst, 636054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_rect_t const *rect, 637054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin uint32_t color) 638054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 639054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 640054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (!ctx) { 641054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Invalid copybit context", __FUNCTION__); 642054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 643054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 644054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 645054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) { 646054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Invalid DST w=%d h=%d", __FUNCTION__, dst->w, dst->h); 647054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 648054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 649054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 650054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > dst->w || 651054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin rect->t < 0 || (uint32_t)(rect->b - rect->t) > dst->h) { 652054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Invalid destination rect: l=%d t=%d r=%d b=%d", 653054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin __FUNCTION__, rect->l, rect->t, rect->r, rect->b); 654054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return -EINVAL; 655054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 656054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 657054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int status = 0; 658054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct blitReq* list = &ctx->list; 659054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin mdp_blit_req* req = &list->req[list->count++]; 660054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_infos(ctx, req, MDP_SOLID_FILL); 661054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_image(&req->src, dst); 662054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin set_image(&req->dst, dst); 663054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 664054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.x = rect->l; 665054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.y = rect->t; 666054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.w = rect->r - rect->l; 667054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->dst_rect.h = rect->b - rect->t; 668054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->src_rect = req->dst_rect; 669054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 670054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.r = (uint32_t)((color >> 0) & 0xff); 671054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.g = (uint32_t)((color >> 8) & 0xff); 672054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.b = (uint32_t)((color >> 16) & 0xff); 673054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin req->const_color.alpha = (uint32_t)((color >> 24) & 0xff); 674054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 675054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (list->count == sizeof(list->req)/sizeof(list->req[0])) { 676054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = msm_copybit(ctx, list); 677054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->sync.acq_fen_fd_cnt = 0; 678054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->count = 0; 679054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 680054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return status; 681054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 682054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 683054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/ 684054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 685054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** Close the copybit device */ 686054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int close_copybit(struct hw_device_t *dev) 687054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 688054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 689054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx) { 690054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin close(ctx->mFD); 691054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin free(ctx); 692054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 693054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return 0; 694054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 695054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 696054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int flush_get_fence(struct copybit_device_t *dev, int* fd) 697054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 698054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 699054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct blitReq *list = &ctx->list; 700054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int ret = -EINVAL; 701054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 702054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (list->count) { 703054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ret = msm_copybit(ctx, list); 704054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ret < 0) 705054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("%s: Blit call failed", __FUNCTION__); 706054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->count = 0; 707054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 708054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *fd = ctx->relFence; 709054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin list->sync.acq_fen_fd_cnt = 0; 710054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->relFence = -1; 711054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return ret; 712054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 713054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 714054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/** Open a new instance of a copybit device using name */ 715054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int open_copybit(const struct hw_module_t* module, const char* name, 716054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct hw_device_t** device) 717054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{ 718054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin int status = -EINVAL; 719054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 720054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (strcmp(name, COPYBIT_HARDWARE_COPYBIT0)) { 721054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return COPYBIT_FAILURE; 722054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 723054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin copybit_context_t *ctx; 724054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx = (copybit_context_t *)malloc(sizeof(copybit_context_t)); 725054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin memset(ctx, 0, sizeof(*ctx)); 726054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 727054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.common.tag = HARDWARE_DEVICE_TAG; 728054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.common.version = 1; 729054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.common.module = const_cast<hw_module_t*>(module); 730054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.common.close = close_copybit; 731054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.set_parameter = set_parameter_copybit; 732054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.get = get; 733054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.blit = blit_copybit; 734054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.set_sync = set_sync_copybit; 735054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.stretch = stretch_copybit; 736054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.finish = finish_copybit; 737054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.fill_color = fill_color; 738054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.flush_get_fence = flush_get_fence; 739054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->device.clear = clear_copybit; 740054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mAlpha = MDP_ALPHA_NOP; 741054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFlags = 0; 742054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->sync.flags = 0; 743054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->relFence = -1; 744054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin for (int i=0; i < MDP_MAX_FENCE_FD; i++) { 745054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->acqFence[i] = -1; 746054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 747054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->sync.acq_fen_fd = ctx->acqFence; 748054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->sync.rel_fen_fd = &ctx->relFence; 749054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->list.count = 0; 750054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->list.sync.acq_fen_fd_cnt = 0; 751054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->list.sync.rel_fen_fd = ctx->sync.rel_fen_fd; 752054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->list.sync.acq_fen_fd = ctx->sync.acq_fen_fd; 753054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ctx->mFD = open("/dev/graphics/fb0", O_RDWR, 0); 754054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin if (ctx->mFD < 0) { 755054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = errno; 756054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ALOGE("Error opening frame buffer errno=%d (%s)", 757054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status, strerror(status)); 758054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = -status; 759054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } else { 760054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin status = 0; 761054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *device = &ctx->device.common; 762054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin } 763054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin return status; 764054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} 765