1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2008 The Android Open Source Project 346f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu * Copyright (c) 2010 - 2014, The Linux Foundation. All rights reserved. 4728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R * 5728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained 6728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R * for attribution purposes only. 7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License. 10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at 11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and 18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License. 19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/log.h> 22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <linux/msm_mdp.h> 24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <linux/fb.h> 25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <stdint.h> 27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <string.h> 28befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <unistd.h> 29befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <errno.h> 30befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <fcntl.h> 31befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <sys/ioctl.h> 33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <sys/types.h> 34befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <sys/mman.h> 35befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 36befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <copybit.h> 37befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "gralloc_priv.h" 39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "software_converter.h" 40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 41befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define DEBUG_MDP_ERRORS 1 42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/******************************************************************************/ 44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define MAX_SCALE_FACTOR (4) 46befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define MAX_DIMENSION (4096) 47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/******************************************************************************/ 49ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampsonstruct blitReq{ 50ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct mdp_buf_sync sync; 51ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson uint32_t count; 52ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct mdp_blit_req req[10]; 53ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson}; 54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** State information for each device instance */ 56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct copybit_context_t { 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_device_t device; 58befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int mFD; 59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed uint8_t mAlpha; 60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int mFlags; 61bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed bool mBlitToFB; 62ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson int acqFence[MDP_MAX_FENCE_FD]; 63ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson int relFence; 64ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct mdp_buf_sync sync; 65ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct blitReq list; 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Common hardware methods 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int open_copybit(const struct hw_module_t* module, const char* name, 73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device); 74befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 75befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t copybit_module_methods = { 76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedopen: open_copybit 77befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 78befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 79befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 80befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * The COPYBIT Module 81befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct copybit_module_t HAL_MODULE_INFO_SYM = { 83befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedcommon: { 84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedtag: HARDWARE_MODULE_TAG, 85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_major: 1, 86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_minor: 0, 87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed id: COPYBIT_HARDWARE_MODULE_ID, 88befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed name: "QCT MSM7K COPYBIT Module", 89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed author: "Google, Inc.", 90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed methods: ©bit_module_methods 91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/******************************************************************************/ 95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 96befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** min of int a, b */ 97befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline int min(int a, int b) { 98befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (a<b) ? a : b; 99befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 100befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** max of int a, b */ 102befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline int max(int a, int b) { 103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (a>b) ? a : b; 104befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 105befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 106befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** scale each parameter by mul/div. Assume div isn't 0 */ 107befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline void MULDIV(uint32_t *a, uint32_t *b, int mul, int div) { 108befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (mul != div) { 109befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *a = (mul * *a) / div; 110befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *b = (mul * *b) / div; 111befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 112befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 113befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 114befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Determine the intersection of lhs & rhs store in out */ 115befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void intersect(struct copybit_rect_t *out, 116befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const struct copybit_rect_t *lhs, 117befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const struct copybit_rect_t *rhs) { 118befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed out->l = max(lhs->l, rhs->l); 119befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed out->t = max(lhs->t, rhs->t); 120befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed out->r = min(lhs->r, rhs->r); 121befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed out->b = min(lhs->b, rhs->b); 122befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 123befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 124befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** convert COPYBIT_FORMAT to MDP format */ 125befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int get_format(int format) { 126befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed switch (format) { 127befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_RGB_565: return MDP_RGB_565; 128befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_RGBX_8888: return MDP_RGBX_8888; 129f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan case HAL_PIXEL_FORMAT_BGRX_8888: return MDP_BGRX_8888; 130befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_RGB_888: return MDP_RGB_888; 131befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_RGBA_8888: return MDP_RGBA_8888; 132befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_BGRA_8888: return MDP_BGRA_8888; 13322977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCrCb_422_I: return MDP_YCRYCB_H2V1; 13422977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCbCr_422_I: return MDP_YCBYCR_H2V1; 13591406473de6b246b1b16f28f599d5d746f2c0133Raj kamal case HAL_PIXEL_FORMAT_YCrCb_422_SP: return MDP_Y_CRCB_H2V1; 13691406473de6b246b1b16f28f599d5d746f2c0133Raj kamal case HAL_PIXEL_FORMAT_YCrCb_420_SP: return MDP_Y_CRCB_H2V2; 13791406473de6b246b1b16f28f599d5d746f2c0133Raj kamal case HAL_PIXEL_FORMAT_YCbCr_422_SP: return MDP_Y_CBCR_H2V1; 13891406473de6b246b1b16f28f599d5d746f2c0133Raj kamal case HAL_PIXEL_FORMAT_YCbCr_420_SP: return MDP_Y_CBCR_H2V2; 139befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: return MDP_Y_CBCR_H2V2_ADRENO; 140fe48baec7f4379aac0cf5d06ef121cd71f8844deRadhika Ranjan Soni case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: return MDP_Y_CBCR_H2V2_VENUS; 141728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: return MDP_Y_CBCR_H2V2; 142befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 143befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 144befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 145befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 146befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** convert from copybit image to mdp image structure */ 147befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void set_image(struct mdp_img *img, const struct copybit_image_t *rhs) 148befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 149befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed private_handle_t* hnd = (private_handle_t*)rhs->handle; 150befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(hnd == NULL){ 151befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("copybit: Invalid handle"); 152befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return; 153befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 154befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed img->width = rhs->w; 155befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed img->height = rhs->h; 156befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed img->format = get_format(rhs->format); 15746f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu img->offset = (uint32_t)hnd->offset; 158befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed img->memory_id = hnd->fd; 159befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 160befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** setup rectangles */ 161befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void set_rects(struct copybit_context_t *dev, 162befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct mdp_blit_req *e, 163befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const struct copybit_rect_t *dst, 164befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const struct copybit_rect_t *src, 16546f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu const struct copybit_rect_t *scissor) { 166befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_rect_t clip; 167befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed intersect(&clip, scissor, dst); 168befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 169befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->dst_rect.x = clip.l; 170befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->dst_rect.y = clip.t; 171befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->dst_rect.w = clip.r - clip.l; 172befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->dst_rect.h = clip.b - clip.t; 173befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 174befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed uint32_t W, H, delta_x, delta_y; 175befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 176befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed delta_x = (clip.t - dst->t); 177befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed delta_y = (dst->r - clip.r); 178befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.w = (clip.b - clip.t); 179befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.h = (clip.r - clip.l); 180befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed W = dst->b - dst->t; 181befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed H = dst->r - dst->l; 182befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else { 183befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed delta_x = (clip.l - dst->l); 184befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed delta_y = (clip.t - dst->t); 185befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.w = (clip.r - clip.l); 186befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.h = (clip.b - clip.t); 187befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed W = dst->r - dst->l; 188befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed H = dst->b - dst->t; 189befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 190befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 191befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed MULDIV(&delta_x, &e->src_rect.w, src->r - src->l, W); 192befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed MULDIV(&delta_y, &e->src_rect.h, src->b - src->t, H); 193befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 194befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.x = delta_x + src->l; 195befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.y = delta_y + src->t; 196befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 197befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_V) { 198befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 199befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w); 200befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed }else{ 201befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h); 202befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 203befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 204befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 205befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_H) { 206befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 207befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h); 208befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed }else{ 209befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w); 210befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 211befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 212befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 213befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 214befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** setup mdp request */ 215befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic void set_infos(struct copybit_context_t *dev, 216befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct mdp_blit_req *req, int flags) 217befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 218befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed req->alpha = dev->mAlpha; 219befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed req->transp_mask = MDP_TRANSP_NOP; 220befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed req->flags = dev->mFlags | flags; 221bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed // check if we are blitting to f/b 222bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed if (COPYBIT_ENABLE == dev->mBlitToFB) { 223bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed req->flags |= MDP_MEMORY_ID_TYPE_FB; 224bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed } 225befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#if defined(COPYBIT_QSD8K) 226befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed req->flags |= MDP_BLEND_FG_PREMULT; 227befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif 228befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 229befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 230befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** copy the bits */ 231befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int msm_copybit(struct copybit_context_t *dev, void const *list) 232befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 233dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson int err; 234dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson if (dev->relFence != -1) { 235dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson close(dev->relFence); 236dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson dev->relFence = -1; 237dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson } 238dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson err = ioctl(dev->mFD, MSMFB_ASYNC_BLIT, 239ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson (struct mdp_async_blit_req_list const*)list); 240befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE_IF(err<0, "copyBits failed (%s)", strerror(errno)); 241befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (err == 0) { 242befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 243befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else { 244befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#if DEBUG_MDP_ERRORS 245ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct mdp_async_blit_req_list const* l = 246ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson (struct mdp_async_blit_req_list const*)list; 2475aa9f9bebbb02ccfe9b6a4e5a092c8bd324e0e88Naseer Ahmed for (unsigned int i=0 ; i<l->count ; i++) { 248befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("%d: src={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n" 249befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed " dst={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n" 2505aa9f9bebbb02ccfe9b6a4e5a092c8bd324e0e88Naseer Ahmed " flags=%08x" 251befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed , 252befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed i, 253befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].src.width, 254befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].src.height, 255befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].src.format, 256befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].src_rect.x, 257befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].src_rect.y, 258befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].src_rect.w, 259befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].src_rect.h, 260befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].dst.width, 261befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].dst.height, 262befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].dst.format, 263befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].dst_rect.x, 264befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].dst_rect.y, 265befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].dst_rect.w, 266befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].dst_rect.h, 267befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed l->req[i].flags 268befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ); 269befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 270befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif 271befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -errno; 272befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 273befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 274befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 275befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*****************************************************************************/ 276befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 277befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Set a parameter to value */ 278befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int set_parameter_copybit( 279befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_device_t *dev, 280befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int name, 281befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int value) 282befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 283befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 284befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = 0; 285befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (ctx) { 286befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed switch(name) { 287befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_ROTATION_DEG: 288befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed switch (value) { 289befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case 0: 290befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~0x7; 291befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 292befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case 90: 293befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~0x7; 294befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags |= MDP_ROT_90; 295befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 296befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case 180: 297befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~0x7; 298befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags |= MDP_ROT_180; 299befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 300befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case 270: 301befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~0x7; 302befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags |= MDP_ROT_270; 303befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 304befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed default: 305befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("Invalid value for COPYBIT_ROTATION_DEG"); 306befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = -EINVAL; 307befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 308befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 309befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 310befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_PLANE_ALPHA: 311befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (value < 0) value = MDP_ALPHA_NOP; 312befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (value >= 256) value = 255; 31346f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu ctx->mAlpha = (uint8_t)value; 314befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 315befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_DITHER: 316befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (value == COPYBIT_ENABLE) { 317befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags |= MDP_DITHER; 318befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else if (value == COPYBIT_DISABLE) { 319befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~MDP_DITHER; 320befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 321befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 322befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_BLUR: 323befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (value == COPYBIT_ENABLE) { 324befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags |= MDP_BLUR; 325befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else if (value == COPYBIT_DISABLE) { 326befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~MDP_BLUR; 327befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 328befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 329728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R case COPYBIT_BLEND_MODE: 330728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R if(value == COPYBIT_BLENDING_PREMULT) { 331befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags |= MDP_BLEND_FG_PREMULT; 332728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R } else { 333befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~MDP_BLEND_FG_PREMULT; 334befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 335befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 336befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_TRANSFORM: 337befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags &= ~0x7; 338befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags |= value & 0x7; 339befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 340bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed case COPYBIT_BLIT_TO_FRAMEBUFFER: 341bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed if (COPYBIT_ENABLE == value) { 342bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed ctx->mBlitToFB = value; 343bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed } else if (COPYBIT_DISABLE == value) { 344bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed ctx->mBlitToFB = value; 345bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed } else { 346bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed ALOGE ("%s:Invalid input for COPYBIT_BLIT_TO_FRAMEBUFFER : %d", 347bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed __FUNCTION__, value); 348bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed } 349bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed break; 35006e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty case COPYBIT_FG_LAYER: 35106e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty if(value == COPYBIT_ENABLE) { 35206e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty ctx->mFlags |= MDP_IS_FG; 35306e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty } else if (value == COPYBIT_DISABLE) { 35406e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty ctx->mFlags &= ~MDP_IS_FG; 35506e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty } 35606e7446984f4e8c752a918f60331b99c1ff55b2bShivaraj Shetty break ; 357befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed default: 358befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = -EINVAL; 359befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 360befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 361befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else { 362befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = -EINVAL; 363befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 364befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 365befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 366befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 367befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Get a static info value */ 368befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int get(struct copybit_device_t *dev, int name) 369befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 370befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 371befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int value; 372befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (ctx) { 373befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed switch(name) { 374befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_MINIFICATION_LIMIT: 375befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed value = MAX_SCALE_FACTOR; 376befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 377befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_MAGNIFICATION_LIMIT: 378befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed value = MAX_SCALE_FACTOR; 379befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 380befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_SCALING_FRAC_BITS: 381befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed value = 32; 382befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 383befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case COPYBIT_ROTATION_STEP_DEG: 384befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed value = 90; 385befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 386befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed default: 387befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed value = -EINVAL; 388befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 389befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else { 390befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed value = -EINVAL; 391befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 392befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return value; 393befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 394befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 395ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampsonstatic int set_sync_copybit(struct copybit_device_t *dev, 396ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson int acquireFenceFd) 397ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson{ 398ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 399ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson if (acquireFenceFd != -1) { 4000fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson if (ctx->list.sync.acq_fen_fd_cnt < (MDP_MAX_FENCE_FD - 1)) { 4010fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson ctx->acqFence[ctx->list.sync.acq_fen_fd_cnt++] = acquireFenceFd; 402ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson } else { 403ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson int ret = -EINVAL; 404ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct blitReq *list = &ctx->list; 405ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson 406ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson // Since fence is full kick off what is already in the list 407ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ret = msm_copybit(ctx, list); 408ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson if (ret < 0) { 409ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ALOGE("%s: Blit call failed", __FUNCTION__); 410ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson return -EINVAL; 411ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson } 412ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson list->count = 0; 4130fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson list->sync.acq_fen_fd_cnt = 0; 4140fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson ctx->acqFence[list->sync.acq_fen_fd_cnt++] = acquireFenceFd; 415ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson } 416ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson } 417ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson return 0; 418ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson} 419ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson 420befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** do a stretch blit type operation */ 421befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int stretch_copybit( 422befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_device_t *dev, 423befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_image_t const *dst, 424befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_image_t const *src, 425befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_rect_t const *dst_rect, 426befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_rect_t const *src_rect, 427befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_region_t const *region) 428befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 429befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 430ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct blitReq *list; 431befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = 0; 432befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed private_handle_t *yv12_handle = NULL; 433ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson 434befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (ctx) { 435ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson list = &ctx->list; 436befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 437befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (ctx->mAlpha < 255) { 438befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed switch (src->format) { 439befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed // we don't support plane alpha with RGBA formats 440befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_RGBA_8888: 441befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_BGRA_8888: 442befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE ("%s : Unsupported Pixel format %d", __FUNCTION__, 443befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed src->format); 444befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -EINVAL; 445befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 446befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 447befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 448728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R if (src_rect->l < 0 || (uint32_t)src_rect->r > src->w || 449728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R src_rect->t < 0 || (uint32_t)src_rect->b > src->h) { 450befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed // this is always invalid 451befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE ("%s : Invalid source rectangle : src_rect l %d t %d r %d b %d",\ 452befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed __FUNCTION__, src_rect->l, src_rect->t, src_rect->r, src_rect->b); 453befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 454befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -EINVAL; 455befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 456befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 457befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (src->w > MAX_DIMENSION || src->h > MAX_DIMENSION) { 458befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE ("%s : Invalid source dimensions w %d h %d", __FUNCTION__, src->w, src->h); 459befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -EINVAL; 460befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 461befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 462befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) { 463befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE ("%s : Invalid DST dimensions w %d h %d", __FUNCTION__, dst->w, dst->h); 464befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -EINVAL; 465befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 466befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 467befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(src->format == HAL_PIXEL_FORMAT_YV12) { 468728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R int usage = 4699ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED; 470befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (0 == alloc_buffer(&yv12_handle,src->w,src->h, 471befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed src->format, usage)){ 472befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(0 == convertYV12toYCrCb420SP(src,yv12_handle)){ 473befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed (const_cast<copybit_image_t *>(src))->format = 474befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed HAL_PIXEL_FORMAT_YCrCb_420_SP; 475befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed (const_cast<copybit_image_t *>(src))->handle = 476befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed yv12_handle; 477befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed (const_cast<copybit_image_t *>(src))->base = 478befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed (void *)yv12_handle->base; 479befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 480befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed else{ 481befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("Error copybit conversion from yv12 failed"); 482befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(yv12_handle) 483befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free_buffer(yv12_handle); 484befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -EINVAL; 485befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 486befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 487befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed else{ 488befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("Error:unable to allocate memeory for yv12 software conversion"); 489befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -EINVAL; 490befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 491befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 49246f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu const uint32_t maxCount = 49346f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu (uint32_t)(sizeof(list->req)/sizeof(list->req[0])); 494ed9ee53fcb2bff3583e9c94319bfae2784ae43c0Dhivya Subramanian const struct copybit_rect_t bounds = { 0, 0, (int)dst->w, (int)dst->h }; 495befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_rect_t clip; 496befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 497befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed while ((status == 0) && region->next(region, &clip)) { 498befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed intersect(&clip, &bounds, &clip); 499ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson mdp_blit_req* req = &list->req[list->count]; 500befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int flags = 0; 501befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 502befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed private_handle_t* src_hnd = (private_handle_t*)src->handle; 503befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(src_hnd != NULL && src_hnd->flags & private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH) { 504befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed flags |= MDP_BLIT_NON_CACHED; 505befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 506befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 507befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed set_infos(ctx, req, flags); 508befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed set_image(&req->dst, dst); 509befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed set_image(&req->src, src); 51046f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu set_rects(ctx, req, dst_rect, src_rect, &clip); 511befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 512befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (req->src_rect.w<=0 || req->src_rect.h<=0) 513befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed continue; 514befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 515befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (req->dst_rect.w<=0 || req->dst_rect.h<=0) 516befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed continue; 517befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 518ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson if (++list->count == maxCount) { 519ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson status = msm_copybit(ctx, list); 520dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson list->sync.acq_fen_fd_cnt = 0; 521ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson list->count = 0; 522befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 523befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 524730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson if(yv12_handle) { 525730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson //Before freeing the buffer we need buffer passed through blit call 526730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson if (list->count != 0) { 527730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson status = msm_copybit(ctx, list); 528dc9763fba400c4487c307cf3b72f04f01afad765Terence Hampson list->sync.acq_fen_fd_cnt = 0; 529730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson list->count = 0; 530730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson } 531730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson free_buffer(yv12_handle); 532730f0db5a7ec5a2bd8bcba7d55ab3484aba52a51Terence Hampson } 533befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else { 534befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE ("%s : Invalid COPYBIT context", __FUNCTION__); 535befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = -EINVAL; 536befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 537befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 538befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 539befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 540befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Perform a blit type operation */ 541befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int blit_copybit( 542befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_device_t *dev, 543befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_image_t const *dst, 544befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_image_t const *src, 545befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_region_t const *region) 546befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 547ed9ee53fcb2bff3583e9c94319bfae2784ae43c0Dhivya Subramanian struct copybit_rect_t dr = { 0, 0, (int)dst->w, (int)dst->h }; 548ed9ee53fcb2bff3583e9c94319bfae2784ae43c0Dhivya Subramanian struct copybit_rect_t sr = { 0, 0, (int)src->w, (int)src->h }; 549befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return stretch_copybit(dev, dst, src, &dr, &sr, region); 550befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 551befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 552728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.Rstatic int finish_copybit(struct copybit_device_t *dev) 553728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R{ 554728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R // NOP for MDP copybit 55546f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu if(!dev) 55646f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu return -EINVAL; 55746f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu 5589ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson return 0; 559728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R} 5604c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singhstatic int clear_copybit(struct copybit_device_t *dev, 5614c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh struct copybit_image_t const *buf, 5624c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh struct copybit_rect_t *rect) 5634c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh{ 5644c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 5654c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh uint32_t color = 0; // black color 5664c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 5674c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh if (!ctx) { 5684c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh ALOGE ("%s: Invalid copybit context", __FUNCTION__); 5694c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh return -EINVAL; 5704c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh } 5714c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 5724c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh struct blitReq list1; 5734c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh memset((char *)&list1 , 0 ,sizeof (struct blitReq) ); 5744c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh list1.count = 1; 5754c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh int rel_fen_fd = -1; 5764c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh int my_tmp_get_fence = -1; 5774c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 578ba330195100e98e6ff7ac6ce540ba20d6b6e699aTerence Hampson list1.sync.acq_fen_fd = ctx->acqFence; 5794c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh list1.sync.rel_fen_fd = &my_tmp_get_fence; 580ba330195100e98e6ff7ac6ce540ba20d6b6e699aTerence Hampson list1.sync.acq_fen_fd_cnt = ctx->list.sync.acq_fen_fd_cnt; 5814c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh mdp_blit_req* req = &list1.req[0]; 5824c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 5834c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh if(!req) { 5844c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh ALOGE ("%s : Invalid request", __FUNCTION__); 5854c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh return -EINVAL; 5864c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh } 5874c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 5884c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh set_image(&req->dst, buf); 5894c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh set_image(&req->src, buf); 5904c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 5914c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > req->dst.width || 5924c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh rect->t < 0 || (uint32_t)(rect->b - rect->t) > req->dst.height) { 5934c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh ALOGE ("%s : Invalid rect : src_rect l %d t %d r %d b %d",\ 5944c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh __FUNCTION__, rect->l, rect->t, rect->r, rect->b); 5954c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh return -EINVAL; 5964c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh } 5974c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 5984c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->dst_rect.x = rect->l; 5994c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->dst_rect.y = rect->t; 6004c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->dst_rect.w = rect->r - rect->l; 6014c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->dst_rect.h = rect->b - rect->t; 6024c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 6034c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->src_rect = req->dst_rect; 6044c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 6054c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->const_color.b = (uint32_t)((color >> 16) & 0xff); 6064c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->const_color.g = (uint32_t)((color >> 8) & 0xff); 6074c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->const_color.r = (uint32_t)((color >> 0) & 0xff); 6084c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->const_color.alpha = MDP_ALPHA_NOP; 6094c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 6104c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->transp_mask = MDP_TRANSP_NOP; 6114c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh req->flags = MDP_SOLID_FILL | MDP_MEMORY_ID_TYPE_FB | MDP_BLEND_FG_PREMULT; 6124c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh int status = msm_copybit(ctx, &list1); 6134c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 614ba330195100e98e6ff7ac6ce540ba20d6b6e699aTerence Hampson ctx->list.sync.acq_fen_fd_cnt = 0; 6154c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh if (my_tmp_get_fence != -1) 6164c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh close(my_tmp_get_fence); 6174c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh 6184c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh return status; 6194c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh} 620728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R 621905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan/** Fill the rect on dst with RGBA color **/ 622905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhanstatic int fill_color(struct copybit_device_t *dev, 623905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan struct copybit_image_t const *dst, 624905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan struct copybit_rect_t const *rect, 625905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan uint32_t color) 626905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan{ 627905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 628905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan if (!ctx) { 629905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan ALOGE("%s: Invalid copybit context", __FUNCTION__); 630905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan return -EINVAL; 631905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan } 632905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan 633905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) { 634905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan ALOGE("%s: Invalid DST w=%d h=%d", __FUNCTION__, dst->w, dst->h); 635905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan return -EINVAL; 636905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan } 637905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan 638905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > dst->w || 639905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan rect->t < 0 || (uint32_t)(rect->b - rect->t) > dst->h) { 640905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan ALOGE("%s: Invalid destination rect: l=%d t=%d r=%d b=%d", 641905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan __FUNCTION__, rect->l, rect->t, rect->r, rect->b); 642905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan return -EINVAL; 643905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan } 644905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan 6454dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan int status = 0; 646905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan struct blitReq* list = &ctx->list; 647905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan mdp_blit_req* req = &list->req[list->count++]; 648905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan set_infos(ctx, req, MDP_SOLID_FILL); 649905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan set_image(&req->src, dst); 650905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan set_image(&req->dst, dst); 651905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan 652905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->dst_rect.x = rect->l; 653905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->dst_rect.y = rect->t; 654905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->dst_rect.w = rect->r - rect->l; 655905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->dst_rect.h = rect->b - rect->t; 656905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->src_rect = req->dst_rect; 657905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan 658905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->const_color.r = (uint32_t)((color >> 0) & 0xff); 659905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->const_color.g = (uint32_t)((color >> 8) & 0xff); 660905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->const_color.b = (uint32_t)((color >> 16) & 0xff); 661905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan req->const_color.alpha = (uint32_t)((color >> 24) & 0xff); 662905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan 6634dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan if (list->count == sizeof(list->req)/sizeof(list->req[0])) { 6644dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan status = msm_copybit(ctx, list); 6654dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan list->sync.acq_fen_fd_cnt = 0; 6664dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan list->count = 0; 6674dbb002937f5fe623f2bea7916d05e226697063aSushil Chauhan } 668905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan return status; 669905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan} 670905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan 671befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*****************************************************************************/ 672befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 673befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Close the copybit device */ 674befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int close_copybit(struct hw_device_t *dev) 675befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 676befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 677befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (ctx) { 678befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed close(ctx->mFD); 679befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(ctx); 680befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 681befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 682befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 683befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 6849ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampsonstatic int flush_get_fence(struct copybit_device_t *dev, int* fd) 6859ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson{ 686ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 687ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson struct blitReq *list = &ctx->list; 688ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson int ret = -EINVAL; 689ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson 690ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson if (list->count) { 691ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ret = msm_copybit(ctx, list); 692ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson if (ret < 0) 693ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ALOGE("%s: Blit call failed", __FUNCTION__); 694ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson list->count = 0; 695ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson } 696ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson *fd = ctx->relFence; 6970fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson list->sync.acq_fen_fd_cnt = 0; 698ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->relFence = -1; 699ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson return ret; 7009ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson} 7019ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson 702befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/** Open a new instance of a copybit device using name */ 703befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int open_copybit(const struct hw_module_t* module, const char* name, 704befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 705befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 706befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 70746f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu 70846f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu if (!strcmp(name, COPYBIT_HARDWARE_COPYBIT0)) { 70946f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu return COPYBIT_FAILURE; 71046f5ca8de60939f8ee16f63ba244b46e1353bab8Praveena Pachipulusu } 711befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed copybit_context_t *ctx; 712befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx = (copybit_context_t *)malloc(sizeof(copybit_context_t)); 713befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(ctx, 0, sizeof(*ctx)); 714befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 715befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.common.tag = HARDWARE_DEVICE_TAG; 716befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.common.version = 1; 717befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.common.module = const_cast<hw_module_t*>(module); 718befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.common.close = close_copybit; 719befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.set_parameter = set_parameter_copybit; 720befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.get = get; 721befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.blit = blit_copybit; 722ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->device.set_sync = set_sync_copybit; 723befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->device.stretch = stretch_copybit; 724728ab97888cb24692332a038dd12cc16b2b25014Arun Kumar K.R ctx->device.finish = finish_copybit; 725905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan ctx->device.fill_color = fill_color; 7269ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson ctx->device.flush_get_fence = flush_get_fence; 7274c149fa8c0d3d9a5b5dee191afc421750d97cd3dRamakant Singh ctx->device.clear = clear_copybit; 728befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mAlpha = MDP_ALPHA_NOP; 729befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFlags = 0; 730ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->sync.flags = 0; 731b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan ctx->relFence = -1; 732b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan for (int i=0; i < MDP_MAX_FENCE_FD; i++) { 733b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan ctx->acqFence[i] = -1; 734b9e9356a3b0449dc638b555c82a98e6609385016Sushil Chauhan } 735ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->sync.acq_fen_fd = ctx->acqFence; 736ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->sync.rel_fen_fd = &ctx->relFence; 737ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->list.count = 0; 7380fb1eeb979174d1a8e18a0f1557f2246dc55f4e5Terence Hampson ctx->list.sync.acq_fen_fd_cnt = 0; 739ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->list.sync.rel_fen_fd = ctx->sync.rel_fen_fd; 740ac791ef899d93baf8bc2545b2e81f6a71d9bfbc1Terence Hampson ctx->list.sync.acq_fen_fd = ctx->sync.acq_fen_fd; 741befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ctx->mFD = open("/dev/graphics/fb0", O_RDWR, 0); 742befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (ctx->mFD < 0) { 743befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = errno; 744befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("Error opening frame buffer errno=%d (%s)", 745befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status, strerror(status)); 746befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = -status; 747befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } else { 7489ee1fcd75e50f365572a2b4e32eeef685845d323Terence Hampson status = 0; 749befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *device = &ctx->device.common; 750befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 751befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 752befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 753