psb_output_android.c revision 605881752d4bbfb7c70d4d08f3cf1579b5473713
1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 4f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 1162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang * 12f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 1562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang * 16f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 24bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Zhaohan Ren <zhaohan.ren@intel.com> 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Shengquan Yuan <shengquan.yuan@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Jiang Fei <jiang.fei@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Binglin Chen <binglin.chen@intel.com> 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <va/va_backend.h> 33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_output.h" 34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h" 35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_buffer.h" 36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_overlay.h" 37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_texture.h" 38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdio.h> 39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h> 40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdarg.h> 41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_android_glue.h" 42dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#include "psb_texstreaming.h" 4365174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan#include "psb_output_android.h" 4454752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include "psb_HDMIExtMode.h" 45f91c8768670386683a281cc39141e21bdda9c97fKun Wang#include "pnw_rotate.h" 46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.h> 4754752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include <psb_drm.h> 48f91c8768670386683a281cc39141e21bdda9c97fKun Wang#include <hardware.h> 49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 502befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 512befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_OUTPUT_PRIV psb_android_output_p output = (psb_android_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv) 52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 532befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) 54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define IMAGE(id) ((object_image_p) object_heap_lookup( &driver_data->image_heap, id )) 56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SUBPIC(id) ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id )) 57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 590da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_rotate(psb_surface) ((int) psb_surface->extra_info[5]) 600da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_protect(psb_surface) ((int) psb_surface->extra_info[6]) 610da1930627209986e8db220799a690f816494401Austin Yuan 625fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wangenum { 635fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang eWidiOff = 1, 645fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang eWidiClone = 2, 655fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang eWidiExtendedVideo = 3, 665fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang}; 6762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangextern unsigned int update_forced; 682befccec034c13d34746a9e87149889d59ac767bFei Jiang 69f91c8768670386683a281cc39141e21bdda9c97fKun Wanginline int va2hw_rotation(int va_rotate) 70f91c8768670386683a281cc39141e21bdda9c97fKun Wang{ 71f91c8768670386683a281cc39141e21bdda9c97fKun Wang switch (va_rotate) { 72f91c8768670386683a281cc39141e21bdda9c97fKun Wang case VA_ROTATION_90: 73f91c8768670386683a281cc39141e21bdda9c97fKun Wang return HAL_TRANSFORM_ROT_270; 74f91c8768670386683a281cc39141e21bdda9c97fKun Wang case VA_ROTATION_180: 75f91c8768670386683a281cc39141e21bdda9c97fKun Wang return HAL_TRANSFORM_ROT_180; 76f91c8768670386683a281cc39141e21bdda9c97fKun Wang case HAL_TRANSFORM_ROT_270: 77f91c8768670386683a281cc39141e21bdda9c97fKun Wang return HAL_TRANSFORM_ROT_90; 7862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangdefaut: 79f91c8768670386683a281cc39141e21bdda9c97fKun Wang return 0; 80f91c8768670386683a281cc39141e21bdda9c97fKun Wang } 81f91c8768670386683a281cc39141e21bdda9c97fKun Wang 82f91c8768670386683a281cc39141e21bdda9c97fKun Wang return 0; 83f91c8768670386683a281cc39141e21bdda9c97fKun Wang} 84f91c8768670386683a281cc39141e21bdda9c97fKun Wang 852befccec034c13d34746a9e87149889d59ac767bFei Jiangvoid *psb_android_output_init(VADriverContextP ctx) 86437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 87437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 882befccec034c13d34746a9e87149889d59ac767bFei Jiang char put_surface[1024]; 8954752e65b02b1a84c491e3f9c964046faeea306eKun Wang struct drm_psb_register_rw_arg regs; 902befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_android_output_p output = calloc(1, sizeof(psb_android_output_s)); 91ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan struct fb_var_screeninfo vinfo; 922befccec034c13d34746a9e87149889d59ac767bFei Jiang int fbfd = -1; 932befccec034c13d34746a9e87149889d59ac767bFei Jiang int ret; 94437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 952befccec034c13d34746a9e87149889d59ac767bFei Jiang if (output == NULL) { 962befccec034c13d34746a9e87149889d59ac767bFei Jiang psb__error_message("Can't malloc memory\n"); 97ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return NULL; 98437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 990da1930627209986e8db220799a690f816494401Austin Yuan memset(output, 0, sizeof(psb_android_output_s)); 100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1012befccec034c13d34746a9e87149889d59ac767bFei Jiang /* Guess the screen size */ 1022befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_width = 800; 1032befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_height = 480; 104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1052befccec034c13d34746a9e87149889d59ac767bFei Jiang // Open the frame buffer for reading 1060da1930627209986e8db220799a690f816494401Austin Yuan memset(&vinfo, 0, sizeof(vinfo)); 1072befccec034c13d34746a9e87149889d59ac767bFei Jiang fbfd = open("/dev/graphics/fb0", O_RDONLY); 1082befccec034c13d34746a9e87149889d59ac767bFei Jiang if (fbfd) { 109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) 110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Error reading screen information.\n"); 1112befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1122befccec034c13d34746a9e87149889d59ac767bFei Jiang close(fbfd); 1132befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_width = vinfo.xres; 1142befccec034c13d34746a9e87149889d59ac767bFei Jiang output->screen_height = vinfo.yres; 1152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /* TS by default */ 1172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 11862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->color_key = 0x000001; /*light blue*/ 11962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->overlay_idle_frame = 1; 120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1218803df709aec9d485d757c681791d708f9a88fe6Austin Yuan if (psb_parse_config("PSB_VIDEO_CTEXTURES", &put_surface[0]) == 0) { 1228803df709aec9d485d757c681791d708f9a88fe6Austin Yuan psb__information_message("PSB_VIDEO_CTEXTURES is enabled for vaPutSurfaceBuf\n"); 1238803df709aec9d485d757c681791d708f9a88fe6Austin Yuan driver_data->ctexture = 1; /* Init CTEXTURE for vaPutSurfaceBuf */ 1248803df709aec9d485d757c681791d708f9a88fe6Austin Yuan } 125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12654752e65b02b1a84c491e3f9c964046faeea306eKun Wang if (psb_parse_config("PSB_VIDEO_TS", &put_surface[0]) == 0) { 12754752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__information_message("Putsurface use texstreaming\n"); 12854752e65b02b1a84c491e3f9c964046faeea306eKun Wang driver_data->output_method = PSB_PUTSURFACE_FORCE_TEXSTREAMING; 12954752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 13054752e65b02b1a84c491e3f9c964046faeea306eKun Wang 131bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) { 1322befccec034c13d34746a9e87149889d59ac767bFei Jiang psb__information_message("Putsurface use client overlay\n"); 1332befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY; 13454752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 13554752e65b02b1a84c491e3f9c964046faeea306eKun Wang 13654752e65b02b1a84c491e3f9c964046faeea306eKun Wang if (IS_MFLD(driver_data)) { 137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->coverlay = 1; 13865174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan output->psb_HDMIExt_info = psb_HDMIExt_init(ctx, output); 13965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan if (!output->psb_HDMIExt_info) { 14054752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__error_message("Failed to init psb_HDMIExt.\n"); 141ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan free(output); 142ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return NULL; 14354752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1462befccec034c13d34746a9e87149889d59ac767bFei Jiang return output; 147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1492befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx) 150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 15154752e65b02b1a84c491e3f9c964046faeea306eKun Wang INIT_DRIVER_DATA; 15265174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan INIT_OUTPUT_PRIV; 1532befccec034c13d34746a9e87149889d59ac767bFei Jiang //psb_android_output_p output = GET_OUTPUT_DATA(ctx); 15465174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan if (IS_MFLD(driver_data)) { 15565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan psb_HDMIExt_deinit(output); 15665174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan } 1572befccec034c13d34746a9e87149889d59ac767bFei Jiang 1582befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_SUCCESS; 159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1612befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture( 162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned char* data, 165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srcw, 168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srch, 169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short destx, 170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short destw, 172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short desth, 173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int flags /* de-interlacing flags */ 174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 1772befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_OUTPUT_PRIV; 178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 1792befccec034c13d34746a9e87149889d59ac767bFei Jiang int offset = 0; 1802befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface_p psb_surface; 181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1822befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_surface = SURFACE(surface); 1832befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface = obj_surface->psb_surface; 184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 18554752e65b02b1a84c491e3f9c964046faeea306eKun Wang // psb_surface->buf.drm_buf; 18654752e65b02b1a84c491e3f9c964046faeea306eKun Wang // psb_surface->buf.pl_flags; 18754752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch, 18854752e65b02b1a84c491e3f9c964046faeea306eKun Wang destx, desty, destw, desth, 0, /* no subtitle */ 189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_surface->width, obj_surface->height, 190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_surface->stride, psb_surface->buf.drm_buf, 191bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb_surface->buf.pl_flags, 1 /* need wrap dst */); 1922befccec034c13d34746a9e87149889d59ac767bFei Jiang 1932befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_android_postBuffer(offset); 19454752e65b02b1a84c491e3f9c964046faeea306eKun Wang 1951f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare return VA_STATUS_SUCCESS; 196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1982befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay( 199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srcw, 204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srch, 2052befccec034c13d34746a9e87149889d59ac767bFei Jiang short destx, /* screen cooridination */ 206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short destw, 208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short desth, 209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int flags /* de-interlacing flags */ 210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 2122befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_OUTPUT_PRIV; 213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2152befccec034c13d34746a9e87149889d59ac767bFei Jiang /* USE_FIT_SCR_SIZE */ 2162befccec034c13d34746a9e87149889d59ac767bFei Jiang /* calculate fit screen size of frame */ 2172befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short _scr_x = output->screen_width; 2182befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short _scr_y = output->screen_height; 219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun float _slope_xy = (float)srch / srcw; 220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short _destw = (short)(_scr_y / _slope_xy); 221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short _desth = (short)(_scr_x * _slope_xy); 2222befccec034c13d34746a9e87149889d59ac767bFei Jiang short _pos_x, _pos_y; 223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2242befccec034c13d34746a9e87149889d59ac767bFei Jiang if (_destw <= _scr_x) { 2252befccec034c13d34746a9e87149889d59ac767bFei Jiang _desth = _scr_y; 226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun _pos_x = (_scr_x - _destw) >> 1; 2272befccec034c13d34746a9e87149889d59ac767bFei Jiang _pos_y = 0; 2282befccec034c13d34746a9e87149889d59ac767bFei Jiang } else { 2292befccec034c13d34746a9e87149889d59ac767bFei Jiang _destw = _scr_x; 2302befccec034c13d34746a9e87149889d59ac767bFei Jiang _pos_x = 0; 231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun _pos_y = (_scr_y - _desth) >> 1; 232437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 2332befccec034c13d34746a9e87149889d59ac767bFei Jiang destx += _pos_x; 2342befccec034c13d34746a9e87149889d59ac767bFei Jiang desty += _pos_y; 2352befccec034c13d34746a9e87149889d59ac767bFei Jiang destw = _destw; 2362befccec034c13d34746a9e87149889d59ac767bFei Jiang desth = _desth; 237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 238ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("psb_putsurface_overlay: src (%d, %d, %d, %d), destx (%d, %d, %d, %d).\n", 23954752e65b02b1a84c491e3f9c964046faeea306eKun Wang srcx, srcy, srcw, srch, destx, desty, destw, desth); 2402befccec034c13d34746a9e87149889d59ac767bFei Jiang /* display by overlay */ 2412befccec034c13d34746a9e87149889d59ac767bFei Jiang vaStatus = psb_putsurface_overlay( 242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, srcx, srcy, srcw, srch, 243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx, desty, destw, desth, /* screen coordinate */ 244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_A, PIPEA); 245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 2462befccec034c13d34746a9e87149889d59ac767bFei Jiang return vaStatus; 247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 249ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 250ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin YuanVAStatus psb_putsurface_ts( 251ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VADriverContextP ctx, 252ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VASurfaceID surface, 253ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan void *android_isurface, 25462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang int buffer_index, 255ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short srcx, 256ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short srcy, 257ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short srcw, 258ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short srch, 259ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short destx, 260ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan short desty, 261ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short destw, 262ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned short desth, 263ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VARectangle *cliprects, /* client supplied clip list */ 264ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned int number_cliprects, /* number of clip rects in the clip list */ 265ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan unsigned int flags /* de-interlacing flags */ 266ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan) 267ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{ 268ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_DRIVER_DATA; 269ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_OUTPUT_PRIV; 270ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan object_surface_p obj_surface = SURFACE(surface); 27162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 27262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->overlay_idle_frame == 0) { 27362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_resetParams(); 27462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang update_forced = 1; 27562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang } 276ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 277ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* blend/positioning setting can be called by app directly, or enable VA_ENABLE_BLEND flag to let driver call */ 278ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (flags & VA_ENABLE_BLEND) 279ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_android_texture_streaming_set_blend(destx, desty, destw, desth, 280ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->clear_color, 281ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->blend_color, 282ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->blend_mode); 283ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /*cropping can be also used for dynamic resolution change feature, only high to low resolution*/ 284ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /*by default, srcw and srch is set to video width and height*/ 285ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if ((0 == srcw) || (0 == srch)) { 286ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcw = obj_surface->width; 287ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srch = obj_surface->height_origin; 288ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 289ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_android_texture_streaming_set_texture_dim(srcw, srch); 290f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->va_rotate) 291f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb_android_texture_streaming_set_rotate(va2hw_rotation(driver_data->va_rotate)); 29262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 293ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#if 0 294ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* use cliprect for crop */ 295ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (cliprects && (number_cliprects == 1)) 296ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_android_texture_streaming_set_crop(cliprects->x, cliprects->y, cliprects->width, cliprects->height); 297ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#endif 298ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 29962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_display(buffer_index); 300cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan 301cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan driver_data->overlay_idle_frame++; 30262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang update_forced = 0; 303ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 304ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return VA_STATUS_SUCCESS; 305ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan} 306ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 3075fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang 3080da1930627209986e8db220799a690f816494401Austin Yuanstatic int psb_update_destbox( 3090da1930627209986e8db220799a690f816494401Austin Yuan VADriverContextP ctx 3100da1930627209986e8db220799a690f816494401Austin Yuan) 3110da1930627209986e8db220799a690f816494401Austin Yuan{ 3120da1930627209986e8db220799a690f816494401Austin Yuan INIT_DRIVER_DATA; 3130da1930627209986e8db220799a690f816494401Austin Yuan INIT_OUTPUT_PRIV; 3140da1930627209986e8db220799a690f816494401Austin Yuan short destx; 3150da1930627209986e8db220799a690f816494401Austin Yuan short desty; 3160da1930627209986e8db220799a690f816494401Austin Yuan unsigned short destw; 3170da1930627209986e8db220799a690f816494401Austin Yuan unsigned short desth; 3180da1930627209986e8db220799a690f816494401Austin Yuan VAStatus vaStatus = VA_STATUS_SUCCESS; 3190da1930627209986e8db220799a690f816494401Austin Yuan 3200da1930627209986e8db220799a690f816494401Austin Yuan psb_android_get_destbox(&destx, &desty, &destw, &desth); 321f91c8768670386683a281cc39141e21bdda9c97fKun Wang /*psb__information_message("destbox = (%d,%d,%d,%d)\n", destx, desty, destw, desth);*/ 3220da1930627209986e8db220799a690f816494401Austin Yuan if ((destx >= 0) && (desty >= 0) && 3230da1930627209986e8db220799a690f816494401Austin Yuan ((destx + destw) <= output->screen_width) && 3240da1930627209986e8db220799a690f816494401Austin Yuan ((desty + desth) <= output->screen_height) && 3250da1930627209986e8db220799a690f816494401Austin Yuan (output->destx != destx || 3260da1930627209986e8db220799a690f816494401Austin Yuan output->desty != desty || 3270da1930627209986e8db220799a690f816494401Austin Yuan output->destw != destw || 3280da1930627209986e8db220799a690f816494401Austin Yuan output->desth != desth)) { 3290da1930627209986e8db220799a690f816494401Austin Yuan output->destx = destx; 3300da1930627209986e8db220799a690f816494401Austin Yuan output->desty = desty; 3310da1930627209986e8db220799a690f816494401Austin Yuan output->destw = destw; 3320da1930627209986e8db220799a690f816494401Austin Yuan output->desth = desth; 3334338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->new_destbox = 1; 3340da1930627209986e8db220799a690f816494401Austin Yuan 3350da1930627209986e8db220799a690f816494401Austin Yuan LOGD("==========New Destbox=============\n"); 3360da1930627209986e8db220799a690f816494401Austin Yuan LOGD("output->destbox = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth); 3370da1930627209986e8db220799a690f816494401Austin Yuan } 3380da1930627209986e8db220799a690f816494401Austin Yuan 3390da1930627209986e8db220799a690f816494401Austin Yuan return vaStatus; 3400da1930627209986e8db220799a690f816494401Austin Yuan} 341ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 342ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuanstatic int psb_check_outputmethod( 343ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VADriverContextP ctx, 344ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan VASurfaceID surface, 34588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang unsigned short srcw, 34688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang unsigned short srch, 347ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan void *android_isurface, 3480da1930627209986e8db220799a690f816494401Austin Yuan psb_hdmi_mode *hdmi_mode 349ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan) 350ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{ 351ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_DRIVER_DATA; 352ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan INIT_OUTPUT_PRIV; 353ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_HDMIExt_info_p psb_HDMIExt_info = (psb_HDMIExt_info_p)output->psb_HDMIExt_info; 3540da1930627209986e8db220799a690f816494401Austin Yuan object_surface_p obj_surface; 3555fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang int rotation = 0, widi = 0; 356ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 35788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang if ((srcw >= 2048) || (srch >= 2048)) { 35888c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang psb__information_message("Clip size extend overlay hw limit, use texstreaming\n"); 35988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 36088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang return 0; 36188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang } 36288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang 363ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* use saved status to avoid per-frame checking */ 364ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if ((driver_data->frame_count % driver_data->outputmethod_checkinterval) != 0) { 365ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan *hdmi_mode = psb_HDMIExt_get_mode(output); 366ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return 0; 367ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 368ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 369ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* check the status at outputmethod_checkinterval frequency */ 370ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* at first check HDMI status */ 371ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (psb_HDMIExt_update(ctx, psb_HDMIExt_info)) { 372ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__error_message("%s: Failed to update HDMIExt info.\n", __FUNCTION__); 3730da1930627209986e8db220799a690f816494401Austin Yuan return -1; 374ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 375ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 376ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan *hdmi_mode = psb_HDMIExt_get_mode(output); 377ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("hdmi_mode = %d\n", *hdmi_mode); 378ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (*hdmi_mode != OFF) { 379ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb_HDMIExt_get_prop(output, &driver_data->render_rect.width, &driver_data->render_rect.height, 380ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan &driver_data->render_rect.x, &driver_data->render_rect.y); 381ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("Render Rect: (%d,%d,%d,%d)\n", 382ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->render_rect.x, driver_data->render_rect.y, 383ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->render_rect.width, driver_data->render_rect.height); 384ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 385ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 3865fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang if ((*hdmi_mode == EXTENDED_VIDEO) || (*hdmi_mode == CLONE)) { 387f91c8768670386683a281cc39141e21bdda9c97fKun Wang /* need to handle VA rotation, and set WM rotate to 0 388f91c8768670386683a281cc39141e21bdda9c97fKun Wang * for Android, MIPI0/HDMI has the same WM rotation always 389f91c8768670386683a281cc39141e21bdda9c97fKun Wang */ 390f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->mipi0_rotation != 0) { 391f91c8768670386683a281cc39141e21bdda9c97fKun Wang driver_data->mipi0_rotation = 0; 392f91c8768670386683a281cc39141e21bdda9c97fKun Wang driver_data->hdmi_rotation = 0; 393f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb_RecalcRotate(ctx); 394f91c8768670386683a281cc39141e21bdda9c97fKun Wang } 39562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 3960da1930627209986e8db220799a690f816494401Austin Yuan return 0; 3975fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang } 398ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 3994338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /*Update output destbox using layerbuffer's visible region*/ 4004338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang psb_update_destbox(ctx); 4014338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4024338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) 403f91c8768670386683a281cc39141e21bdda9c97fKun Wang || (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)) 4044338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang return 0; 4054338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4064338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /*If overlay can not get correct destbox, use texstreaming.*/ 407605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang if (output->destw == 0 || output->desth == 0 || 408605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang ((output->destw == srcw) && (output->desth == srch))) { 4094338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang psb__information_message("No proper destbox, use texstreaming %d\n"); 4104338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 4114338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang return 0; 4124338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang } 4134338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4140da1930627209986e8db220799a690f816494401Austin Yuan /* HDMI is not enabled */ 4155fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang psb_android_surfaceflinger_status(android_isurface, &output->sf_composition, &rotation, &widi); 4165fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang if (widi == eWidiClone) { 4175fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang psb__information_message("WIDI service is detected, use texstreaming\n"); 4185fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 419cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */ 4204338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4215fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang return 0; 4225fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang } 4234338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 4240da1930627209986e8db220799a690f816494401Austin Yuan /* only care local rotation */ 42562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (output->new_destbox && driver_data->mipi0_rotation != rotation) { 426f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb__information_message("New rotation degree %d of MIPI0 WM, Recalc rotation\n", rotation); 427f91c8768670386683a281cc39141e21bdda9c97fKun Wang driver_data->mipi0_rotation = rotation; 428f91c8768670386683a281cc39141e21bdda9c97fKun Wang driver_data->hdmi_rotation = rotation; 429f91c8768670386683a281cc39141e21bdda9c97fKun Wang 430f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb_RecalcRotate(ctx); 4310da1930627209986e8db220799a690f816494401Austin Yuan } 432605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang output->new_destbox = 0; 4330da1930627209986e8db220799a690f816494401Austin Yuan 4340da1930627209986e8db220799a690f816494401Austin Yuan obj_surface = SURFACE(surface); 4350da1930627209986e8db220799a690f816494401Austin Yuan if (GET_SURFACE_INFO_protect(obj_surface->psb_surface)) { 4360da1930627209986e8db220799a690f816494401Austin Yuan psb__information_message("Protected surface, use overlay\n"); 4370da1930627209986e8db220799a690f816494401Austin Yuan driver_data->output_method = PSB_PUTSURFACE_COVERLAY; 4380da1930627209986e8db220799a690f816494401Austin Yuan 4390da1930627209986e8db220799a690f816494401Austin Yuan return 0; 4400da1930627209986e8db220799a690f816494401Austin Yuan } 4410da1930627209986e8db220799a690f816494401Austin Yuan 4420da1930627209986e8db220799a690f816494401Austin Yuan if (output->sf_composition) { 4430da1930627209986e8db220799a690f816494401Austin Yuan psb__information_message("Composition is detected, use texstreaming\n"); 4440da1930627209986e8db220799a690f816494401Austin Yuan driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 4450da1930627209986e8db220799a690f816494401Austin Yuan return 0; 4460da1930627209986e8db220799a690f816494401Austin Yuan } 4470da1930627209986e8db220799a690f816494401Austin Yuan 448f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->local_rotation != 0) { /* final rotation is not 0 */ 4490da1930627209986e8db220799a690f816494401Austin Yuan int srf_rotate = GET_SURFACE_INFO_rotate(obj_surface->psb_surface); 450f91c8768670386683a281cc39141e21bdda9c97fKun Wang if ((srf_rotate != driver_data->local_rotation) || (NULL == obj_surface->psb_surface_rotate)) { /* surface rotation isn't same with the final rotation */ 451f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb__information_message("SF rotation degree %d, MSVDX rotate %d, rotate surface 0x%08x\n", rotation, srf_rotate, obj_surface->psb_surface_rotate); 4520da1930627209986e8db220799a690f816494401Austin Yuan driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING; 4530da1930627209986e8db220799a690f816494401Austin Yuan return 0; 454ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 455ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 456ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 457f91c8768670386683a281cc39141e21bdda9c97fKun Wang psb__information_message("Surfaceflinger rotation %d, final rotation degree %d, use overlay\n", 458f91c8768670386683a281cc39141e21bdda9c97fKun Wang rotation, driver_data->local_rotation); 4590da1930627209986e8db220799a690f816494401Austin Yuan driver_data->output_method = PSB_PUTSURFACE_COVERLAY; 4600da1930627209986e8db220799a690f816494401Austin Yuan 461ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return 0; 462ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan} 463ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 4642befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface( 465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 4672befccec034c13d34746a9e87149889d59ac767bFei Jiang void *android_isurface, 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srcw, 471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short srch, 472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short destx, 473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short destw, 475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned short desth, 476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VARectangle *cliprects, /* client supplied clip list */ 477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int number_cliprects, /* number of clip rects in the clip list */ 478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int flags /* de-interlacing flags */ 4792befccec034c13d34746a9e87149889d59ac767bFei Jiang) 480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 4822befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_OUTPUT_PRIV; 483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface; 484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 48554752e65b02b1a84c491e3f9c964046faeea306eKun Wang PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 48654752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb_hdmi_mode hdmi_mode = OFF; 48762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang int sf_composition = 0, buffer_index = 0, i = 0; 48862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang uint32_t ttm_handle; 48962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_surface_p psb_surface; 490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_surface = SURFACE(surface); 492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_surface) { 493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; 494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 49754752e65b02b1a84c491e3f9c964046faeea306eKun Wang 4985fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang if ((NULL == cliprects) && (0 != number_cliprects)) { 49988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 50088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang DEBUG_FAILURE; 50188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang return vaStatus; 50288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang } 50388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang 50454752e65b02b1a84c491e3f9c964046faeea306eKun Wang if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) || 5050da1930627209986e8db220799a690f816494401Austin Yuan (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) { 50654752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__error_message("vaPutSurface: source rectangle passed from upper layer is not correct.\n"); 50754752e65b02b1a84c491e3f9c964046faeea306eKun Wang return VA_STATUS_ERROR_UNKNOWN; 50854752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 50954752e65b02b1a84c491e3f9c964046faeea306eKun Wang if ((destx < 0) || (desty < 0)) { 51054752e65b02b1a84c491e3f9c964046faeea306eKun Wang psb__error_message("vaPutSurface: dest rectangle passed from upper layer is not correct.\n"); 5113f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan return VA_STATUS_ERROR_UNKNOWN; 5123f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan } 51354752e65b02b1a84c491e3f9c964046faeea306eKun Wang 5142befccec034c13d34746a9e87149889d59ac767bFei Jiang if (driver_data->dummy_putsurface) { 5153f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan psb__information_message("vaPutSurface: dummy mode, return directly\n"); 5162befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_SUCCESS; 5172befccec034c13d34746a9e87149889d59ac767bFei Jiang } 5182befccec034c13d34746a9e87149889d59ac767bFei Jiang 51962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang /*get bcd buffer index of current surface*/ 52062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_surface = obj_surface->psb_surface; 52162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang ttm_handle = (uint32_t)(wsbmKBufHandle(wsbmKBuf(psb_surface->buf.drm_buf))); 52262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 52362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang for (i = 0; i < driver_data->bcd_buffer_num; i++) { 52462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->bcd_ttm_handles[i] == ttm_handle) 52562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang break; 52662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang } 52762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (i == driver_data->bcd_buffer_num) { 52862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb__error_message("Failed to get buffer index.\n"); 52962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang return VA_STATUS_ERROR_UNKNOWN; 53062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang } 53162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang buffer_index = i; 53262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 5335b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang /* set the current displaying video frame into kernel */ 5345b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang psb_surface_set_displaying(driver_data, obj_surface->width, obj_surface->height, obj_surface->psb_surface); 53562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 536ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* exit MRST path at first */ 537ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (IS_MRST(driver_data)) { 538ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) { /* overlay is for testing, not POR */ 539ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("Force overlay to display\n"); 540ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan vaStatus = psb_putsurface_coverlay(ctx, surface, 541ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 542ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 543ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 544ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } else { 545ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("Use texstreaming to display.\n"); 54662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index, 547ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 548ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 549ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan cliprects, number_cliprects, /* number of clip rects in the clip list */ 550ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 55165174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan } 55254752e65b02b1a84c491e3f9c964046faeea306eKun Wang 553ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return vaStatus; 55454752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 555ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 5560da1930627209986e8db220799a690f816494401Austin Yuan if (psb_android_register_isurface(android_isurface, driver_data->bcd_id, srcw, srch)) { 5570da1930627209986e8db220799a690f816494401Austin Yuan psb__error_message("In psb_PutSurface, android_isurface is not a valid isurface object.\n"); 5580da1930627209986e8db220799a690f816494401Austin Yuan return VA_STATUS_ERROR_UNKNOWN; 5590da1930627209986e8db220799a690f816494401Austin Yuan } 5600da1930627209986e8db220799a690f816494401Austin Yuan 561ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* time for MFLD platform */ 56288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang psb_check_outputmethod(ctx, surface, srcw, srch, android_isurface, &hdmi_mode); 563ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 564ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* Extvideo: Use overlay to render external HDMI display */ 565ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (hdmi_mode == EXTENDED_VIDEO) { 566ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("HDMI: ExtVideo mode enabled, use overlay to render external HDMI display.\n"); 5670da1930627209986e8db220799a690f816494401Austin Yuan /*we also need to clear local display if colorkey dirty.*/ 56862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->overlay_idle_frame != 0) { 56962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000); 57062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_display(buffer_index); 57162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->overlay_idle_frame = 0; 5720da1930627209986e8db220799a690f816494401Austin Yuan } 573bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang vaStatus = psb_putsurface_overlay(ctx, surface, 574bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang srcx, srcy, srcw, srch, 575bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.x, driver_data->render_rect.y, 576bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.width, driver_data->render_rect.height, 577bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang flags, OVERLAY_A, PIPEB); 578ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 579ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return vaStatus; 580ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 581ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 582ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* Clone mode: Use TS to render both MIPI and HDMI display */ 583ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (hdmi_mode == CLONE) { 584ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("HDMI: Clone mode enabled, use texsteaming for both devices\n"); 58562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index, 586ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 587ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 588ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan cliprects, number_cliprects, /* number of clip rects in the clip list */ 589ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 590ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan return vaStatus; 591ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 592ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 5930da1930627209986e8db220799a690f816494401Austin Yuan /* local video playback */ 5940da1930627209986e8db220799a690f816494401Austin Yuan if ((driver_data->output_method == PSB_PUTSURFACE_TEXSTREAMING) || 595f91c8768670386683a281cc39141e21bdda9c97fKun Wang (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)) { 596ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("MIPI: Use texstreaming to display.\n"); 597ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 59862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index, 599ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan srcx, srcy, srcw, srch, 600ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan destx, desty, destw, desth, 601ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan cliprects, number_cliprects, /* number of clip rects in the clip list */ 602ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan flags); 603ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } else { 604ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan psb__information_message("MIPI: Use overlay to display.\n"); 605ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 6064338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /*initialize output destbox using default destbox if it has not been initialized until here.*/ 6074338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang if (output->destw == 0 || output->desth == 0) { 6084338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->destx = (destx > 0) ? destx : 0; 6094338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->desty = (desty > 0) ? desty : 0; 6104338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->destw = ((output->destx + destw) > output->screen_width) ? (output->screen_width - output->destx) : destw; 6114338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang output->desth = ((output->desty + desth) > output->screen_height) ? (output->screen_height - output->desty) : desth; 6124338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang } 6134338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang 614ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan /* Hack for repaint color key to black(0,0,0). */ 61562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (driver_data->overlay_idle_frame != 0) { 61662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb__information_message("Paint color key to 0x%x\n", driver_data->color_key); 61762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000); 61862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang psb_android_texture_streaming_display(buffer_index); 61962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang driver_data->overlay_idle_frame = 0; 62054752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 62154752e65b02b1a84c491e3f9c964046faeea306eKun Wang 6225fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang psb__information_message("Overlay position = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth); 6230da1930627209986e8db220799a690f816494401Austin Yuan vaStatus = psb_putsurface_overlay(ctx, surface, 6240da1930627209986e8db220799a690f816494401Austin Yuan srcx, srcy, srcw, srch, 6250da1930627209986e8db220799a690f816494401Austin Yuan output->destx, output->desty, output->destw, output->desth, 6260da1930627209986e8db220799a690f816494401Austin Yuan flags, OVERLAY_A, PIPEA); 6272befccec034c13d34746a9e87149889d59ac767bFei Jiang } 628bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 6294338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang if (driver_data->overlay_idle_frame == 2) 630cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan psb_coverlay_stop(ctx); 631cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan 632ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->frame_count++; 633ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 63462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang 6352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return vaStatus; 636437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 637