1d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/* 2d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Copyright (C) 2008 The Android Open Source Project 3d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Copyright (c) 2010 - 2014, The Linux Foundation. All rights reserved. 4d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * 5d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Not a Contribution, Apache license notifications and license are retained 6d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * for attribution purposes only. 7d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * 8d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License"); 9d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * you may not use this file except in compliance with the License. 10d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * You may obtain a copy of the License at 11d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * 12d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * http://www.apache.org/licenses/LICENSE-2.0 13d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * 14d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Unless required by applicable law or agreed to in writing, software 15d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS, 16d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * See the License for the specific language governing permissions and 18d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * limitations under the License. 19d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin */ 20d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 21d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <cutils/log.h> 22d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 23d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <linux/msm_mdp.h> 24d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <linux/fb.h> 25d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 26d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <stdint.h> 27d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <string.h> 28d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <unistd.h> 29d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <errno.h> 30d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <fcntl.h> 31d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 32d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/ioctl.h> 33d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/types.h> 34d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/mman.h> 35d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 36d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <copybit.h> 37d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 38d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "gralloc_priv.h" 39d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "software_converter.h" 40d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <qdMetaData.h> 41d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 42d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define DEBUG_MDP_ERRORS 1 43d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 44d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/******************************************************************************/ 45d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 46d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define MAX_SCALE_FACTOR (4) 47d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define MAX_DIMENSION (4096) 48d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 49d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/******************************************************************************/ 50d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct blitReq{ 51d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct mdp_buf_sync sync; 52d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t count; 53d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct mdp_blit_req req[10]; 54d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 55d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 56d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** State information for each device instance */ 57d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct copybit_context_t { 58d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_device_t device; 59d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int mFD; 60d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint8_t mAlpha; 61d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int mFlags; 62d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin bool mBlitToFB; 63d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int acqFence[MDP_MAX_FENCE_FD]; 64d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int relFence; 65d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct mdp_buf_sync sync; 66d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct blitReq list; 67d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint8_t dynamic_fps; 68d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 69d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 70d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** 71d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Common hardware methods 72d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin */ 73d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 74d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int open_copybit(const struct hw_module_t* module, const char* name, 75d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct hw_device_t** device); 76d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 77d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic struct hw_module_methods_t copybit_module_methods = { 78d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinopen: open_copybit 79d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 80d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 81d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/* 82d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * The COPYBIT Module 83d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin */ 84d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstruct copybit_module_t HAL_MODULE_INFO_SYM = { 85d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjincommon: { 86d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjintag: HARDWARE_MODULE_TAG, 87d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin version_major: 1, 88d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin version_minor: 0, 89d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin id: COPYBIT_HARDWARE_MODULE_ID, 90d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin name: "QCT MSM7K COPYBIT Module", 91d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin author: "Google, Inc.", 92d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin methods: ©bit_module_methods 93d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 94d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 95d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 96d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/******************************************************************************/ 97d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 98d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** min of int a, b */ 99d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic inline int min(int a, int b) { 100d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return (a<b) ? a : b; 101d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 102d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 103d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** max of int a, b */ 104d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic inline int max(int a, int b) { 105d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return (a>b) ? a : b; 106d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 107d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 108d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** scale each parameter by mul/div. Assume div isn't 0 */ 109d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic inline void MULDIV(uint32_t *a, uint32_t *b, int mul, int div) { 110d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (mul != div) { 111d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *a = (mul * *a) / div; 112d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *b = (mul * *b) / div; 113d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 114d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 115d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 116d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** Determine the intersection of lhs & rhs store in out */ 117d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic void intersect(struct copybit_rect_t *out, 118d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin const struct copybit_rect_t *lhs, 119d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin const struct copybit_rect_t *rhs) { 120d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin out->l = max(lhs->l, rhs->l); 121d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin out->t = max(lhs->t, rhs->t); 122d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin out->r = min(lhs->r, rhs->r); 123d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin out->b = min(lhs->b, rhs->b); 124d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 125d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 126d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic bool validateCopybitRect(struct copybit_rect_t *rect) { 127d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return ((rect->b > rect->t) && (rect->r > rect->l)) ; 128d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 129d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 130d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** convert COPYBIT_FORMAT to MDP format */ 131d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int get_format(int format) { 132d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin switch (format) { 133d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGB_565: return MDP_RGB_565; 134d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGBA_5551: return MDP_RGBA_5551; 135d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGBA_4444: return MDP_RGBA_4444; 136d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGBX_8888: return MDP_RGBX_8888; 137d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_BGRX_8888: return MDP_BGRX_8888; 138d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGB_888: return MDP_RGB_888; 139d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGBA_8888: return MDP_RGBA_8888; 140d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_BGRA_8888: return MDP_BGRA_8888; 141d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_422_I: return MDP_YCRYCB_H2V1; 142d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_422_I: return MDP_YCBYCR_H2V1; 143d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_422_SP: return MDP_Y_CRCB_H2V1; 144d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_420_SP: return MDP_Y_CRCB_H2V2; 145d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_422_SP: return MDP_Y_CBCR_H2V1; 146d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_420_SP: return MDP_Y_CBCR_H2V2; 147d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: return MDP_Y_CBCR_H2V2_ADRENO; 148d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: return MDP_Y_CBCR_H2V2_VENUS; 149d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS: return MDP_Y_CRCB_H2V2_VENUS; 150d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: return MDP_Y_CBCR_H2V2; 151d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 152d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -1; 153d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 154d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 155d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** convert from copybit image to mdp image structure */ 156d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic void set_image(struct mdp_img *img, const struct copybit_image_t *rhs) 157d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 158d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin private_handle_t* hnd = (private_handle_t*)rhs->handle; 159d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(hnd == NULL){ 160d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("copybit: Invalid handle"); 161d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return; 162d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 163d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin img->width = rhs->w; 164d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin img->height = rhs->h; 165d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin img->format = get_format(rhs->format); 166d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin img->offset = (uint32_t)hnd->offset; 167d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin img->memory_id = hnd->fd; 168d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 169d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** setup rectangles */ 170d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic bool set_rects(struct copybit_context_t *dev, 171d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct mdp_blit_req *e, 172d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin const struct copybit_rect_t *dst, 173d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin const struct copybit_rect_t *src, 174d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin const struct copybit_rect_t *scissor) { 175d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t clip; 176d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin intersect(&clip, scissor, dst); 177d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 178d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (!validateCopybitRect(&clip)) 179d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return false; 180d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 181d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->dst_rect.x = clip.l; 182d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->dst_rect.y = clip.t; 183d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->dst_rect.w = clip.r - clip.l; 184d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->dst_rect.h = clip.b - clip.t; 185d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 186d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t W, H, delta_x, delta_y; 187d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 188d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin delta_x = (clip.t - dst->t); 189d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin delta_y = (dst->r - clip.r); 190d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.w = (clip.b - clip.t); 191d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.h = (clip.r - clip.l); 192d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin W = dst->b - dst->t; 193d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin H = dst->r - dst->l; 194d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 195d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin delta_x = (clip.l - dst->l); 196d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin delta_y = (clip.t - dst->t); 197d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.w = (clip.r - clip.l); 198d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.h = (clip.b - clip.t); 199d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin W = dst->r - dst->l; 200d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin H = dst->b - dst->t; 201d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 202d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 203d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin MULDIV(&delta_x, &e->src_rect.w, src->r - src->l, W); 204d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin MULDIV(&delta_y, &e->src_rect.h, src->b - src->t, H); 205d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 206d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.x = delta_x + src->l; 207d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.y = delta_y + src->t; 208d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 209d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_V) { 210d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 211d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w); 212d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin }else{ 213d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h); 214d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 215d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 216d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 217d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_H) { 218d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { 219d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.y = (src->t + src->b) - (e->src_rect.y + e->src_rect.h); 220d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin }else{ 221d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin e->src_rect.x = (src->l + src->r) - (e->src_rect.x + e->src_rect.w); 222d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 223d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 224d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return true; 225d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 226d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 227d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** setup mdp request */ 228d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic void set_infos(struct copybit_context_t *dev, 229d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct mdp_blit_req *req, int flags) 230d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 231d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->alpha = dev->mAlpha; 232d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->fps = dev->dynamic_fps; 233d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->transp_mask = MDP_TRANSP_NOP; 234d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->flags = dev->mFlags | flags; 235d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // check if we are blitting to f/b 236d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (COPYBIT_ENABLE == dev->mBlitToFB) { 237d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->flags |= MDP_MEMORY_ID_TYPE_FB; 238d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 239d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#if defined(COPYBIT_QSD8K) 240d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->flags |= MDP_BLEND_FG_PREMULT; 241d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#endif 242d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 243d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 244d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** copy the bits */ 245d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int msm_copybit(struct copybit_context_t *dev, void const *list) 246d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 247d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int err; 248d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dev->relFence != -1) { 249d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin close(dev->relFence); 250d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin dev->relFence = -1; 251d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 252d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin err = ioctl(dev->mFD, MSMFB_ASYNC_BLIT, 253d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (struct mdp_async_blit_req_list const*)list); 254d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE_IF(err<0, "copyBits failed (%s)", strerror(errno)); 255d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (err == 0) { 256d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return 0; 257d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 258d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#if DEBUG_MDP_ERRORS 259d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct mdp_async_blit_req_list const* l = 260d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (struct mdp_async_blit_req_list const*)list; 261d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin for (unsigned int i=0 ; i<l->count ; i++) { 262d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("%d: src={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n" 263d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin " dst={w=%d, h=%d, f=%d, rect={%d,%d,%d,%d}}\n" 264d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin " flags=%08x, fps=%d" 265d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin , 266d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin i, 267d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].src.width, 268d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].src.height, 269d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].src.format, 270d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].src_rect.x, 271d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].src_rect.y, 272d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].src_rect.w, 273d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].src_rect.h, 274d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].dst.width, 275d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].dst.height, 276d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].dst.format, 277d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].dst_rect.x, 278d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].dst_rect.y, 279d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].dst_rect.w, 280d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].dst_rect.h, 281d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].flags, 282d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin l->req[i].fps 283d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ); 284d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 285d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#endif 286d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -errno; 287d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 288d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 289d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 290d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*****************************************************************************/ 291d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 292d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** Set a parameter to value */ 293d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int set_parameter_copybit( 294d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_device_t *dev, 295d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int name, 296d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int value) 297d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 298d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 299d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int status = 0; 300d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx) { 301d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin switch(name) { 302d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_ROTATION_DEG: 303d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin switch (value) { 304d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case 0: 305d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~0x7; 306d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 307d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case 90: 308d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~0x7; 309d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= MDP_ROT_90; 310d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 311d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case 180: 312d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~0x7; 313d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= MDP_ROT_180; 314d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 315d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case 270: 316d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~0x7; 317d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= MDP_ROT_270; 318d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 319d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin default: 320d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("Invalid value for COPYBIT_ROTATION_DEG"); 321d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = -EINVAL; 322d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 323d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 324d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 325d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_PLANE_ALPHA: 326d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (value < 0) value = MDP_ALPHA_NOP; 327d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (value >= 256) value = 255; 328d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mAlpha = (uint8_t)value; 329d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 330d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_DYNAMIC_FPS: 331d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->dynamic_fps = (uint8_t)value; 332d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 333d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_DITHER: 334d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (value == COPYBIT_ENABLE) { 335d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= MDP_DITHER; 336d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else if (value == COPYBIT_DISABLE) { 337d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~MDP_DITHER; 338d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 339d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 340d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_BLUR: 341d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (value == COPYBIT_ENABLE) { 342d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= MDP_BLUR; 343d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else if (value == COPYBIT_DISABLE) { 344d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~MDP_BLUR; 345d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 346d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 347d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_BLEND_MODE: 348d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(value == COPYBIT_BLENDING_PREMULT) { 349d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= MDP_BLEND_FG_PREMULT; 350d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 351d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~MDP_BLEND_FG_PREMULT; 352d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 353d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 354d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_TRANSFORM: 355d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~0x7; 356d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= value & 0x7; 357d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 358d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_BLIT_TO_FRAMEBUFFER: 359d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (COPYBIT_ENABLE == value) { 360d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mBlitToFB = value; 361d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else if (COPYBIT_DISABLE == value) { 362d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mBlitToFB = value; 363d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 364d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s:Invalid input for COPYBIT_BLIT_TO_FRAMEBUFFER : %d", 365d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin __FUNCTION__, value); 366d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 367d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 368d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_FG_LAYER: 369d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(value == COPYBIT_ENABLE) { 370d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags |= MDP_IS_FG; 371d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else if (value == COPYBIT_DISABLE) { 372d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags &= ~MDP_IS_FG; 373d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 374d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break ; 375d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin default: 376d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = -EINVAL; 377d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 378d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 379d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 380d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = -EINVAL; 381d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 382d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return status; 383d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 384d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 385d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** Get a static info value */ 386d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int get(struct copybit_device_t *dev, int name) 387d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 388d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 389d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int value; 390d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx) { 391d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin switch(name) { 392d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_MINIFICATION_LIMIT: 393d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin value = MAX_SCALE_FACTOR; 394d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 395d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_MAGNIFICATION_LIMIT: 396d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin value = MAX_SCALE_FACTOR; 397d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 398d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_SCALING_FRAC_BITS: 399d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin value = 32; 400d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 401d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case COPYBIT_ROTATION_STEP_DEG: 402d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin value = 90; 403d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 404d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin default: 405d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin value = -EINVAL; 406d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 407d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 408d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin value = -EINVAL; 409d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 410d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return value; 411d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 412d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 413d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int set_sync_copybit(struct copybit_device_t *dev, 414d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int acquireFenceFd) 415d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 416d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 417d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (acquireFenceFd != -1) { 418d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx->list.sync.acq_fen_fd_cnt < (MDP_MAX_FENCE_FD - 1)) { 419d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->acqFence[ctx->list.sync.acq_fen_fd_cnt++] = acquireFenceFd; 420d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 421d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int ret = -EINVAL; 422d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct blitReq *list = &ctx->list; 423d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 424d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // Since fence is full kick off what is already in the list 425d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ret = msm_copybit(ctx, list); 426d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ret < 0) { 427d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("%s: Blit call failed", __FUNCTION__); 428d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 429d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 430d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->count = 0; 431d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->sync.acq_fen_fd_cnt = 0; 432d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->acqFence[list->sync.acq_fen_fd_cnt++] = acquireFenceFd; 433d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 434d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 435d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return 0; 436d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 437d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 438d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** do a stretch blit type operation */ 439d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int stretch_copybit( 440d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_device_t *dev, 441d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_image_t const *dst, 442d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_image_t const *src, 443d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t const *dst_rect, 444d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t const *src_rect, 445d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_region_t const *region) 446d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 447d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 448d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct blitReq *list; 449d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int status = 0; 450d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin private_handle_t *yv12_handle = NULL; 451d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 452d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx) { 453d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list = &ctx->list; 454d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 455d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx->mAlpha < 255) { 456d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin switch (src->format) { 457d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // we don't support plane alpha with RGBA formats 458d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGBA_8888: 459d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_BGRA_8888: 460d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGBA_5551: 461d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case HAL_PIXEL_FORMAT_RGBA_4444: 462d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s : Unsupported Pixel format %d", __FUNCTION__, 463d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin src->format); 464d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 465d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 466d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 467d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 468d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (src_rect->l < 0 || (uint32_t)src_rect->r > src->w || 469d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin src_rect->t < 0 || (uint32_t)src_rect->b > src->h) { 470d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // this is always invalid 471d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s : Invalid source rectangle : src_rect l %d t %d r %d b %d",\ 472d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin __FUNCTION__, src_rect->l, src_rect->t, src_rect->r, src_rect->b); 473d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 474d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 475d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 476d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 477d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (src->w > MAX_DIMENSION || src->h > MAX_DIMENSION) { 478d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s : Invalid source dimensions w %d h %d", __FUNCTION__, src->w, src->h); 479d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 480d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 481d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 482d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) { 483d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s : Invalid DST dimensions w %d h %d", __FUNCTION__, dst->w, dst->h); 484d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 485d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 486d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 487d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(src->format == HAL_PIXEL_FORMAT_YV12) { 488d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int usage = 489d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED; 490d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (0 == alloc_buffer(&yv12_handle,src->w,src->h, 491d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin src->format, usage)){ 492d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(0 == convertYV12toYCrCb420SP(src,yv12_handle)){ 493d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (const_cast<copybit_image_t *>(src))->format = 494d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin HAL_PIXEL_FORMAT_YCrCb_420_SP; 495d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (const_cast<copybit_image_t *>(src))->handle = 496d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin yv12_handle; 497d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (const_cast<copybit_image_t *>(src))->base = 498d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (void *)yv12_handle->base; 499d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 500d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin else{ 501d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("Error copybit conversion from yv12 failed"); 502d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(yv12_handle) 503d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin free_buffer(yv12_handle); 504d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 505d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 506d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 507d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin else{ 508d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("Error:unable to allocate memeory for yv12 software conversion"); 509d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 510d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 511d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 512d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin const uint32_t maxCount = 513d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (uint32_t)(sizeof(list->req)/sizeof(list->req[0])); 514d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin const struct copybit_rect_t bounds = { 0, 0, (int)dst->w, (int)dst->h }; 515d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t clip; 516d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = 0; 517d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin while ((status == 0) && region->next(region, &clip)) { 518d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin intersect(&clip, &bounds, &clip); 519d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin mdp_blit_req* req = &list->req[list->count]; 520d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int flags = 0; 521d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 522d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin private_handle_t* src_hnd = (private_handle_t*)src->handle; 523d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(src_hnd != NULL && 524d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin (!(src_hnd->flags & private_handle_t::PRIV_FLAGS_CACHED))) { 525d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin flags |= MDP_BLIT_NON_CACHED; 526d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 527d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 528d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // Set Color Space for MDP to configure CSC matrix 529d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->color_space = ITU_R_601; 530d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin MetaData_t *metadata = NULL; 531d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 532d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (src_hnd != NULL) 533d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin metadata = (MetaData_t *)src_hnd->base_metadata; 534d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 535d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (metadata && (metadata->operation & UPDATE_COLOR_SPACE)) { 536d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->color_space = metadata->colorSpace; 537d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 538d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 539d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_infos(ctx, req, flags); 540d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_image(&req->dst, dst); 541d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_image(&req->src, src); 542d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (set_rects(ctx, req, dst_rect, src_rect, &clip) == false) 543d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin continue; 544d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 545d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (req->src_rect.w<=0 || req->src_rect.h<=0) 546d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin continue; 547d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 548d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (req->dst_rect.w<=0 || req->dst_rect.h<=0) 549d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin continue; 550d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 551d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (++list->count == maxCount) { 552d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = msm_copybit(ctx, list); 553d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->sync.acq_fen_fd_cnt = 0; 554d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->count = 0; 555d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 556d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 557d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(yv12_handle) { 558d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //Before freeing the buffer we need buffer passed through blit call 559d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (list->count != 0) { 560d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = msm_copybit(ctx, list); 561d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->sync.acq_fen_fd_cnt = 0; 562d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->count = 0; 563d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 564d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin free_buffer(yv12_handle); 565d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 566d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 567d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s : Invalid COPYBIT context", __FUNCTION__); 568d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = -EINVAL; 569d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 570d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return status; 571d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 572d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 573d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** Perform a blit type operation */ 574d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int blit_copybit( 575d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_device_t *dev, 576d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_image_t const *dst, 577d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_image_t const *src, 578d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_region_t const *region) 579d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 580d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t dr = { 0, 0, (int)dst->w, (int)dst->h }; 581d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t sr = { 0, 0, (int)src->w, (int)src->h }; 582d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return stretch_copybit(dev, dst, src, &dr, &sr, region); 583d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 584d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 585d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int finish_copybit(struct copybit_device_t *dev) 586d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 587d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // NOP for MDP copybit 588d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(!dev) 589d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 590d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 591d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return 0; 592d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 593d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int clear_copybit(struct copybit_device_t *dev, 594d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_image_t const *buf, 595d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t *rect) 596d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 597d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 598d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t color = 0; // black color 599d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 600d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (!ctx) { 601d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s: Invalid copybit context", __FUNCTION__); 602d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 603d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 604d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 605d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct blitReq list1; 606d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin memset((char *)&list1 , 0 ,sizeof (struct blitReq) ); 607d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list1.count = 1; 608d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int my_tmp_get_fence = -1; 609d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 610d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list1.sync.acq_fen_fd = ctx->acqFence; 611d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list1.sync.rel_fen_fd = &my_tmp_get_fence; 612d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list1.sync.acq_fen_fd_cnt = ctx->list.sync.acq_fen_fd_cnt; 613d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin mdp_blit_req* req = &list1.req[0]; 614d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 615d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if(!req) { 616d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s : Invalid request", __FUNCTION__); 617d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 618d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 619d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 620d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_image(&req->dst, buf); 621d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_image(&req->src, buf); 622d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 623d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > req->dst.width || 624d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin rect->t < 0 || (uint32_t)(rect->b - rect->t) > req->dst.height) { 625d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE ("%s : Invalid rect : src_rect l %d t %d r %d b %d",\ 626d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin __FUNCTION__, rect->l, rect->t, rect->r, rect->b); 627d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 628d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 629d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 630d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.x = rect->l; 631d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.y = rect->t; 632d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.w = rect->r - rect->l; 633d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.h = rect->b - rect->t; 634d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 635d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->src_rect = req->dst_rect; 636d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 637d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.b = (uint32_t)((color >> 16) & 0xff); 638d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.g = (uint32_t)((color >> 8) & 0xff); 639d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.r = (uint32_t)((color >> 0) & 0xff); 640d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.alpha = MDP_ALPHA_NOP; 641d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 642d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->transp_mask = MDP_TRANSP_NOP; 643d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->flags = MDP_SOLID_FILL | MDP_MEMORY_ID_TYPE_FB | MDP_BLEND_FG_PREMULT; 644d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int status = msm_copybit(ctx, &list1); 645d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 646d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->list.sync.acq_fen_fd_cnt = 0; 647d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (my_tmp_get_fence != -1) 648d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin close(my_tmp_get_fence); 649d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 650d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return status; 651d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 652d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 653d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** Fill the rect on dst with RGBA color **/ 654d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int fill_color(struct copybit_device_t *dev, 655d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_image_t const *dst, 656d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_rect_t const *rect, 657d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t color) 658d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 659d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 660d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (!ctx) { 661d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("%s: Invalid copybit context", __FUNCTION__); 662d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 663d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 664d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 665d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) { 666d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("%s: Invalid DST w=%d h=%d", __FUNCTION__, dst->w, dst->h); 667d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 668d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 669d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 670d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > dst->w || 671d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin rect->t < 0 || (uint32_t)(rect->b - rect->t) > dst->h) { 672d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("%s: Invalid destination rect: l=%d t=%d r=%d b=%d", 673d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin __FUNCTION__, rect->l, rect->t, rect->r, rect->b); 674d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return -EINVAL; 675d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 676d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 677d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int status = 0; 678d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct blitReq* list = &ctx->list; 679d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin mdp_blit_req* req = &list->req[list->count++]; 680d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_infos(ctx, req, MDP_SOLID_FILL); 681d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_image(&req->src, dst); 682d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin set_image(&req->dst, dst); 683d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 684d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.x = rect->l; 685d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.y = rect->t; 686d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.w = rect->r - rect->l; 687d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->dst_rect.h = rect->b - rect->t; 688d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->src_rect = req->dst_rect; 689d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 690d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.r = (uint32_t)((color >> 0) & 0xff); 691d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.g = (uint32_t)((color >> 8) & 0xff); 692d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.b = (uint32_t)((color >> 16) & 0xff); 693d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin req->const_color.alpha = (uint32_t)((color >> 24) & 0xff); 694d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 695d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (list->count == sizeof(list->req)/sizeof(list->req[0])) { 696d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = msm_copybit(ctx, list); 697d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->sync.acq_fen_fd_cnt = 0; 698d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->count = 0; 699d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 700d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return status; 701d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 702d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 703d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*****************************************************************************/ 704d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 705d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** Close the copybit device */ 706d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int close_copybit(struct hw_device_t *dev) 707d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 708d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 709d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx) { 710d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin close(ctx->mFD); 711d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin free(ctx); 712d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 713d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return 0; 714d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 715d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 716d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int flush_get_fence(struct copybit_device_t *dev, int* fd) 717d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 718d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct copybit_context_t* ctx = (struct copybit_context_t*)dev; 719d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct blitReq *list = &ctx->list; 720d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int ret = -EINVAL; 721d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 722d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (list->count) { 723d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ret = msm_copybit(ctx, list); 724d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ret < 0) 725d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("%s: Blit call failed", __FUNCTION__); 726d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->count = 0; 727d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 728d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *fd = ctx->relFence; 729d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin list->sync.acq_fen_fd_cnt = 0; 730d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->relFence = -1; 731d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return ret; 732d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 733d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 734d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/** Open a new instance of a copybit device using name */ 735d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int open_copybit(const struct hw_module_t* module, const char* name, 736d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin struct hw_device_t** device) 737d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{ 738d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin int status = -EINVAL; 739d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 740d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (strcmp(name, COPYBIT_HARDWARE_COPYBIT0)) { 741d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return COPYBIT_FAILURE; 742d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 743d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin copybit_context_t *ctx; 744d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx = (copybit_context_t *)malloc(sizeof(copybit_context_t)); 745d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 746d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx == NULL ) { 747d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return COPYBIT_FAILURE; 748d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 749d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 750d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin memset(ctx, 0, sizeof(*ctx)); 751d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 752d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.common.tag = HARDWARE_DEVICE_TAG; 753d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.common.version = 1; 754d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.common.module = const_cast<hw_module_t*>(module); 755d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.common.close = close_copybit; 756d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.set_parameter = set_parameter_copybit; 757d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.get = get; 758d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.blit = blit_copybit; 759d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.set_sync = set_sync_copybit; 760d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.stretch = stretch_copybit; 761d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.finish = finish_copybit; 762d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.fill_color = fill_color; 763d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.flush_get_fence = flush_get_fence; 764d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->device.clear = clear_copybit; 765d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mAlpha = MDP_ALPHA_NOP; 766d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //dynamic_fps is zero means default 767d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin //panel refresh rate for driver. 768d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->dynamic_fps = 0; 769d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFlags = 0; 770d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->sync.flags = 0; 771d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->relFence = -1; 772d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin for (int i=0; i < MDP_MAX_FENCE_FD; i++) { 773d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->acqFence[i] = -1; 774d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 775d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->sync.acq_fen_fd = ctx->acqFence; 776d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->sync.rel_fen_fd = &ctx->relFence; 777d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->list.count = 0; 778d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->list.sync.acq_fen_fd_cnt = 0; 779d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->list.sync.rel_fen_fd = ctx->sync.rel_fen_fd; 780d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->list.sync.acq_fen_fd = ctx->sync.acq_fen_fd; 781d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ctx->mFD = open("/dev/graphics/fb0", O_RDWR, 0); 782d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (ctx->mFD < 0) { 783d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = errno; 784d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin ALOGE("Error opening frame buffer errno=%d (%s)", 785d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status, strerror(status)); 786d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = -status; 787d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 788d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin status = 0; 789d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *device = &ctx->device.common; 790d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 791d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return status; 792d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 793